././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3361645 ppa_dev_tools-0.6.0/0000775000175000017500000000000014630542117013412 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1681680731.0 ppa_dev_tools-0.6.0/.flake80000664000175000017500000000015614417064533014573 0ustar00brycebryce[flake8] max-line-length = 100 extend-ignore = E129, E241, E266, E402 per-file-ignores = tests/*.py: E501 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1664410300.0 ppa_dev_tools-0.6.0/.gitignore0000664000175000017500000000054614315161274015410 0ustar00brycebryce# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. MANIFEST .cache # Python *.pyc /.eggs/ *.egg-info/ *.DS_Store __pycache__ /build/ /dist/ # Snap *.snap # Flask /flask/ # Testing .coverage /coverage /htmlcov/ # Logs *-debug.log* *-error.log* .env.local .env.development.local .env.test.local .env.production.local ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1688703621.0 ppa_dev_tools-0.6.0/.pylintrc0000664000175000017500000000132614451711205015256 0ustar00brycebryce[MASTER] # --go-faster, use multiple processes to speed up Pylint jobs=2 [MESSAGES CONTROL] # Name Disabled Because # ---- ---------------- # import-error Not all deps installed while testing # wrong-import-position Interferes with standardized boilerplate style disable=import-error, wrong-import-position [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs output-format=colorized # Just the errors please, no full report reports=no [TYPECHECK] ignored-modules=pygit2,lazr.restfulclient,launchpadlib.* generated-members=apt_pkg.* [FORMAT] good-names=lp, pp, fp, d, e, f, i, j, k, m, n, p, v, w, x, y, z ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717440840.0 ppa_dev_tools-0.6.0/AUTHORS.md0000664000175000017500000000034214627410510015055 0ustar00brycebryceBryce Harrington Athos Ribeiro Christian Ehrhardt Andy P. Whitcroft Massimiliano Girardi ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717477853.0 ppa_dev_tools-0.6.0/INSTALL.md0000664000175000017500000000262514627520735015057 0ustar00brycebryce## Installation ## The prerequisites for ppa-dev-tools can be satisified either through PIP, or on Debian/Ubuntu via their packaging systems. These modules are required: * appdirs * apt_pkg * debian.deb822 * distro_info * launchpadlib * lazr.restfulclient * setuptools * software-properties * yaml or ruamel.yaml ### DEB ### On Debian, ppa-dev-tools is available from the main archive, thus can be installed directly: $ sudo apt-get install ppa-dev-tools A PPA with .deb packages are available for Ubuntu. $ sudo add-apt-repository --yes --enable-source ppa:bryce/ppa-dev-tools $ sudo apt-get install ppa-dev-tools ### PIP ### Alternatively, the package and its dependencies can be satisfied via PIP for a user installation: $ pip install . $ ppa --version ppa 0.6.0 ### SNAP ### $ sudo snap install ppa-dev-tools $ ppa --version ppa 0.6.0 ### SOURCE ### On Ubuntu 20.04 (or newer) and similar systems, prerequisites can be satisfied from the apt repository: $ sudo apt-get install \ python3-build \ python3-appdirs \ python3-debian \ python3-distro-info \ python3-launchpadlib \ python3-lazr.restfulclient \ python3-software-properties \ python3-yaml \ python3-pip Installation is performed as follows: $ python3 -m build --no-isolation $ sudo python3 -m pip install --no-deps . $ ppa --version ppa 0.6.0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1570297502.0 ppa_dev_tools-0.6.0/LICENSE.GPLv2+0000664000175000017500000004310313546153236015371 0ustar00brycebryce GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively 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 program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, 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. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748799.0 ppa_dev_tools-0.6.0/MANIFEST.in0000664000175000017500000000023614630542077015156 0ustar00brycebryceinclude LICENSE.GPLv2+ include *.md include tests/helpers.py include tests/data/* include tests/data/*/* include .flake8 include .pylintrc include .gitignore ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717477853.0 ppa_dev_tools-0.6.0/NEWS.md0000664000175000017500000002024014627520735014516 0ustar00brycebryce# 0.6.0 # With this release comes some significant improvements in packaging of ppa-dev-tools, including completion of the transition to modern Python build packaging and dropping of the old setup.py approach. Of even more note, ppa-dev-tools is now included in Debian testing, so can now be installed directly on that operating system; hopefully soon it will be available from Ubuntu oracular as well. Meanwhile, the snap packaging has been significantly improved, including snapshot builds, builds for all supported architectures, better handling of Launchpad credentials, and a registered alias for the 'ppa' command. Several irregularities were found in various corner cases with the parsing, processing, and display of test results for the `ppa tests` command. These are fixed and the testsuite expanded to cover a wider variety of test (mis-)behaviors. The --package argument now filters the results as well as the triggers, which will be helpful for users of PPA containing many packages. As well, the `ppa tests` command's handling of triggers has received some fixes that were causing them to not be displayed in some circumstances, or to be improperly encoded for some package version numbers. Thanks to all the contributors to this release: Alberto Contreras, Alexandre Detiste, Heinrich Schuchardt, Mitchell Dzurick, Nathan Pratta Teodosio, Simon Chopin and Benjamin Drung. # 0.5.0 # It is now possible to create PPAs under a different team's ownership via the `--owner` option: $ ppa create --owner foobar my-ppa As a convenience, this can also be specified in ppa address form, i.e.: $ ppa create ppa:foobar/my-ppa Furthermore, most places that take a PPA address will also take a full URL, including URLs ending with /+packages. For example, all of these are accepted as valid PPA specifiers: $ ppa wait my-ppa $ ppa wait myself/my-ppa $ ppa wait ppa:myself/my-ppa $ ppa wait https://launchpad.net/~myself/+archive/ubuntu/my-ppa $ ppa wait https://launchpad.net/~myself/+archive/ubuntu/my-ppa/ $ ppa wait https://launchpad.net/~myself/+archive/ubuntu/my-ppa/+packages Private PPA support is now available via the `--private/--public` arguments, allowing toggling a PPA's privacy, if allowed by Launchpad. For example: $ ppa create --private ppa:myself/my-private-ppa It is now possible to save and load Launchpad OAuth credentials, to permit use of ppa-dev-tools in situations where you can't use launchpadlib's automatic authentication mechanics. A new command is added to dump the credentials from an authenticated session: $ ppa credentials Launchpad credentials written to credentials.oauth You can then load them via a new `--credentials` global argument, for example: $ ppa --credentials ./credentials.oauth create ppa:myteam/myppa Credentials can also be supplied via an LP_CREDENTIALS environment variable. Thanks to Massimiliano Girardi for this feature. The `ppa wait` behavior has changed to display just a screenful of status while waiting on builds. The old behavior, where status updates are printed to stdout and scrolled, is still available via the --log option. Also, the `wait` command now supports a 'name' configuration parameter that allows specifying a single source package to wait on. The 'wait_max_age_hours' parameter makes it consider only uploads within the given timeframe. The 'exit_on_only_build_failure' parameter makes the wait exit if the only jobs that it is monitoring are failed builds. These options are aimed to facilitate CI/CD integration, but can also improve performance of the waiting operation on larger PPAs. This release provides an important bugfix, enabling the `ppa tests` command to properly parse and handle newer format autopkgtests. The log files for tests run on Ubuntu lunar and newer are prefixed with a timestamp that caused `ppa tests` to misread the subtest name. The timestamps are now recognized and subtest names parsed properly. (LP: #2025484) Other bugfixes have focused on improvements to input and error handling for a variety of conditions that have come up in practice. This includes some more robust handling of errors generated during Launchpad outages or other glitches (LP: #1997122). # 0.4.0 # Reverse dependencies, build dependencies, and installation dependencies can be identified for a given source package using cached APT information. This list of packages will be used to generate lists of autopkgtest triggers, which when run should help identify issues that could get flagged in Britney2 runs. While similar to functionality provided by Bileto+Britney2, it is a lighterweight facsimile which doesn't handle special cases so should not be considered an equivalent, just as a preliminary screen to catch basic issues. For now, users will need to create and maintain this cache by hand (automatic caching is planned for 0.5). See the README for a suggested rsync command to do this. In addition, The `ppa set` command now supports a number of new command line options. `--ppa-dependencies` allows you to specify that your PPA can use the contents of one or more other PPAs to satisfy build dependencies. The `--architectures` option now has some related options `--all-architectures` and `--default-architectures` for "Give me everything" and "Just the usual", respectively. The `--enable` and `--disable` arguments control whether packages can be uploaded to the PPA to build. All of the options supported by `ppa set` can also be specified to `ppa create` to allow specifying them at creation time. Beyond these two features, notable bugfixes address problems with Ubuntu release specification, improvements to the `ppa tests` output, and various idiosyncrasies with command line arguments. # 0.3.0 Release # Autopkgtest trigger action URLs are printed for packages in the PPA when running the `ppa tests` command. Both plain and 'all-proposed' style triggers are displayed. These can be loaded in a web browser by someone with core-dev permissions to start the test runs. `ppa tests` can then be re-run to check on the tests status and results. Most commands now accept the PPA identifier as a URL, as well as a formal PPA address, or just the basic name of the PPA, which will be assumed to be in the user's namespace. New options are now available for a few commands. The option parsing and handling has been significantly reworked to allow per-command arg shortcuts, so for instance -r can mean one thing for the 'create' command and something completely different for the 'wait' command. # 0.2.1 Release # This corrects some packaging issues when generating .deb and .snap packages: Some missing build-dependencies are added, and some path adjustments included to ensure the script is able to import the installed python modules when installed in a snap environment. # 0.2.0 Release # This release adds a new 'tests' command that lists any pending or waiting test runs against the PPA at autopackage.canonical.com. This functionality is integrated from Christian Ehrhardt's `lp-test-ppa` tool[1], coupled with new test cases, code documentation, and pylint/flake style improvements. The new command is run like this: $ ppa tests ppa:my-name/my-ppa The second major focus for this release was to refine and solidify the packaging and installation process. In addition to PyPI, this will be packaged as a snap and as a debian package via PPA (of course!) 1: https://git.launchpad.net/~ubuntu-server/+git/ubuntu-helpers/tree/cpaelzer/lp-test-ppa # 0.1.0 Release # A core set of commands including create, destroy, wait, list, and show are implemented, along with basic help and package docs. The intent of this release is to get registered with PyPI and scope out the release process. Here's an example set of commands one might use: $ ppa create my-ppa $ dput ppa:my-name/my-ppa some-package.changes $ ppa wait my-ppa $ cat some-package/README | ppa desc ppa:my-name/my-ppa $ ppa destroy my-ppa This creates a PPA and uploads a package to it. Then it waits for the package to complete building and then updates the PPA's description with some user-provided information. At this point the PPA might be shared with users or used for testing purposes. Finally, when no longer needed it is removed. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3361645 ppa_dev_tools-0.6.0/PKG-INFO0000644000175000017500000006035014630542117014511 0ustar00brycebryceMetadata-Version: 2.1 Name: ppa-dev-tools Version: 0.6.0 Summary: command line client for managing PPAs in Launchpad Author-email: Bryce Harrington License: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively 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 program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, 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. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. Project-URL: Homepage, https://launchpad.net/ppa-dev-tools Project-URL: Bug Tracker, https://bugs.launchpad.net/ppa-dev-tools Keywords: ppa,archive,ubuntu,debian Classifier: Development Status :: 3 - Alpha Classifier: Intended Audience :: Information Technology Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: System :: Archiving :: Packaging Classifier: Topic :: System :: Software Distribution Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) Classifier: Programming Language :: Python :: 3 Requires-Python: >=3 Description-Content-Type: text/markdown License-File: LICENSE.GPLv2+ Ppa Dev Tools ============= ppa is a command line client for managing PPAs in Launchpad. This primarily focuses on functionality needed by owners of PPAs, to assist in their creation, deletion, and configuration. A key functionality is to poll and wait until the package(s) in the PPA have completed building; this permits blocking on the builds to delay other actions such as requesting users on a bug report to test the PPA, or submitting a merge proposal for the update to be considered for inclusion in the distro. You can view a team's registered PPAs using 'ppa list'. Usage ----- Register a new PPA ``` $ ppa create my-ppa PPA 'my-ppa' created for the following architectures: i386, amd64, armel, armhf, ppc64el, s390x, arm64, powerpc The PPA can be viewed at: https://launchpad.net/~my-name/+archive/ubuntu/my-ppa You can upload packages to this PPA using: dput ppa:my-name/my-ppa ``` Upload a package to the PPA ``` $ dput ppa:my-name/my-ppa some-package.changes ``` Wait until all packages in the PPA have finished building ``` $ ppa wait ppa:my-name/my-ppa ``` Set the public description for a PPA from a file ``` $ cat some-package/README | ppa desc ppa:my-name/my-ppa ``` Trigger autopkgtests for the package, and check results ``` $ ppa tests ppa:my-name/my-ppa ``` Delete the PPA ``` $ ppa destroy ppa:my-name/my-ppa ``` Auto-linked Autopkgtest Trigger URLS ------------------------------------ By default, `ppa tests` will display autopkgtest triggers as hyperlinked text. The hyperlinking feature is supported on many newer terminal programs but as it's a relatively recent VTE function it may not yet be available in the terminal you use. The following terminal programs are believed to support it: - iTerm2 3.1 - DomTerm 1.0.2 - hTerm 1.76 - Terminology 1.3? - Gnome Terminal 3.26 (VTE 0.50) - Guake 3.2.1 (VTE 0.50) - TOXTerm 3.5.1 (VTE 0.50) - Tilix 3.26 (VTE 0.50) - Terminator 2.0 This is not a comprehensive list, and likely will lengthen swiftly. Meanwhile, if you have a non-supporting browser, the --show-urls option can be passed to `ppa tests` to make it display the raw URLs that can be manually cut and pasted into your web browser. Autopkgtesting Reverse-dependencies ----------------------------------- In addition to creating trigger URLs for running your package's autopkgtest, it is also possible to do the same for everything dependent on your package. These other packages are termed 'reverse dependencies', aka 'rdepends'. To generate these URLs, just include the '--show-rdepends' option in your command line. For example: ``` $ ppa tests --show-rdepends ppa:my-name/my-ppa ``` The `ppa` command calculates the dependency trees using information from the Apt archive, which needs to be cached locally. Only the index information is needed, not a complete mirror. You can generate (and refresh) a dists-only mirror thusly: $ mkdir {LOCAL_REPOSITORY_PATH} $ rsync -va \\ --exclude={{'*/installer*','*/i18n/*','*/uefi/*','*/Contents*','*/by-hash/*','*tar.gz'}} \\ rsync://archive.ubuntu.com/ubuntu/dists {LOCAL_REPOSITORY_PATH} It's recommended to run the rsync command as a cronjob to keep your repository up to date as often as desired. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683034943.0 ppa_dev_tools-0.6.0/README0000664000175000017500000000631514424211477014302 0ustar00brycebrycePpa Dev Tools ============= ppa is a command line client for managing PPAs in Launchpad. This primarily focuses on functionality needed by owners of PPAs, to assist in their creation, deletion, and configuration. A key functionality is to poll and wait until the package(s) in the PPA have completed building; this permits blocking on the builds to delay other actions such as requesting users on a bug report to test the PPA, or submitting a merge proposal for the update to be considered for inclusion in the distro. You can view a team's registered PPAs using 'ppa list'. Usage ----- Register a new PPA ``` $ ppa create my-ppa PPA 'my-ppa' created for the following architectures: i386, amd64, armel, armhf, ppc64el, s390x, arm64, powerpc The PPA can be viewed at: https://launchpad.net/~my-name/+archive/ubuntu/my-ppa You can upload packages to this PPA using: dput ppa:my-name/my-ppa ``` Upload a package to the PPA ``` $ dput ppa:my-name/my-ppa some-package.changes ``` Wait until all packages in the PPA have finished building ``` $ ppa wait ppa:my-name/my-ppa ``` Set the public description for a PPA from a file ``` $ cat some-package/README | ppa desc ppa:my-name/my-ppa ``` Trigger autopkgtests for the package, and check results ``` $ ppa tests ppa:my-name/my-ppa ``` Delete the PPA ``` $ ppa destroy ppa:my-name/my-ppa ``` Auto-linked Autopkgtest Trigger URLS ------------------------------------ By default, `ppa tests` will display autopkgtest triggers as hyperlinked text. The hyperlinking feature is supported on many newer terminal programs but as it's a relatively recent VTE function it may not yet be available in the terminal you use. The following terminal programs are believed to support it: - iTerm2 3.1 - DomTerm 1.0.2 - hTerm 1.76 - Terminology 1.3? - Gnome Terminal 3.26 (VTE 0.50) - Guake 3.2.1 (VTE 0.50) - TOXTerm 3.5.1 (VTE 0.50) - Tilix 3.26 (VTE 0.50) - Terminator 2.0 This is not a comprehensive list, and likely will lengthen swiftly. Meanwhile, if you have a non-supporting browser, the --show-urls option can be passed to `ppa tests` to make it display the raw URLs that can be manually cut and pasted into your web browser. Autopkgtesting Reverse-dependencies ----------------------------------- In addition to creating trigger URLs for running your package's autopkgtest, it is also possible to do the same for everything dependent on your package. These other packages are termed 'reverse dependencies', aka 'rdepends'. To generate these URLs, just include the '--show-rdepends' option in your command line. For example: ``` $ ppa tests --show-rdepends ppa:my-name/my-ppa ``` The `ppa` command calculates the dependency trees using information from the Apt archive, which needs to be cached locally. Only the index information is needed, not a complete mirror. You can generate (and refresh) a dists-only mirror thusly: $ mkdir {LOCAL_REPOSITORY_PATH} $ rsync -va \\ --exclude={{'*/installer*','*/i18n/*','*/uefi/*','*/Contents*','*/by-hash/*','*tar.gz'}} \\ rsync://archive.ubuntu.com/ubuntu/dists {LOCAL_REPOSITORY_PATH} It's recommended to run the rsync command as a cronjob to keep your repository up to date as often as desired. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683034943.0 ppa_dev_tools-0.6.0/README.md0000664000175000017500000000631514424211477014701 0ustar00brycebrycePpa Dev Tools ============= ppa is a command line client for managing PPAs in Launchpad. This primarily focuses on functionality needed by owners of PPAs, to assist in their creation, deletion, and configuration. A key functionality is to poll and wait until the package(s) in the PPA have completed building; this permits blocking on the builds to delay other actions such as requesting users on a bug report to test the PPA, or submitting a merge proposal for the update to be considered for inclusion in the distro. You can view a team's registered PPAs using 'ppa list'. Usage ----- Register a new PPA ``` $ ppa create my-ppa PPA 'my-ppa' created for the following architectures: i386, amd64, armel, armhf, ppc64el, s390x, arm64, powerpc The PPA can be viewed at: https://launchpad.net/~my-name/+archive/ubuntu/my-ppa You can upload packages to this PPA using: dput ppa:my-name/my-ppa ``` Upload a package to the PPA ``` $ dput ppa:my-name/my-ppa some-package.changes ``` Wait until all packages in the PPA have finished building ``` $ ppa wait ppa:my-name/my-ppa ``` Set the public description for a PPA from a file ``` $ cat some-package/README | ppa desc ppa:my-name/my-ppa ``` Trigger autopkgtests for the package, and check results ``` $ ppa tests ppa:my-name/my-ppa ``` Delete the PPA ``` $ ppa destroy ppa:my-name/my-ppa ``` Auto-linked Autopkgtest Trigger URLS ------------------------------------ By default, `ppa tests` will display autopkgtest triggers as hyperlinked text. The hyperlinking feature is supported on many newer terminal programs but as it's a relatively recent VTE function it may not yet be available in the terminal you use. The following terminal programs are believed to support it: - iTerm2 3.1 - DomTerm 1.0.2 - hTerm 1.76 - Terminology 1.3? - Gnome Terminal 3.26 (VTE 0.50) - Guake 3.2.1 (VTE 0.50) - TOXTerm 3.5.1 (VTE 0.50) - Tilix 3.26 (VTE 0.50) - Terminator 2.0 This is not a comprehensive list, and likely will lengthen swiftly. Meanwhile, if you have a non-supporting browser, the --show-urls option can be passed to `ppa tests` to make it display the raw URLs that can be manually cut and pasted into your web browser. Autopkgtesting Reverse-dependencies ----------------------------------- In addition to creating trigger URLs for running your package's autopkgtest, it is also possible to do the same for everything dependent on your package. These other packages are termed 'reverse dependencies', aka 'rdepends'. To generate these URLs, just include the '--show-rdepends' option in your command line. For example: ``` $ ppa tests --show-rdepends ppa:my-name/my-ppa ``` The `ppa` command calculates the dependency trees using information from the Apt archive, which needs to be cached locally. Only the index information is needed, not a complete mirror. You can generate (and refresh) a dists-only mirror thusly: $ mkdir {LOCAL_REPOSITORY_PATH} $ rsync -va \\ --exclude={{'*/installer*','*/i18n/*','*/uefi/*','*/Contents*','*/by-hash/*','*tar.gz'}} \\ rsync://archive.ubuntu.com/ubuntu/dists {LOCAL_REPOSITORY_PATH} It's recommended to run the rsync command as a cronjob to keep your repository up to date as often as desired. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748791.0 ppa_dev_tools-0.6.0/RELEASING.md0000664000175000017500000000573714630542067015265 0ustar00brycebryceReleasing a New PPA Dev Tools Version ===================================== Before you start ---------------- * Update local Git repository to the current `main` tip. For a maintenance release (e.g. version 1.2.3), update to the current `stable-1.2` tip, instead. * Doublecheck all new dependencies are specified in packaging $ grep -h import */* | sed 's/ //' | grep -vE '(import|from) (ppa|\.)' | sort -u * Doublecheck the INSTALL.md file is still up to date * Write an entry in NEWS.md file with release notes * Commit everything that needs included in the release. These two commands should produce no output: $ git diff HEAD $ git log main...origin/main * Verify the build system works without errors $ make build * Verify the testsuite, lint, flake, etc. passes $ make check $ make coverage * Verify the snapcraft config is ready $ snapcraft --debug $ rm *.snap * Cleanup $ make clean $ git status --ignored Generate the source release --------------------------- * Set the version $ export VERSION="X.Y.Z" $ make set-release-version * Add a changelog entry $ dch -v "${VERSION}" * Add the release collateral $ git commit NEWS.md ppa/_version.py pyproject.toml debian/changelog snap/snapcraft.yaml -m "Releasing ${VERSION}" $ git tag -a -m "PPA Dev Tools ${VERSION}" "v${VERSION}" * Push the release $ git push origin main "v${VERSION}" * Create the release directory $ cp -ir ../$(basename $(pwd)) ../Releases/ppa-dev-tools-${VERSION}/ $ cd ../Releases/ppa-dev-tools-${VERSION} * Generate the release tarball $ make build $ python3 -m twine upload --verbose --repository pypi dist/*-${VERSION}* Generate the debian package --------------------------- * Set to latest distro release, and add changelog entry for "New release" $ debuild -S -sa $ dput ppa:bryce/ppa-dev-tools ../ppa-dev-tools_${VERSION}_source.changes * Repeat for each LTS release, with version set to ${VERSION}~YY.MM.N and changelog entry "Backport for ${codename}" $ dput ppa:bryce/ppa-dev-tools ../ppa-dev-tools_${VERSION}~YY.MM.N_source.changes Generate the snap ----------------- * Build the snap locally $ make snap * Verify the snap $ sudo snap install ppa-dev-tools__amd64.snap --devmode ppa-dev-tools installed $ ppa --version ppa 0.4.0 * Push snap to the snap repository $ snapcraft login $ snapcraft upload --release edge *.snap * Push the tag up to the repository Announce release ---------------- * Add release announcement on Launchpad * Send email to users' list - ppa-dev-tools-users@lists.launchpad.net CC ubuntu-server * Post to discourse Server channel, e.g. like https://discourse.ubuntu.com/t/release-of-ppa-dev-tools-0-4-0/35467 * Update Jira card(s) Return to Development --------------------- * Add a final commit bumping the package version to a new development one - Set snapcraft.yaml back to version: git * Finally, a manual `git push` (including tags) is required. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/TESTING.md0000664000175000017500000000026614627412314015056 0ustar00brycebryce## Prerequisites For running the testsuite: $ sudo apt install -y \ python3-pytest \ python3-flake8 \ python3-coverage ## Testing $ make check or $ pytest-3 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3281643 ppa_dev_tools-0.6.0/ppa/0000775000175000017500000000000014630542117014172 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1666823929.0 ppa_dev_tools-0.6.0/ppa/__init__.py0000664000175000017500000000000014326333371016273 0ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717477853.0 ppa_dev_tools-0.6.0/ppa/_version.py0000775000175000017500000000023414627520735016402 0ustar00brycebryce# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- __version__ = '0.6.0' __version_info__ = tuple(map(int, __version__.split('.'))) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/binary_package.py0000664000175000017500000001764014630542102017505 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2023 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Interprets and analyzes an Ubuntu Apt record for a binary package.""" from functools import lru_cache from typing import Dict from .dict import unpack_to_dict class BinaryPackage: """The Apt record about an installable binary .deb. SourcePackages are built into multiple BinaryPackages for different components and different architectures. This object is intended to be instantiated from a raw Apt binary package record such as extracted from a Packages.xz file by apt_pkg.TagFile(). The BinaryPackage class members handle the parsing and interpretation of the data values of the record such as installation dependencies. Since objects of this class are constructed as thin wrappers on the Apt record, the available member properties for the object will vary depending on the data elements present in the record. For example, if there isn't a "Task:" field, then this object will not have a 'self.task' property. For member properties needed by users of this class, it's recommended to guarantee their presence either by requiring them from the pkg_dict in the __init__() property, or add a property to the class that checks and substitutes a suitable default if missing. """ # pylint: disable=no-member def __init__(self, pkg_dict: dict): """Initialize a new SourcePackage object for a given package. :param dict[str, str] pkg_dict: Data collection loaded from an Apt record. """ # Auto-create member parameters from the Apt record's data structure for k, val in dict(pkg_dict).items(): setattr(self, k.lower().replace('-', '_'), val) # Required fields that must be present in pkg_dict for object validity for field in ['package', 'version', 'architecture']: if getattr(self, field, None) is None: raise ValueError(f'undefined {field} from Apt record for binary package') def __repr__(self): """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'pkg_dict={vars(self)!r})') def __str__(self): """Return a human-readable textual description of the BinaryPackage. :rtype: str :returns: Human-readable string. """ return f"{self.package} ({self.version}) [{self.architecture}]" @property def name(self): """The name of the binary package as recorded in the Apt database. :rtype: str :returns: Package name. """ return self.package @property @lru_cache def installation_dependencies(self) -> Dict[str, str]: """Required binary packages that must be installed as prerequisites. :rtype: dict[str, str] :returns: Collection of package names to version specification strings. """ if getattr(self, 'depends', None) is None: # Missing Depends is uncommon, but can occur for packages # consisting just of config files, for example. return {} deps = unpack_to_dict(self.depends, key_sep=' ') if not deps: raise RuntimeError('Could not parse packages from Depends line of Apt record.') return deps @property @lru_cache def recommended_packages(self) -> Dict[str, str]: """Optional binary packages intended to be co-installed. :rtype: dict[str, str] :returns: Collection of package names to version specification strings. """ if getattr(self, 'recommends', None) is None: return {} recs = unpack_to_dict(self.recommends, key_sep=' ') if not recs: raise RuntimeError('Could not parse packages from Recommends line of Apt record.') return recs if __name__ == "__main__": # pylint: disable=line-too-long, invalid-name import os import apt_pkg import pprint pp = pprint.PrettyPrinter(indent=4) root_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')) tests_data_dir = os.path.join(root_dir, 'tests', 'data') assert os.path.exists(tests_data_dir), f'cannot find {tests_data_dir}' print('####################################') print('## BinaryPackage class smoke test ##') print('####################################') print() print('Binary Packages') print('---------------') with apt_pkg.TagFile(f'{tests_data_dir}/binary-amd64/Packages.xz') as pkgs: results = [] for pkg in pkgs: binary = BinaryPackage(pkg) results.append(str(binary)) num_results = len(results) ellipses_shown = False for i, result in enumerate(results): if i < 10 or i >= num_results - 10: print(result) elif not ellipses_shown: print('...') ellipses_shown = True print() print('Details for "dovecot-core"') print('--------------------------') package_data = { 'Package': 'dovecot-core', 'Architecture': 'amd64', 'Version': '1:2.3.19.1+dfsg1-2ubuntu4', 'Priority': 'optional', 'Section': 'mail', 'Source': 'dovecot', 'Origin': 'Ubuntu', 'Maintainer': 'Ubuntu Developers ', 'Original-Maintainer': 'Dovecot Maintainers ', 'Bugs': 'https://bugs.launchpad.net/ubuntu/+filebug', 'Installed-Size': '10406', 'Provides': 'dovecot-abi-2.3.abiv19, dovecot-common', 'Pre-Depends': 'init-system-helpers (>= 1.54~)', 'Depends': 'adduser, libpam-runtime, lsb-base, openssl, ssl-cert, ucf, libapparmor1 (>= 2.7.0~beta1+bzr1772), libbz2-1.0, libc6 (>= 2.36), libcap2 (>= 1:2.10), libcrypt1 (>= 1:4.1.0), libexttextcat-2.0-0 (>= 3.3.0), libicu72 (>= 72.1~rc-1~), liblua5.3-0, liblz4-1 (>= 0.0~r130), liblzma5 (>= 5.1.1alpha+20120614), libpam0g (>= 0.99.7.1), libsodium23 (>= 1.0.13), libssl3 (>= 3.0.0), libstemmer0d (>= 0+svn527), libsystemd0, libtirpc3 (>= 1.0.2), libunwind8, libwrap0 (>= 7.6-4~), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)', # noqa: E501 'Suggests': 'dovecot-gssapi, dovecot-imapd, dovecot-ldap, dovecot-lmtpd, dovecot-lucene, dovecot-managesieved, dovecot-mysql, dovecot-pgsql, dovecot-pop3d, dovecot-sieve, dovecot-solr, dovecot-sqlite, dovecot-submissiond, ntp', # noqa: E501 'Breaks': 'dovecot-common (<< 1:2.0.14-2~), mailavenger (<< 0.8.1-4)', 'Replaces': 'dovecot-common (<< 1:2.0.14-2~), mailavenger (<< 0.8.1-4)', 'Filename': 'pool/main/d/dovecot/dovecot-core_2.3.19.1+dfsg1-2ubuntu4_amd64.deb', 'Size': '3300962', 'MD5sum': 'c6f61ffe0f01f51405c4fc22f6770cd2', 'SHA1': 'ed389250d8738c0199f24cab2fe33e12b84e31c7', 'SHA256': 'd73fb4bc55c764b9ad8c143c1f2b04a1cfb6ce2c2d751e4970ee09199ed7c3cb', 'SHA512': 'ab55bdcdc31eac59168883ff83b2e6f2ee57b9340eb6b4e5b0f4e354813ae7dc0ca21ba34265f872a9c014b3c06bacad95708059c7a06c8c93d4a22ccb31494c', # noqa: E501 'Homepage': 'https://dovecot.org/', 'Description': 'secure POP3/IMAP server - core files', 'Task': 'mail-server', 'Description-md5': '42825422b1ef9e3a592c94dfafed375c', } binary = BinaryPackage(package_data) print('* Object:') pp.pprint(vars(binary)) print() print('* Installation Requires:') for pkg, ver in sorted(binary.installation_dependencies.items()): print(f' - {pkg}: {ver}') print() print('* Recommends:') for pkg, ver in sorted(binary.recommended_packages.items()): print(f' - {pkg}: {ver} ') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1694724888.0 ppa_dev_tools-0.6.0/ppa/constants.py0000664000175000017500000000274414500671430016564 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Global constants.""" ARCHES_ALL = ["amd64", "arm64", "armhf", "armel", "i386", "powerpc", "ppc64el", "s390x", "riscv64"] ARCHES_PPA_DEFAULT = ["amd64", "i386"] ARCHES_PPA_ALL = ["amd64", "arm64", "armhf", "i386", "powerpc", "ppc64el", "s390x"] ARCHES_PPA_EXTRA = ["riscv64"] ARCHES_AUTOPKGTEST = ["amd64", "arm64", "armhf", "i386", "ppc64el", "s390x"] CREDENTIALS_FILENAME_DEFAULT = "credentials.oauth" URL_LPAPI = "https://api.launchpad.net/devel" URL_AUTOPKGTEST = "https://autopkgtest.ubuntu.com" DISTRO_UBUNTU_COMPONENTS = ['main', 'restricted', 'universe', 'multiverse', 'partner'] DISTRO_UBUNTU_POCKETS = ['release', 'security', 'proposed', 'updates', 'backports'] DISTRO_UBUNTU_POCKETS_UPDATES = ['release', 'security', 'updates'] LOCAL_REPOSITORY_PATH = "/tmp/ubuntu" LOCAL_REPOSITORY_MIRRORING_DIRECTIONS = f""" Tip: You can generate (and refresh) a dists-only mirror thusly: $ mkdir {LOCAL_REPOSITORY_PATH} $ rsync -va \\ --exclude={{'*/installer*','*/i18n/*','*/uefi/*','*/Contents*','*/by-hash/*','*tar.gz'}} \\ rsync://archive.ubuntu.com/ubuntu/dists {LOCAL_REPOSITORY_PATH} It's recommended to run the rsync command as a cronjob to keep your repository up to date as often as desired. """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1693008778.0 ppa_dev_tools-0.6.0/ppa/debug.py0000664000175000017500000000217614472241612015640 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. import sys import pprint import textwrap DEBUGGING = False def dbg(msg, wrap=0, prefix=None, indent=''): """Print information if debugging is enabled.""" if DEBUGGING: if type(msg) is str: if wrap == 0 and indent != '': wrap = 72 if wrap > 0: if prefix is None and len(indent) > 0: prefix = indent msg = textwrap.fill( msg, width=wrap, initial_indent=prefix, subsequent_indent=indent) sys.stderr.write(f"{msg}\n") else: pprint.pprint(msg) def warn(msg): """Print warning message to stderr.""" sys.stderr.write(f"Warning: {msg}\n") def error(msg): """Print error message to stderr.""" sys.stderr.write(f"Error: {msg}\n") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1693008778.0 ppa_dev_tools-0.6.0/ppa/dict.py0000664000175000017500000001720314472241612015472 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington ''' Routines for dealing with dictionary objects. ''' def unpack_to_dict(text, key_cut=':', key_sep='=') -> dict: """Convert comma-delimited data into a dictionary. For each item, if @param key_sep is present split on it to get the key and value. If @param key_sep is not present, then the item will be stored as the key with an empty string as the value. The key is further processed by excluding anything after @param key_cut. For example, with the default values for @param key_sep and @param key_cut, the string "a,b=1.2.3,c:xyz=42" will unpack into: { 'a': '', 'b': '1.2.3', 'c': '42', } A basic use case of this routine is to split out comma-separated items in a command line parameter's value string. The @param key_sep parameter facilitates parsing lists of key=value items. The @param key_cut provides a mechanism for filtering out unwanted portions of key names; for example, in "mypackage/universe=1.2.3" we may want to ignore the 'universe' detail. This routine is intended to handle parsing of Debian control fields sufficiently to determine the package names. This routine is NOT intended to be a specification-compliant parser, and in particular is neither idempotent nor thorough in its parsing. See https://wiki.debian.org/BuildProfileSpec for details about Debian's control field format. To support these control fields, the '|' symbol is recognized as a way of representing multiple alternative items via a tuple of keys and a dict for the value. For example, the string 'a,b=1|c=2,d=3' will unpack into: { 'a': '', ('b', 'c'): {'b': '1', 'c': '2'}, 'd': '3' } :param str text: Comma-separated textual data collection. :param str key_cut: Ignore anything in key after this character. :param str key_sep: Character used to separate an item's key from its value. :returns: Dictionary of data->value items :rtype: dict[str, str] """ if not text or not key_sep or not key_cut: # None is not handled for any of the parameters so far. raise ValueError("unpack_to_dict() requires non-None values for all arguments") elif key_sep.strip() == ',': # Comma is used internally as the separator character, and # cannot currently be configured differently, thus it can't be # used by key_sep as a secondary separator. raise ValueError("comma is reserved and cannot be used for key_sep") elif not key_cut.strip() or key_cut.strip() == ',': # Whitespace is permitted for key_sep, but not for key_cut. # Comma is not allowed for key_cut, for same reason as for key_sep. raise ValueError("key_cut must be at least one (non-comma, non-whitespace) character") elif key_sep.strip() == key_cut.strip(): # Since we're splitting on key_sep, using the same string to then split # key_cut would be redundant and ineffective. raise ValueError("key_sep and key_cut must not be the same string") def _split_item(item, key_sep, key_cut): if key_sep in item: key, value = item.split(key_sep, 1) else: key = item value = '' if key_cut: key = key.split(key_cut, 1)[0] # Blank value is allowed, but not key. Neither can be None. if not key or value is None: raise ValueError return key.strip(), value.strip() dictionary = {} for item in text.split(','): if not item: raise ValueError item = item.strip() if '|' in item: # Handled items with are actually multiple items OR-ed together. subitems = {} for subitem in item.split('|'): subitem = subitem.strip() if not subitem: raise ValueError("Undefined element of OR ('|') clause") subitems.update(dict([_split_item(subitem, key_sep, key_cut)])) # Store multi-values using a tuple key rather than a simple string. dictionary[tuple(subitems.keys())] = subitems else: # Store single-values as a simple string key. dictionary.update(dict([_split_item(item, key_sep, key_cut)])) return dictionary if __name__ == "__main__": # pylint: disable=line-too-long, invalid-name import pprint pp = pprint.PrettyPrinter(indent=4) print('#####################') print('## Dict smoke test ##') print('#####################') print() text = "a, b=1.2.3, c:x=4" print(text) pp.pprint(unpack_to_dict(text)) print() print("* Conflicts:") text = "binutils-mingw-w64-i686 (<< 2.23.52.20130612-1+3), zlib1g (>= 1:1.1.4)" print(text) pp.pprint(unpack_to_dict(text, key_sep=' ')) print() print("* Build-Depends:") text = "autoconf (>= 2.64), dpkg-dev (>= 1.19.0.5), bison, flex, gettext, texinfo, dejagnu, quilt, chrpath, dwz, debugedit (>= 4.16), python3:any, file, xz-utils, lsb-release, zlib1g-dev, procps, g++-aarch64-linux-gnu [amd64 i386 x32] , g++-arm-linux-gnueabi [amd64 arm64 i386 x32] , g++-arm-linux-gnueabihf [amd64 arm64 i386 x32] , g++-powerpc64le-linux-gnu [amd64 arm64 i386 ppc64 x32] , g++-s390x-linux-gnu [amd64 arm64 i386 ppc64el x32] , g++-alpha-linux-gnu [amd64 i386 x32] , g++-hppa-linux-gnu [amd64 i386 x32] , g++-m68k-linux-gnu [amd64 i386 x32] , g++-powerpc-linux-gnu [amd64 i386 ppc64el x32] , g++-powerpc64-linux-gnu [amd64 i386 x32] , g++-riscv64-linux-gnu [amd64 arm64 i386 ppc64el x32] , g++-sh4-linux-gnu [amd64 i386 x32] , g++-sparc64-linux-gnu [amd64 i386 x32] , g++-i686-linux-gnu [amd64 arm64 ppc64el x32] , g++-x86-64-linux-gnu [arm64 i386 ppc64el] , g++-x86-64-linux-gnux32 [amd64 arm64 i386 ppc64el] " # noqa: E501 print(text) pp.pprint(unpack_to_dict(text, key_sep=' ')) print() print("* Depends:") text = "binutils-common (= 2.38.50.20220707-1ubuntu1), libbinutils (= 2.38.50.20220707-1ubuntu1), binutils-x86-64-linux-gnu (= 2.38.50.20220707-1ubuntu1)" # noqa: E501 print(text) pp.pprint(unpack_to_dict(text, key_cut='#', key_sep=' ')) print() print("* Depends:") text = """ adduser, libpam-runtime, lsb-base, openssl, ssl-cert, ucf, ${misc:Depends}, ${shlibs:Depends} """ print(text) pp.pprint(unpack_to_dict(text, key_cut='#', key_sep=' ')) print() print("* Depends:") text = """ ${misc:Depends}, debhelper-compat (= 13), dpkg-dev (>= 1.15.5), nginx-core (<< 5.1~) | nginx-light (<< 5.1~) | nginx-extras (<< 5.1~), nginx-core (>= 5) | nginx-light (>= 5) | nginx-extras (>= 5) """ print(text) pp.pprint(unpack_to_dict(text, key_cut='#', key_sep=' ')) print() print("* Depends:") text = """ ${misc:Depends}, debhelper-compat (= 13), dpkg-dev (>= 1.15.5), nginx-core (<< 5.1~) | nginx-light (<< 5.1~) | nginx-extras (<< 5.1~), nginx-core (>= 5) | nginx-light (>= 5) | nginx-extras (>= 5) """ print(text) pp.pprint(unpack_to_dict(text, key_sep=' ', key_cut='#')) print() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1716323271.0 ppa_dev_tools-0.6.0/ppa/io.py0000664000175000017500000000224714623201707015157 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Utilities for reading input and writing output to external locations.""" import sys import urllib.request def open_url(url, desc="data"): """Open a remote URL for reading. :rtype: urllib.request.Request :returns: A request object for the stream to read from, or None on error. """ request = urllib.request.Request(url) request.add_header('Cache-Control', 'max-age=0') try: return urllib.request.urlopen(request) except urllib.error.HTTPError as e: if e.code == 401: # 401 means access denied. Launchpad sometimes returns this # when something is not published yet. return None elif e.code == 404: # 404 means not found; prefer not to emit error messages return None else: sys.stderr.write(f"Error: Could not retrieve {desc} from {url}: {e}\n") return None ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1716323271.0 ppa_dev_tools-0.6.0/ppa/job.py0000775000175000017500000002164414623201707015327 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """An individual autopkgtest run.""" import json from functools import lru_cache from typing import Iterator import urllib from .constants import URL_AUTOPKGTEST class Job: """An individual autopkgtest run that has not yet completed. A Job will correspond to one Result object once it has completed. """ def __init__(self, number, submit_time, source_package, series, arch, triggers=None, ppas=None): """Initialize a new Job object. :param str number: Position within the waiting queue. :param str submit_time: Timestamp when job was submitted. :param str source_package: Source package containing the DEP8 tests to run. :param str series: Codename of the Ubuntu release to run tests on. :param str arch: Hardware architecture type to run tests on. :param list[str] triggers: List of package/version triggers for the job. :param list[str] ppas: List of PPAs to enable. """ self.number = number self.submit_time = submit_time self.source_package = source_package self.series = series self.arch = arch self.triggers = triggers or [] self.ppas = ppas or [] def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'source_package={self.source_package!r}, ' f'series={self.series!r}, ' f'arch={self.arch!r}' f')') def __str__(self) -> str: """Return a human-readable summary of the object. :rtype: str :returns: Printable summary of the object. """ return f"{self.source_package} {self.series} ({self.arch})" @lru_cache def to_dict(self): return { 'number': self.number, 'submit_time': self.submit_time, 'source_package_name': self.source_package, 'series': self.series, 'arch': self.series, 'triggers': self.triggers, 'ppas': self.ppas } @property def request_url(self) -> str: """Render URL for requesting the testing run be started. :rtype: str :returns: Full URL for invoking the test. """ parameter_str = urllib.parse.urlencode({ 'release': self.series, 'arch': self.arch, 'package': self.source_package}) for trigger in self.triggers: parameter_str += "&" + urllib.parse.urlencode({"trigger": trigger}) return f"{URL_AUTOPKGTEST}/request.cgi?{parameter_str}" def get_running(response, releases=None, sources=None, ppa=None) -> Iterator[Job]: """Return iterator currently running autopkgtests for given criteria. Filters the list of running autopkgtest jobs by the given series and/or ppa names, returning an iterator with matching results as Job objects. If series and ppa are not provided, then returns all results; if one or the other is provided, provides all available results for that series or ppa. :param HTTPResponse response: Context manager; the response from urlopen() :param List[str] releases: The Ubuntu series codename(s), or None. :param List[str] sources: Only retrieve results for these source packages, or all if blank or None. :param str ppa: The PPA address criteria, or None. :rtype: Iterator[Job] :returns: Currently running jobs, if any, or an empty list on error """ for pkg, jobs in json.loads(response.read().decode('utf-8') or '{}').items(): if sources and (pkg not in sources): continue for handle in jobs: for codename in jobs[handle]: for arch, jobinfo in jobs[handle][codename].items(): triggers = jobinfo[0].get('triggers', None) ppas = jobinfo[0].get('ppas', None) submit_time = jobinfo[1] job = Job(0, submit_time, pkg, codename, arch, triggers, ppas) if releases and (job.series not in releases): continue if ppa and (ppa not in job.ppas): continue yield job def get_waiting(response, releases=None, sources=None, ppa=None) -> Iterator[Job]: """Return iterator of queued autopkgtests for given criteria. Filters the list of autopkgtest jobs waiting for execution by the given series and/or ppa names, returning an iterator with matching results as Job objects. If series and ppa are not provided, then returns all results; if one or the other is provided, provides all available results for that series or ppa. :param HTTPResponse response: Context manager; the response from urlopen() :param List[str] releases: The Ubuntu series codename(s), or None. :param List[str] sources: Only retrieve results for these source packages, or all if blank or None. :param str ppa: The PPA address criteria, or None. :rtype: Iterator[Job] :returns: Currently waiting jobs, if any, or an empty list on error """ for _, queue in json.loads(response.read().decode('utf-8') or '{}').items(): for codename in queue: for arch in queue[codename]: n = 0 for key in queue[codename][arch]: if key == 'private job': continue (pkg, json_data) = key.split(maxsplit=1) if sources and (pkg not in sources): continue jobinfo = json.loads(json_data) n += 1 triggers = jobinfo.get('triggers', None) ppas = jobinfo.get('ppas', None) job = Job(n, None, pkg, codename, arch, triggers, ppas) if releases and (job.series not in releases): continue if ppa and (ppa not in job.ppas): continue yield job def show_running(jobs): """Print the active (running and waiting) tests.""" rformat = "%-8s %-20s %-8s %-8s %-25s %s" n = 0 for n, e in enumerate(jobs, start=1): if n == 1: print("* Running:") t_str = str(e.submit_time) ppa_str = ','.join(e.ppas) trig_str = ','.join(e.triggers) print(" # " + rformat % ("time", "pkg", "release", "arch", "ppa", "trigger")) print(" - " + rformat % (t_str, e.source_package, e.series, e.arch, ppa_str, trig_str)) if n == 0: print("* Running: (none)") def show_waiting(jobs): """Print the active (running and waiting) tests.""" rformat = "%-8s %-40s %-8s %-8s %-40s %s" n = 0 for n, e in enumerate(jobs, start=1): if n == 1: print("* Waiting:") print(" # " + rformat % ("Q-num", "pkg", "release", "arch", "ppa", "trigger")) ppa_str = ','.join(e.ppas) trig_str = ','.join(e.triggers) print(" - " + rformat % (e.number, e.source_package, e.series, e.arch, ppa_str, trig_str)) if n == 0: print("* Waiting: (none)") if __name__ == "__main__": import os from urllib.request import urlopen print('############################') print('### Job class smoke test ###') print('############################') print() root_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')) jobinfo = { 'triggers': ['a/1', 'b/2.1', 'c/3.2.1'], 'ppas': ['ppa:me/myppa'] } job_1 = Job( number=0, submit_time='time', source_package='my-package', series='kinetic', arch='amd64', triggers=jobinfo.get('triggers', None), ppas=jobinfo.get('ppas', None) ) print(job_1) print(f"triggers: {job_1.triggers}") print(f"ppas: {job_1.ppas}") print(f"request_url: {job_1.request_url}") print() # pylint: disable-next=invalid-name ppa = "bryce/dovecot-merge-v1e2.3.19.1adfsg1-2" print("running:") response = urlopen(f"file://{root_dir}/tests/data/running-20220822.json") for job in get_running(response, releases=['kinetic'], sources=None, ppa=ppa): print(job) print() print("waiting:") response = urlopen(f"file://{root_dir}/tests/data/queues-20220822.json") for job in get_waiting(response, releases=['kinetic'], sources=None, ppa=ppa): print(job) print() print("Object Dump") print("-----------") print(json.dumps(job_1.to_dict(), indent=4)) print() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1694724888.0 ppa_dev_tools-0.6.0/ppa/lp.py0000664000175000017500000001660414500671430015163 0ustar00brycebryce# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2021 Bryce W. Harrington # # Released under GNU AGPL or later, read the file 'LICENSE.AGPL' for # more information. # Extraction of bileto's lp class, for general use in other places """Launchpad Interface.""" from contextlib import suppress from functools import lru_cache from launchpadlib.launchpad import Launchpad from launchpadlib.credentials import Credentials class Lp: """High level wrapper object for Launchpad's API. This class wrappers the Launchpadlib service to cache object queries and to provide functionalies frequently needed when writing software for managing the Ubuntu distribution. This can be used as a drop-in replacement in scripts that already use Launchpadlib. Simply replace your Launchpadlib.login_with() call with an instantiation of this class. Any call that Lp does not handle itself is passed directly to the Launchpadlib object, so the entire API is available in exactly the same way. """ # pylint: disable=invalid-name ROOT_URL = 'https://launchpad.net/' API_ROOT_URL = 'https://api.launchpad.net/devel/' BUGS_ROOT_URL = 'https://bugs.launchpad.net/' CODE_ROOT_URL = 'https://code.launchpad.net/' _real_instance = None def __init__(self, application_name, service=Launchpad, staging=False, credentials=None): """Create a Launchpad service object. Authentication with Launchpad is done lazily, not at object initialization but at the point it first needs to actually use Launchpad functionality. This permits adjustment of the object's credentials or other properties as needed. If the `$LP_CREDENTIAL` environment variable is defined, its contents will be loaded as the credentials to pass to the Credentials.from_string() function. Stored credentials must be formatted according to the requirements of launchpadlib's Credentials class. For more information on this class see: https://git.launchpad.net/launchpadlib/tree/src/launchpadlib/credentials.py :param str application_name: The text name of the software using this class. :param Launchpad service: The launchpadlib service class or object to wrapper. :param bool staging: When true, operate against a test instance of Launchpad instead of the real one. :param str credentials: (Optional) Formatted OAuth information to use when authenticating with Launchpad. If not provided, will automatically login to Launchpad as needed. """ self._app_name = application_name self._service = service self._credentials = credentials if staging: self._service_root = 'qastaging' self.ROOT_URL = 'https://qastaging.launchpad.net/' self.API_ROOT_URL = 'https://api.qastaging.launchpad.net/devel/' self.BUGS_ROOT_URL = 'https://bugs.qastaging.launchpad.net/' self.CODE_ROOT_URL = 'https://code.qastaging.launchpad.net/' else: self._service_root = 'production' def _get_instance_from_creds(self) -> 'Launchpad | None': """ Get an instance of _service using stored credentials if defined, else return None. For more information on Launchpad credentials-based authentication see https://help.launchpad.net/API/launchpadlib#Authenticated_access_for_website_integration :rtype: Launchpad | None :returns: Logged in Launchpad instance if credentials available, else None """ if self._credentials: cred = Credentials.from_string(self._credentials) return self._service( cred, None, None, service_root=self._service_root, version='devel' ) return None def _get_instance_from_login(self) -> 'Launchpad': """ Prompts the user to authorize the login of a new credential or use the cached one if it is available and valid :rtype: launchpadlib.launchpad.Launchpad :returns: Logged in Launchpad instance """ return self._service.login_with( application_name=self._app_name, service_root=self._service_root, allow_access_levels=['WRITE_PRIVATE'], version='devel', # Need devel for copyPackage. ) @property def _instance(self): """Cache LP object.""" if not self._real_instance: self._real_instance = ( self._get_instance_from_creds() or self._get_instance_from_login() ) return self._real_instance @property @lru_cache() def _api_root(self): """Identify the root URL of the launchpad API.""" return self._instance.resource_type_link.split('#')[0] def __getattr__(self, attr): """Wrap launchpadlib so tightly you can't tell the difference.""" assert not attr.startswith('_'), f"Can't getattr for {attr}" instance = super(Lp, self).__getattribute__('_instance') return getattr(instance, attr) @property @lru_cache() def ubuntu(self): """Shorthand for Ubuntu object. :rtype: distribution :returns: The distribution object for 'ubuntu'. """ return self.distributions['ubuntu'] @lru_cache() def ubuntu_active_series(self): """Identify currently supported Ubuntu series. This includes the series currently under development, but not ones which are experimental or obsolete. :rtype: list of distro_series :returns: All active Launchpad distro series for the Ubuntu project. """ return [s for s in self.ubuntu.series if s.active] @property @lru_cache() def debian(self): """Shorthand for Debian object. :rtype: distribution :returns: The distribution object for 'debian'. """ return self.distributions['debian'] @lru_cache() def debian_active_series(self): """Identify currently supported Debian series. :rtype: list of distro_series :returns: All active Launchpad distro series for the Debian project. """ return [s for s in self.debian.series if s.active] @lru_cache() def debian_experimental_series(self): """Shorthand for Debian experimental series. :rtype: distro_series :returns: The Launchpad distro series for the Debian project. """ return next(iter([s for s in self.debian.series if s.name == 'experimental']), None) @lru_cache() def get_teams(self, user): """Retrieve list of teams that user belongs to. :param str user: Name of the user to look up. :rtype: list(str) :returns: List of team names. """ with suppress(KeyError, TypeError): return [ team.self_link.partition('~')[-1].partition('/')[0] for team in self.people[user].memberships_details] def load(self, url): """Return a lp resource from a launchpad url. :param str url: The launchpad resource URL. :rtype: varies :returns: Launchpadlib object corresponding to given url. """ return self._instance.load(url) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/ppa.py0000775000175000017500000006573514630542102015341 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """A wrapper around a Launchpad Personal Package Archive object.""" import os import re import sys import enum from datetime import datetime from functools import lru_cache from itertools import chain from typing import Iterator, List from lazr.restfulclient.errors import BadRequest, NotFound, Unauthorized from .constants import URL_AUTOPKGTEST from .io import open_url from .job import Job, get_waiting, get_running from .result import get_results class PendingReason(enum.Enum): """This describes the reason that leads an operation to hang""" BUILD_FAILED = enum.auto() # Build failed BUILD_WAITING = enum.auto() # Build is still ongoing BUILD_PUB_WAITING = enum.auto() # Build is awaiting publication SOURCE_PUB_WAITING = enum.auto() # Source is awaiting publication BUILD_MISSING = enum.auto() # Build was expected, but missing class PpaNotFoundError(Exception): """Exception indicating a requested PPA could not be found.""" def __init__(self, ppa_name, owner_name, message=None): """Initialize the exception object. :param str ppa_name: The name of the missing PPA. :param str owner_name: The person or team the PPA belongs to. :param str message: An error message. """ self.ppa_name = ppa_name self.owner_name = owner_name self.message = message def __str__(self): """Return a human-readable error message. :rtype str: :return: Error message about the failure. """ if self.message: return self.message return f"The PPA '{self.ppa_name}' does not exist for person or team '{self.owner_name}'" class Ppa: """Encapsulate data needed to access and conveniently wrap a PPA. This object proxies a PPA, allowing lazy initialization and caching of data from the remote. """ BUILD_FAILED_FORMAT = ( " - {package_name} ({version}) {arch} {state}\n" " + Log Link: {log_link}\n" " + Launchpad Build Page: {build_page}\n" ) def __init__(self, ppa_name, owner_name, ppa_description=None, service=None): """Initialize a new Ppa object for a given PPA. This creates only the local representation of the PPA, it does not cause a new PPA to be created in Launchpad. For that, see PpaGroup.create() :param str ppa_name: The name of the PPA within the owning person or team's namespace. :param str owner_name: The name of the person or team the PPA belongs to. :param str ppa_description: Optional description text for the PPA. :param launchpadlib.service service: The Launchpad service object. """ if not ppa_name: raise ValueError("undefined ppa_name.") if not owner_name: raise ValueError("undefined owner_name.") self.ppa_name = ppa_name self.owner_name = owner_name if ppa_description is None: self.ppa_description = '' else: self.ppa_description = ppa_description self._service = service def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'ppa_name={self.ppa_name!r}, owner_name={self.owner_name!r})') def __str__(self) -> str: """Return a displayable string identifying the PPA. :rtype: str :returns: Displayable representation of the PPA. """ return f"{self.owner_name}/{self.name}" @property @lru_cache def archive(self): """Retrieve the LP Archive object from the Launchpad service. :rtype: archive :returns: The Launchpad archive object. :raises PpaNotFoundError: Raised if a PPA does not exist in Launchpad. """ if not self._service: raise AttributeError("Ppa object not connected to the Launchpad service") try: owner = self._service.people[self.owner_name] return owner.getPPAByName(name=self.ppa_name) except NotFound: raise PpaNotFoundError(self.ppa_name, self.owner_name) @lru_cache def exists(self) -> bool: """Indicate if the PPA exists in Launchpad.""" try: self.archive return True except PpaNotFoundError: return False @property @lru_cache def address(self): """The proper identifier of the PPA. :rtype: str :returns: The full identification string for the PPA. """ return "ppa:{}/{}".format(self.owner_name, self.ppa_name) @property def name(self): """The name portion of the PPA's address. :rtype: str :returns: The name of the PPA. """ return self.ppa_name @property def url(self): """The HTTP url for the PPA in Launchpad. :rtype: str :returns: The url of the PPA. """ return self.archive.web_link @property def description(self): """The description body for the PPA. :rtype: str :returns: The description body for the PPA. """ return self.ppa_description def set_description(self, description): """Configure the displayed description for the PPA. :rtype: bool :returns: True if successfully set description, False on error. """ self.ppa_description = description try: archive = self.archive except PpaNotFoundError as e: print(e) return False archive.description = description retval = archive.lp_save() print("setting desc to '{}'".format(description)) print("desc is now '{}'".format(self.archive.description)) return retval and self.archive.description == description @property @lru_cache def is_private(self) -> bool: """Indicates if the PPA is private or public. :rtype: bool :returns: True if the archive is private, False if public. """ return self.archive.private def set_private(self, private: bool): """Attempts to configure the PPA as private. Note that PPAs can't be changed to private if they ever had any sources published, or if the owning person or team is not permitted to hold private PPAs. :param bool private: Whether the PPA should be private or public. """ if private is None: return self.archive.private = private self.archive.lp_save() @property @lru_cache def publish(self): return self.archive.publish def set_publish(self, publish: bool): if publish is None: return self.archive.publish = publish self.archive.lp_save() @property @lru_cache def architectures(self) -> List[str]: """The architectures configured to build packages in the PPA. :rtype: List[str] :returns: List of architecture names, or None on error. """ try: return [proc.name for proc in self.archive.processors] except PpaNotFoundError as e: sys.stderr.write(e) return None def set_architectures(self, architectures: List[str]) -> bool: """Configure the architectures used to build packages in the PPA. Note that some architectures may only be available upon request from Launchpad administrators. ppa.constants.ARCHES_PPA is a list of standard architectures that don't require permissions. :param List[str] architectures: List of processor architecture names :rtype: bool :returns: True if architectures could be set, False on error or if no architectures were specified. """ if not architectures: return False base = self._service.API_ROOT_URL.rstrip('/') procs = [] for arch in architectures: procs.append(f'{base}/+processors/{arch}') try: self.archive.setProcessors(processors=procs) return True except PpaNotFoundError as e: sys.stderr.write(e) return False @property @lru_cache def dependencies(self) -> List[str]: """The additional PPAs configured for building packages in this PPA. :rtype: List[str] :returns: List of PPA addresses """ ppa_addresses = [] for dep in self.archive.dependencies: ppa_dep = dep.dependency ppa_addresses.append(ppa_dep.reference) return ppa_addresses def set_dependencies(self, ppa_addresses: List[str]): """Configure the additional PPAs used to build packages in this PPA. This removes any existing PPA dependencies and adds the ones in the corresponding list. If any of these new PPAs cannot be found, this routine bails out without changing the current set. :param List[str] ppa_addresses: Additional PPAs to add """ base = self._service.API_ROOT_URL.rstrip('/') new_ppa_deps = [] for ppa_address in ppa_addresses: owner_name, ppa_name = ppa_address_split(ppa_address) new_ppa_dep = f'{base}/~{owner_name}/+archive/ubuntu/{ppa_name}' new_ppa_deps.append(new_ppa_dep) # TODO: Remove all existing dependencies # for ppa_dep in self.archive.dependencies: # the_ppa.removeArchiveDependency(ppa_dep) # TODO: Not sure what to pass here, maybe a string ala 'main'? component = None # TODO: Allow setting alternate pockets # TODO: Maybe for convenience it should be same as what's set for main archive? pocket = 'Release' for ppa_dep in new_ppa_deps: self.archive.addArchiveDependency( component=component, dependency=ppa_dep, pocket=pocket) # TODO: Error checking # This can throw ArchiveDependencyError if the ppa_address does not fit the_ppa def get_binaries( self, distro=None, series=None, arch=None, created_since_date=None, name=None ): """Retrieve the binary packages available in the PPA. :param distribution distro: The Launchpad distribution object. :param str series: The distro's codename for the series. :param str arch: The hardware architecture. :param datetime created_since_date: Only return binaries that were created on or after this date. :param str name: Only return binaries with this name. :rtype: List[binary_package_publishing_history] :returns: List of binaries, or None on error """ if distro is None and series is None and arch is None: try: return chain( self.archive.getPublishedBinaries( created_since_date=created_since_date, status="Pending", binary_name=name), self.archive.getPublishedBinaries( created_since_date=created_since_date, status="Published", binary_name=name)) except PpaNotFoundError as e: print(e) return None # elif series: # das = get_das(distro, series, arch) # ds = distro.getSeries(name_or_version=series) print("Unimplemented") return [] def get_source_publications( self, distro=None, series=None, arch=None, created_since_date=None, name=None ): """Retrieve the source packages in the PPA. :param distribution distro: The Launchpad distribution object. :param str series: The distro codename for the series. :param str arch: The hardware architecture. :param datetime created_since_date: Only return source publications that were created on or after this date. :param str name: Only return publications for this source package. :rtype: iterator :returns: Collection of source publications, or None on error. """ if distro and series and arch: # das = get_das(distro, series, arch) # ds = distro.getSeries(name_or_version=series) print("Unimplemented") return None try: return chain( self.archive.getPublishedSources( created_since_date=created_since_date, status="Pending", source_name=name), self.archive.getPublishedSources( created_since_date=created_since_date, status="Published", source_name=name)) except PpaNotFoundError as e: print(e) return None return None def destroy(self): """Delete the PPA. :rtype: bool :returns: True if PPA was successfully deleted, is in process of being deleted, no longer exists, or didn't exist to begin with. False if the PPA could not be deleted for some reason and is still existing. """ try: return self.archive.lp_delete() except PpaNotFoundError as e: print(e) return True except BadRequest: # Will report 'Archive already deleted' if deleted but not yet gone # we can treat this as successfully destroyed return True def has_packages(self, created_since_date=None, name=None) -> bool: """Indicate whether the PPA has any source packages. :param created_since_date: Cutoff date for the search, None means no cutoff. :param name: Only return source packages with this name. :rtype: bool :returns: True if PPA contains packages, False if empty or doesn't exit. """ return any(self.archive.getPublishedSources( created_since_date=created_since_date, source_name=name )) def pending_publications( self, created_since_date: 'datetime | None' = None, name: 'str | None' = None, logging: 'bool' = False ) -> 'List[PendingReason]': """ Check for pending publications and returns a list of PendingReason. :param datetime created_since_date: Cutoff date for the search, None means no cutoff :param str name: Only return pending publications for this source package. :rtype: list[PendingReason] :returns: A list of PendingReason indicating the status of the pending publications. Empty means there are no pending publications. """ pending_publication_sources = {} required_builds = {} pending_publication_builds = {} published_builds = {} for source_publication in self.get_source_publications( created_since_date=created_since_date, name=name ): if not source_publication.date_published: pending_publication_sources[source_publication.self_link] = source_publication # iterate over the getBuilds result with no status restriction to get build records for build in source_publication.getBuilds(): required_builds[build.self_link] = build for binary_publication in self.get_binaries( created_since_date=created_since_date, name=name ): # Ignore failed builds build = binary_publication.build if build.buildstate != "Successfully built": continue # Skip binaries for obsolete sources source_publication = build.current_source_publication if source_publication is None: continue if binary_publication.status == "Pending": pending_publication_builds[binary_publication.build_link] = binary_publication elif binary_publication.status == "Published": published_builds[binary_publication.build_link] = binary_publication if not logging: os.system('clear') retval = [] num_builds_waiting = ( len(required_builds) - len(pending_publication_builds) - len(published_builds) ) if num_builds_waiting != 0: num_build_failures = 0 builds_waiting_output = '' builds_failed_output = '' for build in required_builds.values(): if build.buildstate == "Successfully built": continue elif build.buildstate == "Cancelled build": continue elif build.buildstate == "Failed to build": num_build_failures += 1 builds_failed_output += self.BUILD_FAILED_FORMAT.format( package_name=build.source_package_name, version=build.source_package_version, arch=build.arch_tag, state=build.buildstate, log_link=build.build_log_url, build_page=build.web_link) else: builds_waiting_output += " - {} ({}) {}: {}\n".format( build.source_package_name, build.source_package_version, build.arch_tag, build.buildstate) if num_builds_waiting <= num_build_failures: print("* Some builds have failed:") print(builds_failed_output) retval.append(PendingReason.BUILD_FAILED) elif builds_waiting_output != '': print("* Still waiting on these builds:") print(builds_waiting_output) retval.append(PendingReason.BUILD_WAITING) if len(pending_publication_builds) != 0: num = len(pending_publication_builds) print(f"* Still waiting on {num} build publications:") for pub in pending_publication_builds.values(): print(" - {}".format(pub.display_name)) retval.append(PendingReason.BUILD_PUB_WAITING) if len(pending_publication_sources) != 0: num = len(pending_publication_sources) print(f"* Still waiting on {num} source publications:") for pub in pending_publication_sources.values(): print(" - {}".format(pub.display_name)) retval.append(PendingReason.SOURCE_PUB_WAITING) if ((list(required_builds.keys()).sort() != list(published_builds.keys()).sort())): print("* Missing some builds") retval.append(PendingReason.BUILD_MISSING) if not retval: print("Successfully published all builds for all architectures") return retval def get_autopkgtest_waiting( self, releases: 'List[str] | None', sources: 'List[str] | None' = None ) -> Iterator[Job]: """Return iterator of queued autopkgtests for this PPA. See get_waiting() for details :param List[str] releases: The Ubuntu series codename(s), or None. :param List[str] sources: Only retrieve results for these source packages, or all if blank or None. :rtype: Iterator[Job] :returns: Currently waiting jobs, if any, or an empty list on error """ response = open_url(f"{URL_AUTOPKGTEST}/queues.json", "waiting autopkgtests") if response: return get_waiting(response, releases=releases, sources=sources, ppa=str(self)) return [] def get_autopkgtest_running( self, releases: 'List[str] | None', sources: 'List[str] | None' = None ) -> Iterator[Job]: """Return iterator of queued autopkgtests for this PPA. See get_running() for details :param List[str] releases: The Ubuntu series codename(s), or None. :param List[str] packages: Only retrieve results for these source packages, or all if blank or None. :rtype: Iterator[Job] :returns: Currently running jobs, if any, or an empty list on error """ response = open_url(f"{URL_AUTOPKGTEST}/static/running.json", "running autopkgtests") if response: return get_running(response, releases=releases, sources=sources, ppa=str(self)) return [] def get_autopkgtest_results( self, releases: 'List[str] | None', architectures: 'List[str] | None', sources: 'List[str] | None' = None ) -> Iterator[dict]: """Returns iterator of results from autopkgtest runs for this PPA. See get_results() for details :param list[str] releases: The Ubuntu series codename(s), or None. :param list[str] architectures: The hardware architectures. :param list[str] sources: Only retrieve results for these source packages, or all if blank or None. :rtype: Iterator[dict] :returns: Autopkgtest results, if any, or an empty list on error """ results = [] for release in releases: base_results_fmt = f"{URL_AUTOPKGTEST}/results/autopkgtest-%s-%s-%s/" base_results_url = base_results_fmt % (release, self.owner_name, self.name) response = open_url(f"{base_results_url}?format=plain") if response: trigger_sets = {} for result in get_results( response=response, base_url=base_results_url, arches=architectures, sources=sources): trigger = ', '.join([str(r) for r in result.get_triggers()]) trigger_sets.setdefault(trigger, []) trigger_sets[trigger].append(result) results.append(trigger_sets) return results def ppa_address_split(ppa_address): """Parse an address for a PPA into its owner and name components. :param str ppa_address: A ppa name or address. :rtype: tuple(str, str) :returns: The owner name and ppa name as a tuple, or (None, None) on error. """ owner_name = None if not ppa_address or len(ppa_address) < 2: return (None, None) if ppa_address.startswith('ppa:'): if '/' not in ppa_address: return (None, None) rem = ppa_address.split('ppa:', 1)[1] owner_name = rem.split('/', 1)[0] ppa_name = rem.split('/', 1)[1] elif ppa_address.startswith('http'): # Only launchpad PPA urls are supported m = re.search( r'https://launchpad\.net/~([^/]+)/\+archive/ubuntu/([^/]+)(?:/*|/\+[a-z]+)$', ppa_address) if not m: return (None, None) owner_name = m.group(1) ppa_name = m.group(2) elif '/' in ppa_address: owner_name = ppa_address.split('/', 1)[0] ppa_name = ppa_address.split('/', 1)[1] else: ppa_name = ppa_address if owner_name is not None: if len(owner_name) < 1: return (None, None) owner_name = owner_name.lower() if (ppa_name and not (any(x.isupper() for x in ppa_name)) and ppa_name.isascii() and '/' not in ppa_name and len(ppa_name) > 1): return (owner_name, ppa_name) return (None, None) def get_das(distro, series_name, arch_name): """Retrieve the arch-series for the given distro. :param distribution distro: The Launchpad distribution object. :param str series_name: The distro's codename for the series. :param str arch_name: The hardware architecture. :rtype: distro_arch_series :returns: A Launchpad distro_arch_series object, or None on error. """ if series_name is None or series_name == '': return None for series in distro.series: if series.name != series_name: continue return series.getDistroArchSeries(archtag=arch_name) return None def get_ppa(lp, config): """Retrieve the specified PPA from Launchpad. :param Lp lp: The Launchpad wrapper object. :param dict config: Configuration param:value map. :rtype: Ppa :returns: Specified PPA as a Ppa object. """ return Ppa( ppa_name=config.get('ppa_name', None), owner_name=config.get('owner_name', None), service=lp) if __name__ == "__main__": import pprint import random import string from .lp import Lp from .ppa_group import PpaGroup pp = pprint.PrettyPrinter(indent=4) print('##########################') print('## Ppa class smoke test ##') print('##########################') print() # pylint: disable-next=invalid-name rndstr = str(''.join(random.choices(string.ascii_lowercase, k=6))) dep_name = f'dependency-ppa-{rndstr}' smoketest_ppa_name = f'test-ppa-{rndstr}' lp = Lp('smoketest', staging=True) ppa_group = PpaGroup(service=lp, name=lp.me.name) dep_ppa = ppa_group.create(dep_name, ppa_description=dep_name) the_ppa = ppa_group.create(smoketest_ppa_name, ppa_description=smoketest_ppa_name) ppa_dependencies = [f'ppa:{lp.me.name}/{dep_name}'] try: the_ppa.set_publish(True) if not the_ppa.exists(): print("Error: PPA does not exist") sys.exit(1) the_ppa.set_description("This is a testing PPA and can be deleted") the_ppa.set_publish(False) the_ppa.set_architectures(["amd64", "arm64"]) the_ppa.set_dependencies(ppa_dependencies) print() print(f"name: {the_ppa.name}") print(f"address: {the_ppa.address}") print(f"str(ppa): {the_ppa}") print(f"reference: {the_ppa.archive.reference}") print(f"self_link: {the_ppa.archive.self_link}") print(f"web_link: {the_ppa.archive.web_link}") print(f"description: {the_ppa.description}") print(f"has_packages: {the_ppa.has_packages()}") print(f"architectures: {'/'.join(the_ppa.architectures)}") print(f"dependencies: {','.join(the_ppa.dependencies)}") print(f"url: {the_ppa.url}") print() except BadRequest as e: print(f"Error: (BadRequest) {str(e.content.decode('utf-8'))}") except Unauthorized as e: print(f"Error: (Unauthorized) {e}") # pylint: disable-next=invalid-name answer = 'x' while answer not in ['y', 'n']: answer = input('Ready to cleanup (i.e. delete) temporary test PPAs? (y/n) ') answer = answer[0].lower() if answer == 'y': print(" Cleaning up temporary test PPAs...") the_ppa.destroy() dep_ppa.destroy() print(" ...Done") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1713571347.0 ppa_dev_tools-0.6.0/ppa/ppa_group.py0000775000175000017500000001066414610603023016542 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """A person or team that owns one or more PPAs in Launchpad.""" from functools import lru_cache from lazr.restfulclient.errors import BadRequest from .ppa import Ppa from .text import o2str class PpaAlreadyExists(BaseException): """Exception indicating a PPA operation could not be performed.""" def __init__(self, ppa_name, message=None): """Initialize the exception object. :param str ppa_name: The name of the pre-existing PPA. :param str message: An error message. """ self.ppa_name = ppa_name self.message = message def __str__(self): """Return a human-readable error message. :rtype str: :return: Error message about the failure. """ if self.message: return self.message elif self.ppa_name: return f"The PPA {self.ppa_name} already exists" class PpaGroup: """Represents a person or team that owns one or more PPAs. This class provides a proxy object for interacting with collections of PPA. """ def __init__(self, service, name): """Initialize a new PpaGroup object for a named person or team. :param launchpadlib.service service: The Launchpad service object. :param str name: Launchpad username for a person or team. """ if not service: raise ValueError("undefined service.") if not name: raise ValueError("undefined name.") self.service = service self.name = name def __repr__(self): """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'service={self.service!r}, name={self.name!r})') def __str__(self): """Return a human-readable summary of the object. :rtype: str :returns: Printable summary of the object. """ return 'tbd' @property @lru_cache def owner(self): """The person or team that owns this collection of PPAs. :rtype: launchpadlib.person :returns: Launchpad person object that owns this PPA. """ return self.service.people[self.name] def create(self, ppa_name='ppa', ppa_description=None, private=False): """Register a new PPA with Launchpad. If a description is not provided a default one will be generated. :param str ppa_name: Name for the PPA to create. :param str ppa_description: Text description of the PPA. :param bool private: Limit access to PPA to only subscribed users and owner. :rtype: Ppa :returns: A Ppa object that describes the created PPA. :raises PpaAlreadyExists: Raised if a PPA by this name already exists in Launchpad. """ ppa_settings = { 'description': ppa_description, 'displayname': ppa_name, 'private': private } try: self.owner.createPPA( name=ppa_name, **ppa_settings ) self.owner.lp_save() except BadRequest as e: if "You already have a PPA" in o2str(e.content): raise PpaAlreadyExists(ppa_name, e.content) else: raise e return Ppa(ppa_name, self.name, ppa_description, service=self.service) @property @lru_cache def ppas(self): """Generator to access the PPAs in this group. :rtype: Iterator[ppa.Ppa] :returns: Each PPA in the group as a ppa.Ppa object. """ for lp_ppa in self.owner.ppas: if '-deletedppa' in lp_ppa.name: continue yield Ppa(lp_ppa.name, self.name, service=self.service) @lru_cache def get(self, ppa_name): """Provide a Ppa for the named ppa. :rtype: ppa.Ppa :returns: A Ppa object describing the named ppa. """ lp_ppa = self.owner.getPPAByName(name=ppa_name) if not lp_ppa: return None return Ppa(lp_ppa.name, self.name, service=self.service) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1712714095.0 ppa_dev_tools-0.6.0/ppa/processes.py0000664000175000017500000000622114605370557016564 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. from time import sleep from subprocess import (Popen, PIPE) from .debug import dbg from .text import o2str class ReturnCode(BaseException): def __init__(self, code, errors=None, output=None): self.code = code self.output = output if type(errors) in (list, tuple): self.errors = errors else: self.errors = [errors] def __str__(self): text = '\n'.join(self.errors) return f"{text}Returned error code {self.code}" def shell(command, in_text=None): """Execute command in a shell, returns stdout, raises exception on error.""" dbg(f"shell: {command}") if in_text: proc = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, stdin=PIPE) output, errors = proc.communicate(input=in_text) else: proc = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) output, errors = proc.communicate() if proc.returncode: raise ReturnCode(proc.returncode, o2str(errors), output=o2str(output)) return o2str(output) def execute(command, in_text=None): """Execute command, returns stdout; prints errors to stderr.""" dbg(f"execute: `{command}`") if in_text is None: proc = Popen(command, shell=False, stdout=PIPE, stderr=PIPE) else: proc = Popen(command, shell=False, stdout=PIPE, stderr=PIPE, stdin=PIPE) dbg(f"execute: polling ({in_text})...") while proc.poll() is None and proc.stdin is not None: dbg("execute: Sending to process stdin") proc.stdin.write(in_text) dbg("execute: sleeping") sleep(0.01) output = proc.stdout.read() if proc.returncode: dbg(f"Received return code {proc.returncode}") raise ReturnCode(proc.returncode, proc.stderr.readlines(), output=output) return o2str(output) def execute_with_input(command, in_text): """Execute command, passing in_text to stdin if provided.""" execute(command, in_text) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/repository.py0000664000175000017500000000676014630542102016766 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Top-level code for analyzing an Ubuntu Apt repository.""" import os.path from functools import lru_cache from typing import Dict from .suite import Suite from .constants import ( LOCAL_REPOSITORY_PATH, LOCAL_REPOSITORY_MIRRORING_DIRECTIONS ) class Repository: """Top-level class for analyzing an Ubuntu Apt repository. This class and its children serves as a wrapper to a local mirror of a Ubuntu Apt repository. Repository provides an entry interface to the Apt data, allowing lazy lookup of the package data in various ways. """ def __init__(self, cache_dir: str): """Initialize a new Repository object for an Apt cache. :param str cache_dir: The path to the top level of the local Apt mirror. """ if not cache_dir: raise ValueError("undefined cache_dir.") if not os.path.isdir(cache_dir): raise FileNotFoundError(f"could not find cache dir '{cache_dir}'") self.cache_dir = cache_dir def __repr__(self): """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'cache_dir={self.cache_dir!r})') @property @lru_cache def suites(self) -> Dict[str, Suite]: """The release pockets available in this repository. :returns: Mapping of Ubuntu release pockets to corresponding Suite objects. :rtype: Dict[str, Suite] """ return { suite_name: Suite(suite_name, os.path.join(self.cache_dir, suite_name)) for suite_name in os.listdir(self.cache_dir) if os.path.isdir(os.path.join(self.cache_dir, suite_name)) } def get_suite(self, series_codename: str, pocket: str) -> Suite: """Retrieve a Suite object by its codename and pocket. The pocket name 'release' is treated as synonymous with '', since Apt stores the release suite without the pocket name. In other words, 'lunar-release' is the same as 'lunar'. :param str series_codename: The Ubuntu release textual name. :param str pocket: The name of the pocket ('proposed', etc.) :returns: Corresponding Suite object. :rtype: Suite """ if pocket == "release": release_pocket = series_codename else: release_pocket = f"{series_codename}-{pocket}" return self.suites.get(release_pocket, None) if __name__ == "__main__": import sys from pprint import PrettyPrinter pp = PrettyPrinter(indent=4) from .debug import error print('#########################') print('## PpaGroup smoke test ##') print('#########################') local_dists_path = os.path.join(LOCAL_REPOSITORY_PATH, "dists") if not os.path.exists(local_dists_path): error(f'Missing checkout for smoketest\n{LOCAL_REPOSITORY_MIRRORING_DIRECTIONS}') sys.exit(1) repository = Repository(cache_dir=local_dists_path) for suite in repository.suites.values(): print(suite) print(f' series: {suite.series_codename}') print(f' components: {", ".join(suite.components)}') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/result.py0000775000175000017500000003026614630542102016066 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """The completed data from an autopkgtest run.""" import re import urllib.request from functools import lru_cache from typing import Dict, List, Iterator import gzip import time from .subtest import Subtest from .trigger import Trigger from .text import ansi_hyperlink class Result: """The completed data from an autopkgtest run Job. This object provides access to the test run's settings and results. """ VALUES = { 'PASS': "āœ…", 'FAIL': "āŒ", 'BAD': "ā›”" } def __init__(self, url, time, series, arch, source): """Initialize a new Result object. :param str url: HTTP path to the test log for this result. :param str time: The execution time of the test run. :param str series: The distro release series codename. :param str arch: The architecture for the result. :param str source: """ self.url = url self.time = time self.series = series self.arch = arch self.source = source self.error_message = None self._log = None def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'url={self.url!r})') def __str__(self) -> str: """Return a human-readable summary of the object. :rtype: str :returns: Printable summary of the object. """ pad = ' ' * (1 + abs(len('ppc64el') - len(self.arch))) return f"{self.source} on {self.series} for {self.arch}{pad}@ {self.timestamp}" @lru_cache def to_bullet_tree(self, show_urls=False): """Returns results in a bulletted list. :param bool show_urls: If true, displays URLs as plain text strings; if False, it generates a clickable ANSI hyperlink for the log. :returns: Human-readable results with logs in bulletted list. :rtype: str """ output = '' if show_urls: log_str = f" • Log: {self.url}" output = f" + {self.status_icon} {self}\n{log_str}" else: log_link = ansi_hyperlink(self.url, "Logļø šŸ—’ļø ") output = f" + {self.status_icon} {self} {log_link}" output += "\n" if self.status != 'PASS': if show_urls: output += f" • Status: {self.status}\n" for subtest in self.get_subtests(): output += f" • {subtest}\n" return output @lru_cache def to_dict(self) -> Dict: """Return a basic dict structure of the Result's data.""" return { 'url': self.url, 'timestamp': self.timestamp, 'series': self.series, 'arch': self.arch, 'source': self.source, 'error_message': self.error_message, 'log': self.log, 'triggers': [tr.to_dict() for tr in self.get_triggers()], 'subtests': [st.to_dict() for st in self.get_subtests()], 'status': self.status, 'status_icon': self.status_icon } @property def timestamp(self) -> str: """The result's completion time formatted as a string.""" return time.strftime("%d.%m.%y %H:%M:%S", self.time) @property @lru_cache def log(self) -> str: """The log contents for results, downloading if necessary. Retrieves the log via the result url, handles decompression, and caches the results internally, so that subsequent calls don't re-download the data. On error, returns None and stores the error message in the Result.error_message property. :rtype: str :returns: Full text of the log file, or None on error. """ request = urllib.request.Request(self.url) request.add_header('Cache-Control', 'max-age=0') try: response = urllib.request.urlopen(request) except urllib.error.HTTPError as e: self.error_message = f"Failed to Download Test Log ⚪: {e}" return None result_gzip = response.read() try: return gzip.decompress(result_gzip).decode("utf-8", errors="replace") except UnicodeDecodeError: self.error_message = "Broken Test Log ⚪" return None # TODO: Merge triggers and get_triggers() @property @lru_cache def triggers(self) -> List[str]: """The package/version parameters used to generate this Result. This returns the set of triggers used to create the Result, as recorded in the test log. Each trigger is a package/version pair corresponding to source packages to use from the proposed archive (instead of from the release archive). :rtype: List[str] :returns: List of package/version triggers. """ regex_triggers = re.compile(r'--env=ADT_TEST_TRIGGERS=(.*?) -- ') header_split = self.log.split(": @@@@@@@@@@@@@@@@@@@@", 1) m = re.search(regex_triggers, header_split[0]) if not m: return [] return m.group(1).strip("'").split() @lru_cache def get_triggers(self, name=None) -> Iterator[Trigger]: """Return list of Triggers that were used to create this Result. This returns the set of Triggers used to create the Result, as recorded in the test log. Each trigger identifies a package/version pair corresponding to source packages to use from the proposed archive (instead of from the release archive). :param str name: If defined, only return triggers starting with this name. :rtype: Iterator[Trigger] :returns: Triggers used to generate this Result, if any, or an empty list """ if not self.triggers: return [] for trigger in self.triggers: package, version = trigger.split('/', 1) yield Trigger(package, version, arch=self.arch, series=self.series) @lru_cache def get_subtests(self, name=None) -> List[Subtest]: """Return list of Subtests that were run for this Result. :param str name: Only display subtests starting with this. :rtype: List[Subtest] :returns: Subtests completed for this Result, or empty list. """ result_split = self.log.split("@@@@@@@@@@@@@@@@@@@@ summary", 1) if len(result_split) < 2: self.error_message = "Failure setting up testbed ⚪" return [Subtest("testbed setup failure BAD")] subtests = [] result_sum = result_split[1] for line in re.findall("(.*PASS|.*SKIP|.*FAIL|.*FLAKY|.*BAD)", result_sum): if re.match(r"^[0-9]+s\s", line): # Newer autopkgtest logs are prefixed with the timestamp. Ignore it. line = line.split(' ', 1)[1] if name and not line.startswith(name): continue subtests.append(Subtest(line)) return subtests @property @lru_cache def status(self) -> str: """The overall status of all subtests. If the triggered run completed successfully, then the status will be either FAIL if any of the subtests failed, or PASS otherwise. If the run did not complete successfully, then a 'BAD' status will be returned, and the reason can be examined via the Result.error_message property. :rtype: str :returns: 'PASS', 'FAIL', or 'BAD' """ if self.error_message: return 'BAD' for subtest in self.get_subtests(): if subtest.status == 'FAIL': return 'FAIL' elif subtest.status == 'BAD': return 'BAD' return 'PASS' @property @lru_cache def status_icon(self) -> str: """A unicode symbol corresponding to test's overall status. :rtype: str :returns: Unicode symbol """ return Result.VALUES[self.status] def get_results(response, base_url, arches=None, sources=None) -> Iterator[Result]: """Return iterator of Results from the base URL for given criteria. Retrieves the autopkgtest results limited to the given architectures and source packages. If unspecified, returns all results. :param str base_url: URL for the autopkgtest results. :param List[str] arches: Architectures to include in results. :param List[str] sources: Source packages to include in results. :rtype: Iterator[Result] :returns: Iterable results, if any, or an empty list on error """ if response is None: return [] for line in response.read().split(b'\n'): if line == b'' or not line.endswith(b"log.gz"): continue result = line.decode("utf-8") series, arch, _, source, timestamp = result.split('/')[:5] if (arches and (arch not in arches)): continue if (sources and (source not in sources)): continue if not base_url.endswith('/') and not result.startswith('/'): base_url += '/' yield Result( url=base_url + result, time=time.strptime(timestamp[:-7], "%Y%m%d_%H%M%S"), series=series, arch=arch, source=source) def show_results(results: List[tuple], show_urls: bool = False): """Prints the results of completed tests. :param List[tuple] results: The test results to be displayed. :param bool show_urls: If true, print textual http links instead of clickable ANSI hyperlinks. """ n = 0 for n, trigger_sets in enumerate(results, start=1): if n == 1: print("* Results:") for trigger, trigger_results in trigger_sets.items(): trigger_result_str = '' for trigger_result in trigger_results: trigger_result_str += trigger_result.to_bullet_tree(show_urls) print(f" - {trigger}\n{trigger_result_str.rstrip()}") if n == 0: print("* Results: (none)") if __name__ == "__main__": import os import json from ppa.io import open_url from ppa.constants import ARCHES_AUTOPKGTEST, URL_AUTOPKGTEST print('#############################') print('## Result class smoke test ##') print('#############################') print() print("Basic result") print("------------") timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result_1 = Result('url-here', timestamp, 'kinetic', 'amd64', 'my-package') print("* Result object:") print(repr(result_1)) print(result_1) print() data_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), "../tests/data")) url = f"file://{data_dir}/results-six-s390x.log.gz" result_2 = Result(url, timestamp, 'kinetic', 'amd64', 'my-package') print("* Log Head:") print("\n".join(result_2.log.splitlines()[0:4])) print() # TODO: Implement something that dumps the passing tests for given package from -proposed # TODO: Filter to items with only Pass, Not a regression, or No test results print("Object Dump") print("-----------") result_3 = Result(url, timestamp, 'kinetic', 'amd64', 'my-package') print(json.dumps(result_3.to_dict(), indent=4)) print() print("Loading live excuses data") print("-------------------------") base_results_fmt = f"{URL_AUTOPKGTEST}/results/autopkgtest-%s-%s-%s/" base_results_url = base_results_fmt % ('mantic', 'bryce', 'apache2-merge-v2.4.54-3') url = f"{base_results_url}?format=plain" response = open_url(url) for result in get_results(response, base_results_url, arches=ARCHES_AUTOPKGTEST): print(f"* {result}") print(" - Triggers: " + ', '.join([str(r) for r in result.get_triggers()])) for subtest in result.get_subtests(): print(f" - {subtest}") print() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/source_package.py0000664000175000017500000002466014630542102017521 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2023 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Interprets and analyzes an Ubuntu Apt record for a source package.""" from functools import lru_cache from typing import Dict from .dict import unpack_to_dict class SourcePackage: """The Apt record for the packaged source of a software codebase. This object is intended to be instantiated from a raw Apt source package record such as extracted from a Sources.xz file by apt_pkg.TagFile(). The SourcePackage class members handle the parsing and interpretation of the data values of the record such as build dependencies. Since objects of this class are constructed as thin wrappers on the Apt record, the available member properties for the object will vary depending on the data elements present in the record. For example, if there isn't a "Testsuite:" field, then this object will not have a 'self.testsuite' property. For member properties needed by users of this class, it's recommended to guarantee their presence either by requiring them from the pkg_dict in the __init__() property, or add a property to the class that checks and substitutes a suitable default if missing. """ # pylint: disable=no-member def __init__(self, pkg_dict: dict): """Initialize a new SourcePackage object for a given package. :param dict[str, str] pkg_dict: Data collection loaded from am Apt record. """ # Auto-create member parameters from the Apt record's data structure for k, val in dict(pkg_dict).items(): setattr(self, k.lower().replace('-', '_'), val) for field in ['package', 'version', 'binary']: if getattr(self, field, None) is None: raise ValueError(f'undefined {field} from Apt record for source package') def __repr__(self): """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'pkg_dict={vars(self)!r})') def __str__(self) -> str: """Return a human-readable textual description of the SourcePackage. :rtype: str :returns: Human-readable string. """ return f"{self.package} ({self.version})" @property def name(self) -> str: """The name of the source package as recorded in the Apt database. :rtype: str :returns: Package name. """ return self.package @property @lru_cache def provides_binaries(self) -> Dict[str, str]: """The binary package names provided by this source package. For consistency, the results are provided as a dict structure, however since the Binary field is a simple comma-separated list, the dict will only have keys, with no defined values. :rtype: dict[str, str] :returns: Collection of binary packages this source provides. """ bins = unpack_to_dict(self.binary) if not bins: raise RuntimeError('Could not parse packages from Binaries line of Apt record.') return bins @property @lru_cache def build_dependencies(self) -> Dict[str, str]: """The binary packages that must be available to build this source package. :rtype: dict[str, BinaryPackages] :returns: Collection of package names to version specification strings. """ if getattr(self, 'build_depends', None) is None: # Missing BuildDepends is uncommon, but can occur for packages # consisting just of config files, for example. return {} deps = unpack_to_dict(self.build_depends, key_sep=' ') if not deps: raise RuntimeError('Could not parse packages from Build-Depends line of Apt record.') return deps if __name__ == "__main__": # pylint: disable=line-too-long, invalid-name import os import apt_pkg from pprint import PrettyPrinter pp = PrettyPrinter(indent=4) root_dir = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..')) tests_data_dir = os.path.join(root_dir, 'tests', 'data') assert os.path.exists(tests_data_dir), f'cannot find {tests_data_dir}' print('####################################') print('## SourcePackage class smoke test ##') print('####################################') print() print('Source Packages') print('---------------') with apt_pkg.TagFile(f'{tests_data_dir}/source/Sources.xz') as pkgs: results = [] for pkg in pkgs: source = SourcePackage(pkg) results.append(str(source)) num_results = len(results) ellipses_shown = False for i, result in enumerate(results): if i < 10 or i >= num_results - 10: print(result) elif not ellipses_shown: print('...') ellipses_shown = True print() print() print('Details for "dovecot"') print('---------------------') package_data = { 'Package': 'dovecot', 'Format': '3.0 (quilt)', 'Binary': 'dovecot-core, dovecot-dev, dovecot-imapd, dovecot-pop3d, dovecot-lmtpd, dovecot-managesieved, dovecot-pgsql, dovecot-mysql, dovecot-sqlite, dovecot-ldap, dovecot-gssapi, dovecot-sieve, dovecot-solr, dovecot-lucene, dovecot-submissiond, dovecot-auth-lua', # noqa: E501 'Architecture': 'any', 'Version': '1:2.3.19.1+dfsg1-2ubuntu4', 'Priority': 'optional', 'Section': 'mail', 'Maintainer': 'Ubuntu Developers ', 'Original-Maintainer': 'Dovecot Maintainers ', 'Uploaders': 'Jaldhar H. Vyas , Jelmer Vernooij , Apollon Oikonomopoulos , Noah Meyerhans ', # noqa: E501 'Standards-Version': '4.6.1', 'Build-Depends': 'debhelper-compat (= 13), default-libmysqlclient-dev, krb5-multidev, libapparmor-dev [linux-any], libbz2-dev, libcap-dev [linux-any], libclucene-dev, libdb-dev, libexpat-dev, libexttextcat-dev, libicu-dev, libldap2-dev, liblua5.3-dev, liblz4-dev, liblzma-dev, libpam0g-dev, libpq-dev, libsasl2-dev, libsodium-dev, libsqlite3-dev, libssl-dev, libstemmer-dev, libsystemd-dev [linux-any], libunwind-dev [amd64 arm64 armel armhf hppa i386 ia64 mips mips64 mips64el mipsel powerpc powerpcspe ppc64 ppc64el sh4], libwrap0-dev, libzstd-dev, lsb-release, pkg-config, zlib1g-dev', # noqa: E501 'Testsuite': 'autopkgtest', 'Homepage': 'https://dovecot.org/', 'Vcs-Browser': 'https://salsa.debian.org/debian/dovecot', 'Vcs-Git': 'https://salsa.debian.org/debian/dovecot.git', 'Directory': 'pool/main/d/dovecot', 'Package-List': """ dovecot-auth-lua deb mail optional arch=any dovecot-core deb mail optional arch=any dovecot-dev deb mail optional arch=any dovecot-gssapi deb mail optional arch=any dovecot-imapd deb mail optional arch=any dovecot-ldap deb mail optional arch=any dovecot-lmtpd deb mail optional arch=any dovecot-lucene deb mail optional arch=any dovecot-managesieved deb mail optional arch=any dovecot-mysql deb mail optional arch=any dovecot-pgsql deb mail optional arch=any dovecot-pop3d deb mail optional arch=any dovecot-sieve deb mail optional arch=any dovecot-solr deb mail optional arch=any dovecot-sqlite deb mail optional arch=any dovecot-submissiond deb mail optional arch=any """, # noqa: E501 'Files': """ 146ac1a3b2a90d96b7fe8c458a561ae2 3977 dovecot_2.3.19.1+dfsg1-2ubuntu4.dsc f8c84c45b05352d55c3dbd509389cc25 1636590 dovecot_2.3.19.1+dfsg1.orig-pigeonhole.tar.gz c334e8ef30546af8a668437f046f3f15 7790851 dovecot_2.3.19.1+dfsg1.orig.tar.gz c3e7d443a8f4854897d338a56f85c936 67620 dovecot_2.3.19.1+dfsg1-2ubuntu4.debian.tar.xz """, # noqa: E501 'Checksums-Sha1': """ 481053992c60990f765e0f671e6fc08e910a50b7 3977 dovecot_2.3.19.1+dfsg1-2ubuntu4.dsc cdf68b407f1237e92987c6353c9596f3458e2126 1636590 dovecot_2.3.19.1+dfsg1.orig-pigeonhole.tar.gz a35f87db78847ba469d9b0e3b72f15f8c5d1d9b0 7790851 dovecot_2.3.19.1+dfsg1.orig.tar.gz b50aac6b2aac52744e7ef459030bfefd15cedc71 67620 dovecot_2.3.19.1+dfsg1-2ubuntu4.debian.tar.xz """, # noqa: E501 'Checksums-Sha256': """ 560f603209443dc92f5941dc1a5b737e3a743defc45d56a1a48df3846deed0f8 3977 dovecot_2.3.19.1+dfsg1-2ubuntu4.dsc 9bc08c0eeefd75452033e022936968ff0ddad037672effdffc4a7c8dd360b8e0 1636590 dovecot_2.3.19.1+dfsg1.orig-pigeonhole.tar.gz db5abcd87d7309659ea6b45b2cb6ee9c5f97486b2b719a5dd05a759e1f6a5c51 7790851 dovecot_2.3.19.1+dfsg1.orig.tar.gz 7477feb66c8b8b4bab6fa4aadaab8675d308d575e5af662769e179a4fd6e289f 67620 dovecot_2.3.19.1+dfsg1-2ubuntu4.debian.tar.xz """, # noqa: E501 'Checksums-Sha512': """ 26ab2a3b3a29ee0734ffccbad826b68b8b290715b0dbebdc07e87bac66c5be07cb0bc303c8795fb9dab8c90c9802887ac7c2ddff4b4d789bbc61080a47379e1b 3977 dovecot_2.3.19.1+dfsg1-2ubuntu4.dsc a3d1ebab2896954d159af11df3de3993493ae304343fa41d7f408427f8bd19b3061a09017cfe2b62145b4aacaed87b1d9718418b3c73ae9ea700865844e5af39 1636590 dovecot_2.3.19.1+dfsg1.orig-pigeonhole.tar.gz ceb87a5f76b6352d28fd030aae5ad2165a133e9a8a6309891e793911203fc0ada9fb254dc05d183eaaa7e2b9851d3f1755b33f08fa6ff5b4b415ac4272bfe150 7790851 dovecot_2.3.19.1+dfsg1.orig.tar.gz 2e5f62cb3d9685b57f76dbdf81edd2de6df7063ce96d39e75241ee63ab522acd7c7be932ed5d6ed898e5d6e179dd7e226e011226fd3b4271af562af8fe56ec89 67620 dovecot_2.3.19.1+dfsg1-2ubuntu4.debian.tar.xz """, # noqa: E501 'Testsuite-Triggers': 'lsb-release, python3, systemd-sysv', } source = SourcePackage(package_data) print('* Object:') pp.pprint(vars(source)) print() print('* Provides Binaries:') for pkg in sorted(source.provides_binaries.keys()): print(f' - {pkg}') print() print('* Build Dependencies:') for pkg, ver in sorted(source.build_dependencies.items()): print(f' - {pkg}: {ver}') ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1716327749.0 ppa_dev_tools-0.6.0/ppa/subtest.py0000775000175000017500000000716614623212505016247 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """An individual DEP8 test run.""" import json from functools import lru_cache class Subtest: """An autopkgtest sub-component test run. A triggered autopkgtest can invoke multiple DEP8 tests, such as running checks on dependencies, the software's testsuite, and integration tests. Each of these is considered a "Subtest" """ VALUES = { 'PASS': "🟩", 'SKIP': "🟧", 'FAIL': "🟄", 'FLAKY': "🟫", 'BAD': "ā›”", 'UNKNOWN': "⚪" } def __init__(self, line): """Initialize a new Subtext object. :param str line: The subtest result summary from a test log. """ if not line: raise ValueError("undefined line.") self._line = line def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'line={self._line!r})') def __str__(self) -> str: """Return a human-readable summary of the object. :rtype: str :returns: Printable summary of the object. """ return f"{self.desc:25} {self.status:6} {self.status_icon}" @lru_cache def to_dict(self) -> dict: """Return a basic dict structure of the Subtest's data.""" return { 'line': self._line, 'desc': self.desc, 'status': self.status, 'status_icon': self.status_icon } @property @lru_cache def desc(self) -> str: """The descriptive text for the given subtest. :rtype: str :returns: Descriptive text. """ return next(iter(self._line.split()), '') @property @lru_cache def status(self) -> str: """The success or failure of the given subtest. :rtype: str :returns: Status term in capitalized letters (PASS, FAIL, etc.) """ for k in Subtest.VALUES: if f" {k}" in self._line: return k return 'UNKNOWN' @property @lru_cache def status_icon(self) -> str: """A unicode symbol corresponding to subtest's status. :rtype: str :returns: Single unicode character matching the status. """ return Subtest.VALUES[self.status] if __name__ == "__main__": print('##############################') print('## Subtest class smoke test ##') print('##############################') print() print("Valid cases") print("-----------") print(Subtest('subtest-a UNKNOWN')) print(Subtest('subtest-b PASS')) print(Subtest('subtest-c FAIL')) print(Subtest('subtest-d FAIL non-zero exit status 123')) print(Subtest('subtest-e SKIP')) print(Subtest('subtest-f BAD')) print(Subtest('librust-clang-sys-dev:clang_10_0 FAIL non-zero exit status 101')) print(Subtest('librust-clang-sys-dev:static FLAKY non-zero exit status 101')) print() print("Invalid cases") print("-------------") print(Subtest('invalid subtest: invalid')) print(Subtest('bAd subtest: bAd')) print() print("Object Dump") print("-----------") s = Subtest('librust-clang-sys-dev:clang_10_0 FAIL non-zero exit status 101') print(json.dumps(s.to_dict(), indent=4)) print() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/suite.py0000664000175000017500000002722614630542102015700 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """Interprets and analyzes an Ubuntu Apt suite (aka release-pocket).""" import os.path from functools import lru_cache from typing import Dict, List # pylint: disable = no-name-in-module import apt_pkg from .source_package import SourcePackage from .binary_package import BinaryPackage from .constants import ( DISTRO_UBUNTU_COMPONENTS, DISTRO_UBUNTU_POCKETS, LOCAL_REPOSITORY_PATH, LOCAL_REPOSITORY_MIRRORING_DIRECTIONS ) class Suite: """A pocket of a Ubuntu series collecting source and binary package releases. Suites are named "-", such as "focal-updates" or "jammy-proposed". The same package can have different versions in each Suite, but within a Suite each package will have no more than one version available at a time. """ def __init__(self, suite_name: str, cache_dir: str): """Initialize a new Suite object for a given release pocket. :param str series_codename: The textual name of the Ubuntu release. :param str pocket: The pocket name ('release', 'proposed', 'backports', etc.) :param str cache_dir: The path to the given suite in the local Apt mirror. """ if not suite_name: raise ValueError('undefined suite_name.') if not cache_dir: raise ValueError('undefined cache_dir.') if not os.path.exists(cache_dir): raise FileNotFoundError(f"could not find cache dir '{cache_dir}'") self._suite_name = suite_name self._cache_dir = cache_dir self._provides_table = None self._rdepends_table = None def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return ( f'{self.__class__.__name__}(' f'suite_name={self._suite_name!r}, ' f'cache_dir={self._cache_dir!r})' ) def __str__(self) -> str: """Return a human-readable textual description of the Suite. :rtype: str :returns: Human-readable string. """ return f'{self._suite_name}' def _rebuild_lookup_tables(self) -> bool: """Regenerate the provides and rdepends lookup tables. Some packages have build dependence that can be satisfied by one of several packages. For example, a package may require either awk or mawk to build. In these cases, the package will be registered in the table as an rdepend for BOTH awk and mawk. :rtype: bool :returns: True if tables were rebuilt, False otherwise""" self._provides_table = {} self._rdepends_table = {} for source_name, source in self.sources.items(): for build_dep_binary_names in source.build_dependencies.keys(): # This needs to deal with two different kinds of keys. # Basic dependencies are just simple str's, while alternate # dependencies are modeled as tuples. # # So, convert simple str's into single-element lists, so # both cases can be handled via iteration in a for loop. if isinstance(build_dep_binary_names, str): build_dep_binary_names = [build_dep_binary_names] for build_dep_binary_name in build_dep_binary_names: self._rdepends_table.setdefault(build_dep_binary_name, []) self._rdepends_table[build_dep_binary_name].append(source) for provided_binary_name in source.provides_binaries.keys(): self._provides_table[provided_binary_name] = source return self._provides_table and self._rdepends_table @property @lru_cache def info(self) -> Dict[str, str]: """The parsed Apt Release file for the suite as a dict. :rtype: dict[str, str] """ info = None with apt_pkg.TagFile(f'{self._cache_dir}/Release') as tagfile: info = next(tagfile) if not info: raise ValueError(f'Could not load {self._cache_dir}/Release') return info @property def name(self) -> str: """The name of the suite as recorded in the apt database. :rtype: str """ suite_name = self.info.get('Suite') if not suite_name: raise ValueError('Could not get suite name from info dict.') return suite_name @property def series_codename(self) -> str: """The textual name of the Ubuntu release for this suite. :rtype: str """ return self.name.split('-')[0] @property def pocket(self) -> str: """The category of the archive (release, proposed, security, et al). :rtype: str """ if '-' not in self.name: return 'release' pocket = self.name.split('-')[1] if pocket not in DISTRO_UBUNTU_POCKETS: raise RuntimeError(f'Unrecognized pocket "{pocket}"') return pocket @property def architectures(self) -> List[str]: """The list of CPU hardware types supported by this suite. :rtype: list[str] """ architectures = self.info.get('Architectures').split() if not architectures: raise RuntimeError('Could not load architectures from info') return architectures @property def components(self) -> List[str]: """The sections of the archive provided in this suite. Components may include main, universe, etc. :rtype: list[str] """ components = [ component for component in os.listdir(self._cache_dir) if os.path.isdir(os.path.join(self._cache_dir, component)) and component in DISTRO_UBUNTU_COMPONENTS ] if not components: raise RuntimeError(f'Could not load components from {self._cache_dir}') return components @property @lru_cache def sources(self) -> Dict[str, SourcePackage]: """The collection of source packages included in this suite. All source packages in all components are returned as SourcePackage objects. :rtype: dict[str, SourcePackage] """ sources = None for sources_file in ['Sources.xz', 'Sources.gz']: for comp in self.components: source_packages_dir = f'{self._cache_dir}/{comp}/source' try: with apt_pkg.TagFile(f'{source_packages_dir}/{sources_file}') as pkgs: if sources is None: sources = {} for pkg in pkgs: name = pkg['Package'] sources[name] = SourcePackage(dict(pkg)) except apt_pkg.Error: pass if sources is not None: return sources raise RuntimeError(f'Could not load {source_packages_dir}/Sources.[xz|gz]') @property @lru_cache def binaries(self) -> Dict[str, BinaryPackage]: """The collection of binary Deb packages included in this suite. All binary packages in all components are returned as BinaryPackage objects. :rtype: dict[str, BinaryPackage] """ binaries = None for packages_file in ["Packages.xz", "Packages.gz"]: for comp in self.components: for arch in self.architectures: binary_packages_dir = f'{self._cache_dir}/{comp}/binary-{arch}' try: with apt_pkg.TagFile(f'{binary_packages_dir}/{packages_file}') as pkgs: if binaries is None: binaries = {} for pkg in pkgs: name = f'{pkg["Package"]}:{arch}' binaries[name] = BinaryPackage(pkg) except apt_pkg.Error: pass if binaries is not None: return binaries raise ValueError(f'Could not load {binary_packages_dir}/Packages.[xz|gz]') def dependent_packages(self, source_package: SourcePackage) -> Dict[str, SourcePackage]: """Return relevant packages to run autotests against for a given source package. Calculates the collection of reverse dependencies for a given source package that would be appropriate to re-run autopkgtests on, using the given @param source_package's name as a trigger. For leaf packages (that nothing else depends on as a build requirement), this routine returns an empty dict. For packages that can serve as an alternative dependency of some packages, this will include all such packages as if they were hard dependencies. For example, when examining postgresql-12, this would include all packages dependent on any database. :param str source_package_name: The archive name of the source package. :rtype: dict[str, SourcePackage] :returns: Collection of source packages, keyed by name. """ # Build the lookup table for provides and rdepends if not self._rdepends_table: if not self._rebuild_lookup_tables(): raise RuntimeError("Could not regenerate provides/rdepends lookup tables") dependencies = {} # Get source packages that depend on things we supply for binary_package_name in source_package.provides_binaries.keys(): rdeps = self._rdepends_table.get(binary_package_name) if rdeps: for rdep_source in rdeps: dependencies[rdep_source.name] = rdep_source return dependencies if __name__ == '__main__': # pylint: disable=invalid-name import sys from pprint import PrettyPrinter pp = PrettyPrinter(indent=4) from .repository import Repository from .debug import error print('############################') print('## Suite class smoke test ##') print('############################') print() local_dists_path = os.path.join(LOCAL_REPOSITORY_PATH, 'dists') if not os.path.exists(local_dists_path): error(f'Missing checkout for suite smoketest\n{LOCAL_REPOSITORY_MIRRORING_DIRECTIONS}') sys.exit(1) repository = Repository(cache_dir=local_dists_path) for suite in repository.suites.values(): print(suite) print(f' series: {suite.series_codename}') print(f' pocket: {suite.pocket}') print(f' components: {", ".join(suite.components)}') print(f' architectures: {", ".join(suite.architectures)}') num_sources = len(suite.sources) ellipses_shown = False print(f' sources: ({num_sources} items)') for i, suite_source in enumerate(suite.sources): if i < 3 or i >= num_sources - 3: print(f' {i} {suite_source}') elif not ellipses_shown: print(' [...]') ellipses_shown = True num_binaries = len(suite.binaries) ellipses_shown = False print(f' binaries: ({num_binaries} items)') for i, binary in enumerate(suite.binaries): if i < 3 or i >= num_binaries - 3: print(f' {i} {binary}') elif not ellipses_shown: print(' [...]') ellipses_shown = True ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1693008778.0 ppa_dev_tools-0.6.0/ppa/text.py0000664000175000017500000001070314472241612015531 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2011-2012 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. '''Routines to encode or convert to and from text.''' import sys from decimal import Decimal from functools import lru_cache # Constants for ANSI codes OSC8 = "\u001b]8" ST = "\u001b\\" @lru_cache def quote(msg): """Similar to urllib.quote but for glibs' GMarkup. @param msg: string to quote @returns: quoted string """ msg = msg.replace('&', '&') msg = msg.replace('<', '<') msg = msg.replace('>', '>') return msg @lru_cache def o2str(obj): """Return string representation of various types of objects. Convert a unicode, decimal.Decimal, datetime object, etc. to a str. Converts lists and tuples of objects into lists of strings. """ if type(obj) == str: return obj elif type(obj) == bytes: return obj.decode("utf-8") elif type(obj) == Decimal: return str(obj) elif type(obj) == list or type(obj) is tuple: new_list = [] for item in obj: new_list.append(o2str(item)) return new_list elif str(type(obj)) == "": return obj.ctime() else: # print str(type(obj)) return obj @lru_cache def to_bool(value): """Convert 'something' to boolean. Raises exception for invalid formats. Possible True values: 1, True, '1', 'TRue', 'yes', 'y', 't' Possible False values: 0, False, None, [], {}, '', '0', 'faLse', 'no', 'n', 'f', 0.0 """ if isinstance(value, str): if value.lower() in ("yes", "y", "true", "t", "1"): return True if value.lower() in ("no", "n", "false", "f", "0", "none", ""): return False raise Exception('Invalid value for boolean conversion: ' + value) return bool(value) @lru_cache def o2float(value): '''Convert strings like 42%, 123M, 1.2B into floating point numbers. Returned values are in millions, so '1.2B' returns 1200 ''' if value is None: return 0.0 elif type(value) is float: return value elif type(value) is int: return float(value) elif value == '--': return 0.0 value = value.replace(',', '') last = value[len(value) - 1] if last == 'M': return float(value[:-1]) elif last == 'B': return float(value[:-1]) * 1000 elif last == '%': return float(value[:-1]) / 100.0 elif last == ')' and value[0] == '(': return -1 * o2float(value[1:-1]) try: return float(value) except ValueError: sys.stderr.write(f"ofloat: Could not convert '{value}' to float\n") raise def ansi_hyperlink(url, text): """Format text into a hyperlink using ANSI escape codes. :ref: https://iterm2.com/documentation-escape-codes.html :ref: https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda :param str url: The linked action to load in a web browser. :param str text: The visible text to show. :rtype: str :returns: ANSI escape code sequence to display the hyperlink. """ return f"{OSC8};;{url}{ST}{text}{OSC8};;{ST}" if __name__ == "__main__": print('#####################') print('## Text smoke test ##') print('#####################') print() print(ansi_hyperlink("https://launchpad.net/ppa-dev-tools", "ppa-dev-tools")) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/ppa/trigger.py0000775000175000017500000001721214630542102016207 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2022 Authors # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Authors: # Bryce Harrington """A directive to run a DEP8 test against a source package.""" from functools import lru_cache from urllib.parse import urlencode from typing import List from .constants import URL_AUTOPKGTEST from ppa.text import ansi_hyperlink class Trigger: """A source package and version to use when running an autopkgtest. A trigger indicates a source package whose autopkgtest(s) to invoke, after installing a particular version of that package, and possibly other source packages, from a given series. A Job can have multiple Triggers, each against a different source package and/or architectures, but all such Triggers must be against the same series as the Job itself. """ def __init__(self, package, version, arch, series, ppa=None, test_package=None): """Initialize a new Trigger for a given package and version. :param str package: The source package name. :param str version: The version of the source package to install. :param str arch: The architecture for the trigger. :param str series: The distro release series codename. :param Ppa ppa: (Optional) PPA wrapper object to run tests against. :param str test_package: The package to run autopkgtests from. """ self.package = package self.version = version self.arch = arch self.series = series self.ppa = ppa if test_package: self.test_package = test_package else: self.test_package = package def __repr__(self) -> str: """Return a machine-parsable unique representation of object. :rtype: str :returns: Official string representation of the object. """ return (f'{self.__class__.__name__}(' f'package={self.package!r}, version={self.version!r}, ' f'arch={self.arch!r}, series={self.series!r}, ppa={self.ppa!r}, ' f'test_package={self.test_package!r})') def __str__(self) -> str: """Return a human-readable summary of the object. :rtype: str :returns: Printable summary of the object. """ if self.test_package != self.package: return f"({self.test_package}) {self.package}/{self.version}" return f"{self.package}/{self.version}" @lru_cache def to_dict(self) -> dict: """Return a basic dict structure of the Trigger's data.""" return { 'package': self.package, 'version': self.version, 'test_package': self.test_package, 'arch': self.arch, 'series': self.series, 'ppa': self.ppa } @property @lru_cache def history_url(self) -> str: """Renders the trigger as a URL to the job history. :rtype: str :returns: Job history URL """ if self.package.startswith('lib'): prefix = self.package[0:4] else: prefix = self.package[0] pkg_str = f"{prefix}/{self.package}" return f"{URL_AUTOPKGTEST}/packages/{pkg_str}/{self.series}/{self.arch}" @property @lru_cache def action_url(self) -> str: """Renders the trigger as a URL to start running the test. :rtype: str :returns: Trigger action URL """ params = [ ("release", self.series), ("package", self.test_package), ("arch", self.arch), ] # Trigger for the source package itself params.append(("trigger", f"{self.package}/{self.version}")) # TODO: Additional triggers... # The PPA, if one is defined for this trigger if self.ppa: params.append(("ppa", self.ppa)) return f"{URL_AUTOPKGTEST}/request.cgi?" + urlencode(params) def get_triggers(package, version, ppa, series, architectures, sources=None) -> List[Trigger]: """Returns Triggers for the given criteria. :param str package: The source package name. :param str version: The version of the source package to install. :param Ppa ppa: Ppa wrapper object to run tests against. :param str series: The distro release series codename. :param list[str] architectures: The architectures to provide triggers for. :param list[str] sources: (Unimplemented) :rtype: list[Trigger] :returns: List of triggers, if any, or an empty list on error. """ return [ Trigger(package, version, arch, series, ppa, sources) for arch in architectures ] def show_triggers(package, version, triggers, status, show_trigger_urls=False, show_trigger_names=False): """Prints the triggers for a given package. :param str package: The source package's name. :param str version: The source package's version. :param list[Trigger] triggers: The triggers to be displayed. :param str status: Result of the triggered test run. :param bool show_trigger_urls: If true, print out the trigger URLs as text; otherwise triggers will be printed as a hyperlink named 'package/version'. This is necessary for terminals lacking ANSI hyperlink support, for example. :param bool show_trigger_names: If true, includes display of the package names for triggers. This may be useful if printing complex triggers or triggers for multiple different packages. """ url = f"https://launchpad.net/ubuntu/+source/{package}/{version}" source_hyperlink = ansi_hyperlink(url, f"{package}/{version}") print(f" - Source {source_hyperlink}: {status}") if show_trigger_urls: for trigger in triggers: title = '' if show_trigger_names: title = trigger.test_package print(f" + {title}@{trigger.arch}: {trigger.action_url}ā™»ļø ") for trigger in triggers: title = '' if show_trigger_names: title = trigger.test_package url = trigger.action_url + "&all-proposed=1" print(f" + {title}@{trigger.arch}: {url}šŸ’") else: for trigger in triggers: pad = ' ' * (1 + abs(len('ppc64el') - len(trigger.arch))) title = '' if show_trigger_names: title = trigger.test_package basic_trig = ansi_hyperlink( trigger.action_url, f"Trigger basic {title}@{trigger.arch}ā™»ļø " ) all_proposed_trig = ansi_hyperlink( trigger.action_url + "&all-proposed=1", f"Trigger all-proposed {title}@{trigger.arch}šŸ’" ) print(" + " + pad.join([basic_trig, all_proposed_trig])) if __name__ == "__main__": import json print('##############################') print('## Trigger class smoke test ##') print('##############################') print() print("Basic trigger") print("-------------") trigger = Trigger('my-package', '1.2.3', 'amd64', 'kinetic') print(trigger) print(trigger.history_url) print(trigger.action_url) print() print("Object Dump") print("-----------") t = Trigger('my-package', '1.2.3', 'amd64', 'kinetic') print(json.dumps(t.to_dict(), indent=4)) print() print("* PPA trigger:") trigger = Trigger('my-ppa-package', '1.2.3', 'amd64', 'kinetic', 'my-ppa') print(trigger) print(trigger.history_url) print(trigger.action_url) print() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3321643 ppa_dev_tools-0.6.0/ppa_dev_tools.egg-info/0000775000175000017500000000000014630542117017742 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748815.0 ppa_dev_tools-0.6.0/ppa_dev_tools.egg-info/PKG-INFO0000644000175000017500000006035014630542117021041 0ustar00brycebryceMetadata-Version: 2.1 Name: ppa-dev-tools Version: 0.6.0 Summary: command line client for managing PPAs in Launchpad Author-email: Bryce Harrington License: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively 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 program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, 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. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. Project-URL: Homepage, https://launchpad.net/ppa-dev-tools Project-URL: Bug Tracker, https://bugs.launchpad.net/ppa-dev-tools Keywords: ppa,archive,ubuntu,debian Classifier: Development Status :: 3 - Alpha Classifier: Intended Audience :: Information Technology Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: System :: Archiving :: Packaging Classifier: Topic :: System :: Software Distribution Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+) Classifier: Programming Language :: Python :: 3 Requires-Python: >=3 Description-Content-Type: text/markdown License-File: LICENSE.GPLv2+ Ppa Dev Tools ============= ppa is a command line client for managing PPAs in Launchpad. This primarily focuses on functionality needed by owners of PPAs, to assist in their creation, deletion, and configuration. A key functionality is to poll and wait until the package(s) in the PPA have completed building; this permits blocking on the builds to delay other actions such as requesting users on a bug report to test the PPA, or submitting a merge proposal for the update to be considered for inclusion in the distro. You can view a team's registered PPAs using 'ppa list'. Usage ----- Register a new PPA ``` $ ppa create my-ppa PPA 'my-ppa' created for the following architectures: i386, amd64, armel, armhf, ppc64el, s390x, arm64, powerpc The PPA can be viewed at: https://launchpad.net/~my-name/+archive/ubuntu/my-ppa You can upload packages to this PPA using: dput ppa:my-name/my-ppa ``` Upload a package to the PPA ``` $ dput ppa:my-name/my-ppa some-package.changes ``` Wait until all packages in the PPA have finished building ``` $ ppa wait ppa:my-name/my-ppa ``` Set the public description for a PPA from a file ``` $ cat some-package/README | ppa desc ppa:my-name/my-ppa ``` Trigger autopkgtests for the package, and check results ``` $ ppa tests ppa:my-name/my-ppa ``` Delete the PPA ``` $ ppa destroy ppa:my-name/my-ppa ``` Auto-linked Autopkgtest Trigger URLS ------------------------------------ By default, `ppa tests` will display autopkgtest triggers as hyperlinked text. The hyperlinking feature is supported on many newer terminal programs but as it's a relatively recent VTE function it may not yet be available in the terminal you use. The following terminal programs are believed to support it: - iTerm2 3.1 - DomTerm 1.0.2 - hTerm 1.76 - Terminology 1.3? - Gnome Terminal 3.26 (VTE 0.50) - Guake 3.2.1 (VTE 0.50) - TOXTerm 3.5.1 (VTE 0.50) - Tilix 3.26 (VTE 0.50) - Terminator 2.0 This is not a comprehensive list, and likely will lengthen swiftly. Meanwhile, if you have a non-supporting browser, the --show-urls option can be passed to `ppa tests` to make it display the raw URLs that can be manually cut and pasted into your web browser. Autopkgtesting Reverse-dependencies ----------------------------------- In addition to creating trigger URLs for running your package's autopkgtest, it is also possible to do the same for everything dependent on your package. These other packages are termed 'reverse dependencies', aka 'rdepends'. To generate these URLs, just include the '--show-rdepends' option in your command line. For example: ``` $ ppa tests --show-rdepends ppa:my-name/my-ppa ``` The `ppa` command calculates the dependency trees using information from the Apt archive, which needs to be cached locally. Only the index information is needed, not a complete mirror. You can generate (and refresh) a dists-only mirror thusly: $ mkdir {LOCAL_REPOSITORY_PATH} $ rsync -va \\ --exclude={{'*/installer*','*/i18n/*','*/uefi/*','*/Contents*','*/by-hash/*','*tar.gz'}} \\ rsync://archive.ubuntu.com/ubuntu/dists {LOCAL_REPOSITORY_PATH} It's recommended to run the rsync command as a cronjob to keep your repository up to date as often as desired. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748815.0 ppa_dev_tools-0.6.0/ppa_dev_tools.egg-info/SOURCES.txt0000664000175000017500000000256014630542117021631 0ustar00brycebryce.flake8 .gitignore .pylintrc AUTHORS.md INSTALL.md LICENSE.GPLv2+ MANIFEST.in NEWS.md README README.md RELEASING.md TESTING.md pyproject.toml setup.cfg ppa/__init__.py ppa/_version.py ppa/binary_package.py ppa/constants.py ppa/debug.py ppa/dict.py ppa/io.py ppa/job.py ppa/lp.py ppa/ppa.py ppa/ppa_group.py ppa/processes.py ppa/repository.py ppa/result.py ppa/source_package.py ppa/subtest.py ppa/suite.py ppa/text.py ppa/trigger.py ppa_dev_tools.egg-info/PKG-INFO ppa_dev_tools.egg-info/SOURCES.txt ppa_dev_tools.egg-info/dependency_links.txt ppa_dev_tools.egg-info/top_level.txt scripts/ppa tests/helpers.py tests/test_binary_package.py tests/test_dict.py tests/test_io.py tests/test_job.py tests/test_lp.py tests/test_ppa.py tests/test_ppa_group.py tests/test_repository.py tests/test_result.py tests/test_scripts_ppa.py tests/test_source_package.py tests/test_subtest.py tests/test_suite.py tests/test_text.py tests/test_trigger.py tests/test_version.py tests/data/queues-20220822.json tests/data/results-chrony-armhf.log.gz tests/data/results-rabbitmq-server-armhf.log.gz tests/data/results-six-s390x.log.gz tests/data/running-20220822.json tests/data/binary-amd64/Packages tests/data/binary-amd64/Packages.gz tests/data/binary-amd64/Packages.xz tests/data/binary-amd64/Release tests/data/source/Release tests/data/source/Sources tests/data/source/Sources.gz tests/data/source/Sources.xz././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748815.0 ppa_dev_tools-0.6.0/ppa_dev_tools.egg-info/dependency_links.txt0000664000175000017500000000000114630542117024010 0ustar00brycebryce ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748815.0 ppa_dev_tools-0.6.0/ppa_dev_tools.egg-info/top_level.txt0000664000175000017500000000000414630542117022466 0ustar00brycebryceppa ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717733542.0 ppa_dev_tools-0.6.0/pyproject.toml0000664000175000017500000000243114630504246016327 0ustar00brycebryce[build-system] requires = ["setuptools >= 40.6.0", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools] script-files = ["scripts/ppa"] [tool.setuptools.packages.find] where = ["."] include = ["ppa"] exclude = ["snap", "debian"] [tool.towncrier] filename = "CHANGELOG.md" package = "ppa-dev-tools" directory = "changes" issue_format = "" title_format = "ppa-dev-tools {version} ({project_date})" [project] name = "ppa-dev-tools" version = "0.6.0" requires-python = '>=3' description = "command line client for managing PPAs in Launchpad" readme = "README.md" authors = [{ name= "Bryce Harrington", email = "bryce@canonical.com" }] license = { file = "LICENSE.GPLv2+" } keywords = [ 'ppa', 'archive', 'ubuntu', 'debian' ] classifiers = [ # See https://pypi.org/pypi?%3Aaction=list_classifiers 'Development Status :: 3 - Alpha', 'Intended Audience :: Information Technology', 'Topic :: Software Development :: Build Tools', 'Topic :: System :: Archiving :: Packaging', 'Topic :: System :: Software Distribution', 'License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)', 'Programming Language :: Python :: 3', ] [project.urls] "Homepage" = "https://launchpad.net/ppa-dev-tools" "Bug Tracker" = "https://bugs.launchpad.net/ppa-dev-tools" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3281643 ppa_dev_tools-0.6.0/scripts/0000775000175000017500000000000014630542117015101 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/scripts/ppa0000775000175000017500000011574114630542102015612 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Author: Bryce Harrington '''PPA developer tools''' __example__ = ''' Register a new PPA: $ ppa create my-ppa Wait until all packages in the PPA have finished building: $ ppa wait my-ppa Delete the PPA: $ ppa destroy my-ppa Set the public description for a PPA from a file: $ cat some-package/README | ppa desc ppa:my-name/my-ppa ''' import os import sys import time import argparse import datetime from inspect import currentframe from textwrap import indent from typing import Any, Dict from distro_info import UbuntuDistroInfo from lazr.restfulclient.errors import BadRequest, Unauthorized try: from ruamel import yaml except ImportError: import yaml if '__file__' in globals(): sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa._version import __version__ from ppa.constants import ( ARCHES_PPA_ALL, ARCHES_PPA_DEFAULT, ARCHES_AUTOPKGTEST, CREDENTIALS_FILENAME_DEFAULT, LOCAL_REPOSITORY_PATH, LOCAL_REPOSITORY_MIRRORING_DIRECTIONS, ) from ppa.dict import unpack_to_dict from ppa.job import show_waiting, show_running from ppa.lp import Lp from ppa.ppa import ( get_ppa, ppa_address_split, Ppa, PpaNotFoundError, PendingReason ) from ppa.ppa_group import PpaGroup, PpaAlreadyExists from ppa.repository import Repository from ppa.result import show_results from ppa.text import o2str from ppa.trigger import get_triggers, show_triggers import ppa.debug from ppa.debug import dbg, warn, error EX_NOTFOUND = 127 EX_KEYBOARD_INTERRUPT = 130 def UNIMPLEMENTED(): """Marks functionality that's not yet been coded""" warn("[UNIMPLEMENTED]: %s()" % (currentframe().f_back.f_code.co_name)) def load_yaml_as_dict(filename): """Returns content of yaml-formatted file as a dictionary. :rtype: dict :returns: Content of file as a dict object. """ d = dict() with open(filename, 'r') as f: for y in yaml.safe_load_all(f.read()): d.update(y) return d def add_global_options(parser: argparse.ArgumentParser) -> None: """Adds arguments to the given parser for generic options. :param argparse.ArgumentParser parser: A parser or subparser. """ parser.add_argument('-A', '--credentials', dest='credentials_filename', action='store', metavar='FILE', help="Location of oauth credentials file") parser.add_argument('-C', '--config', dest='config_filename', action='store', default="~/.config/ppa-dev-tools/config.yml", metavar="FILE", help="Location of config file") parser.add_argument('-D', '--debug', dest='debug', action='store_true', help="Turn on general debugging") parser.add_argument('-V', '--version', action='version', version='%(prog)s {version}'.format(version=__version__), help="Version information") parser.add_argument('--dry-run', dest='dry_run', action='store_true', help="Simulate command without modifying anything") parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help="Print more information during processing") parser.add_argument('-q', '--quiet', dest='quiet', action='store_true', help="Minimize output during processing") def add_basic_config_options(parser: argparse.ArgumentParser) -> None: """Adds to a parser the command line options to configure the PPA. The config options are supported by the 'create' and 'set' command, to allow configuring the PPA at creation time, or after, respectively. These options represent what can be set as a user from the Launchpad web interface. :param argparse.ArgumentParser parser: A parser or subparser. """ # Architectures parser.add_argument( '-a', '--arches', '--arch', '--architectures', dest="architectures", action='store', default=None, help="Comma-separated list of hardware architectures to use" ) parser.add_argument( '--all-arches', '--all-architectures', dest="architectures", action='store_const', const=','.join(ARCHES_PPA_ALL), help="Enable all available architectures for the PPA" ) parser.add_argument( '--default-arches', '--default-architectures', dest="architectures", action='store_const', const=','.join(ARCHES_PPA_DEFAULT), help="Enable all available architectures for the PPA" ) # Displayname parser.add_argument( '--displayname', dest="displayname", action='store', default=None, help="A short title for the PPA's web page." ) # Description parser.add_argument( '--description', dest="description", action='store', default=None, help="A short description of the archive. URLs will be rendered as links. (See also 'ppa desc'.)" ) # Dependencies parser.add_argument( '--ppa-dependencies', '--ppa-depends', dest="ppa_dependencies", action='store', help="The set of other PPAs this PPA should use for satisfying build dependencies." ) # Public/Private access parser.add_argument( '--private', '-P', dest="private", action='store_true', help=( "Restrict access to the PPA to its owner and subscribers. " + "This can only be changed if the archive has never had any " + "sources published and the owner/group has permission to do so." ) ) parser.add_argument( '--public', dest="private", action='store_false', help="Allow access to the PPA to anyone." ) # Publishing parser.add_argument( '--publish', dest="publish", action='store_true', help=("Allow built packages in the PPA to be made available for download.") ) parser.add_argument( '--no-publish', dest="publish", action='store_false', help=("Do not make packages in the PPA available for download. " + "They will still be built.") ) def create_arg_parser() -> argparse.ArgumentParser: """Sets up the command line parser object. :rtype: argparse.ArgumentParser :returns: parser object, ready to run .parse_args(). """ progname = "ppa" parser = argparse.ArgumentParser( prog=progname, description=__doc__, formatter_class=argparse.RawTextHelpFormatter, epilog=__example__) add_global_options(parser) subparser = parser.add_subparsers(dest='command') # Create Command create_parser = subparser.add_parser( 'create', argument_default=argparse.SUPPRESS, help='create help', prog=progname, ) add_global_options(create_parser) create_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to be created") create_parser.add_argument('--owner-name', '--owner', '--team-name', '--team', metavar='NAME', action='store', default=None, help="Person or team to create PPA under, if not specified via the ppa address (defaults to current LP user)") add_basic_config_options(create_parser) # Credentials Command credentials_parser = subparser.add_parser( 'credentials', argument_default=argparse.SUPPRESS, help=( "Store the Launchpad credentials to a file for manual use. " f"(Default: '{CREDENTIALS_FILENAME_DEFAULT}')" ), prog=progname, ) add_global_options(credentials_parser) credentials_parser.add_argument( 'ppa_name', action='store', nargs='?', default='me', help="Name of the PPA (optional)") # Desc Command desc_parser = subparser.add_parser( 'desc', argument_default=argparse.SUPPRESS, help='desc help', prog=progname, ) add_global_options(desc_parser) desc_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to describe") desc_parser.add_argument('description', nargs=argparse.REMAINDER) # Destroy Command destroy_parser = subparser.add_parser( 'destroy', argument_default=argparse.SUPPRESS, help='destroy help', prog=progname, ) add_global_options(destroy_parser) destroy_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to destroy") # List Command list_parser = subparser.add_parser( 'list', argument_default=argparse.SUPPRESS, help='list help', prog=progname, ) add_global_options(list_parser) list_parser.add_argument('ppa_name', metavar='ppa-name', action='store', nargs='?', default='me', help="Name of the PPA to list") # Set Command set_parser = subparser.add_parser( 'set', argument_default=argparse.SUPPRESS, help='Applies one or more configuration changes to the PPA.', prog=progname, ) add_global_options(set_parser) set_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to be set config values on") add_basic_config_options(set_parser) # Show Command show_parser = subparser.add_parser( 'show', argument_default=argparse.SUPPRESS, help='show help', prog=progname, ) add_global_options(show_parser) show_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to show") show_parser.add_argument('-a', '--arches', '--arch', '--architectures', dest="architectures", action='store', default=None, help="Comma-separated list of hardware architectures to show") show_parser.add_argument('-r', '--releases', '--release', dest="releases", action='store', default=None, help="Comma-separated list of Ubuntu release codenames to show") show_parser.add_argument('-p', '--packages', '--package', dest="packages", action='store', help="Comma-separated list of source package names to show") # Tests Command tests_parser = subparser.add_parser( 'tests', argument_default=argparse.SUPPRESS, help='tests help', prog=progname, ) add_global_options(tests_parser) tests_parser.add_argument('ppa_name', metavar='ppa-name', action='store', default=None, help="Name of the PPA to view tests") tests_parser.add_argument('-a', '--arches', '--arch', '--architectures', dest="architectures", action='store', default=None, help="Comma-separated list of hardware architectures to include") tests_parser.add_argument('-r', '--releases', '--release', dest="releases", action='store', default=None, help="Comma-separated list of Ubuntu release codenames to show") tests_parser.add_argument('-p', '--packages', '--package', dest="packages", action='store', default=None, help="Comma-separated list of source package names to show") tests_parser.add_argument('-L', '--show-url', '--show-urls', dest='show_urls', action='store_true', default=False, help="Display unformatted trigger action URLs") tests_parser.add_argument('--show-rdepends', dest='show_rdepends', action='store_true', default=False, help="Display test triggers for reverse dependencies") # Wait Command wait_parser = subparser.add_parser( 'wait', argument_default=argparse.SUPPRESS, help=( 'Polls status of packages in a PPA until they have all completed source ' 'upload, binary building, and source and binary publication.' ), prog=progname, ) add_global_options(wait_parser) wait_parser.add_argument('ppa_name', metavar='ppa-name', action='store', help="Name of the PPA to wait on") wait_parser.add_argument('-l', '--log', dest="wait_logging", action='store_true', default=False, help="Print ongoing status to console (without screen clearing).") return parser def create_lp(app_name: str, args: argparse.Namespace) -> Lp: """Instantiate the Lp Launchpad Interface object. Use credentials from the file specified by --credentials , if provided. If not, next try to use contents from the LP_CREDENTIALS environment variable. Last, leave creds undefined, and Lp will handle website login and credentials caching automatically. :param argparse.Namespace args: Command line arguments. :rtype: Lp :returns: Interface object for accessing the launchpad service. """ if args.credentials_filename: with open(args.credentials_filename, 'r') as f: creds = f.read() else: creds = os.getenv("LP_CREDENTIALS") return Lp(app_name, credentials=creds) DEFAULT_CONFIG = { 'debug': False, 'ppa_name': None, 'owner_name': None, 'wait_seconds': 10.0 } def create_config(lp: Lp, args: argparse.Namespace) -> Dict[str, Any]: """Creates config object by loading from file and adding args. This routine merges the command line parameter values with data loaded from the program's YAML formatted configuration file at ~/.config/ppa-dev-tools/config.yml (or as specified by the --config parameter). This permits setting static values in the config file(s), and using the command line args for variable settings and overrides. :param launchpadlib.service lp: The Launchpad service object. :param Namespace args: The parsed args from ArgumentParser. :rtype: dict :returns: dict of configuration parameters and values, or None on error """ config_path = os.path.expanduser(args.config_filename) try: config = load_yaml_as_dict(config_path) except FileNotFoundError: # Assume defaults dbg("Using default config since no config file found at {config_path}") config = dict(DEFAULT_CONFIG) except OSError as err: error(f"Could not open {config_path}: {str(err)}") return None except YAMLError as err: error(f"Invalid config file {config_path}: {str(err)}") return None # Map all non-empty elements from argparse Namespace into config dict config.update({k: v for k, v in vars(args).items() if v is not None}) # Use defaults for any remaining parameters not yet configured for k, v in DEFAULT_CONFIG.items(): config.setdefault(k, v) if not hasattr(args, 'ppa_name'): warn("No ppa name given") return None owner_name, ppa_name = ppa_address_split(args.ppa_name) if owner_name: # First use the owner if present in the PPA address itself, # overriding any configured defaults or specified arguments. config['owner_name'] = owner_name elif config.get('owner_name'): # Next use any owner name from config file or cli args. pass elif config.get('team_name'): # Support legacy config term 'team_name' as alias for 'owner_name' config['owner_name'] = config['team_name'] del config['team_name'] elif lp.me: # Lastly, fallback to the current Launchpad username, if available. config['owner_name'] = lp.me.name else: warn("No owning person or team identified for the PPA") return None if not ppa_name: raise ValueError("Invalid ppa name '{args.ppa_name}'") config['ppa_name'] = ppa_name if args.dry_run: config['dry_run'] = True # TODO: Loading the values from the config file will need namespaced, # so e.g. create.architectures = a,b,c return config ################ ### Commands ### ################ def command_create(lp: Lp, config: Dict[str, str]) -> int: """Creates a new PPA in Launchpad. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE # Take description from stdin if it's not a tty description = config.get('description') if not description and not sys.stdin.isatty(): description = sys.stdin.read() ppa_name = config.get('ppa_name') if not ppa_name: warn("Could not determine PPA name") return os.EX_USAGE owner_name = config.get('owner_name') if not owner_name: warn("Could not determine owning person or team LP username") return os.EX_USAGE architectures = config.get('architectures', ARCHES_PPA_ALL) if type(architectures) is str: architectures = unpack_to_dict(architectures).keys() try: if not config.get('dry_run', False): ppa_group = PpaGroup(service=lp, name=owner_name) the_ppa = ppa_group.create( ppa_name, ppa_description=description, private=config.get('private', False) ) the_ppa.set_publish(config.get('publish', None)) if architectures: the_ppa.set_architectures(architectures) arch_str = ', '.join(the_ppa.architectures) if 'ppa_dependencies' in config: # Split value on comma ppa_addresses = unpack_to_dict(config.get('ppa_dependencies')) the_ppa.set_dependencies(ppa_addresses) else: the_ppa = Ppa(ppa_name, owner_name, description) arch_str = ', '.join(architectures) if not config.get('quiet', False): print(f"PPA '{the_ppa.ppa_name}' created for the following architectures:\n") print(f" {arch_str}\n") print("The PPA can be viewed at:\n") print(f" {the_ppa.url}\n") print("You can upload packages to this PPA using:\n") print(f" dput {the_ppa.address} \n") print("Wait for the uploads to build and publish using:\n") credentials_file=config.get('credentials_filename') if credentials_file: print(f" ppa --credentials {credentials_file} wait {the_ppa.address}\n") else: print(f" ppa wait {the_ppa.address}\n") print("To add the repository and to your system:\n") print(f" sudo add-apt-repository -yus {the_ppa.address}") print(" sudo apt-get install ") return os.EX_OK except Unauthorized as e: error(f"Insufficient authorization to create '{ppa_name}' under ownership of '{owner_name}'.") return os.EX_NOPERM except KeyError as e: error(f"No such person or team '{owner_name}'") return os.EX_NOUSER except PpaAlreadyExists as e: warn(o2str(e.message)) return os.EX_CANTCREAT except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_credentials(lp: Lp, config: Dict[str, str]) -> int: """Saves login credentials to a file. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE try: credentials_filename = config.get( 'credentials_filename', CREDENTIALS_FILENAME_DEFAULT ) lp.credentials.save_to_path(credentials_filename) print(f"Launchpad credentials written to {credentials_filename}") return os.EX_OK except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_desc(lp: Lp, config: Dict[str, str]) -> int: """Sets the description for a PPA. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE if not sys.stdin.isatty(): description = sys.stdin.read() else: description = ' '.join(config.get('description', None)) if not description or len(description) < 3: warn('No description provided') return os.EX_USAGE try: the_ppa = get_ppa(lp, config) if config.get('dry_run', False): print("dry_run: Set description to '{}'".format(description)) return os.EX_OK return the_ppa.set_description(description) except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_destroy(lp: Lp, config: Dict[str, str]) -> int: """Destroys the PPA. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE try: the_ppa = get_ppa(lp, config) if not config.get('dry_run'): # Attempt deletion of the PPA the_ppa.destroy() return os.EX_OK except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_list(lp: Lp, config: Dict[str, str], filter_func=None) -> int: """Lists the PPAs for the user or team. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ # TODO: Apply filters such as: # - Ones with packages for the given arch or codename # - filter_not_empty: Ones with packages # - filter_empty: Ones without packages # - filter_obsolete: Ones with only packages that are superseded # - filter_newer: Ones newer than a given date # - filter_older: Ones older than a given date # - Status of the PPAs if not lp: return os.EX_UNAVAILABLE owner_name = config.get('owner_name') if not owner_name: if lp.me: owner_name = lp.me.name else: warn("Could not determine owning person or team name") return os.EX_USAGE try: ppa_group = PpaGroup(service=lp, name=owner_name) for p in ppa_group.ppas: print(p.address) return os.EX_OK except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_exists(lp: Lp, config: Dict[str, str]) -> int: """Checks if the named PPA exists in Launchpad. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE try: the_ppa = get_ppa(lp, config) if the_ppa.archive is not None: return os.EX_OK except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT return 1 def command_set(lp: Lp, config: Dict[str, str]) -> int: """Sets one or more properties of PPA in Launchpad. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE try: the_ppa = get_ppa(lp, config) if 'architectures' in config: architectures = config['architectures'] if isinstance(architectures, str): architectures = unpack_to_dict(architectures).keys() the_ppa.set_architectures(architectures) if 'description' in config: the_ppa.archive.description = config['description'] if 'displayname' in config: the_ppa.archive.displayname = config['displayname'] if 'ppa_dependencies' in config: # Split value on comma ppa_addresses = unpack_to_dict(config.get('ppa_dependencies')) the_ppa.set_dependencies(ppa_addresses) if 'publish' in config: the_ppa.archive.publish = config.get('publish') the_ppa.set_private(config.get('private', None)) return the_ppa.archive.lp_save() except Unauthorized as e: if b'private' in e.content: error(f"Insufficient authorization to change privacy for PPA '{the_ppa.name}'.") else: error(f"Insufficient authorization to modify PPA '{the_ppa.name}'.") return os.EX_NOPERM except PpaNotFoundError as e: print(e) return EX_NOTFOUND except ValueError as e: print(f"Error: {e}") return os.EX_USAGE except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_show(lp: Lp, config: Dict[str, str]) -> int: """Displays details about the given PPA. :param Lp lp: The Launchpad wrapper object. :param Dict config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE distro = None series = None arch = None try: the_ppa = get_ppa(lp, config) print(f"ppa: {the_ppa.name}") print(f"address: {the_ppa.address}") print(f"url: {the_ppa.url}") print("description:") print(indent(the_ppa.description, 4)) print("sources:") for source in the_ppa.get_source_publications(distro, series, arch): print(" %s (%s) %s" % ( source.source_package_name, source.source_package_version, source.status)) # Only show binary details if specifically requested print("binaries:") total_downloads = 0 for binary in the_ppa.get_binaries(distro, series, arch) or []: # Skip uninteresting binaries if not config.get('show-debug', False) and binary.is_debug: continue if not config.get('show-superseded', False) and binary.status == 'Superseded': continue if not config.get('show-deleted', False) and binary.status == 'Deleted': continue if not config.get('show-obsolete', False) and binary.status == 'Obsolete': continue print(" %-40s %-8s %s %s %s %6d" % ( binary.binary_package_name + ' ' + binary.binary_package_version, binary.distro_arch_series.architecture_tag, binary.component_name, binary.pocket, binary.status, binary.getDownloadCount())) total_downloads += binary.getDownloadCount() print("downloads: %d" % (total_downloads)) return os.EX_OK except PpaNotFoundError as e: print(e) return EX_NOTFOUND except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_wait(lp: Lp, config: Dict[str, str]) -> int: """Blocks until all package builds are finished. Polls Launchpad for build (and/or test) status on packages present in the PPA. Exits only when all packages have completed processing. This is intended to be used in a workflow where packages are uploaded to the PPA for building and/or testing, with additional steps take once the packages have finished processing. The wait command allows the workflow to pause until the builds and/or tests have finished. The exit value of the wait command indicates if the processing was successful, or if there were one or more failures. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE try: wait_max_age_hours = config.get('wait_max_age_hours') created_since_date = None if wait_max_age_hours: created_since_date = datetime.datetime.utcnow().replace( tzinfo=datetime.timezone.utc ) - datetime.timedelta(hours=int(wait_max_age_hours)) name = config.get('name') the_ppa = get_ppa(lp, config) waiting = True bad_request_count = 0 while waiting: try: if not the_ppa.has_packages(created_since_date=created_since_date, name=name): print("Nothing present in PPA. Waiting for new package uploads...") # TODO: Only wait a configurable amount of time (15 min?) waiting = True # config['wait_for_packages'] else: pending_reason = the_ppa.pending_publications( created_since_date=created_since_date, name=name, logging=config.get('wait_logging', False), ) waiting = bool(pending_reason) if config.get('exit_on_only_build_failure', False) and all( x == PendingReason.BUILD_FAILED for x in pending_reason): # If exiting due to not pending, return ok, else failure return 100 if pending_reason else os.EX_OK bad_request_count = 0 except BadRequest as e: if bad_request_count < 3: warn("BadRequest from Launchpad. Retrying...") bad_request_count += 1 else: error(f"Launchpad failure: {e}") return os.EX_TEMPFAIL time.sleep(config['wait_seconds']) return os.EX_OK except PpaNotFoundError as e: print(e) return EX_NOTFOUND except ValueError as e: print(f"Error: {e}") return os.EX_USAGE except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 def command_tests(lp: Lp, config: Dict[str, str]) -> int: """Displays testing status for the PPA. :param Lp lp: The Launchpad wrapper object. :param Dict[str, str] config: Configuration param:value map. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not lp: return os.EX_UNAVAILABLE apt_repository = None if config.get("show_rdepends"): local_dists_path = os.path.join(LOCAL_REPOSITORY_PATH, "dists") try: apt_repository = Repository(cache_dir=local_dists_path) except FileNotFoundError as e: error(f'Missing checkout\n{LOCAL_REPOSITORY_MIRRORING_DIRECTIONS}: {e}') return EX_NOTFOUND releases = config.get('releases', None) if releases is None: udi = UbuntuDistroInfo() releases = udi.supported() releases.extend(r for r in udi.supported_esm() if r not in releases) if isinstance(releases, str): releases = list(unpack_to_dict(releases).keys()) if not isinstance(releases, list): raise TypeError(f"Parameter releases={releases} not of type list") packages = config.get('packages', None) if not packages is None: if isinstance(packages, str): packages = list(unpack_to_dict(packages).keys()) if not isinstance(packages, list): raise TypeError(f"Parameter packages={packages} not of type list") the_ppa = get_ppa(lp, config) if not the_ppa.exists(): error(f"PPA {the_ppa.name} does not exist for user {the_ppa.owner_name}") return EX_NOTFOUND architectures = config.get('architectures', ARCHES_AUTOPKGTEST) if isinstance(architectures, str): architectures = list(unpack_to_dict(architectures).keys()) if not isinstance(architectures, list): raise TypeError(f"Parameter architectures={architectures} not of type list") try: # Triggers source_pub_triggers = [] for source_pub in the_ppa.get_source_publications(): series = source_pub.distro_series.name if series not in releases: continue pkg = source_pub.source_package_name if packages and (pkg not in packages): continue ver = source_pub.source_package_version triggers = get_triggers(pkg, ver, the_ppa, series, architectures) if config.get("show_rdepends"): # Construct suite object from repository. # NOTE: If a package has been freshly added to 'proposed' it # will be missed since we consider only packages present # in the release pocket. suite = apt_repository.get_suite(series, 'release') if not suite: raise RuntimeError( f'No suite "{series}" in the local Apt cache' ) # Lookup rdepends for the package source_package = suite.sources.get(pkg) if not source_package: raise RuntimeError( f'No source package "{pkg}" in the local Apt cache for "{suite}"' ) rdepends_source_package_names = suite.dependent_packages(source_package) for rdep_name in rdepends_source_package_names: rdep = suite.sources.get(rdep_name) if not rdep: raise RuntimeError( f'Undefined reverse dependency "{rdep_name}"' ) triggers.extend([ Trigger(pkg, ver, arch, series, the_ppa, rdep.name) for arch in architectures ]) source_pub_triggers.append((source_pub, triggers)) # Display triggers print("* Triggers:") for source_pub, triggers in source_pub_triggers: show_triggers( source_pub.source_package_name, source_pub.source_package_version, triggers, source_pub.status, show_trigger_urls=config.get("show_urls"), show_trigger_names=config.get("show_rdepends") ) # Results show_results(the_ppa.get_autopkgtest_results(releases, architectures, packages), config.get('show_urls')) # Running Queue show_running(sorted(the_ppa.get_autopkgtest_running(releases, packages), key=lambda k: str(k.submit_time))) # Waiting Queue show_waiting(the_ppa.get_autopkgtest_waiting(releases, packages)) return os.EX_OK except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT print("Unhandled error") return 1 COMMANDS = { 'create': (command_create, None), 'credentials': (command_credentials, None), 'desc': (command_desc, None), 'destroy': (command_destroy, None), 'list': (command_list, None), 'set': (command_set, None), 'show': (command_show, None), 'tests': (command_tests, None), 'wait': (command_wait, None), } def main(args: argparse.Namespace) -> int: """Main entrypoint for the command. :param argparse.Namespace args: Command line arguments. :rtype: int :returns: Status code OK (0) on success, non-zero on error. """ if not args.command: error("No command given.") return os.EX_USAGE try: lp = create_lp('ppa-dev-tools', args) config = create_config(lp, args) except KeyboardInterrupt: return EX_KEYBOARD_INTERRUPT except ValueError as e: error(e) return os.EX_CONFIG if not config: return os.EX_CONFIG ppa.debug.DEBUGGING = config.get('debug', False) dbg("Configuration:") dbg(config) command = args.command try: func, param = COMMANDS[command] except KeyError: parser.error(f"No such command {command}") return os.EX_USAGE if param: return func(lp, config, param) return func(lp, config) if __name__ == "__main__": # Option handling parser = create_arg_parser() args = parser.parse_args() retval = main(args) if retval == os.EX_USAGE: print() parser.print_help() elif retval == EX_KEYBOARD_INTERRUPT: sys.stderr.write(" (user interrupt)\n") sys.exit(retval) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3361645 ppa_dev_tools-0.6.0/setup.cfg0000664000175000017500000000030414630542117015230 0ustar00brycebryce[metadata] description_file = README.md license_files = LICENSE.GPLv2+ [aliases] test = pytest [tool:pytest] addopts = --verbose python_files = tests/*.py [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3321643 ppa_dev_tools-0.6.0/tests/0000775000175000017500000000000014630542117014554 5ustar00brycebryce././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3321643 ppa_dev_tools-0.6.0/tests/data/0000775000175000017500000000000014630542117015465 5ustar00brycebryce././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3321643 ppa_dev_tools-0.6.0/tests/data/binary-amd64/0000775000175000017500000000000014630542117017662 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/data/binary-amd64/Packages0000664000175000017500000046145314410675017021342 0ustar00brycebrycePackage: accountsservice Architecture: amd64 Version: 22.08.8-1ubuntu4 Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian freedesktop.org maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 504 Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.08.8-1ubuntu4), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99) Recommends: default-logind | logind Suggests: gnome-control-center Filename: pool/main/a/accountsservice/accountsservice_22.08.8-1ubuntu4_amd64.deb Size: 68364 MD5sum: a10447714f0ce3c5f607b7b27c0f9299 SHA1: 252482d8935d16b7fc5ced0c88819eeb7cad6c65 SHA256: 4e341a8e288d8f8f9ace6cf90a1dcc3211f06751d9bec3a68a6c539b0c711282 SHA512: eb91e21b4dfe38e9768e8ca50f30f94298d86f07e78525ab17df12eb3071ea21cfbdc2ade3e48bd4e22790aa6ce3406bb10fbd17d8d668f84de1c8adeee249cb Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/ Description: query and manipulate user account information Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, ubuntu-wsl, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e Package: acct Architecture: amd64 Version: 6.6.4-5 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Security Tools Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 305 Pre-Depends: init-system-helpers (>= 1.54~) Depends: libc6 (>= 2.34), lsb-base Filename: pool/main/a/acct/acct_6.6.4-5_amd64.deb Size: 88136 MD5sum: 6a4b7e2a78f7100583e8383274ba3717 SHA1: 4bb9abe37b9259b195439923d8a05e3d0f0a9f55 SHA256: eb6303c9e70ecc0b281669b7c06860fdede99a5d43ec179bf40344e606f56e40 SHA512: a334cb07d097e8fee4c4af1a1eba186548299ccc9013f53b9a93a4d9ffdc735bae53f93622cec1bde25a4fd9b019ca57c96acd2c21b46ea714657103b410dca4 Homepage: https://www.gnu.org/software/acct/ Description: GNU Accounting utilities for process and login accounting Description-md5: 2411ebcaa9bca02b21c19f927d3e1bda Package: acl Architecture: amd64 Version: 2.3.1-3 Multi-Arch: foreign Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Guillem Jover Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 192 Depends: libacl1 (= 2.3.1-3), libc6 (>= 2.34) Filename: pool/main/a/acl/acl_2.3.1-3_amd64.deb Size: 39030 MD5sum: c84ecfd62b0ac0538806153d1e3e4ca4 SHA1: 29fe5844a6d62e7af1e17757189cd29dc1db9bd4 SHA256: cb65a7f0d5920dae6c40a4ea5723b8b764830f4099fab2009d42e7580169fe7a SHA512: 75a7ba60f74f54bf571b1256e20252f37296ee18c5c51a6fc3a3fbeb699167a91fc03a751c98d1f66855658fa2bc4c1fad4e199933ced7eb11319251dbf3109b Homepage: https://savannah.nongnu.org/projects/acl/ Description: access control list - utilities Task: print-server, ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: b83fc53f6059dbeb88f11752e70968e7 Package: acpid Architecture: amd64 Version: 1:2.0.33-2ubuntu1 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Josue Ortega Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 146 Pre-Depends: init-system-helpers (>= 1.54~) Depends: libc6 (>= 2.34), lsb-base (>= 3.2-14), kmod Filename: pool/main/a/acpid/acpid_2.0.33-2ubuntu1_amd64.deb Size: 35596 MD5sum: 9d4157109d94e39e769f392db1df087b SHA1: f0839903caec61e135beb7bd803d2a80f9d97ef1 SHA256: ded4b136a33c83e3d217a44cd3f75690795beaac208f1a2eddb9352c00f41952 SHA512: 314cf9a92e2dbfe06e6852ee1d7e0a5b49138eed5b73ad14b8267589ca1d830484fcffa7f609016d9bd6d7d9d5646e0cda5753c1fb1ed6f9b8387d4566664bf3 Homepage: http://sourceforge.net/projects/acpid2/ Description: Advanced Configuration and Power Interface event daemon Description-md5: 6a7c4e4695f570d8fbcaec667cdcfcfe Package: adcli Architecture: amd64 Version: 0.9.1-2ubuntu1 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Laurent Bigonville Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 294 Depends: libsasl2-modules-gssapi-mit, libc6 (>= 2.34), libgssapi-krb5-2 (>= 1.6.dfsg.2), libk5crypto3 (>= 1.20), libkrb5-3 (>= 1.12~alpha1+dfsg), libldap2 (>= 2.6.2) Filename: pool/main/a/adcli/adcli_0.9.1-2ubuntu1_amd64.deb Size: 96830 MD5sum: 5b1d91459279be6410340e12069f241a SHA1: b8432f15516f58d5647614e0e9ba589f89c64fa8 SHA256: bb54607ddb83957bd57960c2d8c8cf95c7d8bd3f046812928275deb890cc274f SHA512: 4c46e4dff59c19b6b2a22076457bf74a3c3c68a757359ddf6f55a6dbe344ab39f5dca88ec1663da59adb56bceaac7fe5d39f7e96f376fddd1ae71f30eb8355be Homepage: https://www.freedesktop.org/software/realmd/ Description: Tool for performing actions on an Active Directory domain Task: ubuntu-live, ubuntu-mate-core, ubuntu-mate-desktop Description-md5: 3f005076e7a98a598f65545cbab3b448 Package: adduser Architecture: all Version: 3.129ubuntu1 Multi-Arch: foreign Priority: important Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Adduser Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 424 Depends: passwd Suggests: liblocale-gettext-perl, perl, cron, ecryptfs-utils (>= 67-1) Filename: pool/main/a/adduser/adduser_3.129ubuntu1_all.deb Size: 59020 MD5sum: 09ff29d773c1a85b097d5b3acadd5fc2 SHA1: a2a57cfd914d0a3e0ea5b440cda3e7de82974b89 SHA256: e58ca197bc0244e53f318b1771a2a27faca3c96866b57fd6ccc4f53d041c0639 SHA512: 7377db24b75531aab129d1feb73864515c0a397a6d34bb98baed5a7255f8b5dcc851ba141cc1a48a61d60a9a76087390743e490fdb4457704cc7c8e373b0990b Description: add and remove users and groups Task: minimal, server-minimal Description-md5: a5681e7bad8d90695043c6eab9784701 Package: adsys Architecture: amd64 Version: 0.9.2 Built-Using: golang-1.18 (= 1.18.4-1ubuntu2) Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 23420 Depends: libc6 (>= 2.34), libpam0g (>= 0.99.7.1), libsmbclient (>= 2:4.0.3+dfsg1), init-system-helpers (>= 1.52), python3, python3-samba, samba-dsdb-modules, sssd, sssd-dbus Recommends: ubuntu-advantage-desktop-daemon Filename: pool/main/a/adsys/adsys_0.9.2_amd64.deb Size: 6139824 MD5sum: 5d80e4858f1c642cb71cfe19add8ab3d SHA1: 8318e76b397e593b37f7a08323a9290f67cb8f19 SHA256: 4370346b1a84f41ea06eaea06f61e2e2f1c3f2563891efae22cfe5f87adc432a SHA512: 70b602cfd191af3395d589c2d74af11082e7aef49b961d6e78d84fe69effc467cb2778a317520fc8e7ed12921cb5d607cf345c2e0ce8c72b62e143b58b8eb145 Homepage: https://github.com/ubuntu/adsys Description: AD SYStem integration Description-md5: 720becc0977ae4c845fb5e5c1a8cdc87 Package: advancecomp Architecture: amd64 Version: 2.5-1 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Piotr Ożarowski Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 671 Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 9), zlib1g (>= 1:1.1.4) Filename: pool/main/a/advancecomp/advancecomp_2.5-1_amd64.deb Size: 180468 MD5sum: a45d6a295d292b37b9c0bf5e185b2362 SHA1: e8163314946dfe8d92d7dc1caa3c09a9faefe415 SHA256: 491ef7fca17f5bbe8fbf0dc788609bf242686a28369bc603aeb397c9555432ef SHA512: 84157fda1f87289f95bec2b5893db1903cd81daec91d2104831953913aaebdeb293c06bd871c32feb2cdf5c435ad2b98692a933362ce83ae7af6c485f85c900d Homepage: http://www.advancemame.it/ Description: collection of recompression utilities Description-md5: 45269d7ed6ff6092f699fce2e0061b74 Package: adwaita-icon-theme Architecture: all Version: 41.0-1ubuntu1 Multi-Arch: foreign Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 5234 Depends: hicolor-icon-theme, gtk-update-icon-cache, ubuntu-mono | adwaita-icon-theme-full Recommends: librsvg2-common Breaks: adwaita-icon-theme-full (<< 41.0-1ubuntu1), gnome-themes-standard-data (<< 3.18.0-2~) Replaces: adwaita-icon-theme-full (<< 41.0-1ubuntu1), gnome-themes-standard-data (<< 3.18.0-2~) Filename: pool/main/a/adwaita-icon-theme/adwaita-icon-theme_41.0-1ubuntu1_all.deb Size: 3444050 MD5sum: 4d91041f196302625d68994f264c59ae SHA1: 4056f21a8cb17f3ed5a4524dfab25ba3e4c6b02d SHA256: 9391c87c5479507895be429434d6ebd60593e8f3a708fec6cd7950579128debc SHA512: 8ae96d7066376752be85d3eeb5dac08d7a93bba32756fab0e41c64c35a88732edf73ea8deadf612692f73ac4d997b108d458d15ea3850cef2df501fc0445c744 Description: default icon theme of GNOME (small subset) Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, ubuntu-wsl, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl Description-md5: 074cb6d8a0caaa072baf8360cb391830 Package: aide Architecture: amd64 Version: 0.18-2 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Aide Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 268 Provides: aide-binary Depends: libacl1 (>= 2.2.23), libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcap2 (>= 1:2.10), libext2fs2 (>= 1.46.2), libmhash2 (>= 0.9.9.9), libpcre2-8-0 (>= 10.22), libselinux1 (>= 3.1~), zlib1g (>= 1:1.1.4) Recommends: aide-common (= 0.18-2) Suggests: figlet Replaces: aide-dynamic, aide-xen Filename: pool/main/a/aide/aide_0.18-2_amd64.deb Size: 116316 MD5sum: a11256510f9171e7eaf33464acb8f09e SHA1: d03a183e2bdf58d8b8b9c50fba079fd38b600224 SHA256: e099ba7e86b00ba9320ee08b45526bc02ed9de1e0eb25a3a76ee6010d191092c SHA512: db732415b784dd8af7451bc6248a6ae32cd7f9d402e8e266e7df45556ba4487126a04c23d2e667b82ec88f9744fb5aa1d3376897f083c1872e2ad0a8c78cdbde Homepage: https://aide.github.io Description: Advanced Intrusion Detection Environment - dynamic binary Description-md5: 1d70ba920a3b80bc791be197bf18814c Package: aide-common Architecture: all Version: 0.18-2 Priority: optional Section: admin Source: aide Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Aide Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 425 Depends: aide (>= 0.17), liblockfile1, ucf (>= 2.0020), debconf (>= 0.5) | debconf-2.0 Recommends: cron, bsd-mailx | mailx | s-nail Filename: pool/main/a/aide/aide-common_0.18-2_all.deb Size: 78624 MD5sum: 05b593e8bf9c572028fe6770e2b6ea5a SHA1: e4089fe4b2708a2be159581c8351a861139ecb9e SHA256: 4b65785709bc676172f250d4f0410f1c3fa428db4da68508efdbc7a9dfc44b4b SHA512: 8dbd1edfee9a62e200504eccda3a87698bdfb0fedee862b5f7bfeb26ddfc73db26481dfb5e980dc83b9e326e347fae63322b0234050fbefbb0dbde7559f3f700 Homepage: https://aide.github.io Description: Advanced Intrusion Detection Environment - Common files Description-md5: 7a8490e442a29581e6cca1b191be3f62 Package: aisleriot Architecture: amd64 Version: 1:3.22.23-1 Priority: optional Section: games Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 9156 Depends: dconf-gsettings-backend | gsettings-backend, guile-3.0-libs, libatk1.0-0 (>= 1.12.4), libc6 (>= 2.34), libcairo2 (>= 1.10.0), libcanberra-gtk3-0 (>= 0.25), libcanberra0 (>= 0.2), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.37.3), libgtk-3-0 (>= 3.19.12), librsvg2-2 (>= 2.32.0) Recommends: yelp Suggests: gnome-cards-data Filename: pool/main/a/aisleriot/aisleriot_3.22.23-1_amd64.deb Size: 1053428 MD5sum: 30eb03e230bb98410d17cdc92931eda7 SHA1: 0777ac42713f5d2e9813ec426b147987a8fbdfdf SHA256: e55f01e535e0593b65eff10305091f12786dfad5e3bdd464301eb2737ef15f42 SHA512: b5678f2793367da737c2c4dc31ab996f2498970a82e85387008e47a6b6d25689366b20e839ff230244e080729ae5e7117f893c6425175c25ef966eff752578b5 Homepage: https://wiki.gnome.org/Apps/Aisleriot Description: GNOME solitaire card game collection Task: ubuntu-desktop, ubuntu-desktop-raspi, ubuntukylin-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: e7f99df3aa92cf870d335784e155ec33 Package: alembic Architecture: all Version: 1.8.1-0ubuntu1 Priority: optional Section: python Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Python Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2548 Depends: python3-alembic (= 1.8.1-0ubuntu1), python3:any, libjs-sphinxdoc (>= 4.3) Filename: pool/main/a/alembic/alembic_1.8.1-0ubuntu1_all.deb Size: 277302 MD5sum: 93d93ba0f0b0250c5cba8182350fd8a2 SHA1: a9931bc69fc8326dc7ff6606a232f3b0df585e4c SHA256: effe88592620bf5b9c55995ebd94d5f3375f4582f928d076a93272f33af1125d SHA512: c7be79856e79324d556fc6644ffbd75833cb7c4e3ce834def4d94867c6f7ec217f67e166ed708d276d4259098838c58370d7fd5a2c8f9ea6ea27a973359aff75 Homepage: https://github.com/sqlalchemy/alembic Description: lightweight database migration tool for SQLAlchemy Description-md5: cd0efbf0f89bffe2d4dc35fa935c7c7e Package: alsa-base Architecture: all Version: 1.0.25+dfsg-0ubuntu7 Multi-Arch: foreign Priority: optional Section: sound Source: alsa-driver Origin: Ubuntu Maintainer: Ubuntu Core Developers Original-Maintainer: Debian ALSA Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 464 Provides: alsa Depends: kmod (>= 17-1), linux-sound-base, udev Recommends: alsa-utils Suggests: apmd (>= 3.0.2-1), alsa-oss, oss-compat Filename: pool/main/a/alsa-driver/alsa-base_1.0.25+dfsg-0ubuntu7_all.deb Size: 145152 MD5sum: 566da6f90405b86e5ad8add47b07ca7e SHA1: 6929cf39f165ebddde32e434bda01dfd3b55e349 SHA256: d0c99ed97cab93fb759be324947e26d79df81362106226baf353a4f5e2a39bd3 SHA512: b89357c65bf92350ec20f602fd3ba96fb4234d18bf23d9254d1f51381eb6b7569feab2fa1ce6ec6702afe18a672acbdc0275453269feac76becee0632fe7e7bb Homepage: http://www.alsa-project.org/ Description: ALSA driver configuration files Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 14d30d1beb8026b3d2636c32c5a92cca Package: alsa-topology-conf Architecture: all Version: 1.2.5.1-2 Multi-Arch: foreign Priority: optional Section: libs Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ALSA Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 420 Breaks: libasound2-data (<< 1.2.1) Replaces: libasound2-data (<< 1.2.1) Enhances: libasound2-data Filename: pool/main/a/alsa-topology-conf/alsa-topology-conf_1.2.5.1-2_all.deb Size: 15542 MD5sum: ac951cc5419ff9c9ed8ab2f0cdcbebb6 SHA1: 28bbb456e0ee25d77512d079505b94086507fe8b SHA256: e5109a16bd0aa0eb08a8d0e3862d7f2f223cce0741cf4167eb56fafcc7ba8f35 SHA512: 685d9cc838f8ed14841e4a9fc17c36a2114a836e5bdfd4c6ba15796ac13f082917816a803ab092ee29f03f84ec4a90b100df6eac0e505b3ee95b5a9a8d42a02a Homepage: https://www.alsa-project.org/ Description: ALSA topology configuration files Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 5b8bf095ff0102805ed804bd0ad47988 Package: alsa-ucm-conf Architecture: all Version: 1.2.6.3-1ubuntu7 Multi-Arch: foreign Priority: optional Section: libs Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ALSA Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 556 Depends: libasound2 (>= 1.2.4) Filename: pool/main/a/alsa-ucm-conf/alsa-ucm-conf_1.2.6.3-1ubuntu7_all.deb Size: 41474 MD5sum: 465abffb6ee636b2248e2e1ae62d95b4 SHA1: a557914c0d01ddce044435f52216b886ee9d5fbe SHA256: 2fc5a28ab778fa083b8d5f966d32c676ee7f98d5506fdbfe48d772daf324109c SHA512: 7edcde203763d7749f6fa06484360b4a640a33a98afe2183254a0c9fe1d76b8d586d7281fe7619e9d74afd1eabe3e418d8c7bc1a96b19f3ff94bd9f0b92f46f9 Homepage: https://www.alsa-project.org/ Description: ALSA Use Case Manager configuration files Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: c57964a46d5e0c90f286d77124260cb7 Package: alsa-utils Architecture: amd64 Version: 1.2.8-1ubuntu1 Multi-Arch: foreign Priority: optional Section: sound Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ALSA Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2564 Provides: audio-mixer Depends: kmod (>= 17-1~), lsb-base (>= 3.0-9), libasound2 (>= 1.2.6.1), libatopology2 (>= 1.2.2), libc6 (>= 2.34), libfftw3-single3 (>= 3.3.5), libncursesw6 (>= 6), libsamplerate0 (>= 0.1.7), libtinfo6 (>= 6) Suggests: dialog Filename: pool/main/a/alsa-utils/alsa-utils_1.2.8-1ubuntu1_amd64.deb Size: 1183416 MD5sum: 1ee5565dce405f8bc952361763a934cb SHA1: d8f359dd89ef0bd4fccfef4124e75ee40e5c0f16 SHA256: 85a5988d028a7945f681703fad9f8430b61b26c6b5ebc20f387cb5f9e32a5831 SHA512: 80648211666bab2add5474ff6095e9e433d882ee5ae128422953306f8f067a63ac95cdf4dcea3b72d1dec8651f56273ff4065148babb33d90eeb16593b5e6d4b Homepage: https://www.alsa-project.org/ Description: Utilities for configuring and using ALSA Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: a4e555adf5e969eded25828df3763172 Package: amavisd-new Architecture: all Version: 1:2.12.2-1.1ubuntu1 Priority: extra Section: mail Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Brian May Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2792 Provides: amavis Pre-Depends: init-system-helpers (>= 1.54~) Depends: adduser (>= 3.34), debconf | debconf-2.0, file, libarchive-tar-perl, libarchive-zip-perl (>= 1.14), libberkeleydb-perl, libconvert-tnef-perl (>= 0.06), libconvert-uulib-perl (>= 1.0.5), libdigest-md5-perl, libio-stringy-perl, libmail-dkim-perl, libmailtools-perl (>= 1.58), libmime-base64-perl, libmime-tools-perl, libnet-libidn-perl, libnet-server-perl, libtime-hires-perl, libunix-syslog-perl, libnet-snmp-perl, pax, perl (>= 5.10.1) | libcompress-raw-zlib-perl (>= 2.017), lsb-base (>= 3.0-6), perl:any Recommends: libnet-patricia-perl Suggests: apt-listchanges (>= 2.35), arj, cabextract, clamav, clamav-daemon, cpio, dspam, lhasa, libauthen-sasl-perl, libdbi-perl (>= 1.43), libjson-perl, liblwp-protocol-https-perl, libmail-dkim-perl (>= 0.31), libnet-ldap-perl (>= 1:0.32), libnet-ssleay-perl, libsnmp-perl, libwww-perl, libzeromq-perl, lzop, nomarch, p7zip, rpm, spamassassin (>= 3.1.0a), unrar, altermime, ripole Conflicts: amavis, logcheck (<= 1.2.62) Replaces: amavis Filename: pool/main/a/amavisd-new/amavisd-new_2.12.2-1.1ubuntu1_all.deb Size: 628978 MD5sum: f43722c2b993eac39b5444455533cb09 SHA1: bf0024358668a3de056451acb5289feb801ff4e3 SHA256: a98c8b5f5de6552fe72b5e85f33364ae6229283e3d204feb472f18141b4c9d7f SHA512: c5556ccf008aa54f07b02daf7bb00acd8b927ce739f173f25fea2cdcb752df023d5d8169d0bab2f97bf5497a113c55e7c2b81653818fcc5f69d758b52e6eff12 Homepage: https://www.ijs.si/software/amavisd/ Description: Interface between MTA and virus scanner/content filters Description-md5: d95fd9c270e69763b2674a7c7629b731 Package: amd64-microcode Architecture: amd64 Version: 3.20220411.1ubuntu3 Priority: extra Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Henrique de Moraes Holschuh Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 253 Recommends: initramfs-tools (>= 0.113~) | dracut (>= 044) | tiny-initramfs Breaks: intel-microcode (<< 2), linux-firmware (<< 20220819.git8413c63c-0ubuntu1~) Replaces: linux-firmware (<< 20220819.git8413c63c-0ubuntu1~) Filename: pool/main/a/amd64-microcode/amd64-microcode_3.20220411.1ubuntu3_amd64.deb Size: 119966 MD5sum: 8a268a6bb3d865c986652b198e22117c SHA1: 36739d091a86986d52b283527606151268edd478 SHA256: dae5f9bb42b03a05558a74696b00e1ad7f825c57f924b8f86af91fed6cfc87db SHA512: 74206a0fe291db434fe440d0f5a3efe3e8a9d2a12f5533680243a7714eff4eafcf37a7b9581f92f8d7d83fbfe933f6212d352dd980afa1a122c87343d9313771 Description: Processor microcode firmware for AMD CPUs Description-md5: 23fa6bfa66f5bae20d70af0ec3052425 Package: anacron Architecture: amd64 Version: 2.3-36ubuntu1 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Lance Lin Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 90 Depends: lsb-base, libc6 (>= 2.34) Recommends: cron | cron-daemon Suggests: default-mta | mail-transport-agent, rsyslog | system-log-daemon, powermgmt-base Filename: pool/main/a/anacron/anacron_2.3-36ubuntu1_amd64.deb Size: 26300 MD5sum: 939f51db5e794a93d1ddf30bff88266b SHA1: 07b86d8daf227e15c358d059ec39ede3ff8d655f SHA256: 035895bde55c7b87f07486c7f45437680607bedc0c8b6f0cbd0b8233c4c6302e SHA512: 4dcc8cf1ee41368e3323710445323b9efd862830ae073104d1bce1a7825534e4edeea9def349abc3bfe2395142ad995ad658a2026828b913ed34c280f1c79047 Homepage: http://sourceforge.net/projects/anacron/ Description: cron-like program that doesn't go by time Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: cd9f07726e1ee3bc93fcfdb799520070 Package: anope Architecture: amd64 Version: 2.0.12-1 Priority: optional Section: net Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Dominic Hargreaves Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 15316 Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libgnutls30 (>= 3.7.5), libldap2 (>= 2.6.2), libmysqlclient21 (>= 8.0.11), libpcre2-8-0 (>= 10.22), libsqlite3-0 (>= 3.5.9), libstdc++6 (>= 11), init-system-helpers (>= 1.51), lsb-base (>= 3.2-14) Recommends: default-mta | mail-transport-agent Breaks: ircd-hybrid (<< 8.2.23) Filename: pool/main/a/anope/anope_2.0.12-1_amd64.deb Size: 3086180 MD5sum: 690caef6a328a863523c54f31a1b0c5c SHA1: 33e8c8772c3565744c8963e032df35de2810bd9b SHA256: e467c8f02f3e3ace3773a21ad07bf38d0a36013b36426786fd7a04756abfb631 SHA512: e73f7889471ad481dbec642814692f7c12547383b4ba9da0b7430039e03cd5bd4fb1185d5760bafc0c143de4cb42b232fcb5c267b32fbd7659c3e744ed977edf Homepage: http://www.anope.org/ Description: IRC Services designed for flexibility and ease of use Description-md5: bb0a2350d2094f8bb9b48d9bfdddb1c0 Package: aodh-api Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 20 Depends: adduser, apache2 | httpd, libapache2-mod-wsgi-py3, lsb-base, python3-aodh (= 1:15.0.0+git2023011009.3a648043-0ubuntu1) Filename: pool/main/a/aodh/aodh-api_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 2602 MD5sum: 5b16d87e3e94b02dbaaf35b6a92bae5d SHA1: 194ea86720e5b309fc1c23fd1719bb7ff25d9f76 SHA256: 0a23770de250cae92956768b0a81b017235aa6dd183bed3dd7d35e2dce0e72aa SHA512: 985f1582f29cf7134f6851d41f8c524f0a1c75694a269246550bd9338e7b1d9e3baa87882b502752550c5c6299b7457927fd405deaa6f116d3813a4e4ff42404 Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - API server Description-md5: 6b8d05cc8a7eaa3240864a08b5d1cd55 Package: aodh-common Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 74 Depends: adduser, dpkg-dev Filename: pool/main/a/aodh/aodh-common_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 17132 MD5sum: 2205c6fed31cda7907bdbbb8ccdd6dd8 SHA1: efbffcef67a0462b49886f6d968cbcfdd771abf4 SHA256: 39a32c2937c974aa7ab7c2a051a8e1d3057d345769532b7ae8e1c0b6793fbb94 SHA512: cdb595de4b523d9953453ae50159d56bbc9bdb7aba9cb3987cb90a2687e70a26b51afdc3a7d9171a4cff28556843685d123b5b37904674ee93619e20d451490b Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - common files Description-md5: 4d4a9638c22eafe95e8cdbfdae651022 Package: aodh-doc Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: doc Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 3082 Depends: libjs-sphinxdoc (>= 5.2) Filename: pool/main/a/aodh/aodh-doc_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 964858 MD5sum: 589ac25b3828d55b4a0005b3ad6c565c SHA1: 8d81bb90b79e3711fc6ee362fa19043870ded06c SHA256: 91483e8affbf2fc76f6c21240a15596aec3b87c832a51875e05d53cfddc02348 SHA512: 139e26453609cabbcde19ebd96e3566d957544b46973a2cebdf302a4b4fafee0577cb889f5bcc858cfdb5488f46554f693c30c37197cf42c5315d78e1dbd3ea9 Homepage: https://opendev.org/openstack/aodh Description: OpenStack efficient metering counters system - doc Description-md5: 4ccc03ab50d461abc9243b8af3d07f6a Package: aodh-evaluator Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 31 Depends: lsb-base, python3-aodh (= 1:15.0.0+git2023011009.3a648043-0ubuntu1) Filename: pool/main/a/aodh/aodh-evaluator_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 5370 MD5sum: 1a786e1dc6deb9b13d45a71d2d633208 SHA1: 1f6b7d617ff8a44a76c036991c13e85cf335bf1e SHA256: 765385eb66ae4877951478e6ff5244617d7b8d732e2f860a7d55081c29ff8b85 SHA512: cfb765f530df0bba45c07b82ae676976778ee5c9a9f2c9503374c9f6fadde17719baddc5ebb9629214dad56fa052504c4141cc97a495f494fa58afb39d500bcf Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - alarm evaluator Description-md5: fe4c736374d97e3e64811d6cf36d5251 Package: aodh-expirer Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 31 Depends: lsb-base, python3-aodh (= 1:15.0.0+git2023011009.3a648043-0ubuntu1) Filename: pool/main/a/aodh/aodh-expirer_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 5416 MD5sum: c771e4b3f9b6951caa74a9b8dcc910c2 SHA1: 593893995b4a0434470ac09ac76d81817c0cc8a7 SHA256: 64ee72cbdb88cd8174542eb998c3a8eaa197bf199c358980c190b1dc878f666a SHA512: 40592113f3a1625bc27e31e1e7a7d6a30281ce56201d0a002d58eebc00372aa5d54cd75d5d3e01cffedb02a49528ef3f16b38300bf215f518aabc7325c1ad707 Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - expirer Description-md5: 51f8b5079e2ff8324ac5cb238d635e6d Package: aodh-listener Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 31 Depends: lsb-base, python3-aodh (= 1:15.0.0+git2023011009.3a648043-0ubuntu1) Filename: pool/main/a/aodh/aodh-listener_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 5378 MD5sum: e3b4cd15c9d007016a8fd319216260d6 SHA1: f6f684a37ff5b476881dd817ccbf690e9755d26e SHA256: 7e3bb5f6cc55f6318046474d3581a34772a6b133679ce29451ea6e6bdfcde659 SHA512: 69d4e252eacc4fef2f2e8c6afa06b02b0c8833f4ee839fc51a8d4e961b5a6ca4c4eb0ffc6e0127b831b2383e96e63f3f17ae72fc0239fd2263e93ecef5bc7fb7 Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - listener Description-md5: 87e1470b816f8799b76e76049bd8f4ed Package: aodh-notifier Architecture: all Version: 1:15.0.0+git2023011009.3a648043-0ubuntu1 Priority: optional Section: web Source: aodh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: PKG OpenStack Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 31 Depends: lsb-base, python3-aodh (= 1:15.0.0+git2023011009.3a648043-0ubuntu1) Filename: pool/main/a/aodh/aodh-notifier_15.0.0+git2023011009.3a648043-0ubuntu1_all.deb Size: 5356 MD5sum: 10cdc054ea31411d1ab7c20622b3bd9d SHA1: 87b0ad0ab042bd23c3b891e432b0d29ecd6bd8f0 SHA256: b153f90306cc8c97b9e148432c618485e8334868af4858de7f678d17e8605dc8 SHA512: 5f8cc5fcbde79bc9ec627d40cda0a241e15f5c3ef37d383b7ab5c903e111072c844b9cb227e09180d5ecea8e3ef18f557f76fefbc35eb1f5328739b9f2e52d5b Homepage: https://opendev.org/openstack/aodh Description: OpenStack Telemetry (Ceilometer) Alarming - alarm notifier Description-md5: 208a8b4aba2f6446389952d8bdf9281e Package: apache2 Architecture: amd64 Version: 2.4.55-1ubuntu1 Priority: optional Section: web Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 461 Provides: httpd, httpd-cgi Pre-Depends: init-system-helpers (>= 1.54~) Depends: apache2-bin (= 2.4.55-1ubuntu1), apache2-data (= 2.4.55-1ubuntu1), apache2-utils (= 2.4.55-1ubuntu1), lsb-base, media-types, perl:any, procps Recommends: ssl-cert Suggests: apache2-doc, apache2-suexec-pristine | apache2-suexec-custom, www-browser, ufw Filename: pool/main/a/apache2/apache2_2.4.55-1ubuntu1_amd64.deb Size: 96994 MD5sum: 81d9f1e8602e4e8e6e336dd66412ac22 SHA1: 53ed5af00033dee7aced401e4eca4b4358069ca1 SHA256: 2dbe2c862e2c3501bfcef8f22c6ebb486df9992a435d4336bd394883753c5ee4 SHA512: 902727867a4864ec603b29a0fb502a6268a1759c805582ec45ad28ca801e91bf6bfba0765bae618655cf100a2d548814db49c80f4b377579c4c5efae7fecca88 Homepage: https://httpd.apache.org/ Description: Apache HTTP Server Task: lamp-server Description-md5: d02426bc360345e5acd45367716dc35c Package: apache2-bin Architecture: amd64 Version: 2.4.55-1ubuntu1 Priority: optional Section: httpd Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 5020 Provides: apache2-api-20120211, apache2-api-20120211-openssl1.1 Depends: perl:any, libapr1 (>= 1.7.0), libaprutil1 (>= 1.6.0), libaprutil1-dbd-sqlite3 | libaprutil1-dbd-mysql | libaprutil1-dbd-odbc | libaprutil1-dbd-pgsql | libaprutil1-dbd-freetds, libaprutil1-ldap, libbrotli1 (>= 0.6.0), libc6 (>= 2.36), libcrypt1 (>= 1:4.1.0), libcurl4 (>= 7.28.0), libjansson4 (>= 2.14), libldap2 (>= 2.6.2), liblua5.3-0, libnghttp2-14 (>= 1.50.0), libpcre2-8-0 (>= 10.22), libssl3 (>= 3.0.0), libxml2 (>= 2.7.4), zlib1g (>= 1:1.1.4) Suggests: apache2-doc, apache2-suexec-pristine | apache2-suexec-custom, www-browser Filename: pool/main/a/apache2/apache2-bin_2.4.55-1ubuntu1_amd64.deb Size: 1333214 MD5sum: 0900580b4f6e9fb68913f76b53dd80b0 SHA1: e0305a544981fad98054499e501a7cf4f512e569 SHA256: 0248f4ff4ce228699f8de7d669424e607b6ad825c629a02391d8dccc96a02707 SHA512: 50d8bd9efa5f7919e24e8ffd77aa225d3eadd60993913f16f11af07dd712c98997176b81def2e21ea4f776ac88854014fb0b4d12f355f035a86d52ee9e04ad07 Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (modules and other binary files) Task: lamp-server, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi Description-md5: 37901ca6bbb9305b61d0920ecc08204f Package: apache2-data Architecture: all Version: 2.4.55-1ubuntu1 Multi-Arch: foreign Priority: optional Section: httpd Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 857 Filename: pool/main/a/apache2/apache2-data_2.4.55-1ubuntu1_all.deb Size: 163258 MD5sum: 059aed39773f37c5a49063391b5f51ae SHA1: 8d6fe4567089f7795db1b83f6df93dd2f0f7d231 SHA256: c8cb9b9ee0c2a3502426372b22d99316471b77b55b8637dc3758fabd964884c2 SHA512: 47dd999dd858779e7944a4b93009ea779268108cba26d921fe904bf9fca9fe87b176d4632804dcd60855d5897c2b31c32ad5a1cfb9722ed66c76d66213dc0fca Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (common files) Task: lamp-server Description-md5: 9f2fab36019a61312dec627d1cd80365 Package: apache2-dev Architecture: amd64 Version: 2.4.55-1ubuntu1 Priority: optional Section: httpd Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 987 Provides: dh-apache2 Depends: debhelper (>= 10), libapr1-dev, libaprutil1-dev, libpcre2-dev, openssl, perl:any Filename: pool/main/a/apache2/apache2-dev_2.4.55-1ubuntu1_amd64.deb Size: 191264 MD5sum: 4201f84444b7f65446e778724e07c744 SHA1: e9cad32d30e2404d442b10f4bf9ebd2ed6e8c9ac SHA256: 795f088615564f4dbd96a16df7b0b95c89a2de3031690751e9e584f357c7d413 SHA512: 36fe4c5e183e6f809c9e7e133eae48f7ca08e2aa40a388074eae9cce2863bb09b9cfdab17b587613425a6bba33faa7a78b6b4a02758268a7235ce0e661d4927f Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (development headers) Description-md5: 8ba6f3b272c39cc7a08a802594285f02 Package: apache2-doc Architecture: all Version: 2.4.55-1ubuntu1 Priority: optional Section: doc Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 25017 Recommends: apache2 Filename: pool/main/a/apache2/apache2-doc_2.4.55-1ubuntu1_all.deb Size: 3879264 MD5sum: 6c8fe83190dc9fbbf0f640997dd0f7f8 SHA1: e4bb9cc61074b00e3bf9fe1326b6bb5c6e6332a8 SHA256: 4e33a56028fb80e6d14ba6e00322882f45fb76eb9a63264b7e9b6faf23d2b0be SHA512: 42bc0077217c5483b30da952861d3f68090aca066db02ee928100aa9fba3d0234cfd4c30429f52fcf3fff9bc5a914c5a92f215435896cd84265160e92072ab2b Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (on-site documentation) Description-md5: 04f8562fb3fd21e5886e40af9aeb7b7d Package: apache2-ssl-dev Architecture: amd64 Version: 2.4.55-1ubuntu1 Multi-Arch: same Priority: optional Section: httpd Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 13 Depends: apache2-dev (= 2.4.55-1ubuntu1), libssl-dev Filename: pool/main/a/apache2/apache2-ssl-dev_2.4.55-1ubuntu1_amd64.deb Size: 2988 MD5sum: 9d0a5dfcd62b870b1f3447f45225b472 SHA1: dce2e54ac6400b04809e5aea3d3d1c986069517c SHA256: 1164c1004457de49d1e011b057d33c7a89dd5e921fd8ec320d2691c857ab6b7d SHA512: 3bef92f5abb8249cb028b126b44872e1ff023e08ce7608e9a16303d566b6edf6aa972f0524f359bb73948eef54e65baa2d3df0127ed19c35047b25c36927e91a Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (mod_ssl development headers) Description-md5: 160d9bdafec462b08db62740b1eb83d2 Package: apache2-utils Architecture: amd64 Version: 2.4.55-1ubuntu1 Multi-Arch: foreign Priority: optional Section: net Source: apache2 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Apache Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 321 Depends: libapr1 (>= 1.4.8-2~), libaprutil1 (>= 1.5.0), libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libssl3 (>= 3.0.0) Filename: pool/main/a/apache2/apache2-utils_2.4.55-1ubuntu1_amd64.deb Size: 87566 MD5sum: 24b07bda726d552b21600c8441b1bfc7 SHA1: be24068d9e30c73cc04a223382f86336f55e8fc2 SHA256: 6d0647b2bd036ab41562b59eb88d40c081b0c325d90972dd4819a23b7fe70c1b SHA512: 3b46ab7cc62cef6d5263f182e904d5fdf364cfd6b32f18dc85a350dab9a198d4d4a73a03437792099db4c3f9caeab71351657b1ae6717a53d1a6a941b0c31595 Homepage: https://httpd.apache.org/ Description: Apache HTTP Server (utility programs for web servers) Task: lamp-server Description-md5: f1e2440381fa90571f125990da6a52fc Package: apg Architecture: amd64 Version: 2.2.3.dfsg.1-5build2 Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Marc Haber Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 114 Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0) Filename: pool/main/a/apg/apg_2.2.3.dfsg.1-5build2_amd64.deb Size: 41312 MD5sum: 5e60fd9756c3f7adef62f98d3afde370 SHA1: cf8a3529578e87c9f1cb1de78ce5dffb5d7ffe35 SHA256: 92b20f05824ffb591d0f79dbf0b55650a356cab37ec605a50db33ed00aa9c0e1 SHA512: dda69f17058d8475210ab44acad9a509f27c16cc11a025b363a07dd23120a45979e9a1ab7430234f5fedc80c5c0f2d2cba99b4f0d9baae4c02187b4d3e7368e8 Homepage: http://www.adel.nursat.kz/apg/ Description: Automated Password Generator - Standalone version Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: d919baea3108b57df48112b188dca442 Package: apparmor Architecture: amd64 Version: 3.0.8-1ubuntu1 Priority: standard Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian AppArmor Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2516 Depends: debconf, lsb-base, debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.36) Suggests: apparmor-profiles-extra, apparmor-utils Breaks: apparmor-profiles-extra (<< 1.21), fcitx-data (<< 1:4.2.9.1-1ubuntu2), snapd (<< 2.44.3+20.04~) Replaces: fcitx-data (<< 1:4.2.9.1-1ubuntu2) Filename: pool/main/a/apparmor/apparmor_3.0.8-1ubuntu1_amd64.deb Size: 577454 MD5sum: 63fe931cd2b961be6bf37cc2d85c8e17 SHA1: 43a6ecab8a85ad7769e62cf0001393c0183a7246 SHA256: 61d360ea427e1ccab6c399e3ea41a618d3e6bf38b164a245a9cb8ba851892448 SHA512: 1bfafd591a4553d24be55cbee672caaa2144ebd6fef7a629fdf1029427e415f0454703639a7d53b6184696fb0a4fabac5601880b6e9bb5d9bc77ec8e53faeba4 Homepage: https://apparmor.net/ Description: user-space parser utility for AppArmor Task: standard, server-minimal, ubuntu-wsl, edubuntu-wsl Description-md5: 9fdfbb456943ca7bfea9e5fd580a5b7f Package: apparmor-profiles Architecture: all Version: 3.0.8-1ubuntu1 Priority: extra Section: admin Source: apparmor Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian AppArmor Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 308 Depends: apparmor Filename: pool/main/a/apparmor/apparmor-profiles_3.0.8-1ubuntu1_all.deb Size: 32880 MD5sum: a0893e0793a2766032b20666db81d2c3 SHA1: 08b0999ed649b243cfb7e1a2be80bc387a0182ea SHA256: 68a3f366b21464dadf3777dd1a9bbb22ed6beb019d40fd97750d00910cb8897a SHA512: a7f294edb55a61f06226da604239c429fabb83072e81e051744a4dc69c0ae0facfa551872f15c41305c691ff6d65a2df5b0770ee8803dc09e68e41c36a652fac Homepage: https://apparmor.net/ Description: experimental profiles for AppArmor security policies Description-md5: 78f6c983f4960b57c9594cf926fa3202 Package: apparmor-utils Architecture: all Version: 3.0.8-1ubuntu1 Priority: optional Section: admin Source: apparmor Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian AppArmor Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 340 Provides: apparmor-easyprof Depends: apparmor, python3-apparmor (= 3.0.8-1ubuntu1), python3:any Suggests: vim-addon-manager Breaks: apparmor-easyprof (<< 3.0.3-4) Replaces: apparmor-easyprof (<< 3.0.3-4) Filename: pool/main/a/apparmor/apparmor-utils_3.0.8-1ubuntu1_all.deb Size: 58278 MD5sum: c2f3e189d14868dc50938df164f832e2 SHA1: bb37d01730fec968a462131c110d7dac46dc4389 SHA256: 62c690e2b87f39d6053d516094067047a58092fe78785083006d3c24ea6b7ecd SHA512: c5a7ce94f4780f0347566a63097c62191565dd2a72b14832ae711674ec351bcecdd34a43834f60296549491477fce258a9088ad4205478f5fa6cd3bc120a8f6c Homepage: https://apparmor.net/ Description: utilities for controlling AppArmor Description-md5: 71fe4226310f7a4cda967aa2477bddb8 Package: apport Architecture: all Version: 2.26.0-0ubuntu2 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 652 Provides: core-dump-handler Pre-Depends: init-system-helpers (>= 1.54~) Depends: gir1.2-glib-2.0 (>= 1.29.17), python3, python3-apport (>= 2.26.0-0ubuntu2), python3-gi, sensible-utils Recommends: apport-symptoms, python3-systemd Suggests: apport-gtk | apport-kde, pkexec, polkitd Conflicts: core-dump-handler Breaks: python-apport (<< 2.2-0ubuntu1) Replaces: core-dump-handler, python-apport (<< 2.2-0ubuntu1) Filename: pool/main/a/apport/apport_2.26.0-0ubuntu2_all.deb Size: 82100 MD5sum: d2406c2c6f8100070836f525ea02f294 SHA1: 4e275c27a795817106e77397057dfe2fca6112c3 SHA256: 32144459ee3053cc75e3ba0e7da493a91fb36b8198d4bed7a2c609b032d36a8c SHA512: 9cff869ff5008e42ca05b22ea9f66042d8ad1d55c70b7a4e6081b8be4f6bf0602445c75dfd447ab8ec695f965fc9338187a3ff4682075990e4ca98b07f73ce64 Homepage: https://wiki.ubuntu.com/Apport Description: automatically generate crash reports for debugging Task: server-minimal, ubuntu-desktop-minimal, ubuntu-desktop, cloud-image, ubuntu-desktop-raspi, ubuntu-wsl, server, ubuntu-server-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl, edubuntu-server-raspi Description-md5: c04626471654f9246cf5e28b560d262e Package: apport-gtk Architecture: all Version: 2.26.0-0ubuntu2 Priority: optional Section: gnome Source: apport Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 75 Depends: apport (>= 0.41), gir1.2-gtk-3.0 (>= 3.1.90), gir1.2-wnck-3.0, gnome-terminal | x-terminal-emulator, procps, python3, python3-apport (>= 2.26.0-0ubuntu2), python3-gi, whoopsie-preferences Recommends: gdb | gdb-minimal, update-notifier Filename: pool/main/a/apport/apport-gtk_2.26.0-0ubuntu2_all.deb Size: 9810 MD5sum: ce7824a92f335217077a46408b58f718 SHA1: 18cee2a9e38ddcb04c91238ddc7ad4d2eb99fbce SHA256: 7ae13da268a6cf51c402c8c7f90f06481ed47698f78d28897729be22718ac222 SHA512: 457923ed24717e1ad497ef784318a5f0a3fd3657cdbbdead55d081299ead39db78b0e6910e4285c96538f7b38e08389da67cd1a70406d75dbba035d7cdebad25 Homepage: https://wiki.ubuntu.com/Apport Description: GTK+ frontend for the apport crash report system Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 2f45e17d5bf22355d7921dba196ae6dd Package: apport-retrace Architecture: all Version: 2.26.0-0ubuntu2 Priority: optional Section: devel Source: apport Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 66 Depends: apt, binutils, dpkg-dev, gdb, libc6-dbg | libc6-dbgsym | libc-dbg, python3, python3-apport (>= 2.26.0-0ubuntu2), python3-launchpadlib Suggests: gdb-multiarch Filename: pool/main/a/apport/apport-retrace_2.26.0-0ubuntu2_all.deb Size: 14096 MD5sum: 424349ea40e6e35df825f84fd742934e SHA1: f7daa3cbf7673cdaf0cf64333a016f0ff6d81340 SHA256: 1f96e2c34c164eb79abe320dbab93943be27965c98ec6451afd9a0e352511c14 SHA512: 0baf9c6c2d2e804ac79dde6967e8dcaf8d9789f3b4cf059bef1f691426a3fbd1662f9ba7c99afa0f9be5832031d11cf09bb3517036d00fc9a1a862c23a776aa7 Homepage: https://wiki.ubuntu.com/Apport Description: tools for reprocessing Apport crash reports Description-md5: 7608c287131a28c4611767ba61f02050 Package: apport-symptoms Architecture: all Version: 0.24 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 61 Recommends: apport Filename: pool/main/a/apport-symptoms/apport-symptoms_0.24_all.deb Size: 13532 MD5sum: 6ae2996a63e19f5b2a9b66e502855ac9 SHA1: b024d719eae2ca47567eb30fe419ff37c47bb30b SHA256: ba859cb315484a42eb27ab6461c51aef203438c59ee5c1185f08a6ee8be56256 SHA512: 0b01b3522d507ed872dd1611d2dc33f8156a929ff8629a6d138046560304a22df82f883fde481249a2bc053c36d2b953a36415545992694d1c1953fb6965b4d7 Homepage: https://wiki.ubuntu.com/Apport Description: symptom scripts for apport Task: ubuntu-desktop-minimal, ubuntu-desktop, cloud-image, ubuntu-desktop-raspi, ubuntu-wsl, server, ubuntu-server-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl, edubuntu-server-raspi Description-md5: 685dc189a71c0847d5bc525d477c0d11 Package: appstream Architecture: amd64 Version: 0.16.1-1 Multi-Arch: foreign Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Matthias Klumpp Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 308 Depends: shared-mime-info, libappstream4 (>= 0.16.0), libc6 (>= 2.34), libglib2.0-0 (>= 2.62) Suggests: apt-config-icons Filename: pool/main/a/appstream/appstream_0.16.1-1_amd64.deb Size: 65046 MD5sum: a557d7b39af79823d8d168c6963c2c92 SHA1: 8817deb75a303968fd46c86a9bb1b44b48d12ea9 SHA256: c563d8a484ebdb2a9b8696a64b250be3420a5ab332a7cfb2245577d3de518b74 SHA512: a755a15c3a69cc04a0e8e09de46de478c252691eda339bface2626cb2ab6301ca76a0867131cbc0e5c55bb9fcf372bd1f208e0802eecdc04e2b1924bce295481 Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ Description: Software component metadata management Task: ubuntu-desktop-minimal, ubuntu-desktop, kubuntu-desktop, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 7cf2fff1862d6e9404e1ca39507a24b4 Package: apt Architecture: amd64 Version: 2.5.5 Priority: important Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: APT Development Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 4084 Provides: apt-transport-https (= 2.5.5) Depends: base-passwd (>= 3.6.1) | adduser, gpgv | gpgv2 | gpgv1, libapt-pkg6.0 (>= 2.5.5), ubuntu-keyring, libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libgnutls30 (>= 3.7.5), libseccomp2 (>= 2.4.2), libstdc++6 (>= 11), libsystemd0 Recommends: ca-certificates Suggests: apt-doc, aptitude | synaptic | wajig, dpkg-dev (>= 1.17.2), gnupg | gnupg2 | gnupg1, powermgmt-base Breaks: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~), aptitude (<< 0.8.10) Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~) Filename: pool/main/a/apt/apt_2.5.5_amd64.deb Size: 1377746 MD5sum: 3a1cf46b2a9c382e1bee2f2c6210d074 SHA1: 5589ec67ec8aeeffaf1cd9d5f28be0c44d42efb4 SHA256: 6e7e9893c2bcc2ce4f48a5534365dc4cc59e024407151709111dbfed9d6ab54f SHA512: 19b9dc0d32b77d6fdc085b584a4a05a88b26537aa98582d37c9e5a3a26a9420ee443bbd3fab291d8a15679f1bcd55033a49d5242b37d3dcd22c263722e9fb6f8 Description: commandline package manager Task: minimal, server-minimal Description-md5: 9fb97a88cb7383934ef963352b53b4a7 Build-Essential: yes Package: apt-config-icons Architecture: all Version: 0.16.1-1 Multi-Arch: foreign Priority: optional Section: misc Source: appstream Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Matthias Klumpp Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 22 Depends: appstream Filename: pool/main/a/appstream/apt-config-icons_0.16.1-1_all.deb Size: 4328 MD5sum: daf3cd3c04e1205f032adaf326d17172 SHA1: a7cafcf0bcc744aeb94cbd8cf1ba04ecdcd074cd SHA256: adb382f1d75a96682ae56d4b4e00d9c37e8ea3d8a212af79dd859ab1b209f9ea SHA512: ce236229cc45feb5884254cd1033c2c8a504998b6473d0789c572d713355860529fc2fd0ae457d66f1642f037f058a057ed87c58897a6194d9e3175724ef9e9c Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ Description: APT configuration snippet to enable icon downloads Task: ubuntu-desktop-minimal, ubuntu-desktop, kubuntu-desktop, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 03510f8a8354e1f4deb8a2144b1bfccd Package: apt-config-icons-hidpi Architecture: all Version: 0.16.1-1 Multi-Arch: foreign Priority: optional Section: misc Source: appstream Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Matthias Klumpp Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 22 Depends: apt-config-icons Filename: pool/main/a/appstream/apt-config-icons-hidpi_0.16.1-1_all.deb Size: 4252 MD5sum: a2293cc189a72e968395804d27d2bf00 SHA1: be8e8a52990ae16faf15501b45731e0b1390b227 SHA256: 502d8a314448ed1500d00419e53ba9223559c38d76cbfd61e64973abb203c5dc SHA512: 3018f86ee6b1e81b2dd8510c00ff573989430b9583b2f33011ed2bf87286a16a9cd4a3796addc3bc13b04b758a57ae5acc641ba0a8fa7f01c1691778f4457b58 Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ Description: APT configuration snippet to enable HiDPI icon downloads Task: ubuntu-desktop-minimal, ubuntu-desktop, kubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: f4ec6f28950e637dfd5449cd51f99da6 Package: apt-config-icons-large Architecture: all Version: 0.16.1-1 Multi-Arch: foreign Priority: optional Section: misc Source: appstream Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Matthias Klumpp Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 22 Depends: apt-config-icons Filename: pool/main/a/appstream/apt-config-icons-large_0.16.1-1_all.deb Size: 4328 MD5sum: 5f2b85cf045d4e56ea3f42826956fd20 SHA1: 7494c0e4d8c409684bfbec0566fe132e44ef4a64 SHA256: 269fbe7bc986b980eda132a70e6248487b86d2a3fcc38d9f801dcd861919f628 SHA512: b6efd09862e5a748aa73873d19eb0deaa27913a2021cd807714dcdc2328aac5a0369a59ef9f36a4cb64a7ab0444c6a649bf42906cd4c653922d7639c72257495 Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ Description: APT configuration snippet to enable large icon downloads Task: kubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop Description-md5: 312885bc524717b7027c2fe671b95722 Package: apt-config-icons-large-hidpi Architecture: all Version: 0.16.1-1 Multi-Arch: foreign Priority: optional Section: misc Source: appstream Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Matthias Klumpp Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 22 Depends: apt-config-icons-large Filename: pool/main/a/appstream/apt-config-icons-large-hidpi_0.16.1-1_all.deb Size: 4336 MD5sum: 5df482680299b74888a0a1478caf4b61 SHA1: b52047ff60eb7a56e9a71abe730ebfca8527e745 SHA256: cfc52c397611017810a8ca9aee0b57481ab6bb2f9e558a348ce92518166dcf2f SHA512: 1179a27da3403fb6feef88eb1ea7d1596e7cfd84d5a93acbec198af9ca2a8296b8714692b6ecf86fb53ab3b97319c44c02a76051d5a5cc2ed1941b97cd035fa6 Homepage: https://www.freedesktop.org/wiki/Distributions/AppStream/ Description: APT configuration snippet to enable large HiDPI icon downloads Task: kubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop Description-md5: b7a62cf01b94c27d588655efba2acacb Package: apt-doc Architecture: all Version: 2.5.5 Multi-Arch: foreign Priority: optional Section: doc Source: apt Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: APT Development Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 794 Filename: pool/main/a/apt/apt-doc_2.5.5_all.deb Size: 240112 MD5sum: 927050c956a945ab5baab7cc1d6c4ffc SHA1: 899cdbfa26e4721cd4a2504edc5b7e87ba65d7d9 SHA256: 4f3c23fb5507832b1ad5fa7642bd8f7d22a0211f831cbcecb7cb68b51d045de0 SHA512: 95b9409fcc293f60ca0a0953c715ff6033ee50dc5d7db5f72e63c9090830bb43e658d1bc65871c996bc42369cfc5121c49cd54b8e4c04f0428d42cf61167b446 Description: documentation for APT Description-md5: bc2b838ed28e60af95d78926380a3300 Package: apt-listchanges Architecture: all Version: 3.24 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian QA Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 416 Depends: apt (>= 0.5.3), python3-apt (>= 0.7.93), python3-debconf, sensible-utils, ucf (>= 0.28), debconf (>= 0.5) | debconf-2.0, python3:any (>= 3.7~) Suggests: default-mta | mail-transport-agent, python3-gi, www-browser, x-terminal-emulator Filename: pool/main/a/apt-listchanges/apt-listchanges_3.24_all.deb Size: 85340 MD5sum: ee12ed88b012f067ef853085b28dfd9a SHA1: ceeeafbcf9f8e4808e1cd39ca233cc64075a2fec SHA256: e52efcb34e56111a08a9617a795a23fcf627c6bb92dba86f8c1a8d6cf7f56f22 SHA512: 8190daa83e3cec5a415ff173db9f673bd7d85a788305972e4cc1e18e1f6e40794ccf692d25159d3564b38ff0f99834284c519f0d033959f555e0a6e8e2fba0ec Description: package change history notification tool Description-md5: ff242d11e25a826706c61be7ebf92ad4 Package: apt-utils Architecture: amd64 Version: 2.5.5 Priority: important Section: admin Source: apt Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: APT Development Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 648 Depends: apt (= 2.5.5), libapt-pkg6.0 (>= 2.5.5), libc6 (>= 2.34), libdb5.3, libgcc-s1 (>= 3.3.1), libstdc++6 (>= 11) Filename: pool/main/a/apt/apt-utils_2.5.5_amd64.deb Size: 207736 MD5sum: 2afad1c5e4dd67ea34235f7a7c915e94 SHA1: 22984740ce1ce0dfaeaddba2476e202fd5d4207c SHA256: 1e45b8daf68b600f26c72ea7fce01595a01f9bb4c40cd236c331d365387ee93a SHA512: 232184fb17b97b0c9e21033f0d27f0f8c0f51e28895799d389140b60b6063f97db8324a24d8013e59d69865ef1390cf8e5dd4e9e300c9ba6e1b451318ac092ab Description: package management related utility programs Task: minimal Description-md5: fa0295dc4e40dbbea6c84f614c570636 Package: aptdaemon Architecture: all Version: 1.1.1+bzr982-0ubuntu42 Priority: extra Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Julian Andres Klode Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 156 Depends: python3:any (>= 3.2~), gir1.2-glib-2.0, python3-aptdaemon (= 1.1.1+bzr982-0ubuntu42), python3-gi, policykit-1 Breaks: python3-aptdaemon.pkcompat, software-center (<< 1.1.21) Replaces: python3-aptdaemon.pkcompat Filename: pool/main/a/aptdaemon/aptdaemon_1.1.1+bzr982-0ubuntu42_all.deb Size: 12624 MD5sum: a8d811e7f072b2f1ab50222439d3773d SHA1: df08a429f9d9ab799a1ac08477d518cb493567d2 SHA256: 70e4b847e30fc1f2887c8d4e8e16e373b00a0c35bc3095d0cfbaa2c9c7eb59f2 SHA512: e0c56561ed24410b96dc138a96c979b113a043ffcaec6d1dddc3707e6c136aa43cd8400cdc82ed9660ee296656743a449584a6fa3d3b27447050a1591ea97e03 Homepage: https://launchpad.net/aptdaemon Description: transaction based package management service Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, lubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 5ed476246aefb12d0c1b0deb4818778b Package: aptdaemon-data Architecture: all Version: 1.1.1+bzr982-0ubuntu42 Priority: extra Section: admin Source: aptdaemon Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Julian Andres Klode Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 228 Replaces: python-aptdaemon-gtk (<= 0.41+bzr580-0ubuntu1) Filename: pool/main/a/aptdaemon/aptdaemon-data_1.1.1+bzr982-0ubuntu42_all.deb Size: 158968 MD5sum: a35f81b578ee0684bc2ddee816305c66 SHA1: 25b63dbf80c771a435d675d620930ebfbd75e8e2 SHA256: 170c5dc3d4d6e2f9ea3da1696ebf8602a291e32b658c21186bdc862bdd98f04b SHA512: aae1321c1b5e163a7ffa11b57555be92c41af904edeb86fe4d2671410b69a286801514087b6df3d54c277b65dc4c1ed98d9f8a8a58c5bb502872152aa8d4166c Homepage: https://launchpad.net/aptdaemon Description: data files for clients Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 3985974f0d80501bf717f4eee701d6e5 Package: aspell Architecture: amd64 Version: 0.60.8-4build1 Multi-Arch: foreign Priority: optional Section: text Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Agustin Martin Domingo Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 344 Provides: aspell-bin Depends: libaspell15 (= 0.60.8-4build1), libc6 (>= 2.34), libncursesw6 (>= 6), libstdc++6 (>= 5), libtinfo6 (>= 6), dictionaries-common Recommends: aspell-en | aspell-dictionary | aspell6a-dictionary Suggests: aspell-doc, spellutils Breaks: aspell-bin (<< 0.60.3-2) Replaces: aspell-bin (<< 0.60.3-2) Filename: pool/main/a/aspell/aspell_0.60.8-4build1_amd64.deb Size: 87722 MD5sum: 286bcb5cd1b8d3e02a8bf391929ce632 SHA1: a27c6bf452db35463feedbbfd83b6de38b861795 SHA256: 324dc61f6f80eca1e97a83353edd6310fd675a55043b1445a2775f4429411ece SHA512: b3c55cd8867fe7e63ed569055547d6db6ff92dcb72740f7ac49317c4263e46c0c4d86834dddca5986e8ea8bce94589e8e95f5e3372c16ba2896b9ae00ad9ac8b Homepage: http://aspell.net/ Description: GNU Aspell spell-checker Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 21dcab5448cba7f61ba8df4ace46f1af Package: aspell-doc Architecture: all Version: 0.60.8-4build1 Multi-Arch: foreign Priority: optional Section: doc Source: aspell Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Agustin Martin Domingo Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 926 Suggests: aspell Filename: pool/main/a/aspell/aspell-doc_0.60.8-4build1_all.deb Size: 196436 MD5sum: c36f5bfe4b63ddf470186f9b2691b018 SHA1: c51fa09ef100e556682782b7addff75a34634a89 SHA256: ec9bf9c05e202e45b1082d2b3ac0e8976ae8ea169b1ce0d3185c00159edd7fdf SHA512: 278aa4bde1bb9f9bc97d13772fc89f6d106eadce0c9becb1a7af94d48ccce351b30bcd187bc3bcd21247620956624227ff258d4dc9f1c028a3a21170dc43cd4e Homepage: http://aspell.net/ Description: Documentation for GNU Aspell spell-checker Description-md5: 33c68b861d6f2e2ef1b189909b98b741 Package: aspell-en Architecture: all Version: 2018.04.16-0-1 Multi-Arch: foreign Priority: optional Section: text Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Brian Nelson Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 424 Provides: aspell-dictionary Depends: aspell (>= 0.60.3-2), dictionaries-common (>= 0.49.2) Filename: pool/main/a/aspell-en/aspell-en_2018.04.16-0-1_all.deb Size: 298756 MD5sum: fe7725f8689fdbafc1df8c8dcf9323d9 SHA1: 1dbc1af78beb4e9966384912d1456f41fc904365 SHA256: 1166a27776c25bf2fd0936ddf9432d12dae0c66bb2d8b3d31693d49d03ccb206 SHA512: 3b73056289ef945b3c19544a2080e06c4d425bcda9cf1ae6cac3d5c064432703acad919234c5a74d07d9b9c9c0e7714dfc057f14ac16e8ef590d8f4712bb0985 Homepage: http://aspell.net/ Description: English dictionary for GNU Aspell Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: c94b13744f65f4d57e191f183fc7c9c9 Package: at-spi2-common Architecture: all Version: 2.46.0-5 Multi-Arch: foreign Priority: optional Section: misc Source: at-spi2-core Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Accessibility Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 48 Breaks: at-spi2-core (<< 2.46.0-2~) Replaces: at-spi2-core (<< 2.46.0-2~) Filename: pool/main/a/at-spi2-core/at-spi2-common_2.46.0-5_all.deb Size: 4512 MD5sum: f9b55d32f7a22789b0d4f336f756bae1 SHA1: a289b36d514fe839f9b321f1d8440807f3011121 SHA256: 2a1c5ac68e241fcdf52c20a66c9b860b54c01040501549b27b2fb284aaf182ba SHA512: 9f707d5dc742be277a0f710227d7e6d9e4fd86d7c7d3c3d27d273156dbba5433b81e4d180531f15a8e078394cc9c2294826166e6191b0c4759c2a3932732dba4 Homepage: https://wiki.gnome.org/Accessibility Description: Assistive Technology Service Provider Interface (common files) Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, ubuntu-wsl, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl Description-md5: e21917f70a6f82bafaa4d2a3b1113b70 Package: at-spi2-core Architecture: amd64 Version: 2.46.0-5 Multi-Arch: foreign Priority: optional Section: misc Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Accessibility Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 175 Depends: libatspi2.0-0 (>= 2.9.90), libc6 (>= 2.34), libdbus-1-3 (>= 1.9.14), libglib2.0-0 (>= 2.67.4), libsystemd0, libx11-6, libxtst6, at-spi2-common, gsettings-desktop-schemas Filename: pool/main/a/at-spi2-core/at-spi2-core_2.46.0-5_amd64.deb Size: 56052 MD5sum: 9f1d4201e6943aef167d9855f9cdcb39 SHA1: 86ef6d8e05a25e99a2a2cd341b6fb88bc03ee792 SHA256: d3c936474cbad298a898875375528ab4608240a80ea78e1a99418beda901dbb9 SHA512: 5e327c3e7efc61042396421f1f572911688646ffa6efa2f918ec73c37cbc2d5d5a4017c77e0a24432e9e12616779ab8324f14a9f83bc82542a20b93b24491a37 Homepage: https://wiki.gnome.org/Accessibility Description: Assistive Technology Service Provider Interface (D-Bus core) Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, ubuntu-wsl, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl Description-md5: 625eaa824a47345f05012c25a5d0aca5 Package: at-spi2-doc Architecture: all Version: 2.46.0-5 Multi-Arch: foreign Priority: optional Section: misc Source: at-spi2-core Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Accessibility Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1159 Suggests: devhelp Filename: pool/main/a/at-spi2-core/at-spi2-doc_2.46.0-5_all.deb Size: 100012 MD5sum: a3c81965b94f15c18909205b5925fe18 SHA1: 075dd3b5bd6a0c95234a6e91161896f68260011b SHA256: 95e25f04ae0dafdc4971f843d4127ae0664035e721986ece4f389d72c57479d1 SHA512: e49365e5f1fb21d610e86fd2d89f7247d4b5e19d928a1556017c83637a5a1cbfcf7953845803c8efea7ddc93878baedfb74b14365cea959a505c22d595aed8d5 Homepage: https://wiki.gnome.org/Accessibility Description: Assistive Technology Service Provider Interface (Documentation) Description-md5: e4ecae3df3f427dece5859c37aad6173 Package: attr Architecture: amd64 Version: 1:2.5.1-4 Multi-Arch: foreign Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Guillem Jover Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 136 Depends: libattr1 (= 1:2.5.1-4), libc6 (>= 2.34) Filename: pool/main/a/attr/attr_2.5.1-4_amd64.deb Size: 22522 MD5sum: 52759f521cce1d9f72c422d754cc9ef9 SHA1: f092040ee22b2510ced886b59a41e9c0a052ef2f SHA256: 4a46867a52c3feec21b76c769f7b4a275c3a663781585a27f3237d94315726ca SHA512: a830263c2c44498c99b14ec2d030bfe40ed4bab38ab2441962784e32e77951904e143e84f4dc447541a69125c54b8a94e647980d80d2805d05572eb356784555 Homepage: https://savannah.nongnu.org/projects/attr/ Description: utilities for manipulating filesystem extended attributes Task: samba-server, ubuntukylin-desktop Description-md5: eba64610d62d0ff261b3286c19b2e130 Package: auditd Architecture: amd64 Version: 1:3.0.7-1.1 Priority: extra Section: admin Source: audit Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Laurent Bigonville Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 680 Pre-Depends: init-system-helpers (>= 1.54~) Depends: libaudit1 (= 1:3.0.7-1.1), libauparse0 (= 1:3.0.7-1.1), lsb-base (>= 3.0-6), mawk | gawk, libc6 (>= 2.34), libcap-ng0 (>= 0.7.9) Suggests: audispd-plugins Breaks: audispd-plugins (<< 1:3.0~) Filename: pool/main/a/audit/auditd_3.0.7-1.1_amd64.deb Size: 213120 MD5sum: 4c7357278f2e8ceaa4bdd8ef724d46d4 SHA1: bd0d36a74eb3c49850ff26b315cfc2575de94b65 SHA256: 4892357c4dc3ac7f11f37eb1d665ae907080394f94dd94d3be51369b60933e3d SHA512: 84f83170da18cc262df62741ae4c2ae9f632e625c52f2312d46be4eda2a554f1702a3b3fe141f6421db59305abe7da81e769d47feb6e1852f23603a8fbbc7cbf Homepage: https://people.redhat.com/sgrubb/audit/ Description: User space tools for security auditing Description-md5: 77aaff86394a1a8da0659fa99413f455 Package: authbind Architecture: amd64 Version: 2.1.3build1 Priority: extra Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Ian Jackson Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 77 Depends: libc6 (>= 2.34) Filename: pool/main/a/authbind/authbind_2.1.3build1_amd64.deb Size: 18668 MD5sum: 3cae49d03fff1dd88062670c123d2737 SHA1: bd6b61884294d05ed07462e28cc449395844044a SHA256: 78a265c4f908611621bb932b9bd8c6a653f4674acf1bf492e92c1cf20f38a97a SHA512: b8a62117bff6713d7a5bf62a0155a9671b36365179eeaf356a53f8f38684ec7052bef7e14a80d0d03f83b4e87800bd010b6d00aff0481e0ef6e903999a148a33 Description: Allows non-root programs to bind() to low ports Description-md5: 6ffd268fa04a5e344832e2275265da15 Package: autoconf Architecture: all Version: 2.71-3 Multi-Arch: foreign Priority: optional Section: devel Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian QA Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2024 Depends: perl (>> 5.005), m4 (>= 1.4.13), debianutils (>= 1.8) Recommends: automake | automaken Suggests: autoconf-archive, gnu-standards, autoconf-doc, libtool, gettext Breaks: gettext (<< 0.10.39), pkg-config (<< 0.25-1.1) Filename: pool/main/a/autoconf/autoconf_2.71-3_all.deb Size: 338946 MD5sum: 236e6a793a6ee85dae4507b067486a65 SHA1: d10a8d68662fb383109f6bc45df8673a763a36ca SHA256: cc3f9f7a1e576173fb59c36652c0a67c6426feae752b352404ba92dfcb1b26c9 SHA512: 646396c70a4546de5a331b247c74ba4dda573c419298127cf6b06bc349832aaea923a26159466c947a0b15125313284f3d4f9ba99ab83e7e352aacc64060aa2b Homepage: https://www.gnu.org/software/autoconf/ Description: automatic configure script builder Description-md5: 4336cf24a71f6337447f744a61a67166 Package: autoconf-doc Architecture: all Version: 2.71-3 Priority: optional Section: doc Source: autoconf Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian QA Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 4464 Depends: gnu-standards Filename: pool/main/a/autoconf/autoconf-doc_2.71-3_all.deb Size: 2912286 MD5sum: 2174eb953a8f2ef453c4f4dfd886a9f3 SHA1: c082fc4be7a79b6a1cb644f4a93c40c31cc20ded SHA256: dd49771be0c6c9e3e0ef30478ba14254f9358b0506b15af16f7885f8cca3ef61 SHA512: 1522ea38caf04e7e42bd0d8ed9b7fa9fed0d57f5f4d2e9b740bffe514a3b88a4313bd9c3fe61ab14252be1b8f670a6385ada4094e5523f1384a04897687aa701 Homepage: https://www.gnu.org/software/autoconf/ Description: automatic configure script builder documentation Description-md5: dc69587d1394618608d9fd7ec1c59833 Package: autodep8 Architecture: all Version: 0.28 Priority: optional Section: devel Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian CI team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 58 Depends: dctrl-tools Filename: pool/main/a/autodep8/autodep8_0.28_all.deb Size: 13244 MD5sum: 4e39ea97d0fcc2245a91f9422bdc75d2 SHA1: d0ee4fc1c4f8823bee8df59daefe1292b8794f16 SHA256: fce032baab994f35acebde70cca089cac1b6655c2982a212e37ee6be85eaf735 SHA512: 78cec73e68e848e3939549a347ee00ebfe84f08d58962da595d3f3156707b9c796d20d4105c0652135aa84a97d7187d2f7b026764551d83546df4accfb02c609 Description: DEP-8 test control file generator Description-md5: 23ed108774a3f3b958a6edfe8e71093f Package: autofs Architecture: amd64 Version: 5.1.8-1ubuntu4 Priority: extra Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Mike Gabriel Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 979 Provides: autofs5 Pre-Depends: init-system-helpers (>= 1.54~) Depends: libc6 (>= 2.34), libnsl2 (>= 1.0), libtirpc3 (>= 1.0.2), libxml2 (>= 2.7.4), ucf Recommends: nfs-common, kmod | module-init-tools, e2fsprogs Breaks: autofs5 (<< 5.0.6-1~) Replaces: autofs5 (<< 5.0.6-1~) Filename: pool/main/a/autofs/autofs_5.1.8-1ubuntu4_amd64.deb Size: 281046 MD5sum: 60680add6e2fea0b485cc262fc6f88b4 SHA1: cd8774472f02e135c394a8b9ad916e438b99d6e0 SHA256: 60accd9ef6c14afbff7bc5754d6366f440ae7fe8fbed601e6a910a3172049c5b SHA512: 6e355b5890507f3de32955b90031833df74f8fefc9f2d311aa3c741052a6b34d24595ac52278fc0bc8089986546dc84884a6d0a1e1cc743cb8bafac9f863fb30 Homepage: https://www.kernel.org/pub/linux/daemons/autofs/v5/ Description: kernel-based automounter for Linux Description-md5: c2943d4026686519e74f5ea404af6a90 Package: automake Architecture: all Version: 1:1.16.5-1.3 Multi-Arch: foreign Priority: optional Section: devel Source: automake-1.16 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Eric Dorland Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1581 Provides: automake-1.16, automaken Depends: autoconf, autotools-dev Suggests: autoconf-doc, gnu-standards Filename: pool/main/a/automake-1.16/automake_1.16.5-1.3_all.deb Size: 557936 MD5sum: eeea4b7cf5024babf73a4dd96a6f5790 SHA1: 0950f7e15117bd6f7167b11bcd12801a98111fbf SHA256: 59e3890fc8407bcf8ccc9f709d6513156346d5c942e8c624dc90435e58f6f978 SHA512: 078de0cb9f0393d8bdfa7d1b5db0eb718125e15a65bd6038866cb9f84b033440087cbcc8f773af2102a14c42dd71360b988986fbbc679bcabe1dfc1c66c5d931 Homepage: https://www.gnu.org/software/automake/ Description: Tool for generating GNU Standards-compliant Makefiles Description-md5: cab2176975a43b42c86cd4289740737e Package: autopkgtest Architecture: all Version: 5.25ubuntu4 Priority: optional Section: devel Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian CI team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 567 Depends: apt-utils, libdpkg-perl, procps, python3, python3-debian Recommends: autodep8, fakeroot Suggests: docker.io, fakemachine, lxc (>= 1:4.0.2-1~), lxd, ovmf, ovmf-ia32, python3-distro-info, qemu-efi-aarch64, qemu-efi-arm, qemu-system, qemu-utils, podman, schroot, util-linux (>= 2.38), vmdb2 (>= 0.22-1~) Breaks: debci (<< 1.7~) Filename: pool/main/a/autopkgtest/autopkgtest_5.25ubuntu4_all.deb Size: 154328 MD5sum: 07ef4b02a7ff2afcfc359edee010f670 SHA1: 926022221af682a864ab41f4acd2793b1b132f94 SHA256: 8b3c6a76be696cf036b3f57302ef0f664bf1a24da52044bdd513b3aa605ca814 SHA512: af5bfcedd714bdc6d4004a2f72a0a164ddc0f5b4f3a10a4f4f160fcabbfe6463fc70a5ab431fc4cf4424dba9452eb8fa360c569e69d09baa3d11ddb1ba0d7294 Description: automatic as-installed testing for Debian packages Description-md5: 31d9217a487d44cfd80f0588068648cd Package: autopoint Architecture: all Version: 0.21-11 Multi-Arch: foreign Priority: optional Section: devel Source: gettext Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Santiago Vila Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 444 Depends: xz-utils Replaces: gettext (<= 0.17-11) Filename: pool/main/g/gettext/autopoint_0.21-11_all.deb Size: 419944 MD5sum: d332e0e988db3450dcccd985f015c833 SHA1: b60187f51be7ad9f4e9a1c884fa9ed51f5ea222b SHA256: 0e48f50214cc160c6c0a49fb451bf46c5f440fbb0c64f12e056d8efa3c3d708a SHA512: 21453ff41cd59e382e67ad1dbbff425856400d5ae752e5183fce003664d1b14321864fcf85cf5cfd01b458408ca2f2fd976379cab7a23c104532d3fe7cab7d1e Homepage: https://www.gnu.org/software/gettext/ Description: tool for setting up gettext infrastructure in a source package Description-md5: 6cb55ac1308215a3073d2226782af37f Package: autotools-dev Architecture: all Version: 20220109.1 Multi-Arch: foreign Priority: optional Section: devel Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Henrique de Moraes Holschuh Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 134 Breaks: autoconf (<< 2.70~) Replaces: autoconf (<< 2.70~) Enhances: cdbs, debhelper Filename: pool/main/a/autotools-dev/autotools-dev_20220109.1_all.deb Size: 44886 MD5sum: 554dc72dc46c7ebd3caf852031a94fe8 SHA1: 2899e7c9989ee14a2be5a5a431a49498e1494084 SHA256: d909f0327b09d9a9136239caca975df89782fa28efd721c4eb4caea422d3fc5a SHA512: b3add366e8549028f8de8c1c21796ff1ed8831e3432dedac73e795e021bcd23fb0c4e5fcbaf6f512b21b2f5d1c747bc7bccad1719a3255988ff2d7f5ce81f3d4 Homepage: https://savannah.gnu.org/projects/config/ Description: Update infrastructure for config.{guess,sub} files Description-md5: 32ffa2f2f5e89ec7409d0b4d9086ce91 Package: avahi-autoipd Architecture: amd64 Version: 0.8-6ubuntu1 Priority: optional Section: net Source: avahi Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Utopia Maintenance Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 125 Depends: libc6 (>= 2.34), libdaemon0 (>= 0.14), adduser Recommends: isc-dhcp-client, iproute2 Conflicts: zeroconf Filename: pool/main/a/avahi/avahi-autoipd_0.8-6ubuntu1_amd64.deb Size: 40522 MD5sum: 7400e673d9000fe41e09cb84384915bf SHA1: d94fa1b50e80c05df1a1914f07c47ff419ad304c SHA256: 0e069e4b8d5701dedad9513f10dd5bfcb00708acc8ab42f23ecc73767376b755 SHA512: 15a81486996d0985066260a3618e566bc0e11489d74479d677cb22359fcb19757ba8e6be0482d9e2e95e18e3bd7f6578f707f10513d3ffe45ce42d18e14c47b9 Homepage: http://avahi.org/ Description: Avahi IPv4LL network address configuration daemon Task: ubuntu-desktop-minimal, ubuntu-desktop, kubuntu-desktop, kubuntu-full, xubuntu-minimal, xubuntu-desktop, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: acd046468650e18ecf72b9fbe41992f1 Package: avahi-daemon Architecture: amd64 Version: 0.8-6ubuntu1 Multi-Arch: foreign Priority: optional Section: net Source: avahi Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Utopia Maintenance Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 297 Pre-Depends: init-system-helpers (>= 1.54~) Depends: libavahi-common3 (= 0.8-6ubuntu1), libavahi-core7 (= 0.8-6ubuntu1), libc6 (>= 2.34), libcap2 (>= 1:2.16), libdaemon0 (>= 0.14), libdbus-1-3 (>= 1.9.14), libexpat1 (>= 2.0.1), adduser, default-dbus-system-bus | dbus-system-bus, bind9-host | host Recommends: libnss-mdns (>= 0.11) Suggests: avahi-autoipd Filename: pool/main/a/avahi/avahi-daemon_0.8-6ubuntu1_amd64.deb Size: 67858 MD5sum: 39512dcd8d8563aa595c50023d175d55 SHA1: d4d99d06070e71bf8c98ac06312854eaed900e85 SHA256: 3796c074daeacc6bafc74d78e19b1954d782a178139578f78eace959cae163e6 SHA512: e06944f805de966fdef959b272c38448dde89e41ceef176e4ff86f025779f502b3f947b440fb57ff4232438a5aff1374c0f3a6ddf37903930a53103b61bfb211 Homepage: http://avahi.org/ Description: Avahi mDNS/DNS-SD daemon Task: print-server, ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 13d651a25febc553220e03e75c6f4c7b Package: avahi-utils Architecture: amd64 Version: 0.8-6ubuntu1 Priority: optional Section: net Source: avahi Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Utopia Maintenance Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 169 Depends: libavahi-client3 (= 0.8-6ubuntu1), libavahi-common3 (= 0.8-6ubuntu1), libc6 (>= 2.34), libgdbm6 (>= 1.16), avahi-daemon (= 0.8-6ubuntu1) Filename: pool/main/a/avahi/avahi-utils_0.8-6ubuntu1_amd64.deb Size: 25978 MD5sum: f0e2b1d0e667ac8eec151fb35a43436e SHA1: c376a7a7f6b46efeedaf7670d54e66f836ee7d73 SHA256: 38ae191715d0769717646e296b290869ac169d2b4caf3bbccc390b6817e1156f SHA512: 431c1ed61fc0787e88fb10081fd88c457ffdcedbfddfc3a031a9094115ec7c4a5571db47baf3655fc78a1c49b9d266672d014e9cb5ce977fe47a0c1059c905fa Homepage: http://avahi.org/ Description: Avahi browsing, publishing and discovery utilities Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, lubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-live, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 58895f03e39692a5213ffb4d5bbc3564 Package: awstats Architecture: all Version: 7.8-3 Priority: optional Section: web Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian QA Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 6894 Depends: perl:any Recommends: libnet-xwhois-perl Suggests: apache2 | httpd, libnet-dns-perl, libnet-ip-perl, libgeo-ipfree-perl, liburi-perl Filename: pool/main/a/awstats/awstats_7.8-3_all.deb Size: 1865462 MD5sum: b631046ff487cfe09d9c7e1e98d162ab SHA1: 1878e1421fd910bad78d47d6bd5d690d35d83344 SHA256: b00d66eba71065a64c0ba80d7b2494f914a4f43e4b7cd0908b3274462073e631 SHA512: 6bc66b9bc8fd1c3375a582799ee68ddeaa2a91461a71c4efcd01d5884b01a2bd13312cbb0a764b27f0616cf81d2e93f36b9c8296f8f06a21400ee5bb77c51230 Homepage: http://awstats.sourceforge.net/ Description: powerful and featureful web server log analyzer Description-md5: 13563117d747b5d1acdce35986df9f8a Package: b43-fwcutter Architecture: amd64 Version: 1:019-8 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian QA Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 95 Depends: debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.34) Filename: pool/main/b/b43-fwcutter/b43-fwcutter_019-8_amd64.deb Size: 27650 MD5sum: c20372d309083e43ffc2ea837ca2ebb1 SHA1: d115d34e60ed82cd4054ecef5ca54e604fac0636 SHA256: ccf3a71f93d81d85aa2ff21ec994cb96296f40245cd4b0112b2e9c72b4a5b40c SHA512: 97dc5f33edf93dbd27fd5df9f3d86bd5b7c2cd0ba7b98508790a41370368bff3b4aebd3841fe33e91fe83f6d6731572a500e7e2cdf0f6dfbcdb44e4907079157 Homepage: https://wireless.wiki.kernel.org/en/users/drivers/b43 Description: utility for extracting Broadcom 43xx firmware Description-md5: 19713b4b3c64e57d9fe7a1aec56c25e1 Package: backuppc Architecture: amd64 Version: 4.4.0-8 Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian BackupPC Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 3144 Pre-Depends: init-system-helpers (>= 1.54~) Depends: adduser, apache2 | httpd, apache2-utils, backuppc-rsync (>= 3.1.3), bzip2, default-mta | exim4 | mail-transport-agent, iputils-ping | inetutils-ping, libarchive-zip-perl, libbackuppc-xs-perl (>= 0.62), libcgi-pm-perl, libfile-listing-perl, libtime-parsedate-perl, sysvinit-utils (>= 3.05-4~) | lsb-base, ucf, debconf (>= 0.5) | debconf-2.0, perl:any, libc6 (>= 2.34) Recommends: libio-dirent-perl, openssh-client | ssh-client, rrdtool, samba-common-bin, smbclient Suggests: certbot | acme-tiny | acmetool | dehydrated | lacme | lecm | lego, libscgi-perl, par2, rsync, w3m | www-browser Filename: pool/main/b/backuppc/backuppc_4.4.0-8_amd64.deb Size: 541816 MD5sum: 7176466890d8ac527646654fbaec9982 SHA1: dcef60b7e1cdbba9ed2d18c0fcd91a681418dab9 SHA256: 2f39b5b319c6cfa48c256754fc569ff2ab3c17b6fd9352870790250605135dad SHA512: 81db135957810962452f6d42e330a3c9a82270199acda5ac3a408296d0fda232d1b9f424f6da7d0760ccba59d9cdbbb37b8998c6e88f32968f8c47487b324986 Homepage: https://backuppc.github.io/backuppc/ Description: high-performance, enterprise-grade system for backing up PCs Description-md5: b6f406334b3551715e06ad0d1f9cbb05 Package: backuppc-rsync Architecture: amd64 Version: 3.1.3.0-3build1 Multi-Arch: foreign Priority: optional Section: net Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian BackupPC Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 543 Provides: rsync-bpc Depends: libacl1 (>= 2.2.23), libc6 (>= 2.34), libpopt0 (>= 1.14), zlib1g (>= 1:1.1.4) Conflicts: rsync-bpc Replaces: rsync-bpc Enhances: backuppc (>= 4) Filename: pool/main/b/backuppc-rsync/backuppc-rsync_3.1.3.0-3build1_amd64.deb Size: 256510 MD5sum: 81145fbf129c916428166d644bd3d834 SHA1: 2dfd28ed116b98aca0d0e2c7fd5c382184471246 SHA256: ac4b43d4791f35d0ddca9afd6ba4f6776059c554a9f67d89e075765b7b339871 SHA512: 6604597a09fb5442c11d421eed2e23d2e75e2ebcb8ee6b521bd7433910e1b6871679320f42b5dde8d0a8b313dbe9a6f8fc1244414139d9f1cf7a8e9a4eae0587 Homepage: https://github.com/backuppc/rsync-bpc Description: patched rsync for BackupPC version 4 Description-md5: fe2a5ada10b1f4a924327d9694186ade Package: xorg Architecture: amd64 Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 53 Provides: x-window-system, x-window-system-core Depends: xserver-xorg (>= 1:7.7+23ubuntu2), libgl1, libgl1-mesa-dri, libglu1-mesa, xfonts-base (>= 1:1.0.0-1), x11-apps, x11-session-utils, x11-utils, x11-xkb-utils, x11-xserver-utils, xauth, xinit, xfonts-utils, xkb-data, xorg-docs-core, gnome-terminal | xterm | x-terminal-emulator, xinput Recommends: xfonts-scalable (>= 1:1.0.0-1) Suggests: xorg-docs, xfonts-100dpi (>= 1:1.0.0-1), xfonts-75dpi (>= 1:1.0.0-1), x11-xfs-utils Filename: pool/main/x/xorg/xorg_7.7+23ubuntu2_amd64.deb Size: 2890 MD5sum: 679cd23718ee280efa9a2e00b772f904 SHA1: 8a1986481fac13059123c34d1cf042d5a820d1c9 SHA256: 99aa17f2845b5a3e650d391419a5e42e4ea7965333221bfa2d1f81cf2df08427 SHA512: 43169e13aef254b8e75db3951533b32dc7736db5d7c629b68bf4d04b3bb552833d3c4b637dc5dcb906c6392c342dd213fe673c880c20c97a161122e101b8dab7 Homepage: https://www.x.org/ Description: X.Org X Window System Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: f5abde5fb283cb96048a3d3a5fe06e17 Package: xorg-dev Architecture: all Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Source: xorg Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 47 Depends: libdmx-dev, libfontenc-dev, libfs-dev, libice-dev, libsm-dev, libx11-dev, libxau-dev, libxaw7-dev, libxcomposite-dev, libxcursor-dev, libxdamage-dev, libxdmcp-dev, libxext-dev, libxfixes-dev, libxfont-dev, libxft-dev, libxi-dev, libxinerama-dev, libxkbfile-dev, libxmu-dev, libxmuu-dev, libxpm-dev, libxrandr-dev, libxrender-dev, libxres-dev, libxss-dev, libxt-dev, libxtst-dev, libxv-dev, libxvmc-dev, libxxf86dga-dev, libxxf86vm-dev, x11proto-dev, xserver-xorg-dev, xtrans-dev Filename: pool/main/x/xorg/xorg-dev_7.7+23ubuntu2_all.deb Size: 4262 MD5sum: f855a5cbf7795618868c010c8666fc84 SHA1: d945a590f1bad18760af1b765263407fab6d5b9a SHA256: a294f82e6fd6a8ffff7c361ab5e4802a519afd687e0de4b025607ea5009b556e SHA512: a4449e23a12aab79ccbb6b9fa7a97f0cf518f8448f55e9165b40b4ffa6445cbd4152902aa51f0d09d26d41aece4b0c395a605e75c7b1d23ca07c6a04ed588774 Homepage: https://www.x.org/ Description: X.Org X Window System development libraries Description-md5: 00a974084948001400546a402cbefdb1 Package: xorg-docs Architecture: all Version: 1:1.7.1-1.2 Multi-Arch: foreign Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1996 Conflicts: xprt-xprintorg (<= 1:0.1.0.alpha1-10) Replaces: xprt-xprintorg (<= 1:0.1.0.alpha1-10), xspecs (<= 1:1.2+git20061105-2) Filename: pool/main/x/xorg-docs/xorg-docs_1.7.1-1.2_all.deb Size: 1119264 MD5sum: b9d08e6e9bb5c19ff2b84cafe9d650b6 SHA1: 55a169ac20716fb350c4a72902756868a2492fae SHA256: 78cf229f6fc864f5744f5b3f99261613b56d0fe97fadd98eaa4584967923a800 SHA512: 12bca5b505e41ecef765aaa693811e493da0fb7190434999549929f436eadd892090326f6145a552ca4247811bef4557847a4e4fc3c3bf1d242d2d60a7b103cf Description: Miscellaneous documentation for the X.org X Window System Description-md5: 8e446e7efb54922706b8ca2c81cd7cf2 Package: xorg-docs-core Architecture: all Version: 1:1.7.1-1.2 Multi-Arch: foreign Priority: optional Section: x11 Source: xorg-docs Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 69 Suggests: xorg-docs Replaces: xorg-docs (<< 1:1.4-5) Filename: pool/main/x/xorg-docs/xorg-docs-core_1.7.1-1.2_all.deb Size: 41748 MD5sum: 00f17dd7d015418512f70e5a9f5406d9 SHA1: 15099fa78e6c81532a710c22cb6c090fd13d21b9 SHA256: 8220128d3b9b29c0f0bae1d90ad8b3dcd95fc99f385bfb4c0cdcbbd4217351a5 SHA512: 70e14c5a1da7c15cd9bd99e687c2bc42d8e04dcb709e22da9e52edc54f7affb788c37f36ff93b3720b0d9dc7a49353e72100137caf5bef58f38ebe15bef17550 Description: Core documentation for the X.org X Window System Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 37a691694c97a0321d19b964ed2f7f5a Package: xorg-sgml-doctools Architecture: all Version: 1:1.11-1.1 Multi-Arch: foreign Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 78 Filename: pool/main/x/xorg-sgml-doctools/xorg-sgml-doctools_1.11-1.1_all.deb Size: 10936 MD5sum: cd9ce4694a205d3d61711d88a256e3aa SHA1: 943aca7aacf4a8043435088c124a08d4193bca63 SHA256: 277f662c6d94606c22078f2af82ac1b6e01386d5a4dec6ca7487bca4c5b23c07 SHA512: 5d0243ba703320ed39f796bb315ec1d1856f3dbacd5edf0b59263a298307b0f46e334565e69d52c19284f928261acf3762836d3ca3874236fd82d29326f26781 Description: Common tools for building X.Org SGML documentation Task: lubuntu-desktop, ubuntu-unity-desktop Description-md5: 9b074ec1fd035c058dfb6f238155efeb Package: xorriso Architecture: amd64 Version: 1:1.5.4-2ubuntu3 Priority: optional Section: otherosfs Source: libisoburn Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Libburnia packagers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 335 Depends: libc6 (>= 2.34), libisoburn1 (= 1:1.5.4-2ubuntu3), libburn4 (>= 1.4.8), libisofs6 (>= 1.4.8) Suggests: xorriso-tcltk, cdck Filename: pool/main/libi/libisoburn/xorriso_1.5.4-2ubuntu3_amd64.deb Size: 290382 MD5sum: a25216676d4b253b8e83a3382ff2c6cc SHA1: 975f0a9000e2b56c464819ac8f34f31512cac9fb SHA256: f36a1b69e7a2bdec57d5d1925503cbf041b4b8234f9bf95c88c6f4e26aaf7426 SHA512: 6e4c2a3d91568e75d3da28d5605d2175c5f7f57816bc58eabe838f5af1e4a24d3bc5f6f408160d7e4b42a0bc0e2e49c64b6f11b1e66c81c34f8812be56eb16e5 Homepage: http://libburnia-project.org Description: command line ISO-9660 and Rock Ridge manipulation tool Task: ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, kubuntu-full, lubuntu-desktop, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-unity-desktop, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 4538911b3f3a5e4314b9eefecd4579e9 Package: xserver-common Architecture: all Version: 2:21.1.6-1ubuntu1 Multi-Arch: foreign Priority: optional Section: x11 Source: xorg-server Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 148 Depends: x11-common, xkb-data, x11-xkb-utils Recommends: xfonts-base, xauth Replaces: xserver-xorg-core (<< 2:1.5.2) Filename: pool/main/x/xorg-server/xserver-common_21.1.6-1ubuntu1_all.deb Size: 27152 MD5sum: a4c7b60481f9922e0c8f3e99083e30b6 SHA1: a6fd66e245a8bfdacb0bec5d23b315dc4f3ffc1f SHA256: 3d2d263f69039f2b654184508d151fcefeef39d0709e06534dfce6c0db288a26 SHA512: ecaab702a408e8e1ae79547733ca42428c58cfca34f486209aee2943653f1eb39fc9fe3b124588e31c681360dbbfb51c1aa34430b59bdd1435e25b5069b98d32 Homepage: https://www.x.org/ Description: common files used by various X servers Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: be03943b6955ee9fae7163ad516c772f Package: xserver-xephyr Architecture: amd64 Version: 2:21.1.6-1ubuntu1 Priority: optional Section: x11 Source: xorg-server Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2531 Provides: xserver Depends: xserver-common (>= 2:21.1.6-1ubuntu1), libaudit1 (>= 1:2.2.1), libbsd0 (>= 0.7.0), libc6 (>= 2.35), libepoxy0 (>= 1.0), libgcrypt20 (>= 1.10.0), libgl1, libpixman-1-0 (>= 0.30.0), libselinux1 (>= 3.1~), libsystemd0, libudev1 (>= 183), libunwind8, libx11-6, libx11-xcb1 (>= 2:1.8.3), libxau6 (>= 1:1.0.9), libxcb-icccm4 (>= 0.4.1), libxcb-image0 (>= 0.2.1), libxcb-keysyms1 (>= 0.4.0), libxcb-randr0 (>= 1.1), libxcb-render-util0, libxcb-render0, libxcb-shape0, libxcb-shm0 (>= 1.10), libxcb-util1 (>= 0.4.0), libxcb-xkb1, libxcb-xv0 (>= 1.2), libxcb1 (>= 1.8), libxdmcp6, libxfont2 (>= 1:2.0.1), libxshmfence1 Recommends: libgl1-mesa-dri (>= 7.1~rc1) Filename: pool/main/x/xorg-server/xserver-xephyr_21.1.6-1ubuntu1_amd64.deb Size: 1014322 MD5sum: 05baabfbf32489ac38f53c4ac06876a1 SHA1: c18e8b6e08d77435f90b802176a0a2df8a2f3016 SHA256: 49f493bd7efd123818c23a52ee7722a65d84ff7b3595513dd71676bd8a6720d5 SHA512: ff15689838694399e7fe2a05d120afecdb39e84b1c585b5571374e3db48f9377955752e872fc3bd9eeeb5abd7c6f19f34a1f638a04cd255f23da024cfbfd4b27 Homepage: https://www.x.org/ Description: nested X server Task: ubuntu-desktop-minimal, ubuntu-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: eeb7a5ed15c65f716761ab1fa1637b6b Package: xserver-xorg Architecture: amd64 Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Source: xorg Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 366 Provides: xserver Depends: xserver-xorg-core (>= 2:1.17.2-2), xserver-xorg-input-all | xorg-driver-input, xkb-data (>= 1.4), x11-xkb-utils, python3-apport Recommends: libgl1-mesa-dri, mesa-vulkan-drivers, xserver-xorg-legacy, xserver-xorg-video-all Filename: pool/main/x/xorg/xserver-xorg_7.7+23ubuntu2_amd64.deb Size: 66688 MD5sum: 3c0dd779de424e637319242e7a191132 SHA1: ce739e701bf660315be4501d370d0d5c028e5c6f SHA256: cb570148c58b413fcee81ff22dc50a1c00c8125aa63f62df2e532b0f691e6f59 SHA512: 603025e5d57c0e8d538b95e9c582fdcd75a18de0ad74467c529be200531db96f83c687c56741d787ab1a52bcd298570956b5215446385e9aa3e4e08129775e0b Homepage: https://www.x.org/ Description: X.Org X server Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 3d8c1d268e8af6b69f54d86fbd5a3939 Package: xserver-xorg-core Architecture: amd64 Version: 2:21.1.6-1ubuntu1 Priority: optional Section: x11 Source: xorg-server Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 3884 Provides: xorg-input-abi-24, xorg-video-abi-25, xserver-xorg-video-modesetting Depends: xserver-common (>= 2:21.1.6-1ubuntu1), keyboard-configuration, udev (>= 149), libegl1, libaudit1 (>= 1:2.2.1), libbsd0 (>= 0.7.0), libc6 (>= 2.35), libdbus-1-3 (>= 1.9.14), libdrm2 (>= 2.4.66), libepoxy0 (>= 1.5.4), libgbm1 (>= 17.1.0~rc2), libgcrypt20 (>= 1.10.0), libgl1, libpciaccess0 (>= 0.12.902), libpixman-1-0 (>= 0.30.0), libselinux1 (>= 3.1~), libsystemd0, libudev1 (>= 183), libunwind8, libxau6 (>= 1:1.0.9), libxcvt0 (>= 0.1.0), libxdmcp6, libxfont2 (>= 1:2.0.1), libxshmfence1 Recommends: libgl1-mesa-dri (>= 7.10.2-4), default-logind | logind, xcvt Suggests: xfonts-100dpi | xfonts-75dpi, xfonts-scalable Conflicts: xserver-xorg-input-evtouch, xserver-xorg-video-modesetting Breaks: libgl1-mesa-dri (<< 18.0.5), systemd (<< 226-4~), xserver-xorg (<< 1:7.7+10~) Replaces: xserver-xorg (<< 1:7.7+10~), xserver-xorg-video-modesetting Filename: pool/main/x/xorg-server/xserver-xorg-core_21.1.6-1ubuntu1_amd64.deb Size: 1471656 MD5sum: 10582874ea984983104bb23a7a8af4e9 SHA1: b5d1d98ffb16c81cfdd8f0af430951ea6f1154ec SHA256: 9b3ee9f729f468c45128e9ed7b07c8d7d8cdb386f0b2467a3c7c7b6a3d04e7fc SHA512: 8948ebb0ed9e469f35e143d4902190025b23e8187a56753ae1fa245e1b1a5518ba844f4cb578531e733513caaefceefd0ab742bff5d033012776abb23c57fbc9 Homepage: https://www.x.org/ Description: Xorg X server - core server Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 018a15965c91ba9a09e0652c1c0fb9ac Package: xserver-xorg-dev Architecture: amd64 Version: 2:21.1.6-1ubuntu1 Priority: optional Section: x11 Source: xorg-server Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1333 Depends: libpixman-1-dev (>= 0.27.2), x11proto-dev (>= 2021.5), libxcvt-dev, libxfont-dev, libxkbfile-dev, libpciaccess-dev, mesa-common-dev Filename: pool/main/x/xorg-server/xserver-xorg-dev_21.1.6-1ubuntu1_amd64.deb Size: 202182 MD5sum: 4c46aff6a1c86478d0d4d84052f2c7e0 SHA1: 4d8105802bf096411c3e252b7133125486352119 SHA256: 798e380f23a28fb834ac6e17aac208b232aa6a46c8c8dce6476b4fa141af6fb3 SHA512: 5767fa1646dc663a1a17afd2c9a541e9da9f966983d539921b2d52333caf555a9505e4d974783bf8e048f63db0b938b377eb3616cdda9913caec85be1e95e4c5 Homepage: https://www.x.org/ Description: Xorg X server - development files Description-md5: c5425cbd8103a5899200596c7a3c3033 Package: xserver-xorg-input-all Architecture: amd64 Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Source: xorg Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 47 Depends: xserver-xorg-input-libinput Recommends: xserver-xorg-input-wacom Filename: pool/main/x/xorg/xserver-xorg-input-all_7.7+23ubuntu2_amd64.deb Size: 4058 MD5sum: b506c80b6d23fc8dcd194e4b3a03a9ff SHA1: 8a095f3261ecf35f55113a9db8c17928c6826425 SHA256: 6ee4a3092d489eb31ee6df2992e641f2c03ce235d0d309658308ab92fe7b62b7 SHA512: 271909d4b4a3932add0b4938b620981b3f2417477a2fc77c2355be325f8b7764f97483ef066df65a90ed623ef11f44fe45661f32f030407a0a041c67dc83f9ce Homepage: https://www.x.org/ Description: X.Org X server -- input driver metapackage Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 6dc6019c398114619eba5fcd5806f328 Package: xserver-xorg-input-libinput Architecture: amd64 Version: 1.2.1-1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 115 Provides: xorg-driver-input Depends: libc6 (>= 2.7), libinput10 (>= 1.19.1), xorg-input-abi-24, xserver-xorg-core (>= 2:1.18.99.901) Filename: pool/main/x/xserver-xorg-input-libinput/xserver-xorg-input-libinput_1.2.1-1_amd64.deb Size: 38676 MD5sum: a1a8f561de7484ec175dfae195c16aec SHA1: cc5d12c31ff2fbaed464440ddc387b269606cdac SHA256: 7528e111ff99c88f01bfdd7ad2e30e8b6d1f9c57e403f811095fed6f16855b33 SHA512: 954ffb1aa906c2c90a9aac777e27bee2c1cfb2284a59f247ac824e055a57986484983e0f35a0ecd56805a72b4bb02f09ca0bff927e934a34518c96d704e7c6e6 Homepage: https://www.x.org Description: X.Org X server -- libinput input driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: f8bfd1aa5c6b0f14ea81809036429317 Package: xserver-xorg-input-libinput-dev Architecture: all Version: 1.2.1-1 Multi-Arch: foreign Priority: optional Section: libdevel Source: xserver-xorg-input-libinput Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 25 Filename: pool/main/x/xserver-xorg-input-libinput/xserver-xorg-input-libinput-dev_1.2.1-1_all.deb Size: 5204 MD5sum: 0d565263feaeccfbec63394b7e4673ed SHA1: 7ba06758378f25432267cf3fdd6c8106cce16b43 SHA256: 7a0827ae60faaca21079f2c5beca5dd7419edb1803ce2765e65b91306e51d7de SHA512: 7cecd1997dc3ebb741faaa54401cf01275d37e68edbd92a203327c5b9a8c00e78e2ba697dba1d8c63ab2e9fd35c0fe25970047075a6c2356c9acf18d71e5123e Homepage: https://www.x.org Description: X.Org X server -- libinput input driver (development headers) Description-md5: 4b5e846f463943f6804a3550660477a7 Package: xserver-xorg-input-wacom Architecture: amd64 Version: 1:1.1.0-1ubuntu1 Priority: optional Section: x11 Source: xf86-input-wacom Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Boyuan Yang Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 288 Provides: xorg-driver-input Depends: libc6 (>= 2.34), libudev1 (>= 183), libx11-6, libxi6 (>= 2:1.2.0), libxinerama1 (>= 2:1.1.4), libxrandr2 (>= 2:1.2.0), xorg-input-abi-24, xserver-xorg-core (>= 2:21.1.1) Suggests: xinput Conflicts: wacom-tools (<< 0.10.0) Replaces: wacom-tools (<< 0.10.0) Filename: pool/main/x/xf86-input-wacom/xserver-xorg-input-wacom_1.1.0-1ubuntu1_amd64.deb Size: 95582 MD5sum: c2b086c07f38b7b0453d405c4c451a55 SHA1: 1fd61411d4b0c3c09bfb0919ad1fc5ebfbfdb955 SHA256: c9545d5d40b7d3b36618c155ec962a0968f6cb9b89e6bc831785d6e1562d62ab SHA512: 15b61011de93a6804c98f14a32bb896fe31b1d56b8bd8df692986c1af71e8aca432ef79a2e62eb81966fd96fcf6d5d213b0c9a05df66489ee4a85fd51f9752c2 Homepage: https://linuxwacom.github.io/ Description: X.Org X server -- Wacom input driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 990a6fd67780d38db31b26b3018b5519 Package: xserver-xorg-legacy Architecture: amd64 Version: 2:21.1.6-1ubuntu1 Priority: extra Section: x11 Source: xorg-server Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 179 Depends: xserver-common (>= 2:21.1.6-1ubuntu1), libc6 (>= 2.34), debconf (>= 0.5) | debconf-2.0 Breaks: x11-common (<< 1:7.7+10~), xserver-xorg-core (<< 2:1.17.2-3~) Replaces: x11-common (<< 1:7.7+10~), xserver-xorg-core (<< 2:1.17.2-3~) Filename: pool/main/x/xorg-server/xserver-xorg-legacy_21.1.6-1ubuntu1_amd64.deb Size: 33944 MD5sum: 99cbe4faeb19d2af6bc90a3ce3969427 SHA1: 24f8a682bc9cb47fcea87cebfe084d0a6bcf3ee2 SHA256: 719a035e94398f9aff48dd570e0d64f710c4a593bf88c164fbe3af0f7a172ac1 SHA512: 0507b98638db8237f6c742d41cc02c8b40dbf60cc243048f9300ac08789df5e82a85b28f986853732ecced9cfe8a67bf5b65fb12e9ef83cc32c001fe3f2a9524 Homepage: https://www.x.org/ Description: setuid root Xorg server wrapper Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: a49fa8443df84effdf1fd36e26ad0f94 Package: xserver-xorg-video-all Architecture: amd64 Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Source: xorg Origin: Ubuntu Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 47 Depends: xserver-xorg-video-amdgpu, xserver-xorg-video-ati, xserver-xorg-video-fbdev, xserver-xorg-video-nouveau, xserver-xorg-video-vesa, xserver-xorg-video-vmware Recommends: xserver-xorg-video-intel, xserver-xorg-video-qxl Conflicts: xserver-xorg-driver-all Replaces: xserver-xorg-driver-all Filename: pool/main/x/xorg/xserver-xorg-video-all_7.7+23ubuntu2_amd64.deb Size: 4110 MD5sum: 0ea2aa1c5c13cbd0613f0ba99012386f SHA1: e1a7252849e0175e3262f847d6d7737f1856f1df SHA256: cddaab1244d6b424e4a8c0c1b44fc56bba1128b524d7cea18d3d3079066ec5e2 SHA512: dc96db248fcf7694d950caa98368ee65c1c2b4323f09ad2b93b0449a66bd0e7209a7ad6f70209bec87985ad4f419ed84d6a7927303a67939b44334f29f278b18 Homepage: https://www.x.org/ Description: X.Org X server -- output driver metapackage Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: d6c33380f65bba53cd75efae633435bf Package: xserver-xorg-video-amdgpu Architecture: amd64 Version: 22.0.0-3 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 184 Provides: xorg-driver-video Depends: libc6 (>= 2.17), libdrm-amdgpu1 (>= 2.4.73), libgbm1 (>= 8.1~0), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Suggests: firmware-amd-graphics Filename: pool/main/x/xserver-xorg-video-amdgpu/xserver-xorg-video-amdgpu_22.0.0-3_amd64.deb Size: 69696 MD5sum: ab29fb664d3e1c6c27ccbecece0e6575 SHA1: c78674b5e09281ea58f620f9c565cd35514482d3 SHA256: 107461f371574caaf34a87b9b69731d52e0a2899dbe37d4786196d525410a576 SHA512: da7a84fb96be33e400827f91933c5a76e64a8e816a382574133ce40ffc2430856922e484bb6fb6403f21c180739f4aee24b1dc9a54c7de8a55a8871b49449dd8 Description: X.Org X server -- AMDGPU display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: e2b193b8ecbf0f4c08a535d8f9541c51 Package: xserver-xorg-video-ati Architecture: amd64 Version: 1:19.1.0-3 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 50 Provides: xorg-driver-video Depends: libc6 (>= 2.4), libpciaccess0, xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1), xserver-xorg-video-radeon Suggests: xserver-xorg-video-r128, xserver-xorg-video-mach64 Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-ati_19.1.0-3_amd64.deb Size: 7280 MD5sum: 3712a93315922a54d4b99400771ccd9e SHA1: 5e6c7686ad1014665390f94f99f04df5bea2f976 SHA256: 6372e0bd744014ab6a2a2a43f8201071d857d8ec82aeb58e1de7da767afe995a SHA512: 1a80940f2d0dfc1aab67515eef636a2f395d7cf048fa8d19be71accd19b195f29703da5fc484724d1c9acf8ce21e2bfd31c80c34d7d3a08c3aedd05a5e43e4ee Homepage: https://wiki.freedesktop.org/xorg/RadeonFeature/ Description: X.Org X server -- AMD/ATI display driver wrapper Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: f033d1f2dd0d21738c7fdc5296ac1d8d Package: xserver-xorg-video-dummy Architecture: amd64 Version: 1:0.4.0-1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 41 Provides: xorg-driver-video Depends: libc6 (>= 2.4), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-dummy/xserver-xorg-video-dummy_0.4.0-1_amd64.deb Size: 11434 MD5sum: 6b33b91cd29cfa84f69d677143fde8f3 SHA1: 5eb28c0bf7f4a621e3f0f4b47c39557b23717b1a SHA256: 8ca2b90d90233a2143bb54f48537b0b2acf444c7d8e09ac4bcf2a2122921bf08 SHA512: e9bff3397edb45e0bc6084f3d7fab6c006bdd48a60ede036a79550992844ced94ceeee6a4e5d0c68b2bc796f8aec5d5b8d7df77943fd82a701d5d0f420f525b4 Description: X.Org X server -- dummy display driver Description-md5: 43e4fd7aaa94ac5f196f6eb508f1969c Package: xserver-xorg-video-fbdev Architecture: amd64 Version: 1:0.5.0-2build1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 55 Provides: xorg-driver-video Depends: libc6 (>= 2.4), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-fbdev/xserver-xorg-video-fbdev_0.5.0-2build1_amd64.deb Size: 13298 MD5sum: 196ad813b0def66b065ce5b4198fe600 SHA1: c6a40c52632b184c05b9f6f3af385a90620b24cd SHA256: 05b48348324fa2d2fc05dfdea338833394921f3eb33787eed8438a0db78b53f4 SHA512: ad3658522b0ae5291f38a8cf391db5ccd202dd1eb9ef87dc75b4f45207666a83a104e880708d45f031048641be089db9ea8b4fafbcf91fd3c3412c8d10566567 Description: X.Org X server -- fbdev display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 64c436c9c202e79fa1c638b0252edf4c Package: xserver-xorg-video-intel Architecture: amd64 Version: 2:2.99.917+git20210115-1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 3210 Provides: xorg-driver-video Depends: libc6 (>= 2.34), libdrm-intel1 (>= 2.4.38), libdrm2 (>= 2.4.62), libpciaccess0 (>= 0.8.0+git20071002), libpixman-1-0 (>= 0.30.0), libudev1 (>= 183), libx11-6, libx11-xcb1 (>= 2:1.7.2), libxcb-dri2-0, libxcb-util1 (>= 0.4.0), libxcb1, libxcursor1 (>> 1.1.2), libxdamage1 (>= 1:1.1), libxext6, libxfixes3, libxinerama1 (>= 2:1.1.4), libxrandr2 (>= 2:1.2.99.2), libxrender1, libxss1, libxtst6, libxvmc1 (>= 2:1.0.12), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-intel/xserver-xorg-video-intel_2.99.917+git20210115-1_amd64.deb Size: 774664 MD5sum: 38037d0ac91f62ed022feebb4d4bbbb8 SHA1: 4f228127d2bc432114956224b528779ac7374701 SHA256: 9e99664d9262f6d340a914e1917ce3b3abffba9528f1e9796e552b7fa1019dfc SHA512: e1c832968c6c080ef277c7e2eb4460b2f4bc521a79b991993c42a37dd1276372a44839de711e1b21c95c9a6793339c0de4ca4128d547e74a6a8232b1c1cb64e9 Homepage: https://www.x.org/ Description: X.Org X server -- Intel i8xx, i9xx display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 6f99289cb68f1933937f7c2f79305530 Package: xserver-xorg-video-nouveau Architecture: amd64 Version: 1:1.0.17-2build1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 268 Provides: xorg-driver-video Depends: libc6 (>= 2.33), libdrm-nouveau2 (>= 2.4.38), libdrm2 (>= 2.4.61), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Recommends: libgl1-mesa-dri (>= 9.0) Suggests: firmware-misc-nonfree Filename: pool/main/x/xserver-xorg-video-nouveau/xserver-xorg-video-nouveau_1.0.17-2build1_amd64.deb Size: 93596 MD5sum: 660127099d62a3523f4faa46190c3329 SHA1: 09cbd81e53dee033b7bfceb4dfee1282d6b38364 SHA256: 7342bf1f4278ac57c09202ca756d46288f8247247c49c7d909b612b6f7710a85 SHA512: d717424e963b079c810654384ac3413dfc2f001377567d9e25861b12ed84712e1edb4122da0b804ff798ecaf3f5e3f1aa77b5b5eee8c70c8fea9bac83c4d63a2 Homepage: https://nouveau.freedesktop.org/wiki/ Description: X.Org X server -- Nouveau display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: b084a16945b86c1eda89ad33dbb4530d Package: xserver-xorg-video-qxl Architecture: amd64 Version: 0.1.5+git20200331-3 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 190 Provides: xorg-driver-video Depends: libc6 (>= 2.14), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-qxl/xserver-xorg-video-qxl_0.1.5+git20200331-3_amd64.deb Size: 82950 MD5sum: 5c3a38421291cf17dea764cf0bfb5bb1 SHA1: b4a57ee419acc025187e4ed8b2be05379cc069d1 SHA256: ae8095c399a7b72514f44c93b5dbb398eda803e120228f0cfe103745bf1964e3 SHA512: da9de9271d0ba9e18a89577eb393c5d35ef4ed15ba041ca33649e81ebe603e69d0382dda1171a90e009ce62e2eb39784ed44a8b36bec2dcb7a527566f57b8c36 Homepage: https://www.spice-space.org/ Description: X.Org X server -- QXL display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 9d2c19c3827f1261a65414b2acd67b67 Package: xserver-xorg-video-radeon Architecture: amd64 Version: 1:19.1.0-3 Priority: optional Section: x11 Source: xserver-xorg-video-ati Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 526 Provides: xorg-driver-video Depends: libc6 (>= 2.17), libdrm-radeon1 (>= 2.4.39), libgbm1 (>= 8.1~0), libudev1 (>= 183), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Suggests: firmware-amd-graphics Filename: pool/main/x/xserver-xorg-video-ati/xserver-xorg-video-radeon_19.1.0-3_amd64.deb Size: 161108 MD5sum: 861c5d5aab53262f2d8235aa9aa0732a SHA1: 46a35f02f280ee4ca8d520644af6cdf35d7415e0 SHA256: 0ff22f9ea37be675a0377110b0c2bc40652ed1bacc51f3e3229547e15c7c50d0 SHA512: 3d6b1dd09916535d0a34ac0c5c5fd35dbb43a52c3f8f404fdbeea5ef166ecd094768e665eab5a542c2cb89ae293de6c07e37252a8e6bbe5895470c4b9546fae0 Homepage: https://wiki.freedesktop.org/xorg/RadeonFeature/ Description: X.Org X server -- AMD/ATI Radeon display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 0fde75386f38d2861207c166e64f19d4 Package: xserver-xorg-video-vesa Architecture: amd64 Version: 1:2.5.0-1build4 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 54 Provides: xorg-driver-video Depends: libc6 (>= 2.14), xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-vesa/xserver-xorg-video-vesa_2.5.0-1build4_amd64.deb Size: 15886 MD5sum: 0d89fb52201757a7e539065fe4a22137 SHA1: a4f72bfc37160ba64a0e0439ab8c51d8368c8f61 SHA256: d54152272828c7ceba172b65caccb4bc99d0eff328076fca8d0ae20bbc2b442f SHA512: 9912ef34cad7c5d903d3d2acf72f9960d7bc987525c9a0e42b5456b5d8c8b99eb8bb68ac7438c13b0870ee30c927648ee632140d87dd0ae301ea62bbbe97047d Description: X.Org X server -- VESA display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 09beb2a31bd27ae3444fb260bf0f887f Package: xserver-xorg-video-vmware Architecture: amd64 Version: 1:13.3.0-3.1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 204 Provides: xorg-driver-video Depends: libc6 (>= 2.34), libdrm2 (>= 2.4.60), libudev1 (>= 183), libx11-6 (>= 2:1.4.99.1), libxatracker2 (>= 11.1.0~), libxext6, xorg-video-abi-25, xserver-xorg-core (>= 2:21.1.1) Filename: pool/main/x/xserver-xorg-video-vmware/xserver-xorg-video-vmware_13.3.0-3.1_amd64.deb Size: 75710 MD5sum: 6cda404690a00b6c5a648af06a84b577 SHA1: f568ffef863a790457930f0a77e78b6cfcb843fc SHA256: 75788494cf74b6d2c9d289dac8a9143317256be6a2baf6a1daa1598f503ada5e SHA512: 39bd95d78f25a5193a525126424f23974b68d8e12b64a897d6dc301ca2c60ae973369531e90ce41f20f09ae1ed745b96f049db2650393bcda4764b90ec8d5037 Description: X.Org X server -- VMware display driver Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 21afce1387bf1052ec99956e90ec2d1c Package: xsltproc Architecture: amd64 Version: 1.1.35-1 Multi-Arch: foreign Priority: optional Section: text Source: libxslt Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian XML/SGML Group Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 162 Depends: libc6 (>= 2.34), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.27) Filename: pool/main/libx/libxslt/xsltproc_1.1.35-1_amd64.deb Size: 14870 MD5sum: c9025ec11861182b4b3ac4a5e18cda90 SHA1: d2c1de5c37a27464f56a0dddc9bb5ca26619c9ac SHA256: 9085102552d3eb0824f757bfc9bcc5dda873b43a8291385ef726de6d78d42312 SHA512: 99f0b3207627eae36a190527059cbd6791cc75731bed33e5a1e3cb6f50a78b1d4ec80fccc2896d95e3ebe8c8579658afc4fdd85f5ac33fd240240a1d2fe6d3d2 Homepage: https://gitlab.gnome.org/GNOME/libxslt/-/wikis/home Description: XSLT 1.0 command line processor Description-md5: 269c4daf3d326a815e26cdd2e64cf686 Package: xtrans-dev Architecture: all Version: 1.4.0-1 Multi-Arch: foreign Priority: optional Section: x11 Source: xtrans Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 302 Filename: pool/main/x/xtrans/xtrans-dev_1.4.0-1_all.deb Size: 68900 MD5sum: 5411362f7caeccc1185750f3a1a508ee SHA1: edb12d6a666d507e1cb1589ab0c24434001878d5 SHA256: 45277c51d5d83db351b61859314b59595c9626ac372fbb2fc0d5542e169d9086 SHA512: bd7b220c57f705f7f6274f1c12166042f5f82d4a39ef54c8b968c8fc58fa3439233431a6a175ab41487a45ce09e035eecd6baffb1eebac845328d4d50363d16f Description: X transport library (development files) Task: lubuntu-desktop, ubuntu-unity-desktop Description-md5: 3e54bc7198040be15a6ef352cf9a6812 Package: xwayland Architecture: amd64 Version: 2:22.1.8-1 Priority: optional Section: x11 Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2286 Depends: xserver-common, libc6 (>= 2.35), libdrm2 (>= 2.4.75), libepoxy0 (>= 1.5.4), libgbm1 (>= 17.1.0~rc2), libgcrypt20 (>= 1.10.0), libgl1, libpixman-1-0 (>= 0.30.0), libtirpc3 (>= 1.0.2), libwayland-client0 (>= 1.20.0), libxau6 (>= 1:1.0.9), libxcvt0 (>= 0.1.0), libxdmcp6, libxfont2 (>= 1:2.0.1), libxshmfence1 Filename: pool/main/x/xwayland/xwayland_22.1.8-1_amd64.deb Size: 930246 MD5sum: 095eae6ce94cf3ab0565c48391bf5ec6 SHA1: 889b6b85b607143b5c5b22e8a45d6240042dc754 SHA256: 176378d2847e70c7f4c0590946bad72e82ea5690e65c661c687a10bf07cd6f93 SHA512: 9179b997967b64d6f198d59928acfdd0ebb92825d62a0b4b6e5584abc6a8016e3011d7f016d601bc16317267660160224b86a408b599ace58687e1edf58575bb Homepage: https://www.x.org/ Description: X server for running X clients under Wayland Task: ubuntu-desktop-minimal, ubuntu-desktop, kubuntu-desktop, kubuntu-full, ubuntustudio-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 46119f00e9401992b76d381dca9d3438 Package: xxd Architecture: amd64 Version: 2:9.0.1000-4ubuntu2 Multi-Arch: foreign Priority: important Section: editors Source: vim Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Vim Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 126 Depends: libc6 (>= 2.34) Breaks: vim-common (<< 2:7.4.2347-1~) Replaces: vim-common (<< 2:7.4.2347-1~) Filename: pool/main/v/vim/xxd_9.0.1000-4ubuntu2_amd64.deb Size: 49178 MD5sum: c447b0dd356903f587b7891506172390 SHA1: adc929a7849bc1044cbc8cc1882e6667b1392813 SHA256: 954ddc290de4923bce4e728a6be7a0f87a2461baec95b137b7b1483cc9a79d73 SHA512: 2f3e5d7fa2529cba9164abbb19becb6d6e55e315914497bcbc406e99177aa5f272d8199f72d3e18bea5dd37437f15fa1561bff119beee43f943b414092fc7619 Homepage: https://www.vim.org/ Description: tool to make (or reverse) a hex dump Task: minimal, server-minimal Description-md5: d658dacad23806722eb421aab7cc53e5 Package: xz-utils Architecture: amd64 Version: 5.4.1-0.0 Multi-Arch: foreign Priority: standard Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Jonathan Nieder Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 644 Provides: lzma Depends: libc6 (>= 2.34), liblzma5 (>= 5.4.0) Conflicts: lzma (<< 9.22-1), xz-lzma Breaks: lzip (<< 1.8~rc2), manpages-de (<< 4.1.0-1), manpages-fr (<< 4.1.0-1) Replaces: lzip (<< 1.8~rc2), manpages-de (<< 4.1.0-1), manpages-fr (<< 4.1.0-1), xz-lzma Filename: pool/main/x/xz-utils/xz-utils_5.4.1-0.0_amd64.deb Size: 239950 MD5sum: b9e936347a34e27be83fafda20594859 SHA1: e2425021e31e877e340131bc3cef1db9d3551978 SHA256: 25cc6c552d6d438242048d994b6d72ed7db382d3226356f39c55dd50e95ff494 SHA512: 859f7b466bb4f75d8593a940d67c46ee9fc1463a04dfcbc238edf288bbf4038d4004e3eb21d5fd36f80dabe1f61d5f7466bd304d434ffb0f1d8dd99d0a7f0bff Homepage: https://tukaani.org/xz/ Description: XZ-format compression utilities Task: standard, server-minimal, ubuntu-wsl, edubuntu-wsl Description-md5: ea97a558c8575aebbed2c11cbd20e0f2 Build-Essential: yes Package: yaru-theme-gnome-shell Architecture: all Version: 22.10.3-1 Priority: optional Section: misc Source: yaru-theme Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Desktop Theme Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 10158 Breaks: gnome-shell (<< 43~) Filename: pool/main/y/yaru-theme/yaru-theme-gnome-shell_22.10.3-1_all.deb Size: 74980 MD5sum: f2ac0c72584b2e3307a64765f0c22e35 SHA1: 30362f8fee0eb149373bc3cd6736a7d2adea11ef SHA256: 954b37e36674182b313fa839d9d991aa39f6a12d58646ec514ca58860cef5408 SHA512: 2a8d6ddebc273bcfac44b47f02e452aac6c982adbf3327714c671d261da064fa9112e1c97e2408463390b1fd072e87ddda1f8ad28467cf87b5cec2b22ed676d5 Homepage: https://github.com/ubuntu/yaru Description: Yaru GNOME Shell desktop theme from the Ubuntu Community Task: ubuntu-desktop-minimal, ubuntu-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: df1960daa1bf06cfb631cb74ba506b27 Package: yaru-theme-gtk Architecture: all Version: 22.10.3-1 Priority: optional Section: misc Source: yaru-theme Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Desktop Theme Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 28469 Depends: gnome-themes-extra, gtk2-engines-pixbuf, gtk2-engines-murrine, libglib2.0-bin Filename: pool/main/y/yaru-theme/yaru-theme-gtk_22.10.3-1_all.deb Size: 653372 MD5sum: 5d76d12feca356c5d8ec6e7cf9c92715 SHA1: 83d9097f47aa8982b9305d62f93c6466914583c4 SHA256: 431991a01fe39827b661c2e9e8a1efef4b462d0ed0247493b929d2b094b6b5b3 SHA512: 55f5291a7ffe1f5477f9bd7f307a59564e8d0bbd409f8de76f12671d97ef92caff1481912ed533713c1caf752e325d056a85dbcbe320a19be1ed936ad6712d38 Homepage: https://github.com/ubuntu/yaru Description: Yaru GTK theme from the Ubuntu Community Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 9233c6e7e5e658941fa43c9d66c2ff6b Package: yaru-theme-icon Architecture: all Version: 22.10.3-1 Priority: optional Section: misc Source: yaru-theme Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Desktop Theme Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 108800 Filename: pool/main/y/yaru-theme/yaru-theme-icon_22.10.3-1_all.deb Size: 27262646 MD5sum: 4949b19a459e3133a288a9255acd020a SHA1: 4d2462d73da774e54c073e67145f5afe61d2a7d9 SHA256: 68cf8a40944920807d8f3e8114d00e8178b6794dd07c764cc0ffd853cca81ec8 SHA512: 0c0b8809583acdb04d4d1bdcfb1c2cdbce6e50baf4e8c55e5c8ca40e2b5152c24e07edf9f34036a58a240de697cf330c5194b9c6a07523c5253bf99d158e6cc1 Homepage: https://github.com/ubuntu/yaru Description: Yaru icon theme from the Ubuntu Community Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: c87b5d085e2e33248552c237e0889612 Package: yaru-theme-sound Architecture: all Version: 22.10.3-1 Priority: optional Section: misc Source: yaru-theme Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Desktop Theme Team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 778 Filename: pool/main/y/yaru-theme/yaru-theme-sound_22.10.3-1_all.deb Size: 483782 MD5sum: 386c6f2a016917bea8939348472dc9ce SHA1: bbb5a0a49f0550ad348bb57d095346c79589a442 SHA256: 8b3cacf3c7be944166992d767a031349a84eb0e49f3a847923ebbed26bb4ecf5 SHA512: c6c60f396988455ca5bd249107913e07937e7ed7b169eff071fd8c4dbf26dfa67eaf8e2200d2fbeab99f9d8974144990752f9e60b643f471fece2e359649e6e4 Homepage: https://github.com/ubuntu/yaru Description: Yaru sound theme from the Ubuntu Community Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-mate-core, ubuntu-mate-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 4d20510de98f2150f6880c6d066f0bcd Package: yelp Architecture: amd64 Version: 42.2-1 Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2124 Depends: libatk1.0-0 (>= 1.12.4), libbz2-1.0, libc6 (>= 2.34), libcairo-gobject2 (>= 1.10.0), libcairo2 (>= 1.2.4), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.67.4), libgtk-3-0 (>= 3.13.3), libhandy-1-0 (>= 1.5.0), libharfbuzz0b (>= 0.6.0), libjavascriptcoregtk-4.1-0 (>= 2.38.0), liblzma5 (>= 5.1.1alpha+20110809), libpango-1.0-0 (>= 1.14.0), libpangocairo-1.0-0 (>= 1.14.0), libsoup-3.0-0 (>= 2.4.0), libsqlite3-0 (>= 3.5.9), libwebkit2gtk-4.1-0 (>= 2.5.3), libxml2 (>= 2.6.27), libxslt1.1 (>= 1.1.25), libyelp0 (= 42.2-1), dconf-gsettings-backend | gsettings-backend, python3-distro, yelp-xsl (>= 41~), man-db (>= 2.5.1-1) Recommends: docbook-xml Filename: pool/main/y/yelp/yelp_42.2-1_amd64.deb Size: 548318 MD5sum: 054dc5d63302f75d90ec8875192b5723 SHA1: c43e8bd278266ba7b59aee79166b6f9046ce5369 SHA256: 453a1b66d19f32c54e7568bee06853ec39a58e8cd9add24f58d2234d4643a135 SHA512: 602ec94a2dbd738e488ef11e025a09258bff91b7f499ad3d06b558f2a09b5073c3a8e8d9854c34cb1c53c784b69f36bff241b5a0255211644b2dc0b3aed61a8c Homepage: https://wiki.gnome.org/Apps/Yelp Description: Help browser for GNOME Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, xubuntu-minimal, xubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: b660f3f94d2a495572d2b53c6824da41 Package: yelp-xsl Architecture: all Version: 42.1-2 Multi-Arch: foreign Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1439 Filename: pool/main/y/yelp-xsl/yelp-xsl_42.1-2_all.deb Size: 200644 MD5sum: 8a84b02bd91539357180d17bada131fa SHA1: 5871d47e20ce42caa5e202f779e7bfbadfcc8511 SHA256: 7f08defc888de8db1b03003e9bcd48c5dfbb0d449c52c3d6660c114699b51871 SHA512: feea3b845f4f907dc34cb6ad79dcd07dd469856a1ef8803e98a88fbee8e95eacfd691d74bfc6f2a1729cd04dd9ca87537eb656a1624bb970bff5e8fbd16fc4e6 Homepage: https://wiki.gnome.org/Apps/Yelp Description: XSL stylesheets for the yelp help browser Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, xubuntu-minimal, xubuntu-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 9ccda596c294dc3049012cfa172e5063 Package: zenity Architecture: amd64 Version: 3.44.0-1 Multi-Arch: foreign Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 173 Depends: libc6 (>= 2.34), libgdk-pixbuf-2.0-0 (>= 2.22.0), libglib2.0-0 (>= 2.24.0), libgtk-3-0 (>= 3.19.12), libnotify4 (>= 0.7.0), libpango-1.0-0 (>= 1.14.0), libwebkit2gtk-4.1-0 (>= 2.15.1), libx11-6, zenity-common (>= 3.44.0-1) Filename: pool/main/z/zenity/zenity_3.44.0-1_amd64.deb Size: 65590 MD5sum: ac3149524d0cd5e42b4b925585438289 SHA1: 9e69d48fa029a2fb8bd73d56acceb676d7779f00 SHA256: 9e055c964b81c8344b466f4a205795e916bd4ba91c74b4514fff2b59d9d417ae SHA512: 44709e655bb9c1d7b311f0657486ebdd49526bcac5daa7da7cb3463fed5c3ce6a113a37016be7d80d05c7222e406546f50e9209e2fc4cd2ea6be724f9401a91c Homepage: https://wiki.gnome.org/Projects/Zenity Description: Display graphical dialog boxes from shell scripts Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 0eaa042a6247aca86bac2f94a69fc906 Package: zenity-common Architecture: all Version: 3.44.0-1 Multi-Arch: foreign Priority: optional Section: gnome Source: zenity Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1636 Filename: pool/main/z/zenity/zenity-common_3.44.0-1_all.deb Size: 275942 MD5sum: fbc59ef6906c527bfeb0e765989de556 SHA1: e37c9c22e7c6ff4856389e4edebdbf2d182f247b SHA256: 302b7d214ec9c0cde0948d6a4e44cc11c6ed0252d281251561985e4803781db6 SHA512: 55d6d2a89f43abbef572afb9606b5338825690cc6d96ade980d8d541ca2014d8f003b806c08a46795c473b1627523bd394cd0f072726b140b23b1073b91f8003 Homepage: https://wiki.gnome.org/Projects/Zenity Description: Display graphical dialog boxes from shell scripts (common files) Task: ubuntu-desktop-minimal, ubuntu-desktop, xubuntu-desktop, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome Description-md5: 31577d10cdc7dea3e76b1ffaca46c1f6 Package: zerofree Architecture: amd64 Version: 1.1.1-1build3 Priority: extra Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Thibaut Paumard Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 30 Depends: libc6 (>= 2.34), libext2fs2 (>= 1.42) Filename: pool/main/z/zerofree/zerofree_1.1.1-1build3_amd64.deb Size: 8814 MD5sum: c16eab0131c22e00cd53ce60400f50fe SHA1: 45aa04ef31af497aae9d4870b8dc689051a50eff SHA256: b65039dcc39ab399264e5cea9dd26996d7422b04983a044baca578e436d1072c SHA512: b3bc4e3c22c02c892a90cfa71297f24dd7f61dfe606e5260422536f0ea1841908aeced4c57fdab923e85a35f823dcbde630a7a59f0536eb1fbe5f201d1e72e09 Homepage: https://frippery.org/uml/ Description: zero free blocks from ext2, ext3 and ext4 file-systems Task: cloud-image, server, ubuntu-server-raspi, edubuntu-server-raspi Description-md5: e8c47b284082ddf9145a003c9cbeafdb Package: zfs-initramfs Architecture: all Version: 2.1.7-1ubuntu1 Priority: extra Section: kernel Source: zfs-linux Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ZFS on Linux maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 116 Depends: busybox-initramfs | busybox-static | busybox, initramfs-tools, zfsutils-linux (>= 2.1.7-1ubuntu1) Breaks: zfsutils-linux (<= 0.7.11-2) Replaces: zfsutils-linux (<= 0.7.11-2) Filename: pool/main/z/zfs-linux/zfs-initramfs_2.1.7-1ubuntu1_all.deb Size: 24892 MD5sum: 60c56e73f939be48c58f32ac22969247 SHA1: 56f8f8a3da64f5d6c74d75a111f2e83004846374 SHA256: 4898acf6abae6200f5c007e1cfa3a9ac2db39ea239d14a4496c3eef4ca4ffd8a SHA512: fc432a278526f1e4477ae7e822c8ca354557df334585ee099944fde14f9a86f46d5ab9f88e15404d399bccc0db549a8dc256e59dcb2f2f5d735339b78cdb91dd Homepage: https://zfsonlinux.org/ Description: OpenZFS root filesystem capabilities for Linux - initramfs Task: ubuntu-live, xubuntu-live, ubuntukylin-live, ubuntu-mate-live, ubuntu-budgie-live Description-md5: ed136876804c562cd1f81b87863a33a9 Package: zfs-zed Architecture: amd64 Version: 2.1.7-1ubuntu1 Priority: extra Section: admin Source: zfs-linux Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ZFS on Linux maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 262 Pre-Depends: init-system-helpers (>= 1.54~) Depends: zfsutils-linux (>= 2.1.7-1ubuntu1), libc6 (>= 2.34), libnvpair3linux (>= 0.8.2), libudev1 (>= 183), libuuid1 (>= 2.16), libuutil3linux (>= 0.8.2), libzfs4linux (>= 2.0) Filename: pool/main/z/zfs-linux/zfs-zed_2.1.7-1ubuntu1_amd64.deb Size: 65364 MD5sum: 52c555351c93ebe94719d8ca36d63aed SHA1: ed12f6b740fcf15bffc7b0e37652ece8a2747102 SHA256: 1323d3f4359b89e6f2d67e314a5b6daa7c4bffdb14f31a4aaa54c70b017c086f SHA512: 71fb3721fdd25fadfb4a24ca74952feb5823f1fc2dcb6798550c1a01c5e8f2d377008fb9a4b92b09274155d6b4f1eadae8172777473a334c2b6b5ded8e7bf386 Homepage: https://zfsonlinux.org/ Description: OpenZFS Event Daemon Task: ubuntu-live, xubuntu-live, ubuntukylin-live, ubuntu-mate-live, ubuntu-budgie-live Description-md5: 371f25433afc0f13d827a77c432615a1 Package: zfsutils-linux Architecture: amd64 Version: 2.1.7-1ubuntu1 Priority: extra Section: admin Source: zfs-linux Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian ZFS on Linux maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1614 Provides: zfsutils Pre-Depends: init-system-helpers (>= 1.54~) Depends: libnvpair3linux (= 2.1.7-1ubuntu1), libuutil3linux (= 2.1.7-1ubuntu1), libzfs4linux (= 2.1.7-1ubuntu1), libzpool5linux (= 2.1.7-1ubuntu1), python3, libblkid1 (>= 2.16), libc6 (>= 2.34), libuuid1 (>= 2.16) Recommends: lsb-base, zfs-zed Suggests: nfs-kernel-server, samba-common-bin (>= 3.0.23), zfs-initramfs | zfs-dracut Conflicts: zfs, zfs-fuse Breaks: openrc, spl (<< 0.7.9-2), spl-dkms (<< 0.8.0~rc1), zfs-dkms (>> 2.1.7-1ubuntu1...), zfs-dkms (<< 2.1.7-1ubuntu1) Replaces: spl (<< 0.7.9-2), spl-dkms Filename: pool/main/z/zfs-linux/zfsutils-linux_2.1.7-1ubuntu1_amd64.deb Size: 496374 MD5sum: 5b40698756f6f10bda16b94de41b60a9 SHA1: b62244742ebd96f21d9af4daa1f83a58415066dc SHA256: c41e424fd8a02336428b6a08cbcd15f4ccf8602ded505ddab5613221f66b5425 SHA512: d69e9d8634f82fd124125f696f3e1ef35621d5bb2475da2d4ce979f316d2dc5b2551f1dc01f39501ee87cf1d4ebbbc8181b59348a675f2efedff93d75b3c0b7e Homepage: https://zfsonlinux.org/ Description: command-line tools to manage OpenZFS filesystems Task: ubuntu-live, xubuntu-live, ubuntukylin-live, ubuntu-mate-live, ubuntu-budgie-live Description-md5: e0d1624ff402201471b9a32e9cb71f16 Package: zip Architecture: amd64 Version: 3.0-12build2 Multi-Arch: foreign Priority: optional Section: utils Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Santiago Vila Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 531 Depends: libbz2-1.0, libc6 (>= 2.34) Recommends: unzip Filename: pool/main/z/zip/zip_3.0-12build2_amd64.deb Size: 175730 MD5sum: e005b780185b9eef9b24c3a4943e0ba7 SHA1: c410f13c2c900d5b460f911792b271ae02e3fd0f SHA256: f4b43f651abf5f4835792f01d97410221403f14961d363dbd2864990b97620ce SHA512: 13f5b9c2f4be2382cb9d32e4e14fb03c809bffe87e6717461004ad6bfa78e9b661376de1e66f98873a5aee238002c22f6c2be1774be9cc9228811f01b6fc113f Homepage: http://www.info-zip.org/Zip.html Description: Archiver for .zip files Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi Description-md5: 581928d34d669e63c353cd694bd040b0 Package: zlib1g Architecture: amd64 Version: 1:1.2.13.dfsg-1ubuntu4 Multi-Arch: same Priority: required Section: libs Source: zlib Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Mark Brown Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 166 Provides: libz1 Depends: libc6 (>= 2.14) Conflicts: zlib1 (<= 1:1.0.4-7) Breaks: libxml2 (<< 2.7.6.dfsg-2), texlive-binaries (<< 2009-12) Filename: pool/main/z/zlib/zlib1g_1.2.13.dfsg-1ubuntu4_amd64.deb Size: 61212 MD5sum: 81078d6b17157ea1140033acff31a210 SHA1: e20c4b5e276c391f162a00936be856b5169268f8 SHA256: 6962be4748fb4a36837353fdacdfd4199057eb70b893896fbb8b85e4ce9c7d94 SHA512: 3aad0ec7cf7862bbd5e9b32b9a5745a9d310e7c8b684e0a80a702b357e591fe3eb2270d33b933b7d9ab7be10921c6d2a346ef4b24dbd106e0e34d3dd5d3afea5 Homepage: http://zlib.net/ Description: compression library - runtime Task: minimal, server-minimal Description-md5: 567f396aeeb2b2b63295099aed237057 Package: zlib1g-dev Architecture: amd64 Version: 1:1.2.13.dfsg-1ubuntu4 Multi-Arch: same Priority: optional Section: libdevel Source: zlib Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Mark Brown Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1327 Provides: libz-dev Depends: zlib1g (= 1:1.2.13.dfsg-1ubuntu4), libc6-dev | libc-dev Conflicts: zlib1-dev Filename: pool/main/z/zlib/zlib1g-dev_1.2.13.dfsg-1ubuntu4_amd64.deb Size: 894544 MD5sum: 8df528a3bb0351629828307304b9c1b6 SHA1: 0b8e048d18c912b04470c202902883f091899a6b SHA256: 6401579be26a9c0301d787b9e4519b23f5a61ca38ac82286cb4a60a306378158 SHA512: 696accb4c0b1a0ed09cf2d1fbb2233dad6bef23f93733e4013ec4731d3de82bd991140fcce67527fdc2d94f66780c0025c6449feba62282ef094ddeb577c5478 Homepage: http://zlib.net/ Description: compression library - development Task: lubuntu-desktop, ubuntustudio-audio, ubuntustudio-publishing, ubuntu-unity-desktop, edubuntu-desktop-gnome Description-md5: d7f4e8a626131fc83c643c5d59096290 Package: zsh Architecture: amd64 Version: 5.9-4 Priority: optional Section: shells Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Zsh Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 2428 Depends: zsh-common (= 5.9-4), libc6 (>= 2.34), libcap2 (>= 1:2.10), libtinfo6 (>= 6), debianutils (>= 5.3-1~) Recommends: libc6 (>= 2.35), libgdbm6 (>= 1.16), libncursesw6 (>= 6), libpcre3 Suggests: zsh-doc Filename: pool/main/z/zsh/zsh_5.9-4_amd64.deb Size: 809212 MD5sum: b96bf9c5915b978506b03f0787ae04af SHA1: 0aceb5bbc0583ff51a7ec0ca5f137af51f84f62f SHA256: 9a4a8f70f6e97ce4d96e9de294a316af73d593995d51a707dfb92b0641f72c8f SHA512: d803f4884fabc3b734827e8d008e24aa2cf49cbc7ed9eeecc9862904876f544f109a394710255a07f88c5c1aa9612bef560968331ed6021dd9e01f8a71e3e8c9 Homepage: https://www.zsh.org/ Description: shell with lots of features Description-md5: a129d6b2d23d2d5d3a6b822d3f8f856d Package: zsh-common Architecture: all Version: 5.9-4 Multi-Arch: foreign Priority: optional Section: shells Source: zsh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Zsh Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 16249 Recommends: zsh Suggests: zsh-doc Breaks: zsh-doc (<= 5.8-7~) Replaces: zsh (<= 5.0.2-1), zsh-doc (<= 5.8-7~) Filename: pool/main/z/zsh/zsh-common_5.9-4_all.deb Size: 4171320 MD5sum: a50b5fb1b70b0bc2c34b03a683e8cb72 SHA1: ff0259e09b28939148c7beb811bce3d2924f5aee SHA256: 9fec2561f9528bdd0ba545d10432621885b0e63d2cedce50414343da226e5521 SHA512: 784ea9812d2ccdd298b5949bf1ad6295a9557be4794af9457b9482b01e5572aa47667af6e184ecaa124735b641e75c558666c1245b33bb63b78508cef756b6c3 Homepage: https://www.zsh.org/ Description: architecture independent files for Zsh Description-md5: 8aac20ad1d93f2ea018a327bcfd5912f Package: zsh-dev Architecture: amd64 Version: 5.9-4 Priority: optional Section: libdevel Source: zsh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Zsh Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 511 Depends: zsh-common (= 5.9-4) Filename: pool/main/z/zsh/zsh-dev_5.9-4_amd64.deb Size: 97892 MD5sum: c36eea54cb373f3c6cbf2eb70867d9d6 SHA1: f91dcb51a6cfc7d8f4f3ced74bcc82f899827349 SHA256: 43181bbb7347036e21ee629d99142cac6a7328be6b86451e3cc5bf92b5754616 SHA512: 0503cdfde78fd5fa85b1f48a69baf3b2469ecdac0d03d695e0c6a96642eaf0871da353e2badab7dcc6964599dd86222584d1abcb27435aaa87fef7a41f724f8f Homepage: https://www.zsh.org/ Description: shell with lots of features (development files) Description-md5: 958eee099c22df2f69105f5ecae036a2 Package: zsh-doc Architecture: all Version: 5.9-4 Multi-Arch: foreign Priority: optional Section: doc Source: zsh Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian Zsh Maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 5853 Depends: zsh-common (= 5.9-4) Filename: pool/main/z/zsh/zsh-doc_5.9-4_all.deb Size: 2772506 MD5sum: 8fb50e469de36ea156e790a7e9f2ecf4 SHA1: b64c26cabde92188d02b7ce3f99abe0ccb891107 SHA256: 04b57998e60a593326920314a8c86a8d424691fb05dd604cf091a2126415d124 SHA512: 4c016643a1e060bd75d875ecdec89e16e4154e7dfb83ce44fbd359f455859a02099953a0066c72d221c25669996b10816082ea7374f74e75b9e9c65a48a9fc7d Homepage: https://www.zsh.org/ Description: zsh documentation - info/HTML format Description-md5: 9b5459fce7bedf54d5694a22e68389c7 Package: zstd Architecture: amd64 Version: 1.5.2+dfsg2-3 Multi-Arch: foreign Priority: optional Section: utils Source: libzstd Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: RPM packaging team Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 1679 Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), liblz4-1 (>= 0.0~r127), liblzma5 (>= 5.1.1alpha+20120614), libstdc++6 (>= 12), zlib1g (>= 1:1.1.4) Filename: pool/main/libz/libzstd/zstd_1.5.2+dfsg2-3_amd64.deb Size: 590406 MD5sum: f4ea7fd218aa5229bdb2751c9d54106a SHA1: 709d22adcd71bea1005d3e94d71f0700f9d50847 SHA256: d09a75a0314a790bb875f19377e86578e4250092bbc5cb372b08a123ca3e7a3d SHA512: 1032bea4f49990a87da2bf7085a9b0d41ca3b99854637f1fc2fa311dfae269dd383226c6596de76c442487e45dde68a3905473d5288ea30ee07d30f4ea54157e Homepage: https://github.com/facebook/zstd Description: fast lossless compression algorithm -- CLI tool Task: ubuntu-desktop-minimal, ubuntu-desktop, cloud-image, ubuntu-live, server, ubuntu-server-raspi, kubuntu-desktop, kubuntu-live, kubuntu-full, xubuntu-desktop, xubuntu-live, lubuntu-desktop, lubuntu-live, ubuntustudio-desktop, ubuntustudio-dvd-live, ubuntukylin-desktop, ubuntukylin-live, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-mate-live, ubuntu-budgie-desktop, ubuntu-budgie-live, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, ubuntu-unity-live, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-gnome, edubuntu-dvd-live, edubuntu-server-raspi Description-md5: d2e4d40bb07cc70b5a32d3b4a9b5f53d Package: zsys Architecture: amd64 Version: 0.5.9 Built-Using: golang-1.18 (= 1.18-1ubuntu1) Priority: optional Section: admin Origin: Ubuntu Maintainer: Ubuntu Developers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 11052 Depends: libc6 (>= 2.34), libnvpair3linux (>= 2.0.1), libzfs4linux (>= 2.0.1), init-system-helpers (>= 1.52), grub2-common, zfs-zed Recommends: zfsutils-linux Filename: pool/main/z/zsys/zsys_0.5.9_amd64.deb Size: 3475910 MD5sum: e2abe958afb3304a9bfee02d2ed28a64 SHA1: 592c50e4f7f94241c13ae2481f1f17b4f6f9bfa9 SHA256: a982748f0554d125d48626f7013b302f9801c9a98ad6951f1a7f689fe70a0ca6 SHA512: e0e07f5b7278eb4915c17404a354131354f96e202d4fdaf1cc94ec0f4c81b6c6ab413ca9bf83d41c6d087c26861327b7bbd39f7fbf326a44626540503b144497 Homepage: https://github.com/ubuntu/zsys Description: ZFS SYStem integration Description-md5: dabfaa2297d4001c7e247851fbcc2086 Package: zvmcloudconnector-common Architecture: all Version: 2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3 Priority: optional Section: python Source: zvmcloudconnector Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Corey Bryant Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 56 Depends: adduser Filename: pool/main/z/zvmcloudconnector/zvmcloudconnector-common_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3_all.deb Size: 11948 MD5sum: b6356b883d475e5552eb61f3d3dac051 SHA1: f411b822cdf581e7f83f9bbf59371f91a00ff9bb SHA256: f55ba72804b82daa77fd10afe07ac75fd5ce24740bafd26bc587be34850b96c5 SHA512: 396c0a4b3746ee3330a09294093e051eacb9850b28c2e7945a120caf201a318482a9e62ce3cd9eafb62aa449fc5953b46fddd834640cb58f11a943736aba5217 Homepage: https://github.com/mfcloud/python-zvm-sdk Description: z/VM Development SDK for managing z/VM - Common Files Description-md5: d05e72aec9e53ee776fc0735e135889b ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/data/binary-amd64/Packages.gz0000664000175000017500000012520114410675017021745 0ustar00brycebryce‹Ūų!dPackagesģZŁŽG–}ÆÆČG vR±/µa»ÕÓķĘømŒŚĢ“Ė Vv‘LNfRK£į/›×łÆ9A&YE–JņĄņ2ƒ–P¬bddģēÜsnęw!݆%]7!„~·™Ę‘†W]¢«/‡tÓM”¦ŻPÆ®³QW’NĆŲõ›ėFˆs ×ņ]Ä=;uõŻŠõC7½½nśķ„*auõ÷ī+/7żš®¾ŗe‡oßļļøś&t› ?4‹šēōŠVż}4Ļķ¶¹µ¹ÓnæXuć4.—©_>7VķżęžSģ¦)Q¦ńvź·‹~X6ėS“æ½]¶÷*“÷.ĪŻ„U×O7‹¼o¬6šłÕW»åxŻÜLÓv¼~ś4āŪbv›t³ y±”ééahO?-݊płźėĶ8…ÕŠrū¢ū;VQ3uõœ¶“Éh'ĒŻŲ|ņłļ¾š īž|Ö¬ŗx± ¬łäwūP3™żĶb!ē‚%~P³es¹‘ }ø²ķW·ŻŌ.ūų7ģIĖē*lįż“«#¬äz•°[MķŖĒŖęęĶį«»å’°(ó^¶©ßLCæjm&®žÓŻ„5&øķūÕÓŗ–OĆӋ©\~y9­—ū3Vüź°ZĘIœ¹ožėq·Ę äL)k¹*,‘Lŗf£Ā&V¼šžźÅŸ¾ä8™Z('²óRgn¢-I'Ź,9ēø'Š6…l’ѵŗŠęŗQ$Ž„sŁW|HdRń,šœ’œf¬ęŁGJ2LŅŅG–,ē‰ڐęāŗ”č9 U.$yk¹4+#TĀ£}S˜%ė“Š!r› %³œ‚ą©ÄœDČ$I¹˜ a1 t‡2#g؁»\6#U™xrØO$”OńźOؚķĖĒ#śśõėÅ ž¾īn»§/ś2½=żrŽ”ó&įxŽič¶äžēކ·MĄQX‡M·Ż­ĀDĶxd‹¦Ū”~X‡ZżźÆa¼½nNȝÕmŗuX}vQ~ł½ĀøķN„ÆGÜq{yĖ›¹ąŌę›Ė«w÷2N»Üõ§¾R?Š»/Koß®ŗĶƒ±bžtvó”ä²ZÜåe÷”ā‹ ļ6 Ļ»[(?¶Œ—WŽQwnłTŽÅ¼æ­ķ:ėėĘ ˜L6eå+ŖTtŁ[«œĢ–®®¾»¦÷‡³0 Õź÷F1‡_>  ’]RóWPšœ(¬?­ģ?ξ˜L”†Ėō’ÕÕ öÄöŲæ©ߎ­ŪZķēw ­~xr2ūŪFzœe§żĒĖyŠ(ˆOšš ¢%¬+–3¦$'VÅ -·3Ŗ}ˆ$mōBūȽVŅ{!³ L“̬°ą‹¾£QŠFā0y²ŒRbQ8nŒŻ2ć +ä}ŠYIJÜśX“J‘a¦hCŠh4H©Rd63oÉ"•T(Ń8īŁtVŠŖį)Ē„SLD„īēl–„I…3x®> ÖrĮ[yõ B{×ÖŖ×uDŌ-7ļEl’ų "ö»Z7ī_!Ā<[¾~ńQqɽ8Əļ5ÖaJ«Ga·Ŗ?/ēū€Nz&Ł tÉ)J%YHLKē˜įZf^c}=s³vń…“S*T%‹SOÜZœNēqb}N2Ķ)ó‘åǾL.DĖkéķŗĻ2#6ēšłņb²¤ÖžNš€x Å>{˜2( ”ō"Gž s6Ī,‰æ!E 5%†Ḋ­‹Ł1™EpšZP±Tų‰%”=T„‚²H;ØÅmP*eY¬6žYBH‚įČA,+µH Ō įsēš$W0†Į Ā  1Cą9^„± £ņʏ²ŽV†Ģ”§œ#ČVD¬œ*©¶aP/š$›l³ĻŚ@а”AÜZ‚.#§lŠ$œĶJü)Ė –¬$Łļ†DęKڟ‹{‰õłe„‚€›ß÷›Ņ-wĆŽ·ķÉwżkÄÜÆ«/0Ą N5ÜBŹĘīVM°I‘2^#R0Ųęøß +‘0Å3óÓŖ{?VYĶü6śÆĘB|Õ-ūĶ«ŖGšg±žżqį*¼:ƒąʕh±ŻŠĘv9Žaہc§G?‡ė·CŌ­˜Qm¹ŒĖ…8ŌøÕix»z9_l.Æ· ¹ų!¬¶7Zo=TXå°Ē|Z{ óu“Ÿ/ĻwóäĮå÷„‘¶=W/°d Į„bÄō!Ć łč”…kĶį\…‹5\#šU1£Jp'ČĒØ•‡Č€× m½aId— ¬“Ķ.’LĒ…NX1:ĻR‚*'ČĆ|ĄäR“‡&Š ƒ°B£KA&™Œƒņõš9ŒOC¾Į9AĘE ‹Oįœˆ1ųö!GmbŖ|c”ö2ŖXņĖ”œ3dy‘ c9Fś‘I“+(¬Öł÷Õś<ŠŻėjNĀQc³Ē?\ĖŌ½¢ęy7iżš¶É}ŻŚó”Ī U~¤ŲxHXk¦±pPŽa\1Z+"V)*åĪ(#×Ó%i¬Vw”Ń-ü‘0Žļkŗõ¶¦°™~õTė‡y5;Ļõ‹ķaņćĒĶB(qW¶a_ßĻåV|÷)¬Ø]Ņ4ћ©Å˜ įŸič7Po{ā(c»7ƒ{&0¶åĮ~:Ēß/ļļÓKŒģhĻÄ0ųw8kž‚ÓęaT†„–tIb&‚ Ŗƒ/•32  PĆ®Ŗ”S’Ķ䄷»ž.-”¢Æ·11”TM Hī"\}±'µ…CK)ĮÉĢOĢH琤µ9 ­Ö’‡{äįt <¤p0o}Ys'.č€`…ÖÅE@ršĒĄŃ,&Ø\0<|°ŅnŃ*XAĻJĘt“µL„d“#i%Ö³xįvrއķńłÕ!%{Č,,‡~·=ŗ“*?ž£JĪ Aƒ˜]öą^ĶhBōÖ)Ėų8”"?Ļo·šŚļGĶu³ģWa³ld\uŪõ÷B3’+æRĢ’é[*ā÷Øē.nÚ-OĻ[vĮåć:"\Vq±Æ­ŖVއŽZį=z½ĘōķŪé¦ßČÓķÖ1`£ėÆ69ÕŹĘ1>ŪśČéģĻ¼N” Ć ū{2i³ņ{ åŁįsīÅĆG7\z'īŽhØsRNC`#R‹-‡L䈆Ł!䎹„ģGÜ“¤½ŒŅ ÷…„č8 0#šøƒ·’ŠĮDp†‚X§Mźg3€LGw² ¦tžS $ŗ"-“ $Ž‹†įbꞇ"!rī"ۚ|äĢÕ| 壯Č%ė2z$ć©HŒKX났Ž•×R®Ā‚'€J$‰`' ņÉ%+¢ĕŒŚEGčq~ŁM7»Xźń°w.éŸ7/žćN N ÜäAŃ?ø,Ö“¬·˜…JNé5鏵ģīĢ\LŗŻ~(­Ø[ž›J ~×õÓŠ|ūß’†žõxŪ5϶µäćjucłūæL©łģ—å īSNŸ~zØėQōw”ń/škšįāńT毆ܒūå~ż »Ŗiļžš*æ pœqcMē'‹&Ž+¤9ĘUrÜHŲ[ÆL.„ €ƒŸOёĮń:…ąĪļ€Wńd b«-:F‚,,'ė¼m„vˆ©A8i)čN`»źłK ņՋ'`x ć_m~vl”<‡o‡‡–°äF; IL[xŒŠĄżƒQąPrŃ·Y /‚—Sņ0 ŠI`¢ātņŒå‡žŗźėy×،Ew™ęO=ŽĆžˆ7}A®»1ŠXQq/įųƒJ …S}Mˆb¼/ ,ŘįŃŖ3 ¾ŻŚ.įęé†Öō>1¬ų‚c)’_gł„·3žų—oæłCóĶå;‡÷ ~”·1½ļ |ƒÅ^õý5’¬YN·ķn›«±Ł§nīž~Ó7’xĒfµe‡ż¹göa|µm-AŸv;^?voóɳgēŪ Ę8,;ŅŲb&›„ō0…}uY5kÅõ•Žķ*$śŁŚŒ§.ūzGŃ˳^/,<³‚I<‘—‚·GĄ7’ #@eĪ{U„Q NšŽĻ*™6EŌPa_dÕŻĄL{ˆBĒP±˜ČD>‘— č%­,¤®u•s”šJ*Dö˜kZ‚Ńd°ĢJ&åZO[Ļ…ĆhÓyX÷l¼½5ˆüąA8z"Äü˜Ėšŗ2bĀb„!BUł“ĄM¢_P.VR@›!C°€ B¼įX :²Ņ.sMA: åP؍Õg-šÉ*uĪKóŪ;M]ķfæŚ•Ÿ@ūd„š_5ć.Ž4=łē«’—^Հ7LŃŌ'ļˆĒA=†‚ĄŹB*ÆŁ“{£Ėō!sĘ]+~SIÖ/1čóHP§ń3„D K0łžzėÕFŒhxūŽĒĀ{Y‡’ócį€ć7ńY²Õ ü‘7ńŅ1iZ«ń9×Jo&QĘc~V™cnv}Ęq4ˆõ’ģÓ@¢uó»zœ-Ä|ĆH8š»7G…ÉxDMŽ?ūybOõ߇Cšä^.ØtĖM÷#G½#æĶwé³Ć·7ōØ!ÄåżĒĖCĖU)ä%7÷Žå«—5gÅsĖᕪåRF…jļ˜?{†nÄ'sMūĀ+A¾jV"@ąK–ž q÷<œ˜÷1Xrą{A¾‚1•†öŖ) Ź>'™ØųŻĘYu}PdwĞ#čŹ4Z§ŖE-ViŽ5sHBdŚā³B‹Ž„ĢhƒR¢Ā¦’Y16Ā=&ēŠeĆw…Ą³DĄpŽÖgY‰Cł’™!‚Yų1ČŚwŲĮŗ¼‹Łvż#v¾ŽLĆn/DŸÓ4kŌ?l^uCæY×TCŪĢ[ڜżŁp„3¬œ`AFĒbBŠ‹Th…;ĒUŗ ›£ y<żŃŒób’0k&±’§ō£„¾#šŚĻ |nē.}ŗ­÷r„›Tf^Į!Æ$R„Gæ)óś “ē\Ō¢ĪŽÉŪ8ę*„WoPóų{l7ųėC8ž·õē3™f¹—Śa:īåR,Ą¦L@2kPk(čć#R īŽTUJ‰kÆd˜ŌPn†sé)Åō3m¶¬HkøEh–U"dū¼NPcQå` Ž•ŒÓ|.I©ØāH 8¤‘@«Ļ!„š2ĪļĄ.‘ŹŽ€ó,8ėą“Ń’… …Ś„­łļ`qÄ(„0$•…-†mźRVåZ"•YE°ÕŚY,c?– ōz^Žį7mpŹCr*Qżæćdģ:<5-Ė’°w-ĖmYv?_ŻōÄt¾Z“F31ī;ĘӶ׌|Ü$aįA $zįoŸs (TII-©Ża-$ÅŖD”2ļ¹ēä}Ņlɛ9Į>·O%Uhx!ųĆ'ö}®°°6HI„u£ ’Ī6ÆĄø9Éo3͜hŚåÕß;łu‹1§źˆ}üŽpl_ÉCB?h/̃ŒĖ¢ēą ¢?¼Ģ“^§)„¬>dż+{ü×ĆńżžU}5½™½Ė·¬Ź 8]’|”ö{†Äz¹0“ˆ[Žża'~ūH²ę”ŽšźŽę7÷«  ?7}®öĖvųķņ°Bļsa5ć\d Zp¼†³?%ē/D5ą"õ™°Ā{I¦<§›ĀŸĒ 5įµĖņ1ĄŹ¤¶QČÉ6!ÉjK,$cԚų”eąŅ“ZҹV“ŠšsVl3CŗI¶Ī‡¦|ŌŚyܐöEA-SŽ’×DP°« &ńÉA+ąFBŌĪe  9¶¦»ų—PĪ–¼„VĘ9¼o„·Eį6#˜Lk²@Ž|nOš‹.ŗŁéĀĪ/nn6ß¼8€ĒI2,[ćf5ŸĮģÖ4įŁģa“vV‡>®7Ļ˽ϠćŽ?s@įvtm* óv‡hąā,­Ē@;§Ež•Ēč’¼r*Ž'füłņ@ūC÷¾“Ÿ(-ś„śīČēI„WքQ{šŚ?É]4qüĆč؟Óņ®CŸ_6ÓĶĶõlł®®JA€õ¦ģĘķ^~Ā„”÷°«!MWŲ{M€XQ8»!Č 4˜DÄ!ˆ0ĄšŲ@&Ą3ŠoĶ9į’ŅŖiŠˆK¦ ˆŅ…`£rŠ7ļYŁ-åMµNøaƒj„HxĒĀtIk])[ˆR|&`–…^Į)øÖŗVœƒ*†y“.™3»4ļ•›JĶą‚óÅ5OE1œ' €HUyWQÄt(øKß·j“*;”Ą’™‡9ÄÄøņx”kózžęåšwżÓ?F”łģźzū–ų’ {….-q1Ū½&Ū>ĖåĒ’ūīÅnœū¶ZŖ Uś2žŖŖŒ§¶į‰ŁāĖqŁĖ|“v•Z+ūÓ.lŪ/’Į[š›Õ-Łõņ‡ß·®gohż¦żć?hßš ņŻ/īó§ŻżŒ†ūÄ ~p¼-ƒ·Lž“MwŌ†3OŲ¢—·ļ¦ŻCėęˆŽŪ;Žļą{Ž…V‘nuOM'²bØī¼Õt ’±č¹Iہį0-ß–Ęå¹ł? ÉŁ!HXē XZ 98² Š"ą³š%ł~ļƁ‡”×-z­Šd“É5 ؑŖ3œ‹6C(¼Š#ՈArŌ-{ĮóĮŒ'€Œ‡‡āB %…S /©i«“i–TŅ1W=Š®„É[(:†.¾hN(~ĻŚ‘ ÄN•| xt®²Y©!0²ĖœPŪ(eՒ,äŅMØŌH†ä¼J%×"”·ĘųųÄā]¦B$ļ<łœˆČń#ß§·vÜćD5ńŅŻĶ׌²[wźčSlxŻäž¤ ’ŅT ĪĶ©ž RWå“+ZĖ<Ŗ¤S(ĘP«łźźŽ«Ū昬.,ē ~0³ņśäžaW‰C,’gŖjśÉn—{“-üČI’µ¼ę‹ū'=ØG“zęŠåa2OQÕZ3€j*ŃŹR¬‘Š:±c€žĆśŹ®/° 9gś#ˆĄ‹¼ąUŃ÷r4"8+<ØVi9)b’.W‘ėŐĄ°H§ĄtTSJ—BĀYš‘ G™}­€hAj{Ul|/“@UčM2 šSƒłIiRŠš¬%9^™$§,§Õ)‚ŠŅéR:eī>6”—•a‘„kŻ*‚ų³h¢h3ģwkT?Gü>ØŚĻĒW\żēĄU° Üh[RØ ,ŒA^Į•7,Ā)®Ž–Å{AŖ»Š}ąŽEÖ'“Kʁ ö¤{ēäųÕåé4œ`¢‘ĘóĘŁ“9Ę„]VŹR$»€}Ńi²œŲ`ŠØą•`fŒ"²Jö*EhĢaŅ.EV*ąģ²Y§<šŻ¼0ƒgŒAņ³t‚±äŖÉ‡÷?uńčq¾+”[ÖÉ-/›Īš¾ĀżļIŲT֗ƒ(¤ŖlP”rµ„–ž(¾Hof›:]ŅŪG‰0gt)Ž=¼÷C4ōn»N¶sĪÅ„ö’X3²Ÿī&ĻsśÄ}S”j ŚŻÓśøūŚĄhĶ(³å(”åYG£v`Īņ†¦Ū“Ž×(Žž:»éöŃļ=ŖgZæ¢9ŻÕ<\‚”ߊz;Ż.© ׈ ±Ēõžļ··x1Tōī ĪĻyu £Ā–6[F„»įOż“¾š-ŽqŒb3Ųīūž-f źœ3£+ųąpÉĪіfuy|l_āw8¶åkÆgk] ‹{Ē3GtrńrqÓ¦w» Šī-'HĪ4źžĪ®ĪÖövśėŃĀtķ2˜NŻ4?X>‹cq§ńüĪ7 O®ĢR7ŌŃ^=ĢͶ\§%õ›g!­y6))wĘV¶ų}Ī˱’¹/]Ʋ٠Kks“ø±ė“Iū,Īķ5-§\b?<„šgćY1ū|†_6«Ńcžæ½a?±]•Õ|ŚŁŅCó½_VzĻEŗ9«i¼L’ŒæŖįÆ›ĶœŅhłŒ&Æą„†æŅzµxŻæž•įp¹Z°1ąI{Ć³ÉśŸ˜?wŚącĀCõ "į=o—ė“ęŲĒ–Ö¼ÄpĮ \‰ž…ŪBĢge{0šgÜ©Ŗ\Sy5łÓó=ĮRGõ;x€Õ :žżņ‚žČX§BōCžF3Ś+UTŽQS*:f ‰ŹŁ–®}ćĒ܄PP®Į¹t%a¹,7ŠpYo2K0Ņ^aYˆŠ­ä¬åčƒQOÕŠÉÜ ė" 0^5¤‘ŁhĶ”„©pā'X”!%kšš\mšĻYˆTj€ąō…<s<—#6JŠw&½Uµ „«­AŗXӢƹ–ÖDŸ¤Ōš<>:žlud ü+r¬Ÿ‹8[CŖxĶģ—ĶÅf6jX¶›‚z3“üČ“}KņӋŽŚ¼™­o7“MIKx—oø±g“qĮ™t³m«±(/ČEøWpBčq_¼S1{}TCĢLž½¬aJO%¬ė %f@֋~Ųć~éŌõoi¹ž½¾„ §®Ö Hõ-ąŗ\ß^Ož_/®?±¶śCŁć®Ó¢mvN¢—"R’Öå†owÕÅĀ>mr7=\tŲųēŹŃł0Żž¾:ÄYŪl½ąõ³;ĢSdääÅ`°>.‡äˆßŽ|ńC(r“XN__žYg¤RŒnPJ!)nć •P!JdX•e ¤ O|Ł#Šv0Ł*"ē§āœŠs€VyĒŻŪ$Ę ŽŪ]Gąy {r6* `ŠÉøČŁč$0#([¬oQ™Zp©EŁØŗŅJšuHYõF —D#eĶF~ŒU4›45ŅR¬*IÕ]`ąKÜ—āR+ øÉgĪśÄ{µP} ŗåFQsę§T£ÖDjIb…÷׆ÓW¤ö]ė"~Ųu.„śÖČabY½ųž?'/ųł ((ČD—ńĻ5īĢØDõxKAE «8z ĖÄYĖO¶2œj÷ū쓆~_ū|žZy€ß_®˜|¢FqÜe`O²ī÷*E“DĖ5iŃĖįjy»otŸēīū́Óni;ex·y=ßuzQ»‘?młT•ßė9¦kH¦·}]ąø‘„|¢UŒ| ć٦’ū‚)®K^ßåõ¬vŒ.ģŖ#„¬ƒŻ’—ż »ßR'ƀū.Š’Ø¹¤UļO2Mƒ„dĪØķ¹88‹W|g½1%D§Ih(* E§‚¹ĘQ&7i P[ Š4G'Røo:p7)'¤Ī~šŻĮµźPÖŗ”[v£]lčøęCˆĘćb® ŹÄ9ō†]łv‘ŹƃĪ&Ž“ČŽĄÆĮq+ ĖīYŹ`«Ģ j¢H/2…i#gC±ÜBĘÆ¹zgcфČ©}žj{ =ŽŸņ™ŻėæžķådßŪƒ™ŽĢ®–T;ŅÖęōn–yo{×įŸx¬÷’:Ӝ5‹Ä¹€ĀŃ“sĢ&ąńrĖŗ,Ėܬźõ4ŻĢßE• Bü;”\œR /tr&£ß/ūż-Æ”>goś%ĶüĻOž°ńćŸzņ#2“”WŸ?v&īķ£>›¤nK”`¼EnÆĮ”ģ(x»Č“ēŸļŲjŃÉWn]LĘp³{NZ‚W—Š~@"VhĪ¢Ø95I‰j ģøć—1Ūņhe°©PŌN‡¢„FŃwhüV „N ·®Źg·Z~?šÕ‚ūŽB5ūHĻåƒłā䏳Żčø%ćąsCLEaõrˆÜŚ ,œLĢ_˜’ŻSļPį*a›`ŃR¶ā AW|`Õsj„*ÜP¾„įo™I VzėaéEIø‹$¹’{¢¢3 -p¾ˆ žĖf«Õ …ėźĆĮx¹G€r0X'bI°ÕJ0.øUGšĖj¢õ–k’]dn_š—¦…J8ҰĢ1¬ēž‘!6›¹k`ÅlMŻ3xŌE‹‚Ļ}—-Ї¶z˜\5„ųIŒ—Z›•®ļgg¶lÆŻ×Ąš2Ž©8īұ*g̶ž–Ģ]š±€WąÉAÄ@1š-½IóŪ“]­æŗÜĻa¼ņ܎ģēćՇŁü8[·Ś"›·!–uq8!f©įž’—UUng!z7-›Ė¾: ’1É;¬?žŹ—"a϶4 JŽäģ9Ji);µ:ēķLŲk ”kÖWĪȝĻT NĄ‰‚öPöˆwČa(—(-c¬fµØM䜌-¼Ó«ą”™h;§Ÿ%‹8BĀÆV0ļ”¦<[āō(ä{3Åk‡³ćL ŻhE"¹_¤¹eåQČŗ¹ÜµŸ’§ųń»üŹp_W†Æī1;öI?ƒ"RģĶÕmŌ!ź‡Ģo“1žÓŖ"{4‘ņƒōE boī׫ĀmZ!\ Ä‚  Gߨ¹+ƒ(’­JōŻ#–½a£Rw¤) 7»l²y@„KHā‰f’3 …ŖńŸ‹š¢tĮ”źńŅ“ ä­f&žhUh]wé@j4"»+ T‘!!{†h€\½šß)ÜēčŗÖķVžÆ8Ė‚Ǝ’nņ&?÷³S'#öČżPȏoj®›©Ņhģń9ųĖPŗtāńėšĖ‰‡o.N?Ć ļźķį‘Y+5öiķ®ļ¶—r*^ßÄ„kīĶā ŗŁ}ݰ—ezü~·5ĆĆž\…łŃ’KøZ×Ģō&sSŲÉ ­ķ}²ē ]c7Īæ^VIĶYaļ¦śx­ÖķVļÅ¦'ŗŚĪņƒmė)‹öoą/ĆnFō³ų A§•\9=G!æŁt×bĻLRƒ…e«”Eóę.­N“5&žŽĄKü¹ĒšøÆŅ¶ĶŗÅ¹ xķÓ»vTSqH,‘¢Q¦±×„ŹŹyG8†²“•KW%:üĘ՛=ē$V j»ÜwE¢é½zŸ’R\JH8"rž…ŗ”Č4¾V/U‰`f^ŅXBVÓ¦ aM÷Ž%hŅ`‘ƒLĻ8ł*Uדxå®Ā¶›0,${ ?ūipŪP”Ƀ‡FÆöq7÷—cˆ’šZÕ:}²°+"G|ŁÉ*¢œŲu"- ęNOӇYįK½~äL¬a(ó[8ŽåĆ" §Õj£Wpxh÷ņ«Ųd¢pAĮn8¹Ÿ«*–±ĪÓ¹›95KNi'£BČ«.ŗ‡¦\Øc†kM•ĄÅČ3“Wq•–§Īx™½Ļ–¾‡},ōÄż[$Sēcƒ˜i¬Xī"±Ą€żį¾±%<2&Ž–”«QÉŽ¢0¹Ē^Rģ ¢WҚ' =]”qE°Ć(«ś”ZośCSąéü_w×噬ŖŃv®$-£Øü˜.ÓĪ€m"™!Sö}ń#ēC—ā$īk6†j&.ÜüŠäø‡Įr‡™"«aö¦i¬ćd•pWipO5!4črPĆ\½kIo‚˜o1Ӆ’ć‡˜«–5Å-Sļ•äģ» ³5qq“Ž8 ”ēwOAkŁD!R*"«²«Š›R £b·Š]¦½÷˜iŲ*Ķ`ŪŹżU®ŃD‡”…ģo„xįUŹ*æNŲ!°n¼µļ{ƒåډĄg Ö©žuÆ ó–^v”ī“}öõDąqeķ‹3źšÕŽā¶ś™bė·ŅĒ««8‰GFYżTłņƒxžżl®T“ĄÜw™V‘,w)ŹĮ‹,;ĖQ‹4|˜=³8¦ÕšTĻŗ‘B—*D…9‹ĮqfśŌ8>„¬Ł-ĪrÆĶÄ*›2eŹ9 €ŪŚFęZCU9Τ“>ŃD{qģ×¹±ƒŪ¦œƒ2± 0CF²Ļ3¦šģōh ĀÜE ^µČæÕ:€I«Ż!z=ˆ:;“eK?[ėĀŚfČbœAē^j«’eĀų „­Ņd‹2½š¤}‹ļēģe˜Qc®©·Āāpj 6ųväG=•1_ąÓ÷GÅ(ŪĢøÕźpāõj„ќN„=µŲhWņĢÓ+y–Ń^÷£WŽsQ¼]@($^;ĢC>ZŚ:ą–Ür”™ūóčŸL^ģ»uDńŗa’RZV/jXk[č£n ¢Ŗp  \!×R6Ņr ŲtÜśģ1B“Ū²²}”Yƒ„7/ŠĢ«°7Ž;ŗ…c«;W™œī2(źÜj{ķŚ1;6 ŹPŌ۠ˆcU“¼NBM± R3wįox[©‘—-T2Ė)„O(–\ŠfųxĢö:a?Ćž<÷—z[ž:Š^&лķ`„ębb€r„’ąXųÄ$!hpńą.<ē°†s¹±łžr[’µF”žOڱå9ćźżēÕ»_§ŠžGž×?¼åŻöžž Yš§ŪŸODź£QyĮ’ŽžŗĀGĮhø¶±“4'zPÜ”I”ƒ“į&Ö©CLśyY¹ō€{\EėC [–,kóH}Čą=Ūź{ozQשy“Ž’,ŠE¦O&¤%Ž˜²öÜź³ į“!@ėĄx‹hKĒoÅ­Fė&Į¤Ę[%bl Ո—Å®|‘®)!9mÖ‘ĪÆp’"}d^NC#0Ht·½!bŁī'ŗŖŖäc6I/A’”dšŁTŻ<%Āc#źŪöüĆżī6Żæ’Ēš<ˆČū»kZŌ³æ§ŪŪ×»zö%±ŅųlsöæĆ„ļķõ‡vöū_ēóšĻ6Hēן°£b 8ĖcؐČń¬AJ•%ø$cIÄMŚ]·I<ō”kŸß5ęQé’<ŌŲ“ƒ›’ęyLƒ¹CßéŌ6œŅõM=}×N “‰ćŗŗį飄G;~;cÓ) ‹ K©›ĮóėĶņ‡‘üĶ<žTAmŃĖåŻ§Õü @›:¬éŪå¶Žķ‡t3š€Z˜sż«'1WϿͣ`9~Äżoo®#Ą“ž„ÕĖBƒ¦““,÷,l.sæØl MĪōÅčä.$Šƒź½‹ t‚„RG]„  Č,ĶŃ\€^O†V:Æ"G<~ž”‡CA€8!cŁ#2Ž]†ˆ½jŌŹą Čü\€nŃn'7Š ÅęJÓ2·ųNE)TäqĮ™ŗĄÉz0(Ł!¢3KĻ'N{Ź©X‡$$ ŲT.(šÕā>jŽž/õp;%»e7·7ōĄĆshM:—ĮÜjŠŖ ēh3‘˜#|üx»}n ;Ļw˜C.‰ćfō$.X€<Mū»ł©…ĮG!ź¤KŽ"f&ųū‘K‹°^Œ˜®Ą Ću’eÅķįś  +c“$B„R÷Q'坚ōÄq­-H=Z… ŗ f…ū£g#&s·> ꀓ-hQF}JćŲę,š 2!6ņ°½•[’ÓŹI³<ˆŽģū`+¤_š0’ļĮVĮŽģ}ę#ŒŅ±pɏkZxՂlĀJĻ=¹ZČRj¢§Ņ“e’&‰- xģ²C½8›TķšĖ‹ÖpQøĶ0 ˆvNæqąń©|YжOø /‡õæķŁü},“Üļżq½eĖå©É”»ƒī&:ŠBŠJ!¬¢r=i%N±„Ók / ĆgŸ’‘h+¢¦£¶tū™_ėq”®*“§Gø‚xxч€®ŲÄļ—W›T+æ’qrĒ1o˜<$u¾­Ž˜ĻŪ§ŸųR ×-žH—UsG”u2-§G9°X(8aĖP›×*3MŅkŃ[‰@Ć}m u"ŖÆ©W‹Ńa)æ'`Ó@»ŽZHW®ŪG#œĘ'¤„H{Üą9g] įŖ.Ź“äMe5]Ō&_Z4Żųį„鞄ąÖ"ś‚ĻĄŁŲ²œ#³#\%!¦KBіęx„V Hсf* Κh¢4Ž÷Ņ” ’!¤j”=QɕŖs”ĢbaÖčė·»Žn7’9ćƅģͰ«DBJ&SjŠŽµEųˆ¹Čįāzw÷ō6žrœ¢=‘Å'qbĜo 8€Ž«¦£Ž¦Ž_Żlށ(m`_U}}q¹YßpŌ8Ā<ĆģŚ/±}€øŚó¤ņõe]ž½¹ø$iūp{™·mBńĆķĮĮńģöóÕ „óķņŗńćÖCM§^ܽjņ†_ŽWö޼g]ķ1·ļ/ļźŚQūųĀĢČ3gƒäP«¶’zŽŽćͳ/~Žšō韷.Ł J®|9+—D £ssPx‚ėVŁ–½ęŚÓgŠūäiBė„` ‚Žž; ½©^@1äÄzF‡jcck ŗĻłčI4@–e‘Čšµy\ŻĢ­ś„ b¦įDX¦JÅŅ{p±w;ĢC‡Ž–4(EY6ŠÓVe„ū§Čˆįęø*r3,ąŽcŅń7Ė1|Ą¾Š‘ć­l/“oĮI5ā‚žėĶ”AŚ|÷ŗ4g›š¾ÄǦą(«5—’óŁÅøPÓĪŹ.ݾ;Ū5¾`DŖŹ  \Ģ‚ä“ yvł¦lÆļė»hOO\̓RĆéØ?Ķ=’ø¹ē”Z\ż¶¾Ę'@éœÄ’:¤IJ»ĀY¾!CWåT;ŹE„«×ŹGć¢ŪŠ·ņ~ž×LOŽPČ9MˆsC–8ē™»÷}.ös¢XžöńCžųf<ėĶ05WŠ’i’˦]Żo¹²:wģü‘$õńŻõõĶ-īĄ›]ėm×8Uõ U]Ԍ£ć’«š¾©¼Ć÷h/Ą}žõ3Ųņ T†UZ[%=äČ„įśjč^ī]CBiM„ŲĄNkÉĀ”(Õš³y«ƒA@Ż[ŹŹR“ŗŽžģø‰e1B•P|`‘t¼hÕxqŒP5«W17„pH6­ŹF雧R”—ĶÕDßš*£ńLŪ€É*Æę\[Bص*˜oö€ńĶ LWĮ‚<[ƒf²ˆwrx©L Å ĄH Jۊ[NUŁÆ„žæüö·_Ļśn°0zs޽kó½ŗN“?Š®Ó:“’ÖĄłČ¢?k”šōÕfNęÅ׋ūA֜$]¦\­Ē˜øk"Ó^ 4ū÷ĄEēÖøx÷†])^Œßb¦µłMĶÓ įgŠäéWžöµh·’Čx£æõkó"(›¾ĒgąLŻŖLÖhƒŲ7‚Ķˆ`|AŁLÆŽØØĶ\ßAA“.¹{†WS„;£µNBŗ.øĄ$W1öÅ?`‹lF4ڼe9T ܇9źh4°ĖĒaīƒCĮ¦«ič¾t$Ņ8°m€f&k@9ßø‹ÕC>ÄNӇ.,0±Ėų2Źér•Ž©¢^TšRˤB1 øīyX‘„šĒ!< ¶§bXœ+ó­öÕõŻż7 PyBž> ūKńš÷·<’‡± ķŹøųˆ<Č՚&鏇ükVŠÜ2•ż%Č£ź%‚7xāo™+MĆąu풟½k[Žć:’æ‚ĒU¬ŸūeC–‚Æw#ڰ÷™q.u@˜ €Å %sōķĪģ¹ōĢ`"HÉĀVĢ„§»OVÖ©ŖĢę"ī)5Ėn³:D%Mķ]r…ź@†-nø¬÷aŲ£’ó>ߨ‹=X€2š;kAiÜ­ĘtÆ¢ōÄö›£›Ž¬E2ź© L1N‰…®-EJ@†ķŌ“ĆÅ=R ćra/,MÜū¦fo‹ ŽžņHéLČ®c!āŃQ±Ś|Åwž‰ka}NV­VÅśJ>-Šæ¤k’ŚéÅa›N¹DŻTrä( €f›ļćŚby+åŻĆ źL›ŸÜÉų囚–Ė7eqņߗļ߯ܜ|ż®¼żĆē«ę-Ž”[üe2O¤ļŗ9q}NŻĘ%+Ü۟ČMGC±6_8®\`O/šsq?"Æ>pžķõꊯ©ļ¬š+…ŽS(Ń"hǜŒķ H—Č6Óņf£?%0]Š _¬²9¤Ń]h)°ģ§+ePń2n{Ķćy>ą½ €XjŸ>B¾«Ę+PgTń„rų ¶AĆxH춋שF·S)DL ×N yjŠT‚)Zž‹ˆßžķĢŅ‹µ¹Ņ\Ī>²Ė!S° •c| ł½Æ5O¶U¼Q)gØrć„ę\ĘUjK!Žč{ ļ8g¾^ŖSƒ"ńł÷Æ.čĶYßóÖ_¢’ŗŗ*ū0ż×µI…“o®ÆÖź¬eźķXŠXi|"dæ}4{.T}2~ŽĢ 7ŒchDß$;\4\g›¬ ®œŪƒ·åc]šžĢļ ŲÅ;ĘĖ‚ó’³AŲ7ßżmó^SóśŖLŚĒ÷Yōl!öŠ¢ĖK–é}WC8O;5vZŽ°×ÆÆ7²ĀŹ»u«~sž=7ŽšĆ¬ź5<.O‘ō…³ ęłÉÓf}ŹŽŹź’ī,rŅøÄ6Ņn£ĮpĒՆ­ź.jßÖ¬LŚ7㢁",€y-Ÿ°¼Ą2‘É¹ģŠ’¢ZÅåļēsn»q ŽÓąpo˜ŽN?Ķę}Ēēl.¹"Sƒ™’±\޼)īĒI’g¹Ńž™žf”ܘõ_V‡Č?سt¦Õ~‰łSŽžŽˆÄl™Õ\Ü#b1ʝ d9ķĆD³Éˆ®"frUWqSēń>QŚ‹ŻWEdŒ2tė¹ūaĄąUs®ƒó:+ł‰’SF$« ŃLÜp©ŠĶŅŗŽ5¦¬ĮØØ™šf Š_‡ą=C©ŽĶ®«:×ŒąŠ©÷{ų=łź™eåKJÕoc)9łd:”²6ŗ%␉×nG©tYLh!ę”+­+²{‡Æaœa9ŻöÖiAĖiv3i_Œt`¦†”%9Źt¬ŪµO6«Ø±Łż‚Ķ±ī°š#ŽæUŚq#b ņ#õ©™>²ņoŁU}śĒÅHtQ.’ćäÖĮ¾ī”óāŸČ!ß?w÷¹Ö„õ×D*Ł+¬æįćlo’ģ½ōŪY3·vō2lė–TGEmSų˜ t²ŁŽ”–ŃŪSaå°łJjv­všւ—‚+qe®:2VĒbžCwÄõ³}čĒ¢TĒŗŽąm…œŠhC²IĮ…\@Ź#ĖÜęeé‡ÜšóC°Ź’3ŌÜÕX(XÅXĮŹåœŲGŠŃ§Ü<t< €Ź#1oftU„q!°kÅąkFöēc¹N}óSCZŠHæ³X=GÖq¹=?ćcD_]§÷·ÓéÉāźāęF–'Ėė\įz)'¼€'żś‡«ĖėŅ/ģļ^ö§¬×j¤’¬Ē<nó45łNćT­?€N§o.śĆfa/õ±õäÄōŲ„ø°ŌĶ)*°Ą¶Õ~b@œņŌZ1±±oč’LĪXłš3éŚS¢ `µØŖmV”ųÜ–WģϰlIҵWģUu‘Ū֒§šéHČ&GZ‚£×G`Łž0Š)Mƒe‘Pµ$”M«¦Ōųp0g©Y‘le9Sid«8ņM¢¤HO§@2ŅćŽ{ĢlU¹6¾M,ŌĢkĮuK ¦›FĀcœų>ž<€õŸƾūó3ĆÖ§£Ōē@œAFL$˜B-”Ń)2ź¦Gf”ö!Ĺ,·ēņ‚8æę.ÅGQ$d•–#ŹłīĄbĄ[†3ɄģĮżĶq¢'RāĄŠXėK®Ž*MyPJl€ōĖp%ĢłŽĻˆ•Sü5'%½hn€į¶2.¹4łK|X#ī䑔ĶJ ):`ꙗ'SˆŌ—ˆ¤¦€¾ƒ Ń”HŃĘĻĬ-'9'ŗµćš”Ļii¾ŠY„ łyŲP@삣͙6nŅåŠļ›U05$6C  Ķ ‰Ē·ö?āLš8ā<;’ѬÓ&„i#5*A39Ō hūFfGo½öń¹°`²? a"ÖĪūž“&$µrĪL éD”ėR%WƒŽ0o”‹c%5Ą 1 ßāŃJņ&Jtóōpø«šĶ1h­tL”¾•\D8'ā’¦PøØ Hu©I6^'Bē^č¼O”cĘŚļxŽb=qˆŒ”“¤D0œ$¶Ń“ėHŃli@+ėžÅ”drØ)NÖĀĄ—F3Ŗß±“Gēę8-\"2,×ūÖ u<ĄLrD.hŁ"’sāĀ|ä  Cål!"†fžŒ+@ ļeTœŁ†3}€ŖnqWś©(°ÆæµüõnYĒģŽw\ jM{ū¾æģ{N-²‰Ź«–YĻw¾TŖŌP ƒ¶WnŒ­ aĪō¬,&ˆ‹ ©®ŠŁKzó5R²ßcŸ«_nXZW$ 1YSuéX1Š!QČŅ -4„¤į3kH ‹”CŌÜ`īq?Ńj˜~¤”ĄQŁŪµ'ĄX+āŽ_ż@~lĖ*st¦Vg%ųŌuEĒŹn+¼9ƒąOÄŃų&u5Q Ąļ˜ŌnćĄY™ź\Ų_Œ{*X«ł·ļžvd-4Š'‹œŹ$ Į¢±a6Į&UžØƒµĄ¤½)Wē œ~¾¶šOgūŸoNžt{ż1o+ńå™K4zæn3Ł~fæŚķŪ<Ļņī¶ņūó(@¶¶™‘7é«ĒĒęw†Ü6•–w‹Õ]Fb¾[¼ ņr§®€órµ<č<Žu8ŅŻ|’ß½e’żŚŽm?Jž-s[ć"ш\)U„ĶP!"DzĖż|ÜüģŽŪh€ˆHµ#cy$E—ßn*­eF®¢/ą³—x#£UˌASŸ#•ō4•‚× ¬*0FÄńL‡q×Ōč8ڈiÅNkq¢Ŗ_)Ɋ6ųĀ1õ”Aļ+²€h+ÖzķOXć>cÉ;–hß čĄ±į³š) >w냫6”­&‹%ī°öóPˆŁ6ū<<ā”*A’š HŪ_ō› Ćźüž¼Į©¾¾ż°¶!i+(`Ž‘¼ygŗÖb<ŲEˆČ'Ø A‚²)ż NūqŗZY­żM„ĮąŅ,ĢÕŌūė¬Ēꪈgö ėAÅō‘ą»QÉ:Vś3HFwµ)£tŻ<’莕Žj@$#ŪHµ—ķ„—19¹čTĆÕG”øzå,d$¹£{Njījā‰ó5õ2UƒRĆä® Į/§ęTQzdČF“ Äf-õ(<²hśhĻŤĢ:¹Ał×+؂Ö!°zLĊJM <%䀋-eķ>’vdDåÉbĻ8¤įŚ Öc@ŚbČķHplń¦c‚°Ų2•6¹a©9CŠI=¾ē6‘“[¹œtwõÆö+G'HfŃk•¾g ¶&Ŗ=ŲŌźEŽ]_=h v†’ż{ż’ۜ¶#Ī<¦ ńåÖ潿œ†ĻÆś­0M½īrņõߟ;KÕ~'Rß ˜S=ž`Üt/‚ÆĪóävō| ļLbŽ^,OõĮ„ēĪ»Ż¼eDAų]¬[N›Šz]˟”jv:ī‡ūžź‰óoƏ’a_° f–š)tūւuE÷”é>mŒqė Ø±ńėlŪ„FDF°®XuE—©ĶY—N­ŗŒŽ=Ļü(Åu‹l4=°Xc£Õ"f‹€Ŗ@Ŗ›õµYpėŽeI±Ź–"āć˜Eћ©Læ[+ƒ‹Ć.*OĻ5ƒŽ’t„b (Öšé]$Q#×·°±C5¾ł‘’'£°ńŸQyڹ÷dā3“‰ŠÅFŪ]×a£„ķE‡šdś›x°¦"ĆoFėj§AYķ='$ō³Ģgįä#R~#pĻ‚ ¢yĄą’U²iN#U箆ŌDĶüŹ® s!“ų‹·I±†>,]MÄļS#1O‹’ ŽĆW"wŠF{SčŖŖĆQŌÆ©/vVÜi—@«ÅĖ\ā}ØdsBVH‰Ē¤&‹ŗØ#Mn%*[hĻŲcq#ĄžG:’UcÜ$ÆłōŹÄpõ%3°ó÷“Æ¢¶)¼ŗ¦uęõÉ×åüŻōČ3ø½ĪŁélNžu{ ĘÓĆŚ“ŌķŸĢ{’±«öžv!‹V‡»Ų:‹[rą`~Ræ˜Ny¹½ÅéŹf¦kuxrÅ&ŻÕļŪ—|Ų>ŹĪ£» ÆėW°ēuśõ@qūŻ×]¦ EfÆĻō¾§ÜĪÓÓ×?^#ŠĖ,Ąm“J€`«¾u])#ŒLuŲ¬³ÉM‚ŻvøMŪ1Ō_ļÕzG”CA&4z²€8± 0Øcö;²!” Ӄ."Ҋ¶NZKÉ>ÉōŹ‹÷ą€U;ēńŃŖź@kŪģPmó8¼”ŘqHŅ}Č @ģb½†1²é­F*‘#n “:6:‰ M5d“!YG‚Y<ņI¶Ö„J=$¶Č&É~x±6š¦ŅdŖš‹€ę‚1·T®Nóå¢?żåO¾™žøŗģ§ķ“·ŪFÓ'ź·€āĖlŲ'̆™H×øŖwŽfU¹|EģĖĻdSćņ?V†śDģß«G­BĶÆ5dī€åĒŪTØ:·}š™ƒŪŁ0kT@Ŗ`g¤‘øøź k¹rŖŖ­.Fóz•…¦°ā=Ūqc25¼fpŠ pēŹŽ0›“\GnŹs?›gZ%ÓMµH­%刎Y§8«“oŠ[iĄ¾8ś\‚Ęē Ó­]4§¬čĘ;ūżĶh)dÅ*Héx| “ŖKėt÷lkBm6«*4“­pŻhnņć;g X«ńŸD¹A2ŁeÆA’)4אŌ?Ū^Ż)gŻ‹vwY–ma =Šæ'ŗź”3ķ¢8¾¦ļ®5ypūĢąŚ)w¦Ć©:żÅÓ¬oo™ńżE.8q_ß|ø½~ŽåäĢbµĆKę]ļÕÅZū¹®ÅQ*“ŃįÉg0\§ł·×ū—å°˜œéō°]š呢÷yÆe4ŻGj©·‘­±}3Ö®{m㘪T'9‡`“ĖŚtķ|N†$Œ|;ž.T"†f(6ĀĪ/ŗYcŁX¼Ź iRH0k„Õ»ķ4DC¶˜»²­QöuĒč!"  ‚×z°-ŠQą3*4ĪĻųJ”Į6h׊ ŅN,óąšAQŁI„,ŹŅ)ŗ®b§;ģ§³ųˆC#ąh2’į3r@”6ōQKž KóWēøߜģ0ŌżõłĀ?~yü£eWõĪŚŪ}õŠÉŽq—ä]L\žā-Ģ&OyŲ€Ž"+ž{⶟w+?ƒām›tIźŖB³#{«õ‡Õ’a„v{ŗW%IJx,Ms–¶s6ró<¹fOjž”g݃œ;Æųżž„}½¹~‡}u~§ 4Įūn RDų”«źnŠóšZ‹čm†?ł¼vō¾#»°7XOĪĀā`k½6³G¬)H…@-†øŚ‡7ĶØBć8ŗUnJ+ĒmOģXĶØ&¹RčSē*``ē{‹ĪPQ'¤eZį`;Ņ·žÅ!k Ö“˜ÉɄhµTķņĪŚš“8å-Ž×—$ģ b”>7ƒō0™6śVdwŃgšŚ"lDĖf{u§- ©„nļ;h”Ćć Āß ī¼öęźśņśüĆd›sŃädeoOžĢ‚Ēē{É~ŠījX¼€ī³ ‚Ü…`”ōqÄŻZĀą<ĄÅŁQ^±0žÕQ¾•GŻĢ>‚[h«w% ¹ū·äIŽųČ+½Ēć]ļ§śŌ®ĒÅó™¾O$$ž¹ż±õé’Šś4¬~[.–ųmŠwr¾%RßóÅö¦Z ĮyWOĆõ[ŁAõC÷`Īż•g Ż' ’¤Ź˜¼G¦Ł[µJœ}NJ¾J\L1­[§k5„Ś”‰y.ŠeA]tZˆ9!“Mąā6zŒ°ŗ€äÕ©Z[b]rv|ĢV~×¼v/ĄŲf%Ź I*ķ‚cL>š ęRpaŒ‚#,fd„ęl66Öw|÷Å)颊!M–,š`©ÄĘÖņį<rŁd¼ĆS5ۊēf]lü²ĄžźōŪ÷‹IŲłÖ’„`=PóŗPÕEėü c•ńÅwŗčś#°žøÆó ­ž4?;Ÿ÷š_æ§ÄüS€tmś|ŒSķ|‡Ū’¦6\vō;Ń)«l”Æ>?d»é§¢ļŻV_{(ljG¢Ü"Šįa°LEgŲŁµĪ‹”RÕĖčĶåH/wŪ6†ą”õA*ŃŌĻ 2mü'{׌ŪFv%æļÆąĒ Ö”ļū1š.‚Ķ ’ ff³_…ū”K¤Bж3Įž÷­j6ߔdO¼Ę`2€-ńŃj6»ūœSuļ¹UŖXo|¬{×ŗfŽm³Č›YɊLŚWŹÕ䬌Ɔ“αFEé :*ł“Ó>Y@ōÜK÷Ńź`lųŖ­s¹JEŠ>’מ=˜%EJKŃŅĻŖóE‹wCµ_8¾`ŻL+©éڹjŠWœ8KaBźƒąŌx}­/XĮÉÆŲH)§ę“#õK÷Ć’~=C|ÜOžø !ē››ĶÓĻÜ_§Ż ¼z¤?ģæļOÓ9¶z2&—Əėń/Ļ{U•=˜U“ʳYZIÜI²ņ¾.†ė"-Y\ė[,Óš†]*+®g«¹CØ&#ķ‹ŪÄ7k¶6kE’qĮ!Tį dQ2{W¼Ć'd“čl ĮXµwžw­4P”æōŹ•O„ …dŪ ŠE(1"f°æ*“ąŒhƔ5Ū×¢Õ6Ą? XÅJv~ ÄZ0Ż €ƒŅ‡-Je ˆ¤hW l+Ø L¶ ‹h™Ķvˆ\{)Wé]šĻÓķÕ|1æ™Æ‡H|X.ž‚[tµ¹Ļł¤Ü§łģkØč:°Ńķ² 7@«CōpYŪ¶ƒ¬Ņ}NÓc=Ź#tp!Xs¢BØØ'Ŗw`·¬UpEʬšŌGŒ ąć±¾®tŁńSyõńžhÜķŒÓļ|ž8łĻŁĶbžŽA:y“łųó†Ŗ ā§Ł±0¬yJĘøŽĻ±«}=ųę‰ oސ[[ē)»"īÓ{ś¦Üą×Ńéa:æū„3Gś‹8ŽÕC>Ü­qŚŽ_-ń™O‘ńm~ÖėŻQŸ§ŗÕī—Ŗ ™]µ€ŚĒ‰5š$ÖŌj\ݶĒē*hLā ¢E<ŲįF¦né@‰€-š|0„`BTŲqA¤ėT|—²kß2*·CEtZ`#šŠLLŃ,2oĢND­›ŽŪ0śAqö-ÉPŠB q• 2G3EaOŻ!æ8ęÕéQ‹£Ī( ĻZCŸ[N ļI#;™WE¦Ōą™f,A6äĮj|oŁē ;qB§Šs.ą`żBĪyh‹‡»vµlõ6=Z¹«›å:ēń'œ?ӁqcĒøW’Žy¹ A÷“s BŌrŹ’ā$QČŗ&įPž‰¢ołśń6Ļęõ„1y„Ēyö'óʗ®čßd’ßc˜å›żeóč·ųiłöźfŁŚĖtqµ~ū9–uś'¢ŸŒŖĶ¹Ż=ø>8ē²sĮ4lj`“a–ŒR’ˆŖ ×(©8€«w¾ģÕŃ4°‹%ÆQõŹ©¦p»£ŹRŠĘaĢŽ#ч¤T<"p„āDøV9R=‹žƒøAœ7‰JZŻDÅÖKYŗä‰(ŗŽSŪ¹wŹ—V@„ŒčJš^`’īĻĪJ¹P e8a×{q(ėÅgdd DVBÅęj/ŽB˜L-2;i@ŻAh²Ų:ø¢žżō&$­OPņŻŻāżj‚B>].{ŸõĒÕüėæž†°Ķä ±u×A\č |Ć6mĢ`$|ƒ³…ōq2 ®;|žĄz9ÕŸŽ“2˜&ü‰*”Öq䜒‰½‚ ƒ£±¼2WRoV{ā³GIĒįš›ć~ĮĮ$ź-•-·ēG„qs¦“Myt-§[ĒŚÕ«żCĻ ūøŲŖ=Ķ ŪR:>{„øŅ‘‹\@ć7ĖžĒ7”ŖüÓy`ų¬ŻƒėĶķqj’ śz ;‰ZŅP5£Dąq6c…ĻŃØŪõ&”cØĄčNu g-ŹZ.†&ĪėäŻĖ>y ÷$›õä{4„/„Už;_Pē(nĆ­O•y¤źMÕ^(†ēŹ~tĄTGp:»SīŲ"*±‰ń|8”6'ėQšŁŲĄŲ KąČ4 €V)++jPJ‹ożŸD–Ų³Õl¾z6ÄaزyŗB¤AmJ8‘’ŹOČ9l‘üv5Ńžō?a3¶Sph£6żdČŠ—śjØ·dh’МLöśƒdÄKē.d‰—‡ŗ†LńѝjŪäó‹\InÜA’8ŠŲ ­qÜźBx)°EP§}|I"Rśæį^¹ģ$Ä)ö­ qAõb€ų‹Łq@Čl˜¢ęņL Ā­čŽ~ōŸ^K(l{)“ GķŅĀp¬HR*²GmC± mźŅu‚ķØŲI£Źķ‡­¤„WŸ¦| ŲÆo”gæm5f0×Qģ«õĶ (ÓŁšč(l€YCH ą:Sڲ7ܞ™Ÿ’+s@½F k:”'#Ąœ­UŗK Š›éą£ņ’=¾ŽĪ£ŽŹ6°AšHpGõ €Ä"‡č“h«ķ!¼ą|~ŽÕ÷wßN‡Ńažü·2ū-ż{޶åē-{°»–ĒåŻt ĻÄĻēī}SĀ™oŠ2ūõ‘¦éȕ€UPDK§ŹhīZšHnūŚ+õ†;.!øYPąn-Ōn#Źh–ŠōŽå8²ŪÅE ¦”Į_$Į†rm€Ā…>ā%™Q¼lA•QTomąŠ <.XąNŌ]åå¬ŻMެÖó÷-½kĖĻÜķćaēpŗģO:_%³ŗSćĘb»fłP¶“ēb+öžįžn+æ™5_—~„sē}µ› {æØŌ.YŌõ =pxC æš4ÕW¤<‡c@Ć7š)@ö•›Źć6Ŗ‹ļ? śjüu}|ۜyčąį„ "Õau`Ą3Į#1¶¹!oLjJåmm¼ź‚ćš¶pč"äȖN׌Ęƈ}ģÅK©³ ąuT>Ÿ‹õÖT°N×Įz`=·ź8ŏl$’–^ ‹Ż/<¤ßÅŅ#*²ęlZE¼…Š5¦߁¶¶^bWUKI4Ļ$ ’Ė„×pž§X¶†õ"r ČJQ »8ņ ×LW“-)U­Kģ{ĮŽ‚ōÖā‰*‹ü?ow›!éu~}7›Æ?¼Ž,@Ü^‰×ļģIÉŻüŃt³ˆzØæ‹õ°’žćFßqŚ"Uä”28„•±įūZ:Įį¬ā¤‰“¤B¢õģįÆ$„źČ‡~*ż=„ŗü8R+÷óĻ7K`–ÆĖ;@Ļɛ†gŸ[…!ȓܳūšÆŲģ¾|X›7‡ē7»Dw6ū±Ąy÷©»g×ū‹wRė­u*EøE28ÆĻ)£Š’ńŃC§cĖ­©ˆVpĒr ØéRøKŅX@Ŗ d1”Į»W=¦Wj‚E·¶7"ų©;bFXYEŽ8;®xc;ŗmضGæ× >T š»@”Æ!×N‘Įlk¦ī”#µ8.šh—ŠĄüŽ“…ÖČ(³%—ŗĒ7ėJ ō^ŒŖ”rw"Ē"%‘śA J²®D5Ų­Qxę™?‰ä’^ jG8Ą9&¶—’°½¬, \Łž8ł>Ģ?]ī”As\ōt UES@>N/pŅIp?¼½! y.¾ķ•²ēˆįŸ K;,÷9J–±KŽcCŽzĘżxs,gĆY„ŁÆ&W“C˜‡Ż‹į+Ģ›wļ®Ī¼įć>” žųŹQ°‚óÅśj²xwß7?§³¤ÕĮGSÖr1šżµŻÆ§øu¦‰£dξ²¼ŸmŠųdüž‹zŸHV喇śj€ˆÓ”Fmq%ŪŽŻ×¬¶nĆįķą „Ūf£Ą‹xŒ÷äįćėƒ›šLöąH*YxūL]ŠŽ #Šęš0ą})HƒĒ4•£”‹’TdR)8“²‘ļU!ķe™AuzÜK%‡¬‹K,ĆEWb(¦šŅ±cgr—TUJŌZ嬒WÖ)9p‡|M—Ė®R“Ų¬8bš4vÆØŻźR)į”Į{ą‹édFȎ)ƒ­pü­sųĶāhµģÅ.ē55S.R50ż„TU¬‹8Ģ*"8”®R֚©×^=*’S”=­pŒ7ż@R†Inä£1ζC@—„ˆkDĪI”Čź¹ :[ą@g±/é1ük—S)’A,±׿r é‡DKš›Åäfw 4&q2;}ę…hę`øģƏ£FŻäļGÆŸ??}JķęõøéėŻ5¹OüéŹ ¾'żUkÕDC5¬ĆŌś$*§w©“…C4ć4 xšŻR_¾›“,ĄĘ=!­$āDüķ{æD3ŲBR=Šq$ wģTĖŻ Ęį£śā„Į²C÷{ŃՋp &Õ½Yź€-Ts8¶ŁāEeƒuˆøj‡įnšūi7 žz’M]Jā¶Eā ą:žÕĮ²ą$D©ź5z§}D@ś¤tõ±4”7Ļ—Ŗl‹¶ē’Ü?xœōZ£'ė‡ŻEE_&dóõ5x:I“Õp»o£óĀ,WÉō°•Z%é–čuÅywYÆk:‚°‡šĻ® U é4^ɟżt׌|9ūėŗįƒ'ß/–©­&Ą7,·ėŪɛŪūŪĻŻ fŽčųF¾tX±äÅ?}÷›łmšļ–šWÌŲfā™Z¹»^ĒĻ®÷—č4šĮOÄĮž‹Wµ Ą|ĖUÓXŪŅ$\z+~Ūč¤bćü­ŹĶ&L‰51ąµ8ŲöķFÄ£ W> Š¢EhE©Ņ’Lk Ŗ'…ų­Ō/6-›’Ą/#©Ųƒ9gjEl¶`M*t`üŠz]ļ’ĶlZ6Ķ•§­&öłhŅ×jƒn ģÜöš"ĄqVŻV f¶%Ńf*3Y‹¤ŌP‘¶J ’ÓQĻõ5mF½O;:jzl§±;( ›_żżfŻV«W«užßÉ P¤ÉĒ6:ĪŹ£øgS9£_Zpł$Ž dž|ƒ€x§20]Ü慕į<×CøŸ“”šõÉ·zg¾ūށņ~±|Ė˾DLŸŒbb’ %Ńö…¾¾»ū˜E-æŲ…*OȍĮ ćŲŒū–Ė£Ą¬2mnˆcU?Ļ•—„dŸI•ŸŠy~MŸ›Éx’ÓŪo‡ µ™ŃݲżõŪpĒM–Ķ_ŽąR£ķ8aó•ŗ’īÉžÜBČöį!=ŹqĒb蜯ł oåē‡?æ'RÅžų•WCæZœŽ.Vx—æŽ Ę0¹“ĀŻ=_mK5•ü— Ę(ˆūl½?°­‰ČāŠĪOģI'N”+„Ņ€N¶Ś]c €‰C’o¬-”HŁhG§"kZj¬7@r{3€ø"¼Į±Ķ‡%xĀ’1S ¤’„ŠĄ¤°R9€$#›;ĀuąØ«Zt®ćÜc³¬¼*Øi&ŌJąJŲZ—Ž5Ć^Ł.”õ>’tfŻ£”Į¦eiSZ”ćcjoŠč:QāGĢŃe‘¬–Bg‡o H)?µ^Üż_?¼Ę’é_—…‡%bńdĮĄÆj"? 5`geā ·\,HæÜݰÅu&qVX>Ā?ąWžiÜÅKuaĄŃ/Ō…gJǹ«{Ķ÷nė‘ĪĀp˜7Ļöńwc@šlĀU–sY;ŃT– ŻłTBkEZٳ&ē6ڵķ:psņ”ÖĖĘ5ŹE¦4-*²-²`Ą–ĶWÆ÷ 7$jąxi«ą$r!žF[Š\2R))VE6Žu9.4)uAząmėöŖj žŁu²#ß@œ³¤„¼ęŠZZĶ9³č4 (ŹNZŠ×b’µ^֌”‹Ļq݇D÷ŸŒOwųŅŖ iZ¤jf‹Ž¢ū$ {,QŲž>5į¾.³łĶ«ÉĆ:SɉCkœķe,p}ąßök½~ƊćwCcóT§DG–ÓŃE•ŲÕ{6 s¹ŠĒå0ē½G¬>>ė˜äĻ÷½¾G<üŪ\]ˆ'½š4a8Cyķqśįżķb¶ę!Žģ¶)¢CD}µŻpœz_˜=ģŸß“žÓėn’Śz9Ūģū‰¤µ¹ˆŪß×Ć;p:]öƒ ™R³Ō¤0Į—Ž8ąW.Z U::†Œ2søŽZ5J‘°]„ŗl®¶ŗ(Ŗ¶5p~—«²Õ¹–“—ĀŁäĀ2WŽų¬ —‚IĆŁ1ŻŲ”Pé0–5= œģųÓū®Z—©Fs ½Ź¢55qƒņ1¶ęˆ SR {sŸTLėŲ›¤_žÉå>W©`KĪ‚†i™6+NŗŅƒd®FžŹ±Š¬°¼Cēo€Ü†ńžžfgż>ĢU›Ó{µ¼‡¼i4ēļŪ4ČS½%FŸ"H&„8¹[0‹„»æżx©w]"Dµ”ØH“¶JPcJZĘą*M¤ŅAōf£§ż}Y?>¶× §įŸŌł,Œ¾äOö1KĘņėĆ3ōäz8Ļē@Į;»_Y”Š(–zpŲkƒ×‡j)h_’j9ĖŻ’T| P Z ŖT#€pēŁ’„éOsKF@x¼ģl¤‘t÷JŖw%[‰Ń”ow#”±ŲW¦…aF,äl6bļE}-¶kŻ*÷•éR„€§Ļo„5€EšāxŁ>sœ/€_%Ź%“ ¹„˜Äy‰`doŲK”TZė®:?¬7O ”Ķ7삳šµēTašį’Q±ÅE%†eū?ö®µ·#Ėž} ʔėżXĢ—»X`3˜,0łfŌÓ&,™)9t0Ųß¾ē4›ģ&EI–ó@8¬īfæ»ī­sŖī=÷¦m·×ƒ$Ć,ģ®}xMź¾}]7čgńŸćR>ų^ūqˆ™-ĆŻ_6«TŃ<‹v»«¾ÜÜr†ļ‚Aqį‰J`šõ5öę“L­XJi¶łŲTĘĀżz]ž6Fsm®ÅoÓ’2<Ą?¾¹ĀCĀpx°_&NGĖA’ †™Žć6śŚqĆ!깋ĶöӇ2&wĖ”ōažq¹VÆĪ ¶ŻņÖĢ+mš•‡Ļ’źźĶŻfµ#óóć;.¼÷”d™a%åi²f i@¢FkÖōœčĆ1Ėī܉ģYĶ#¶Ź "g¢L p8kMyRŲV]Ēl3+)Ķ$ą‚œĒ‰>Äą)źńśģ€×“UžT(+XnX-ĶrīĮ䰉CtR k0VĮ-’.1„<:3°Ėšl4‚x©Š^“¢dpŽŻ(ƒƒ’'/„äd‰#ń$YūĢšźāH25Ž  Ó³:½ —Š<ŽńõŪåŻ»ū|½\Mļ’Ō£æ[¾}ĒĻ ~Ė” p#ĘOÆ7Ėm[¼Ż¤Ś®F•ś|žd ŹųĒ·&j3{E ŖnI³a)¤½ąą÷näi7?ų“ż…Ā÷=śƒtÖčY¤õšny]N‡ŹĶaĢ’ėGFÖxā0 Äm?b£|;N°$ÜŲlŹvŗÖę1m›‚;Ļ?œčqXxŅ<ĪVߜ5ˆ £IĪŹ %)ķ¹KK”ĪØ”R»cœ"`˜>Vµ¬%’Aiąk’ØЊˆ­čĄŗ“ŌĪ6JLÅd¦iuųĮņ1u:P3ēYš=k)8č| ± o_3,WĒąg ŌFŸD쬔ФN£lpbņĶŪ<[r`¢—U2ƒÓąR4™]`yŌJĄ‹€ēŌŖH ƒ€³E*ö‚ū6>PĆ­tYŗO?qRBŲp %ŽžƒzG×1oN'U0ļźžk~āŲö?īMųŹ\(xŁ€^SM Ć <Š¢ę5:JCĀiĢ#µw°ēX™æöRzoźIo°“ņ3¼Į÷‹ļžõŸ’{ō»Z’÷W߯m˜Öõ_+ʧżyoäĒÓü¼6?7łŻā‡å‡ŗśįĘ|¶aÆ 8ÅPī™ō‚Æx4ķ“7y<•‡æ‹Ū¶M 0„qĆż~ ®ÓWī¶“ā}„€r”™JØiĶŠp.m©ü†f0Jnš-īŽē“Õń›Ø,‚?„hĒk~Ƒ¬Nöjh0Ģ ŁŽC‹ĆšŽ±¢5šŹŽĖüū°Ģõpr Ņˆ6^h[ŅMŹ7ē8[Ē+oN QסÆd’«·äƒ÷ńĮ.zČŻk^iųēĶÉ»ž'O?Įø0/įHTźDY7yÅbsŲD…AdB'm”Jm*‡0Ŗ²|4:õ2)€›$}WĮŲlĖ܋ ÷ÄŪ…ąh|tVk­ą¼zčé*+,j”Ÿ¬»Ų$ÅiuĪąłjęü+ŽŽ©…åŠ+¼œ/ į™$ŁT¼‘3µfµ®ŗ° iwSgkn^ÕŹį[Ęż”DQ¢ĄćJņ®š¬M•²$zuwadżūėæĆf¾æś×`^Wß ęõµĀooę²Ū”k³”’×¼”Ó©:Łxڤ?ėiž ’}i_s˜·z±ßUĒcN¢źķŽļnĻøWœ,-Óśöøø,ķø¼½=.Ņē—Óżlł?­0 lµ]޵٦ūĶvµ™ÖkŗÅ·œ­ß–õ“ÖvwÓJ_īŚv¶Š›ž­Ķ–—³E¦§Ż¦iĆūżšĀqżö~¾<[YĻv“>ŌŁ=o( x²>»­ķlyvOwŪŁŹĒŁāķōŚw»\}›N7|oÆ|½YݭƵ· Ć5ƒ=<Ó A×gżŠiܵšM™ō`m²%w*]RĢĖ~(Į9ĒDČ)ž»EŃeN¬@åDź擏i#|OŁU›ć$ō“T4 €ą)tü狦ś  7å€Īƒo¢6fIY'|ć* ^ø© `¢b'w’*±¤5y'čɧč»(ŻJ°pÌ ŪĄ(8ę› eɍĮsU#­Šø ®ŲA"8©[)ĀWxՂīŒyQ šY¢;Ó@w–XėÕ¦…’Ō^hŸg°Z…¤ńÕ7C鄇žQˆÄÄČ`"ŽąĢ5.”Jn½fłĄ3Ų<— ķÆåB^«“ōσå?3I’5½„ŒŃĶ ón½¹[ģ†ˆ§|’™P\¦›õ»„×(ę9Ÿµ?ĶxŻŹvüāO`rJąa+ļ¹{}ü¼ÓŅ›ć·<Ÿ•2*7„DåXEh®E`°"9v–#(s˜E>”Z†ĶK†X(¾Ź`QLņ“o\@R&ŖžŚL¹Q;Ć'8Ó-+Y†ŖE*śK-ĒŠ,2±ŗ2å8-š20.,ķy §V¹$S؜aįĻ’RrQ³¾½‰ŗ&ѳ§ę®61R$%⺌4Į™CT" ­\w’ÉŖ’Œ2ĒfŖ(YŒ•6½$ē‹ŲTī ę-té§ū7“Ōvs“>“ÕżöTh Ļwļ¬zu[>°ßЌq,–qĖet™iZй«Kö{±ĄČĻiÄs¼³÷æk³vńż›ŪķaŪ(K+ÆĶ¾Ą÷>3F#½™„’¢³ōµśŹ J2 õw/šM±[#ÜTóĪŠČŽ V‹¶bµbAQpū® ­÷*5ČŅl°<0J…ŖsĢ*Ńė@Õ(ŅPć®Ōh{Į)u°¹gSė‰dŽaymešI ęĄŌä‹“80לä#…Ż„& Kķ ōæŖ¦Ų¬jąr¦ūŌa£!ķ»fE^šAÆD5‚&X±Õ”ĘG?Ęé_xŠÖ-å7[n’+Ņ[+NMń[–Ōz‰~ewæ9v§=eŃ]4¤ópӲʒ,…¶źwī·oo‡2Æ{1°ē„]ä ž˜K‡§ü×É+¾°éĶįÅ>(³1W\o`„äȂ˜¶j–j²ą@uŅAŹĄ°¦O©t*ė2@Ō ø ©L°Ž¢$7*ļ»sŖĄ'ܞ  ws¤ÕH“M¦¶āpjNµ”Ė/6Ŗ‹i¬ŹV”ŒĪÉ ­•hUĒī£ĖŌłnĶ0X×uĶ©TŪ*<¦nŃą(ASÕ“£ēÖŚXg©UPPLĒ?@7xķ Ś1'Uo|^e ąH$Āfyīˆ*q“lö07ĀŁŗ=Eųīæ’ö×3żĮ½7{ŜŚīC»‹YxƒēģUh[„ µgÜ 8QołŌī6Ėķź¹!|ymŃ5ŖżåŸ”\ĮEoVŪ¾=¢ ,lWł~óį×·¼æ.3/¼L‡ /L$X}lžĮŽ­X–„-,č’»02›”¦4o¶Ąµønšr)u˜„›éŖQc_×(Ag8n ZČÄ lS ū–żģÖåbĮV2 t ¢6Céø)Ū9Ž=DõĶd£’`®§G)ĪĄ¼@9dsmESNR2ݵ,]»PĪwj~cŽ6Ū©×ąć+ ŚÕ’|÷÷EtN —’\•÷W’\Ö·mVųct0qŠgćÓĪ›Ÿž±ł Źų|,a¬ļXwĶy -MŽ άTc}lóŠ¹‡Ń²ĻØ˜ūгåī  (:«Ś_ū÷5˜,ĶLƕƒĮČŁ“Ž|zšŅüÜ>4k˜#œ°łĄęTEwp‚Oˆģ|}ś­ßœ}ĪsÕe/gS£8ć 9l”š #jqWÕÓŲH␄kԐ ¹×T²ČpEUi¢‰ZąŗzG_;e²T@§»c>^WŁ‘īŸŹL™Ād˜®cäQĀYĶją {¢fE5K,įŠAIµ) a¼×zåP¾Ŗt`ÓMpJÄŌY7A¶Œ‹Ć›6·lMĖāõāØ7“­,”4FżäZ%„ė‡b@:ų¤zĮPē¼īÕ=󧫏 †sæESݤķWŽöŪćh¹±|F/ lŲbG#“€ĀÕJW8ó|ĮÆīŚśŻ§gbńzÖ?¼e-y4ČųŒā=F[0āł[<vŚ×|3ÄÕ”ąSŽÖ©:ӃҹvL _ÆvŸÄ©šŪ²ł“¾Sǘ2qüaŒ.Y/w@ ¹8œ_wٶAkOĀ’ļB¹Ż{`ģń~Ćiļ?0ö%œWće7Rņ‡n \ū£ēp³`Œ8n-y±,„Œ%;KvĢ~įlćįŽÕü—÷ķÓöÓķVÓoĆüßńU̶ļ'ŁĆ‰³Óśö]Z·łźķōR§Sńƍ.TN+ĒŖćņXdšAuÓé$ Ž·Ž{čķCiņ<²y24ēńõ6E¾¤ßŻū‚‡żīy=!Ał²©ļ–ź=w­L ŚÖÅ0Õ#x€žC©DĒGŚŖ÷čŸz9Ŗˆ&‘Tķč.YÉ~ ū3±›H-•Ö«$į E/ŖÖąĖTr¶‚ĒwŸL‰•Źų<—kHĪ+Q§ĮŠŽI"hė1ScŠAq  R‰Dԉ%ś`ō™Ö3æéšMčQsņŌRÄ-ĄƒV>h­eĘ:x0Ax‹v„$L©ą3 ē5 e ^ IŌK‚]>€ņ”Ć=ō²/ģd‰ÜL<«HŽ)Ī:»CчžŠ³råK}ŹĻGųūķŠĪ}N?2ĆŌ£3•žZ-Ō7gńCHŻ`ŠŻ0³1äķ·O’0ŠšĶƒXĄƒžkZ3}ä)/óźjXśxó/gĢe:»›ö6•Ogł¬+Žć“ѳ#ž‰¼sĪ…y}3Oącm€Õ mTĖ|Ķ (PN}Čc(ĶĆ轐¹ƒ‰kĪ\ÖĖŖ=‹†Ł"Th”\˜RÕ2Ŧ qzfµ»ŅØŻÖ•ŖÅŠ$‹åŹ¦D¶w¦šÕ* 0Ł\·³źFB e›­ÖŃBµŌ ·-āÄŖ×R½M’ӉŖSĪ«bnJ Žš™ž© §q¬óFV<ŒN‘:t1ą£"—-ŽÕ§/hNWŖč½m"AŠĆ9£Æˆ’ט•©”H֗k!uąß­©”Æ6±É#ŽłāäōWŠ’œÆĮĢõĢįęåB™1 zōoÜd/ŗ¾ŪŽß뮾˜1ģęUŚŌʼnčšPłŽ«›N·Ž’I ćQMŖŗ¹=1×Ī]ą#öś t’oĒĖ{†Ń–ŖĻ„*e™† ęG©,uÅxō/Ģcį(ļŽ÷rū?7p§ęŗłfŹš¼Y”żYƒĆnc>Cp’ļ“ ÷WēAõ'±Q±Cūx·ŗ/ļžmøŚĄą‹pĶ4ĶWcN[Ż*ĒģĪWg¹C¬;xy*]ūÄ^ĻŽŪ (ĻĮ>Ļz °Æ¦M„@ĄR ,<(…ÉüÄ'xbÓ! DØ1ōžå0Šk ¬ĆhōŌ²%Ī50I~ ńϚC7žQŽ7H$¶ź³šŌ |…²bY°h ‡>“®¬åÖ§”ųMh9‹ĀbŠ1hĖBē•ś¶2 @Ü- ó1ujĄōŹ`'ā +CNåčˆ{°š’Ė*)5bŸ^EŹŽØÜ»­Bƒø)&ĒWP¬ļ¹Ä—ąŒÕ f\-® ūtüVA‡!I-QęÓ~ģ›å|EĻ1•Ē@Ē…€’ƘćY­ļ”"ń4ć|ģõ>: ? *ĶĆĢ÷=3,żŚN×cųg‘õĒNwæešģcņūÓ!źė žŒoåĪ¦ M1.õĪ’˜Į@Čj©-ÜUńķP\Ūč„|ˆĪHYtc)J?(éXœ’St”é :«Ć†žƒ6©01%1X6Ąs)°·dą§įhKĆ„]¦4±ałŽžõ‘āē+q9§“L8IÆŖÄdl±¦Ų£sčĄīb¤xµJs®§[V±Bdkōx8;cńBwŗf‘#Ų ö¾eMõŸŠ3E:ŻVŖ¤Ą°)ö'øÖyÄścµ}¬QŒ®ĒŪÕÉÜ?Č'ėń²‚8©ŽyyģįėŲĻĖóz.¼I†r<̐|øß ?īXŹō•žU¹Mƒ*œH,•Ó•ī4Ž*£i&Srm½ójŗVN¶¼¶.%~Æ$ÕGŠ Ź”qMÅöZ3 HHU"ڼlĶÕ®Šä`}Ö.tijČłĘ^Ī-BŹQõČKŸŖq0Ŗæb”Ÿ2ĶŗpĘI“µd{©č=\g]§']ŚŃŸökdÖ łO¾‘ö|„d>}9vĪ1pÜCāĄ/ ²<>&®c¼ŽāńYÆĒ?īSæ½æķ' ę'Jŗu²68Ęl² •Pm‘.µCč\)œy*š£Ē”שĘcØj”ƒĻŹEFĖÖ4QBoAYϰĒX裤ą©OU5-8§6æXߌŠ œNī«Kąåō„[¢5$¢)1_hE¼'øCߔϭĮ÷¬T0Éž?{WŚ#Gr’ ?z/™ē{™€a` Ė »²eɒżiēī@¼L%ņ‹~»#ŖźįtOsxČ£åp‰aÕÕU™‘ńņ½‘˜Ō„uavźŅØĪ@wz%›Ł#ÉÄB56„™€ĘÜ Ā³Ó‘Į­=¹Īöoqõ®Õ|Ü£¼fÕv²’¢A„ė³ĀįÓķ!ńŗ›«3kĆ¢B°‰x€e4ń>‡  õ£ońPk1¢ąvl Ķ¢}ÄqĒ HՆj$īń°˜ä“ 1šUœ5 øj t­DcĄśŽ+†"É£²š?VDQFF“]ūڬmÉR<ŅZńF!\0Tą°ŽÅÅJ[÷^{vűA{”S£ d®ĮŪk±ģÖźSĪĪBż9صmLP£±§ >lÓ¦®vP²u|v<|ō‡ńŻĻ£tŒ×oŽąÖ8R„õb8øŽōæ1äČgfī&ą8Ūe`©²rēœ™äŚĒüķfęæ¼x÷3óŹóŸżS}‡Ÿ×¶Ķ„twn“ė+8’­8Ø“ŗ”=rū¬ÄVAa­æ²»„ĢFĮ½÷ž;P­eCēŗ Ļę;ä–Ū·ń‘_öļĶ&æs°Åź'Ąź½‘ńäŌȼø>ōn¶ćĮfSs•öf“hG(Xé³HŻŚøõ^ö¦#vv±zaTh&×YM¦5•-–?õšćŚ6­Ų#ŽUµūź?" Žq€9Äɒ&”+ā^©ˆ"­¦ŲeŲ(®ļō¬·&UU¬Į'ƒTĪŌ–Ūā]śeo«ŅÖT{BššØZ³eeØ®@S©?$“nµ‹q Ž×¦tvLx|”Ģj(ŚĖŅy/”'½33ˆg;V9¼$זk} |x°žČ×?°·/ĀÄ2ØA8¼°ż±ğšµ–ņ!ēņi9—ķ•|ÖzłęxĮźÕåŃĒg½)ėµy곋7åųŃž¼ó<ņÄFŌ’dĪgó*zd==śž’}ūōd…Ļ6Üąp9ѶwšŠM(ķ‡ą¹„’= 6£øRl‹ĶśV»ė©uĆJŁ%”†-ź¢K!c5ļÄa‚h—® ^z’m?ØŅķ½6Ʌ.•Ą”z³5,‚ぺuąD.t,,“õŻSr\d€Ę»=Üwn\V oS±õM+%'/Ž4‡® Ö8mÄ®b1!ä"‚o3” |ZŗL5ųµŽ–4§Xz˜ĖęÖ*)šzNÆŁgœ ÷aŗ<¦jÓ'%”^¼¹zČ(ż½@—ę=Ė$bxFĻ š"D}wO—äŪ”¬3 Ž-Š·ž+OMŻ,ŽŻ¢Żr%oæXŻW»n/µŻ½ŖƼ5=¶5Ē·kĪßŗ·²szįŠ,ąåĻ—ķõ‡lé‘ÓĻ\ģĘĒĶĪ pļƒōV:U‘Šż°MšÓĪŽšŸ źn§¤iå£É.ŁQbšā T@ĶNƂ@»ģu;× L®«€±lØJąŚU²zŪ£¦ø”s5×px lŽ.kJԵǺ³ų >K„‰O0Ü&žŁfļ[,*Cpą‘¬Ÿ>Ėāq¼ŠfFąģXJŲ9RØUš=™Ls¶ŁdŌēŲŖķKOÓŚcII±¶ É½§s°üŻ’śżü½±ö¾{HaŻ[H¦+f¦ō …If@\ŽĮĘ\‹ö $_]žŻĻĖåWŽČŃܐw®ūʀĮ֣ę&,/žniy ČćńźóŅ~Ę-žpL¾ŗ<ńšÅnlÜ@cui%Š@KWl6“€H=ԜxŖ¶µžwÖ­qHS”Ń»vE¢Ļ 'gĪӄNń¾āfÖµéV¼oé{š†R<Ż•ągr@M“6ķ˜ɕQc,vīŠR‡4Dzn[—dpBÓuÓ'å)Ŗh“qŒ)^Ųź›).?¹URµä†ZÜҾńäVć;‹tČźØ‰ĻäYjĆYLOǶ%C±|ķ¾˜Ō|½›øčɌ0ŽęÖhÄF£Źķō¼“U~ņŸĖ½’·łį“Ąń'ßżž×ļłĆöŹ=–¦7Žw‹±ˆĮH­ĢD·vVJiŅżv@ļož={wÖ®r±ŁśŹĖæ‚ż8D’züĮP»Ü½“O\lļŪĶ~üŗ=-Õūš-›l7ź¦df[šš &8żn«KĶŌ© Œ¤ņä5(ÅČ£VZ‚hµ«”:e„k6=ē=M]i°A  čµšźØ¶H7č4}Ś[ēXT>MZõ…2m,}ÖŃk`›oƒÓō}ŃooĘHķ=¤BkĪa„ž*żÓńļ$ĮÖa¢åæ.}ŪkīĪ,~ö³„ÓĪÉ®dVɹ=ýĄŁ>ē¾į‡ĆžöėŻņŌÅõįt³JŁĒƒÜ›ŪƳ6ŲG‡0b–ĀNFÓ<v‹ų&/}Ū#ś>åūŖu6€nĒņøt]ŖO^ĀZē)įaĒ+]ßµ™ŒeØŅƒø”frÜ~ÕrӞM®b]•© %­‹]­²Ž" ā-ĶKćFD܃0Q‡Ēāąębƒ#ć8ĆÅ$–ånˆŽ?,÷-,­hØ I]ǜFC 6ćšÓ–¢ZccŒŌ”źĪ£äZ°Ź“Šéöpń·śĘŽ/·Ļ.æŁ¼łūļæč±Į £1M¬¬{½¤ŒČŚwš!@’™½]–K݊ūŌyŠ[zf0„ģW_G‘?"ź±į³łc0n퉇/ŽÜŌœ\Žk¾-6_€fĪŗlĶæFQÄŻÓP~½ÖČm %ź4df]p“IGĘUW‡‰ž—Fr_)wɀܶœ‹VÅĀ ”e_#ĘÆb8šĒO“ÄÜc¢aųƒāšåģŌvÖŃ ›0 ā"$v»cŖøÖE¹ x¬y`©ØCp|œ]@z/ÖŖ„üĮZĀŽĒ#hĀ{C Ū½ŌѝĆJ¤” ĢØ55Ŗ·S¶o_æ,m|łžķ’š€¹÷ss§R󬯱ōQ¢/B`ŗ¢‹VŃŪ1w›i’\5Gū{×RŒ_ö¾“O+jŪ܋ƒ=ØüwRŌv¼€bóuN×PЇެ)pPf·J©q)-v=9ęRŒz·ó> Ī= žOfpļ!õčŒ§“>}dĻqÜSmRžyÆĄW˜­ųäjūEŖ„‹Į_[d¦Ą;G3acÓM_-U=»ķÄß KL”h•it9¦“ćP½ł™fmīuŒØ·¬gĘŪ‚J"qą–\s­‚ —!°ėqxX¼ØÖOĆ“PńSfĮ7śņU›w=€žż—ż›}hdu¾OŻaź8£MČH?ӣ†‡sļ–ģž]"āš•ēfĆG’ģ/ÉØyO=~qķęŻޘ’(C¤ ŽL·[Zt°.Mā¤C›³~×ķWĀTWgój¬VB/ >0Īh;{1Zš²²éi ļŌ%—ūŁÅW%6 m µeŠÜ1©ųdT&qÜ M­lęn®J9Łŗ1= ¾‘{6¾ūĪj ¬gśĘį`I£ć¾“ĮÕ(¼ŽqB5ēQS­’JÓąSc :)Voŗvxg.ƒvž‚7”‚uœÕķēĄóæśŻwy’!3×Vģmķ,ń!„YĘņ43%=ÓŪ±m;Ē“żcO®óųkߒ6ᓲ±»Īg2¦ūüa`ön—Ę,WÆp/Ē61iŠæ^Kq~Qh^ĘŹég.Öar3»õ 5Śc ’’M1¦J‹ĄŻT¦‘’BŗĆę%Ķ9f_47z3MQšš¶ ¢üvśĶ)sä·O¶Æ²»›»vDķ„mÕŹtģiÖ"豉z‡¾P6bŲxČ»JBnŠõAW‹Ó€Ø(J1½÷–ku"6³‹a­·0)Z:ŗī8" ( Ā›+E"{Iźą'—-Ķ|Ą>a; Æē­; «ÓTĻĀ@§<š™1 ÕD&E³m GŻū‹¾U¶v÷l3³µD€ėĄé PY€ŗD€ ō-ˆ3–ężģ.üD»‰³1>²MšÓåÕÓR/®bĖĮ÷æł÷µæß.ūƟüüžéõw?üžn†×=“y»Ęė×/Ž ;É-ō2AŃ)‡£r6%„ŪDÓkōó×ē7„üŸä¼|Ņ/¼ĪøSełöOÖĖ}aweö×ä%esc ÖzqS©wŽ8Ż¢F3©Æ b¦(@ÆÖu)"‚õX‡mŃ%‚BÓ\>cfČ*Å"Ė"+֓ļÕG[ĒĪōŽ9²¶H0r0oݬ•õ¼=Ęą†•ŒČ/­ ¦abV\`jM˜naŚfé˜n?ʙ\§õ˜10\ŌÓ,q«cK·-˜K ™b4PšqŒÖÜgV;sŪ!"P큤C|·2ߛ(–ĖKŸ6"į«ņźŻużæEßż›-ó8A®Æ³G ¦FDܬ6'Llqqtmę" t0¹žRŽ=ń=[KꀺékÆuė„ŽŌ +¦ĆEćr\:]@zułźeŪA™]Ååö¦Ūž^bĢķMN÷ļśb>J'g{>ū_.vĆķH… V±ƒ=),{eH Q<Š„żź,C“ubńßYˆ§”«Ō«¶’`aĄ„‘0‘»`U °R-±±¬hä†)KMSöĒlrĄ\ļŠwŗQ"¢-ŠŠ€!ŠÜÆXī(ą`ęõf»”KbIVD6ŌwĪ@9¾Ś ™Q+~w<bĄQX™BĮ@*ÉXį&“ķ:ńkck³Ā˜K”µEbXšŲ ‘€‰ )#&œ £¢‰ĆõNʁ»pĖę£Wož?æ|Īi3F^?zĆŻGÜĀÅŻ"£?z`¾yśōT ó%ŒQø h—Įx1w”*ØP²½•Üó×4åߞÅĢ1nŒł6ģ4šng—ĻˆūåłÕ ™£_^½xõzOAž|łģo”ø|öh}Ǽ’ĒŽµ’øq×…?&ˆøŗļGą.źE›“līS¢÷Į ¹k[‹ {Ļ™!9ĆŻåJkÉja †µäp83œ¹ßłĪ¹÷{¤ĖßįR¾ÜM|dĶ ÜIĶpØ¢‡³Ļ«ß©ßC=œ)müRUÉ{zæĒšęū—ųĪK<ŽWžßĆśG°ßiå±ć3ā¦ék˜˜Ļ>Di…ƒMꃤH*‚¤H)Œ)¹P£Ō’ńYjV٘ŠiDk 8TdŒ4ųF.Ķ4„p¹ł$:°˜'3V“ų2ΚACt.ń±ś mT‡ėgö ² ""Eé€%93SŅ”]ÓĻ„1Ńē2,k¶ˆéS²]yUĢ’…åBBn,ͬ½aÕ&Ū““øŠŽ%ךѝ}ėĮˆDdƒ„hƒūżް†,žY\&8ļßs»Ń¶ß.ŅāMū‘ه×;œ9XžĪćīŽ?V—džšJŖJį¼bšŗb»‡6ý™Ū÷ŻŲ>÷i#·lh¾„c|‡ic„_Õ“©“e’t¶üļąb7o`Ķ’¹jDź/¾Ū\ ƾ|a1~óƒmיł„ķÅŻezZžs;l³CŚÉ¼Ģ?Œ6ž)µ*<Ü-‡CśŽ­®Ēā—gaLJ@t8Ą(P†OĢX7xžIß}2‹r¼é2O°™ŻĄ:¼xuD›hé8X˱EČć”<†öA÷ŌkR &Ų}ÄpSFYĮLeŁ‚÷ ņIj]Zgæį”`Oōį0Ź–ā §,\…—Ćׅ 5FĪé‚ĶTĻī„°y„°­ėˆ}+$L‹¶w§ģG\C÷Ł8—3§=*Y‚/­ĪćŲ±Hćtb   ¬TD…s7BCjqžBA×±Vb¢&(” 3¹j|Š’JtęłW.&ĻØ½žĄÜܞ§tµ#īīsšo—°ÕĖtƉ‰ėMŪŅŖÓ\ݬŚv/{ć½/"óĆvĪ:šī‘ņ3)śīĘł›@ėg– s«MtÓ[]Ōå·[°©Uŗųżā-Ī?ĮŃŪ“¹]޼i—mä.Ėķ›ö°Bä|ʃT’šŒ”šv1äӓŒÆFf¶ų†§_|†±ųbŗž/wÅī>vÜ«6ądvcG‹>U(÷ķĖéŹ^>žd^n’½éoā¬äKWŒüń ¤>«¦µš‰-źlĪIļėoiĮ9”Š[ƒ"&jÆiĪ0+fżW•jKR¶>§ YĆņ;Š•µR0ż ’E8<¹£*a•DiJāj¾(œå˜Õ P)XĒXńœ=ä°HÆPĶX•p#œ?wöQ€z*γyµ¬I8ÓA1˜P¢(‰`Ų,BdŁ« Jņ•Į©=$*)6ˆc²„Eõ…ēŖ}|’åÉY.~÷|łŽ ūÆŲ²f'_ĻsGüƃZōĶś’/÷cł_Ą‡I“g —ŸCƒTF ®”A/ŗŅ3$]ÉŽä"™•? 7ēŸĮąC{97+>ópĀķr(Šžb»¬–ķ ׍m׫ómæ·ńņv³Į‹ŻüĖ*+p‚¼ŗzŒÜœŸ„gµöS§°yW„ź­$ö"±,ćä,)2*Eīń#h¦łųęģ53‡®R¢.Āo™v3MÆjIœŠUcŸ9‹Į:Ö!fėŸ8UÓT Mg(šŖ² eČvŽVÓvVA€īpćÖxßc†!ŅŁhi”ŠœįłcµyĒŲc £GU䄁ę`R¹ŌEb£·ŠžŖ°.[”TšV$ Ł*8RzŽtų üųę?>2^\.ś ĻqždnśIh0lƦf•&\qBĀļūÜĄtŌCIĘZŲ÷v—ö–³M‚M „µ"Uģ-¾Ā`µqÅG®Ļ3µåY—Ó+8&ĄA‚VD‹óILLĮ“,ØńŅĆõŒ2˜“­ō)ļšĀ‰Ī&!!k”L ’MdK8©aō?šXÕgü€Ö»šŠ”håjOĪ·ŌCSJˆŖ:~_ޱĒ"¤0+zlNdg4(8Nį·‘és®™†įIüß Ćϲ R•°ØCWҊī€ŲÅUį\¹Ģqß¶‹ė§'K:Sļ0ūń2>¹‘JńhćśüõNĻ_N›ĘH)%•9š+M7ēœP<,ėźäę;ÜÅ3ńāŃ Õ’V›õņõ:‡[Ŗ, ļ7ŽųŗžļŌ ;ķN‰‡„¦•äQÉģ?q‡X-h•„Žm×g H·æIWõķaəĖŲb’Į¦ēŪ»;‘wKÅn’Éwéū4?rx˜Ż’Ą°ßo>gŒß–.®ß¤ß)Į$0±[оNWÆ×Ė£Ūw(j4|6ަĒw€ _/õģ×NŸüķƒ{ś¹væōżCĖē«u’šķžnĢ¢ÜĆŁsŪ-’Ӑp„ŚŁ ;K M¤^oŪĶĶźźõv™¹ź˜łūāĮ¶‹ė·7oÖWš–p³Yæģr‰s ē1ņćŌõ²ęĆEŹå½Zu]ņz}Ī(ĮSnžy5^䃙k §#§„1aM…:uąeŠĆCämš h`s^ķkm&Éøś œĖ ü#¦Öūxēzš;Ķjga@:IˆÓ*įUT±¦yėBnM°#S+:‚‚>֘*|H·”*„ Ū3ć‹zņ9N0TŌ$U”Nuh&6ŠoBĮ ‚56A–:²0[čEc¶`ĢE³ }Z› Ęėä0.ĢįĖŹHśSJéŒÉp¶"³Ā±“)”SIyS¬Ż?__o_ž• {äuž [y³ža»[š°ģ£„&æ;ł\Ā‘‚tč d1F+F*“rP¦&#ļ9>ŲS¤×°±®zvōįÆ×J£ćŲĆū}xńj¼»÷±`6ļ”ĢT”rŅ‚īZ/ƒØ æ©dßĖa¼¬Ę7Å<UR‚ś!dłŲ|īŲ»—¬œŅÓ|”¶4ßP³ĢB ”[;2Š­µē,*xgaJouWZÜ8³’ÄԌ®·–tįķHĒöŀ—Ŗ‚ŻW`ŠÅqž-°|DÄ/  ·-4F9•^Aē«7¹ģ^zń=čšįķ-8svüŗS&ēč¹\fĄ Äboäž^ō?_’i±½y{ѶoZ»Ł DÖĖdzx3ƒ§Ļ ō”%J© 2„(ąRѰµVé|ÖĶ §g t×”ń$×gę§E’ŠaÉė§žM„Ձ]Ž£Ņq,d‰®Ö7«žÖģų²?"²'8ģ B*ķ!čr,:“y«Óż x|åóīåųŻŸWū½¶²6N˜©hŖ„ė„Z¦ÖšĢ©ČĄrb*ģ"kÖ°y„P1Aŗr± Š*ąåŁ Ī3gæä=1"ZJĀØēéü)ÄIQxz ō¾Dį ļԞℿūÉŃŅ’*ŃŲi÷>0µ{3“ŗ·tb£™ęG{.6¶īšXĮŁĄś8k靍!Öfķ>h¼iĻņÜŖyš-vwp:D^䮪 ¢ĻēXAśf_•4š8ŲD4”²=ƒ1̌)ŽĖ©B#HeL ¾!*“²f7[S­²$Ä›sėP'‰-Ņ(JY°^1µWY-DQTVÕe¶¬¦ (ˆ¦`ßd€²Æ3ˆ!×IrÕ%ŗš\RŹŅˆŒ­7Gپū©Įjń›:J~łŒ]ļ‰]ZZļ«Äˆc‹»¤1–³ģ0f\‘ż»6ė”(ź;Sbå®*ˆ>Ż9>U\ü'Ä„oެrŗ½Yü%Ż^¦M]|q3nųņ#'Č=MqTßī§X:Ķ£Ę[}xńźč¶>,]ä$f‹t-eFu€IYˆ0B€jōżޱōZ­k™ŗ‰>„Fzéjašže^ėSŲXäkį¼YÖ1*gš--ÅZ+˜ag c8Į¬J²>4£ʗWS±š¬34„ĘÕ Ō£J¤ž¼TŃkõ édĖץ¬ąZ•Õ® ¶ļ52 ¶ØiÕ0+Æ¦Ģ„¢`YÆ+(]K®Ķi‘@ҾÖ0œs³čVecƳĒ"Ķ;ŒƒģķP·—÷BAł|‹|±.ē;āÓ|Įõ‚i«xaZnßnoŚåžG•‹õm]®X $z°š]ĢčĪģF;ßüHøh&gŒ`ĒĪųœä…ćČ-õ:ĖøėŪ%@¦wŁ·O.¼b|ł„Ļ/OŪķyŪ\µ‹‰_ąųÅŪ?=Åųö_æ^ö’ij/.ļ3 \Ųśjø²ń$_Žcy”Ų“žDCĪRRņķö-\ÕtÓ?lĆ×nVeŚšbqŲkɄ†ķ ŽĻ!ģ{¼©{a6{2S’Ėż]æõ¤›š‡­?¹Ū ōŁ?Ō—GĆēÕń•ÜēI†<ÕÅŗęug§ėĘ©®Šµ-VŃEŸż„šė”‡¤kbņ|uPbÕ[č%ŁU ZĆØP? = ‘Éo.åԜ" 1d÷¤SÄń+©%œ’&]Ń­uv` ÉŌ­°³ABR>`ŗÉņP|¾`R`øœ±Ö×®µ mĄŒéµA$Fün\µ€žB“Ö^Äž"j¶\Ģ®—Ū %KŃĆOóä+fJSŖõ š†ģ# /’…ńÅæYÆwy¾Ę,JŗNy‘>L®ö°œ†Ö1#ŗX}ß&Ś3¾›³›ł–‘ČmŁŃn{—ŖŌ.x°Ł©RĮežc4Ļ=\ŗkļJ’{OL¹ÄgHšWėWø]my€%ކ[Zr֕µ[{5’ųķ_ļƟĒW–ƾæN«ž¾Åv5źdU„ŪŪUŻ— •næ '~üø*3æ ń~ȅö³ĢDéY›«ŠµV[Y"ėaDće¬„Ē’ó­źHÕ]öFō҄ͽØ=«|–X ÄK1æH f¢!Čl̐Šł¦P6;ĪƒƒTČ)²1“ŅŠqZ€ĆyČ07U©óą2Ś+ŁA¹lOµg“ĄĶs Ŗ³?«Ņ]ö”^3“[°VźN櫪½"@ &ΰe˘w³¦š”§¼ĒåÓbMQ Ų­­®očą~*jżń{–'ų*5Īz|2<Ņø]Ź@O/¢K]ƒņÉ{"據2Ēx4÷ŸaégbJNĪ3÷7ż§AÕŌyŖŽ`åń]fšrbbŒ=½Ė.Ŗb Ą¹8ˆmšņ7+ŁęeNŪöāą%§"ŹWŲ2Ršå^IlÓeN»I,fģ&źÅ™"Ų18PO¾Æ›Tno꣔Ų:īŚo·ķĄ01Æ6gøSžČ撘Œ-Ėz~¹ŻmCÅ ¹;ŻųĮžpļ>ķĄ„ė{Ōvb­§Oł>Č?3åw90Dņ˃ČF8Öłt“P䚤ĖŃŌfdv"ķ×"2»j诖kœĖ!¢™–Ó!~-TŖĪÕ©šS1ą˜Ź‚²ń«3*dĒ.Ö,ɂŸ–œP€Z+X*[§ w`£fmW\„N£2»ŽČHx‡‹ŠM²P‹czdĪąŲ¶&•̾]p+®Ā)Ų¬¬•]Ö"$r ŁZšpbÕ“œs „Ķ2Ž39ĶÜz«¤<ė"²oĻõ»šNĖ”¦Ó rĘ“ķ+āą&>ū)ŁŖØ\īīŻ–„…dž_ŌŖAEĆoČ£™ÆÕõ»KÅRŽ}žĒń©“½æNL"}½^ü÷ź"-¾Ų¦«ļńāćN„Y-śTXāšŻ^ńFŸ°ļÕ5’5æÓ‹ø±äŁ“°Ų„°P\B›#T`d[WL4ŗ‰œü!®L’U¢°ćDRz0$åejB5Ż«˜&˜ऻ³2åŪ Śbß.˜—„C)Öł ²ČŹ:N™µ³Zœ£w 9³ŌWVŲÆ)Taśµj†23 ]‚`“gX(S.¼q‚8­õäC‹L»ē„(mĪõH›MGBAjw×$čøl)Q©ør (ėEāä÷ŒyWqauÕ×KÜėĮšæÅß77—ĒV=þÜĖćž\óņ’_Xˆ 2ŖPµ©®Ćé¢-sƒ£É•¾ęņī`œņõ»»ā)†ņÖ¾}½w«ęó@HŚ š6ķo·«M›U·`°ģċńī‚ߟÓęĖ»ŗŽ¶Ž#śž_”×Ā “ßE IQ“h u }1vgw%ƶhˆrłĮæ½ē\’")’’Ū)P?˜–®.//÷ī̜³;sęåÉ÷Wów—'ßÖ«łüņE’ī3o;n7č xŌGÅŪw Zž[źf¹YܬõŻf O )ž†åš]÷_߈üʁ¦s”Źp“Gi2®w¶|ŚĻ=Ī}š¬Ž,ī%­bbŸŠØ}dm¹cK„"ƒģ•=r×Jl,ỉAlfH5÷ņB‰Ņé:dŅŲ(MÅĄ_V%ņZ’åŖŁhEŚhNƃāć*w(²M@<µ¦ŹMP@¶ŖŪ(MŲRšź`E֛‡·“ńŻGē)פU–\W%©•©pćŻgµöjLTĶŚšŁRą®F8Rše-Ü\µ.°ŹÕ8ųv­B÷wͶęØf/~߯r°§é³‡Žn…%֊~3źg]æ€ }¤~‘u1ˆ‘«Ė~V9—ŽŒŗ=K?$‹ł©Ö¾o(dGKż’µxkā“ŸFv³Ø66™ćįń\sD¾ ?Oøė¦ƒZōJ}óV²óŪI°mx“Š­€0N““IVP±PR×ujĢÆSF'ɚū}l c”É šĀ•u¤ ›Ō†ąüDÄ %‹²J1E 2ē5 0P lP–Š$Š$ Œ\Ė*ŹčQ‚ć6 ?‡©­ˆˆ.,/ĻĀT Jx‚S5"£> ÷¢µŗ6É @a­'&÷fŗŖ!Ā=&Ž&^ Q™¼ēņčµ€Ž%ÅJÕN tń.¦O4ė-„Īū%:Wą¤šõα7o+¦żÅ‹ĖóGcˆcJ‘„³ų¦Īģ«ūĘQ©Ļ~,.ŗŹ³ūŪ·L)’uÜ’,.ö³š}VK]_°b Ėą×i”Z׎•h½ŁØ`ź[!N@ņå™\PZŽčDW•Nv%l·ÓńvOOō¼Õ×a ŗZ™ŗdóö¾x·¹śŌzžŠoW¦›Ė1ß³øąæēÓ׌w2ŒšfK„ ō% ā,˜OLT-Yžˆ Z®Œµ“)ŅŁfQ”‡O Z±‹’āAŌbĮļ#ĮpĶ–¦Mq%ØFč9Jw-ć‡ÖMŠ” ¦Šf f5^KÅ6¦šąōˆFŅf‰½%܏Kø|©‚ąo]2‘:*ućJ12\–*±7pŹZ•h..Å0ąMPB±yZ’÷¾Ø8R/ŗVE3+Ą¾’µŗ· ŒnøŠ¢ŹMŌĄp©Gdš0ĄVW–™Pļ^\_œ¼š_/Nęćd,»q-ö-¾h“į" ą@3V ·±•YŪµųGä(.Ķžc—;V®ą Ą¹|=n+NyĒPłż÷-ķv“łūÄ üišÅżJüuõµ*SŚÖå:4°Špa­¼ĀųuW„;kø ū~x—Š5.$ųą+œD^¼O!ĮA_A °+X’>"ų HĪGŁnŁ2¬“—mŠ·*ŽÓŹ ¦é¾§R·JÓ-ŪazQ˜ĶÄ*N›qnjÄųļ}’UŁ, ŗīäXńųį؈ø•3#6°—£“ ü:€Ē¤āłĀŲØ·5žY7{.l¹C}‡sŁŹ¦ šóųFĄ².oĖ5%]+CYTų £{‡5³ˆMB‰v×  y·"1šµ·Ž½I-V^YRńęŚ(°K=øUkt8ä.`ėŖ)ŪBö]įŚ9‡Y:kē ų|7,«« w>ēÖB eīšFŠ­&:öä,)˜V™B“Cś\”ń hž~=•O}ŹüÄČaFČZy ƒØŲPĢ];Ūļó鱒żJ.yūiV7—ƒAĶÄh€:7¬wTÆ:¦nė° Ź÷˜ąf†ńėŻīų91AJeĻm„¤Ę|}„³®[1ŃŁeUk7aŁ; ¶ŲAe<ɲQLłH’Ba?|&ø+·ū‚bcńĢÅ3ƒ`ć¹­·©>„ĆT‘ŽUPµQ95b¶.)w:Žą:-8\gæ¹f}ŽT¹(ĆÜ5o‹Rˆ],T6šĮ6ąhØZ%飍nDVČSGV‚/0ģLóQVGD‚‘KĖ*<4e¢łŁ_’õōĒ“„œźSc3E|XGpn@ŃĶVŪ›h‘²ģ¬\-®ŪC čžŌ<įŹ‡™Łßø·Õ™iśĄßĻīžł§'KŁ *č_OŠB“¢: ļźĶ—RU1?Pŗ(2[čUn] ¾zļfz•­„>\éµzÅ1£‚^]Ć*Ož¬č(²×«d«ĪśŌmģōžlõ`Īųņ|ē‰ļ‹M€œmŁūDŒ£Į†KńĘäŚo˜ńÅ"Ö„ŽQe˜JiŅ¢®p vj{vųlU©óUr{oą}Sßg˜8H­0Ņ”³ aʃ‡Ū§õŒš€ Ó k.Šm›MAeĮ‹£˜QŠŗĢ6¾²XœKe5SK"PZ}ˆ øŗŅįcZ³‰R̰ą(™(ž&Å@Ż`Oą¦Ź;²a“R/V!ÄÅf‡…½Tīšo  ółüå4ņ»¶?Źā±v±@<]쬁•Wē4ø‹×ģ–÷Ə›>r³p'‹~'!ąŽ”ś£Ż#–ļŻķ%ńė±­ĒåÉÆŽķ;n'ŽY\ż„Čb8ø ¹ŸŚššäŃ ˆ#›’÷œz’FåĪŃåU>½8iūųķ8=²$¢™īšƒÕ©(̜ō DĶV“f³»k7čö+j÷LšŪ׳/ą‡’xr>U.ĻgpKiZĒĒ’[yK÷”/Xčō*” ß^bļVož½“Üé÷äļŃ͟_½­ę¶ķŃ:ĆmgEd7óĢ»YL/ϧ§µēõĮuĄ†·rA `Zfk;pwÅyA½lĄ”ŽŲ,c ó|6B88āČš›Z“…[uIĆŃźXŻļ,rUȶ\¢ Ų‹ń́Ėøkm+åŒrRˆ-8«į">!åŃ£*Jʆ\uG<|±¢ŗ¬½ččp§nŁj¼Ž(7ŅÜheh‘ģŗĄo ČÜ=Ū‹!˜ąī’e Œ 51‘Œ]?X»‰ÆU›ę9‡»ōŽŒ®jdžŅµ›lgĒé3}ėŁĻĻXŠ€)ŻĻÆ&ŌwĄ@ † .Gźųk”äwL°V£vzö½’åõäģe~y +š_=b)’“O}Øśī8#«@ĶÆS7„$÷ōŖćģb ź,挽×l—)ņu÷ž~GHųüžĶÉ÷W7lõ[F›Ó:żö”Ėł%«d?“Cš[•L„µ·Ōe9bwäģŲc{ž[žĶҦuv½°ŹF5qžƒyļMÆA³$¼^/”8­¹Ą-lh„{„aĄxėˆ£€µ<°Éėņ¾–hØ[2LĖNŌŖ f ¹ę…³ÖQv–Ź”Ā&>ŻŗäUĶAüVĆā ŖPdŸ}-,e²SŁvÜ_/R3ßd’°Mēį X£(—\2%÷`@/„å—ø8饐<Ø\ua“֒uĮ)©> ­Kv–r’˜V?`ĖÆĒōœĪ–S|†ē6[“—wxÜŁOO×xZ%yöēæOK’Sę&©ÉtĘl’­ĀūĖ”žµoõŹ÷hŲ{Ø{Ū{ŒaPAŲwų3öUūę›’¬­+c././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/data/binary-amd64/Packages.xz0000664000175000017500000011156414410675017021775 0ustar00brycebryceż7zXZęÖ“F!t/å£āc*“1](HfŪŚ0…žnč$ˆŁR(¬&©ŠŠ³Łé~!5•Üļt$ķ9(’`É”Ģ}#'ą¾K“9_Œ!±RŠČĻ›ø›Z²¼V:£„` ķ>ˆL⹑B]®å2 œeU¦3A7‘@aÓ~Q׫ėƒŃŸA`PØæ¤ķi€ŚbA†g^õŒ(ŠųųĢ‹Ł3"‘”Ö/¾k0—|«ķї}\( «š‰Öķׁ|A‹ZZ|qj¢©«mµ×@UVOjÉĆ ‘Öz;{P¹ÅłOŽ­D‘ ŁŽ䆇h ›-QžĮ*‹óŒĪaŚ4\d$ĀBŅć śÖ+0ŻØķĮ}æhŲžųHŗĢKP£Qmkū¦ŠB«gōÄђņŠE*ŗ÷ķ@Éė¾I‡÷§·Š7&µócÕ[ᇮ pPq—ņī^*|›Ćń™œś¢yń黿it§ÕæŁ?“GĆŗ”xˆĶbõażƒÅˆXGąŹXĻ>œŻÜęÉžŁ•-…5bSŪB=ŲT¦mį•ēŸcm¦•>uCbmĖĖ;)!øĮ*›éÖ[bŃuŪØ±S÷&ŽāėM6oĻ-ĄĆH÷-"r$ĀmdĀ7zīžÕ1§!RJ͌[ß”kwģqß„ž7L@ƒöģP»×u hŸ”é©dŖłĶ¶Ž§7pc&7+Žz‚Ÿ0o'–žĖ£]x5Ōśh·ĮAŃn~eÆģ%C<%uą]„Ébu‹½C^Bl¹-Ų ^•“æķ6Ÿ4Ɗ”%F»KƒDŒŲY”±“Ūļ¾\h'Ø/$Ī­.MÉ2pÜb^ģ$%7¼Ągd5µy5G œ:³vų jq&Lģb7słĘ°Ah«Å)+ūP¢a¬Ļ±@Pi3xõ†ˆ"ü/·&ŚnŖxy/7j–-”PÅ+t‹ŅI•±Ą1ꓚĮŪ7öIĒŃ}ņ-ģ~ži³SńŒˆKFč‰Méŗ¦>:ҧ–éąllź¾ÅXź©Ö ęłø³qŲ„•Śōݤ-‚üjmŲYKĻ‘»{ö^ Žį¤CŲkŌīm¶ĶIÜż4Ÿ~”ųŃS7 Š’īŪ;#ń] аŌ,'BIżnŪķӂ_’/Sū ÷&[¼ÜÕa·Äl‚\qD4Ėŗöj½kŚĄ†'pĮM󭦹%Ź%}ķTĀpŠ@Y%“9ś]GU†žŒ½‚µ x‰,<ƒĖāBŖ±;+ĢŖ¶P•ȝ2‹7zyæFē¶u\-O>=–‚ö6agÉRśūĢo^W#Ģo< Ŗ%vRļk7Ÿej³¬ū=Ć6`Nc`ZS‡šł¦ąŠ^g„ò=Ģ““ĀłĻC§ŅL—“½iĆb{ź¹Žx»Õn_Ī›+œšg]zœĄģĪ©.bŪ Ćvr](ģ·ÕÅæ“#ø£&łāüø¦bYēŅ÷yšCA[%Ÿ»Xäf@"āwmėÕÆéq{Ęļ×ÖŹ?ż5N†$Ē’x@*W+(°e!§3-}ĪH‚C+xµy£MO0ĶFłk÷­äPeĀPՏ`ĖĶ.łéą“—ÆöQxŹŠ(ī ŠŲ%SģDŗ£ļ<.)Ÿ-öNŽyN”¬!®Ģ— iøVā{|$łó?0<éÕbGćµÜņ® d±Ą6œąā#ę(²ŅˆŽ“zļ S)<š™^V.W”ōŅ„Fß4£<1žVw9ŚģϼbK»‚ö^  E?sÆF= ļa†žZ.9lfÅ®:K’×gƒŗa®ŪEĖ—m“Ń%źƒĮæ³wĒøV•č&ŠĪˆ²hż„ž0ŚBd~æ„·Ńģƒ@£ŻīŲ¦ŠE>„0< D³ćėļ^,9±×¶“üƒ~’ÖĆJŃĻNü’{wɏn€¹0¹Ļ:XSHģ)£¢Je’ÜŸk…üo¹”‡*¦SPöš/ÖSrzēohū->j,ƒ#`Ė ,Ÿqś"²½EŲńĀó—¼o­}Z0e¶ŠOś¦ūZi,įewÄe¦¼[ü7E ēel^”«Ņ"¦ĀCJ]łŌҬ+…6ń'zDāSāX¬Ą0 {ŽŅ…ė™Xˆ^IY‡¾L† C/“¼–nh‡£‰Ńm‡¢-tņäÕ +źÖSūIH ŽŗZŽˆŒ‚Ģv>;HåöùŖ¶!ÉŁˆA\o‰™@ŚpcRG§’u‡A[sČ<„keˆy£_lŗwė:ž‚Õ:;Z +:Ø{aŁĘŁžK³Ā#N6ųi1Š+¼uoxP®GĆU5Ł=C>œĮS6ן’1FBÉ«*~P:u™«cbr»ĖÆx9ĖTœŽAi†ū0Ż^Ÿļ©žÄw`³ Nłlõāa¬Č°5Ż•ˆ3Ķ“ ’HrāTč¤äU…Gay ÓęMGćŚ)GJ4Ś`ą±,ĄB°zz „6г6TĖł…µµyTUk›ž±€PBķēŗP²ÄNywn“qžfVŃoS8Ī”(å1Ą˜–Tśµ@H†‰,’ÉŲŠ Ūć̦ ń"+ _xh1%öVÄCT÷»I”qżĪ0VüĆc ¤d¤Ģ1šå­!ÅRŚB„łS¾®BV²+äę‹©óók’~ö*(€ē«Źł+vĘx1ż“ƒ’6t§ŠļhžRŁ¢ŒH>ō)xĄB¾HK³ £CMXQ·@ćdƒr ż™ĻP3 œ)¦w \ī§³Ł A‹ §ż€tq”ČuYnżFDzÉn“g\uŌücY1ģūŅŁ…^‚©ci^¼B,žFYĆėĀ\ī¾ÄxćCżKœÉUEd nćtm#7¢#AŒŃs#c–øC|ō'©§äu·œƒł„ÖQX²ęŚ25[ęŗ[Øv"æ£Iśē|s’tן XŅ3Óx'8ÖšA—Ū&IP#©Ę¼Č`eČAć:bڦ`ćf© ›„ėüvjĆ?ĘtE³p$xĪźr<ėĄĘćŻI8ŁJ½¹‘<•zGaĆR)óįgäŅ'—’k©ńŸ'ZĀYāC …`\1« z¾>knž-fņS»’čŖ'ø%Żē‡)p•k¢0[Ŭ£&nāÖĶd-ųSy—żEe)õĶOź ·ęŲ6 #-m^ž7ČoŻWŃÕńåä™k{öąµörżnpCĮL¶zU"öhŸ”ź/S“Š’óŻˆkČ;>ÉŲ’šżš½¦#źŽN« S„żŚ2ņ¾hĻŲØr\äHÆ–ę_·Ń¦{«n Ätē¾ŁačŹ Tō÷Ū,Š]Ÿ©† ęÅA²?fn*~\z|C§ņ 1ę<Izb§¶fļSŁ”}®ŌL@ķć3<‚ÓbĮ 3Ī#'0aĘU½ųĒyAϱ”9˜©AŁqķļ y©>šĶ !É­¾ļŪŽŻ–xxÆ#f²ĻM°Ą)õ‹÷½ŚüO‡ ŠpZĆõĮóFˆl6¢bü„Z­Óq`Ź),ų«³É’,Ÿólćī‚š9§ģ)©nL÷/Õ?}—ĖßxMåߥlqžį—GÆÉmąėŅ”  UŖŁ¦Ü‘Ķ榤Ū3?Ša(B÷+ü„ĄØ•S‘wuģ–ŅeGa\PwÄģB`’Pģ$‰ų• UoŅ\åą³Ž—F„įæ ÷K7ÅgńP“ŚŁ\™Į¬Ä«/e²)Ó%øU}?WŽÕ’Hø¾ _ÉF—ƒ§3x,µDFź;€G€Ų?/Ų1¤5óØn™6 K½Dw˜ ¹u8Ņ”‡‹+Š7cK‚PaĮŸTK‹Ź¦×„7“?xÆMŹą¶ŃGvŠX•õR5†zUæ&$«˜/Ö“į ēł0nkģQGŌł½n ē'qžžÓ?.›>P’]6^īC![0*"8_ąOā¤śžlN…m/7<­0Ö Ņ"<Ŗ±…pky’īMĀZ „{ąŅp')b ,iX4A ņNå5ēMŠĪx©’xŻ°ĶŚlPfŏ“Ņ»1ŗÆmŲ“Ų5Ā[§ÉŠØÜė¦|“"tČ%Rżc1+“pœ°™'ėžWj¬f®‰Št\ b„Õ±.#³”ŽRłš„‘yØg$žw®ĀšÉwæĢ’ŚžĄ:J.YĆ6œœŗé8N8”$Ń>n<‰»_ė²śNe”óĆę5¢ä¤–›1µŻśā­Ź•žšfqN¼ĻƒµĄ|ķõĆÅEæzŲXń’Ŗ,É B·¼«ģŒöŁČŪ||Ÿ#H_@@nŒe¢r sqiÆT¾hĄrĖ©ļŠÄO/Eąü”™‚zķ2ųrvއ°«Üd¤ ¤.ŽxŪl›F(M²ā.H=‘éd%ŗ€ÜŽŠ6¢ƒÅ‚¢"×V‚ ֍£ģŚüpu¼ ’m]Ÿó"{‹/¾A8•˜Õœį‡įŲå.æ­dž¤7zWlŹļ’ē©ģ”qkqü=S”ŃZ|°oń2HŸ|ևŪ@–šlģ>=ų=šj榰†Ä;:ŽĮ¢pŅq5ŖE{x9$žŲU“ļĻ4U(YFeØŪM½~Õ}„Ÿ«nŲ–³»ł–Š÷]hmMįFĮ"Æ,į4xĢZēYRjĻ÷õf ­Ō5OĮ`Ėń̼Fļv«œD öUw-år¶į“×AĪ…P˜Bf łKģǬ€e(ŲX mžŪ>HXū÷Å&Üyź,<-ø{¼>ÕIdn2”5‹ŚĘµ^$ 0m*„g–ÖŲ®‘ÉHZ¼ļJ„*EDœ˜ęæĮÄRž0JĄr¤_W Oec&”­čfZ鯾ć[æn"ϔ޻ÉĢ^śPė4.¤ŽĻU’/+Ci[–8cŌŽ¬·ćŌcTLS—ūsģ:ż±&ÄT‚Ū+āæ²Ā}ĀŪxƒ |öóéLmȾTģµ)É  µ+Np¶5²Éw#2ī a ~śAé9†I_²PgRÕ„¬öŁ ŗ“zĻ9+Ü|裄}>mŗ`&õŸC.«ś­HŽ¶īż…T3É=įqY¶KaŪŻÅŪ śbCĪx­įæ„v18†2DvH+õT:“$SøŌB·ŪłFóõƒ€€L]ļ 0ъtYŚ·9Ą!o+KYŅź”°Ėž\§€ŁlŽ$ųŹ•p²±įրou„ņ“4ŒōDĘ_õ죲Z\ęÖDWJՒÕ ƒ®{žšz…’Y÷ wF+ūOķśŲSXµ’’6ćr…§8ūń’ĄĮŠqL9Œī…±÷¬.Ė’ūŹ|8ju‡cZ„œ}óĀ4ö :2yxZ^“æ†ė”?ØŅ•-nŌicś”źŲ,x^Ž"µźqʍ–ø'Š^ź–DĢļ’“8[>õģ _MuĘ ‡BĘ!kx .-Œp†1Óż}}Ü$¹ —Ōi2æVyiQ™’ ØäõN?ž <'B@'Å8*Munušł«!ńžŻei(§CņiMжöØ]C†ØSDŸečć¤ ^gĶ E™ļÜsc‰&_€# w-\7ƒ¦`”l‡æŚŁćŅ.o>ČTrüĄ÷x'żä&TFd3ˆp~Y›Čxą»ÜlWĻL›Øõ²xę°Ūį“ŪóždŚĀńģ{TųqR$б›öD1Į’ōéAŒŲ­Ž >*nńŁ~›oF3x˜‡ū9® ~[Õ/˜×jĶęBɉ9wé×QĢɲݿ˜^fl¹‡żæd®Ąlr˜2"1q¤ć’4²Čléü7­YŲjµųĻlB׏ęī™·ś£[cč|ŪGBX& ¼ń›R¦Ų£˜u¼ 9ĒŽ’°ń3å… “Ē—fœŽœ+ĖP%†e#”®õæ3©³4٦z²žŅ“gštʟkČwÕ0 ®ÉĪSč‚Bł~ŠĘr@ņ)%6l +…v„ć1ĶąÖHā•0Ā\łČ°“fz¤¤¦äŗČķĀQFÉ$¤K‹Ś&[Ÿ“ h¢Yˆ@ĒėȒgŃo¤‰M_WŌ”ĻŚõėēPJŌŽjAKƒ’œMįŌ©Īo^ŗ‹“zŸĶ@éļ£Ų>ej/ķNÕ?¬}ēhģ‚͆<ę¬?­ƒ>ēåmÄ]Č©mŪÄ(u/6 •—ł¶Ę’ƃŹ“ā*©Ÿ™ė~;«ÆäĮ_r”é‚Tǹ,Ļļūę.öwó™ ž}i«q”āū…S÷!¤žœR©LHĘŚÖä Ցl,El\D~ū½ ¬4±lBŸH£ł­\ß »­Ł£ -jņN£¤ƒÉ Ŗq͟`ˆ „÷ŻzߦĄ@ŻOEŗžźPÄ{ęūWPZ½‹āń”Æ»ˆóĘĢŌļōüžejł®YĮgˆzĘ|ŸmNZżžƒQ„©šĻŽsT·Iæ3®ä›8’­æw«S .Ėu¦"ēgŅRdD2ēå ÅĶī·’00 źĂ”Ś‚ ŸUkHp>żR’J@oexĀ<ēL”Ck„7ēŲ'q«Ō¬æŌZ¼wļŠ‰r6.–p‘ł]^1’“ņ“–øāqŚæ(#Æ{Koo~Å­HČIi „žļÉÖžLY=õgEnqNóW^¢©p1e UŗŅX0Ū拟¤l•y»¹4WL²āæżdć„(a&0Ō0ėC%s‚~d]?2D˜ ÷B1³šŖč å<Óē‰_ØŲĒū{֐Ī3æīX"·$.[ČŠ…˜l™՗Ż>i:d‘·RČK¼ĢµŻóJ½]§Za#,撄÷ūdŃĘd# S9‚÷c7ń‹Č]>ŲĒd†Ūy y‰ē;ˆ#·:2'¤„(ĀÆČŽS)|’QÕZ³iKzt‹A 0Ōr³ēŒķYĢŁŅ‡1’n¼é]{@āay6ŗ(¹ÜŽī*4`Š, ź4Ī)޲Ŗ~Ā/Ž”ęąćH©ß²vJ÷¶dF£-ńōÕ ĻåTėlŒ“<ę^B.p„žĒyÖx+¹_ü’mR.ć/¼°¾Oŗxżeū`įĆå9>`™Ó9ĄrŗWÄēüüiö&KŹ‘1V·Jąįß õ^¾ĖĘųŅPß'Uł­ŪuMWa{¾zĶ5~¤'j¬³Ia`b'ud&ŽĒģ\ż±ī›²ŌÕ” ų‹õ‡Ń+õEiirūū‰:Å04«Čeę?Ćf\[ 9·µÕĘ"=ŸOcƒŻŹ—"\Ʀ jy†·),¢˜f|ōæ€ ÅĘŁSʉ9r“)©y„æVimģž£īr˜DaÓ{¶›4żaEļĒe4EJfœŌŖg±šcƤÜæéöģ-? Ų 8·ŻĮ…éŗ 7N¾éάųhGīvĖŅĵzK D”kęOͳŠLŌØj\ĘĀß/B’w¤ģ‘É£+ܖ¤Œ“,–×§ĄĘŚR&OĒżœR“—ęéy’iĪOŸnB¬Ź·Æc¹ ŽE~bć&3.vŲ€åCé,|*å< ± T7-‹Ņą‰‹Ćõo æ~Ÿžʳٿ”UvXŹņ’4éžK˾īĄkĀ`|8@lƳæKM tõ\ī(1°}ż–;³œD¬±»”QłÖķ6Į“'Žl»„N¾3ūvó‚ķŁ)#ĒØ$4 śޟĮ”7?nZB—Š€Bu~ū3Ŗ>‚ OŪRmå„W/9ŧ’ė] Ņn9K]„‹?õ“óŹĢĘü±-lCė~»–¹   R—ś‚Ā[|9“NĻļöŠ×^CTFq6€šŁ¤ł°2EÉ µ gŖųŽńm{gĢĆ£Ąćż$āā^•S.ā©$Cl#S0ńJ±8 ˆC~1šüŖ‹ī[Q(ؔ·¦ńi;žČżōņ±‡ī•ŠX«kJ?Ĩ¹aÅC'°PŸMBż•ö.Ć ƒfōõńŸ’$üi:U/A‹ŽįdLpø¦|įĪtSh“cló iKŠ;AS<½p­§ßž"]ČÜ’–Xš[tÕ)œ‡Ó CŸ’‹/ ČJŃ»xĢ„‹Ų(Ņ;ėƒŖ>'Č-Ņ‘°K, w%*V?Į$A(‡€} ‹y0‰“>†Ąņ6^žµ7Kö"jup–ł“qKˆ„Ņγ.ŖF?¦Ē iŁHZ“É”–5ƏŸÄd©ĀwĖ×Ļ^!įÄ'D&»§#I …A¬ĢČF€±³)žŽ•Ś"ÄŖčĄWM=ž›Ōgt ÅĶlŹlȜmŹ²Øž«¾ŖŪķ Y­W)~aiµ4ųIb±Ą1¢0ŖŖ‘ דō?¼b˜d²›1b¹›«›HÖD‹( „Ķłoö>Z»aÕęšdt ®dr„ µēĶį/–™v&Ē„Ü Ś«õ E™p9éķLƒlĒR¹ĻkYŹŒŽ“œ ŚDčxū!gG@Ą@¤'‘ö[®reźiņ¼V’†~ĒÅüy& zJ īv [ČWł‡į/ēŗĢ眾{ŽĆ­ō#(2×5œ‰±ą{”é芧'f|vĶM·kÖĀŪ"»ĀõQOiÅ ł“6‰Åü–½j©Iį.Ó µ¼Öƒ¦G‚ī魍ŹÄÄ  ƒąōŲ ([čŪņ$c'©(`U”Ų+8 ć2“¾t ĶŸq%%”š“Hģ³5zŃU!čŒäŌÖ±4ķ ,‰›=z%ĢkzE3@ē}1G1:2®ł$Č#ēåŽS4į<¤Äßw3€½ĖiĆšSōP“˜QzēŽļKGD輕iJŪŽb”Ÿó×’ŅöϹ®“›OŌdy: „„”×£]OTńą»·ĆŪ TFé,}lAńĻ’š5īw&Ų*tšjV ė.\½•P­ųįX5„,|°,.» Gvƒ:`Ę܃pß.E½'–Ve= įIÉmźŅT­|1¦Ć{Ä ģōś_ō·|Ū9„ |ž²Ww¢š“ ˜ :@Ÿ28d čõtձ̈́#½)įµ&}8į5O©Öšmʾ¢V!ŹĀȼ»ĖaØ/T\¹” ¼“OŒ±¦œzBŗv7ꇙĻ«Īmt…Ŗ«ēŃhõW4õfÓ%öĻ1ąšRQ]"„óh€q((*ķ³oMa£ö!™›r¬ÆMÓŁ~ NbSēčŃ©±M«HĪj¶Ÿ¾ĄōŒF»Ó‚{ĮZ¬ÄTƒh~ Īś­”…š;¦l-›”½dģ!"÷ך(›ż¹XD5;Žæ3t„c¦ĖBŃįĮŠź,xü訌B7£oĖŅ™"¤kŅŚr{XŃØ !ūóö ‹ø=›ųğŽWPď?Č378ĮFo©ē:>m¶ī&fŠ˜ˆōJš7ŠE>ĄĄ€¤÷Ńmc#q³<Š•nß²åDKę ³Ń|fŌ+yĒWMN`ķ¼ś! ¾m,(ŸŠm/Ļ(īDš/õįż8_ī–šXŖĒ‰4C9—.õS˜ąž{ōLK¶ķŽŌ’ č?»«]T”ߨCxĄɶ‹Ą3Šß?Łf J‡¶"?Z/6ČåJqW5~āc„ā׿Ņ"ݳN$ģIˆYŅ(pV.Õ$0½…ĖõāŻūu,b·ėiHué%ѧüJ:h1Ńė]ŅǼ­¤A–žÉ¦īŒņ‰0›ŠRŒāv9}jŃj›[m”G6„ƒÉŲte½ŒźĢÉŃÓ`”Z‘×sI\į78š'ęij).ņtą=ś™ģč{p̶³Ė£`–Gš™=Å„N“ŹÅ\®`hēC]Ī'³f)ļ›&NRĒšĆ&a£R¾Qµ† «S«‹ ~J¬šE‰+žŒįwr£’X„Y$@ŽP²īń’É ˜/ؒOæep$…XōŁ<³P“&_Ż÷ęO£…ķt¬#ī[ļX *æ)Ž0!’śßR"»~{$1Ń<•‚5 ķ[Atž"č”^żT2‘Č&'* }įń”éJvē\7{q—Ü~˜ļZŅķV™šžfbhīŌĄ /Żé÷*K|¾;¼%ž„4ŚU&jJ›pˆą†ģ÷Ē';¾"ymT‚еpYzč½£äévĄ{ !„Øj‡z[)’ųzI˜BīĖ=ou’Ė„M«Nį/˜ū̐iėś}ƒŲŖ* zI\jeƒXé= 5 ‰?­#BH”5ČėĻĖ6žŚž¢Ŗij„šr¢q jŌņ„Fƒ·! §Ś/y–ŗZ³Ą Ż€óѧ‰õ%b/†jĮMšQŲCWZ7»v…¬$ØōūōFź<µ†£é‹: Ķl>—ĻT¹*Ōpķ„\õ„šöv3(M²iLļ‹5t2ó±žTĀŚžÓśc×ś%ŁČ5žž“*Ćļ.Ü¢ŪubŹųēeM>ķ¼ęÅ/ĄOv—œ£ŲµFĆ6¾ uoT|¢€›ŒÉJ€¾.SŁl¹žĀ€_ųŸģ¼ŒKöŻ}Ö+Ż9į&‚ ś±.¦‡ŒŅu÷e¢‡aÉŖ ŪPOźv:Dö<"gĄ½ŗ†±Ćńz§Ś•ŽXų8cu‰·Ł×Äē!¼ėŪĀuī–bs0įFĶLāJkFuttŗčŽÜ‹>øžŃ呧CŹ÷.Żß L<Ā¢čę]«Y*³¤WWWY„UĮŸ&“ą ķ_Ć! ØM0ņ4’× āŸĄ?J‘NhBń#{OXĶÉ,„§’|=aČ„gŖ§±æĮ֚c|·zœ›¦«“q€”2æ~œÓū)Å; | ¾™ŗ.ńŪH#•¬O` xÖCØO¢ōZe,K¾j’Ēņ«Ė©!Ø!&ā\µß~²Ą>ˆ5ŁźŚVyöDĒķLÉ}Ķ{ „Dąƒ^Ń]‚ĀcŅ3Ķ.O+Z—˜ńŖoä«A -§UÖx*ės_äĒ]¹‹kƒb°‰įŃŚķ”6+ši&oĶńŽŻ”Ē7 Å At¦ļ2ś0R1® īį¤čq%›KĒ'IoÉģšŅā‚ ±ų?®9i.ē Ś»`«vŅÖų½r¤vÖcS:fTK泐„׹®zH¢¬ŸÄ~j¬1{läöd#żX,Äē”kÄg/k©4z9X$āČXŃp’č; ŅĄÕć@A1oågżēļōŁĻ7Rč $>Āż”’žR’–Jv²­=VŚn.ߨ…ņ·\qŻŻ ĆŒŽ Łzéīį¢šŸ9Nģā®GpŗEM™ ­—ņY_2Õ^^A0ŠĻ¢¤zśźˆń—°m 꼕L*i{ē0ó_ 6Uh;Č®°ź„®éō‹Sć\~˜…' Ŗ‰uSD?˜‡qĻGÉGze«9ėÜĀx:ķņµX5oĆ ńå&NT±±ķĻ”ÅöRäuķ»ę““(ÖųÜcš¾GŹŗ«ēĄ!3vZ«-)hpˆē†p+ļ wø£*\®ÅŽūXŸdŦżĒ[~æZkÕ)Ź| F"æ»éķ™ Y†!Q×)”†J²™•äß)čܘR‡F¬PIōåIö«ōn3Żæė6,\ƒc­z¾VdŸĶ®q,Ė&)ćzx!n‹[\1o“a@zj2ĖÜ i-~³ ‰8eƒ†ā±f0t©ėžŠqßoßäpł8å?‚_Ē|ylJ6/ĀiŻ4ŅĄ2s1.‡Ēޘąo•p¦–Œ?tŠtą²s{<JxŠ—h}D 5ļŚW_&m95¼ūęÅsŌćg/.!ŠĆ½AÓāį2Č“īGh²)©÷¾ī §©J“~Ų7lų8ČėŅŗč …!żfź1$vŻāvsj„Ņ|Ž‘ų•å%ņ“äA6¾va æKäĆįĻüMi¾¼,#iµ·.B‡ƒÓéŪ;&ˆ™PŻjCŗ|Q±!@?į”\\Ŗ!gh^@,Yų;€›—łīk O'‰p­€śJ ‹Į~ŖyČI¹¾({}o?”zŃŅõZŒŌÜ8¶ ±+ü›¦Å»;$­» Œ­gy”TÖ?Ę"žŹTą'čH|ؖ8.ĒęßtM{Ųeņo "ULŚ1œ%®Ņ‚Ž֙^zC—¼ŁjGØØn²†ķt°Y ĪĒÉųž6fØ „>āiͧ³NōŃīü{7ųc€fō½¶2õŚb_UB~sŗW^oöīÓTē—réQ% KZ“žš“ā­“‰G0±ESŠ’6ic÷¼åՃJ3ŸCķ’žŚ*xč[oŽ—ßŠBÕĖĻB/ü’v¤W¦“éÅ{Żä‹ĮmųÓō<‘,ÉR(x¶6gVHkžķ®z©TŪŗ„¦U)Ö`W?¦ĶY"sŽ@”[žK jŚĮÕõĮlžłFS›Ī‡ÜB…ń?“Ź^}źaJ_ķ.y¼źä’aā¾[‘jPź"!‚ÕŁƒ;¬g’ė¾}^ĖÄaN77£§jĆ®%¢D}"Z¼Žģ •»ōQ /{k¾ Ū„>-:03ĢzĶł·~ś`@<"—¾{ĢvIćīĮ­|üݹöTh½ üĶG«=%ŸÉ G¶zØŃ4×Ŗ1ķL¬dĮNøō-qq·¦Ļyz|āP1<[›*Ūj ćø³†O1ɮӿ?§šæ¦ųršM½łœžĆ¶÷Ėōķgh‡øU–ŹŠĪĄ&Ōg¾U}7»}D7ŪŪŲńæE„N8}IG¾üÆH„Ɲ(¬‰h©VĖBكįŽåv£Ū¤+¶LJ’!„ŸÓtx<Ч2%ä[Å)둦Öļ XœĻĖ8Ē÷ŖO^ęŲtŻš€ÅJV«fłSµĢ+ d7&`Šń§MĒŠ!Ö såR“¬­Ö¬j æĆˆUݳ,c„Š…ärIĪIĄRN§•źEHĶf<õXˆÖŻ ĀP4ß" ­Ł73ßꎌkr‹kŖ¢=”9ø€ õ-^ž\d%R˜W¼¬³ŪÖ;O@ė%z†”&©DH.Kß1Ā„NžŒB@7 Žē\ćvņzGmĶłĘB9Mģ5æT8 “Ų•VƬą4¬X’y√šŪ£„‡§ŽE÷j•I÷7Ē›1„W »Õ˜¼ėsm"üpł-bńR@TQ€/elrÜöc`ņĻKĖŻļEx›ß­Ózž‹Ōēgž@ŠōÕxÄ-1Ä'¹#šāŹwoČŚ°0QøÆ*äR`Ś{ žvGœä’„n– ]£ę # ?‰‹¢8}L:'ĒkčžÉG źīČØbK~Śēšl˜Ÿļ‚‡¢S•ŖŸcœ¢Ņ鄲 ŠĘ¾ƒ‹@$&ō¹ÜMYŒģ5wV—®Šą[ŚŌŅ¢ E’Ļ:ÉĆÉu–‹©~Mœ•°c#ƒĢ¤‚lö† »ŲåŪęøVg?ΰ©,j=å®ū¼ūAė|’ĀGF‘ÉH›i­q[ÓŠŗ?O¬‘ ÓMØŖƒŽI% T=Ź ķį†ÄÓbüaDhœ¤ĖxšÓ¾?Ä^³˜ņ«EGb*t2ˆf‡s:ži›ÓIņpY·śŒcaRĶ fDLĘųgČģŻ¶å9dĆSœN6~«ƒ>ģ*Ų xT78ą1įH_ŗčõ}Ņä:ŁĒ·‡Eœ>«‘-gĪXčļŲ„„Ąkčæ~—ЧPēĄfčz’Ō(ćĀÜj~_é®H” Öčcča7źHߍa&zv[Óbź0ZmĈ–ē ąÄūßµ’̇·%«üXĆT>ĘMaɰv@™Ų@„č“„C@ ąź}4“™„šĪއ-&ģ•ō&TDźn^{uōUń‡Żtź$W å}“p›ŹpŖŃ¢@šóž eTbš‡äÆŚĶ|7’*¼šm^Æ2D&ŃźVP…’Ię;Ī_čVčį£šʵFb1³­£¦ƒŠœż$ \+;®3¦h5ƏmūQ K AŌ'¾:VÄTDģ¬l.]±ńul†—…Ćī<1ŽÆ‘ÖX|’õķ !¹{Lˆµ1 ŗÅ~;ŁN„”“Ż£.»jNr(„Q¦±v˜ų»pćTmćBŃq;ćuKÅÓT U¢uæTō¶£XšĘ|āŌn–6k@”¤ÆL<%0)…¬¹ĖŲpéĻķ;?ܼĮä{ć䋻óī?½gÖ§ ĄšWkpPJ˜3æņĪ›• éÆqvhZūc}÷E#vj/ż½”»«•Lńńm?7õ«F^}\Ö%’^»ÕłE¢§Õ)¦(Aų‰՚ĻŃ8Ėpe®ŪMGZ?«D£–A²'x˜Syü°YeZuĆtÖ»„]nš‚‘‚€ĀsÅę.šT½Šn{陣ųjwPŌ°€=Ɩ#ƒE%'Żj”š›Ę™~¾ŗŲ¢ZZZOŽ5æßņŠ+<”t皧ģā£ÅĘɄēy¶VŲęīY;åQA¬5C˜Bż©…š2Ū:±¢¦±—«ž»S6öŚM|é/6ģśŽnkŲ L hĒK„Wœ9Ī.»sO…ź÷%¶ŃT͆åŶ µ9·I<ó!WŽyź¶Ó-Ģõ,›Õ¶x.åŪŁZU/wŅUƒļ©ń3åäŠÓ§ņķϾØkI&–Fˁ?§®†å`ˆ»ųõ/x—˜é azk“sÆĖŌ$¢Ąć’éŃü›l–kKĒY ć’BP󠓈~ķ '2;©Aģ›4-g.˜Vø¼ ų H_•øVĢŠTurJt1^tśl¹JMł7ņw!šžÜ"[Õ<ÖɼŁN7Ø#yŒŻ¹C),Y² Ä@f.÷m2~‰›jIĢA¼"ĘO'æ¢ĆŽØ‹!±Qź\H™ĮįÆŪį³,³CŽPS­ÉłēvR^•ąb±Ū 2ĄĢ€”!¤ce1ƛ]—@ečq¹h¤»i5i9š„ņ’ę;žēOˆ«µzSfwkĶS]“²ōbM_*mą‰ŚM£’Ū„õ^-j'HļĀ(Ī•wŃØ`Ķe‰ ü_ņ°!T–>¤iü ®Iģæ‚ä驼²ģ¼JēŃ%]¢”<8=*óųœ(Gˆ _©_óĮĘ:ė’åiŲWkzåå9+åķ$gĮ]Ń źĄ„É5!¢Ž'@”|ÖGRODÜwg½²Ņ)åk’ł{ŠĪ›]Œ·™Œ›l»ˆČź÷ÅGTNÓA†r•šséįē,ĆŃ<9k§aåˆ/Dą³.m³Ar)Ł6ŚŲś’ĀwĮ3žĒvż'Įŗ30yĘ$.pP³• Ā?œ±”—±öĪ5Ē/čF®0š0!ž·s+ĆĒ¼Ił Ƭ3×z…Į€Y^ā”łŚ¹~ŸLš{GqŖA‘ńĻ‹Ą5©yœ€ĘQü¢‰¶J=“eŸ’Õ½ü? $Ć{SJļŌBå ~Œ‚;Ó/ ²\vIׅ4ą†ĻĒ—ŌÕ”eĶuuõtż†…ÓEt©¹ĪĄ[CS¢QA·y $õ Ęfļfŗ"‰©Nž(Y› ŠSs-MjōPdĶs]7’ņ$•ōQ^æ®ļ­’Ū`­ŽŽ ±ŹÄ’²u5rž~r2Ö;o}Ŗ‰•ī’(šō&7ųoNź^ŌHŽg>ŻDх÷O›…ź”“ÕŲÅę· f \(ŽĘÅYfu7ttÕŪ©‡Ū@4wX“ĮWQ“øų¹D>oˆĶNČ®|V¦·ŚpČ)&$[55d ”œt–•—$śńå³Ē/‰łmYg­|B#ĄŲå;(ŽaŪ{J0Īōło†ō!“?8Ļ il’Ā$č‹ĒVfk HįuT(ąL¢`eчŻČ ‘AFŁ«š40F^ps)„ 7~¹°("lӎē'GŌłZ(Ė3‡K[6HŻš4lŌĶÕÓČX©¶`¹4µ”*µ ·|äߚėU'•¬Å¾ļī»·ßÄIVMCĖ8ĖSi;”A²ŲĢZ°į‘£ź“ŽąFŒŠ’]•ÅHłä‹śõL_y“Ē”ēQĘØ‡äk-Ā \vLEQ¾B\)ź|ž•i͉®?¤ęš‘uœØüt ģna,ēšć‘“¶žŚc üvZ!ʌėµE®ū”;¶źXŁÕcij\ŌĢ“>8hiSĘ1’ģœĻ«J>&*Ę2ŖųŠ•ž²Œ0’ õ]k‘O5™å掙0dījށ1eLčŻ2*ék…ąµRs£·/z‰”œrh“Aķ®0ŽŻpĘæ ļ,%ņvZŻ2rålTž]·éßk$²:ŁO¼A"TƉ¼5¼o±£īĻ52Ŗt@üq(]Ģ›:{ÜsŖ%é“4”¼63y «ćūk„-yēzrĪRV 7Čģ€Lˆ5„1r“åZ “ģšPÜõ®ļņR=4{ź$ČDś)«<.īłšNpō‹›ģÕéEŌ–«hW2~¦łšƒ>­ĪupĻēutM :•ł([EŸÅ\є›Éeč<ńģœń9įĄ¼ŪōŠFRŅAä~Vjķó©ĮļA.9Ļ/_Ą,'ĢŹÅ朦\¹ńdÓlYå9 Œįū.»ź'ŅpmJ|„L{Ļ‘ 7"š°ŅŌ,D¹Ķ!łÓ`ÜŖœL\ÕtDnā:ēŠEö¾L ĒYo(X•½ļ/qÓāżŠwŔJ×čņP€¢eÅķ5ēīyü7łÖx„qz&äI4$åŒ SūR"]d’^«·”«Ņćż[-UN[K„©§Ļ“ļ\¶8PXń9Ät¾ŠteMć0„˜Ā‰ƒ#ÕõØq¶=$|.ź)mq¶ĪT}k?mœˆńÉ(g/еI`&,ų_ŽøT’€ĘINF µ“¤Č7;¼˜śBµ83ÆOķĄćčĀ+‹ićfv¼ē_įb§Ó0Ŗ*.’^ĖP–ƒpܶaš¦&ī^įyķμPņä›A¶Ž U6!2ĘH$øāō&],M’„ģļxQT½|S¦wD æ,ā_Õ>'»؊‹pŪŁ²Š³h„#£nŖ– ŻF‚sMĘOģĀBś„MŽ»ē': æØ&ŠPųÅ®ØOl…éÕ*\sv‡EŃd@@ĢF…8Ųµś:óŚĘP(€āBŅ0™žšgH'Ęśœ0 žė3­Ū+¼¶³v‘«ŠvGe›2ŲB+*, ³„ŻŚ+Ś^—‘“|V%2ėʀ?ErŁH< ¤?{J†ź/šČBä8Ų””óŚzq×*$ƒN÷'üŽv¤^ąfåQ:¾{›Ż›–¤ßųĢ=H6éåĪ„³9 #ĀQ7SDŃu4»y—ÄųÄ$*éiK¬ĖŒRM™h”®±0݆Čl¾n§ŸšĒ;,n:EįÕč@“æ£*ŠKĉ‡2w}—fnčąö"‹25㢂?Ć iż«ŸHm²ŃUŖ¾Q-0–÷˜&šeŠČґЄ¹:ŃżJŽ®®_?ˆzQoéoK½R„Ó ˜}ĒłīV¹EłrЇŪQk%Śõ»x®P–Ä“č W”„X}9Ā’“ o1ĵ#!£łż d<„õ•“5Õ7=ķĖž‡Uõżb5‚Ü$Ńi…Öī(°ŃĮÜ„#NšņlB^·KpĪ‘58ējs’iāž¹ńV.ĶĀšŁ šIÆä½ź9ėI敁¼Ņž ¾’ Ū=2=2aUaõąų<óą¶ĶOētw…›'źMÓ=IųW’¤ķü¼ąiĮ— %7ŗYÜEś‹ W¬`ņ''bĘ2PE·}zBćÜĒ“0r!„„ˆ•¼’ÖłˆõŠ5E÷¤H²OłMƒ?«‡pĻBˆĪ«æŅ_r&%³ŅRS*Fć7 Äł°å¦ Ačø‚=[”¼ƒ;܅h”Nąaćń°āūˆ-źŖjĮ±’Ė†*Öō‘•ŌR¶|śœ75³+Ö …N6źxš¾ä“7ĀAŖéIx9‰k q8yĪ<$˜®°}Ī„š=Ā*øT’Vp©uąB.JŸč_ˆČŒ¤UÅ’\gļ ŻŒ WłøŅŒØŽ\SS)3RŠ„śr2Ÿ¶žWo=ņYŪŪŽĖ€ŚĮV|ļˆĢĘĢpœw’śH˜D V£óśē[ ć³ Ćpއ<Ļ–Ƥ3H–aN¦”ńöHÖ~zyD„ķįGKŽ#q’8n±ŽŽmą=ńĪ„¹«ŪæQ3~FŲ֏¹&:ź6j‰Tķ2+ĮU'ņµėA@ŖA…čBŌfÓŃČü@ŅØCŁpe|Nv i‘g뇵 ¢Ž“r_š 7Fjų„ī/p’’D·š¶¬30”ńkģ”Š0•ßä 4Za³bĀŖĶqķ^ē’©Fd§€pf©ÓšzŪ_ĄQq©łš RĄB‡ŹEģØÉ¶é‡ 8F#ĮīOĻĘ”)7LąmRT¦|ā{Ü.t:Qp ļ”ŲQ;Oįębl~¶œ@{H{KGeö5 łĪąŽŽ®Š č÷[¦é{Į QŅ:YƒØC›j]ü[Ly»3t9åLŗ±ˆ•1¦įøŽ&ģīĄœ³„€źÜo/?ÄŲ©s˲L™:øĶn 2³§ę)B‘1ˆjģķ„Y.Ż”(DÓĮ–ēś€Čן£ŗŪĘŚ āž› ū×.Š'(ō¬  Āj|‰`Ŗ ^\²3ŽŁ^§™ō³Ą÷0ŗœÓ_‹±ĆwzŲ‘)OŸ.óīō-<ā`ļĖšĀbƒē7ĢW£TKNZF“;Ź$ń£»±ÉƒU޲#µgT»¤×rŌ“Sü„_½"ĘŗLž:i];Æi¬Œ?mpȇ̀Å$'Īä˜õĆĻĢQ‚ńĪvŁ “u‘’±:Œłż Ž ›˜<£Kå{Q:M•@Ü£Ę](sŒ•­)“$¼\ĘØ3ٻóŠĶśĶy”²čŪŚiĆłŁ3Ž'÷1^źP’éYfølΤ„9Z#FĘ0¤ zĒ'D«\彇Ye1h‰€Ą? 0=§&>KüvV[‚ŽāĢČoM(¶S]žĄīŁt¬Ž@ķ7Č~½ŽŹŚÅ> ÆŽo°p²4įb”-ÕŁvåBzR”Ž&=ć“¢²„óšåĻ€ŽmUü<6Š}©ćš|ä_Y{ęłīx8ķļš%č8ó"ŃUw6{ł 9čģōø:Øn™ŗõ0“ŽØ[FĆDŚĄ ¦*w30K ^üĆØ»Ź.4ŽQ`}BcXzų³ÅeコĖ).Ū(@'Üm­ŌÉõQĄ£~ōRE°Ī]G#h=V’::L™w ²˳†Eµ¹’tAŽ…f³E"D-ÖŻĀl°\ŒJā+…L"xŃķ³­Gń×£7¤¹!ÜjøžbAy°õ!lķ\„6³Õā6ŃA0ä Tł¢'vCž±33rŹI,võī ǺԚ]MžZGĮ%T?‘Qµ¦ęDzߣFlFœ¶™1®Š¬]h7ä›Ü94ż¢Žųm\Ć», ńSł#Ź1¤MømĘō¤×ĒŪ>ānŗĮ ė”iōP/z³īįŪ> ōÖ=Ā Øå:.ČAł™Q |ė?ų>_škŽ2ļGœßĆKk—ć3ɹg ØM9eČ*ĖG¾h¾„z³ĆrwĖ½ƒŗ{©f² Ądrģ›#s\ø‰|7ĀS¦ē%Ź3°‘É'¦+)†ō Ū1E= 0?m U‰GķóBē’FNS~¦G8rÜß8£³ģökW,’ąSHpušY\x—ų”£Gn'åV6SśǵrÖ4T’3 ĄŃQĖŠ_€Ē¹żŠ‡É7[ƒ$*‡•°$ƒž;‡ 3k2ķŲöz¹qéū1L¦÷Ü«„€HĮ‡tÕćĪøÅLsēt:ĄĘ&e‹žwÉ"X™y*6°ŽŹā0h>Q™ē Élz•“ 5Ąśä:šä¾€īdŽąWČ98×°Ś©h«%#Õ£JÄ=t#ŽT~}n ĆvŠ)‹°”žƒ¾®mžXŽX ł¾µ„¾|‚>4 ;c]łŸ|üī{€ą€&‚`ݜžBDś¬`u] kŽ8¾¼7Ī-VnŹĢ×ļ²  @8®!ļØV‡ŃĆ9‡*§ęąĻp֏õ ¦ū'ŪNŗ4Éģś½~ķ"%6ęĢ‚Āó†t ›=Ļ;”.R\xp:šķ=Kŗ[+Ų–™j–€äÅ^³*ŻØ«ē&زėĄI“œM±vøĆĢōf8sņ0‡tĄ€eõU…޾”ų‚k’ČŁåŒjś”°Œ" )֕I‹UÕs¢į‚@Ąņ5OīĒÅ,D–„«Ls~"SćŹYŽčÜŗģ„cµøa³³5ś×‹–»Ä—ią/˜(XUCߊ˜ĢTrƦO|<œŌ5\xūZŁ€33AOŌßćÓĻ A»§)žÓ$vBo“ŒŖÉžę—8Wü’83 %ŗ@%/Š5ĄŽųUū@³:ŽrÅøÖsRÖ²2R yØ }™6Ōą¶~šŪū+…$ėĢĻ ū‹ųS +Ė…I›| ¦(«§ŒAéķ²aÄ2–PŸH(4*±?‚ĒI9³©(ń®Ŗ)»/Ķ3ŌņīĄH ‡Ļ³wU‘…>K7>Ŗ·>7žJJ†—äsōWž3¬łNŹć²8łA8öObrz;ŲRzP£’Ēy°„ž„™+ÅHX·Ķ8ĢĒƹ©p^ĻØ‘:³GĄCȊĀw‚™mSų>A¼ ó#Ēø0Zwƒ“īÆĄõzØQ«š6‚,Ķę|gć0‹šgˆÖµn…g¾9DøQÄ2ņNmė@:Gž›Ł €­ˆń4WmöČ.ĘV¾ĒŸ\‚B”`ŌŊ£śY’« Č­”8Āł…ĄJӘ’bŌ×»iśHnˆ×"ƒÓ‘¬ł> AIS,ųūX ų€vÆę$/QĄŁp-¦kĻ“+e“L»č‘ŗM“‘oĢõN‘„ö¬h M¹ü“ÄčĀU”ĀRé×üīSžŲ"\ m+či„ŲdŖi+. ‘ e»ŸÜb Ž$ķxŅŖ£Žk^Żóٱ‘HbŹzóÉR&®Ōzb€ƒx‚ĖÅə`vö ŻžēU£ń-3Š@E–Ś45Ür& ”­ņs†×}ęXf`€ƒędC Ē>s—Ó 9ŅG “‹_īV#ڐŽŹ!õÆ,HVČąļŲžņä…LĻcEr£ä5šļ»ćP »N&NvĖ«)€Š‘ģev‹¾3äéHĀ»Ä,7DAē~Õ/k6"(g’Gy3HĻP¾÷źŗäĻpąc—.”ŲLzEų ↭Ø!Õó/ĪßŹŅŹäĶjÆW|žUmZvgĻ€ƒ)“1,؊ Ćå’Ģׯ~÷śŅ¦ķ’6øėFiA†°“W;ÖÆdANņMāŪ=Š!S.śøäTŁŌ!ć²¹]·[R€ d ßŹÕ ­pķ{B3żWS»/Č2dĒLuhĘÄe(®µo"$]$‰“hĒĢ YEŲgD’ӓ°÷²æQ,éqšĢ ¼f”RÄĖ`{7•.‰ģ¤5gœCjÆórc;ȼ¢ŽQŲ,h„„hēåĆS ž(ˆŠ5įŖ_ĖÖ!éøa=·–„‚=ėžó«¾š1’ź“ģū¹m cFļ‹d‚ĒR]Sn_0][Č+\˜ęL“'r<č ōkŪ{ē-ńz48ŠĀ®@öKՈėOšĆŒžJ˜ĪŁ1ÅTŚ<Ņ€ P×*Ī+%d²„"¶0ō›u®†‚Z•+Šb—VņYI‰=U%ާßōģĻĄ¶&Ēõ”øuŚeŽLVHN5)°HŠŽāYłQż+I*J•UæZ"C7ĆłSėLį7¶Ä Ų„‡¦ ”A«§†Z0ʘ4A&¢N ŗ/`)’ Ó‡­ēŹū>D–OĀ““ÄArGkMk Sj÷_¶*‚8•^‹¶xŽ­š6C·Ö¼jŪ'«å…Ó%õāW=ˆ&³"LĢC5ŽØ–}j‰#ŗ‚I? Ź  «'ų8­‚€G¦2ęj€©ź@4o ÓŻ—Ŗ×i+ķĢžĄ6Ʊ‚Ą4v5‘5éŅ38‡°?iįWŌ&¶Pī;Aåe’‹įÉ7F`9E@]@ųźź†|§4YœÆ1;ėJ\LIosW’ÄÕvŹāEŒĄ”ėżI )^L؋]И¶ÆßśūnfƒYs=:££„ęāRĘŅŪxĖ]«ĪZe‡żLKĆØ^g?ĀŽ¦ÕÉØXd>éĘŹ>Ÿcš łÖņX—Q4*ż#$Yāpb^ĘäŠbPķłҶMƒŠ©z×.BGķ85›µĖ-å a·ļU†…@Ö×a3H†¶hŪ+R ĮbÆÜ_õ†™u|ļ!lsŗ€ŸMåfx#Ü£6šČ§‚w BW©`Į™u^^ż°Æģ Šf ōzq V¶0Fm݁oΠФ11§Mpõz=ūĢ jlŠUP]3V\/ąæ“Ź|1T=łÖį8v’eyT#¢Ėų쯷3i)ĢŌüUć-Ķ a[`7”ó„Õ¬iŚyśĢ ĶńŅæÉś~ą s‡²„ku™“t’8©†ĢmŹ–€Cė1!ĖqŁg–zœįĀh‘<ĖzHs`v)¤„³æ­¶{÷EŒSŅKß%¹“Zy#Õō­Ūeˆ¢-¹µxÉŃž+Œ\C°‰ł˜Y°€ė;‘Ÿ)óXč# ³ŠMLJä Zųū32„ń$ZĀžģ÷Ņ|śćĘ:ż=Éżšó÷ÉP,Ąčsj[Š;‚uĪVÅEļŹ<ŻÅ»†£ „÷o?»Žƒ Ś” „°^ŠdMź0­ö (¢{FµŸˆ“&£Ų|!X8„ĘĪtĻyńż©ŗÄÕc7]8lŗ„ó#ļ"‘X7½Z½U”ßsæ‡ Ė,£ŹÕéšš“*”g%Ķ‘ÉQ1Pö¤±IŲå) ‚zØX d|¢z0Łā¹ūƇƒ³*Ń-€ēœÄõć ļĶx‰ƒ_lŚj'+Ō§ V¢iWÕ'‘õ ƒŠ74#hœ‹ęŻÆ>eJ×z†Ö¢3Ź-UīÓµJ>”ķ5 Ŗ­ÕkŠÆ·+¶øW],¤Ž•¦G¾zļV.āc±‘ī‹® ˜L†[XXŽ.ŚĀ¼,ßāŽĒD''ł ī÷<_‡A!³~ƒõdX±źzó²j#9æe)kC'S˜ü颔œ’, ćÉßX_ ‡Ž~$ĻCKgб‘sŸĒ9Ž›č’[ J?‚J ’8^īœ)ą—FīĆ4+Ič\źņ ą½…NŽŅŁøŲźĻõHNp¤ŲI/†ąIoBåh;ņŖƒÄK*u\kæQ0¾ŲÉO‚¹Bgq1žēčÉī±µ£Švżgrj§|Y•Ł“VÄSf¤Ÿ/œ¬Ćӏ–ҹiŽ-čŖķąĪįq…öWūč2"zó²ēE"ŒsŸ¤¬1qo9Eg×IņEž~݊«ŽU{Žā„šĆæHļ­•½ lvėµVŒ*©šłĻ„3ļfānp_įŒ(’!C,5}‡¢s“B¶…ŲŖi} ”wVn8¬¬AHøč>:gĻ3*{€}ē)f\åĒUŪ%SŅǟ2›Ųóņ}¾ø2ĖŲ‡óc•ęķ°P­bfµŽbÉŪą¼ך"~üūÖÕ­äū6ž¹W駑Õ&z»C1Tk°w‡č„I ŠÓŗē‡9ŖŌŪ•ŠPcÜńŒ!#B"Wżń÷Ø£+’('tTĆČ䱐PŲ_šå@‚µŖżĶžÅĘO*É­ļĖ,m»ńž’Tä¤wÕi~Y|@ĒuėneöĢģĄ~Pų3*$ ŃßÓĶ֟œWK„£”2uĄjN[Ž“ūyŹĢÜ-Č ˆnŖŌƒ’·ć„€¾?ÜåsĮ-½˜ŠW®łz]‰dlNEśÆĄÉhq$^¬ˆ Z=Ž:Š“Lʦ’r y"idĀ}¶®a!&ł$j­®;}²šŪ-»q½ÄžPO–3X±boBc9išrdc¾²żµOž½ ©’ dUęžę¾ Õ*ó‰]ŗD j¢§6£čIiSŌhūq°²9[©ęCņļzŒ”5Õ°²( æ“0‰„µšNœĀłŖ½[>£–…ˆ(Ł]}m Ž&‚R3¢D›øØéňCö8 ­™_K.BČøƒ®½R/ ½X‰+j{°@Ī«ĮRrxĶP½²DiÆš/·+©ˆśY śćŽų*™ž²É5ä±Ļ­4ŗ‹u£[-mņpī£/Ż­=Į¤E=æ:ūBęœb–F,ō„ż°‘:Ą¹,CBĀ™č©Łxų}S³a½_e'—mebÆÉ1įžĪśÄĻf&÷Z¦j›oķ¶VŽ<)Æ'to÷ŀSÕĘ­Ģ*•@Ņé-CÆ {r“æXU’Ż-qL>Ä C°$±b<9bŖ›lĄFŅ[¢ś˜Ŗ Ÿšµ:‡?+DtA:µ&W0~v-*“¹:NyČZ’w¤Ģ€pŌ::»÷£)Ęģtl¶ĘŻoSśÄ>ĄXj¬Ē‰Ž’0BŃą9÷^м³ą„õyŚ0#D®u„ĮNņ?µóp“ųł+’ūŻa8AP”ŲNėLlš8b,·Ī¼ŁSääĒÕµ‹±’“”ČĘJ!™’U}żY°*“+•Wė“­łĶžO(+?_ō@łJ@ĢåZV° uTĄ™eCC“¬3īŚ'ŅTEFƒ×PĮ‹_;°L(Q…ŒpÖ°Z“وĢkœ<óŠ9­F“ŅK‹!¹%gčˆk†%‹y҃;&õp*ßõˆ‰Čé ‚X9ŁĄøÉĻÜ®įDs­ś·;-¾żŗ ż4ą‰[e^ƒGU F˜)°w—ß ½ˆ.m°¤ Ųž2žķ‡Ónæ0˜¬œćŠźA£ŸÜd? rŌ†_½Ē­hR“õ8Žüøg7©¤)5ž¬&ÄJ™[ ¢é›šFó’P‹1põZŹō  ¦ź/ßß%v52†wW^g„ųŖ1.~kž°źĮG³Ī™.bĪüÉæˆ¼bīU™0cz]OF6-ѬŸ.8Ębą±mŠU‡Ŗ§L°¼†M8鱀`ȶ­}…|“¢ŪčėXT¼Z±ē¢9˜ųŖ£)£p  ±‹ĻM—µPGˆ§M’WŒćd­Ų½ŻmÅ-ć ÷[ kŃYĘ0›)įųO’¾d¶Œ»Ē²ś!}#æføµ ŗ’ ©=ū4ŠC©ę^dP}ĪYénfr=īØ/%½ISģŁ8ĄŚ śU ”f+ecųü\Ę?`ćNóźŪ1$pŃäØłšG! >$NÉv—m((—†šhhcÆ©W;“Įuų’ō/ü®E{3ŗŅĢĀYسJź cžĮb_»Ł9k‘ņu¼ ­Ė œ’L0Œć ?aAź k=„«¹Žé:āYĪ$Õ{3=8ėÅ©®n#ė±±±ŒŃßwgĆ9§ņ+|r›“”ńn˜ųł±ćŅ,2n‘n#֖{`D\ŠPž[JöҼ8+‰*B›‘n‘‰Ŗ‚ޱ¼‰×U©“‡'§A,±ÓKE¶“uU<§z•`Ü eB©ūĖP’“‚ĘpŠ1@Ķ8K\š…מük7 ²‡6žiNĒbӄ:ŃĶ ųĄK Οfń3ļ/·’M4²¤y<05;ÕĮ Ÿźž“P- oąŽ ·ķĄ¤ųNƒ,æŹ–Dē‚ŪĘqbłr?ŅbE&œ­…™(§»÷ß=K£«­=Ģ®ō˜}_Mv7ט#" o¬RpĀŽX”Äkųa:ćæśCuÖ$‡;÷²f‡ē*x{\ƒ’  %E˜ęF“čžS,€™¹2·ÅĶpżžģLDĒ|Ųb×ŠŪ?̚”ƒ–=¶å+÷Ž@„»†ß|˜“4ĢŠ³¼Z°“Ŗ żēPz©q¦mĒ Š‚åN!NŖ˜%d\Bˆ3žµ²€“Ū©½L’®Łū«Čqkū4’ä±?LĶQr7Ķß'¢Ū~ȁž§XŖbz €Ćł ųīPŻJz‹— ųĀźó8Ū„¹ĮDnmµ:,·7МĄJ±īīyŁōƒfRŹåŁ+ŽĪŠį2š÷iFQģē•^ų{lī@żõ‹²‘ wA&ᘸĪ4Tœ›6RŒ °ö…¹=ū=> öü]ąGœŽ%ūāč–h*>7Æ;~łŁ=„d+mĘ ń4®fĻĄrĖ÷g»™|ߌ5gÄą÷oŽõC.vĄž:Oē­oEhpq“ä·plŠĮ@H¬žź9®0ńłłōŽČ†E-]ÉG&„“))„+Ī:Įå ”ūw±[ ZlC䁯Q1»x§Ś/!«– Ō€!>Ų•™<ßEs§‚­'‰³d®H [+%ipFj#§)VŒ0Žńwöé“D9xșWÉžqpīæąź³},¢ bēdc3ēōĀcŖM 4uL¬EŠj{-†Ór_č³3ż+BtAaQIs²ŅĮUDuGQ·Ö«|/cgt걓ü^ī”G"‡"żˆ 9CćJĻč’—{QWÖŅ g²Īī.bŪX•OĮDšŹ‡0±„Aüᨠlj>Óa8.5‰Œč;»”jņ•m H™}'5°Hö½+#Ȑo·v½æM­ńt“'[2ī5[‘¤ģjō>j¬öa¤µ~«j×&Zw;9ŗźw°ńĄs#擊J(ƶfołŽØ‚P]bęļŁļö_?S(ĒܛŅ+Ž…¬j—~©ŗR(±źr/+üå4ĀL'Tōįå̵¼¹­ė¢'Ź'ׯ łųĘAžHØ"rĻž©HÓ}Q×FSz—Š„PnœH(cƂ~õĪ2ŻØÜ+, ‹…—5Ċķū}Æ9qəXņIŗ%¼9ņŖ÷Ķ€ ·UzXĘe±–%T¶;†ČŠć‚"ģ ×öõ!)‰ÕrāŻ®^)øgēƒ,ł-E©¾“R„ōÓ9r2sā%©śü{ «†|BȖ?¢œx0ū4*ƒĶ'¦ę(N›÷nc·’¼LKŽ"nyŽŽÕ„Rķ\?ÜT<‰–a„B£n!i^"'}•Øšł—øµÄ1R±ĄI$éøćµ<˜»Sl3„v*/–pZĻŪ½¬Ķ.2ĻųrūĮ3Œ¬“V¤§pŃY¾Łr[V˜Q/€¢¶ž:ąĻ‹KžœōĖ[]‚Š…Į¶8€uDŁ’ٚ$”fĒęZŪ‚äh>yE0Ž­śü\;Ł_ō.¤0\Łķœ»TS~Øu¬*듽õ“:½ä”ŖÅĮŠ,/õ’tJnƼ0ŚŲ ,T”Ŗ‘Ćäw;;N·š šš,b K‡BnĆ0ø”­tö½¾ęŠŗÕCĪpz<šµśĻwĪk-Kw4_ć+…€;Į·ęŌY' żž0·»–²N„Ø@®U]eĢń‘ĻChŹŪbły%†ėī[XoWßeŚĖ:šX7ŌŻté½TmÖ©ļRC¶«jCłˆŌ FXƃ‰ų“uurŖ1ĶZūŪ#ŹÆ>³cGf8akŁt¤GøäYõAųr¬X®ū˜ž@ŁįX],¬ēDłóļc¢¢ĒĒD=v{Ē]ØCß(J·Ps1Ųd;HµüμZ¢‘śu,ČĻ{*’Āgō9š`ö|æÅHšŲoóRÄį3,2+ukN—#ED?^kĪ9s‡3ĘYūY|E³{1€J.Åę6sc^I±NzE·Ę›q\Zņ”«˜øü’" C5š1Em¬÷5Ž`³¾sžŠEi¦Yżŗłć#dś~QˆĶf‹° ©bœ÷²`”_³{é&ń˜ēzĪ­#G¤É5‚Ń $Ų%ŠKPČéĆgķĖn]%uJ’/"ܤQ”õBŠzŪŲ—ŽUäEq š’XĄįNųAvŸ¦Żgœį1SĄJ-“Ź9B‘LOČāY‹v\47Ź#6ˆĮYėJ ¼HZœć“ˆkAęL„ٶ…ž²Ā‰9# =ꕀ4›Ķ—¤Ś‚¢¦=!¦ųD·°ŁÆ¤·”Œ˜Ó¬wߢÕŲUlTĘSj’įi鹆·„Ń’NĖ] hłD¶żTiEzlF­ų“’åKʇÜ\ŃĖ£aD[ü/\U˜4Ķg.‰d2¼÷X†ŪłSxuEқт;Vė¹>č°ē)Ɓ‰³ü·9©ŠPė>”šÕųóŪ“ŒßIåźĻ„4”ƒ[ؼrT³_¢‘·] Ź](gĘūØ>\šf.™@g½”3ś‹r;kd!äb ·¤ÜW؏éŃģ~DŌ~#Å“śßO„¼Õ­‘L,rjĘ0ųšWSóÖmÆ>ķpÄŠĀ˜Iež8'‚A ™v$Ÿv÷čīŚ~B\‘*Ź›ŗŹ;śŪȟų–Ś_Ÿų¶7Wå@gl„R5ŲEąøį‚^ń„mE ŠnFŃæ$[–śo—Ų+¾uµŻ Ł“RO‘!§ 9Ū8 ¾Į17RJ£&-Cd#ŻŪ’©tL\¹«Ÿi2÷ņ벫d<2Éa“©Y¬Žęff$Źo÷•V½Ū’"øbœ¾£:™õÖŖ°…`„¬k»¹|r^VWž!üEłæĶ%Ó~»½Ī»l$ģ…ŃN»"·ĶļfĄź!źĢ§¾žk-3Ę ®|4ĖÖI‰ž)ĖvghGæ^¢éžŅŃ$¤äK€Ģbļņ¹Ąd+ƶöŸīK\&©œŠ;é°ē[Ž>Eż¦‡ņBļŚ2Ge²Éõ7ĢūĶ3XK,§Õ£Ōµ½6w-ę5Ō@;=W/ŠZpÖ|ŽńNš[ĢÓpūÖSŒ„€yģ^Źæd¤.µņŽóĮp×)‘ĀMUˆśņG4ģV|i“™Ŗ¦ ĄŒeč^ä§ĻōB¬Ļo‚xSXUŸ>R»v˜xŻåė.ĻŌ^…–¦ņń!ÄŻ¦rv¶\žręµS…車T(¼’]ĄUe¼.|5Æ-Q¢…ł_ŪzłĶÜ“8’nšJˆC²»ÅņšķcŁCĀ6Bj,‹M0{y3HŲßėģĒŅj¤”Ŗ!UĘ^ f&„y>Ÿ)4¤ĘłĢxåĆPZ6D³ŪĢ{FžųōŹ- PĻæ TŖ:4ˆŗ¶õ|Wå}ź}Ū÷ź­‹ń6š]°…CĒ‹Mų-—Ś‚ā)²æń]és>®¬Ķ”¶5 ²jŗ ÉÕf Ąå™„\Ÿ‘?Q™‘j^w« äąuĪģ8č`uČ«ĪŠ¬„?›!łēˆy)“8żp~A?!¤ó,¹(ī²¶aŻ ¾¬©©†h +޶ ×ćw9“„݁cǤōHY.>zÜ5ÓŒšĆaf'…·hR©¤:—»&}5m“ü-¶|ĄµĖ ĢĮZz %†L6Ę6:VGā2§US×sctóįś+.Ń6+“7wč­;aZ'g|ŠMėz .2Fw·ē<9O”å[Ų“/ ¤ ¹hķŻJŃ.i[Ųó)k‘Õ1Ą÷‹ĘĖ-·09ÕO*š©ÜmĒŐźå-6óPµx=h¼ĘŠŚčM\ ų¹šż‰C@Óö(ĪDsŽ`r{Šń-t–Ó?;4Jš@cõvU%“ūē,R„!Ō_¾™Ģ"Ͷ76Óy{ō…#S·—>¹”ł›köū˜"ē²Ķ¤ŽKĢ7@]¬±śxn­©µ¾‡Ģ|~jP øD9ZV PeńŌ>eęßY9lomB’ĻĀhsŽßėæWQh÷Žd{±ÓēŸOŪt’¹”’S£Ō>Y‘NÆkG UõW7wģ»Fzł M>xwÓ[ė©Å×qžŃgŒ,Ā“|~u³©ģÜńf dątĢ%Š4luĮŸw™Ģ — ßUÖ¢dÖ\Æ®t“t_ąŹ^Eø‚VłæH…ū6×K’s{½eUžĪW Šž8Ū`Æń'Bl6q™ß0>“¶*·¾’ž\²_”±Ķ†ū`:“śu‡^ „#—“ķ{¬ĪĮīyœĆZ^w>uÉ×cGē)Üå:¤CZŚwƒ®(ĻÉ‚uV˜pÉD½w­Üõ Āčą x˜œ =3-3öj’27]¤esR@Ah’:žįk‰&”(µjŅ”Ÿz “põoI5ڽ>E\…Ķ<ęumĘ5y ćsńœŹ"6ØĆŸ^:žü¦M¦§oŃ©%½-¹Ž ,žXTXÜõóöji?”Üׅ?½Rā-Üüh)f=’L)§©Åq’iźŪäÅćŃĖy±Ü·ļĮ6¼*=‚ģ8V=ŸĢ;p§|ū¾ā>v„Ęd]±ÅB SrüKŅq™†oÖŽ‹ķ¾šSn=µXż÷Z—’Éfpõ?‡Y fmūš…Kd¤ąg¶“§x½c‹č…ŸE’¼”ŒńŲv¼ ĄeÆLīą‡xޱ0ŪžĆ g·± ŽģvŒ»Ō¤ŌĪ/Šo×(Åd{󑢑€W†UuĶk¾LĘu"¾RG”73kōjeP!ų g•ß‘Øé0ššߍ™:A²“Y]3ߘŁHRšWś|†=)g³7’šķhQ×Gwcݲ­‰“ČQB³WMĻļ&э†‘ń¾ōY)ŒĖ~OŁeīaÓ9Lö ūƒ P“Ķw9c½$ĄMõ «šĮš;©:å©'JÉOÄœāņʧ!•āøĒĄ}VĀź4 ŽįŌ­»}y¤+¾õ;RDg/ž¾ĆĻ ģ‚Šä …Ō8į¢Ś īŲ:É’ļҚ‡Ō)~Æś— q£:öƒ 愹!¹.łģq™øń†6Ž’|`—myæÖ7BĒĖ ±óBnQsŁ®cx –C ¢ĮŅ2“ÄBjļ 9ȶW5ȍ3‡š*ø­0Q˜5eųŌ\…n‰ŹĘ’s>Źū¾”>Éh…Ą“gc4Wj•õchŒkę=÷¼ ΧlĒŪį4G5[x€X &č¹äģ%Ÿu¤†mÖG-Z²ų\@ $eÅJŃÉJÖĻQ°Q‡1$÷‘DÜąørnć«CæE—ĮQ˜j—Ō]k (4.Ż£8Ö6ŪeøĘ/K›šō$£båłŃ5Ä ÕĖhés-ą{‡Ŗ†łÓ¾ÜŠß³„€¾ģććzĀlWģvŪāCGĶ/Gxą*±Ao‰ŠōJžJS›gujы’zØVN•˜“€{Nrš™PMńŗ¬’ż 6EŪuwŽYöRwŲõ;×%ö’L\ī1Ćē–ˆ‡%;®é£ ¹°n7d˜¹cŠąę=!™›-”[§@ŹņóGŃÆk_į*łśŚ$A¦Ēj6gÓįænK2AÕv`‡«Vµ= ·‹]Kł$ņ󏆒—8·(ęp-ķ~Ŗ¹5rjn–ķ¹ÉījāļvĢW1›Ō:hE7ĆŗųōÄ’ōū] G † ^±£“Nc ź©Ąpäß5‘„é“y¦8’{¬#e`b1äēmKvĖtĢK“šÉƒF=mTƂŒJm7?§DŒ¢ŖĀ«gL“†ļ ź¹oĄš;±ść Ž0c¢TŽ­NDńæŲ@BŌ\“ģ^dB“³xŒŹtSrĮ¹>žūNQW’ 7ēoų(.„’€Ķ5Z 1’ĀĢ'…ĖØgTčßV»ū“ÓķyYrŃ/)7‚drG1},ÖÖ0ˆOź‘ ÉŲ Fo†±č i¶=:ԟ…RP˜PŪł’‰hA¢(źśxž h÷į¶aq»DųĒ« 0Y• ŻžqJo…’Oš¦J±ļ[89š‚ņ>čž«xz_(ZĪčćĻ:ߕˆ-ńžhWļ2V’üݜ£ļīŸÖi©6g·0†’ĢTŸĖ@XŠv<Åź3@QVļ-ݘPĪuØ¢6Ps4jœnƒÉżlnŹņ€Ė()t="E¢js}åÄ“ŽQW9mĻνÖŒŃ=+t¦@É=FX^ƒĄ &…Ż&°jĄżał¼·„˜)`“ķĪ:[eR{vtó‰Ę2¬aqä’>5ģn>PkĢÖÅ,dU Ių5¬ņ$RąĢß ;¶!q¶7™ŠĢŸSžÆėå¦R_č׫вŠ1dˆc%xąCłvŖĄk=E­^P”¬Ņ@}eFуøXé0¢0‚JNƒžp#G§™OT+Īņ=^łŚ|æŁI*Q§ŲĆś“C;ąxV‡gAdI6Bš_Œ!EĪVó§ o˜€ß.“ØĖ«ü¦x±d×ø} ]Ź>’lg6l#LʵsD<‹žĒÅmL¼Üž…ģ;>|frą«ć — N ĆOt²>KÅ€ÄĀō6¾ą$ę^˜[“%™WpĶ<œ(Čø‚÷g96m˜WKČƄ‚«Mž*­{ä 3PȔ]UĒːó¢u{ėzŲ–ŗ!Ą¬éWéDTl”č Įś·³ļjśm›43—J•<įßøē¼Yk)Ofł7"örļ}ļƌ‡)‚ŹWū)!2:g²kgnĘ3Lī3ä1¼@2¹Ž Ģ0rw ;6’Ēfųēž+˜šń8æ¼q‘“Ń(Ė5°×ŚEœ÷ė{£ ÅĄĆ­0 `†Nš/®ī%¬­;ęLFxaĀ•K³¶F4lgś ƒ½ŸXYs³?Jęä62¢WLĄ? ƅ3¬„jw³ ų$āv­²(1#–Žz¬ N¢ńoqq¬ÓrEÉßÅ8šßŠdD¾Ÿø¶§Sd_RäĖżčŻÖ¤”‘%3N|M«Ää ~#ŗj€&ϊ;ßwCØu×/*4jķŒ6śčHĢ_6n#"iC5«ä9%›ų <»“ż§~ÆDnœøĆ¬ÉJģՋø F ®śÉį!)·Ģ_žKŚ—•6°©'–`N,åO™Ŗ@“Žå~{ˆtX»ÆKBĮ°¢÷`ŽÖy;;”Ķ,G—Kq؝¶åX‘?Jļ"B}z"£Tķ‹Gj®æœ~h yxŠ’A0žĻqŒčžņįu±¬“Œ ķÕųPR#&8؝=~Æ cCoó÷Øc^«ŹĒf0’6øäbč“]œż¼H"ö:–ö6„énķ ~99 ¢Xօ"<»Āł±Ē ™Ē&gŒŪ–ńŪtč¶©'ž6Waśg1,ģ~gG'TŲ’“1æg‰)ŽdˆÖßų{ŁŲs;:Óŗ?Æe®h䄌[Ųž"PuŌąģ&/õR¶ X†¶ĢXmœķa:ź»v²»^BńM" l¬Wé©kēk«IėX]Iżņ¦\=|‹¢?¾ÅkIgˆÅĪŻ.Uŗ×Ŗ¦jÅIIĄ$«E½Ü ¾‚Ū½ŪrŹZ7C@0Mn*ĒS+(ĒīcČ;41@*C¢„y2Ÿ°öüq[sulä*±^Lc u¤h×ļ•Å­•=aė-§¹’OųŽZvł ĆōŽ\‡śŒģœé·-(ŌkõĆĻ’“āø•–Īųi‘iäFrśą(6ˆ VVnਁVÉŠ Ęā$ĘŻØ¼h ¤b"RU˜am–ØR­ ˆ¹> –pŚź’b04ŪIØ ī³ņ]Ÿ’Ź1Uļśßо&]H“Gj˜·īń‘ÜÉÄ’AɉżžN@’H’·}&€ C*²“.‡‰N·Ŗ}`…,źń’däkoā‰B g%ЦT^ć5į³t ®Ź˜Ä† ,”ĒUĀrﶁüąĄØ!³·{Éz$s Ń…Õž1 pF Z@Ä$×ßŃéŖś_æ:uīV5ŸN}yRB;ä(¾N% ²Č»#” K?Ó@.g_}ŽwŠs™Ł|ž!ć»ZE$ŗė…oqr&Ÿ%Ć&8E7ŅU¦Ō*9ä3ųsąÅPH[[,[”`ī lhūģk ĮgÅ”įšœEŅĘ ä ų}©t’Üó8zKiŚ,[7ēāØ|1ųlt%;±xĆŗ_tś_m7ŌP}”ŻYä-dĄ ąeõ2NS^ņ3¾3Uˆś* ”sBžÓ¹ ˆ¹YO_Y/į³ĒF„¶Š—›y…ŗ×įäb™~bs+ŹJžx4© ›ĶŻ^µŁBuł»ĄKlaŹ®|zˁf¢˜I·1?ĮŅß#ČéŽwŖFāi^ŠÉ'nėó.°óßÉDėœSoVšvŚZ6łŽš÷µ"ó? +ĮPŻg1.ZSYę"m¦VY%o·cU±©Ņ橏ߋ+’A|.ʟ} CąSDŗź‡sf'}`móÆ ½/ƒęrAjÕ&Ģģ·X_‘Nc„l£©ŖŁ„^ū=ģ(į­Rģ×Ūś·u~Ņ”’ˆ’”%Ök‚¤Åx~¾S^¼HŚĶū-Ī_ŠöB>]D9°ųė}ĒņUń†S]J{ć›åNĻ)@)·ģrVąü-Tt{¢E(.(;#_üµx¼ČYjyõ3vĶ,ī‡UørPBC#T®n˜r–;[ĘLѶQ¼ ¾Ęģד$īßł$ū†$.r¶„³_ņ@õÖ{DöŒšuͲÉŪ5ž"Ä %>Ż65@$rQC÷3\a†öž"üE*ŹŃnJrķÅŠ”r]Ż€ˆfIe5żĄ__c[ē¦yŒŠrT2B£~h¾¶”E$±µ(ŚI°Šēśš­¼cnä,“÷ -U›”ČĆuż“³ŃN }™®Œ~ėŹL‡š2kŪ4įE܏o¶xĪ uŒ‘Ż3÷"_×Į·hŽӒĆĶļĶWŁž[hŗUOókPŽ{ž%.‹K\”Ŗkv,Čś”äŪ6ÆŹčlV(®­e_ńhš‚aóәæŌ?£(sØā…žé˜n Ģ•\wŗ˜ƒä`fU»GN$(4Iįi‰%sī‚Cy6R.*¶šĆKo7vė‚ ć9ŻÆTø¾²…8ģÓ“”ZI{h™ˆ‘,åOiĪĄfü&™(>e pTų{?SWü±ŽŅåėź»źæĆ[Ÿ±öęĆbG§x)2Ż{ēįį]« ›6Wßaœh†Pȧ±?"óĒż(õ˜æ÷oŚ­rl½āŠ/^Qd9-ų¢ėŒó8½3Ŗ‡pTO÷x¶aÓ·žyŸ³œżC:õŌw 1”Q€ŗ²{Ŗ²!Čģ1…e•o{d «Īó"r…¬é®cV¶ļøÆĆ%“¼‹µ}ž NUõ,N/öŽæŻ/B”ÕĆ×B·—K p6K”훢œŌSź §Ō\,ś_[Ś,©€¤yŽ2‹xąq@ŌŸø–ŸJõ¦×tpņ\šd/)—½įœ,4ʙ:Nu“ŚMŃ7m Ō_qjԜW‚ū÷7K‰kY 8ßžg“žķ.>AȌWu%RŌ;E Ÿµüź¬aJĒŽŁø×Š…ōÓŌ-LlÓ Ÿ‹õłCīĻ^O鮢"ɦ5œ¶Õf  ®³­ æƒĀōœĒ°;rJx£r‰¾ī_ޤ|«œŗŚCŗ->6ņĆ÷S2:RmžvļŲ!cō ˜é¦zńyC‡Žhȧié^īæK0ćį*BeAl`9O²5'˜‚_qŸõˆŽ=Ģž$tŚg ‹šųŖ›u̱¢Ź­©¹ŲcC-|šŚ…Ģ®<²5Šŗźāü1ģDä¢1‹õEČGźß±Ūk:’ĮŲŁSh}e«šį^䋬*+õĘ>o£bÄ(šcE^I°Øu*Ō)U’³~3¤ģ1̬W-lšŽÆ2±Q„"&ZE•««£†~K·÷½ jur<ÉÓj£‚bAƒ²ø÷¾Ö0 F/ ±—ž%:„IPļ²yžćŠŹŃš sÕŲ4®Č‘§Uuāŗū©hP‘€Āģ·÷ĻmJ¢±¬m†SŌ›-{I9 ®`i·÷ ½cFX×½ŗøĀ-1 —ŒÓǚ»[²Kr[!źĄ2ėż—#€Ļ‰ßhŚTn Č•č½Ÿé[#Ce†9 ®f½"n”ōcžÓ=Ģjf„ ĮłŻ!ų“€Mn23ē ‰¬K(ōA*­üoNvį³¹3U꜆g€kJÄ7ćųøŹėė;~¹¢š®nÕ#å`¤ŪØ®'§%Q’Q}įqņl›8-*hŸ‰FĪÆ÷Nt•sõ;c9-›Ó=ųž¬|Žt·f“V®•¹=öc—’©Uv@cLźōłDˆėķ”–H8EŅÕµŠĶś}Šü|óō|ŖĘ:õnšƒ–éf鲉,‡5Ÿd8ŗÓŠųlóæõņ^ByX/{ZpÅūrā« ūjhLLjÆEIU|ŪMéoPųÅm[ńo^։«kÖfsŖod]ƒ Ø-̜Bߣ8žPV„ k<—g.y·s ÄH>{1{Ź\Ä×A¹W«Ā¹k—/»[Tæ7įĒRČ3žfÜQ %=`°ż–764ƒķ[Æŗķ5­M0G²ŅM|ė8TN`ō‡B²'¶Ąx]=ČŲ[ėKŒ0̹娟iqź×j.p„;ŌöO£1cäŃć¹ś|±<ćĒu“Ö L® öī7óDćók…ŚŲ„HՙVżSÉÓLqćTø)^mS«ĶĢĄś‰™ öˆ|Åņč†éŗĀ@ÉdQ‘:Ź…ŅqY:ĮȝŪG`’Ęq,*Ū.xx±b^ś‚½Ł“J¾šÉē'^ ŁGōįÓy’Eń×;ĒåD‡_zKŽåž—Q\c& Ö ĮŌU2^ó+}¾~Ā/óŽLœxŽ®{£Č©Ü Ą§!rŗy‚x}Hu“ttt’ įf õy!Ęʖ N³ ęQ8øņvX⤅BŖP_7Ņ%ćą=^ ź>¶ć­H‡-ö(dˤ RŻCȧ½ VŽ"üh źē=NC•‘ļŁ(Äü-Oø”Nė,aYå’wЬ!Ń™æC±‹ ]Ų‚EŁĘ*C£f3Ų_vC‘ķ`ņŽ|ņ}e“{“²˜e‹t÷{–V.æĘÆšŲ@/lmō ‰³/=’žŲćŸāšu²>¤;§I’ŗŃd’üz•>ŗ Q@×”×ĖÄü”kŪÖ½ń&?™ˆ><[Ś­w[Ķ Qļ äeæ%tJ$JRAļ5( Ļćj­¬••Ōn ®Ī-2„²  qK2z$tŃ^vFyĪ;ķśŌA>‰ę3‹IHI/žŽņų޷؃¦Bv咇ĆöĶF’IāĘY—`Ÿ)g†o÷«Ā£©ĀŁņQ0prc$šc•ūŅhŠĮp*½=K˜ZsźœvŸĢop˜pĢzdÅŅä– (ŗŒŻ…ĢŅ,ŗŖ©KćR’ į€nī¦Ē¬Æ›Ī…Ž”§č@^’UåķćĘ0y‹āΐ·óTœa“Aq2EcØŪ¢­Ė"Īł“ßJ¢­ĒxŲ£^Tyl«Å4F—HtĀ£” ÉrQWĢgüż[†ƒ‘ÉMjŠóŻ7b|_Ž'ĻBe'€æŪ’y[Q—~-ŽŲOøœXqHE­ćP{–žĆ€.TWĪBČ±ĻŸl~uSŽ>Ļš’ć0Č!Łē»§ šO6yÉ:õX\ŁēDĒŻIæØk‹_%å”ĢYĄ.®ĆOk±UĮŠīę­†ž+¼ 4ļī'ĀM™oŒ]Ē0*[HŹŪĖyPŁŌƒrn×⨼æJœ^ˆ×–d7›dˆ„ž¼rś‡% <JŪ8ƒLš…‚äH -šÄäu^šĻ%źR‚öüĮ„X£'™ØGń±ZŌNj¤ųrŗćLź‚'ä™É”įę`fK¶ Kń,d:„œŻUČż“KģÓF¼ Ģ£ł6ŹĪÓ6ໃĀ8žVŪ }ķķZŲ "Ō‘ą1¬p£3E÷H(—śB{QÜó›D"aØĢŃÓ"‡ŒĆ.ƒ„©åZ09ztĪ蔚NćXō]TnkI\ŃYÕ@Ē&ž64üŁłąŗˆĀĻIFéY¼šĻÓ^x?źŅp|P±ˆbb5XĪEp a<³h ¢ÜdėŃe_Üu:ø*T,“$}k%P 2> ½? ½€DSØõ nÕż8:H·B‚‹(jÆg7¢’€˜Ci”)6]y,sļu„†YéĪ!‰|¤ńQ¦-gHH:Lüpß{ĄI|e°œ9½ŸDŲl&j0ó1>Ŗä†!k—vĮ›Ž˜Rr+Ļh²ä²]EłUŚSć‡Ē(Eŗ‚ß'¢ŹtĮ”±+Ö¹Ššdöŗ.µŠ,Ę&²‚c¹k,ō‘,Ło'Ū2γ|Ŗ‡2({“iĪW±üę(ķ&)¬ĘP¤ż¬„M3D‘h½²=H*Ś*~Ż&G‚Ķ’U¤Z£V|ś’“ė8Ņ·Æ|å·ė˜ÕÆóFŃ+³. 7Į€īąWxŖ«Ī4źŹT-=Øī/6s'ۯʘ@[£*] cD'­ĘrÄ2&ó•1ȝ¹I¾Ķ¾qėF.;‚6ņäĢwµļ3Ց-C@gh÷x`Uˆ >üz€Ū‹éųŹæ_!¢śµ§ŌLj›!_a ĪIpĮÆŒĘqRæžĢyā˟]ņąīl —÷cN–E¶Ģ÷Ȭ_¾¢S{Ņ‹¦w¶‚ŗėŒ8BWZ‘œP$‚³¾ÖX#{‘TؒV‡ŌµTƒ3ŠZJo.¶ÜT‹ŸHŌfšģr(šƒž}ųsrī3…V”’{Éķ!EĖV*ˆG{K)Š=Ļѐߣ·P[œäłŻ,ł}_TV£ °› <˜Ō3>*•ž%XUĀqzUOā=swZ_Ŗ—œ{¶ō›ķˆ§¤©"¹ķ)īj’ūŲ“sĘu ~¹ĄķŁė‘ uĒgÕÄk/ž¢+ķŖbT†›XG”F6XŠš”u€„Ÿ:‹1»ƒ2½³f#Ž +c|6Kōä󊇧/(ü°MH%b5 #%Ś"m?”½«`‰øƒ4.gŲ)“ ēMĢ„FĒāōÅg ‹¹uϚB07īþ*ņe[oÄąv†OėT®h³Ā¶?“¼ü’Łū`Ķ“|}ót®¹”öʳ_ēf¾ųĶæź[K­;õJ®õµ)**‡ž!a ūĖꤧ"uś×4 ö‘>É,”SŲ¹øć™įŒŚVźéb‰ĒŅŪ.ŠHdbbŽĄ„ŹÉ›B<ńūč7än”c¾»!ž.hˆyłÖ~Žš°¹łŹQ^1ö^Eąu}˜Ünļ씇Ž ŗéJÜtƕöDLāæē–²¼ 4”+ŢҒܳ„č@*Ń*łŪ÷9{lļƒź–łČSÕķˆ3 8 ˜¤ Čō픹è Ś?ŻņźF”Qŗėęeīv·|¬²ĆN(®„"Z²ś4JB¢ ÜyŌÖ)=U«7=¶¢“HŚi…Ń:ęj‰qT3m+%h0&xs“R'žÉdŽ›‹ *ēɾ¶Ģd€f»@wF n^nĖA„i‚?äć™T™FŒŻ±K²-¹d ĶSĮFaWWX£zwČ7,^¬:&½‡łBļ(²ānā+–ÉŒ?G¬ęŚN'qÓÉ#»Ų1HĀĀ™œ§"R)÷Öŗ@8©ÅTE=[½[’Ėā“įĒf_e¤ō$YL«M†‹ åC/P$Ѳ7Ū„¾œ,ŖæĄ«ÓbŅ\ś¶`"W'=Il~¦Hˆ3ų ·T«s½›— ŚH6«Ép ¹…§G’Ÿź×‰b6ė®Į-Ģ‹¢g¤¬Ą†v“ Ŗ^ Ų†€ž½ˆŗ„uxuĘ~6[c}½ā¹„NŃsy)õw¾Ūrhļ`r»ŚąµÜĀ’¹VČ`†ŃŅŚŌšńō–ęššj®|Hˤ=Š8ü<³%Ķ…¼Ę—°V0ƒÄé}e–Õ $D›*„‰›\CōÖ®‘Å“2Gč­mćæ6×WįmĘ?-uģaÖSŽE~“O‚nĪCūd[ī-]‘Hµkp»<6“UOV¦š,˜K|Ļ ē`£%Œ›ųLnISó\·āÓÕä›"VWĪĀO:U]†ę ”ü’僲SV|¾8ü;+ĄkąbĮŁ"n@=¤č&İTŽō– üž«N 6üĢeÕ³2’ ėGcŽąŃ¬yŅ~e ćcļĮļ29²~€GfŚ*“Uå Ė&˜iOŃWŲ·äIš×Žc“5~}œó .ĮóDEõ™/gųĪŲ­géæ—PMrRł¤l³¹Z;ēŠBG^XahʶK²W {IĪQ@ŚŖ©¦G7‡ģÅ¢YŠŚ£Ø›¤ą!£¢Ÿ~TŲ–P†n‚ˆGĢ‹ŻL’i£Ģ„jeéī“Y'ūŽŪ‘,Ó„öF|”‹§ååSŌez0/HŁØvžŽ5āp;åÖ?”§ŌFóļMBNyš+X—„\5õfÉęļ’Õ¹Ū‘—I&§ „f5›šø;>Ų,5‰Ä T„6Ū±Œ&lĶ;ŒŌķÅäaŃŅ/¢ōĀ®mĒ’ؼ0öyCCœ[zȏ@UX…μöė|‚ś3¼462'¾Œ]e©‚&ūčįpég8iõ>’жgĢlP|Åö:zÉ«Įš /§¼łL)Ø=Ā“ēoWź^Ź£ź`ļqv«½ ŹÖŒįRK‹ƒU”Š°Éżs..ŽmŸU&»…Ž„'¹SŹ 4Ķ|r§]GŒ£üOoŅ $ŻŹŹ€Xė%ŸÓõQäÉcJO«“Wx ˆńjPČfŠ{|Ͷ’…«z÷fŻ“Z—B]jFŗmr@ӌGņXøZāœĮģęw•uˆx±c°‰€Ü›]Ų*£ŗ™˜‚ūą;Ńi[̆0ŸĘӚ°†Ģ×ztņg6ż?ø|;Ž‚ĶtrWZŌė3É»‡~!Œw“FGŪ(¬Hqhš?ēÆQ½A͉s0ēO¦ųQ+(¹Ķ+5Ķ [Pv€B—Ż’pY^Š;į_ŠžW’¤Æ8ŃM™™|H] fĖŁē§ šŻ%J6’ ;5hBTD/¾Oͦ«Ę ē ±ÄgūYZ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/data/binary-amd64/Release0000664000175000017500000000013714410675017021170 0ustar00brycebryceArchive: lunar Version: 23.04 Component: main Origin: Ubuntu Label: Ubuntu Architecture: amd64 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1664410300.0 ppa_dev_tools-0.6.0/tests/data/queues-20220822.json0000664000175000017500000006566614315161274020612 0ustar00brycebryce{ "ubuntu": { "trusty": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [] }, "xenial": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "bionic": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "focal": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "hirsute": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "impish": { "amd64": [], "ppc64el": [], "i386": [], "armhf": [], "arm64": [], "s390x": [] }, "jammy": { "amd64": [], "arm64": [], "i386": [], "s390x": [], "ppc64el": [], "armhf": [] }, "kinetic": { "ppc64el": [], "arm64": [], "s390x": [], "armhf": [], "i386": [], "amd64": [] } }, "huge": { "trusty": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [] }, "xenial": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "bionic": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "focal": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "hirsute": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "impish": { "amd64": [], "ppc64el": [], "i386": [], "armhf": [], "arm64": [], "s390x": [] }, "jammy": { "amd64": [], "arm64": [], "i386": [], "s390x": [], "ppc64el": [], "armhf": [] }, "kinetic": { "ppc64el": [ "x11iraf\n{\"submit-time\": \"2022-08-22 07:50:13\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x11vnc\n{\"submit-time\": \"2022-08-22 07:50:13\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x264\n{\"submit-time\": \"2022-08-22 07:50:13\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x265\n{\"submit-time\": \"2022-08-22 07:50:14\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x42-plugins\n{\"submit-time\": \"2022-08-22 07:50:14\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-core\n{\"submit-time\": \"2022-08-22 07:50:14\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-omega\n{\"submit-time\": \"2022-08-22 07:50:14\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xautolock\n{\"submit-time\": \"2022-08-22 07:50:15\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xbrzscale\n{\"submit-time\": \"2022-08-22 07:50:15\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xchain\n{\"submit-time\": \"2022-08-22 07:50:15\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xcolorsel\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdelta3\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdemorse\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-dbus-proxy\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-desktop-portal\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdp-tools\n{\"submit-time\": \"2022-08-22 07:50:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xerces-c\n{\"submit-time\": \"2022-08-22 07:50:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xerial-sqlite-jdbc\n{\"submit-time\": \"2022-08-22 07:50:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xeus-python\n{\"submit-time\": \"2022-08-22 07:50:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xfig\n{\"submit-time\": \"2022-08-22 07:50:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xflip\n{\"submit-time\": \"2022-08-22 07:50:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xgboost\n{\"submit-time\": \"2022-08-22 07:50:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xilinx-runtime\n{\"submit-time\": \"2022-08-22 07:50:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xlbiff\n{\"submit-time\": \"2022-08-22 07:50:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xml-security-c\n{\"submit-time\": \"2022-08-22 07:50:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmltooling\n{\"submit-time\": \"2022-08-22 07:50:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmobar\n{\"submit-time\": \"2022-08-22 07:50:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmpp-dns\n{\"submit-time\": \"2022-08-22 07:50:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xorgxrdp\n{\"submit-time\": \"2022-08-22 07:50:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpad\n{\"submit-time\": \"2022-08-22 07:50:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpra\n{\"submit-time\": \"2022-08-22 07:50:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xq\n{\"submit-time\": \"2022-08-22 07:50:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrayutilities\n{\"submit-time\": \"2022-08-22 07:50:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrootconsole\n{\"submit-time\": \"2022-08-22 07:50:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsel\n{\"submit-time\": \"2022-08-22 07:50:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsnow\n{\"submit-time\": \"2022-08-22 07:50:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtables-addons\n{\"submit-time\": \"2022-08-22 07:50:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtail\n{\"submit-time\": \"2022-08-22 07:50:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xterm\n{\"submit-time\": \"2022-08-22 07:50:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtermcontrol\n{\"submit-time\": \"2022-08-22 07:50:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtrlock\n{\"submit-time\": \"2022-08-22 07:50:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x11vnc\n{\"submit-time\": \"2022-08-22 05:32:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x264\n{\"submit-time\": \"2022-08-22 05:32:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x265\n{\"submit-time\": \"2022-08-22 05:32:16\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x42-plugins\n{\"submit-time\": \"2022-08-22 05:32:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-bindings\n{\"submit-time\": \"2022-08-22 05:32:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-core\n{\"submit-time\": \"2022-08-22 05:32:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-omega\n{\"submit-time\": \"2022-08-22 05:32:17\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xautolock\n{\"submit-time\": \"2022-08-22 05:32:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xautomation\n{\"submit-time\": \"2022-08-22 05:32:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xbrzscale\n{\"submit-time\": \"2022-08-22 05:32:18\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xchain\n{\"submit-time\": \"2022-08-22 05:32:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdelta3\n{\"submit-time\": \"2022-08-22 05:32:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdemorse\n{\"submit-time\": \"2022-08-22 05:32:19\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-dbus-proxy\n{\"submit-time\": \"2022-08-22 05:32:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-desktop-portal\n{\"submit-time\": \"2022-08-22 05:32:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdp-tools\n{\"submit-time\": \"2022-08-22 05:32:20\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xerial-sqlite-jdbc\n{\"submit-time\": \"2022-08-22 05:32:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xeus-python\n{\"submit-time\": \"2022-08-22 05:32:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xfig\n{\"submit-time\": \"2022-08-22 05:32:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xflip\n{\"submit-time\": \"2022-08-22 05:32:21\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xfrisk\n{\"submit-time\": \"2022-08-22 05:32:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xgboost\n{\"submit-time\": \"2022-08-22 05:32:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xlbiff\n{\"submit-time\": \"2022-08-22 05:32:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xli\n{\"submit-time\": \"2022-08-22 05:32:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xml-security-c\n{\"submit-time\": \"2022-08-22 05:32:22\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmltooling\n{\"submit-time\": \"2022-08-22 05:32:23\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmobar\n{\"submit-time\": \"2022-08-22 05:32:23\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmoto\n{\"submit-time\": \"2022-08-22 05:32:23\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xorgxrdp\n{\"submit-time\": \"2022-08-22 05:32:24\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpa\n{\"submit-time\": \"2022-08-22 05:32:24\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpad\n{\"submit-time\": \"2022-08-22 05:32:25\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpra\n{\"submit-time\": \"2022-08-22 05:32:25\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xq\n{\"submit-time\": \"2022-08-22 05:32:25\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrayutilities\n{\"submit-time\": \"2022-08-22 05:32:26\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrootconsole\n{\"submit-time\": \"2022-08-22 05:32:26\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsel\n{\"submit-time\": \"2022-08-22 05:32:26\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsnow\n{\"submit-time\": \"2022-08-22 05:32:26\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtables-addons\n{\"submit-time\": \"2022-08-22 05:32:27\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtail\n{\"submit-time\": \"2022-08-22 05:32:27\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xterm\n{\"submit-time\": \"2022-08-22 05:32:27\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtermcontrol\n{\"submit-time\": \"2022-08-22 05:32:28\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtrlock\n{\"submit-time\": \"2022-08-22 05:32:28\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x11iraf\n{\"submit-time\": \"2022-08-22 07:25:42\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x264\n{\"submit-time\": \"2022-08-22 07:25:43\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x265\n{\"submit-time\": \"2022-08-22 07:25:44\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "x42-plugins\n{\"submit-time\": \"2022-08-22 07:25:45\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-bindings\n{\"submit-time\": \"2022-08-22 07:25:46\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-core\n{\"submit-time\": \"2022-08-22 07:25:46\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xapian-omega\n{\"submit-time\": \"2022-08-22 07:25:46\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xautomation\n{\"submit-time\": \"2022-08-22 07:25:47\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xbrzscale\n{\"submit-time\": \"2022-08-22 07:25:47\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xchain\n{\"submit-time\": \"2022-08-22 07:25:48\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xcolorsel\n{\"submit-time\": \"2022-08-22 07:25:48\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdelta3\n{\"submit-time\": \"2022-08-22 07:25:48\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdemorse\n{\"submit-time\": \"2022-08-22 07:25:49\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-dbus-proxy\n{\"submit-time\": \"2022-08-22 07:25:49\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdg-desktop-portal\n{\"submit-time\": \"2022-08-22 07:25:49\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xdp-tools\n{\"submit-time\": \"2022-08-22 07:25:49\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xerces-c\n{\"submit-time\": \"2022-08-22 07:25:49\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xerial-sqlite-jdbc\n{\"submit-time\": \"2022-08-22 07:25:50\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xfig\n{\"submit-time\": \"2022-08-22 07:25:50\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xflip\n{\"submit-time\": \"2022-08-22 07:25:50\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xfrisk\n{\"submit-time\": \"2022-08-22 07:25:50\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xgboost\n{\"submit-time\": \"2022-08-22 07:25:51\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xlbiff\n{\"submit-time\": \"2022-08-22 07:25:51\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xli\n{\"submit-time\": \"2022-08-22 07:25:51\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xml-security-c\n{\"submit-time\": \"2022-08-22 07:25:51\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmltooling\n{\"submit-time\": \"2022-08-22 07:25:52\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmobar\n{\"submit-time\": \"2022-08-22 07:25:52\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xmoto\n{\"submit-time\": \"2022-08-22 07:25:52\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xorgxrdp\n{\"submit-time\": \"2022-08-22 07:25:52\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpa\n{\"submit-time\": \"2022-08-22 07:25:52\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpad\n{\"submit-time\": \"2022-08-22 07:25:53\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xpra\n{\"submit-time\": \"2022-08-22 07:25:53\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xq\n{\"submit-time\": \"2022-08-22 07:25:53\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrayutilities\n{\"submit-time\": \"2022-08-22 07:25:53\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xrootconsole\n{\"submit-time\": \"2022-08-22 07:25:54\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsel\n{\"submit-time\": \"2022-08-22 07:25:54\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xsnow\n{\"submit-time\": \"2022-08-22 07:25:54\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtables-addons\n{\"submit-time\": \"2022-08-22 07:25:54\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtail\n{\"submit-time\": \"2022-08-22 07:25:54\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xterm\n{\"submit-time\": \"2022-08-22 07:25:55\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtermcontrol\n{\"submit-time\": \"2022-08-22 07:25:55\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}", "xtrlock\n{\"submit-time\": \"2022-08-22 07:25:55\", \"triggers\": [\"glibc/2.36-0ubuntu2\", \"cross-toolchain-base/59ubuntu6\", \"glib2.0/2.73.3-1\", \"tracker/3.3.3-1\"]}" ] } }, "ppa": { "trusty": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [] }, "xenial": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "bionic": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "focal": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "hirsute": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "impish": { "amd64": [], "ppc64el": [], "i386": [], "armhf": [], "arm64": [], "s390x": [] }, "jammy": { "amd64": [], "arm64": [], "i386": [], "s390x": [], "ppc64el": [], "armhf": [] }, "kinetic": { "ppc64el": [], "arm64": [], "s390x": [], "armhf": [ "dovecot {\"all-proposed\": \"1\", \"ppas\": [\"bryce/dovecot-merge-v1e2.3.19.1adfsg1-2\"], \"requester\": \"bryce\", \"submit-time\": \"2022-08-23 05:02:46\", \"triggers\": [\"dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1\"]}" ], "i386": [], "amd64": [] } }, "upstream": { "trusty": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [] }, "xenial": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "bionic": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "focal": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "hirsute": { "amd64": [], "arm64": [], "armhf": [], "i386": [], "ppc64el": [], "s390x": [] }, "impish": { "amd64": [], "ppc64el": [], "i386": [], "armhf": [], "arm64": [], "s390x": [] }, "jammy": { "amd64": [], "arm64": [], "i386": [], "s390x": [], "ppc64el": [], "armhf": [] }, "kinetic": { "ppc64el": [], "arm64": [], "s390x": [], "armhf": [], "i386": [], "amd64": [] } } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1712962647.0 ppa_dev_tools-0.6.0/tests/data/results-chrony-armhf.log.gz0000664000175000017500000000412414606336127022711 0ustar00brycebryce‹Žsfresults-chrony-armhf.logķXkoŪFż¼ö?\d?ŲF=$‡Ifįb³i6š4†ķ`±Hƒ"G#r†%‡j\äĒļ’’)‡’lż²~HäĢ}Ģ\ž{ī9EµVÅj”E„韆.½Éǐ*•:• J"-(’ é4!¹Žė3Ēcī˜6Ņß9ųŃ!k‹TS¼ńJÕ:$?āq2q\Źģ(ŃwFz&’%O4Ͳ(¤—ųo'h®JŖe„²u4ĖĶź4K(EuŲéRaąSż©f“¹ėNV”*1…ŖDĀņtQF:U’ ¹NK%s!5óæ§Xå¹Łp–JlŲ^Ŗ\Ųõ¬–ŗ¶{®ģ²–R”ż!b ū+jĶ’“$[ēE–ż¦Ź•5’”&«²”6$!o‚Š+«āžrŒ8b¬ŗ.X·ŠŠN’eœ„X}łBŗ¬Å÷”IbىXŪ²Ī2²…Žķź¾Ņ"Oŗo{–ÕB+„—V%ŹuC­(S©ēōl©uq‡8|¾æ4—”mWæÖibaV”2ŹB»Ó_¤™«Ž“ŖāīÄršĖĻŪ+Ž«L-Riµį³°' ÄQfM{•ØI…„¶é¹Į@.»”ć"—7T`–D 24b[—HŠödXŪļi#t“e…¤“Y‹»‡’>šÓX#c®IŌŸŒ ų”ēĮ@)fČAĆ£Ū5́ļV•¶9®—‘ĘĢ{‚ˆQ¹Ü0„ÜémČp1¾Bʈ,¤7©¬?S`ńĄr~Ī•Ęō7Ī9{ߝnŽ^Ńæ ü6*©aq‡ćŽß¾hŲ}äzƒž½ń¾ˆHVŖ.ć "G®?­č•Š!§Ž:ęŗČ#0S¹„Ō€`Ė˶რ°}+`¼sé4©ā3śąś>żćム÷tŖc×”U߅÷Gī"ĻįĆś'–e<W ¶Č+l+œy®ųäA'­„‚Ń˲ŪŪ»¾į»&,čŸm%³EuŸ·f! “…„Č ”¶*FŒ—¬‚š°#¬U“wō­Ć­č/×BF¹qŒiu„[ćķ.ónsŽjÉm–ŹØ9¾;°­Ž#{mÕØ¾ŃZ§ÕŚzd*$ćO£±Ä”Ģī©.2%t*mH×Sgu"’³ž¢:TC!ķ²Čź¹jFŗG|œ³¾°Æ)›ŠĶK•3ō3 X“n~z}E·†J|€VL÷DĻRtfm#•G f)ža„¶DGE4K3”ź!yx‡‚Ģīcø†įµøk™¦=üŸūžŠī&!÷:¢EÜąQD9«Ņ¼īԛޮŖQ†BōU¢@ń@ņ#oxÄ~AÅu†-̵.[m"‹īJ²ßE©H|Nµy9”kq44ÉŽ8t6MrSTś…dˆ­§ī ÷ā¶ž^ ÆĮsž`냊G<\įė¾¶mo·˜å“ķHZīlG:Ō:Ō‚k3¼Įܤ3NŻ»Ø:,Ę9}UĶ{!sČńķ²åoįx4y{•bވāĘßHĮ¼üā‚U1ØIj\ņW8>żÉžGøĀ|šŌkĮ@|3j[/ ™6!6óå߬bSži^F sĢ訕œ§‹ŗ}5OīśCę\2Į'ŌņŚØ?ÕNÖ< ”ĮPGā÷ZOv &C!5äČ æNņŃšCĪsė„ZBÉ=W%xŁ`Y’X2fé>s’”Šļ|ė¶„ō *+|£a!NE¹hįšLČJ J{JŌ”Dš‚ćµć`¤ĮZ*ü¶‚Jš›,²l2fĘź²ż3Śaɹ“ÜK­Ŗµ“Z5Ø<]€ŠMÓ:×jČ!®tƒq(‚ņ!>PŪ ŚC#_Lš¬”bߘC*ū¤ķ*Ņ+»ÜźE'ń·¤Śl§§3Āś`ŲŽ żZs—øŽUØkˆŃ‹ŲmĒ¦Üæć¢čµöU䊮„Ą 0V*æ€^å½¹'Æ7Ūi{ĢćŲ} ²ŒˆŠVń:¦ŁŁjiī;ų”Ž3„Ł$JčI»SJ§Z/„ŠvĮŠČÆŪDģN„nøT„×¼ū|¾|Ą­Øäe¶ŽE°Ņo±²ÄāˆIT\-‘ 9BWømƒöČ8”Ø /kYXn%W‘B’/,4Y§ü1Ų}„I”ZļćlŌŻķµĀČøq$øŅJ’k]< šDµ|ItŖ?ź!±zÄv§zpy¹ĖėA-öŸØ…OK¤²yˠߣgŸ§§œ‹ĶŹÅµÖ«`~ŃfJb'Ś“Õī¦=YOÓ‡m̧É&¹Io^gēēÆŅŁÕõŁiņz2œœ‡§Wē7×ĆavŻŒfÆÆĪÆ:•š,Ķ’,+I¼Ń.w¦tĘsćcoUdWTÕ#½ØŹ?™åE!}ó‘ķŒfE–eÉØéīzŹńłģ·éóµ+ī-ÖČīå Ø4ōØ` cxt”¬xÆ7žšŽ}sĆsŅm}R6ą‹?N+ŠEµtžæ:ŌŹ˜Čœ?ÖĢiguŗˆCs‘Ęķ#īƒaå*źĢé°VG,K’#°².÷hŸµsvśźśŻż»Ł-żĶ}óf6æ>Ņ£ó(›°dē.Ķ•æxÓlĻZū Ž”ĄlūbT~ՂQ'¦£1uć0¢5ōUB~8¹÷ü»6īøi‘œ9ųłiżm(ØOÅe .ė`i¼ļ×ŃŠ$ī֞ČSaƒ–×į’©ż^QÖ2=(¹V¢’”³ KxŚ 4O|pčT¢µŠŸY«m7;.C9īöön×Ā‚Z–6 m蔯’^æ£oWōHKa“Å×$Ķ‹A+Ś»ŅĮ.9wŖ’r«'–ī8„„;›ĻßĪshń‚Ō‰aPø14 C½€…ÕM·Š÷ŒĻž¾#§(y././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1664410300.0 ppa_dev_tools-0.6.0/tests/data/results-six-s390x.log.gz0000664000175000017500000000756014315161274022006 0ustar00brycebryce‹Ń cresults-six-s390x.logķŪnŪ:ņ=@’ŲÅA’ƒPwĖ—E€“ęŅ-Šv‹¤Ż>…AK“­F–tH)©‹Å>īģ'ī—쐺X²%Ū²¶i×"9ƙįĢpfDš$qŻObŹcōY·–6°:_ˆĒ„Å^0A.‰éša`­‡īi€˜x1r¦Ō¹“x€t«ovˆŽR6”hÄHąLѱĆBĪ1aĪT~x1uā„Q<öü˜2˜īøż4„†ÆÉ×[®nt ±ŠQČ©‹gŽ„‘Ų Ü’rĀŁŒ.ņ½hW§įŒŖÉ( āD-”WY”•›Ę@}”ÄŲõRćYTīŏ!»W¬NLśq`Ŗ0ĘĒŽŒĀ7ģ„ŃüÜÖ4 Ś8“gTšF°ć‡‰« ¬”Įš`ģM$[‰#8Q34$Ļ!¾Ā§ŪćV«ć²GŃ3¢. !QŒ£Š¹§ńy.ĆsΜA4Ÿ„£Æ°,gā‰{ß²±Iņu)µ˜ŠŲń=<•øēӐÅē¦ä¾"CÓ*£Äóݬõc<œ_\}~ø¾ƒŪׯ^]ߎDئbЁ ”Øŗ¢ŪІ­cĄ‡øĘ:žł4••„D@`<öÉCČPuĮ9uęÅsž üMć80ßęēāė@UłŸ‰ē*^F`źFOŽ<®ńÖPA˜;ŠśYś tåĢĮj„ßHæ¹įŒxĮ™Pł|–c>“¾č*© 0š³ō™—r5)·¹.U9SLØN*­>IĄūEÄU@˜gŗ¦– U5¬œ)c!ĖĒьp ®`>ךU÷h tÜć5’ä’#aļŅŽ^Ńx £lŽ„+Ė<ęŠ$ŪQ®Nłŗ£×Į-õ)į&Ö{čžå‰ŃŲ£:KüäĪå]˜0‡rō¹Ū3z(CmīŽšėĢsb »@­›ŠQmķA6ØŃk§_ĀŚŁk,‹¢Æw ÄöžäJ§€Žē¼†…¶XĮīAp;8ĄcŲļc!ś¶•/dļ ¹Ģƒa›F>C’€3¬p¢Ūł4ŗv€^ę£oŪÅZčśĮ&Xf£×ķāŅcµ«ZeiÅę§XęÅģĖ%¹]t ė;Ø"D ŒG'»#U~ztK‰+ĀŲ(„BB„(ŹŸŠEÓY$ĆÜ8NĮ®}EG Ō’@±ā™A ß;ƒö.\yBuF‰Ü IQĀø@5¢(…ož’„„d€M#ø4pę(f”о‚š˜SćĶäŽ+:ŻQĀ‘Ōų †Š”¢€> W/$&(9ŻĀ& ©˜­S划x6—ĀŪkœ ÓtÓPł¹gHcż9„ł~ŚÜ2:  ˆ»‡‚0.@”'`Ÿ‡”ϱ+j;†bžŠlLɝ€ęn\Ⱦ¢[XO×ń—\@ö8ōżš±„—£GĻ÷…Ü^æżĒ?ÆÆGÉt{’Ž¢y< 3Ėz Ś_4ĮŗŠÖß7±jn`õb ±HDF4 YϐŃėKWįzüq —¤Ž]€;ÉŁÖ2ń°‰^Ō7w~k芵ʞF£Ęh„1aĢF«Ęj„é4ĀtaģF»¦ŪÓm„é5Āōaś0ż5kŚ,­ckhģłbŸet=łkȧHĻ)Ņn)’nŪ-S$F#²ZvØTMĆ”tX6Ń”“Å„£4 ł(1 “›¢‹“2š,‡igF !ƒ²†9ÆmÅZSIJ?cu x+;­aSTTĒp#&®D7Ć²ĒŻDČŅ„J6a(N.ˆ6QɲtÅ27aįšp§)Õ@io‚:øµ"%!ö&ĀĘ5aŃR9A]\-µ"i9ŅŚ–Øv»Õ¬c«‡€ŖV ®z3[‹ n·Óš­c¦7·r5ĶŃa'£kø6ČŪIqŚŚų„ēØåRmŪ°Į4€7æØĮXźŚnńKąm¶ŃפŽĀ0Vfų»x„ˆ >-÷B²¾U”%xQØe®āĶ&µ(ŻuXXŲIhmöŌ$­f\»cՃ¬ÜT§næØ²F~OY@}’µX„©Š›.™yZ¼8J"qŗōJ %’čåu­[øw!ņæ["}ƒ ’©#/Ø\~ĀĒJ$7“ļ^Ž€/ŽČĄ:«åC§Æˆęć‹Āŗ˜zF"ųXŅ®ģzżž āTŠEĒiŠzŒN\:&‰WĀp‡\šŅ īĢUŠf}’Ž5ƒ_‹Ųæ{;”'‡%|ūŗbŖ| OūŅ`~ls ‘u€cĶ/h’ęę’ųNā“Ģšeyz‹³åŚ{žöwā_¹÷ķČhwœD[S 7Ly°b‹śø†~Bq¼$€“”8[žŁ0Œƒg]L Åøüčŗ,Ä„°āģšY>ŗŻż¬õ\8z.µ.uM[³S8ZĢ07•ę»d]'łč<¦Īžõ A~Éf†¹½4åLeū:ÉēóeĻfõdK)j€nVå鉮Ķkū9āš{–öe bg—ĀĪīžé’åT\#Ч$†žqšE :Œ 0ęxÄķ)7cč¼²!ž¾g‡iļŽ¾GŠ.’ 2Ö˜öĄź .å³Ś);„)ʼn T¾86HŻm- Żt+B\gJ_ĻWn3ķ¶Õ¤Nær+JŠ®tĢü<‡ wNÅŪ‡ÅArći&‚žSq:Z±wŗ%KŽx Su4K¾ÓšD“‡ŗó& ƒfā²Ų'X³0^`[‡Å*)Z¬x±ō/Ųoļ.@­ę°Ū\›77ĘU÷ƲūW/Æ»WŚ•uŻŃ.n.o®/{×¶Żæ¼Ö/ ×% ޳;ˆˆē” $ Q2ņA§<õ“-随CaOą>¼ń|Œµ,‡į’X×ZŻėfJ[vę|WۈNžČ–F@ĢEŻŚ½l^锩ü$ąŠ8Ø-|njKO£†ŒeÅ©¶čŗĖ/“½fŽ|:»„<ō…·~ōā)±šžąŽ@¤ĘÖ "[9Bņó‡M·ćyŖź‘M>„¾/t"oŽę $bÅ#X¦ļŹöč¹€§ā½ź(„ )„8ŸŌśōѓЪµ;•³¼×éņyœųe0$ŽŌ„gīŖi‰)ƒū­Žķh–ž}ŖŌ¤.I2ŹŚ„;0ņū`×]}÷̤n®„u”¹É@“öd&ŌSĢ}wŽź„™†ˆ‰4Å0 6€i̽nāÕM³Š<1“b׏~BÖeõ•Žī—ōŹVÜx*¾å½ń³„eRĢs¼LóÆ£Łõ¤mėłUy>Tšœž"¹”ŌĒaÅimĪSwRjł~«Žm‘\V†śo&ɽߦ\sÉuž,üęŽÄ§®q ¢ÓĆÜn"4s¹'łųÉ+\źc‡K®w­ æ}²Ł’ź²_^Cp%œ«æä¼›č­øż“Ÿß\™śRYĖ·ø!¤{żž s’§gr„p¶¶˜łĶĒwbęņ£”}¾f,!Dś‚ށĢÉāāŠ Ļ_ś„fž9#Uņ­:QĀ…÷ ©;$×iƒ®5iCƒ2|i‡įš?F9ˆ‹×õUdeœ›‹×o@ķü²Ńo^,K Gz-9z+r8˜ cµŌüˆ(ˆå䁦x~Xå‡•6ö,GoNŃ÷~3ø„³’ÉŽ[ļ7hK£óŽ×UZ}[Ļl;¤ßł©®²rUSp/K22¤XŽ÷Ւp¾ņ0ųvlh +ÓčH+ćŠn®Īhņ­ļŽČ®•“Ö¾ŸįÉlFŲ¼żĪŅz}>OøY¼ś.ōZžZœ4|“žę·ŪĘ,œ”­~¾­˜@l;łųńõ²©Ūu, ė]J±Õ±(īQWĒ][ļö4Ė1ˆÓ;,ż4ÖrŪQ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1664410300.0 ppa_dev_tools-0.6.0/tests/data/running-20220822.json0000664000175000017500000007217414315161274020753 0ustar00brycebryce{"systemd-upstream": {"build-git_https://salsa.debian.org/systemd-team/systemd.git#upstream-ci;env_['CFLAGS=-O0', 'DEB_BUILD_PROFILES=noudeb', 'TEST_UPSTREAM=1', 'CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true', 'UPSTREAM_PULL_REQUEST=24405', 'GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893'];ppas_['upstream-systemd-ci/systemd-ci'];submit-time_2022-08-23 03:27:19;": {"focal": {"arm64": [{"build-git": "https://salsa.debian.org/systemd-team/systemd.git#upstream-ci", "env": ["CFLAGS=-O0", "DEB_BUILD_PROFILES=noudeb", "TEST_UPSTREAM=1", "CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true", "UPSTREAM_PULL_REQUEST=24405", "GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893"], "ppas": ["upstream-systemd-ci/systemd-ci"], "submit-time": "2022-08-23 03:27:19"}, 5219, "\tRenaming libudev1-dbgsym_251.1398.gf315d476c6.0_arm64.deb to libudev1-dbgsym_251.1398.gf315d476c6.0_arm64.ddeb\ndpkg-deb: building package 'libudev-dev' in '../libudev-dev_251.1398.gf315d476c6.0_arm64.deb'.\ndpkg-deb: building package 'systemd-standalone-sysusers' in '../systemd-standalone-sysusers_251.1398.gf315d476c6.0_arm64.deb'.\ndpkg-deb: building package 'systemd-standalone-sysusers-dbgsym' in 'debian/.debhelper/scratch-space/build-systemd-standalone-sysusers/systemd-standalone-sysusers-dbgsym_251.1398.gf315d476c6.0_arm64.deb'.\n\tRenaming systemd-standalone-sysusers-dbgsym_251.1398.gf315d476c6.0_arm64.deb to systemd-standalone-sysusers-dbgsym_251.1398.gf315d476c6.0_arm64.ddeb\ndpkg-deb: building package 'systemd-standalone-tmpfiles' in '../systemd-standalone-tmpfiles_251.1398.gf315d476c6.0_arm64.deb'.\ndpkg-deb: building package 'systemd-standalone-tmpfiles-dbgsym' in 'debian/.debhelper/scratch-space/build-systemd-standalone-tmpfiles/systemd-standalone-tmpfiles-dbgsym_251.1398.gf315d476c6.0_arm64.deb'.\n\tRenaming systemd-standalone-tmpfiles-dbgsym_251.1398.gf315d476c6.0_arm64.deb to systemd-standalone-tmpfiles-dbgsym_251.1398.gf315d476c6.0_arm64.ddeb\ndpkg-deb: building package 'systemd-oomd' in '../systemd-oomd_251.1398.gf315d476c6.0_arm64.deb'.\ndpkg-deb: building package 'systemd-oomd-dbgsym' in 'debian/.debhelper/scratch-space/build-systemd-oomd/systemd-oomd-dbgsym_251.1398.gf315d476c6.0_arm64.deb'.\n\tRenaming systemd-oomd-dbgsym_251.1398.gf315d476c6.0_arm64.deb to systemd-oomd-dbgsym_251.1398.gf315d476c6.0_arm64.ddeb\n dpkg-genbuildinfo --build=binary\n dpkg-genchanges --build=binary >../systemd_251.2-1_arm64.changes\ndpkg-genchanges: info: binary-only upload (no source code included)\n dpkg-source --after-build .\ndpkg-buildpackage: info: binary-only upload (no source included)\nautopkgtest [04:59:39]: test timedated: preparing testbed\n"], "s390x": [{"build-git": "https://salsa.debian.org/systemd-team/systemd.git#upstream-ci", "env": ["CFLAGS=-O0", "DEB_BUILD_PROFILES=noudeb", "TEST_UPSTREAM=1", "CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true", "UPSTREAM_PULL_REQUEST=24405", "GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893"], "ppas": ["upstream-systemd-ci/systemd-ci"], "submit-time": "2022-08-23 03:27:19"}, 5249, "[860/2304] cc -o systemd-user-runtime-dir 'systemd-user-runtime-dir@exe/src_login_user-runtime-dir.c.o' -flto -Wl,--as-needed -Wl,--no-undefined -pie -Wl,--fatal-warnings -Wl,-z,now -Wl,-z,relro -fstack-protector -Wl,--warn-common -Wl,--gc-sections -g -O2 -fdebug-prefix-map=/tmp/autopkgtest.UNl3GD/build.uT0/systemd=. -fstack-protector-strong -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,--start-group src/shared/libsystemd-shared-251.so -Wl,--end-group '-Wl,-rpath,$ORIGIN/src/shared:XXXXXXXXXXXXXX' -Wl,-rpath-link,/tmp/autopkgtest.UNl3GD/build.uT0/systemd/build-deb/src/shared\n"]}}, "build-git_https://salsa.debian.org/systemd-team/systemd.git#upstream-ci;env_['CFLAGS=-O0', 'DEB_BUILD_PROFILES=noudeb', 'TEST_UPSTREAM=1', 'CONFFLAGS_UPSTREAM=--werror', 'UPSTREAM_PULL_REQUEST=24405', 'GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893'];ppas_['upstream-systemd-ci/systemd-ci'];submit-time_2022-08-23 03:27:12;": {"focal": {"ppc64el": [{"build-git": "https://salsa.debian.org/systemd-team/systemd.git#upstream-ci", "env": ["CFLAGS=-O0", "DEB_BUILD_PROFILES=noudeb", "TEST_UPSTREAM=1", "CONFFLAGS_UPSTREAM=--werror", "UPSTREAM_PULL_REQUEST=24405", "GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893"], "ppas": ["upstream-systemd-ci/systemd-ci"], "submit-time": "2022-08-23 03:27:12"}, 5156, "+ timeout --foreground 300 /bin/qemu-system-ppc64 -smp 4 -net none -m 512M -nographic -kernel /boot/vmlinux-5.4.0-124-generic -drive format=raw,cache=unsafe,file=/var/tmp/systemd-test.NKw8hr/default.img -device virtio-rng-pci,max-bytes=1024,period=1000 -initrd /boot/initrd.img-5.4.0-124-generic -append 'root=LABEL=systemd_boot rw raid=noautodetect rd.luks=0 loglevel=2 init=/lib/systemd/systemd console=hvc0 SYSTEMD_UNIT_PATH=/usr/lib/systemd/tests/testdata/testsuite-09.units:/usr/lib/systemd/tests/testdata/units: systemd.unit=testsuite.target systemd.wants=testsuite-09.service systemd.wants=end.service'\nqemu-system-ppc64: warning: TCG doesn't support requested feature, cap-cfpc=workaround\nqemu-system-ppc64: warning: TCG doesn't support requested feature, cap-sbbc=workaround\nqemu-system-ppc64: warning: TCG doesn't support requested feature, cap-ibs=workaround\n\n\r\nSLOF\u001b[0m\u001b[?25l **********************************************************************\r\n\u001b[1mQEMU Starting\r\n\u001b[0m Build Date = Jan 31 2020 20:27:09\r\n FW Version = buildd@ release 20191209\r\n Press \"s\" to enter Open Firmware.\r\r\n\r\r\n\u001b[0m\u001b[?25hC0000\rC0100\rC0120\rC0140\rC0200\rC0240\rC0260\rC02E0\rC0300\rC0320\rC0340\rC0360\rC0370\rC0380\rC0371\rC0373\rC0374\rC03F0\rC0400\rC0480\rC04C0\rC04D0\rC0500\rPopulating /vdevice methods\r\nPopulating /vdevice/vty@71000000\r\nPopulating /vdevice/nvram@71000001\r\nPopulating /vdevice/v-scsi@71000002\r\n SCSI: Looking for devices\r\n 8000000000000000 DISK : \"QEMU QEMU HARDDISK 2.5+\"\r\n 8200000000000000 CD-ROM : \"QEMU QEMU CD-ROM 2.5+\"\r\nC05A0\rPopulating /pci@800000020000000\r\n 00 0000 (D) : 1234 1111 qemu vga\r\n 00 0800 (D) : 1033 0194 serial bus [ usb-xhci ]\r\n 00 1000 (D) : 1af4 1005 legacy-device*\r\nC0600\rC06C0\rC0700\rC0800\rC0880\rNo NVRAM common partition, re-initializing...\r\nC0890\rC08A0\rC08A8\rInstalling QEMU fb\r\n\r\n\r\n\r\nC08B0\rScanning USB \r\n XHCI: Initializing\r\n USB Keyboard \r\n"]}}, "build-git_https://salsa.debian.org/systemd-team/systemd.git#upstream-ci;env_['CFLAGS=-O0', 'DEB_BUILD_PROFILES=noudeb', 'TEST_UPSTREAM=1', 'CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true', 'UPSTREAM_PULL_REQUEST=24405', 'GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893'];ppas_['upstream-systemd-ci/systemd-ci'];submit-time_2022-08-23 03:27:12;": {"focal": {"amd64": [{"build-git": "https://salsa.debian.org/systemd-team/systemd.git#upstream-ci", "env": ["CFLAGS=-O0", "DEB_BUILD_PROFILES=noudeb", "TEST_UPSTREAM=1", "CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true", "UPSTREAM_PULL_REQUEST=24405", "GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/f315d476c60ca7e5458a8db995cb8a4094569893"], "ppas": ["upstream-systemd-ci/systemd-ci"], "submit-time": "2022-08-23 03:27:12"}, 5137, "[ 263.470842] testsuite-02.sh[33]: test-conf-files OK\r\n[ 263.479534] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-hmac'\r\n[ 263.491161] testsuite-02.sh[33]: test-hmac OK\r\n[ 263.500096] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-set-disable-mempool'\r\n[ 263.511745] testsuite-02.sh[33]: test-set-disable-mempool OK\r\n[ 263.520582] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-libudev-sym'\r\n[ 263.532425] testsuite-02.sh[33]: test-libudev-sym OK\r\n[ 263.542344] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-udev-util'\r\n[ 263.554598] testsuite-02.sh[33]: test-udev-util OK\r\n[ 263.564466] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-network-generator-conversion.sh'\r\n[ 263.598931] testsuite-02.sh[33]: test-network-generator-conversion.sh OK\r\n[ 263.608357] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-lldp-rx'\r\n[ 263.620026] testsuite-02.sh[33]: test-lldp-rx OK\r\n[ 263.629083] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-ether-addr-util'\r\n[ 263.640881] testsuite-02.sh[33]: test-ether-addr-util OK\r\n[ 263.649836] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-watch-pid'\r\n[ 263.682230] testsuite-02.sh[33]: test-watch-pid OK\r\n[ 263.706128] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-libsystemd-sym'\r\n[ 263.718171] testsuite-02.sh[33]: test-libsystemd-sym OK\r\n[ 263.728677] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-fido-id-desc'\r\n[ 263.740393] testsuite-02.sh[33]: test-fido-id-desc OK\r\n[ 263.749484] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-sigbus'\r\n[ 263.761337] testsuite-02.sh[33]: test-sigbus OK\r\n[ 263.770099] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-env-util'\r\n[ 263.781948] testsuite-02.sh[33]: test-env-util OK\r\n[ 263.791839] testsuite-02.sh[33]: Executing test '/usr/lib/systemd/tests/test-random-util'\r\n"]}}, "build-git_https://salsa.debian.org/systemd-team/systemd.git#upstream-ci;env_['CFLAGS=-O0', 'DEB_BUILD_PROFILES=noudeb', 'TEST_UPSTREAM=1', 'CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true', 'UPSTREAM_PULL_REQUEST=24351', 'GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/02c2f7ea526b414f0e83903d9cb77b364340cd22'];ppas_['upstream-systemd-ci/systemd-ci'];submit-time_2022-08-22 21:56:53;": {"focal": {"s390x": [{"build-git": "https://salsa.debian.org/systemd-team/systemd.git#upstream-ci", "env": ["CFLAGS=-O0", "DEB_BUILD_PROFILES=noudeb", "TEST_UPSTREAM=1", "CONFFLAGS_UPSTREAM=--werror -Dslow-tests=true", "UPSTREAM_PULL_REQUEST=24351", "GITHUB_STATUSES_URL=https://api.github.com/repos/systemd/systemd/statuses/02c2f7ea526b414f0e83903d9cb77b364340cd22"], "ppas": ["upstream-systemd-ci/systemd-ci"], "submit-time": "2022-08-22 21:56:53"}, 5255, "[847/2304] cc -Isystemd-resolved@exe -I. -I.. -Isrc/basic -I../src/basic -Isrc/fundamental -I../src/fundamental -Isrc/systemd -I../src/systemd -I../ -I../src/libsystemd/sd-bus -I../src/libsystemd/sd-device -I../src/libsystemd/sd-event -I../src/libsystemd/sd-hwdb -I../src/libsystemd/sd-id128 -I../src/libsystemd/sd-journal -I../src/libsystemd/sd-netlink -I../src/libsystemd/sd-network -I../src/libsystemd/sd-resolve -Isrc/shared -I../src/shared -Isrc/resolve -I../src/resolve -flto -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Werror -std=gnu11 -Wno-format-signedness -Wno-missing-field-initializers -Wno-unused-parameter -Wdate-time -Wendif-labels -Werror=format=2 -Werror=implicit-function-declaration -Werror=incompatible-pointer-types -Werror=int-conversion -Werror=overflow -Werror=override-init -Werror=return-type -Werror=shift-count-overflow -Werror=shift-overflow=2 -Werror=undef -Wfloat-equal -Wimplicit-fallthrough=5 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wmissing-noreturn -Wnested-externs -Wold-style-definition -Wpointer-arith -Wredundant-decls -Wshadow -Wstrict-aliasing=2 -Wstrict-prototypes -Wsuggest-attribute=noreturn -Wunused-function -Wwrite-strings -Wno-maybe-uninitialized -Wno-unused-result -Werror=missing-declarations -Werror=missing-prototypes -fdiagnostics-show-option -fno-common -fno-strict-aliasing -fstack-protector -fstack-protector-strong -fvisibility=hidden --param=ssp-buffer-size=4 -ffunction-sections -fdata-sections -Werror=shadow -include config.h -g -O2 -fdebug-prefix-map=/tmp/autopkgtest.b8jMMa/build.QI1/systemd=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIE -pthread -MD -MQ 'systemd-resolved@exe/src_resolve_resolved.c.o' -MF 'systemd-resolved@exe/src_resolve_resolved.c.o.d' -o 'systemd-resolved@exe/src_resolve_resolved.c.o' -c ../src/resolve/resolved.c\n"]}}}, "dovecot": {"ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 04:56:40;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"amd64": [{"ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 04:56:40", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 270, "Unpacking mokutil (0.6.0-2) over (0.4.0-1ubuntu2) ...\r\nPreparing to unpack .../18-python3-distutils_3.10.6-1_all.deb ...\r\nUnpacking python3-distutils (3.10.6-1) over (3.10.5-2ubuntu2) ...\r\nPreparing to unpack .../19-python3-lib2to3_3.10.6-1_all.deb ...\r\nUnpacking python3-lib2to3 (3.10.6-1) over (3.10.5-2ubuntu2) ...\r\nSetting up libkeyutils1:amd64 (1.6.3-1) ...\r\nSetting up libtirpc-common (1.3.3+ds-1) ...\r\nSetting up libssl3:amd64 (3.0.5-2ubuntu1) ...\r\nSetting up ubuntu-standard (1.489) ...\r\nSetting up libappstream4:amd64 (0.15.5-1) ...\r\nSetting up libsasl2-modules-db:amd64 (2.1.28+dfsg-6ubuntu2) ...\r\nSetting up libsigsegv2:amd64 (2.14-1ubuntu1) ...\r\nSetting up usrmerge (29ubuntu1) ...\r\nSetting up libsasl2-2:amd64 (2.1.28+dfsg-6ubuntu2) ...\r\nSetting up openssl (3.0.5-2ubuntu1) ...\r\nInstalling new version of config file /etc/ssl/openssl.cnf ...\r\nSetting up libpython3-stdlib:amd64 (3.10.6-1) ...\r\nSetting up initramfs-tools-bin (0.140ubuntu16) ...\r\nSetting up libtirpc3:amd64 (1.3.3+ds-1) ...\r\nSetting up mokutil (0.6.0-2) ...\r\nSetting up libsasl2-modules:amd64 (2.1.28+dfsg-6ubuntu2) ...\r\nSetting up python3 (3.10.6-1) ...\r\nSetting up initramfs-tools-core (0.140ubuntu16) ...\r\nSetting up python3-lib2to3 (3.10.6-1) ...\r\nSetting up python3-distutils (3.10.6-1) ...\r\nSetting up initramfs-tools (0.140ubuntu16) ...\r\nupdate-initramfs: deferring update (trigger activated)\r\nSetting up ubuntu-minimal (1.489) ...\r\nSetting up python3-gdbm:amd64 (3.10.6-1) ...\r\nProcessing triggers for man-db (2.10.2-2) ...\r\nProcessing triggers for libc-bin (2.35-0ubuntu3) ...\r\nProcessing triggers for initramfs-tools (0.140ubuntu16) ...\r\nupdate-initramfs: Generating /boot/initrd.img-5.15.0-27-generic\r\nNo lz4 in /usr/bin:/sbin:/bin, using gzip\r\nReading package lists...\nBuilding dependency tree...\nReading state information...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\nautopkgtest [05:01:10]: rebooting testbed after setup commands that affected boot\n"]}}, "ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 04:59:38;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"s390x": [{"ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 04:59:38", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 130, "autopkgtest [04:59:44]: git checkout: 14935a6 Merge branch 'cross-arch-architecture-filtering'\nautopkgtest [04:59:44]: host juju-4d1272-prod-proposed-migration-9; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.0mwj_par/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --setup-commands 'apt-key adv --keyserver keyserver.ubuntu.com --recv-key 510DE9AC846B40EB94EDB3AEFBB49579B75FECB0' --setup-commands 'REL=$(sed -rn \"/^(deb|deb-src) .*(ubuntu.com|ftpmaster)/ { s/^[^ ]+ +(\\[.*\\] *)?[^ ]* +([^ -]+) +.*$/\\2/p; q }\" /etc/apt/sources.list); echo \"deb http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" > /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list; echo \"deb-src http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" >> /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list;' --apt-upgrade dovecot --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 '--env=ADT_TEST_TRIGGERS=dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1' -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-9@bos01-s390x-4.secgroup --name adt-kinetic-s390x-dovecot-20220823-045944-juju-4d1272-prod-proposed-migration-9 --image adt/ubuntu-kinetic-s390x-server --keyname testbed-juju-4d1272-prod-proposed-migration-9 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}, "ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 05:00:23;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"armhf": [{"ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 05:00:23", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 80, "autopkgtest [05:00:26]: starting date: 2022-08-23\nautopkgtest [05:00:26]: git checkout: 167b209 lxd: Increase various timeouts\nautopkgtest [05:00:26]: host juju-4d1272-prod-proposed-migration-5; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.70eb48qe/out --timeout-copy=6000 --setup-commands 'sed -i \"s/ports.ubuntu.com/ftpmaster.internal/; s/ubuntu-ports/ubuntu/\" /etc/apt/sources.list `ls /etc/apt/sources.list.d/*.list 2>/dev/null || true`; ln -s /dev/null /etc/systemd/system/bluetooth.service; printf \"http_proxy=http://squid.internal:3128\\nhttps_proxy=http://squid.internal:3128\\nno_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24\\n\" >> /etc/environment' --setup-commands 'apt-key adv --keyserver keyserver.ubuntu.com --recv-key 510DE9AC846B40EB94EDB3AEFBB49579B75FECB0' --setup-commands 'REL=$(sed -rn \"/^(deb|deb-src) .*(ubuntu.com|ftpmaster)/ { s/^[^ ]+ +(\\[.*\\] *)?[^ ]* +([^ -]+) +.*$/\\2/p; q }\" /etc/apt/sources.list); echo \"deb http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" > /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list; echo \"deb-src http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" >> /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list;' --apt-upgrade dovecot --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 '--env=ADT_TEST_TRIGGERS=dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1' -- lxd -r lxd-armhf-10.44.124.77 lxd-armhf-10.44.124.77:autopkgtest/ubuntu/kinetic/armhf\nautopkgtest [05:01:35]: @@@@@@@@@@@@@@@@@@@@ test bed setup\n"]}}, "ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 04:59:40;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"ppc64el": [{"ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 04:59:40", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 80, "autopkgtest [05:00:31]: git checkout: 14935a6 Merge branch 'cross-arch-architecture-filtering'\nautopkgtest [05:00:31]: host juju-4d1272-prod-proposed-migration-4; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.0gq45tvi/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --setup-commands 'apt-key adv --keyserver keyserver.ubuntu.com --recv-key 510DE9AC846B40EB94EDB3AEFBB49579B75FECB0' --setup-commands 'REL=$(sed -rn \"/^(deb|deb-src) .*(ubuntu.com|ftpmaster)/ { s/^[^ ]+ +(\\[.*\\] *)?[^ ]* +([^ -]+) +.*$/\\2/p; q }\" /etc/apt/sources.list); echo \"deb http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" > /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list; echo \"deb-src http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" >> /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list;' --apt-upgrade dovecot --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 '--env=ADT_TEST_TRIGGERS=dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1' -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-4@bos02-ppc64el-9.secgroup --name adt-kinetic-ppc64el-dovecot-20220823-050031-juju-4d1272-prod-proposed-migration-4 --image adt/ubuntu-kinetic-ppc64el-server --keyname testbed-juju-4d1272-prod-proposed-migration-4 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}, "all-proposed_1;ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 05:00:18;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"s390x": [{"all-proposed": "1", "ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 05:00:18", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 70, "autopkgtest [05:00:39]: host juju-4d1272-prod-proposed-migration-4; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.dkxt87g0/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --setup-commands 'apt-key adv --keyserver keyserver.ubuntu.com --recv-key 510DE9AC846B40EB94EDB3AEFBB49579B75FECB0' --setup-commands 'REL=$(sed -rn \"/^(deb|deb-src) .*(ubuntu.com|ftpmaster)/ { s/^[^ ]+ +(\\[.*\\] *)?[^ ]* +([^ -]+) +.*$/\\2/p; q }\" /etc/apt/sources.list); echo \"deb http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" > /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list; echo \"deb-src http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" >> /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list;' --apt-pocket=proposed --apt-upgrade dovecot --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 '--env=ADT_TEST_TRIGGERS=dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1' -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-4@bos01-s390x-7.secgroup --name adt-kinetic-s390x-dovecot-20220823-050039-juju-4d1272-prod-proposed-migration-4 --image adt/ubuntu-kinetic-s390x-server --keyname testbed-juju-4d1272-prod-proposed-migration-4 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}, "all-proposed_1;ppas_['bryce/dovecot-merge-v1e2.3.19.1adfsg1-2'];requester_bryce;submit-time_2022-08-23 05:00:17;triggers_['dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1'];": {"kinetic": {"amd64": [{"all-proposed": "1", "ppas": ["bryce/dovecot-merge-v1e2.3.19.1adfsg1-2"], "requester": "bryce", "submit-time": "2022-08-23 05:00:17", "triggers": ["dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1"]}, 50, "autopkgtest [05:00:56]: host juju-4d1272-prod-proposed-migration-4; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.7yvknlf_/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --setup-commands 'apt-key adv --keyserver keyserver.ubuntu.com --recv-key 510DE9AC846B40EB94EDB3AEFBB49579B75FECB0' --setup-commands 'REL=$(sed -rn \"/^(deb|deb-src) .*(ubuntu.com|ftpmaster)/ { s/^[^ ]+ +(\\[.*\\] *)?[^ ]* +([^ -]+) +.*$/\\2/p; q }\" /etc/apt/sources.list); echo \"deb http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" > /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list; echo \"deb-src http://ppa.launchpad.net/bryce/dovecot-merge-v1e2.3.19.1adfsg1-2/ubuntu $REL main\" >> /etc/apt/sources.list.d/autopkgtest-bryce-dovecot-merge-v1e2.3.19.1adfsg1-2.list;' --apt-pocket=proposed --apt-upgrade dovecot --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 '--env=ADT_TEST_TRIGGERS=dovecot/1:2.3.19.1+dfsg1-2ubuntu2~kinetic1' -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-4@lgw01-5.secgroup --name adt-kinetic-amd64-dovecot-20220823-050056-juju-4d1272-prod-proposed-migration-4 --image adt/ubuntu-kinetic-amd64-server --keyname testbed-juju-4d1272-prod-proposed-migration-4 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}}, "r-cran-pheatmap": {"submit-time_2022-08-23 00:34:17;triggers_['r-cran-scales/1.2.1-1'];": {"kinetic": {"amd64": [{"submit-time": "2022-08-23 00:34:17", "triggers": ["r-cran-scales/1.2.1-1"]}, 10, "autopkgtest [05:01:42]: starting date: 2022-08-23\nautopkgtest [05:01:43]: git checkout: 14935a6 Merge branch 'cross-arch-architecture-filtering'\nautopkgtest [05:01:43]: host juju-4d1272-prod-proposed-migration-4; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.8654qrvj/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --apt-pocket=proposed=src:r-cran-scales --apt-upgrade r-cran-pheatmap --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 --env=ADT_TEST_TRIGGERS=r-cran-scales/1.2.1-1 -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-4@lgw01-29.secgroup --name adt-kinetic-amd64-r-cran-pheatmap-20220823-050142-juju-4d1272-prod-proposed-migration-4 --image adt/ubuntu-kinetic-amd64-server --keyname testbed-juju-4d1272-prod-proposed-migration-4 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}}, "r-cran-plotly": {"submit-time_2022-08-23 00:34:17;triggers_['r-cran-scales/1.2.1-1'];": {"kinetic": {"amd64": [{"submit-time": "2022-08-23 00:34:17", "triggers": ["r-cran-scales/1.2.1-1"]}, 10, "autopkgtest [05:01:45]: starting date: 2022-08-23\nautopkgtest [05:01:45]: git checkout: 14935a6 Merge branch 'cross-arch-architecture-filtering'\nautopkgtest [05:01:45]: host juju-4d1272-prod-proposed-migration-9; command line: /home/ubuntu/autopkgtest/runner/autopkgtest --output-dir /tmp/autopkgtest-work.mrd6nrdp/out --timeout-copy=6000 --setup-commands /home/ubuntu/autopkgtest-cloud/worker-config-production/setup-canonical.sh --setup-commands /home/ubuntu/autopkgtest/setup-commands/setup-testbed --apt-pocket=proposed=src:r-cran-scales --apt-upgrade r-cran-plotly --timeout-short=300 --timeout-copy=20000 --timeout-build=20000 --env=ADT_TEST_TRIGGERS=r-cran-scales/1.2.1-1 -- ssh -s /home/ubuntu/autopkgtest/ssh-setup/nova -- --flavor autopkgtest --security-groups autopkgtest-juju-4d1272-prod-proposed-migration-9@lgw01-2.secgroup --name adt-kinetic-amd64-r-cran-plotly-20220823-050145-juju-4d1272-prod-proposed-migration-9 --image adt/ubuntu-kinetic-amd64-server --keyname testbed-juju-4d1272-prod-proposed-migration-9 --net-id=net_prod-proposed-migration -e TERM=linux -e ''\"'\"'http_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'https_proxy=http://squid.internal:3128'\"'\"'' -e ''\"'\"'no_proxy=127.0.0.1,127.0.1.1,localhost,localdomain,novalocal,internal,archive.ubuntu.com,ports.ubuntu.com,security.ubuntu.com,ddebs.ubuntu.com,changelogs.ubuntu.com,launchpad.net,10.24.0.0/24'\"'\"'' --mirror=http://ftpmaster.internal/ubuntu/\n"]}}}} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1717748815.3321643 ppa_dev_tools-0.6.0/tests/data/source/0000775000175000017500000000000014630542117016765 5ustar00brycebryce././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680649068.0 ppa_dev_tools-0.6.0/tests/data/source/Release0000664000175000017500000000014014413125554020264 0ustar00brycebryceArchive: lunar Version: 23.04 Component: main Origin: Ubuntu Label: Ubuntu Architecture: source ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/tests/data/source/Sources0000664000175000017500000036514314627412314020350 0ustar00brycebrycePackage: aalib Format: 3.0 (quilt) Binary: libaa1-dev, libaa1, libaa-bin Architecture: any Version: 1.4p5-50build1 Priority: optional Section: libs Maintainer: Jonathan Carter Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), dpkg-dev (>= 1.14.9), libgpm-dev [linux-any], libncurses5-dev, libslang2-dev, libx11-dev, patch, texinfo Homepage: http://aa-project.sourceforge.net/aalib/ Vcs-Browser: https://salsa.debian.org/debian/aalib Vcs-Git: https://salsa.debian.org/debian/aalib.git Directory: pool/main/a/aalib Package-List: libaa-bin deb text optional arch=any libaa1 deb libs optional arch=any libaa1-dev deb libdevel optional arch=any Files: ec0507a256a0a05e6ff8e1bac6a82196 1691 aalib_1.4p5-50build1.dsc 9801095c42bba12edebd1902bcf0a990 391028 aalib_1.4p5.orig.tar.gz 80da843a4a693b09dea85edeb9e1b17e 16436 aalib_1.4p5-50build1.debian.tar.xz Checksums-Sha1: 5841285d5c98d1140826cbf660157f25d0d54ced 1691 aalib_1.4p5-50build1.dsc a23269e950a249d2ef93625837cace45ddbce03b 391028 aalib_1.4p5.orig.tar.gz 86b8b0b85b319197025f593166f4299284e83d19 16436 aalib_1.4p5-50build1.debian.tar.xz Checksums-Sha256: 352d64870bc3406b7ee37ce1f3631b8d370a5d1e0a0da46fb5acbd03f3d97f37 1691 aalib_1.4p5-50build1.dsc fbddda9230cf6ee2a4f5706b4b11e2190ae45f5eda1f0409dc4f99b35e0a70ee 391028 aalib_1.4p5.orig.tar.gz cdf4f411977964b8a3e294a7805bf9a94385672167f726a1ab6f0fbab38a3dfe 16436 aalib_1.4p5-50build1.debian.tar.xz Checksums-Sha512: 5761fbd43b150e0167fea78b4a7ec84585cc518585a0ca460d4f5d8f49cfa533c37c0bad1dd3b2f6514df4f6c65fa9b6bedf73fb2835b88392901c2ed4abd925 1691 aalib_1.4p5-50build1.dsc 3e4506eccce3b81ccbbb79a4a1b90abd39e2259e6043fde90f70b9ca279bd4c37758a047167267b97c4ec92f64fb17c7c8f548114f0d0c6e78ddb9463b5f1299 391028 aalib_1.4p5.orig.tar.gz 65033b401f7a91a538d1421eea1c4ea8b1c15e176adaebd2ed6d7800be347d10a59d3db14ae2a080249aea3159281e8b350c7e56fbd5ef7210377b777e344171 16436 aalib_1.4p5-50build1.debian.tar.xz Package: autopkgtest Format: 3.0 (native) Binary: autopkgtest Architecture: all Version: 5.25ubuntu4 Priority: optional Section: devel Maintainer: Ubuntu Developers Original-Maintainer: Debian CI team Uploaders: Ian Jackson , Martin Pitt , Antonio Terceiro , Paul Gevers , Simon McVittie Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), fakeroot, procps, pycodestyle | pep8, pyflakes3, python3 (>= 3.3), python3-debian, python3-docutils Testsuite: autopkgtest Vcs-Browser: https://salsa.debian.org/ci-team/autopkgtest Vcs-Git: https://salsa.debian.org/ci-team/autopkgtest.git Directory: pool/main/a/autopkgtest Package-List: autopkgtest deb devel optional arch=all Files: f076af7d0510465aa50f6318eeede248 2357 autopkgtest_5.25ubuntu4.dsc 7cb45cc749dbf616b97cef0b81b4ba29 209500 autopkgtest_5.25ubuntu4.tar.xz Checksums-Sha1: c36688a233b4c9b110b10a381011f70f9148fff2 2357 autopkgtest_5.25ubuntu4.dsc 2f244b7b4b970726e010da6cdb0586e9577ae6e2 209500 autopkgtest_5.25ubuntu4.tar.xz Checksums-Sha256: da5964ec464b5d3e13e2b994469f378df5b897abefc2df23b5ee926312206f78 2357 autopkgtest_5.25ubuntu4.dsc d2204c3c79262283fc4a7b8a4dda37141c7e2124f6f52568a30c38ed990bf729 209500 autopkgtest_5.25ubuntu4.tar.xz Checksums-Sha512: 8ae64cbade83549eed710b7f12c1aa45b285f303856f7029896430822e6aa31b8484e182236a10054984d83426f3341a33f24d52c533217485ea571670367204 2357 autopkgtest_5.25ubuntu4.dsc a4a827620315fff7c5441d6695523f12631a984b0e5536be6c96c2ebb566f8f2b0baa5c24d7e165ebc98b292b379715d79059d1259726f1d8db826ec8cf01ad3 209500 autopkgtest_5.25ubuntu4.tar.xz Testsuite-Triggers: autodep8, build-essential, buildah, ca-certificates, catatonit, debhelper, debootstrap, devscripts, distro-info, docker.io, dumb-init, fakeroot, golang-github-containernetworking-plugin-dnsname, iptables, libpam-cgfs, lxc, lxc-templates, lxcfs, lxd, mmdebstrap, podman, python3-distro-info, rsync, sbuild, schroot, slirp4netns, tini, uidmap, util-linux Package: autotools-dev Format: 3.0 (native) Binary: autotools-dev Architecture: all Version: 20220109.1 Priority: optional Section: devel Maintainer: Henrique de Moraes Holschuh Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 12), help2man Build-Depends-Indep: perl Homepage: https://savannah.gnu.org/projects/config/ Vcs-Browser: https://salsa.debian.org/hmh/autotools-dev Vcs-Git: https://salsa.debian.org/hmh/autotools-dev.git Directory: pool/main/a/autotools-dev Package-List: autotools-dev deb devel optional arch=all Files: 874b76097fca24dfa6c2df0612aa5e34 1661 autotools-dev_20220109.1.dsc ffdd743da36d5c922c90e26949f3835c 87340 autotools-dev_20220109.1.tar.xz Checksums-Sha1: a67201cdeaeb38755a27ce4429ba1a0b94676e44 1661 autotools-dev_20220109.1.dsc 74c662e3e9d5046167dd89b7b9a0b54c4fb1cb02 87340 autotools-dev_20220109.1.tar.xz Checksums-Sha256: f9ccc67437ff52a7882d6b91e7ca8bf0a316c0c1452093992bd5c5fc3b29c090 1661 autotools-dev_20220109.1.dsc 8b05e5ad56cd7d9a15e9b2931eb429b6324bb89f1b46de3baf3651286dead8c1 87340 autotools-dev_20220109.1.tar.xz Checksums-Sha512: aca60be8ed006832005e58bf176f8c7e8abe85986dbcc6d15d8b5c092c89322a132601784ef1f977d7e071c8b033debcef7c3cb5712765be00c2d298d9812d71 1661 autotools-dev_20220109.1.dsc 5427cc6897685355018db547ec39fd6bcc0ecbd73ba25869fb841f3503c1753af9a323d963a2b3150ef40ff07486f39377acdec878b2c054c1fa51de9afe01bb 87340 autotools-dev_20220109.1.tar.xz Package: b43-fwcutter Format: 3.0 (quilt) Binary: b43-fwcutter, firmware-b43-installer, firmware-b43legacy-installer Architecture: any all Version: 1:019-8 Priority: optional Section: utils Maintainer: Debian QA Group Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 13), debconf, po-debconf Homepage: https://wireless.wiki.kernel.org/en/users/drivers/b43 Vcs-Browser: https://salsa.debian.org/debian/b43-fwcutter Vcs-Git: https://salsa.debian.org/debian/b43-fwcutter.git Directory: pool/main/b/b43-fwcutter Package-List: b43-fwcutter deb contrib/utils optional arch=any firmware-b43-installer deb contrib/kernel optional arch=all firmware-b43legacy-installer deb contrib/kernel optional arch=all Files: e7fe0249bfe204b92f2eb48adb6524aa 2098 b43-fwcutter_019-8.dsc 19d1f4226a625756726bdf7ed5dc2a0a 46769 b43-fwcutter_019.orig.tar.bz2 5914a3efc2cda59e119dd3db95e2565c 20176 b43-fwcutter_019-8.debian.tar.xz Checksums-Sha1: 0cd6a1e5f5d8b6f1badf0f00e7d7242bc59d59bf 2098 b43-fwcutter_019-8.dsc 64198fd2885b0eb0f8968ce3dc2037545b67f065 46769 b43-fwcutter_019.orig.tar.bz2 ff4db470641e33629342ad5c9e65a9f7680db11f 20176 b43-fwcutter_019-8.debian.tar.xz Checksums-Sha256: b4323c0dfe70d85a62238ba2eca86c3b7ce75919924e2b51ef0f681841db3ab7 2098 b43-fwcutter_019-8.dsc d6ea85310df6ae08e7f7e46d8b975e17fc867145ee249307413cfbe15d7121ce 46769 b43-fwcutter_019.orig.tar.bz2 6083451ea45d5a64d7231ec80a50f7c25ff739206e1664b5ddf88d27c20f18b0 20176 b43-fwcutter_019-8.debian.tar.xz Checksums-Sha512: e2293edf621c59b0ffea773d1fa4274a6f0a0dc198fb0fb5a9b9511c6ad03c9e14c32ae6dee6dd8c8253cc55e5466719e010908bc05d5e702b8355cedded60ca 2098 b43-fwcutter_019-8.dsc 2a439d1583d1ee7b13dd6a7526b78b216073e044c3934adf6615b8d2ca9a4b8c74db9791182d27baf1690b5c5ff6ce1a9c8dd4fb796e47939d055fef5bb37960 46769 b43-fwcutter_019.orig.tar.bz2 e3f55b2b287384c7457efc680fcb33ed4696faa14efd7f63ff2996ffa473fd988fa5abf86c8c2edc0318374455e164e9aa0c8901c49546cb519b0549a81ac7e5 20176 b43-fwcutter_019-8.debian.tar.xz Package: x-kit Format: 1.0 Binary: python3-xkit Architecture: all Version: 0.5.0ubuntu6 Priority: optional Section: python Maintainer: Ubuntu Developers Original-Maintainer: Alberto Milone (tseliot) Standards-Version: 3.8.0 Build-Depends: debhelper (>= 7), python3-all, intltool, dh-python Vcs-Bzr: https://code.launchpad.net/~albertomilone/xorgparser/main/ Directory: pool/main/x/x-kit Package-List: python3-xkit deb python optional arch=all Files: c2899358c7177c9098bec32e0dea0443 1643 x-kit_0.5.0ubuntu6.dsc 70618a450c4a8a63bc8da94b24a8763a 45906 x-kit_0.5.0ubuntu6.tar.gz Checksums-Sha1: 90ead95a89822d8eb32e1ddd584a33e3ca3a418f 1643 x-kit_0.5.0ubuntu6.dsc 16936028a6d58a8a0dc6bd4149ef52d9fe93cf96 45906 x-kit_0.5.0ubuntu6.tar.gz Checksums-Sha256: 81c18d4233b1624d91b628da9502cf9b984f9603dcdedcb50cd7f516d29ba296 1643 x-kit_0.5.0ubuntu6.dsc 82eba40794a8b7dedd8e7d0d26978e871b1cdfe79001688aed3d9b2c08e71d14 45906 x-kit_0.5.0ubuntu6.tar.gz Checksums-Sha512: 809ee4ff263f5ad3789da0e40400f9539880086bb292410342cb43d50ce042ea9862b6246ac3c39410cca79122120902b4ead8cfe2af765bec4694744e84a340 1643 x-kit_0.5.0ubuntu6.dsc b2aa9681b29f73f8d6e75f57e8d555b557da61e3618b1f308a1633e6b3815683f8978461a8575412cf2e844a0d8b4c3e9eebce0eb2120513174027b640b58908 45906 x-kit_0.5.0ubuntu6.tar.gz Package: x11-apps Format: 1.0 Binary: x11-apps Architecture: any Version: 7.7+9 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), pkg-config, bison, libpng-dev, libx11-dev (>= 2:1.0.0), libx11-xcb-dev, libxaw7-dev (>= 1:1.0.1), libxcb-damage0-dev, libxcb-present-dev (>= 1.9), libxcb-xfixes0-dev, libxcursor-dev (>= 1.1.5.2), libxext-dev (>= 1:1.0.0), libxft-dev (>= 2.1.8.2-6), libxi-dev (>= 2:1.7), libxkbfile-dev (>= 1:1.0.1), libxmuu-dev (>= 1:1.0.1), libxrender-dev (>= 1:0.9.0.2-2), libxt-dev (>= 1:1.1.0), libxmu-dev, xbitmaps, x11proto-dev, quilt, xutils-dev (>= 1:7.5+4), man-db Vcs-Browser: https://salsa.debian.org/xorg-team/app/x11-apps Vcs-Git: https://salsa.debian.org/xorg-team/app/x11-apps.git Directory: pool/main/x/x11-apps Package-List: x11-apps deb x11 optional arch=any Files: 293204653c7050118271c180ba3a798d 1992 x11-apps_7.7+9.dsc d5388042374a484fbf551c8add05f6c9 4787126 x11-apps_7.7+9.tar.gz Checksums-Sha1: 855e9bfb9679fddf5b129895678b7f82b2e81bfa 1992 x11-apps_7.7+9.dsc 731f4574d92472cce9a0456b817d0811811fee57 4787126 x11-apps_7.7+9.tar.gz Checksums-Sha256: 152873179c21c65dc6e35a6b374fc41021ccc0ff85ddb1e65a53295ac6b2733f 1992 x11-apps_7.7+9.dsc a0aa997208a43d5224e1c55f84b2f25cf15fcec38172b178016f65ccb6d5ff33 4787126 x11-apps_7.7+9.tar.gz Checksums-Sha512: 609a8bb2d3cc1add991166f93f8eaca15a9ac0ca6e18e7cbcffd735bfe4e7283e3f2dec5a2cfd4b7ff9ad8b66b973a0d6e927434b4d756d1f822f874c1ed1d6d 1992 x11-apps_7.7+9.dsc 1a35164402b881df15249899add29b555923bc53044b436cf139bd3b27a0f9f4e48f00a9e672e8dc6504c7c3a58eb821a1fb598bac67c38dedeeb80c9a284a6e 4787126 x11-apps_7.7+9.tar.gz Package: x11-session-utils Format: 1.0 Binary: x11-session-utils Architecture: any Version: 7.7+5 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: dpkg-dev (>= 1.16.1), debhelper-compat (= 13), pkg-config, libice-dev, libsm-dev, libxaw7-dev (>= 1:1.0.1), libxmuu-dev, libxt-dev (>= 1:1.0.0), libx11-dev, x11proto-dev, quilt, xutils-dev (>= 1:7.5+4) Vcs-Browser: https://salsa.debian.org/xorg-team/app/x11-session-utils Vcs-Git: https://salsa.debian.org/xorg-team/app/x11-session-utils.git Directory: pool/main/x/x11-session-utils Package-List: x11-session-utils deb x11 optional arch=any Files: c8f2b725bb0db31e75cfa422aca4ca41 1780 x11-session-utils_7.7+5.dsc 650d47466fe5e4f60cbe2f58c945b08f 621824 x11-session-utils_7.7+5.tar.gz Checksums-Sha1: e97aa07e61c26d00c1d2d20ce6d97db443a0ca23 1780 x11-session-utils_7.7+5.dsc 11f004c6897bc048c621b1fd83dce6d9599f39aa 621824 x11-session-utils_7.7+5.tar.gz Checksums-Sha256: c63cd3923a01e9be15ea82082ddcef61fd36f8fe91379438797d9d72e2788459 1780 x11-session-utils_7.7+5.dsc f153909b15c529d8e0c5629be90b4f12a0d27966b8e2284f1d01403b917b6ba7 621824 x11-session-utils_7.7+5.tar.gz Checksums-Sha512: cdaec60bb80c89c37114f55196e2c6c0ce62cd785e0163d11cd989c9e2579d0afaf25ac60820f5b1b09a903a5785d2489a01c81a3b66a05a7bc6d3e6c0acfaf5 1780 x11-session-utils_7.7+5.dsc 3039cd16bf8937e55a6eaa01e59ca73954d382d8e0d4214a92208ef03986cce90797da7d1bc0a3ec5ea5fc67b2a2d358140949c1b1119a4239da275d5dc65192 621824 x11-session-utils_7.7+5.tar.gz Package: x11-utils Format: 1.0 Binary: x11-utils Architecture: any Version: 7.7+5build2 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: dpkg-dev (>= 1.16.1), debhelper-compat (= 12), quilt, xutils-dev (>= 1:7.5+4), pkg-config, libx11-dev (>= 2:1.0.0), libxaw7-dev (>= 1:1.0.1), libxext-dev (>= 1:1.0.0), libxft-dev (>= 2.1.8.2-6), libxi-dev (>= 1:1.0.0-3), libxkbfile-dev, libxmuu-dev (>= 1:1.0.1), libxrender-dev (>= 1:0.9.0.2-2), libxt-dev (>= 1:1.0.99.1), libxtst-dev (>= 1:1.0.1), libxxf86dga-dev (>= 1:1.0.1), libxv-dev (>= 1:1.0.1), libxxf86vm-dev (>= 1:1.0.0), libxcomposite-dev, libgl1-mesa-dev, libxinerama-dev (>= 1:1.0.1), libfontenc-dev, libxcb1-dev (>= 1.6), libx11-xcb-dev, libxcb-shape0-dev, libxrandr-dev (>= 2:1.2), gettext, x11proto-dev Vcs-Browser: https://salsa.debian.org/xorg-team/app/x11-utils Vcs-Git: https://salsa.debian.org/xorg-team/app/x11-utils.git Directory: pool/main/x/x11-utils Package-List: x11-utils deb x11 optional arch=any Files: 8934b4dcc1d98d3e48647a54720b665d 2268 x11-utils_7.7+5build2.dsc c78478f778153efe843fbd194206ba29 3125956 x11-utils_7.7+5build2.tar.gz Checksums-Sha1: e0108f913df5e96919a25135774aef91325f80cd 2268 x11-utils_7.7+5build2.dsc 2d0a737b58a4f562561cc147e4b358389701b885 3125956 x11-utils_7.7+5build2.tar.gz Checksums-Sha256: ef5a60baabf5761b7d27463855194db507b5eb79574d3327118f1de4585dfc78 2268 x11-utils_7.7+5build2.dsc 61a35f7f16c266a0ba39d52d34c8b21502748803174dfe7add311c0a380666e5 3125956 x11-utils_7.7+5build2.tar.gz Checksums-Sha512: e68c1af663661b76c7b9de8bde848b7c54d94d8470075f4413219c6fa58edb72174eec0eeef972faca590b3829627f3e8684f4993fd7fa11cd540349debffbc8 2268 x11-utils_7.7+5build2.dsc 7057a73fbd9b1e8ce3769069b3d332cd78c688c0f8129719fb3029cd210c9b0f5eabe7fdd3a5f34ce73b0d65ba9b147f905cff34c724d105487b4be69ea18d9d 3125956 x11-utils_7.7+5build2.tar.gz Package: x11-xkb-utils Format: 1.0 Binary: x11-xkb-utils, x11-xkb-utils-udeb Architecture: any Version: 7.7+7 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 13), pkg-config, libx11-dev (>= 2:1.3.3-2), libxaw7-dev (>= 1:1.0.1), libxkbfile-dev (>= 1:1.0.6-2), libxrandr-dev, bison, quilt, xutils-dev (>= 1:7.5+4), x11proto-dev Vcs-Browser: https://salsa.debian.org/xorg-team/app/x11-xkb-utils Vcs-Git: https://salsa.debian.org/xorg-team/app/x11-xkb-utils.git Directory: pool/main/x/x11-xkb-utils Package-List: x11-xkb-utils deb x11 optional arch=any x11-xkb-utils-udeb udeb debian-installer optional arch=any Files: 00c088d519b4b8af9a7a7abf4c7da0b3 1846 x11-xkb-utils_7.7+7.dsc a63dc858fe1771a266c85edac7dfac77 1065033 x11-xkb-utils_7.7+7.tar.gz Checksums-Sha1: 6fb7668ef8f1917a288cb6c74e378fe28e996d08 1846 x11-xkb-utils_7.7+7.dsc 2316a57d12f22d5c936805676774a1577245f923 1065033 x11-xkb-utils_7.7+7.tar.gz Checksums-Sha256: bdd5db28c3a5207ba2639b5951457770197cbfd17fde1f757c2007de31d8824f 1846 x11-xkb-utils_7.7+7.dsc 1091d5ae3a9ec94ff81070306a1085b9834ff00028f8e412041b055ee9d7ed2b 1065033 x11-xkb-utils_7.7+7.tar.gz Checksums-Sha512: d54ff2223038119005e3ac2eac59eb259af12bcc52e0bc4f9492a1ba76f6ab47ff444b99f7059fa40b0b90452c11a83375d4c7154f93db008ec019d021ba7b95 1846 x11-xkb-utils_7.7+7.dsc e22595f8cbd933ed8be84fb6b8f8dee71de7519b0dc4b30daed9370501bdd6fef44a1b4cfd620de272369b3f76a3fc9ec394a8a3d6becac1d2178d8aaefa7634 1065033 x11-xkb-utils_7.7+7.tar.gz Package: x11-xserver-utils Format: 1.0 Binary: x11-xserver-utils Architecture: any Version: 7.7+9build1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), pkg-config, x11proto-core-dev (>= 7.0.25), libx11-dev (>= 2:1.0.0), libxaw7-dev (>= 1:1.0.1), libxext-dev (>= 1:1.0.0), libxi-dev (>= 1:1.0.0-3), libxmuu-dev (>= 1:1.0.1), libxrandr-dev (>= 2:1.4.0), libxt-dev (>= 1:1.0.0), libxxf86vm-dev (>= 1:1.0.0), xbitmaps, quilt, x11proto-input-dev (>= 1.4), xutils-dev (>= 1:7.5+4), libxcursor-dev Vcs-Browser: https://salsa.debian.org/xorg-team/app/x11-xserver-utils Vcs-Git: https://salsa.debian.org/xorg-team/app/x11-xserver-utils Directory: pool/main/x/x11-xserver-utils Package-List: x11-xserver-utils deb x11 optional arch=any Files: 2c11114028b558705c0adb75e13b3087 2073 x11-xserver-utils_7.7+9build1.dsc 5a4a5b18288f2b1c053f9272362c4a05 2706607 x11-xserver-utils_7.7+9build1.tar.gz Checksums-Sha1: 62b6e08521df4b7458468b37ac8ff64e98a6c787 2073 x11-xserver-utils_7.7+9build1.dsc 61065d2a56ca2730727de573051f05877439b39a 2706607 x11-xserver-utils_7.7+9build1.tar.gz Checksums-Sha256: aed8ebbfe978659ec1852b5b5468e296d7cda9999f3736b32eb57924a108ae59 2073 x11-xserver-utils_7.7+9build1.dsc 29600f4667768ae96445d629fe15e2dd3df7dd43fbc45b52a4ec652153622069 2706607 x11-xserver-utils_7.7+9build1.tar.gz Checksums-Sha512: ba11551fd8c685d2d44e31985648e89e9114ea992a1dbe60bb5a687ccd37a0d0537131ddb132764fb0ca392c4237bd6013de980b178e0e5ad82f5c9f89af00f0 2073 x11-xserver-utils_7.7+9build1.dsc bd3451973b75f555d87522a64187eb518e02f238293b6e2d61cfc064d5721665aeda50372604cc81f4f640a234b717c10d6c9d6f2a6c0b767a62630d3c490143 2706607 x11-xserver-utils_7.7+9build1.tar.gz Package: xauth Format: 1.0 Binary: xauth Architecture: any Version: 1:1.1.2-1 Priority: standard Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.1.1 Build-Depends: debhelper-compat (= 13), quilt, pkg-config, libx11-dev, libxext-dev, libxmuu-dev, xutils-dev, cmdtest Vcs-Browser: https://salsa.debian.org/xorg-team/app/xauth Vcs-Git: https://salsa.debian.org/xorg-team/app/xauth.git Directory: pool/main/x/xauth Package-List: xauth deb x11 optional arch=any Files: 3ddb81485b9671731c051d2ec8d4bb29 1840 xauth_1.1.2-1.dsc 175393129a38e5153bc7901a47c1f66c 214621 xauth_1.1.2.orig.tar.gz dbce0e2c3147625628b1d80f4122184a 18091 xauth_1.1.2-1.diff.gz Checksums-Sha1: 9d1085fcd53efb0d7433e12c3d8e2a9835a791eb 1840 xauth_1.1.2-1.dsc 4403eaaf86574473ac35507a9842854be341ac98 214621 xauth_1.1.2.orig.tar.gz 50b70facb49d03cc88ed5800815946bc13eef071 18091 xauth_1.1.2-1.diff.gz Checksums-Sha256: 5b6f718530b68c385368bae7267e7dd0044882290e7b3e4fbe6d63bb8d65c9f0 1840 xauth_1.1.2-1.dsc 84d27a1023d8da524c134f424b312e53cb96e08871f96868aa20316bfcbbc054 214621 xauth_1.1.2.orig.tar.gz 6afd6f9a3c9b6320e4b523bbe6e5ff3960d59310c9b0efc8b6496d39144710ed 18091 xauth_1.1.2-1.diff.gz Checksums-Sha512: ec8325cddc322a10064a9ee996c2bfe1d83759cf09947c4c9bca09ae30e2a4c7c502ec266dc3f8e06d714a68f3a54d34841c42a3cfe9a5a6a746c8f55c9856cd 1840 xauth_1.1.2-1.dsc 9de9cec29e453824aad43824ff961ae5eada6604a190bc353bb665c40c6a1d40d436c44bf50209686c681c6adea6a08f456e02365de8f0feb3fa8a8fc01f5577 214621 xauth_1.1.2.orig.tar.gz 2835e10e8ef17349d6213a76b28e8643f9bf5dd70de7a84ebe6fbcb21666ce0dba28cdfb8d04b9d4820447f4dbc94bbc217d573373ed2b83b09f5582c53b2920 18091 xauth_1.1.2-1.diff.gz Package: xbitmaps Format: 1.0 Binary: xbitmaps Architecture: all Version: 1.1.1-2.1ubuntu1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Uploaders: Cyril Brulebois Standards-Version: 3.8.3 Build-Depends: debhelper (>= 7), xutils-dev (>= 1:7.5~), automake Vcs-Browser: http://git.debian.org/?p=pkg-xorg/data/xbitmaps.git Vcs-Git: git://git.debian.org/git/pkg-xorg/data/xbitmaps Directory: pool/main/x/xbitmaps Package-List: xbitmaps deb x11 optional arch=all Files: da2dda682fe85e326772a4e8ddd7c65d 1354 xbitmaps_1.1.1-2.1ubuntu1.dsc 288bbe310db67280a9e2e5ebc5602595 140011 xbitmaps_1.1.1.orig.tar.gz 87b4ade71cbc2e58ac913666c54779d0 13485 xbitmaps_1.1.1-2.1ubuntu1.diff.gz Checksums-Sha1: 5ea6b83afea85948d6f322de5cbea7875a61ea06 1354 xbitmaps_1.1.1-2.1ubuntu1.dsc 8d82a88652ac1743f57497bfd97c2b5c066f506a 140011 xbitmaps_1.1.1.orig.tar.gz 1c68f8225ddc797f80d43e374079ee0e1606e6bd 13485 xbitmaps_1.1.1-2.1ubuntu1.diff.gz Checksums-Sha256: ae8b5a1258959d9c5e2bfb9c61f68e7b1af361a9f16560cdd1ca090f61a38a3a 1354 xbitmaps_1.1.1-2.1ubuntu1.dsc 3bc89e05be4179ce4d3dbba1ae554da4591d41f7a489d9e2735a18cfd8378188 140011 xbitmaps_1.1.1.orig.tar.gz acbf1b6730aa047fde7ae10d6df8380605dac440a53bba5279c81c2e5f438567 13485 xbitmaps_1.1.1-2.1ubuntu1.diff.gz Checksums-Sha512: 4ec40d27ca3a7e581c69c976c42270b24852c2b30b694001a2b37a12d4d7cfecdd1b300b0957c89b0b6b3f62c901e375c9aadd1e9213890b505da3b2ebb8276c 1354 xbitmaps_1.1.1-2.1ubuntu1.dsc f3899f9bedab41c0545f115ab9a1b1bb79a6e9f676309dff312dfae3056f517e3a930f1bd7427835586502ef67f4ddb7040117293a35ceac034b52266b2bc05b 140011 xbitmaps_1.1.1.orig.tar.gz 2c669e0a1bafa5601ccb159f58edea59c305149902a9efd42ecbb5d83701e78908edb0b11e9b34babbdfea6f75c9236e2c6e4b2211dedb6a6697d66b69851e94 13485 xbitmaps_1.1.1-2.1ubuntu1.diff.gz Package: xcb-util Format: 3.0 (quilt) Binary: libxcb-util1, libxcb-util-dev, libxcb-util0-dev Architecture: any Version: 0.4.0-1build2 Priority: extra Section: libdevel Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Uploaders: Arnaud Fontaine Standards-Version: 4.5.1 Build-Depends: debhelper-compat (= 12), libxcb1-dev (>= 1.6), gperf, pkg-config, xutils-dev Homepage: http://xcb.freedesktop.org Vcs-Browser: https://salsa.debian.org/xorg-team/lib/xcb-util.git Vcs-Git: https://salsa.debian.org/xorg-team/lib/xcb-util.git Directory: pool/main/x/xcb-util Package-List: libxcb-util-dev deb libdevel optional arch=any libxcb-util0-dev deb oldlibs optional arch=any libxcb-util1 deb libs optional arch=any Files: 055e99c08ae5fb76fddebfdadf5490cf 2217 xcb-util_0.4.0-1build2.dsc 157d82738aa89934b6adaf3ca508a0f5 362923 xcb-util_0.4.0.orig.tar.gz cf25c9de1440b14b776def64467adc73 4580 xcb-util_0.4.0-1build2.debian.tar.xz Checksums-Sha1: 25ac6b536d1b2b87f3428022ab6560bc88cfa671 2217 xcb-util_0.4.0-1build2.dsc 43f889324a1564b682e107130c43643ce3e724b2 362923 xcb-util_0.4.0.orig.tar.gz 2ba6e4484b998629befb790fd58154da103e67ab 4580 xcb-util_0.4.0-1build2.debian.tar.xz Checksums-Sha256: e403336044c8227452becee1fe6d305db747ac507013a66e70f42e6a4123311b 2217 xcb-util_0.4.0-1build2.dsc 0ed0934e2ef4ddff53fcc70fc64fb16fe766cd41ee00330312e20a985fd927a7 362923 xcb-util_0.4.0.orig.tar.gz 035077ebaeeee92ff0a7f2f1d97d2b96d0148c0007f2f689d63ed9bd013aaf98 4580 xcb-util_0.4.0-1build2.debian.tar.xz Checksums-Sha512: 7f6245706540e51b10661a4880e395456170ef6b766052124397be2346552f6e1875501e47cb5981a748c5bbd59b019b65755974b8a732b55c083f9a1b0fb41f 2217 xcb-util_0.4.0-1build2.dsc bf9182c3b412984d9a8d4ec2d55a1fbae55722175effce4af7dd1094bac49e8ef20580ee6fbf025c651529346869650656451bdb0b5adbc4ba24a94b41c53240 362923 xcb-util_0.4.0.orig.tar.gz 6077ba9e6ee7a4e8e182d129777d42f0dfd9fea556fd8ef9b1dc83ef16d9a3bd680df9d10927bac25f51357707b11a94821782cf71d32077a24df0f32625e4d6 4580 xcb-util_0.4.0-1build2.debian.tar.xz Package: xcb-util-image Format: 3.0 (quilt) Binary: libxcb-image0, libxcb-image0-dev Architecture: any Version: 0.4.0-2 Priority: extra Section: libdevel Maintainer: Debian X Strike Force Uploaders: Arnaud Fontaine Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), libxcb1-dev (>= 1.6), libxcb-util0-dev, libxcb-shm0-dev, pkg-config, x11proto-dev, xutils-dev Homepage: https://xcb.freedesktop.org Vcs-Browser: https://salsa.debian.org/xorg-team/lib/xcb-util-image Vcs-Git: https://salsa.debian.org/xorg-team/lib/xcb-util-image.git Directory: pool/main/x/xcb-util-image Package-List: libxcb-image0 deb libs optional arch=any libxcb-image0-dev deb libdevel optional arch=any Files: bd4ba5b393ee940fbcd4d8cf0bec777b 2121 xcb-util-image_0.4.0-2.dsc 08fe8ffecc8d4e37c0ade7906b3f4c87 327891 xcb-util-image_0.4.0.orig.tar.bz2 5f07b668feb5f283f893aeaac6c4d488 4508 xcb-util-image_0.4.0-2.debian.tar.xz Checksums-Sha1: dafbeac115c8c98a0526fc767169950c5a5c7166 2121 xcb-util-image_0.4.0-2.dsc c9c9361781911a47b28f74fc6ebe0abd1273fae4 327891 xcb-util-image_0.4.0.orig.tar.bz2 6e633183ce87f01366267f873e6d7851d627d364 4508 xcb-util-image_0.4.0-2.debian.tar.xz Checksums-Sha256: 6a01c919e437b18ecd00c02c7ed1a5b0ff85cd0e3f7effd89ac8226a3fa5e299 2121 xcb-util-image_0.4.0-2.dsc 2db96a37d78831d643538dd1b595d7d712e04bdccf8896a5e18ce0f398ea2ffc 327891 xcb-util-image_0.4.0.orig.tar.bz2 cf7d3d2ee9b462c93ba51f95857e2044b5e1b5d91bb5b88be71b2d1aacc2f025 4508 xcb-util-image_0.4.0-2.debian.tar.xz Checksums-Sha512: c250ffb5a26543a0e0ca4ce43c475a4ea9c91adc2ebf50e92d5b32b44f8caa90a803afc0d76e745d76e1959b291cc3a3d9b6389313917433ff01d036646f1079 2121 xcb-util-image_0.4.0-2.dsc 9b7202c054e1160f9ca97a86be1210d9fb47f2119f89ca85f15f20909cca884bfe0cb88e3e71c75b65e1a0a72b980066ccac810e41a91db895c74dde77440d4f 327891 xcb-util-image_0.4.0.orig.tar.bz2 c90fe1cedae869052a19d0058b33b89bb9e511b5b98021b685268adb5725f8cc5fc9b73a8ff4db0317266fa9924b3b44817c9de17d78c2c91b7c63cb01e3ea21 4508 xcb-util-image_0.4.0-2.debian.tar.xz Package: xcb-util-keysyms Format: 3.0 (quilt) Binary: libxcb-keysyms1, libxcb-keysyms1-dev Architecture: any Version: 0.4.0-1build3 Priority: extra Section: libdevel Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Uploaders: Julien Danjou , Arnaud Fontaine Standards-Version: 3.9.6 Build-Depends: cdbs (>= 0.4.93~), debhelper (>= 8.1.3), libxcb1-dev (>= 1.6), pkg-config, dh-autoreconf, x11proto-core-dev (>= 7.0.8), xutils-dev Homepage: http://xcb.freedesktop.org Vcs-Browser: http://git.debian.org/?p=pkg-xorg/lib/xcb-util-keysyms.git Vcs-Git: git://git.debian.org/pkg-xorg/lib/xcb-util-keysyms.git Directory: pool/main/x/xcb-util-keysyms Package-List: libxcb-keysyms1 deb libs extra arch=any libxcb-keysyms1-dev deb libdevel extra arch=any Files: 62796a5683d9a3dfe6df8e61a715c7e4 2315 xcb-util-keysyms_0.4.0-1build3.dsc 1022293083eec9e62d5659261c29e367 289880 xcb-util-keysyms_0.4.0.orig.tar.bz2 4b828716d62cd36a0d4c70c90d7b3cbe 4460 xcb-util-keysyms_0.4.0-1build3.debian.tar.xz Checksums-Sha1: 94ed2208fd6f959e2fc57cce3a81bb769bc1e229 2315 xcb-util-keysyms_0.4.0-1build3.dsc ff02ee8ac22c53848af50c0a6a6b00feb002c1cb 289880 xcb-util-keysyms_0.4.0.orig.tar.bz2 62110c3babd4295d9591d1b7fa7c01d6b139c18f 4460 xcb-util-keysyms_0.4.0-1build3.debian.tar.xz Checksums-Sha256: 5a83beb9ffb67c550e9dd89a2dfdc814176be49f50b51838525c8baf20457a5a 2315 xcb-util-keysyms_0.4.0-1build3.dsc 0ef8490ff1dede52b7de533158547f8b454b241aa3e4dcca369507f66f216dd9 289880 xcb-util-keysyms_0.4.0.orig.tar.bz2 23dfbb54ff32bd0b0a67da70793e5496fa7e0334eea37388532d1981c2f34597 4460 xcb-util-keysyms_0.4.0-1build3.debian.tar.xz Checksums-Sha512: fbbc69e8fc1e5651b4e10d35745030ec737655632646df0c845a478c912388cb4e44998b1e7d776b0ad5f1d2819f8fbc2e8de5c0bb8322d86fb79736c8e69739 2315 xcb-util-keysyms_0.4.0-1build3.dsc b14b3100c3ae2379f9df799c0780a1ee39267101e58e4c1c6f390f039348ca2b370bb1df203b9bc68a170d664188d9c73e3553a7ba24d98abea3ed353e8dc0c4 289880 xcb-util-keysyms_0.4.0.orig.tar.bz2 7d701908440a108a3596e0db04def48b97f15748a0c79aff2f624d32bdc5a5bda7130da764c6b0d5af0fa61f8453682e67b2565ca5442cc4ed5693b2da37cd4e 4460 xcb-util-keysyms_0.4.0-1build3.debian.tar.xz Package: xcb-util-renderutil Format: 3.0 (quilt) Binary: libxcb-render-util0, libxcb-render-util0-dev Architecture: any Version: 0.3.9-1build3 Priority: extra Section: libdevel Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Uploaders: Julien Danjou , Arnaud Fontaine Standards-Version: 3.9.5 Build-Depends: cdbs (>= 0.4.93~), debhelper (>= 9), dh-autoreconf, libxcb1-dev (>= 1.6), libxcb-render0-dev, pkg-config, libtool, autotools-dev, autoconf, automake, xutils-dev Homepage: http://xcb.freedesktop.org Vcs-Browser: http://git.debian.org/?p=pkg-xorg/lib/xcb-util-renderutil.git Vcs-Git: git://git.debian.org/pkg-xorg/lib/xcb-util-renderutil.git Directory: pool/main/x/xcb-util-renderutil Package-List: libxcb-render-util0 deb libs extra arch=any libxcb-render-util0-dev deb libdevel extra arch=any Files: 26ce3764dd3a6ae76f27a38ffc831425 2388 xcb-util-renderutil_0.3.9-1build3.dsc 468b119c94da910e1291f3ffab91019a 292898 xcb-util-renderutil_0.3.9.orig.tar.bz2 9cbbf0e98afd0e1ecb9318e9c04e7373 4512 xcb-util-renderutil_0.3.9-1build3.debian.tar.xz Checksums-Sha1: 7de7da03f6131b228740e1eb968a6e2e1e66a3c9 2388 xcb-util-renderutil_0.3.9-1build3.dsc cb533b1d039f833f070e7d6398c221a31d30d5e2 292898 xcb-util-renderutil_0.3.9.orig.tar.bz2 f26af327e91edd649f7f06d2df09b810a302fdf2 4512 xcb-util-renderutil_0.3.9-1build3.debian.tar.xz Checksums-Sha256: baff0b59d348632f66f60cbdd7f75a38353bc69eb64ccd1252879598347bf168 2388 xcb-util-renderutil_0.3.9-1build3.dsc c6e97e48fb1286d6394dddb1c1732f00227c70bd1bedb7d1acabefdd340bea5b 292898 xcb-util-renderutil_0.3.9.orig.tar.bz2 ff35b6b5a8d009d7f607f447eec42a1ec2de5186f38e01a43485294188c5170c 4512 xcb-util-renderutil_0.3.9-1build3.debian.tar.xz Checksums-Sha512: 10796a3b60c7be42cf56d9740b8b09fbc9b4ef9acabcba3b296c5d2a6d6a4e62d7d20a77498871126d8e9efdf6b59bf555a10a965965a4811a0e02e0faf2ffe0 2388 xcb-util-renderutil_0.3.9-1build3.dsc 24b567992ecde7e69a406efd0ffb62266610d73b4dc0e5c71093221090fa134c14b850680d1d28dc1f8f4a6f497b4118491e1894ec7c73d2c6ce959d106771cc 292898 xcb-util-renderutil_0.3.9.orig.tar.bz2 c1e70a302730bfba55f50ca5ed59e0066c1d64e61a4d5cadae8d83b687c6b031ccc3892113a4d7966261c6be2d8d305852b24950b8b8593da3c925d822f12f0e 4512 xcb-util-renderutil_0.3.9-1build3.debian.tar.xz Package: xcb-util-wm Format: 3.0 (quilt) Binary: libxcb-icccm4, libxcb-icccm4-dev, libxcb-ewmh2, libxcb-ewmh-dev Architecture: any Version: 0.4.1-1.1build2 Priority: extra Section: libdevel Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Uploaders: Julien Danjou , Arnaud Fontaine Standards-Version: 3.9.3 Build-Depends: cdbs (>= 0.4.93~), debhelper (>= 8.1.3), dh-autoreconf, libxcb1-dev (>= 1.6), pkg-config, m4, libtool, autotools-dev, autoconf, automake, xutils-dev (>= 1:7.7~1~) Homepage: https://xcb.freedesktop.org Vcs-Browser: https://salsa.debian.org/xorg-team/lib/xcb-util-wm Vcs-Git: https://salsa.debian.org/xorg-team/lib/xcb-util-wm.git Directory: pool/main/x/xcb-util-wm Package-List: libxcb-ewmh-dev deb libdevel optional arch=any libxcb-ewmh2 deb libs optional arch=any libxcb-icccm4 deb libs optional arch=any libxcb-icccm4-dev deb libdevel optional arch=any Files: 457193d886f59a9d7ad9a68afdd39c37 2428 xcb-util-wm_0.4.1-1.1build2.dsc 0831399918359bf82930124fa9fd6a9b 395835 xcb-util-wm_0.4.1.orig.tar.gz 987b0ab7ee8230c16b7eecc8300abc45 4620 xcb-util-wm_0.4.1-1.1build2.debian.tar.xz Checksums-Sha1: c01de96e5463eddb581a081ab99b3b177e33c84b 2428 xcb-util-wm_0.4.1-1.1build2.dsc 387c9b17a7352a19188b9353adbe5e7fdc01ef2a 395835 xcb-util-wm_0.4.1.orig.tar.gz 0112830e2ab00969aa262f1e6c9fa1ec73031608 4620 xcb-util-wm_0.4.1-1.1build2.debian.tar.xz Checksums-Sha256: 0c0993c06aa5e20950245d9a8aca3deeb7aa2129ecaf0783bbf37ce5a0ae60be 2428 xcb-util-wm_0.4.1-1.1build2.dsc 038b39c4bdc04a792d62d163ba7908f4bb3373057208c07110be73c1b04b8334 395835 xcb-util-wm_0.4.1.orig.tar.gz cbf5ce21c783753ad6a783addbefc732e5955ce7f5f81af51b03a258d04befda 4620 xcb-util-wm_0.4.1-1.1build2.debian.tar.xz Checksums-Sha512: c0c79b4eada24dbc52d3d05749917a2b25311496f7d85150cca13f746a2aace4f8e5ddadc6731a167a2ac06f0e947dbd2e4a308fe35bffea37dead9058f34429 2428 xcb-util-wm_0.4.1-1.1build2.dsc 063d852367088a7129aacce95e7d81cb0925b146191e1114171e58f5a65dcb8cc7f4fb5a9ecb49e9da2e2d8be75375f5cfaafc04b756179750e230fb486b9e22 395835 xcb-util-wm_0.4.1.orig.tar.gz e70396fdbdb6729a09fbfeee14e82411ba67d92571f2518c22195ea8bddfab8bc0d8ada51850e265ac27acf8affcc8f93583c0cc4ea5356e52dbf40c3e8c9008 4620 xcb-util-wm_0.4.1-1.1build2.debian.tar.xz Package: xcursor-themes Format: 1.0 Binary: xcursor-themes Architecture: all Version: 1.0.6-0ubuntu1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 3.8.3.0 Build-Depends: debhelper (>= 9), dh-autoreconf, quilt, pkg-config, x11-apps | xcursorgen, libxcursor-dev, automake, xutils-dev (>= 1:7.5~1) Vcs-Browser: https://salsa.debian.org/xorg-team/data/xcursor-themes Vcs-Git: https://salsa.debian.org/xorg-team/data/xcursor-themes.git Directory: pool/main/x/xcursor-themes Package-List: xcursor-themes deb x11 optional arch=all Files: dcc6b51a02c21cdf179f82f9b5638b78 1445 xcursor-themes_1.0.6-0ubuntu1.dsc 76f7f7706118e8faa53ba2901762391d 2562225 xcursor-themes_1.0.6.orig.tar.gz c4f418d6cd338305f94b71676a807248 9245 xcursor-themes_1.0.6-0ubuntu1.diff.gz Checksums-Sha1: e6ee32bccfe3247d5168596ea767bdf2d29ab2ab 1445 xcursor-themes_1.0.6-0ubuntu1.dsc 916ef26cd1b41f12f80d0ad5ec7f176277b60267 2562225 xcursor-themes_1.0.6.orig.tar.gz 7bb76b48bc930c59363439f7b79e7a07755640f4 9245 xcursor-themes_1.0.6-0ubuntu1.diff.gz Checksums-Sha256: 043fd5b5eff97c78d738bab3df4958f1a9d04ddd4d864e76c775933d22f3062d 1445 xcursor-themes_1.0.6-0ubuntu1.dsc 22638f7bd6257adf889d25af9c8a7b2cfdcf5a5e18339d25fbb092dbf6c663c1 2562225 xcursor-themes_1.0.6.orig.tar.gz 56b9d2181f0f891da34b0aa902260e175224a476e290e3046e37548096b3f023 9245 xcursor-themes_1.0.6-0ubuntu1.diff.gz Checksums-Sha512: ccf93cd9c8515bb55bb41cb2705ed671427ee6a55b3b8f06a4e8aeb6fb630b4532c62b8ce7454163489d0c55d201b52fa8a96c020953e38debeffe2e022b94bd 1445 xcursor-themes_1.0.6-0ubuntu1.dsc 6afe6a3126f9104f3cbf2001c2a972dfdf615660ec57ad455ea24f79b12c493b8eeec542edf7293b34083d1669baeb6b9ad9cb303f646c6704a67675aa3cfb9c 2562225 xcursor-themes_1.0.6.orig.tar.gz a460ccfa86d1cde269237c878f0c62363fd8d97b2e7f46ef3d033617aeffadbf04972abcff9243f6599968f0c384665783656bb8e5a98e74bd480b0e9dd15e69 9245 xcursor-themes_1.0.6-0ubuntu1.diff.gz Package: xdg-dbus-proxy Format: 3.0 (quilt) Binary: xdg-dbus-proxy, xdg-dbus-proxy-tests Architecture: any Version: 0.1.4-3 Priority: optional Section: misc Maintainer: Utopia Maintenance Team Uploaders: Simon McVittie , Standards-Version: 4.6.1 Build-Depends: dbus-daemon , debhelper-compat (= 13), docbook-xml, docbook-xsl, libglib2.0-dev, meson, xsltproc Testsuite: autopkgtest Homepage: https://github.com/flatpak/xdg-dbus-proxy Vcs-Browser: https://salsa.debian.org/debian/xdg-dbus-proxy Vcs-Git: https://salsa.debian.org/debian/xdg-dbus-proxy.git Directory: pool/main/x/xdg-dbus-proxy Package-List: xdg-dbus-proxy deb admin optional arch=any xdg-dbus-proxy-tests deb admin optional arch=any Files: efa433ba0762d6e384fcea07ad90650e 2319 xdg-dbus-proxy_0.1.4-3.dsc 89d166170e871b3288e8980aee599ae4 122112 xdg-dbus-proxy_0.1.4.orig.tar.xz 8ed43d0ac84a00aea7ca66b122121008 4880 xdg-dbus-proxy_0.1.4-3.debian.tar.xz Checksums-Sha1: 24c221e6220882a2da3d15b57c1c6ef5621cfbbf 2319 xdg-dbus-proxy_0.1.4-3.dsc b64d4c4d2c3e947b7edbe5b423eddcc5d2fbdcfb 122112 xdg-dbus-proxy_0.1.4.orig.tar.xz 21818eba835d66e966ad501feb3506f0290fa00c 4880 xdg-dbus-proxy_0.1.4-3.debian.tar.xz Checksums-Sha256: ecb3d589667669389db0d4bf240b62c7078307fcaca4d84269367e045ee3c799 2319 xdg-dbus-proxy_0.1.4-3.dsc 1ec0eab53d1e49966d722352bcfd51ac402dce5190baedc749a8541e761670ab 122112 xdg-dbus-proxy_0.1.4.orig.tar.xz f2e9f91816f137916128c2bde2acb9f882d395257610f5b64e5a04daa1f50566 4880 xdg-dbus-proxy_0.1.4-3.debian.tar.xz Checksums-Sha512: 6d4bb73176dc16ff4b8e8cdbdbd55a96c1df40372064a7d54acba5db672c9ca31bff03f41ff0fe044b49f730bcb35fac89a82d438ab19dd82e18e56506d94b38 2319 xdg-dbus-proxy_0.1.4-3.dsc d50fa916d07f23e080ab53cf290b5d6db73cfd8262253a48b9f012ce6c182e201d0a67efaeb7f28a844d3ef146aa48936dfbe4279a59b909a6dc4419d5f15b04 122112 xdg-dbus-proxy_0.1.4.orig.tar.xz 313c0ade5de61b5454553efe81ff64e8db684f209859435d245919591edbadd4866d325d4c001b61a8a68a154958ac32a8dc2211aa18b79244e21824b766b94f 4880 xdg-dbus-proxy_0.1.4-3.debian.tar.xz Testsuite-Triggers: gnome-desktop-testing Dgit: 66a0884901fbbe414fae62f912a298b77d92d891 debian archive/debian/0.1.4-3 https://git.dgit.debian.org/xdg-dbus-proxy Package: xdg-desktop-portal Format: 3.0 (quilt) Binary: xdg-desktop-portal, xdg-desktop-portal-dev, xdg-desktop-portal-tests Architecture: any all Version: 1.16.0-2ubuntu1 Priority: optional Section: misc Maintainer: Ubuntu Developers Original-Maintainer: Utopia Maintenance Team Uploaders: Simon McVittie , Standards-Version: 4.6.1 Build-Depends: dbus-daemon, debhelper-compat (= 13), geoclue-2.0 , fuse3 , libcap2-bin , libgdk-pixbuf-2.0-dev | libgdk-pixbuf2.0-dev, libgeoclue-2-dev (>= 2.5.2), libflatpak-dev (>= 1.5.0), libfuse3-dev (>= 3.10.0), libglib2.0-dev, libjson-glib-dev, libpipewire-0.3-dev (>= 0.3.10), libportal-dev (>= 0.3), libsystemd-dev, meson (>= 0.56.2), pipewire (>= 0.3.10) , procps , python3 , python3-gi , xmlto Testsuite: autopkgtest Homepage: https://github.com/flatpak/xdg-desktop-portal Vcs-Browser: https://salsa.debian.org/debian/xdg-desktop-portaltree/ubuntu/master Vcs-Git: https://salsa.debian.org/debian/xdg-desktop-portal.git -b ubuntu/master Directory: pool/main/x/xdg-desktop-portal Package-List: xdg-desktop-portal deb admin optional arch=linux-any xdg-desktop-portal-dev deb admin optional arch=all xdg-desktop-portal-tests deb admin optional arch=any Files: 4b1dc01037c74b9987091739d2717a20 2988 xdg-desktop-portal_1.16.0-2ubuntu1.dsc 3312781f8f0ed772c52c05c010690283 250524 xdg-desktop-portal_1.16.0.orig.tar.xz a6a5f7326f58aa7920e67290f63e5500 18160 xdg-desktop-portal_1.16.0-2ubuntu1.debian.tar.xz Checksums-Sha1: 7f70fdfbd07da0c25011c43eacde2e69bb35ee17 2988 xdg-desktop-portal_1.16.0-2ubuntu1.dsc 311dbb43400b2a660c45274f74f2fd5244ae5f0e 250524 xdg-desktop-portal_1.16.0.orig.tar.xz d4537d312a83b75282d01f5bf79b3af37dffbbf4 18160 xdg-desktop-portal_1.16.0-2ubuntu1.debian.tar.xz Checksums-Sha256: 50c9edb411bbb0681529090a68eb3c8ae4a16ce46422e8afdf47e06cd25b6e84 2988 xdg-desktop-portal_1.16.0-2ubuntu1.dsc 5b41a5915c11851493d8c33b9783f147a0a6f419db80ad760e84cd3420fd8c19 250524 xdg-desktop-portal_1.16.0.orig.tar.xz 3c1072ee840b41cc7d950b8bddbb3bcdf1742a934fe281afb28972ef02bedb62 18160 xdg-desktop-portal_1.16.0-2ubuntu1.debian.tar.xz Checksums-Sha512: eef786a6bbcd2a0997994f447b9fb9e6aad877f018b9f40cda1765d055c7d2f076f5b4d20d893341ff60a7da6f3b6601f9e88a01a2efd3b7642b9ee67269ad93 2988 xdg-desktop-portal_1.16.0-2ubuntu1.dsc f7e7e96d3a6757901fbc4c0310aac0afbf37882c279a2859e06f63528049cd9b50dd2d55445d1386f03f62557c1a2ec81d4ee081200367d6269d2dffc75f0912 250524 xdg-desktop-portal_1.16.0.orig.tar.xz adb9d2d3cff535927a08f6a807e77a2ff5a007cc6a653f067bc20323f7bcce9fc8a33de14ae0dbd8f353c52158972f0895c68264e016ed8cc86eac6d06788290 18160 xdg-desktop-portal_1.16.0-2ubuntu1.debian.tar.xz Testsuite-Triggers: gnome-desktop-testing Debian-Vcs-Browser: https://salsa.debian.org/debian/xdg-desktop-portal Debian-Vcs-Git: https://salsa.debian.org/debian/xdg-desktop-portal.git Package: xdg-desktop-portal-gnome Format: 3.0 (quilt) Binary: xdg-desktop-portal-gnome Architecture: linux-any Version: 44~beta-1ubuntu1 Priority: optional Section: misc Maintainer: Ubuntu Developers Original-Maintainer: Debian GNOME Maintainers Uploaders: Simon McVittie , Jeremy Bicha Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), dh-sequence-gnome, gsettings-desktop-schemas-dev (>= 41), libfontconfig-dev, libadwaita-1-dev, libglib2.0-dev (>= 2.44), libgnome-desktop-4-dev, libgnome-bg-4-dev, libgtk-4-dev (>= 4.0), meson (>= 0.57.0), systemd (>= 242), xdg-desktop-portal-dev (>= 1.15.0), xmlto Homepage: https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome Vcs-Browser: https://salsa.debian.org/gnome-team/xdg-desktop-portal-gnome Vcs-Git: https://salsa.debian.org/gnome-team/xdg-desktop-portal-gnome.git Directory: pool/main/x/xdg-desktop-portal-gnome Package-List: xdg-desktop-portal-gnome deb gnome optional arch=linux-any Files: fb419bad9e66724087cb03f72f0d409c 2547 xdg-desktop-portal-gnome_44~beta-1ubuntu1.dsc 28faf1d43fed8d25772752a12d8e4ad8 127580 xdg-desktop-portal-gnome_44~beta.orig.tar.xz 22e8e3921c3fb2d57a8f88a315b15873 11068 xdg-desktop-portal-gnome_44~beta-1ubuntu1.debian.tar.xz Checksums-Sha1: 45b62ff149c0f9ba0318bb721b28a6b633c5124a 2547 xdg-desktop-portal-gnome_44~beta-1ubuntu1.dsc ced31af04e756a97be717afb3aa2679f07abd7db 127580 xdg-desktop-portal-gnome_44~beta.orig.tar.xz 05fe46ef870384c058413179cb33e1248b6abf7e 11068 xdg-desktop-portal-gnome_44~beta-1ubuntu1.debian.tar.xz Checksums-Sha256: ca1aa3ee6f3fc7d4c0adf0392fd8fea4d8bbf272ef7bed3665690b4df5dd1d51 2547 xdg-desktop-portal-gnome_44~beta-1ubuntu1.dsc 83a1909f03ce1e6fab072bf7f136a14159b149c7399b091f901f0d0f467855e2 127580 xdg-desktop-portal-gnome_44~beta.orig.tar.xz a688e1426c45c19cbaaead62f80daaeac25b9601b823b7cde7c8985e7f2fb168 11068 xdg-desktop-portal-gnome_44~beta-1ubuntu1.debian.tar.xz Checksums-Sha512: 3174c2d2ba5007ed2a5440c9ce0378bd82a89175b34e7e9a98af83364f03cbd65f6e777a133c6947d5952dc420b79669acc5563d6e41bcd9c77b78f1195c6805 2547 xdg-desktop-portal-gnome_44~beta-1ubuntu1.dsc a36a1d4774e8558b511744f25bc7eb7a9f40b03ae210e10b370d854afcdc03ee9bd4b1b978fb45113ebd13a68e570d947f11b5ef9166aa3d84222ce961059a27 127580 xdg-desktop-portal-gnome_44~beta.orig.tar.xz 68be701b16fa73dac8f982dc1852f4b8c04d4ce7c1182a2fdfa03e8f8d6432464cceecf086999b4f92178974adcd2583a79b2e9ac474f3216c696df8051277a3 11068 xdg-desktop-portal-gnome_44~beta-1ubuntu1.debian.tar.xz Package: xdg-desktop-portal-gtk Format: 3.0 (quilt) Binary: xdg-desktop-portal-gtk Architecture: linux-any Version: 1.14.1-1 Priority: optional Section: misc Maintainer: Utopia Maintenance Team Uploaders: Simon McVittie , Standards-Version: 4.6.1 Build-Depends: dbus, debhelper-compat (= 13), gsettings-desktop-schemas-dev, libdbus-1-dev, libfontconfig-dev, libglib2.0-dev, libgtk-3-dev, xdg-desktop-portal-dev (>= 1.14.0), xmlto Homepage: https://flatpak.org/ Vcs-Browser: https://salsa.debian.org/debian/xdg-desktop-portal-gtk Vcs-Git: https://salsa.debian.org/debian/xdg-desktop-portal-gtk.git Directory: pool/main/x/xdg-desktop-portal-gtk Package-List: xdg-desktop-portal-gtk deb gnome optional arch=linux-any Files: ad80b3c1eeb37713627f6c4e6bfee442 2338 xdg-desktop-portal-gtk_1.14.1-1.dsc 91a3a21cd0b24d59a0f977508717159a 393964 xdg-desktop-portal-gtk_1.14.1.orig.tar.xz 4fead98e7d6360e25983616905a7b242 5504 xdg-desktop-portal-gtk_1.14.1-1.debian.tar.xz Checksums-Sha1: 4cf615a09452c6b085c70c6b73148af1a08bc72c 2338 xdg-desktop-portal-gtk_1.14.1-1.dsc af54c175f8e4591e916fc25dc56e6ac406c1f39c 393964 xdg-desktop-portal-gtk_1.14.1.orig.tar.xz 88ccb4db6b136b739d9d7cc956e2341dc3521e6f 5504 xdg-desktop-portal-gtk_1.14.1-1.debian.tar.xz Checksums-Sha256: 5f606639d6eea556e4c08921f1c737d43b3714783dd3309aa2c58d574bfc6f7c 2338 xdg-desktop-portal-gtk_1.14.1-1.dsc 3ee2a992187eabb237a76170a7dead2a3bcea2edbf59344647cc0d1c640a5700 393964 xdg-desktop-portal-gtk_1.14.1.orig.tar.xz cf14650a0675f251d24ae5a38745f763292516ccc038f850e1f6d626e0790411 5504 xdg-desktop-portal-gtk_1.14.1-1.debian.tar.xz Checksums-Sha512: 12b7a77a487ecfda02cb9c5498a14b208074c3c8d3014a28fb0d5e3da8af081ca78db0aeb0340b0aea02042b4a5fcae886d17e0813d7fa6dfdc99d097a4d1656 2338 xdg-desktop-portal-gtk_1.14.1-1.dsc d8b487e8fc7d8c1f0f41eb3ee28377b2f77af9c65569b5dbaee785ae40c163929da8b13b39b032e25631515cb8e7218129c8bbffe25692e85c7b8e9269024325 393964 xdg-desktop-portal-gtk_1.14.1.orig.tar.xz 08564dcae9f4fd9787e700e94594f7464e1380a29154279049a10ef514cae64fbade4e70704f2945d9e25ed7b4a3bf2c67e36632ac81b0269a28d7a5a0174507 5504 xdg-desktop-portal-gtk_1.14.1-1.debian.tar.xz Dgit: 52f3802edb7d13b1568cc0e52bb9e7eb5791c342 debian archive/debian/1.14.1-1 https://git.dgit.debian.org/xdg-desktop-portal-gtk Package: xdg-user-dirs Format: 3.0 (quilt) Binary: xdg-user-dirs Architecture: any Version: 0.18-1 Priority: important Section: utils Maintainer: Debian GNOME Maintainers Uploaders: Iain Lane , Jordi Mallach , Matthias Klumpp , Michael Biebl , Sebastian Drƶge Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), docbook-xml, docbook-xsl, gnome-pkg-tools (>= 0.19.8), xsltproc Homepage: https://www.freedesktop.org/wiki/Software/xdg-user-dirs Vcs-Browser: https://salsa.debian.org/gnome-team/xdg-user-dirs Vcs-Git: https://salsa.debian.org/gnome-team/xdg-user-dirs.git Directory: pool/main/x/xdg-user-dirs Package-List: xdg-user-dirs deb utils optional arch=any Files: 392deba4ea2b00b1e5a516445c80389e 2182 xdg-user-dirs_0.18-1.dsc dc7decea7ffb58cd067eff1fe1798cae 273556 xdg-user-dirs_0.18.orig.tar.gz 57428d4e31f149649e5aab564564f27b 4448 xdg-user-dirs_0.18-1.debian.tar.xz Checksums-Sha1: a38b9b06845c8d126b7e8bd367c4a08f07edbb68 2182 xdg-user-dirs_0.18-1.dsc 58587270fb85f33ec6d7ca194c48ddc82488e6d3 273556 xdg-user-dirs_0.18.orig.tar.gz 4966973c030d110fb32ab4f77ad9db32666d16f0 4448 xdg-user-dirs_0.18-1.debian.tar.xz Checksums-Sha256: ad366c644dcd081b82175a10a3b7bf4ab40603ee1b548d23797ed92c42a99a06 2182 xdg-user-dirs_0.18-1.dsc ec6f06d7495cdba37a732039f9b5e1578bcb296576fde0da40edb2f52220df3c 273556 xdg-user-dirs_0.18.orig.tar.gz ec600e795bf18f38b8918e93e685a20b7482eda3ddabb3debbf1104f691ad6b1 4448 xdg-user-dirs_0.18-1.debian.tar.xz Checksums-Sha512: a2b332572cbcbf3a6ac0cc815a9f8215db0e3bc78ffe112922dffdbc81777a5ef57e8caa9a492650bab0b60c94e2d8482e121af3992a4bb660570bdbf248e84e 2182 xdg-user-dirs_0.18-1.dsc f523b2ba4f840a3c2a5730f72182fb5bb798187db769bfb7d36e9f780442813278a2c1bad656b4fb38428131241a51d07200a62b4d7b935d49a74be53f969716 273556 xdg-user-dirs_0.18.orig.tar.gz a981987294cd107aea4cd037a938dd86f3d942a85645fd234409670f8142f6f79b1453b4a877a830b242656995db2af3ab8652ae765af6378672be85964339df 4448 xdg-user-dirs_0.18-1.debian.tar.xz Package: xdg-user-dirs-gtk Format: 3.0 (quilt) Binary: xdg-user-dirs-gtk Architecture: any Version: 0.11-1 Priority: optional Section: utils Maintainer: Debian GNOME Maintainers Uploaders: Jeremy Bicha , Michael Biebl , Sebastian Drƶge Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), dh-sequence-gnome, intltool, libgtk-3-dev, xdg-user-dirs Homepage: http://www.freedesktop.org/wiki/Software/xdg-user-dirs Vcs-Browser: https://salsa.debian.org/gnome-team/xdg-user-dirs-gtk Vcs-Git: https://salsa.debian.org/gnome-team/xdg-user-dirs-gtk.git Directory: pool/main/x/xdg-user-dirs-gtk Package-List: xdg-user-dirs-gtk deb utils optional arch=any Files: cac88e6d94b5a35f35c25e65eaf81c1e 2154 xdg-user-dirs-gtk_0.11-1.dsc e30bf46fca8b7467643fb1998841873a 126488 xdg-user-dirs-gtk_0.11.orig.tar.xz 30dd9a1d5b3ab61ab42cd62af585628f 4080 xdg-user-dirs-gtk_0.11-1.debian.tar.xz Checksums-Sha1: bb149d47da1b1734ef2019c28d15e619197d5c76 2154 xdg-user-dirs-gtk_0.11-1.dsc 4327e083be37370b18f44a54c3ff490839a7617c 126488 xdg-user-dirs-gtk_0.11.orig.tar.xz b262203aeb937552211c759cd5f7b60572a6e669 4080 xdg-user-dirs-gtk_0.11-1.debian.tar.xz Checksums-Sha256: 9a349b6377a6875b8a747d0dbc5f7857f9deecd5c2b6cff3aef4ab636c8d6d11 2154 xdg-user-dirs-gtk_0.11-1.dsc 534bd563d3c0e3f8dcbf3578cb8ab0e49d3ba41c966d477c8af9438364121e7d 126488 xdg-user-dirs-gtk_0.11.orig.tar.xz 58bbeb40ca5f48561f5dd04c909e33883dd3366bc8f19b232108fa2717b13385 4080 xdg-user-dirs-gtk_0.11-1.debian.tar.xz Checksums-Sha512: 25f2f1ce912776880af415a288a853616c07e8c87f7afbeb56a6bb2c0a39e1781d68e06cfd11e4d2fb8d5251399fdca7c0e8c79d67caafcabaec0ac2faee566a 2154 xdg-user-dirs-gtk_0.11-1.dsc 2a650c6372126f807ac90fb0508e1b11636b38b5960a3037b547e9f1bb1a6b82653f20da7d5aae1144eebec040e3af89a02fbf70c1768724019b384f6d9cf85a 126488 xdg-user-dirs-gtk_0.11.orig.tar.xz e3bdefe7c9bd322408bce5473527c890f037e20f9f29aeab19288ce00961ee8a7df9d4f7bff9fe9bb5f6c29791efb1588040b72299e44ed034df738bf68bec01 4080 xdg-user-dirs-gtk_0.11-1.debian.tar.xz Package: xdg-utils Format: 3.0 (quilt) Binary: xdg-utils Architecture: all Version: 1.1.3-4.1ubuntu3 Priority: optional Section: utils Maintainer: Ubuntu Developers Original-Maintainer: Debian freedesktop.org maintainers Uploaders: Per Olofsson , Nicholas Guriev , Standards-Version: 4.5.1 Build-Depends: debhelper-compat (= 12) Build-Depends-Indep: mawk | awk, w3m | links | lynx, xmlto Testsuite: autopkgtest Homepage: https://www.freedesktop.org/wiki/Software/xdg-utils/ Vcs-Browser: https://salsa.debian.org/freedesktop-team/xdg-utils Vcs-Git: https://salsa.debian.org/freedesktop-team/xdg-utils.git Directory: pool/main/x/xdg-utils Package-List: xdg-utils deb utils optional arch=all Files: 5d4f9d74e53f46f50b1e88d3989d8c51 1898 xdg-utils_1.1.3-4.1ubuntu3.dsc 902042508b626027a3709d105f0b63ff 297170 xdg-utils_1.1.3.orig.tar.gz 80f37ec18350fa1d5ba9117f85fddd1c 17136 xdg-utils_1.1.3-4.1ubuntu3.debian.tar.xz Checksums-Sha1: 5b517a98b0a634e40eec6fa50969535ebe3afde8 1898 xdg-utils_1.1.3-4.1ubuntu3.dsc 98294cf332c341b85e481d98e9ea59357fe1efc7 297170 xdg-utils_1.1.3.orig.tar.gz 96c103213d750cc1b3e5260c37074af6a314de2f 17136 xdg-utils_1.1.3-4.1ubuntu3.debian.tar.xz Checksums-Sha256: 1f097d3045b46dd32a90e5338d245cb0a4c852ccfb5a072d950a95dd2a18c0ab 1898 xdg-utils_1.1.3-4.1ubuntu3.dsc d798b08af8a8e2063ddde6c9fa3398ca81484f27dec642c5627ffcaa0d4051d9 297170 xdg-utils_1.1.3.orig.tar.gz bab05dd61e53f3af163868071391094151459b40c77dc572b1f9da89a0e1747f 17136 xdg-utils_1.1.3-4.1ubuntu3.debian.tar.xz Checksums-Sha512: 56fb2976bf7afd9662851028b92134078722d732d4d7af85b6e95bc5554da86e83772a07b9834b7b42a0f6e28e02bcefe9e98948516b0710350e2ae5a4506783 1898 xdg-utils_1.1.3-4.1ubuntu3.dsc d1f819a211eb4104a90dfdc6fedcb640fd46b15ccfc8762266f8f538c49d74cb00027b8c1af991fb2a200acb4379986ae375700e06a2aa08fb41a38f883acb3e 297170 xdg-utils_1.1.3.orig.tar.gz 2c1798d8ddbb684e540fde613f603e8d48e6e61683275e93c37b31a10e2823b7cdbcff41116be9d9a7f1cecfe244d416f25e7c9cd5dbc3f773d99e8cd0827a86 17136 xdg-utils_1.1.3-4.1ubuntu3.debian.tar.xz Testsuite-Triggers: bash, dash, make Package: xf86-input-wacom Format: 3.0 (quilt) Binary: xserver-xorg-input-wacom Architecture: linux-any Version: 1:1.1.0-1ubuntu1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Boyuan Yang Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), libudev-dev, libx11-dev, libxi-dev, libxinerama-dev, libxrandr-dev, pkg-config, xserver-xorg-dev, xutils-dev Homepage: https://linuxwacom.github.io/ Vcs-Browser: https://salsa.debian.org/debian/xf86-input-wacom Vcs-Git: https://salsa.debian.org/debian/xf86-input-wacom.git Directory: pool/main/x/xf86-input-wacom Package-List: xserver-xorg-input-wacom deb x11 optional arch=linux-any Files: d4deb9e5f67fd03dcbe24abb8b75c36c 1812 xf86-input-wacom_1.1.0-1ubuntu1.dsc 2339215dc92b7cbbcbd7cceabc4f384f 645948 xf86-input-wacom_1.1.0.orig.tar.bz2 297bf978e9983f7070362da6e253b1be 195 xf86-input-wacom_1.1.0.orig.tar.bz2.asc 82d812e81e268145d69fecf0b01e6afa 12160 xf86-input-wacom_1.1.0-1ubuntu1.debian.tar.xz Checksums-Sha1: 00a533e34157d258e7397020f03648d04c3ad19a 1812 xf86-input-wacom_1.1.0-1ubuntu1.dsc 63faa93d9bb206ca24396e1450b8f5fcca822547 645948 xf86-input-wacom_1.1.0.orig.tar.bz2 033be9c182e644c2ad4ce01e9de9c7e20798deab 195 xf86-input-wacom_1.1.0.orig.tar.bz2.asc 4e1f586513711b8ea83e3ba451cc8a98906b4c91 12160 xf86-input-wacom_1.1.0-1ubuntu1.debian.tar.xz Checksums-Sha256: 113660eb5ff2778feadabdc207955055e9717275f3d4fad100658230ae41becd 1812 xf86-input-wacom_1.1.0-1ubuntu1.dsc 23b674067f344de22bcbb4bac885c43df54c5e841f6dade7c9d18ba7ce297a12 645948 xf86-input-wacom_1.1.0.orig.tar.bz2 0da1d5a209261e653f4a85faae190f2824755cbab7e6adbc9fc97cd4e1a3b4f7 195 xf86-input-wacom_1.1.0.orig.tar.bz2.asc da63e5accbde32217ba84bad73524e04db6d998bfd4d649dd0a1007f074b5e28 12160 xf86-input-wacom_1.1.0-1ubuntu1.debian.tar.xz Checksums-Sha512: 117307259020021869d65429a0cedaa3e26f6ed6611d45d12f9f8e40dc45e67df7c24723af0ab91d508958a792e9ca142db79d560feb6e9ab58d214300bee459 1812 xf86-input-wacom_1.1.0-1ubuntu1.dsc d4ca8d5ea5e328c6e6b4bdb3d0ca23dee0bdb960e79f4422483d456330f9c88ea7579da4fba192fd250b23d7db1b7f40ad8ef0127f334c580030858edcbb9f4d 645948 xf86-input-wacom_1.1.0.orig.tar.bz2 4c7c55c39a897c409c146b8e52563c002b9a5394931d5665164440cae811d68c70c743766026dfab251a463984ed7855a2d7c30316f4e9e1d51541b847dd473d 195 xf86-input-wacom_1.1.0.orig.tar.bz2.asc 2d6792c1c721d8cf85182b7f1794392e9ac5142c6ae6d496ef5f362f42c3790e63b6751eb1182dcbac235c9e56e42652ab39750728e13938cc2982e93ae56476 12160 xf86-input-wacom_1.1.0-1ubuntu1.debian.tar.xz Package: xfonts-base Format: 1.0 Binary: xfonts-base Architecture: all Version: 1:1.0.5+nmu1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 3.8.3 Build-Depends: debhelper (>= 10.8) Build-Depends-Indep: pkg-config, xfonts-utils, xutils-dev Vcs-Browser: https://salsa.debian.org/xorg-team/font/xfonts-base Vcs-Git: https://salsa.debian.org/xorg-team/font/xfonts-base.git Directory: pool/main/x/xfonts-base Package-List: xfonts-base deb fonts optional arch=all Files: 4d523d6171796d5315a02ebccae79e4b 1759 xfonts-base_1.0.5+nmu1.dsc af8ea4391176863a800c4315e8bd4309 6680462 xfonts-base_1.0.5+nmu1.tar.gz Checksums-Sha1: c9d846d51cd35149e398b90ecd5ebef7c5c836a9 1759 xfonts-base_1.0.5+nmu1.dsc 2dc74052b799a745e806144f4b3345df72315ec5 6680462 xfonts-base_1.0.5+nmu1.tar.gz Checksums-Sha256: 375c7a7b5e905a9964fe6aa22789aeb51f61560ea419b00a94efe508fe38f7fd 1759 xfonts-base_1.0.5+nmu1.dsc d5aec0918e0e7067d6f70cc68f7c8136229ceda0afbcc83ae8a278a9c25bb1e5 6680462 xfonts-base_1.0.5+nmu1.tar.gz Checksums-Sha512: 78e6f1cb79ff6c27df3b9e8adab3dcd245512cb763902f35ca11d6a9089245283ff9852082742124319d5bb5b71fa431584d5f9c48cbca257c0f688f0e77efb4 1759 xfonts-base_1.0.5+nmu1.dsc 76f4e61680a68fe7ab727b1e4084b1ae66ce3b83a0bd9727641ff1ed286541dbfff39654def406310e74b3e17ce6b37223e2a99ae00428cf260cb11b3d291b41 6680462 xfonts-base_1.0.5+nmu1.tar.gz Dgit: 7de660144c2472184aec211ea42e9e3abbb8038f debian archive/debian/1%1.0.5+nmu1 https://git.dgit.debian.org/xfonts-base Package: xfonts-encodings Format: 1.0 Binary: xfonts-encodings Architecture: all Version: 1:1.0.5-0ubuntu2 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 3.8.3 Build-Depends: debhelper (>= 7) Build-Depends-Indep: pkg-config, xfonts-utils (>= 1:7.6~), autoconf, automake, xutils-dev (>= 1:7.5+1) Vcs-Browser: http://git.debian.org/?p=pkg-xorg/font/xfonts-encodings.git Vcs-Git: git://git.debian.org/git/pkg-xorg/font/xfonts-encodings.git Directory: pool/main/x/xfonts-encodings Package-List: xfonts-encodings deb x11 optional arch=all Files: 61d41cb902881bb817101d82c283edb9 1464 xfonts-encodings_1.0.5-0ubuntu2.dsc 49d10bdd1bb53b6051b6c630b627b249 790741 xfonts-encodings_1.0.5.orig.tar.gz dadf7fff0ca72179eaf4482ccfc7fb30 14293 xfonts-encodings_1.0.5-0ubuntu2.diff.gz Checksums-Sha1: 676e0da478bb8a80115d4c5b4450db9955f24c1e 1464 xfonts-encodings_1.0.5-0ubuntu2.dsc f0397607b67abfadc00251d069149fc363890e55 790741 xfonts-encodings_1.0.5.orig.tar.gz 76a6be0d29402234298b857c8e405415d4c395f2 14293 xfonts-encodings_1.0.5-0ubuntu2.diff.gz Checksums-Sha256: ede41e05bf2df0e95f613351013178f406e9041382e5c2abeced162a2f8e10ed 1464 xfonts-encodings_1.0.5-0ubuntu2.dsc 66f524ab53acdd0823265e1b1a894f8652c928ae75a18b39aafd6a2d4a5577b0 790741 xfonts-encodings_1.0.5.orig.tar.gz d946c93b7014c6eacd9a537add008a3a19fce73a01923083978a3c39ab591fb4 14293 xfonts-encodings_1.0.5-0ubuntu2.diff.gz Checksums-Sha512: f4fad2eae6113ed446e02e3ad150a3a6ae12ceda3deca509099732991654d9b24cc5923ecd31db01620fc77699ed264e103827d37651bcdc527a38288e52b675 1464 xfonts-encodings_1.0.5-0ubuntu2.dsc 9e444ebeed0f667eb1a50d226c9953d1b3b55cb15415c4cb32ec33fd081cc62ae7df5e2925cff51d5dd14cdd82c212ba655e81ea5f83a6bf30b3031d38ccc602 790741 xfonts-encodings_1.0.5.orig.tar.gz e8ab10530deea9bca07c98cce0ae8b6bee759902b03ff3bd16f84e9c2b324e1782d1e0bccbfecc1d7302944d15f632748b77dec53e6e9bc803485e7a3508e197 14293 xfonts-encodings_1.0.5-0ubuntu2.diff.gz Package: xfonts-scalable Format: 1.0 Binary: xfonts-scalable Architecture: all Version: 1:1.0.3-1.3 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 3.8.3 Build-Depends: debhelper-compat (= 13), xfonts-utils (>= 1:7.6~), automake, autoconf, xutils-dev (>= 1:7.5+1), pkg-config Vcs-Browser: https://salsa.debian.org/xorg-team/font/xfonts-scalable Vcs-Git: https://salsa.debian.org/xorg-team/font/xfonts-scalable.git Directory: pool/main/x/xfonts-scalable Package-List: xfonts-scalable deb fonts optional arch=all Files: 846d40ebd534f9d676880c1c7dbcebd4 1956 xfonts-scalable_1.0.3-1.3.dsc ff91738c4d3646d7999e00aa9923f2a0 450458 xfonts-scalable_1.0.3.orig.tar.gz e12f5a38ca811383454df5c96670bfca 15014 xfonts-scalable_1.0.3-1.3.diff.gz Checksums-Sha1: fb97d65f0ab461d35a10ce60c7f06d117dacc1b6 1956 xfonts-scalable_1.0.3-1.3.dsc a57248a1c373b527444307b26769ca042febae48 450458 xfonts-scalable_1.0.3.orig.tar.gz e47d842655e79ac612e9b801b32853ab1f7cb9f3 15014 xfonts-scalable_1.0.3-1.3.diff.gz Checksums-Sha256: e3595c5835a9a8f176800deb566738f17996b9a3e24dee604ab1c7b1c8f3ecae 1956 xfonts-scalable_1.0.3-1.3.dsc 3399b7586c18be509cdaeceeebf754b861faa1d8799dda1aae01aeb2a7a30f01 450458 xfonts-scalable_1.0.3.orig.tar.gz ae22605d94fe3d49565e77b7f23d7a89a561c2b5cd93e9764442a7610b00b931 15014 xfonts-scalable_1.0.3-1.3.diff.gz Checksums-Sha512: 66a605aa393afe4ea13c5a12cb17cb72d1cdc375b8fb8f53758cbd1aba6dd37ca5fce7a8868805a6cff13adf563f734c6286945b17279c77bc2bf19c7556a435 1956 xfonts-scalable_1.0.3-1.3.dsc b988030e8d021dba33012b66bd0b98470c0e7232ea101af205c8165b84671133e8b558a3e6b133f3c6355e00d8b504ee8294485a23a978085ba405a8565c98c9 450458 xfonts-scalable_1.0.3.orig.tar.gz 559ccbab39c3cb8f84601ad05a0ddc955e6738030207e22424e27242c8c4366c5d0c0179a8fb658196b38b5b36429c89d092ded6a610f12ae6d59398ea737fc4 15014 xfonts-scalable_1.0.3-1.3.diff.gz Package: xfonts-utils Format: 1.0 Binary: xfonts-utils Architecture: any Version: 1:7.7+6build2 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 3.9.2 Build-Depends: debhelper (>= 9), pkg-config, quilt, autotools-dev, libx11-dev (>= 2:1.0.0), x11proto-core-dev (>= 7.0.25), libfreetype6-dev, libfontenc-dev, xutils-dev (>= 1:7.5+4), x11proto-fonts-dev Vcs-Browser: https://salsa.debian.org/xorg-team/font/xfonts-utils Vcs-Git: https://salsa.debian.org/xorg-team/font/xfonts-utils Directory: pool/main/x/xfonts-utils Package-List: xfonts-utils deb x11 optional arch=any Files: 03f3dbe76d554bd448315964f5d630c0 1856 xfonts-utils_7.7+6build2.dsc 43d10d5dc6e78a60056e4cee743c1aa2 846921 xfonts-utils_7.7+6build2.tar.gz Checksums-Sha1: 780b208bd3aaeb905ab04d56a946952218c112bc 1856 xfonts-utils_7.7+6build2.dsc f9d795c614a9c12b6603aa0988186cfda1f2c175 846921 xfonts-utils_7.7+6build2.tar.gz Checksums-Sha256: 16778227083df129ae04d7dbaaf5b61d8e35bfa4e7da13ca0dd957b36b707062 1856 xfonts-utils_7.7+6build2.dsc afc12fd9c2719b3544d8b3d71415060062dc271b1f26589f2c00698b58ca886e 846921 xfonts-utils_7.7+6build2.tar.gz Checksums-Sha512: 28fb48af69f33401a5665c2a5891d49dca1cb1706a251f1b4dd0585bba4b366d280cd6412164318ae61b1b7cb9fbe1386e0ffee657aa7cf50baceb75f760a6ee 1856 xfonts-utils_7.7+6build2.dsc fc382af3b2432edd786e022882cae5391bf770def2ed2e4723de8623f572807d7ad99c49911fe90ddd5a1bc792033df985c694b29d5b940ffc830df30cf5f704 846921 xfonts-utils_7.7+6build2.tar.gz Package: xfsdump Format: 3.0 (quilt) Binary: xfsdump Architecture: any Version: 3.1.11-0.1 Priority: optional Section: admin Maintainer: Nathan Scott Uploaders: Anibal Monsalve Salazar Standards-Version: 3.8.1 Build-Depends: xfslibs-dev (>= 3.0.0), uuid-dev, libattr1-dev (>= 2.4.14), libncurses-dev, autoconf, debhelper (>= 5), gettext, libtool, autotools-dev Directory: pool/main/x/xfsdump Package-List: xfsdump deb admin optional arch=any Files: 9307f35ad0934cc60cb78cd604f01a96 1692 xfsdump_3.1.11-0.1.dsc 917ab38a6fa76d8f98bcf596cb1895e8 862337 xfsdump_3.1.11.orig.tar.gz 2fbb9c6a3ceaf748de5c4af83b5f3aa4 5272 xfsdump_3.1.11-0.1.debian.tar.xz Checksums-Sha1: 6e94c3bff5fdf684c7b8e8a447057677e4cbeefa 1692 xfsdump_3.1.11-0.1.dsc f65f48b194cc52691d2fdbe957ddd565e1f51ac7 862337 xfsdump_3.1.11.orig.tar.gz b67fd8f988dc1fd7155ff7705f743d411f8d7805 5272 xfsdump_3.1.11-0.1.debian.tar.xz Checksums-Sha256: bb0f4a762f9a5af7bf6d6929bc9f053abf3c85a2c1c9ede2e5105ba52f5d99a0 1692 xfsdump_3.1.11-0.1.dsc 62923283bb1af849eabba6de71b9f24b09c4ac652fcbc03f902d75332bc22e9a 862337 xfsdump_3.1.11.orig.tar.gz 912466e4a34458012530acbac289a71f80a3b8792b9ac61d4a5d75ab2aca58f9 5272 xfsdump_3.1.11-0.1.debian.tar.xz Checksums-Sha512: 8baf1dfc52c27bda5f045c30434bd92c1fc51c928a50499d6a9c4167e31e52a8094c0dd8a6c7c90e8ae28d17f75666066011a36ec6834f814b83d0ab2205e161 1692 xfsdump_3.1.11-0.1.dsc 986dd18bac5924bfa0fc85fd53b7c01fb4f361cf54a0b96b9096585f540c9e48aab798cadb5e4f2d377b64db5878f4dd3a0c42f9683bb3d81f5080b886a8781f 862337 xfsdump_3.1.11.orig.tar.gz a34d6ef1735a46b73afb399b2e4952d6729ae85ddd699b63f715cab0ec280f0f175529e5ace807f09e9598bc3d52ba07cfcc450f30ee0c0b14202119b913d96a 5272 xfsdump_3.1.11-0.1.debian.tar.xz Package: xfsprogs Format: 3.0 (quilt) Binary: xfsprogs, xfslibs-dev, xfsprogs-udeb Architecture: linux-any Version: 6.1.0-1ubuntu1 Priority: optional Section: admin Maintainer: Ubuntu Developers Original-Maintainer: XFS Development Team Uploaders: Nathan Scott , Anibal Monsalve Salazar , Bastian Germann Standards-Version: 4.0.0 Build-Depends: libinih-dev (>= 53), uuid-dev, dh-autoreconf, debhelper (>= 5), gettext, libtool, libedit-dev, libblkid-dev (>= 2.17), linux-libc-dev, libdevmapper-dev, libattr1-dev, libicu-dev, pkg-config, liburcu-dev Homepage: https://xfs.wiki.kernel.org/ Directory: pool/main/x/xfsprogs Package-List: xfslibs-dev deb libdevel optional arch=linux-any xfsprogs deb admin optional arch=linux-any xfsprogs-udeb udeb debian-installer optional arch=linux-any Files: 619714277f0bc7e923abc59643ae4046 2117 xfsprogs_6.1.0-1ubuntu1.dsc 267f09f8b2b0c286d49693841f48400c 1322908 xfsprogs_6.1.0.orig.tar.xz 4f55440268c7b15b525f2f902ecb8a46 14076 xfsprogs_6.1.0-1ubuntu1.debian.tar.xz Checksums-Sha1: 7ce23464df370cf69b02ddd307246101e077ce99 2117 xfsprogs_6.1.0-1ubuntu1.dsc 1df880341fe1280ffafae5c387ba01720ae0fd12 1322908 xfsprogs_6.1.0.orig.tar.xz 2299551ec67f418f1ab83c3e3d6c61b3b7648c55 14076 xfsprogs_6.1.0-1ubuntu1.debian.tar.xz Checksums-Sha256: 22146f54ef28ae650923b4f03cf30d3c3b5feb5041dcd4036569645d209f224e 2117 xfsprogs_6.1.0-1ubuntu1.dsc eceb9015c4ebefa56fa85faff756ccb51ed2cf9c39ba239767f8e78705e85251 1322908 xfsprogs_6.1.0.orig.tar.xz 6deb0df56c59fdfb7e6bab9ad9c5d56029b2b4e42b23f7f98263fa34235eb7e1 14076 xfsprogs_6.1.0-1ubuntu1.debian.tar.xz Checksums-Sha512: 42346eae83464fd495bb130bb4fc51a5b8f3516d56ba61f0bfc9b7a3c1fabf3c1ddab4b33eb33fd1131289e689884e49d09a33ff110482a772c7f90186928cf6 2117 xfsprogs_6.1.0-1ubuntu1.dsc 6b6896ea2312836642fc3536aa47c1b96074c495dfa5876ebf06370f8b64d36df6149798153f86bb6ba3fde54354694f74ee72446dd4c6ab509013d82d25e8b0 1322908 xfsprogs_6.1.0.orig.tar.xz 980df1e7e1471bb824b9324d933c6077ee2555c595144f499914aabe9babd0d7afecf731e3266c18a37e6616d40d1242b77c71551314368669e217dbf833ab1c 14076 xfsprogs_6.1.0-1ubuntu1.debian.tar.xz Package: xft Format: 1.0 Binary: libxft2, libxft2-udeb, libxft-dev Architecture: any Version: 2.3.6-1 Priority: optional Section: devel Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), libfontconfig1-dev, libfreetype6-dev, libx11-dev (>= 2:1.3.3-2), libxrender-dev (>= 1:0.9.5-2), zlib1g-dev | libz-dev, quilt, xutils-dev (>= 1:7.5+4) Vcs-Browser: https://salsa.debian.org/xorg-team/lib/xft Vcs-Git: https://salsa.debian.org/xorg-team/lib/xft Directory: pool/main/x/xft Package-List: libxft-dev deb libdevel optional arch=any libxft2 deb libs optional arch=any libxft2-udeb udeb debian-installer optional arch=any Files: ada6686e1dca9fd4f9c4dc063b4a0eb8 2006 xft_2.3.6-1.dsc 59f23d3b150a2c3f8a691997da905663 447498 xft_2.3.6.orig.tar.gz 1ce97c9f0afbf1c63da29c862a828dc1 17995 xft_2.3.6-1.diff.gz Checksums-Sha1: 25964f1c731e8827baf6f8c3a58ddf25c339a59a 2006 xft_2.3.6-1.dsc b07e4b6c9d22d91a3544728bf4d8bd64a12bf03c 447498 xft_2.3.6.orig.tar.gz 26bb9a20713fa6853d55b4712bcf7070f36e9970 17995 xft_2.3.6-1.diff.gz Checksums-Sha256: 252220495bd12fac30d8f1b1994916beaed9c5149138dcc62e230fee17339530 2006 xft_2.3.6-1.dsc b7e59f69e0bbabe9438088775f7e5a7c16a572e58b11f9722519385d38192df5 447498 xft_2.3.6.orig.tar.gz 9d4c64fc52626134a3f753df88fceaba0cb460bd9b56544f0e42178deca77019 17995 xft_2.3.6-1.diff.gz Checksums-Sha512: 701e98ed66c560422e40f21b1fec9c71d1f80ab9be2e88441d55fc9204ece2791f44e9af0144f1a5290606fb264cdc248c557b61d97a4a849604534b347240b4 2006 xft_2.3.6-1.dsc 291bec2cc297a6e39baff5c2dec37017f37f97b438468a6d6b66f496a9987936da6ee2e3ace77e4527d8c5fd09e1dd731b2f042fa74880f667b8a03a913512d2 447498 xft_2.3.6.orig.tar.gz a31b78e7c273a53b89209b4ec54498d539594adc02cb54773b9aedd20435fb89c0b3879f6fdd8908516ed5897a2653b880ace41d7ad932b00e33de91f267d91b 17995 xft_2.3.6-1.diff.gz Package: xinit Format: 1.0 Binary: xinit Architecture: any Version: 1.4.1-0ubuntu4 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 3.9.6 Build-Depends: debhelper (>= 9), dh-autoreconf, pkg-config, libx11-dev (>= 2:1.0.0), quilt, automake, x11proto-core-dev (>= 7.0.17), xutils-dev (>= 1:7.7+3) Vcs-Browser: https://salsa.debian.org/xorg-team/app/xinit Vcs-Git: https://salsa.debian.org/xorg-team/app/xinit.git Directory: pool/main/x/xinit Package-List: xinit deb x11 optional arch=any Files: 18f83cbfe81d6742752e8573d3a17cfc 2003 xinit_1.4.1-0ubuntu4.dsc a2cb5a85e221901703f85ee343ed3662 223315 xinit_1.4.1.orig.tar.gz 30419ce59bfdb09c6964df05924b29c5 21991 xinit_1.4.1-0ubuntu4.diff.gz Checksums-Sha1: 47a12e440ee8d0365cd6f653f4a1dc2ae103d629 2003 xinit_1.4.1-0ubuntu4.dsc 32f092505dc4576fcf814025933d0785c2f9e6dd 223315 xinit_1.4.1.orig.tar.gz 99636e266d45e5c42933a53399bd10c06b6d2d6a 21991 xinit_1.4.1-0ubuntu4.diff.gz Checksums-Sha256: 7dce168f05d6b22aa3f7c0741bd5f4b9de52fd1b007d08ed5bdc8954ab2ac6cf 2003 xinit_1.4.1-0ubuntu4.dsc ca33ec3de6c39589c753620e5b3bcbc8277218b949bfa2df727779b03a8d2357 223315 xinit_1.4.1.orig.tar.gz 5140d0b84662bce097ced91e4a5a283c09aa81b9f660ca05d9c4009d0d816f1b 21991 xinit_1.4.1-0ubuntu4.diff.gz Checksums-Sha512: a3f9b91cb49d1d2a0e892be27a9d1b75f640d7f700560948fec763890e64d20e503ca0ac3f200287ef0b160f281a26d264323e731d58968ed8950bbc1b599ef3 2003 xinit_1.4.1-0ubuntu4.dsc c228c910b09eafc4a6bb7450c6d3431daaba56389c1a3fee3755fbea13a4a9056964f43bb664d18ba933b21dc8d50997591edf67da4d9890881b0b5263796da2 223315 xinit_1.4.1.orig.tar.gz c9b456ca7907a35067d708cda4e436cd9fa9d41812430bc7006d5aa291077491023ab1d9eede2c61c8eddea2973919be2e9ff010df61bff7c917f3f4d701e9fd 21991 xinit_1.4.1-0ubuntu4.diff.gz Package: xinput Format: 1.0 Binary: xinput Architecture: any Version: 1.6.3-1build2 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), libx11-dev, libxi-dev (>= 2:1.5.99.1), libxext-dev, libxinerama-dev, libxrandr-dev, x11proto-input-dev (>= 2.1.99.1), pkg-config, xutils-dev Vcs-Browser: https://salsa.debian.org/xorg-team/app/xinput Vcs-Git: https://salsa.debian.org/xorg-team/app/xinput.git Directory: pool/main/x/xinput Package-List: xinput deb x11 optional arch=any Files: 0bd01331e50b011a47ffee8ec4509214 2272 xinput_1.6.3-1build2.dsc 7d1562909e0a32225671b425ba6f7a39 203936 xinput_1.6.3.orig.tar.gz 7518b638f45f3e6da71c10372fa10988 195 xinput_1.6.3.orig.tar.gz.asc abf01f76c3f2da1b7e12c1a1ffeea911 7224 xinput_1.6.3-1build2.diff.gz Checksums-Sha1: a1e5485b5d4576073d689210bf8bf22302c9ef62 2272 xinput_1.6.3-1build2.dsc 6fed797704eaba52a7220dd8cdc32142df1a60b9 203936 xinput_1.6.3.orig.tar.gz 0d647b84cfe4ab4f38923db107fd0e5b56f06a5c 195 xinput_1.6.3.orig.tar.gz.asc 4bcb1f654da3d1da6fe6cdb779855af04ea31a0b 7224 xinput_1.6.3-1build2.diff.gz Checksums-Sha256: 5a3f28004616902b0e0425a8cc568994865cd28760dbcd8fb27120325bb0be50 2272 xinput_1.6.3-1build2.dsc 9f29f9bfe387c5a3d582f9edc8c5a753510ecc6fdfb154c03b5cea5975b10ce4 203936 xinput_1.6.3.orig.tar.gz a51c84393cf951e3157e4202385157ada392de9657c1d4b1f7f2f260cba839da 195 xinput_1.6.3.orig.tar.gz.asc 54fb0fd417aa9e0f51de1a89bf22541d4cd9b55b290e66b37530c59f49165e9b 7224 xinput_1.6.3-1build2.diff.gz Checksums-Sha512: 777c26d702f8727952eff83475ee757a662ea01f08d4da9237e4ebc3f80d2f49d8bcdd9d102ad40a4c0fa617901c67a143b131714402dd710a1f7c761d01f41e 2272 xinput_1.6.3-1build2.dsc f2d61288b87505add5909aace7d51d99f5c7b1a8fad5475316da371f74d5b616ae261660c81851bec595c5d716fead3e40d8fc0cc7d2234c2b04db2b24e25da8 203936 xinput_1.6.3.orig.tar.gz 6a459af044b3001cc95d16412b6232c1fe6f5f6fc86201964e264c7d008d6b19a4692151299893a1fdeadb7e09e27ba313fb14e5f1c7f120b6c3f7a102c5317c 195 xinput_1.6.3.orig.tar.gz.asc 58a4bc4c35a7d63d552955ab38ac381029d1732fa699387d8670a8861a99b0864800d524ff9822871688b8068292049061186fb90739a2270192efc3b63bc7f4 7224 xinput_1.6.3-1build2.diff.gz Package: xkeyboard-config Format: 1.0 Binary: xkb-data, xkb-data-udeb Architecture: all Version: 2.38-0ubuntu1 Priority: important Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), meson, quilt Build-Depends-Indep: gettext-base, libxml-parser-perl, x11-xkb-utils, libglib2.0-dev, xsltproc, xutils-dev (>= 1:7.6+2) Homepage: https://www.freedesktop.org/Software/XKeyboardConfig Vcs-Browser: https://salsa.debian.org/xorg-team/data/xkeyboard-config Vcs-Git: https://salsa.debian.org/xorg-team/data/xkeyboard-config.git Directory: pool/main/x/xkeyboard-config Package-List: xkb-data deb x11 optional arch=all xkb-data-udeb udeb debian-installer optional arch=all Files: 78beae2563a60c995891a204a9b261bb 1881 xkeyboard-config_2.38-0ubuntu1.dsc e718d67048fdb24ee7edb7cb57d99df9 1662066 xkeyboard-config_2.38.orig.tar.gz 7d74fde5ee87a742d995c76dae7fc35d 17940 xkeyboard-config_2.38-0ubuntu1.diff.gz Checksums-Sha1: 4491d632431f62633e5bbc28ba0260c06fb4884f 1881 xkeyboard-config_2.38-0ubuntu1.dsc ed434bc146c616660a72415b24b69dfbf608a6eb 1662066 xkeyboard-config_2.38.orig.tar.gz 3039e6fdd4f6b027725167702a3dd36f569f3b97 17940 xkeyboard-config_2.38-0ubuntu1.diff.gz Checksums-Sha256: 1e975a5b1a9ee5c195f1353a72fadcd930b2d130c791de0ef7f6f3ba6947fde7 1881 xkeyboard-config_2.38-0ubuntu1.dsc b693c30cc6c8b26c2fb566113489161445ea41f54a0325312568a0d5309fddfe 1662066 xkeyboard-config_2.38.orig.tar.gz 4344f72f28166826edcd99dd25e1397fb17568eb0ee0f3f914aeab219f1717ea 17940 xkeyboard-config_2.38-0ubuntu1.diff.gz Checksums-Sha512: 313eabe07351210964c583c35ebf88fd48bb617bf3f1aef0c23fbcefdaf8b178bf8be7ab1f408dae804e701dde75e75799edcedb841076efcb7b4c44f770e060 1881 xkeyboard-config_2.38-0ubuntu1.dsc 44ab42d3086aa98dd4ce63d2dc874d9ede9d29953322fe4067dc65c95c2ac371dff17ae2207d3e564384a455abd70aec01558d3f77e44416e3272563b2fad533 1662066 xkeyboard-config_2.38.orig.tar.gz 1e2835d25aab7b3b5b422033e7882c43ff87ca2f769de456df7af44dae569e0f3e16acde7e9a47fc3f91789026b95e1e297eb6ac5373ee4b7bb30a8ff39e8392 17940 xkeyboard-config_2.38-0ubuntu1.diff.gz Package: xml-core Format: 3.0 (native) Binary: xml-core Architecture: all Version: 0.18+nmu1 Priority: optional Section: text Maintainer: Debian XML-SGML group Uploaders: Joseph Herlant Standards-Version: 4.3.0 Build-Depends: debhelper-compat (= 12) Build-Depends-Indep: perl Vcs-Browser: https://salsa.debian.org/xml-sgml-team/xml-core Vcs-Git: https://salsa.debian.org/xml-sgml-team/xml-core.git Directory: pool/main/x/xml-core Package-List: xml-core deb text optional arch=all Files: b8f806f5e9b4c4ebe867c3ab70f01d91 1632 xml-core_0.18+nmu1.dsc 9ad79379414efcd26c3d81236c11343b 21312 xml-core_0.18+nmu1.tar.xz Checksums-Sha1: 6b5edf3d8d0f6687e45f22fc287618fcc1fbf152 1632 xml-core_0.18+nmu1.dsc 8b794e500dead39f60ab95f1e181370e7a28fcb8 21312 xml-core_0.18+nmu1.tar.xz Checksums-Sha256: 3b4bc034193f99750141611ae1c836c6b742c88ed0af1420051f3fcae30bf5ae 1632 xml-core_0.18+nmu1.dsc 3e07592404b8ac38924fb650227cf5c9dcfc9933bd632eb4430635cd54898471 21312 xml-core_0.18+nmu1.tar.xz Checksums-Sha512: 1c3a335850618902a71478ee26136848e7de12f1ec090cca0598d1a2e4810f3fa5b97d65fd058752e904c1073a36785bef3b088ce34623de290e3c80c971b69b 1632 xml-core_0.18+nmu1.dsc 568a3e73acb64db8074e88813a6f64c9839a92e9afba6bbb90e5852e2cc6565636e380ba87fec6d29aa6b4eaa896131ef2d404ed3811443a4df1c6bdb3d1545b 21312 xml-core_0.18+nmu1.tar.xz Package: xmlsec1 Format: 3.0 (quilt) Binary: libxmlsec1-dev, libxmlsec1, libxmlsec1-openssl, libxmlsec1-gnutls, libxmlsec1-nss, libxmlsec1-gcrypt, xmlsec1, libxmlsec1-doc Architecture: any all Version: 1.2.37-2 Priority: optional Section: text Maintainer: Debian XML/SGML Group Uploaders: John V. Belmonte , Rene Engelhard , Standards-Version: 4.1.4 Build-Depends: debhelper (>= 11), help2man, libgcrypt20-dev, libgnutls28-dev, libnss3-dev (>= 2:3.72-2), libssl-dev, libxml2-dev, libxslt1-dev, pkg-config Build-Depends-Indep: gtk-doc-tools, man2html-base, xsltproc Build-Conflicts: libnspr4-dev (<< 2:4.32-3) Homepage: https://www.aleksey.com/xmlsec/ Vcs-Browser: https://salsa.debian.org/xml-sgml-team/xmlsec1 Vcs-Git: https://salsa.debian.org/xml-sgml-team/xmlsec1.git Directory: pool/main/x/xmlsec1 Package-List: libxmlsec1 deb libs optional arch=any libxmlsec1-dev deb libdevel optional arch=any libxmlsec1-doc deb text optional arch=all libxmlsec1-gcrypt deb libs optional arch=any libxmlsec1-gnutls deb libs optional arch=any libxmlsec1-nss deb libs optional arch=any libxmlsec1-openssl deb libs optional arch=any xmlsec1 deb text optional arch=any Files: ed9bb5093dd4c77a2e4e217432df47e6 2634 xmlsec1_1.2.37-2.dsc c670563de88cf7455a8036650fbec584 2039332 xmlsec1_1.2.37.orig.tar.gz 0081ca72edf2f37557cd48cfa90b69dc 14348 xmlsec1_1.2.37-2.debian.tar.xz Checksums-Sha1: 920132e366e9b3e24786ba69318232d006900355 2634 xmlsec1_1.2.37-2.dsc fa6bb084fe201d5279455eb0da230cbc7d36cd7a 2039332 xmlsec1_1.2.37.orig.tar.gz f19f1485d8e6f2dd1ff3fddde0f482a33b4273c3 14348 xmlsec1_1.2.37-2.debian.tar.xz Checksums-Sha256: f3f22ab92762d66f605bf8567c0ea813cd8b0355c7dbc1dffcfb0e29167fb5ca 2634 xmlsec1_1.2.37-2.dsc a75ba7aa698ebb6e1a7ed914896de27888c4f5cdf549cc0856e31585b4110c3c 2039332 xmlsec1_1.2.37.orig.tar.gz 00f3452ddfb7a24763e6cf7323457a9f5fc757258e6dd1e13e9904c462e6b04e 14348 xmlsec1_1.2.37-2.debian.tar.xz Checksums-Sha512: 28bda9ab93d3f5fc25d73641af0f0f93f8efbf6ac03b42a550322542c2155dac68693ca9e9ecd96fd1614cbc00e9f6000e7a8b3fbed1d42c8df60834c06d8215 2634 xmlsec1_1.2.37-2.dsc 80c431ddf24fdce26952e875c0779651ab498c2532b5627bd3e911d5ee5f5430db216918a354e4f6026a6a712634800a2969c4e0801aeb101bb1a0726df44777 2039332 xmlsec1_1.2.37.orig.tar.gz 42d1ce27bf8e520d79c4bd3cc263aab93f3b718612ad57ca3e445061d13e9618c96cecda26c62bc1900aee984f1102dd8f8400816de804628dec46a58dc93235 14348 xmlsec1_1.2.37-2.debian.tar.xz Package: xorg Format: 1.0 Binary: x11-common, xserver-xorg, xserver-xorg-video-all, xserver-xorg-input-all, xorg, xorg-dev, xbase-clients, xutils Architecture: any all Version: 1:7.7+23ubuntu2 Priority: optional Section: x11 Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: dpkg (>= 1.16.1), debhelper-compat (= 12), po-debconf, asciidoc Homepage: https://www.x.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/debian/xorg Vcs-Git: https://salsa.debian.org/xorg-team/debian/xorg Directory: pool/main/x/xorg Package-List: x11-common deb x11 optional arch=all xbase-clients deb x11 optional arch=all xorg deb x11 optional arch=any xorg-dev deb x11 optional arch=all xserver-xorg deb x11 optional arch=any xserver-xorg-input-all deb x11 optional arch=any xserver-xorg-video-all deb x11 optional arch=any xutils deb x11 optional arch=all Files: 963a8a0d396589d1579225c28fd6cb10 2095 xorg_7.7+23ubuntu2.dsc 0b77fe705b06bcb3db5a612c9c8c43ce 301762 xorg_7.7+23ubuntu2.tar.gz Checksums-Sha1: 1bb45736786fdd136762456191f97a62134d9962 2095 xorg_7.7+23ubuntu2.dsc b413b847d747693b5ecf36ff1f1e2cd0e557335f 301762 xorg_7.7+23ubuntu2.tar.gz Checksums-Sha256: 60fde2e08a27c61f46320a1ccf057ab4fdd983e08c9ab5b603b010259514deb0 2095 xorg_7.7+23ubuntu2.dsc cc30e97fee09a9a8db16931e9eb8b39c37e0699136a8a8d31898ae414a3c4f74 301762 xorg_7.7+23ubuntu2.tar.gz Checksums-Sha512: f4befc0dd73c66f56856f16c4dc4051f58af50bd8819469df4bb309817952e00f2f4e29776282f85eeaef18a77fdd42cb1cfcb9a69432c4680b216039b37e480 2095 xorg_7.7+23ubuntu2.dsc 379e60ab57cc4f9adbf1f59295fca3930bbd638f4100d08c9f1f78bd6ef063e3396385b841e66389771c4ba5825875d738b9aa4b4dc2e3f79d0537415ac0852a 301762 xorg_7.7+23ubuntu2.tar.gz Package: xorg-docs Format: 1.0 Binary: xorg-docs-core, xorg-docs Architecture: all Version: 1:1.7.1-1.2 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 3.9.6 Build-Depends: debhelper (>= 9), dh-autoreconf, quilt, pkg-config, xorg-sgml-doctools (>= 1:1.8), docbook-xml, automake, autoconf, xutils-dev (>= 1:7.6+2), xmlto (>= 0.0.22), fop, w3m Vcs-Browser: https://anonscm.debian.org/cgit/pkg-xorg/doc/xorg-docs.git Vcs-Git: git://anonscm.debian.org/git/pkg-xorg/doc/xorg-docs Directory: pool/main/x/xorg-docs Package-List: xorg-docs deb doc optional arch=all xorg-docs-core deb doc optional arch=all Files: a28474b1deba03421e420dafda44e2a8 2015 xorg-docs_1.7.1-1.2.dsc ca689ccbf8ebc362afbe5cc5792a4abd 499355 xorg-docs_1.7.1.orig.tar.gz e85d4735b97cf5588997397e82b65c5a 13228 xorg-docs_1.7.1-1.2.diff.gz Checksums-Sha1: d3d3a74e97ce3d110ab5e507d969fd9ef0cd9f4c 2015 xorg-docs_1.7.1-1.2.dsc 87abe9a03806c63a4bf3797610e7a3c30a0b9cda 499355 xorg-docs_1.7.1.orig.tar.gz d3734bd3910a6b74fb3bc8889669b905a1397261 13228 xorg-docs_1.7.1-1.2.diff.gz Checksums-Sha256: 18e6b7b6031a86d4cb87715accf935a8c6b1468b99933c9ac76b14f0708b8946 2015 xorg-docs_1.7.1-1.2.dsc 360707db2ba48f6deeb53d570deca9fa98218af48ead4a726a67f63e3ef63816 499355 xorg-docs_1.7.1.orig.tar.gz 6610cc936c174ce4934ec00183feda0143b8adb0ab360395524b9c8f4a09f73e 13228 xorg-docs_1.7.1-1.2.diff.gz Checksums-Sha512: 197dbc91959fb6cb3d5465cd33a123f87ca07c3a8f7f83c03d9adeda156a735cae46d04b20d66d001aced06ea8b3ed9464bdd3cc8c1112652c4066395c521d83 2015 xorg-docs_1.7.1-1.2.dsc cf8b409fcdc724bcce21370a43010964e88a1209fd51e7495343ec2e305e7bab2e0a5f075bee8aac997020653d1be95c7b9cf2c649605d27e1a61938bd18854f 499355 xorg-docs_1.7.1.orig.tar.gz a1301a67111e0865aa908725c014dec9d5d8b3666005b64dd78ea762e9ed0aad060723b8bbd75d11241e8b0b21691e97289abeddc40bcdd151a44aa45179e202 13228 xorg-docs_1.7.1-1.2.diff.gz Package: xorg-server Format: 1.0 Binary: xserver-xorg-core, xserver-xorg-core-udeb, xserver-xorg-dev, xnest, xvfb, xserver-xephyr, xserver-common, xorg-server-source, xserver-xorg-legacy Architecture: any all Version: 2:21.1.6-1ubuntu1 Priority: optional Section: x11 Maintainer: Ubuntu X-SWAT Original-Maintainer: Debian X Strike Force Standards-Version: 3.9.8 Build-Depends: debhelper-compat (= 12), po-debconf, quilt, pkg-config, bison, flex, xauth, xutils-dev (>= 1:7.6+4), xfonts-utils (>= 1:7.5+1), x11proto-dev (>= 2021.5), xtrans-dev (>= 1.3.5), libxau-dev (>= 1:1.0.5-2), libxcvt-dev, libxdmcp-dev (>= 1:0.99.1), libxfont-dev (>= 1:2.0.1), libxkbfile-dev (>= 1:0.99.1), libpixman-1-dev (>= 0.27.2), libpciaccess-dev (>= 0.12.901), libgcrypt-dev, nettle-dev, libudev-dev (>= 151-3) [linux-any], libselinux1-dev (>= 2.0.80) [linux-any], libaudit-dev [linux-any], libdrm-dev (>= 2.4.107-5~) [!hurd-i386], libgl1-mesa-dev (>= 9.2), mesa-common-dev, libunwind-dev [amd64 arm64 armel armhf hppa i386 ia64 mips64 mips64el mipsel powerpc powerpcspe ppc64 ppc64el sh4], libxmuu-dev (>= 1:0.99.1), libxext-dev (>= 1:0.99.1), libx11-dev (>= 2:1.6), libxrender-dev (>= 1:0.9.0), libxi-dev (>= 2:1.8), libxpm-dev (>= 1:3.5.3), libxaw7-dev (>= 1:0.99.1), libxt-dev (>= 1:0.99.1), libxmu-dev (>= 1:0.99.1), libxtst-dev (>= 1:0.99.1), libxres-dev (>= 1:0.99.1), libxfixes-dev (>= 1:3.0.0), libxv-dev, libxinerama-dev, libxshmfence-dev (>= 1.1) [!hurd-i386], libepoxy-dev (>= 1.5.4) [linux-any kfreebsd-any], libegl1-mesa-dev [linux-any kfreebsd-any], libgbm-dev (>= 10.2) [linux-any kfreebsd-any], libx11-xcb-dev, libxcb1-dev, libxcb-xkb-dev, libxcb-shape0-dev, libxcb-render0-dev, libxcb-render-util0-dev, libxcb-util0-dev, libxcb-image0-dev, libxcb-icccm4-dev, libxcb-shm0-dev, libxcb-keysyms1-dev, libxcb-randr0-dev, libxcb-xv0-dev, libxcb-glx0-dev, libxcb-xf86dri0-dev (>= 1.6), xkb-data, x11-xkb-utils, libbsd-dev, libdbus-1-dev (>= 1.0) [linux-any], libsystemd-dev [linux-any], libffi-dev Build-Depends-Indep: xz-utils Homepage: https://www.x.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/xserver/xorg-server Vcs-Git: https://salsa.debian.org/xorg-team/xserver/xorg-server.git Directory: pool/main/x/xorg-server Package-List: xnest deb x11 optional arch=any xorg-server-source deb x11 optional arch=all xserver-common deb x11 optional arch=all xserver-xephyr deb x11 optional arch=any xserver-xorg-core deb x11 optional arch=any xserver-xorg-core-udeb udeb debian-installer optional arch=any profile=!noudeb xserver-xorg-dev deb x11 optional arch=any xserver-xorg-legacy deb x11 optional arch=any xvfb deb x11 optional arch=any Files: 24df3258e124309bff158250a2d2a045 4344 xorg-server_21.1.6-1ubuntu1.dsc be772aaebe95efd46cf893df925d1146 8977302 xorg-server_21.1.6.orig.tar.gz a35364e666d080b84c3c39c876d44562 195 xorg-server_21.1.6.orig.tar.gz.asc 909a80a3e72f5229ccb3505708e1ca29 228661 xorg-server_21.1.6-1ubuntu1.diff.gz Checksums-Sha1: 19e59847971dcb622151b9090f90e6dd7c0741ba 4344 xorg-server_21.1.6-1ubuntu1.dsc 36c26ae5d701a9463384d039551a18e6c31088a7 8977302 xorg-server_21.1.6.orig.tar.gz 234cc0c7d7d11a796fd0ff20df3b0e6be3e625f1 195 xorg-server_21.1.6.orig.tar.gz.asc 75cafee1cc15dfdab6a3932020deae02161b1732 228661 xorg-server_21.1.6-1ubuntu1.diff.gz Checksums-Sha256: fa862d5334ffe77f255e8517dc8e50253a0f1d02dc873fc9a0f3feacd367fc84 4344 xorg-server_21.1.6-1ubuntu1.dsc 6f9c73ccc50e2731adac17671c8e33687738c8cd556b49ecb9f410ce7217be11 8977302 xorg-server_21.1.6.orig.tar.gz 36baeb500286dc6e4bac35be11a8902c91c50f4e966753924c398346ff8a741d 195 xorg-server_21.1.6.orig.tar.gz.asc 37e013992ef90aede93fc371933988f22410acc4cfd73c52efaaec417dd17ac5 228661 xorg-server_21.1.6-1ubuntu1.diff.gz Checksums-Sha512: af42be6bd67952d1247307161917afa21dba6ec11f864c693b5f2b13aa73e4d38df30f8de89b5c855a16715d2612f5bf54d7d39509d343fd52f58f5212072728 4344 xorg-server_21.1.6-1ubuntu1.dsc 4f87e7837b66c24c1e04a82c252dfef83a49a8886c9e2b23f6fecb5eb1c7fa4aaadc6802e0f0dc13ecb5eef324e966ccccda0c182bf04824876f69508e282bac 8977302 xorg-server_21.1.6.orig.tar.gz 9fb4699c8818d8f390af2fe3dc6c877159322e6222d84bd07816253d3acdd4d25f9ac7f1e7a877feac2f8eebd345bdf640310c9125e0eb6a6ff814032edcd968 195 xorg-server_21.1.6.orig.tar.gz.asc f39098fef5afa8b473fce1190ff00bd98f2efee694683183bc75eaedd148298375352f7a9e081e28109a7f1c6ff1a33072968c78099c37cf3515a38cd85329c4 228661 xorg-server_21.1.6-1ubuntu1.diff.gz Package: xorg-sgml-doctools Format: 1.0 Binary: xorg-sgml-doctools Architecture: all Version: 1:1.11-1.1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Uploaders: Cyril Brulebois Standards-Version: 3.9.1 Build-Depends: debhelper (>= 8), dh-autoreconf, quilt, pkg-config, xutils-dev (>= 1:7.5+4) Vcs-Browser: http://git.debian.org/?p=pkg-xorg/doc/xorg-sgml-doctools.git Vcs-Git: git://git.debian.org/git/pkg-xorg/doc/xorg-sgml-doctools Directory: pool/main/x/xorg-sgml-doctools Package-List: xorg-sgml-doctools deb x11 optional arch=all Files: cb654be26b841c249466d88e7a58202b 1987 xorg-sgml-doctools_1.11-1.1.dsc 51cf4c6b476e2b98a068fea6975b9b21 150367 xorg-sgml-doctools_1.11.orig.tar.gz cbf1be867f1ea7b560a6febe8f5477a2 3296 xorg-sgml-doctools_1.11-1.1.diff.gz Checksums-Sha1: 5009402317d7d2dd269f06bff0cec4059692fe1a 1987 xorg-sgml-doctools_1.11-1.1.dsc cb2a2ce7040269b9a74f972780c85a490dd4e78f 150367 xorg-sgml-doctools_1.11.orig.tar.gz 822fb7019cbf117e7defa682078ccd4bb291458c 3296 xorg-sgml-doctools_1.11-1.1.diff.gz Checksums-Sha256: 6aac68e597386c10b02646d2026a833d301749a938701f4ca8efd4d19ad34295 1987 xorg-sgml-doctools_1.11-1.1.dsc 986326d7b4dd2ad298f61d8d41fe3929ac6191c6000d6d7e47a8ffc0c34e7426 150367 xorg-sgml-doctools_1.11.orig.tar.gz 0c11e15d4f9aaacd38452a6a37d064f1a07058dcead7ab1e2aca223ec0a94d11 3296 xorg-sgml-doctools_1.11-1.1.diff.gz Checksums-Sha512: 1682e1a4d4be1bfb1242adfa22b2764a9425b035cbfae9fd58925d4904eb301fe48bf92fc5935e973d7653db001ab221a8eac8cc5e2840d5a2e0cb4f1bb4895c 1987 xorg-sgml-doctools_1.11-1.1.dsc a2386e41a8e2f7deaded61e00eaeab922647c0d0f4e36268c4337dc71d2412b0ec433140d080a0fd118b6112ed0a4f960280f932fe8d4a90ea9dc8bedf1eb75e 150367 xorg-sgml-doctools_1.11.orig.tar.gz 0ea09f6de75cf649fb82705a0470e5ba04edbe59ccfa26132e60120e04036b86e9ff47785fdcee2499fa005cbbdfc9e04ebdca619d0253ea558e2fe5501b9ec4 3296 xorg-sgml-doctools_1.11-1.1.diff.gz Package: xorgproto Format: 1.0 Binary: x11proto-dev, x11proto-core-dev, x11proto-dri2-dev, x11proto-fonts-dev, x11proto-gl-dev, x11proto-input-dev, x11proto-kb-dev, x11proto-present-dev, x11proto-randr-dev, x11proto-record-dev, x11proto-render-dev, x11proto-scrnsaver-dev, x11proto-video-dev, x11proto-xext-dev, x11proto-xf86dga-dev, x11proto-xf86dri-dev, x11proto-xf86vidmode-dev, x11proto-xinerama-dev Architecture: all Version: 2022.1-1 Priority: optional Section: misc Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), quilt, xutils-dev (>= 1:7.6+2), pkg-config, xmlto, xorg-sgml-doctools (>= 1:1.8), w3m, xsltproc Homepage: https://www.x.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/proto/xorgproto.git Vcs-Git: https://salsa.debian.org/xorg-team/proto/xorgproto.git Directory: pool/main/x/xorgproto Package-List: x11proto-core-dev deb oldlibs optional arch=all x11proto-dev deb x11 optional arch=all x11proto-dri2-dev deb oldlibs optional arch=all x11proto-fonts-dev deb oldlibs optional arch=all x11proto-gl-dev deb oldlibs optional arch=all x11proto-input-dev deb oldlibs optional arch=all x11proto-kb-dev deb oldlibs optional arch=all x11proto-present-dev deb oldlibs optional arch=all x11proto-randr-dev deb oldlibs optional arch=all x11proto-record-dev deb oldlibs optional arch=all x11proto-render-dev deb oldlibs optional arch=all x11proto-scrnsaver-dev deb oldlibs optional arch=all x11proto-video-dev deb oldlibs optional arch=all x11proto-xext-dev deb oldlibs optional arch=all x11proto-xf86dga-dev deb oldlibs optional arch=all x11proto-xf86dri-dev deb oldlibs optional arch=all x11proto-xf86vidmode-dev deb oldlibs optional arch=all x11proto-xinerama-dev deb oldlibs optional arch=all Files: 29aa4f9fce40950b5fdd8f08bc277310 3410 xorgproto_2022.1-1.dsc ff0a74e3fb31757811216386384c997b 1107316 xorgproto_2022.1.orig.tar.gz 01b62b9e34461d47d918039cb9d6cecd 195 xorgproto_2022.1.orig.tar.gz.asc ac324301e8861ff500e942af614eff76 23288 xorgproto_2022.1-1.diff.gz Checksums-Sha1: cddeb2457aa21e09816b39ed7dde6d8ce4d60b45 3410 xorgproto_2022.1-1.dsc 78ddd13f911eb11dbc205e9077b6c48e17088ce5 1107316 xorgproto_2022.1.orig.tar.gz ce8b1f345932e8f0e427a423db1e628e13b9361d 195 xorgproto_2022.1.orig.tar.gz.asc f6ddb7f01b277041ac36024ce6f0ec9152d48578 23288 xorgproto_2022.1-1.diff.gz Checksums-Sha256: f7422a97f3c67ad50559fbdb4eba362002e9dcda090e9ae6bc999245298e6dbe 3410 xorgproto_2022.1-1.dsc 2a399e77d98fe53e9056726a1934b62cbaa6c41d7b1f41a354911b0925363343 1107316 xorgproto_2022.1.orig.tar.gz 5d9077f618efacf21669930cc38bdf58585676ef3ba57ee9ff5364d410cd21b4 195 xorgproto_2022.1.orig.tar.gz.asc a314356d8c46e4cacf3ef38e904f071efffaa614a7f05019fc4d7e832f5cbe73 23288 xorgproto_2022.1-1.diff.gz Checksums-Sha512: cd5dae5e527d42a2d54eb1adf2028af45462567849937d740fd9e46f9c8f080264c49928d44300ea4d4e77978292b57513c9112054da6da17bd02068f61c5d37 3410 xorgproto_2022.1-1.dsc e34404eb9f7edfebdecbf38c66491fbca91929c59b5762d3266b2808cdae3f4e65589001d29bf5374effc56173a5467f5a107bf4fe05acae69839b841e83f72c 1107316 xorgproto_2022.1.orig.tar.gz 8a975a43434c40af2cdc781aad4dbb8ff2d1730fe6a04b431800d19a81b1fbf53e29503f8226c6579d7335c7250842b4c6eb5e8ee4f1b0f08bb7e87b12b50b3c 195 xorgproto_2022.1.orig.tar.gz.asc 062da8e99882e4b3a6527ec92fb1faace09a7586c30a699af13be1b4f00af076e9d60054e2f61e21425203c5175a51f919dcea81a8e7b0562a8b8eb341b1dc77 23288 xorgproto_2022.1-1.diff.gz Package: xserver-xorg-input-libinput Format: 1.0 Binary: xserver-xorg-input-libinput, xserver-xorg-input-libinput-dev, xserver-xorg-input-libinput-udeb Architecture: linux-any all Version: 1.2.1-1 Priority: optional Section: misc Maintainer: Debian X Strike Force Uploaders: Timo Aaltonen , Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), libinput-dev (>= 1.4.901), libudev-dev, pkg-config, quilt, x11proto-dev (>= 2021.5), xserver-xorg-dev (>= 2:1.15.99), xutils-dev Homepage: https://www.x.org Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-input-libinput Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-input-libinput.git Directory: pool/main/x/xserver-xorg-input-libinput Package-List: xserver-xorg-input-libinput deb x11 optional arch=linux-any xserver-xorg-input-libinput-dev deb libdevel optional arch=all xserver-xorg-input-libinput-udeb udeb debian-installer optional arch=linux-any Files: 1f7876af1bc275c31bdb1f6b085221cf 2734 xserver-xorg-input-libinput_1.2.1-1.dsc 9ec409b0b1f5adad577f48ebe1bbb638 461051 xserver-xorg-input-libinput_1.2.1.orig.tar.gz af1b04c08f73a85f161f6348701f9f97 195 xserver-xorg-input-libinput_1.2.1.orig.tar.gz.asc 931f546f6be85cc3d650a4136390c740 16247 xserver-xorg-input-libinput_1.2.1-1.diff.gz Checksums-Sha1: 21cf3bcdd29136526e37e7c92f57dd26cc9f9284 2734 xserver-xorg-input-libinput_1.2.1-1.dsc 48b306e18a62800bc9486a1da3cce345413ec0d4 461051 xserver-xorg-input-libinput_1.2.1.orig.tar.gz d7c8adf7d6397c065840e730a94b2c0f9f662ece 195 xserver-xorg-input-libinput_1.2.1.orig.tar.gz.asc 792633c30c25e75e7d26f5ea094f6a6a2ad76ada 16247 xserver-xorg-input-libinput_1.2.1-1.diff.gz Checksums-Sha256: a77c1143dd8aee1970833eb9147b48f9b759ab0dab2c2de33a32690a5e9d413d 2734 xserver-xorg-input-libinput_1.2.1-1.dsc ac37b3fd4685025d8a1864ee361b3d6c4e50689c9a5b86786ea1fa3eb997f3e5 461051 xserver-xorg-input-libinput_1.2.1.orig.tar.gz b9eb04f1c5db81480333098f3b22469b1a9736ef7a9d5fcb62482608adef5151 195 xserver-xorg-input-libinput_1.2.1.orig.tar.gz.asc 5b222ed4f954f3a45eb588ddfff43893fc6b06807156caf321b394f0672384f3 16247 xserver-xorg-input-libinput_1.2.1-1.diff.gz Checksums-Sha512: fab8e8488cf72aae389f8ddbd476683d36426457639305590d9f22b48cdf69d7ff8eced1b97ffdf0c7cce6c286ce2b35a337d0e0bc2864cd96a8c6362a38436f 2734 xserver-xorg-input-libinput_1.2.1-1.dsc d03e4c5d866b760783ec97822f0aa5e5b2bbb7ade2c9a6b33df7796198dd2bc7f35a97649d39bb41073ce3c701921b66444f303a3cb17440bdbbb3f017e85211 461051 xserver-xorg-input-libinput_1.2.1.orig.tar.gz c005c708e811a11de7c74518a73ec5cc60ca203d6d56265d19a5147df3c5d42d1fec24d11f7ee4ea3efdf0c0a618d9d13796388de2b15cebcb5f17309bf834a9 195 xserver-xorg-input-libinput_1.2.1.orig.tar.gz.asc dfe9afc1aaf760595db6e773d890d638e35437ea2f5909acbb88a322215ae1483a1e08732b10908131413ed1b1d3157f9278ff72e8ede4e7e6a1d10cc4d48e4e 16247 xserver-xorg-input-libinput_1.2.1-1.diff.gz Package: xserver-xorg-video-amdgpu Format: 1.0 Binary: xserver-xorg-video-amdgpu Architecture: linux-any Version: 22.0.0-3 Priority: optional Section: x11 Maintainer: Debian X Strike Force Uploaders: Timo Aaltonen Standards-Version: 4.2.1 Build-Depends: debhelper (>= 11), quilt, libdrm-dev (>= 2.4.89) [!hurd-i386], libgl1-mesa-dev | libgl-dev, libgbm-dev, libudev-dev [linux-any], pkg-config, x11proto-dev, xserver-xorg-dev (>= 2:1.16), xutils-dev (>= 1:7.5+4) Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-amdgpu.git Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-amdgpu.git Directory: pool/main/x/xserver-xorg-video-amdgpu Package-List: xserver-xorg-video-amdgpu deb x11 optional arch=linux-any Files: 1364ff65bc3c83a502dfebff8c5c63c8 2230 xserver-xorg-video-amdgpu_22.0.0-3.dsc 73efb437f5eb29b2c52a9d82c7e15d72 552435 xserver-xorg-video-amdgpu_22.0.0.orig.tar.gz b75c95a6be7e0d8b965762383159573d 20021 xserver-xorg-video-amdgpu_22.0.0-3.diff.gz Checksums-Sha1: 76885e5a5578e4a46c50877419763d37e4f4ef69 2230 xserver-xorg-video-amdgpu_22.0.0-3.dsc 6d5ba51571b3b4d110e7329b9a89c39590eed47f 552435 xserver-xorg-video-amdgpu_22.0.0.orig.tar.gz aba899697b6d974372580a2d64a71b4e13e31355 20021 xserver-xorg-video-amdgpu_22.0.0-3.diff.gz Checksums-Sha256: f3287eafc670db40302c4633a037b168966bfd9a9059020ba4e6a70abe26ea3b 2230 xserver-xorg-video-amdgpu_22.0.0-3.dsc bc47a1a8854e790270fa5de2fb9dfe8558139b03d8f68ac1057dcd235d572dcc 552435 xserver-xorg-video-amdgpu_22.0.0.orig.tar.gz e30b799e0830d0f5e2da0738438a6be4d6873ee6aa4de6ca902503db2a05166f 20021 xserver-xorg-video-amdgpu_22.0.0-3.diff.gz Checksums-Sha512: b2b93ef2d47b76d474b3e0ba28c408f1f5e0693c8780e39f4015e306fc934341002beb5901dfa8ddb0107f0f906887623bf8471ab410fbc4bbe957e3c07124ab 2230 xserver-xorg-video-amdgpu_22.0.0-3.dsc 8929fac8b99c907ff0bcfa9c38fac5369a7ce2fc0e3d1eb506aafadf7e2aaf020f3e1b9a72a46aa2dc5ef10a0ae681332fb230b6e8f1be3516cc4e8ea7c3d5af 552435 xserver-xorg-video-amdgpu_22.0.0.orig.tar.gz 9d4d92aee3c4095222f4955492c13e8da1c700de2b95877519861267635cd41bd8c1228d7a34364a62c61acaa8e5653f7d2c8d3e2c8543b8b31e1c3c3b4d59a7 20021 xserver-xorg-video-amdgpu_22.0.0-3.diff.gz Package: xserver-xorg-video-ati Format: 1.0 Binary: xserver-xorg-video-ati, xserver-xorg-video-radeon Architecture: any Version: 1:19.1.0-3 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.2.1 Build-Depends: debhelper-compat (= 12), quilt, pkg-config, xserver-xorg-dev (>= 2:1.15.99), libgl1-mesa-dev | libgl-dev, libgbm-dev, libdrm-dev (>= 2.4.89) [!hurd-i386], libudev-dev [linux-any], x11proto-dev, xutils-dev (>= 1:7.5+4) Homepage: https://wiki.freedesktop.org/xorg/RadeonFeature/ Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-ati.git Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-ati.git Directory: pool/main/x/xserver-xorg-video-ati Package-List: xserver-xorg-video-ati deb x11 optional arch=any xserver-xorg-video-radeon deb x11 optional arch=any Files: b0ebe0f5ae2f088f2c9e9e75b8939468 2583 xserver-xorg-video-ati_19.1.0-3.dsc c4172d2b6883a6e8e57c737248b3c9c8 1160362 xserver-xorg-video-ati_19.1.0.orig.tar.gz fec4543f9bfe79418a753664f9f1a86f 195 xserver-xorg-video-ati_19.1.0.orig.tar.gz.asc dfacebeeaf62fd90d758ecde6bf6a8fb 34444 xserver-xorg-video-ati_19.1.0-3.diff.gz Checksums-Sha1: 55e56fca63c75a430c9e3b03819055e9e9439760 2583 xserver-xorg-video-ati_19.1.0-3.dsc 6c5c06555c2aed695b28b5b5d617a994e9926410 1160362 xserver-xorg-video-ati_19.1.0.orig.tar.gz eefd307f59e583909099355fc18f3baf615c107f 195 xserver-xorg-video-ati_19.1.0.orig.tar.gz.asc 7dd4005799f5c22aca04c5c98fed33df02c017e7 34444 xserver-xorg-video-ati_19.1.0-3.diff.gz Checksums-Sha256: 3fc585d7988ec3e8ca7b7cb9d84d212fd352ae23745a5620f0e69bf1a066fba1 2583 xserver-xorg-video-ati_19.1.0-3.dsc c05c6e0c396a0148113f1836cfab7f2e43f784c9b7041f11e9cab40a4bc0c90f 1160362 xserver-xorg-video-ati_19.1.0.orig.tar.gz b8dfa9170dedd0b309acfe9baccb57b5921100956fa5ab02b31e468782f8d256 195 xserver-xorg-video-ati_19.1.0.orig.tar.gz.asc b81c97b958cd42e5a6afb69f6a3aee5e4b9cd266a0c92bd6771ebd5ed1316cfc 34444 xserver-xorg-video-ati_19.1.0-3.diff.gz Checksums-Sha512: 4a943cc272b4a1ad0e307dc3071b238eeb6dd2927e32de7f1a3b21164584ee092141b5f029f907b54e4838b02fbc2d544b3b80f5f46bb4733e9f6fb7e8cb3f93 2583 xserver-xorg-video-ati_19.1.0-3.dsc c382c68ed5f3a690b293e3b56dfdf71f5b279f52da6db925cb5302e595003f69451670fe1ec9546ad4d91cb328b367777f547757a69d70ed8b4ade75e613e302 1160362 xserver-xorg-video-ati_19.1.0.orig.tar.gz e70b7213f83adb8cbc68ffbe0a2807afe38703be89895b6cff8f5da849c371321e127e970de126550edd763b31810612bc7a452187915c0a4b9e4b62d9ba9324 195 xserver-xorg-video-ati_19.1.0.orig.tar.gz.asc 22203830c1661fc2e86d8cd38b3f20ed5888868cb15fd15b37d8d93d77d064f18aac7de10c571c36332e999b269e69afed7ffea50ce390859f905516a6f9ca0f 34444 xserver-xorg-video-ati_19.1.0-3.diff.gz Package: xserver-xorg-video-dummy Format: 1.0 Binary: xserver-xorg-video-dummy Architecture: any Version: 1:0.4.0-1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), quilt, pkg-config, xserver-xorg-dev (>= 2:21.1), x11proto-dev, xutils-dev Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-dummy Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-dummy.git Directory: pool/main/x/xserver-xorg-video-dummy Package-List: xserver-xorg-video-dummy deb x11 optional arch=any Files: 7baa597f2f231afbd2d4713c8aa5efec 2336 xserver-xorg-video-dummy_0.4.0-1.dsc d932c1fc53bbf53eca8444d7fde7c469 380215 xserver-xorg-video-dummy_0.4.0.orig.tar.gz f79afca05cb812d946ab72f167ee7c0d 358 xserver-xorg-video-dummy_0.4.0.orig.tar.gz.asc 1dd17724e79b483c2431be0300f257c1 27720 xserver-xorg-video-dummy_0.4.0-1.diff.gz Checksums-Sha1: dc7c10dc30e341bdfaba8570fbec933a385f3e67 2336 xserver-xorg-video-dummy_0.4.0-1.dsc abb97726ab1008417a4b584cb849903be6ecadae 380215 xserver-xorg-video-dummy_0.4.0.orig.tar.gz f4b6c9b23cf1e816303705b5e299de79e0bf1662 358 xserver-xorg-video-dummy_0.4.0.orig.tar.gz.asc 69c0013bdf723b8953831d0840d1992753966e70 27720 xserver-xorg-video-dummy_0.4.0-1.diff.gz Checksums-Sha256: 04753d33688cc37fca5e1c67384969adf2a680a5781aba42dc6be4431c5ca16b 2336 xserver-xorg-video-dummy_0.4.0-1.dsc bbecddd599d6fbf0e2a40aa4a5baabaa2ea9690521ffc8e9a3c26e1172498197 380215 xserver-xorg-video-dummy_0.4.0.orig.tar.gz 244072f0d6dace41ff1d1eea9b51c06b5e9f3bdfa9b693b650c0b6a14f3645ab 358 xserver-xorg-video-dummy_0.4.0.orig.tar.gz.asc a338332ec6a2802f3521973f5c9d94b1aeffd91e62a1ada2604cbf657d99aed5 27720 xserver-xorg-video-dummy_0.4.0-1.diff.gz Checksums-Sha512: 1b159432ad471a18491fa71e5b16c6dbe37ccd2525a8859dcb24a46f4ce31b6e3378a6ab6b1607ce3ad0d04f0c421b465f92fb925f968e76e1d586a96ccd78b0 2336 xserver-xorg-video-dummy_0.4.0-1.dsc 84a16244e4940dc27edf7f6805fc0c0d59f732df2a17b5829c00a7dfdef87e2031f6ec4a6e1a195bf005add7bf2000bc9d853b22ea4226b82b23aaba06af1bc3 380215 xserver-xorg-video-dummy_0.4.0.orig.tar.gz dfe9c42ece64eabba71bec3668da4c09cb11d017205bdc1d6635b2d5f4f4d512910cafa2d6a03643f7dd476fa7f0a403aed4069aeb133c3db4133b862b585500 358 xserver-xorg-video-dummy_0.4.0.orig.tar.gz.asc 19ffef4c7bca51e0654da23c1d0b3caf87a0a58ed3e18f9b23e6010a7d191f5e8964f2e3b1c0f91b7adc228297e6c127c3dc697c15d64ba8bbd4e7fd395cff4c 27720 xserver-xorg-video-dummy_0.4.0-1.diff.gz Package: xserver-xorg-video-fbdev Format: 1.0 Binary: xserver-xorg-video-fbdev, xserver-xorg-video-fbdev-udeb Architecture: any Version: 1:0.5.0-2build1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), quilt, pkg-config, xserver-xorg-dev (>= 2:21.1), x11proto-dev, xutils-dev (>= 1:7.5+1) Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-fbdev Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-fbdev.git Directory: pool/main/x/xserver-xorg-video-fbdev Package-List: xserver-xorg-video-fbdev deb x11 optional arch=any xserver-xorg-video-fbdev-udeb udeb debian-installer optional arch=any Files: 50c56c17169fcca87bc17d1dcce53ced 2580 xserver-xorg-video-fbdev_0.5.0-2build1.dsc c1dc25fd8b1fc5756313c95fa6b65d9c 388054 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz 69744738e962475677159596fb127f4f 705 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz.asc 5416d1b8651ca1ed9c8ecf1061f4351a 9782 xserver-xorg-video-fbdev_0.5.0-2build1.diff.gz Checksums-Sha1: 31f62445cc7cfb86cc2e4250651c46133f7a3b28 2580 xserver-xorg-video-fbdev_0.5.0-2build1.dsc cb75ff1632b13a46691de70fee5e200ccec0fc84 388054 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz 812a6a33ac01e80ba2b8a4a8cb54606e82580be6 705 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz.asc 6330853d2569c3d2cfe6dc9566ccfc42d7d3d070 9782 xserver-xorg-video-fbdev_0.5.0-2build1.diff.gz Checksums-Sha256: 5097f6d38471613073dd1a1b4e9e513987954c8234fad5d86dd8ff40ff4691c3 2580 xserver-xorg-video-fbdev_0.5.0-2build1.dsc a31f62db237a5c25bb087713a22a867a9b7680833ce3b644ecd712887b7b1d62 388054 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz 74ee2040a1da322256e3b317bb767d80b989119aebd1982b045f613706c9743a 705 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz.asc 67ebb3373e5700a37e1f94da5b5b9e4851c6f887b38b85587cb9b4a32fda0357 9782 xserver-xorg-video-fbdev_0.5.0-2build1.diff.gz Checksums-Sha512: c91a1e00f62db2432b05512dee8c1116d63fd82c6edb095f64607ef4ec9be217b454bb8c0162e6c9da8c8b192b316ee7d02d0ac75835a1e8f22ea27846e41a1e 2580 xserver-xorg-video-fbdev_0.5.0-2build1.dsc aed59f23f376febb37b6ec0c62aaeba8979eee01018ea2211548827a622c06566aa729d59927c63c3ea126a929c4e050cc2eb7a5e6506f59c9edeecff130c46a 388054 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz b97480311e9383357c5984e9a390bb486038884ad82c83231ef328ba8686fbe98754feffe78fb49a47eaf6bb41ed3b1d84970395e42e550610bac1000ef4d228 705 xserver-xorg-video-fbdev_0.5.0.orig.tar.gz.asc ba1b6a3472940bc6ecf458861e125848be66a9224c24f51d3b1a89aa2322218dae0da57cdea1bb95c66ef37758da430707bf86d7902eb5a1ea6b0f2bea84407f 9782 xserver-xorg-video-fbdev_0.5.0-2build1.diff.gz Package: xserver-xorg-video-intel Format: 1.0 Binary: xserver-xorg-video-intel Architecture: amd64 i386 kfreebsd-amd64 kfreebsd-i386 x32 Version: 2:2.99.917+git20210115-1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Uploaders: Drew Parsons , Michael Stapelberg , maximilian attems , Vincent Cheng , Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), pkg-config, xserver-xorg-dev (>= 2:21.1), x11proto-dev, libx11-dev, libdrm-dev (>= 2.4.23), libgl1-mesa-dev | libgl-dev, libpciaccess-dev (>= 0.8.0+git20071002), libxvmc-dev (>= 2:1.0.12), libxext-dev, libxfixes-dev, libx11-xcb-dev, libxcb-util0-dev, libxcb-dri2-0-dev, libudev-dev [linux-any], quilt, xutils-dev (>= 1:7.5+4), valgrind [amd64 arm64 armhf i386 mips mipsel mips64 mips64el powerpc ppc64 ppc64el s390x x32], libxinerama-dev, libxrandr-dev, libxdamage-dev, libxcursor-dev, libxtst-dev, libxrender-dev, libpixman-1-dev, libxss-dev Homepage: https://www.x.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-intel Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-intel.git Directory: pool/main/x/xserver-xorg-video-intel Package-List: xserver-xorg-video-intel deb x11 optional arch=amd64,i386,kfreebsd-amd64,kfreebsd-i386,x32 Files: 06e90d03ec7fa4417ecd06ab71b40487 2894 xserver-xorg-video-intel_2.99.917+git20210115-1.dsc 5be91f808ad10342fe75de60ab8d7315 1664999 xserver-xorg-video-intel_2.99.917+git20210115.orig.tar.gz f54bedebfe8711c2149bffc27aedc6a7 959230 xserver-xorg-video-intel_2.99.917+git20210115-1.diff.gz Checksums-Sha1: 75d3788eb5fb2e0f6aa3ab489f58a0d12edd010a 2894 xserver-xorg-video-intel_2.99.917+git20210115-1.dsc d33940921a05b937a1ae4160564e7d6b9ceb3f17 1664999 xserver-xorg-video-intel_2.99.917+git20210115.orig.tar.gz fcb4898b8037f1253175e912ce3b9f8369ba0558 959230 xserver-xorg-video-intel_2.99.917+git20210115-1.diff.gz Checksums-Sha256: 5b394a3726e7acee70793e5c938d5d11a6a80bdebb97b1c7e36bd4cfb8fd0503 2894 xserver-xorg-video-intel_2.99.917+git20210115-1.dsc f0c7330e8625bcce3ba4b8a285868430c7e37df1ff381a3dce6c04cfea0eff34 1664999 xserver-xorg-video-intel_2.99.917+git20210115.orig.tar.gz 6568c24036f1afdaddf0fc7897f18b637d70de47b197d744bb9b297d1e36da52 959230 xserver-xorg-video-intel_2.99.917+git20210115-1.diff.gz Checksums-Sha512: 038e9f3d919d8cf80cd7daf0c6e2d9cec044f6c9db7acaf2bd387b8f92041e430cae1a9b93dc8211dd10fe1fae80f155c09d1fb312b7ba2e0864a70fdd302c07 2894 xserver-xorg-video-intel_2.99.917+git20210115-1.dsc 25306a5bee5d5b39c7351555cc81785885a959418851f5ee867dabe25c90b5e768aaa3a465323dfcea1c66ac9837584a0e175da2c56bd99db1ad188f9efe1b5c 1664999 xserver-xorg-video-intel_2.99.917+git20210115.orig.tar.gz 371af196d5db24c524579f7f349f54ac872f2b67ae650b59832f4ed7ffc61504d21ef6cbf513d74b515e257a29b7bb40902e0ef967217db88042873276a862f3 959230 xserver-xorg-video-intel_2.99.917+git20210115-1.diff.gz Package: xserver-xorg-video-nouveau Format: 1.0 Binary: xserver-xorg-video-nouveau Architecture: linux-any Version: 1:1.0.17-2build1 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), pkg-config, xserver-xorg-dev (>= 2:21.1), x11proto-dev, libdrm-dev (>= 2.4.60), libudev-dev, xutils-dev, quilt (>= 0.63-8.2~) Homepage: https://nouveau.freedesktop.org/wiki/ Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-nouveau Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-nouveau.git Directory: pool/main/x/xserver-xorg-video-nouveau Package-List: xserver-xorg-video-nouveau deb x11 optional arch=linux-any Files: 6b6b0f3acdde0a9eed473df6e71b0591 2618 xserver-xorg-video-nouveau_1.0.17-2build1.dsc e4fe1a12f9cbc075b2200773099df96f 789193 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz 5e2526c921e6602291d03360e6c0b6d9 488 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz.asc 48dcb0e4a6951fc4e9db478ce1492d1d 51450 xserver-xorg-video-nouveau_1.0.17-2build1.diff.gz Checksums-Sha1: 573e264af8efdda6ef0127663554e56ead2d4627 2618 xserver-xorg-video-nouveau_1.0.17-2build1.dsc 642365f7a833ff1ae03d6a2c5eac660022dc44f7 789193 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz b5e63be28cda96efc457642c4c9687f49b63bef1 488 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz.asc 6badf729116c1ab904936d21986209b164778c33 51450 xserver-xorg-video-nouveau_1.0.17-2build1.diff.gz Checksums-Sha256: 7dadaabcde361c992ad5aa2b2d8e2d93950a385b07edbf4476a92bb156e11556 2618 xserver-xorg-video-nouveau_1.0.17-2build1.dsc 21e9233b2c6304b976c526729ba48660c16976a757a319fa95cc8a8605316105 789193 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz 5bcdcdc8cebf8d3b2028eb1d7fd8070d693ccf653b4978984a4c2c1ced97eaf9 488 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz.asc 6b29e40f882ff0c0130e82f3a0067436b2cd99bce5d7e14179c58820b22512ca 51450 xserver-xorg-video-nouveau_1.0.17-2build1.diff.gz Checksums-Sha512: 827886385edc9aaeea9ecec3811ddd01f7e4937be22e1cc71a6a0c5d8f59f761f6b9477750425818c10e11dcc77594d907c039c6457a7d5d20839fe56d4c8017 2618 xserver-xorg-video-nouveau_1.0.17-2build1.dsc 10336f521d39289b214ce640b8b7195f4709ab780a4057ba83d02c2f3b4f7c7b17e37cf5f3224c43bf39aa8939a8836be1ee9eb26901d713cb98d161db2375e9 789193 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz 7a2307d2394abab44a12343047ff409dd85faab5b879953f28c826e6d4c379647f6d3a5e2a235e911b672a38186baeccd632e864c82360172b780d35fc813a2e 488 xserver-xorg-video-nouveau_1.0.17.orig.tar.gz.asc 1d1ace3c5ecd02574abe61be6d1a47c9d79e2974b2aa98a43da9a999c71d1e67751d251f9e3368d7e30586679eb7a6c061840da7fac378a5f874e9cd0a40e194 51450 xserver-xorg-video-nouveau_1.0.17-2build1.diff.gz Package: xserver-xorg-video-qxl Format: 1.0 Binary: xserver-xorg-video-qxl, xserver-xspice Architecture: any Version: 0.1.5+git20200331-3 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), pkg-config, dh-python, xserver-xorg-dev (>= 2:1.9.4), x11proto-dev, dpkg-dev (>= 1.14.17), xutils-dev (>= 1:7.5), quilt (>= 0.46-7~), libudev-dev [linux-any], libspice-protocol-dev (>= 0.12.2~), libspice-server-dev [amd64], libxext-dev, libxfont-dev, python3:any Homepage: https://www.spice-space.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-qxl Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-qxl.git Directory: pool/main/x/xserver-xorg-video-qxl Package-List: xserver-xorg-video-qxl deb x11 optional arch=any xserver-xspice deb x11 optional arch=amd64 Files: 1c34619323f29a68c6a45a993949a0ef 2389 xserver-xorg-video-qxl_0.1.5+git20200331-3.dsc 9bc6caca617a7c786651e832137885ca 171559 xserver-xorg-video-qxl_0.1.5+git20200331.orig.tar.gz ea7865905f5582dd00aa20ffa3b4c58d 14469 xserver-xorg-video-qxl_0.1.5+git20200331-3.diff.gz Checksums-Sha1: 5396d14e5ed53c8a29dded1249bb4b06176715ae 2389 xserver-xorg-video-qxl_0.1.5+git20200331-3.dsc 6d22c926899adf45becf0535185b2353c7784d51 171559 xserver-xorg-video-qxl_0.1.5+git20200331.orig.tar.gz d1e0c1d3f901cb3c72b2c85649abfa8887ef3dd1 14469 xserver-xorg-video-qxl_0.1.5+git20200331-3.diff.gz Checksums-Sha256: dbba276ebe0d99a94597538e2b097558312fa4b5d77e92c9e1b2022199fc44b7 2389 xserver-xorg-video-qxl_0.1.5+git20200331-3.dsc fc7ade672747ce7c314cf58da6c66d40235969a46c23a5d43d6edb0bbd88803e 171559 xserver-xorg-video-qxl_0.1.5+git20200331.orig.tar.gz 51970ce29c60198dbe879551a76c4e1fe2045216b08095b9c1eac703466bbc54 14469 xserver-xorg-video-qxl_0.1.5+git20200331-3.diff.gz Checksums-Sha512: c875d2a2f0afcc2e546f475d2f06afff7d351e858b13a3035904db5d11d4eba589d9d1c3b24feb86d420ef714aa7b740787048e7d153eccf92ab6fc8437c8636 2389 xserver-xorg-video-qxl_0.1.5+git20200331-3.dsc ce37423cd4b09d299ebb9083dad756a3a31ced5cb5736dcea32527c1fe8ddaeb7a2a5b211a28291721cd3468e43e1191e4a60eff73f5d22cfcba0aa07dd3de35 171559 xserver-xorg-video-qxl_0.1.5+git20200331.orig.tar.gz 78bb9ba8ac216dd92e5f04fc8e0dc3cbd67792c6b1e334a0793a65505912793103e96867349441317e35d41943bbfe81627895295addf9cb21f7a05c0beae361 14469 xserver-xorg-video-qxl_0.1.5+git20200331-3.diff.gz Package: xserver-xorg-video-vesa Format: 1.0 Binary: xserver-xorg-video-vesa, xserver-xorg-video-vesa-udeb Architecture: any Version: 1:2.5.0-1build4 Priority: optional Section: x11 Maintainer: Ubuntu Developers Original-Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), pkg-config, xserver-xorg-dev (>= 2:1.11), x11proto-dev, xutils-dev (>= 1:7.5+4), quilt, libpciaccess-dev (>= 0.12.901) Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-vesa Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-vesa.git Directory: pool/main/x/xserver-xorg-video-vesa Package-List: xserver-xorg-video-vesa deb x11 optional arch=any xserver-xorg-video-vesa-udeb udeb debian-installer optional arch=hurd-any,kfreebsd-any Files: 13bb6975bbedf9239d803f653524a3b5 2617 xserver-xorg-video-vesa_2.5.0-1build4.dsc 1cc6d82b149d3c2cf900e7771e154e1a 398587 xserver-xorg-video-vesa_2.5.0.orig.tar.gz 46f1419a0ca7639a5f460564a5bfaf84 659 xserver-xorg-video-vesa_2.5.0.orig.tar.gz.asc 481ed88533bf3c8b5f841bf8f244a49f 11420 xserver-xorg-video-vesa_2.5.0-1build4.diff.gz Checksums-Sha1: 6b96e0bb6850ec1c02a67337ddcfc11e53889640 2617 xserver-xorg-video-vesa_2.5.0-1build4.dsc 62ae49bf376c8b0652ddf320bb0f1c856dd0d56b 398587 xserver-xorg-video-vesa_2.5.0.orig.tar.gz d1c9eadb9e67d540c8ef0adb073993ea19468e57 659 xserver-xorg-video-vesa_2.5.0.orig.tar.gz.asc d84ef45cee24250c9d82ee4c57cf5719fc1a6c07 11420 xserver-xorg-video-vesa_2.5.0-1build4.diff.gz Checksums-Sha256: 0388f8347d2b87a4e7db60e92e4fcd48de5c52da908eb3aa8fe183a4afaf0053 2617 xserver-xorg-video-vesa_2.5.0-1build4.dsc be10771dbfdec9e8c4f1b56653b0e6b05b3e5f79c26507e3184ad27b4f00c09d 398587 xserver-xorg-video-vesa_2.5.0.orig.tar.gz cd31765de523d5a35052fefeb0c315b99d588c312bb578ab49c3172c2601c47b 659 xserver-xorg-video-vesa_2.5.0.orig.tar.gz.asc a6cf60975f8caf425a67648df46671716ec5a408bddd396e097adfd9d03f8ee3 11420 xserver-xorg-video-vesa_2.5.0-1build4.diff.gz Checksums-Sha512: c56b80d60075637d84316169a17469d589af3255dc1dcca4d26a499f2ea4b182bf860517fbd8f8352f03c4a2b094b8c0a7acae9755f5c04f35060b3fe93882eb 2617 xserver-xorg-video-vesa_2.5.0-1build4.dsc 446344bd7fb6f1f39561b5be1c7eaf95a8cb9804c8d292c4f899bfe2099c68d2480642205d8ba5338f7b7dda2830c0c5a9383973fd58a915611b78b15cc553c9 398587 xserver-xorg-video-vesa_2.5.0.orig.tar.gz 57485b5552d0b856560e3f48f31e55a930fb4cfe1eab7814f1c59dc4804bc993f9dc1e3dd00b37bb8be150c14fcdf413babb17f926607d12fbd9c35638f74126 659 xserver-xorg-video-vesa_2.5.0.orig.tar.gz.asc 6e9c1e2f434892693f23cc462d46d5800f9483244283771e1acdfd4a2ac916abc795ee946526e8b6b3126d5d6a226072e163e8d01726ec6dcf35cb7edd7feaef 11420 xserver-xorg-video-vesa_2.5.0-1build4.diff.gz Package: xserver-xorg-video-vmware Format: 1.0 Binary: xserver-xorg-video-vmware Architecture: any-amd64 any-i386 Version: 1:13.3.0-3.1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), quilt, pkg-config, xserver-xorg-dev (>= 2:1.9.4), x11proto-dev, xutils-dev (>= 1:7.5+4), libdrm-dev [!hurd-i386], libudev-dev [linux-any], libxext-dev, libx11-dev, libxatracker-dev [linux-any] Vcs-Browser: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-vmware Vcs-Git: https://salsa.debian.org/xorg-team/driver/xserver-xorg-video-vmware.git Directory: pool/main/x/xserver-xorg-video-vmware Package-List: xserver-xorg-video-vmware deb x11 optional arch=any-amd64,any-i386 Files: 1c09088fc5b08ae0397c75bb8e69dba1 2517 xserver-xorg-video-vmware_13.3.0-3.1.dsc 7e78848fdb06d3b8110f3b9c6ecc1fdb 606792 xserver-xorg-video-vmware_13.3.0.orig.tar.gz f12ad666a083bfb0830bbd396a629bcc 274 xserver-xorg-video-vmware_13.3.0.orig.tar.gz.asc 9c3e2e884b69f4f5e787e5e5b727790d 13211 xserver-xorg-video-vmware_13.3.0-3.1.diff.gz Checksums-Sha1: 552442a1e9fb0d187feae59999da6dc87bbbbbb3 2517 xserver-xorg-video-vmware_13.3.0-3.1.dsc 73696210204f61f9a5ea1d923f481fef824cd5ea 606792 xserver-xorg-video-vmware_13.3.0.orig.tar.gz ad1ee239135b2a7b8de0350cf66327cbee5efb5a 274 xserver-xorg-video-vmware_13.3.0.orig.tar.gz.asc a0ead749774e2f9b9116223dfe8f3c6fae527ba0 13211 xserver-xorg-video-vmware_13.3.0-3.1.diff.gz Checksums-Sha256: 1715a198689b4ab9104c64210176a7e9920b209ec22321b73824d11b42bb5152 2517 xserver-xorg-video-vmware_13.3.0-3.1.dsc 3a29f105b331523e532542bf75d716526877ec6d5ba07b079ed245b02bd4d084 606792 xserver-xorg-video-vmware_13.3.0.orig.tar.gz 23be5b9f5c1849be1e0f9c1045901095aba95a953812d34bb1f2e0bc33463366 274 xserver-xorg-video-vmware_13.3.0.orig.tar.gz.asc 004813db7c8dab7d97addae65a7a20401bf6afe397f394def9d41d79c47eac85 13211 xserver-xorg-video-vmware_13.3.0-3.1.diff.gz Checksums-Sha512: 7fd7d36c140b426fdd4ca1720fa62afbbb996a2a1f221fb7721c289903dd0e6f98ef7f1dc280f95d658338ff015b4cb5c442260a64ce642451628f253e8cb099 2517 xserver-xorg-video-vmware_13.3.0-3.1.dsc 6abb75c54172a4a1139434d1c611af7f99c6641d9761edcdfddd6a1e9ef609fb88d3deef26c4ab07459501ec6679d20c99671194bacdc1b8263057e3fc524ea4 606792 xserver-xorg-video-vmware_13.3.0.orig.tar.gz 212cf3c3c104f73e1a774e83e9e4ed86c10aaba8860d409edfedbe34bb744edc5eea38c401b205ecd955a9c7cfe95884238abee32c485dee52c7d30ff159e656 274 xserver-xorg-video-vmware_13.3.0.orig.tar.gz.asc d44549aef2bd5bdbc1a9656d7484cd156973c3f6c97ba849131300edc8df463b86d3216a8bdbf2ae0b5c5ca4af7e76c1b755ba37e77ef5dcec7436a1ff98810a 13211 xserver-xorg-video-vmware_13.3.0-3.1.diff.gz Package: xtrans Format: 1.0 Binary: xtrans-dev Architecture: all Version: 1.4.0-1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Uploaders: Cyril Brulebois Standards-Version: 4.5.0 Build-Depends: debhelper-compat (= 12), quilt, automake, xutils-dev (>= 1:7.6+2), pkg-config, xmlto (>= 0.0.22), xorg-sgml-doctools (>= 1:1.8), w3m Vcs-Browser: https://salsa.debian.org/xorg-team/lib/xtrans Vcs-Git: https://salsa.debian.org/xorg-team/lib/xtrans.git Directory: pool/main/x/xtrans Package-List: xtrans-dev deb x11 optional arch=all Files: dd60185a92f21c165fb40def6552dacd 1919 xtrans_1.4.0-1.dsc 0d8fe8de9eb7e733711835d139f906dc 225941 xtrans_1.4.0.orig.tar.gz 930417fa182c2ca7d1306bea83c725c8 9522 xtrans_1.4.0-1.diff.gz Checksums-Sha1: f25a0467ad76dd828fe75e7abf40d9d742b48767 1919 xtrans_1.4.0-1.dsc b5d636c096a4ef3840b9d1dfef648c98a04a4dd0 225941 xtrans_1.4.0.orig.tar.gz 76891cda428aab9ea37d85c115bed2601bb683a0 9522 xtrans_1.4.0-1.diff.gz Checksums-Sha256: dd74ab9199e8f45215b566a9317cac7953bf063ce6893c185eccaf0fb4d84d8f 1919 xtrans_1.4.0-1.dsc 48ed850ce772fef1b44ca23639b0a57e38884045ed2cbb18ab137ef33ec713f9 225941 xtrans_1.4.0.orig.tar.gz 0dac18165654d79e0796b80fab4c1104998d29e6d0b098af0426a1d72399521e 9522 xtrans_1.4.0-1.diff.gz Checksums-Sha512: ac171ce0f00e1741e97a4ddad630ccff69070c0ef60047071b3f940fad08cb468d5ded7b2d4f0f500aeda73f2b703d55a7a4bbe0d5fff88cc3381486a111f580 1919 xtrans_1.4.0-1.dsc 21287ccf18fe2ebd458765496b026d175bf47c6e8e5c21d5b9ea17203967efc0cf6928fa2f3385d289a680c7002c3640e4731937029e99933c2a64bb9fab5326 225941 xtrans_1.4.0.orig.tar.gz d6deaa9579fb61e6ffd296ffe6b083eb9de572001c0a5bc82229ecc3d50bf2ee2f6504b3daa533bd34f3d647d6bd2235728084ec0b59869f6446652b998797f7 9522 xtrans_1.4.0-1.diff.gz Package: xwayland Format: 3.0 (quilt) Binary: xwayland Architecture: linux-any Version: 2:22.1.8-1 Priority: optional Section: x11 Maintainer: Debian X Strike Force Uploaders: Timo Aaltonen Standards-Version: 4.6.0 Build-Depends: debhelper-compat (= 13), meson, pkg-config, quilt, libdrm-dev (>= 2.4.89), libepoxy-dev, libgcrypt-dev, libgbm-dev, libnvidia-egl-wayland-dev, libpixman-1-dev, libxcvt-dev, libxfont-dev, libxkbfile-dev, libxshmfence-dev, libxv-dev, libwayland-dev, mesa-common-dev, x11proto-dev, xfonts-utils, xtrans-dev, wayland-protocols Homepage: https://www.x.org/ Vcs-Browser: https://salsa.debian.org/xorg-team/wayland/xwayland Vcs-Git: https://salsa.debian.org/xorg-team/wayland/xwayland.git Directory: pool/main/x/xwayland Package-List: xwayland deb x11 optional arch=linux-any Files: 218371c9f7f59c806fb8634daea91eb9 2465 xwayland_22.1.8-1.dsc 96879f938a91b0441ea784220159d843 1273668 xwayland_22.1.8.orig.tar.xz 82858e19b2c48e2bb4a7b3fa119e6240 195 xwayland_22.1.8.orig.tar.xz.asc 173058233d1e3ddc4b7d5bc759090974 35580 xwayland_22.1.8-1.debian.tar.xz Checksums-Sha1: 2e1da756adea222c05f0c131bf6b4ba0dd153658 2465 xwayland_22.1.8-1.dsc c8061b690c53472187c3bd5a6367d5c1cc0043d9 1273668 xwayland_22.1.8.orig.tar.xz bfd1d9001e071a686b14b97de64836a34af292d6 195 xwayland_22.1.8.orig.tar.xz.asc 382beeedb974f3ec96bf3a6361eb930ef65d1e01 35580 xwayland_22.1.8-1.debian.tar.xz Checksums-Sha256: e66b17b4217a59ab85f629497068a79934c119f9cb97aa5650f691f91aafd6e4 2465 xwayland_22.1.8-1.dsc d11eeee73290b88ea8da42a7d9350dedfaba856ce4ae44e58c045ad9ecaa2f73 1273668 xwayland_22.1.8.orig.tar.xz f8c190e661718034777fe39ba1f755b91145621a0da67a2cd79425a28ac1b103 195 xwayland_22.1.8.orig.tar.xz.asc a50c4220f83cd4e399ffe133085a7650c1c13d6a0151c456f7a2534a60f85f14 35580 xwayland_22.1.8-1.debian.tar.xz Checksums-Sha512: ee07ab727f0fc13c91ea40613e6052cf644955463a803f999907c0bd2e2474c7448923b9d9e8487061e22ffe2983b1728bcf2f30a508a31e665dca3bc915ba8d 2465 xwayland_22.1.8-1.dsc f52c6f99d8ef7605bc1c651d5ee5e306c12af30649a2d712b1c4c3cf4c7c80246ae24bd9ac39461d47aafc78f5d659446a459cd6259e05ef3128b204981d114a 1273668 xwayland_22.1.8.orig.tar.xz 7bed6db5164f5b6bd429d81bc0463e4d9e2d7b3563acd195ab4a4904050fb94a3ed05870f8399f8f7ce845ff741bfe069520fcc6e4153cab361615d09434f204 195 xwayland_22.1.8.orig.tar.xz.asc d89bfc9a907cd79d862904eb38d845df441512de03ffcef833784785624c9694de6bb4cce4e873de6772b563dccd88f6e61c035e65e9ad48c3bc7628a9aab4a7 35580 xwayland_22.1.8-1.debian.tar.xz Package: zvmcloudconnector Format: 3.0 (quilt) Binary: zvmcloudconnector-api, python3-zvmcloudconnector, zvmcloudconnector-common Architecture: all Version: 2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3 Priority: optional Section: python Maintainer: Ubuntu Developers Original-Maintainer: Corey Bryant Standards-Version: 4.1.4 Build-Depends: debhelper-compat (= 12), dh-python, openstack-pkg-tools (>= 85ubuntu3~), python3-all, python3-setuptools, python3-sphinx (>= 1.6.2) Build-Depends-Indep: python3-jsonschema (>= 2.3.0), python3-jwt (>= 1.0.1), python3-mock (>= 2.0.0), python3-netaddr (>= 0.7.5), python3-requests (>= 2.6.0), python3-routes (>= 2.2), python3-six (>= 1.9.0), python3-subunit (>= 1.0.0), python3-unittest2, python3-webob (>= 1:1.2.3), python3-yaml (>= 3.10), subunit, testrepository Testsuite: autopkgtest-pkg-python Homepage: https://github.com/mfcloud/python-zvm-sdk Vcs-Browser: https://git.launchpad.net/~ubuntu-server-dev/ubuntu/+source/zvmcloudconnector Vcs-Git: https://git.launchpad.net/~ubuntu-server-dev/ubuntu/+source/zvmcloudconnector Directory: pool/main/z/zvmcloudconnector Package-List: python3-zvmcloudconnector deb net optional arch=all zvmcloudconnector-api deb python optional arch=all zvmcloudconnector-common deb python optional arch=all Files: b5534be5b87876b8a6bdd4dbdcd9e678 3003 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.dsc db19aec9bc5ae0f5cfeb80439ad53898 238562 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1.orig.tar.gz c00680eeefd910e29073aa5e22c614c0 4028 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.debian.tar.xz Checksums-Sha1: a657112fcc3dcd99c005ca42a84263686767d03f 3003 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.dsc 5c8317e48f31b8abdc9c890b03832a50950a06bb 238562 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1.orig.tar.gz 427d5c1366291d518ccd6903d5f3b80014f7eb66 4028 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.debian.tar.xz Checksums-Sha256: c0185816fc483c8891bb19267667e395b18e1ad7d77e2878f248bf35d7ce92ba 3003 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.dsc f24a37d5a0206e791398b6e7ae4698255cc6fa6e1d23548128259711b79ce7bf 238562 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1.orig.tar.gz 9dcbae9103f46cdf8241d50a5e59ef57b54e2f0d79d214dbeeb5563ba76f6bd8 4028 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.debian.tar.xz Checksums-Sha512: c94e930323cc7ea67083a4e7865d99c1c583bac3756780e184b8867178e27dc49d9f6475dea839c44f519851869eda407d24d5edf840cdf76c93d6fbdc6e1388 3003 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.dsc 206776bd04ef547df530438efe6209db7374c33727d13269f6f3632aa69c74713b358e628dc4fab8afc6657ac65a17bd2ec4c6f2984385de2187581fd734e65c 238562 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1.orig.tar.gz af8086742d6f0a46b4396316f74fe0d79a69a328b6bd4ac92b513ec22e1c4735afc07e2899545b4b22ce825d659be9d0762eb68d25da4b9b6426f8d5653670a6 4028 zvmcloudconnector_2.0.0~b1~git2019062011.4fc9142.really.1.4.1-0ubuntu3.debian.tar.xz ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680649068.0 ppa_dev_tools-0.6.0/tests/data/source/Sources.gz0000664000175000017500000011716214413125554020763 0ustar00brycebryce‹~r#dSourcesŌi£É•æ×Æ æ©1•Y±/YfƒːF0`X«ØŹmHfwµ`Ģo÷sIę¬\˜)Éć$Uņ]āøqćžs"n„~WŚēņq|»(ålYßżĆåź¼l¾]ŲSµųŁæ]/Ļ6ß¼ūÕņ¢¬~śvĮżRōI?¼ß’½’÷¤./ŽżrÕ>-7£m®WRŚÅOļž8VėååÅ· }ź®ü‰W•ņŗ~÷»ÕņrµÜPāåՆŹŁ»ßóŽöQŹ[æūmY^lųļX}»ųīo>•‹ÅÆĖj3V‹ļžŌŚ/śØĖrqz¹śųówæß”‹^V}}rū=wNÕ»_É×N~3®ĘE_»ąOćģj¬NŚåłUŁ,~ö÷ mæyæčWŸ?J£?ū9WNµ;Ķßlöńź|{ż-/®æœŠ¤’½½~Ń®Wė±ö·–XŸ•‹ęöē½7_iŸŽ/6ćĖņb^¾ū§Ėóqµµõ§ĶęźŪ°ÜÕźņO“żt}y½jcŅ¢qz16¶½ńįŻŪśäW«Ė×b ykĶkėr¶.§w6ų°ūs÷Īö•\nŽ|üōćróī7Ėuø”>¾ŗ¼<ūpŽķ?”}yæŪ9ČÉ[®7ß¾»ėp1Ø4msŪ‹‹‚ ü½ōüŽ=¶ˆ}ž~dkążcü9Īyō–gcͧGS^Åb|(Ŗ(?œičZZ(Éč:d½óćļ]ۻENJ«ģ›3µmŸķ:+SŪT%gµ°Y+“ī—€½–O7euśńĻļIõ’œ-®„l«Ź}”䄘L5tTĄŁšD vö—¢¾üłŻÆ?öy}}¾>łż§¢i›ON›ä»o9u­J&“:CPŚĒi|WŻ»6śKm,ƚGöŖ—»3Ū`|²±•6œļ½¶”l}¹­”¦ŖjņÕź¬sTĘOŸ­a:“³In$‹łŽŲf:‘V[ozp)ŖŚ¬S”Ę1ØčŠÓ«kź6Ŗā»tw/.ĢźK«]Łi{ŽÓʗ¬1kļ½dcU›a SÜō‘ļøŖõĄeTĮ$“.,z*G‡67s®ÖóÅØĘxŃJ­O7Ę>1WS±ĆdWbR¾Ī\²³É‡htˆ3šPt©aŖYKµ<Śē[=Ęk#>ƒ¦…ĪVķÕPņ‘Į§+ß-9Ÿ|k^'ž-Ŗa>Õi~OÓå6‹·¶akUK×½ŪjfšŚIsB ~–\C}F;«IÖהl6YéĘøq„ölüKÖ·W…ŃZ¶&ŻZ­5fF®X¾v›‡1> œ}d5q„ÜŠ‰™VQ»čSQ.Ņ0bͱ¹Ń2u“ŃÖbKÓ»Ä`™Ŗ«FLxwvĮV?5>śbļƬ­NéK֘„”ēŒ£h>URÕMū”c(½+hyčt­ŖĆŗŲ5¾™»ķU»‚k©¤qe«=ĆC„©‡Ēo»8€V“©ĘyßéØļż›( °^o.¬ĶXoĮ˜\ž0īŠśžƒ°łģģ›ż©ń×õśbsķžęmp>@ęݾµųÜøW׋ļvlŸ=éĖu»^Æqp¬Ow·NĮޟæūļtµ<;¹_Üo¶ ^üśŸ•r¾ųNž÷ļŚņ›M«Óū˜’ÆWg—„óÉo’Ģ;’ĀėĖ‹ÅwĖ?ķžśĶ-«Ļ§Wc\’ņÖéõ矿_üvżn¹Ł,¾;æāŸūdāżā—›Ė‹ååā8^®.„»æŸū]¹>[ü#ķ”f³ŗŗ^>šūå95śmū#ŸXŽÅwėóöĆ1¼EĶ[fĮ,——xĘź²]­ł÷§vŁéļŸĪĘā’,®ĘU’kóŒ×VžÜ|ŗ¼°[žcO„ˆż•“]½īż¾l×›åŁśīŹłeūü¾Ę‘½ė8’Ņ–'Ņ„¾ł éZĄūebq÷č3ŌĀ(Ę%ŠėōyÉ’5³ų§q±ZžŪõąÖā·—«2֋ā{ķÓõ§ÅwŸĪ?żõōæåŖĮ‡/œüó®ŗŒÕŁå¾ŖŹÅEłtśńāz T{!枀WĢåĒc„;­łphŠ—1ń«w^BÄ»ĀĮÄŪ›G”bŠ EPØ/x:rØ j«  AZ „ ś°Üļļü`ÆŹfļŃYbs½kLĖj Z€@m|5ųt!OĮb‘ØŖ| Æ¢÷( 4/r¹_”Hƒų}L£k!˜aGīų'āöž2@™)%.¤UeŽR×.Ό0 Ų!NP Ż–ŠĀ5ėROu‚ē:4Õ“óP‹āFD4?R-7•Õ1­@ĮūįK÷zģ¹ f2Æ[=ŖX%Xć*č;į#”#Ņ Ā`Kü(=5ż–Ö퀱“ŠI€¬R!Y£¤"4 15pœüä3_ŖX”ƒ#©zšeZŹÖ˜¢­ JGŠqꉺ|TŌY‹ŸB£"€_ĮB°Ķ×”~¾öœ“é[iõ¢u¼Ć?Z€}„ä­÷Jƒ]Ž!žmžōEkj“Ś#v1”<k=u¶éčmAą[c{¶€†¢Į§SŽčšŃzgl InŲŽ4²[#tĖ„fÕz¤uļEéźģÉünŽ(yvŖöžƒŲružcY¹¼¼XoŃƟ„żtw÷ėłÜĆą®æU:Ÿ¤g#ūVC¼{D俏_.žquy}µųījדõ/ž­œ¾Õżkfuq"±ĄēÉžļGĀųMŪśōĒåēåégņ³mŒ®‰Üė}µ‘÷½n6ö ÆŽž”½’ÖÓa½–ž Ŗßæ· źBTVĖśaŪĶÅ>ī ļīló2<ėEĒq;ĮĘå:ܶfÄ *•^ƒ7®”’é yßop7œ5,t:cB ĘG™v µĻ8ŗļĶUžóWÆßM Õ?‚ā©X#M”ĖŠ+“<Łā6ąÄčŒįŃJSꀋQSYo2ßG‡”S­£¶xš2JŒO/ —+aŹÜx§ąf„ךT­[(˜Ā}Ńőڒғń¶5»€e²čż¬RŸŗ§‹L…ł6z=Øö3ÅYF—•€1bÕ¶ćäŃ3ņōtPŃåØž…æƒÉØżnZÉÅUxī—cÖ(`ĢżŠI.4g†6Š„-õՊŽaA]y?ĒōUŌgPĒuß°Ó£ÄŃāŃ&ĒG}d|ćŪ³U‹q]Ča–¢į=Ī`ē4™+X8Ś ”HĄv©wM2ūŻPŅÉFē°¢8/ Öót«BJ4…”/I™’=¶ūļpžĖÉēåŻō®ŲŪūü"<£½”€åNb‡g1zWąßrb÷—g~¹ųķņģņb,~¶Y³ååę›Åwewē|{ćålŁĘéró(ųŪÓō ųo§4ć½ Mlö¾Ųœ ±‚ |:Ł·s į¾ß2czzV®/ڧ«Ņ·kÆ’~PÆ_€ē«²ōwąū8$ł°ė“X|ææ¶`ø»š 6“r¶žĮ”cDåT!¤f(89CÉn vņżż^Žė¤X"N©ęJ*ĮVFPÉ®Ÿ)BTĪg{}æ(ņn”ĶJϾ¤œŒé ie†ī½ūNŚa[±Åé4ŸÆŪeØ/R3bčģ“ˌfÓó™ČœĆėź·ƒ˜¤ĢŻÉtØˆŅ¬k0ŅlÆ e֜%+0’ Ęš‰ćō:t†f»nüLͤ83¬‘°AģŖ#Xc)j„  [VJˬģ€-d!ü<¦»vÆkŃ~ZQå1qˆ`„|³1å^ŌpŹ)5³·Ä$„RØ2瓵фڈ¶ft•Į.D’Ķ<ŅZ!Ī£‰ēy·ÕwЬ2·ņ©!mH§:õ¼E*ZÖ”łŗ¬&@8BkuŻh½½žXŃK*š”€(×1gAŲ rĆX4}dų®Ć'R*m—EźQ„¶^[‚ˆ³éE‹Ž ¤ZŸ”««õ£±ōöę3©+ń4ž]~6€RŹcē.~éż<|žńŻ.ԟ|ŁGĶæj‹$°ģ¦Ž/źr}y±›m¼ųų0%e'Ķ·įT}s{ćK«w–ć]2ĢöI½Rž*ē˜UŻ=͵«ÕYŁ{4łī…/słe¬ļæp½Z_®ī§ŪŠf’Āų²yšķ›ZĪ»†WŅ©9 ū[˃†ÅżÕĻuOŸhÉłõõwVXzܫ޷ź4sۜÜTń°‚ś¶‚ē×»6~©ĖĶy‘Å8,{µBŲļ®oõ9·ģ^ńŌ’£Œs|£×#¦ Ņ~YģźźĆ­æ,2ńiłå®šøvs}‹iüx&mkdĶ¶Ø¼®%`« pĜśBČ’mßoGܞŻ{K #°CtA¼ĀćtCB!ˆyį"ńׄ‡/?eÉĖü׬9Ä<»¬¾¦f;Ó^詎¹Įō’5 ‹Ö€ēŗŁą\m śŸ$…G‹>óÖĖĄØ‰ÖΧėŒō-9GCŒ0-“„Ÿ V0oSūŁ “ĮT06ŗ­ÕsZūš¶ģą+(ø/ąŌ‘šŽŹ0üf&ņŅŠF„”†ø@/’­¶ ń¶ŁļF4 R1MĶ ”;ŗfę"¢YP-0FFūXWQb> …`&3E×ōčŗ‡gēis)o©ź.ī·`[·„¢4ą4“%«Mē 3š-+Ėš#k%0҄܉>&¦>¢D9‹Ž¬Ś7o2ņE5w#«ź¦6DT3Ń5 C˜šŗ+ķ”­YCŗk‰oiÜZ/£U%¦Ül”d=0<‡aš¬n`cÉKö¢ķ%E4nysWeŠXŠ9” uX²"ŚņJ7.¾š‚:ŲP”/tRč(¦ Ž8żʱŹęÖuØØ‡sG‘¾šÉd³wŻ&ѽųŖŃ®dCēŒÉ[)ž+鐻Ę?Š“FNCD$>aÉģrĆk“Ī ‹’3ŃˤtĄęHć"Ćóˆpl3Ģ«šąo“ń÷—ĀĖc«BĒƋū—ČłųyZL= @”“Łærbæ’7eEĆŻ|ūīfżšęĶ/3…ž±¦—ˆR­1čAYlüs½zÅ·GY䤵ˆb€Ž!yū}6I||”AŌ̌Sxų‡ Īč»n]“ÅÆųśYęĻd‚cAXIU!„ń––ķ„BB×Ķlv…kī#UžėPŅ Ģ¤…tæRŃOēč[˜¢’:¤‘ ŃŌtX4Źč”"Ąl&N;R€…øŒ^ģqa>āųF³¶—-•E¶.tXϐõѲ ¹Z±“0(]BN'mrŌyV« 4Ąh¤Z…jŒRGœ 0ǜ#ZhnšµPž‹3+خ܈Ęu­¼K’A;BE'čŁq–=Ätbś ø~ūÄūß'×ę%¼’Źļ5 /€¬=µ·õ4Ģ>:ķn_¼ ģ·ó¤/A’_%Ößuķ[āżķŪ/Åü»Ļ<÷oo>ūq«Åõ.+pŪļwiOćrK„Ōe TöCĶ\‰„@ĘJ'D!ŗ’ ‡ŚŽøŸ¬B“ä<:F]ˆkM¶ŲŽ&NÄøŠj»kēŃžĀŒ0 RÖN€EŌĆŲÆD-G\ąK&œŠé…ŗ«Ņ£k3‘, ’ņ!Į ēg]łŹ:ī3%:¢ š$³Ip ń6Wˆv” åŲźģšø4ōŒ^Ņ TģĆźžPó…Śk•u÷eŲ’ {ūTTVIāyņ5'Ė5„”I3 §rČ-/Éų=Žnź«[µĆ B÷Ä\F’ąQ@’hK3£4ŸG%Jhm(Ó”ŖlæsŁź 3”J¬?\EfÓó,NUU³rŽ4­K²)…ki¾’mÆ mÖ°TWFŹØŁæ`•ķ4C*$ Õ!Ķhį™ś¼·ėł½Į z–ē¶óŲtW˜ƒŚQ[×fFuD¹±33†b'BVVߊģõ u“"3HŅž \…&J¾ģĖV}€DŸŸ/`ÅĮS/-p±1ū?Æ|JõŻœŪ0ß.WwšE(łož¢ļie÷Œ’ūJ•øŪņžśĪ“Šėnźo,°¼øŗ¾æš·EĮ§ąńpIļķyą­oɃžɃŹū³¼E ’ Ū&U ÉõC[F’¶hæ.łū{oŸŽ\\ńU'Šiš Q÷4‘€bš+Ź/L„·«ųBYO‚ ©aéīÓՈĢp!UKKsJS*@ā+ź$tuS|-»VEyžšz*,šesł ź½FbnµĪ‘c  FÓ“¢śźiĄ@3ōŲzÉY¦b£ ’ŸR}ĢĘ °•įóŃ-¢,„¦$ĘÅĄ›98ē‰ėyʬ¬‘4Š{ŪŸ7ō0ا‹Pµł/hé,+by8»člŪEēäƒK#å‘q“ASAȎÜPµ"1Sl­ÓŖć1QCzEqEŁ&­š÷1ŻŖ™~V²Ź7”l HfĀcf…i¹:ŚRµKBdFIę‡÷=EoL N§ˆõ5ÅC’DŃY¼Īt“õl*øīe3|€†ōģE”k-iŁvīT1ĻŌ±iÄVĖą+E6y‹%Ą†T·Ķe„}„ļh¹Ž|z4·wž;Äd»ŽoNīĆäzAs!„_±/xŠ×SĄō`mģ.Źæ_“ó¾Ż)ūݹølāØ?[pßZõÕ]ŽzVķl‹}¼åāŪ2>’vĀyĪf%ŅĀĖFKŻIF•0Fµ+ķū}—ļtō6£ģs±ixF}mo,‡•…Ń.}’ÕĆó¶go Ó¬vQ&œ€ ø;G³’+|’žšÓĖ9OĢėBÜgė2½A%ŽŚ”)hi |ŽKŹęxŖ=Ī);J"ųč\„–Ė&˜(»AMņNN9Š„åōb»źlU2„Ż‹ A ūƒŚv—•ø f# É©gŗ¦²m³„8f³¦“’c^޵Ō~F®%k|ė½m7O)B-2Odm3'^†PŹmŖœńVŁ4ފʈA%‡¢“Ų¼b ¶)ł§ĄT퀖‰uÄśä4 Bsįę”肿!ĒÕČę²'-œFÉy8øRĄOQ«VĪ£ōB «³Ƙ’ŁåęTC—v§ŗda 'TŅć6»}P •¦ótÉ÷‘¦šé…ÜJ€¦v1¾ŲSrøÉĄäiLbĢÓi†)€õ™o÷w±$7čBą_rŪńCudzj}ās²c„»„pFµ:Ęz&œ4ō ‡Nµ"¢“DŒģč–ģMõlOß®=_»nn>“.EėsŖwRģ?™Ų»wąĒÆZ-ĻæZ]Ÿz¹¤&Ÿ—ułŅŽ`I·/§?¦sžė²Eļ¼|_c `N݇²’zõ÷½_¶›ŗŹ¦|øé- ŻB!?¾~—ŸłI$¼¹’ ÷ןĀĆ{ ē½@mėfŽä‡%øFa¶©ćõ’‰« āŻųżCGŚSē”ˆn²§†h’¤HHGm>(™aY Õ8,ęĮ‘S±::9źĘ°>=ŚŹ0ó.J:µŸ«ÉSPI˜ Œ½2e·PvąĆ$N¢VZ•“¢—|å¢ĀQMM°ę’MSšt'č™c=G‚-ņ/¢U(Ē4™P–${—ˆ3IĄ6J¾ł€+č Āµæ­é7ņ eZ“ń)ūÜsCŹHd –$›vdׯ.yź@g!Z°AMY^JŖ£Œ" ņP¾'9ŒĆɞ9Łv=<RœĻDs9gÉ%ź0Š‹T)5ɤ‰I§tŒ± Sć^V9jJD"śL²¦„|/`…*‚" :õHr^•Ÿ»cøŽfÄĄŹ&’&#»"¾IĒå–#Ųd"ÕP°”÷…©di‰ģ†a ąDsˆU¹©ˆž>b©Źs@U­ļšžGAĘ®G}’쁒ƀč^9½£Õ “W3€…øŖNh­óAYj.ŗźķį[aä"R*wxõ›B<«£L […‰”’&Ź>0œ^Ą ąY‡ć9ŗ(¢éŠõm”¦¬ŠXC5B‹ź1hZ8ŠLńĪ‚æÉ±`ŠÄ)Kƒ£ĄQdžĄå¬ °cv-A力`Ø(é’£c=-ÉR|¾ŌŚÕšD9IĄnóŠ [šiŻy0@.rģŌ0@TxĒķ÷°·ķ¦e_:óę9żžžÆƒL¹ ;7ć¾ŅT2±w¢æJŠAµ­ŹĮQ™’ÆåzR’ruQ®;ļģŠ[|WäŽwų#ÅīĶŖŽ×yyr>˜į½…öÆĻᤄӹ’sÖŸ7—WRµW«]9®ó¦‡‘ž-/?…ö7žųõ”œ÷Żķ„5æņĘķ —gż™³:oū¹C=o%Ń>·ķō›¬½Ķ.K÷½ōé]Vm.Ÿńv\}ąš{­ķ#0 "Ūį\•3ų¦mÅSؚ~!»•}PʃĆ%»‚Ø"`øcč3ēB,Ą­]8/فOŌāłŻÜۓĊ %®Cėć“hf…öŖ¢€!ŲV’÷ŖB ’œy!Kˆv&¦EmUCś8Ū†Ešюi±©E8I²`–¶)ž²wVMŌøÖ~_ߌņ}b‹SÖŚ ūz”.ŃySGCOä7Ń p± (‰Ų–ų;¢BZPœ6Öj]_¶ XŃéPHž9½­QLŪżꈰBų‰Ŗ(ķŹ™<$ a±•²Ō0ŽZʐĒęT%N3µä›*ėĮŚ„¦”’«ÖPp¹viT™9½Õ†;>Į~'g‘z§†aŗHŗĪœStTųŖ¬[+/g—Y(ę0Öļ©ĪŠr¾ ˆˆš— Ažš e“øĪx!÷s”%ųha„ŠŅ„–vՄ1ėĢ™jyŚČ©d¹¤ 2Ż{Łå Ä.J!~Ģ ß“£ņŗVh^8X9m"—'@²]½0€†ĻŠ †‰£Ż‚å¾ –å@<';U!.žŃ ŽéĆ@VŁ1 ‚H9J­KJOŒ0‡©ś”„ÅĆo:5ŹU÷–,J?Š[»œo0e-ĖīsŁČæK%S°b1b^Gl0£īÖš­ķ‘G ķŒ‡ā†WųĄ×tād)›éŽ!ŪÕūßDZˆ×ņ‡’ĄĶ^ǧ;ļڽŌĪóż…G—{Ģ{?rBĢ_›ģ{ż­ģ`÷ś1a’”Ē™ĀĪ…^:ŸūŠŁŽ=¦»vƲÆ6[āŖ#Ü©e³±%˜„-rÕܝ›šŸęHÕ$Sņr"“’i¬D29„wäI~¼Œ‡Ē¹LĘr@dź§Łī=¶eĄ»¹Nøe«ōdežē’Š BaµŌ2“ě0[õCĪ^5_|ćļšrƒ[–d"bĪZÖŖISöż…Q‡œ”¬aB5÷І‡¬œSŃäDÉ<ŠAĘ„ ŗ;ć­ŲQ 0²ĪĆYBfBēJž—iqtl÷+rm؁‰žrŹ ¹1Å9¢łEӘ©t²ŌŚY9¦Öå³ļQŽqŹÕޚ°Ø@©:µAˆĪi@½½ĀdÄłn»Įk«enqc=³O>ŹyDhŻĮgåx*ēa×į~“³“fāŽjŹż^ć1`hą¶Ø!gv¬¶¹č‹,ūbhx«2céŒ1S›©•’UIŹ–ŁT0.ē坽÷†ÄF±wY‰ĄūµĶ2ke!<ŗ+üĀ… į<¢+rFmO2Z5s+9–źąMŅJŗĀ[֓[Œi†œŹ*7~ĮI'MĀnBhu‹Ž2tuĮ¶’‚’šXKZ ōź^Sör@ #?:Y˜ÆéJHļŠmō2  Ģ"9a’j-ך!]t¦|ŁhH7CWĪ™‚ŅH2˜œ³GkmIŪ’$…Ś„0eåŻU‘K:n•…øeĆUt²‘«Źd~§_į ƒĻć§õOēėcØĮžŃ»)‡› ƙd°’‰'žåśl9.æ)ŗ¼†q“ep¢÷›H‰=ͧį!)iØŅ!ĘĖößļļ)Ś^O§śōi’rŸōO'²Ø‚o©{:’,}óW˜»x~•ā€_ģżēˆÅЗ߉”ÜųłćåʓļXŹÖ7æ¦(÷]ž¤Łyš‡ qa’œÕņDY‚bĶ$C—M‘h•ĢVE(ė±[ƹšTQwÕzž³d7ä“ģ“]žöy˜Ł|”’ƒ†’d‚8䌓œ9v¼ Ą 3”ždM3¹T€'[(”*Y‘U`†nõU¦ĄˆB{Ā}œ賬dg Ā*(Ö䊔æŠ$ū<ƒ’l5æ!6/č*§½ƒ~‘œŽ`œĖ“KR›,`ć«pCĀ_Ž7š>9°I6śōį(äįip °3UēåØ&(…²÷ŖŲ‘Œģ1ųEĻÆ2¢Įµ”*n"XkW•>‘­Ŗ`½ŽÉ™gq(kŻš+›²»ė,K&Ó:Ÿć_jÜÆ” -dų<ŽÅąŠÕɚ *ˆ“ I`c@ £©ĆPÉ’q B­•<}7œĖ9U-%Ņh˜E7Ixʔ•Ā$ y²ÉXÖō’$ūēhCcDóļ+£LcʤŠć’²wf»%ɾ÷SšÖ@±:÷؋Į`/c_xī ‘›J]RI.Iīj`Šåš‹ł’)‰‡")’Ŗ` _T·ø%3OĘ™X<ŲQ358u‡!M‘WÅL`ė€`ÜšĮEč†aa ž#…ŽŖÅ„–q£Żzo…‘ż®e*࢛Ń–JŖŗ“:”tV‰ū]Œs“ž!+`לpŌ?~E<ŖĘ,ƒkX8+ż’‚q Īƒ«hÓęeØ!Acx2ŹĘtf0SļR¼s¦VLžE õįŠ3ķ Uvź±›+ė\ÖÉĖ·ėĶ×”vż’”ēōų“”‡rO[8sp‘fÕa;VešłJ®o¦ˆ¼z¹:īcĘ߉žéŁT“uˆ×Ąhć±ŲĶF›ƒžU>Ś~BŽb$¦¬IĒČ =ĀE±š‡*Üpg—³ó®łćģ![ļqĢ߬kpķüŬLEoŪF ™Ī &­BŒŗÖS{H§#ZUFļ黈ģä>-Iqőž”k@!®&5ø L¹\ŖµŚ”į«X|:ōüą+C¹Ź4ć@šč«ä3+^Ōl|£\™ĘØķē’õĖõQūHøŽk÷nžr¶]ҹždfƎYGŅKżžļ?\åBՋŠÓ£W’Ž«MˆZ÷ļ õņÓæżćßb+ £öģ}°_®")œb7A=Žķcce¦'㨠³é©:ž›§l­95¦‘»ć³Ą,IĖHAĶR^ °I›³ĀĒ­Ēóq»9kŲhŲfi)–G–=‘Ģā°½<Š|÷=§oœE[+¬ź©~k*¼[kuųjó—z:ÜZļ{ъO°NųWX£µhÖŃ“5¹räm[LŪ?“h§ kp#<ņVŗ§ÜĪׇ‘#o_Įš¦)¢`ėÄĢė, 6H‘)rÅoh†j©Ŗr¶UYšź©ē‘³o)1qr@uÆpć#,T¬£ėE ³ū±ć¦‚qÄķ4å$fÓĄ:Ų‚æ™kQ ó”§–hU‘uŪU»m­;²į*°£v£kdV š?žtph5Ó}f ‚8ü@gć[Vąa†`BŽŌ ėĶ6®ŠL*Ų\‹)•Ŗ9M1{҇(Ę[­¹D[ņŚS>[Ū]#¬£ ×zX˜ČFdmzĀCļYÓ,³,‰±Y·“QŁ}¬­É›õĪS µYøųŹĢ”ķƒ$Y7›×Æi_žł,Õ`0qL¤^‡Äum‰!–6XįM ģķŃ7ž5ÜOƒ‹Õ z„Ļג°Ī,Egb„cmøOwtDn“a†„ē čW¬³yÄs¢bō>85ÜŁ ±6ł¬‰ī £+3œŻ·9±n|ƒ3Œ)^ƒž—@\KšP©Įq-š‰Ķ° fūč&‚[nÓ <&haå¢ÜŒ—‘+,N”w…Aa\µüdš4®!ĄųŸŠtV„ō`Ż* wŲŠ“+\ƒźšN\ )½V¹ĄĢ—WÅeģŁMŗ6ś¦¤6ÜLz)’ŒØ‰ ?ĖDšk¼oKŠė'Iz £«ŠóÖŌ``U^ć€ELeĀšĶ(]¼aāi•yŖŽvŠƒVF7·Wš”ß%A®ĆjFÖŹ b2Jéj$GnJŽ }@“Uöėb€F›ź2.¶·zgzcuc[¬S¬ŠB.¼Ÿ’"µX.l:ōbģQÅŹ |K®'t©øĆŒ[•7MČä™"Ś…gc“Ō2Ępż9@Y–‘n‚¦wåpGBxō-®ĒĆ- ü±M.. 5ø#@LBƗ†ńP¦ Zķ{ȧ ‰ ³ß.–­<Ü-oæŽ|ūõąŅÉü«ļ¶^/)’pP_I–ÜҤkX÷9Ą½¾”ÅōV’"_`¼’s“ų@£ś0}ø¼~śž#Ė*}Ś·¼ńZAśwĒW¤ēķ7é<޳>ÄłövSĖĶĶēå·ė«wWk•×ĖbŽÆ·ƒŠ{TåĆg÷,jæÆāü˵‰UIf"ŃOćJīoåóO[|RńĘæ=Ŗ|ćüwQa~†mT˜}:”‚“ėĖu£&Ѿ#ņą/žŹ-q  `ęŚäFķxEG%€Ä¹sž·’q=ž×©°™³ SXɚD•š§.\f¼*…-øĀ¹ćĻóČ7ęžöę07ÜyQ8€Ä*!”©b‘žŚßs-Æäź8z=)Q–>3 €ÜĆļŌ~՘öXyńµū-Į5W]3¬Rä`ņ;—Š3\žØ\wšG9ž¾i S//«…Šs „)dąéO.+ī'œw’ėŒĢöĶ'=ĀXt[QĶĮØ8U‚©‘kŠ%«P·Õ°XWģŠu-åüzĖhź¹Jń,':„±,ŠŃR2­vO•é­FVǃø°˜½œŠbĆōĢŌ%ńuŠeķ‘ZĄĒ ®|ö†’»ŌŒy)‰čį¬ę¹-¹.mBÖi ­ā †ƒiJ•ž/ób27 ą™ŚhØĄ€uø(ń“_\s…M/cĄīF©V1•a-UŠC~`ų£] %2¤°š(“ĮĆfTh@›^ļ Ÿ!h–ĘÄ%ŪGtK†YÅ-4\=Ó® o…‘"C:.=1J7Ę ančH’œkL™qA˜¼mC܇ŠY|.YeAK8‡‹e¼oQ'<óVŪ)²ß·P€*æRŠÖ“ YB«aJbJŸ„ą? …zīoł&Œ2kØ’6*¬'ʵPķ Ȳ—©ńĮ×čzxK×'­}&UČĘ #įÉ-’‚;ø˜ źÅX”åz1|šv/æ\üư sb¤—ĘÄŅvhĪĻMcśÉø.‡4Ę2ÆN3ĶĶ—’ÕĶČś"6­Ūū¶h°e@¶ąf}U·7_ļåplĶĖÆæŪńŽ:Sęåū{č…ųH`čó1K#/ačū®ü¶ś1pu€Ø.śM½zčK€Ó ĮĘĆ]·³w@WUnͲ\~Ł~’¢}^Ž^~+c¹°Å_ēļ?qß}<åF¹‚§ŅmkęŚŲ—ņ”Ó%=}`ßė'uŹłįļŸĮ~K¾łōĪķåmg‰ī„z’|nźõ!žēćG«÷ļ~½»ļ×m*ןū0]ņć78kŅēķŻü­U)Ļ]ļ-/.gotļoŽÆó‡ųt€żžžkļ?­ž0čŻIUÉ_h»X–Åü€‡Xw~3»xwö½{ułåįŪņ™|_LSūŁ—ÕŹ÷MaG³c©Ņ°ļ ęXG•uä²H䶁Z`rO;Nńqk\ļGĮƏ‰1Ŗ·@šL®įńCV&Yøįʳ4̾ćĶĶ©ń@ Ģwo«”QČÅvtPG]Ż+aQ#Ŗ a4QĢ[Ņŗ:Ū… šÉ P¦wOl ­[)Ī:„Š”&XuŽDĒ<8†„õ¦˜½’“Z„9ocCK3Ę;zŗ¢4Xįr‰•ĻŁß}—ÖY‡“«š(Üų(E…ļg•AU,ž[ü"Ń”vœ1›·Ć¶CmøŚ“;­Żą~h ˜öUėDéŪR…[—Įō ¶(Š4ą³l1ĄWsµYgeF“§µ§­ZEüĆupŗVĢßŅŠy¶L‹ŌĪH¶ŽŗźZF1)ćūšd™Ģwiēµč]11ͧ5¢r†§ā¤¤-¹ƒW[ŠL~$ć:U›Ū=KˆćŖĶ€Ū‹qgNÄ¬%’%¬];XO £$÷”„Z>}4 ōˇ*pĶžÖO#öŲ)ņŗöq"ĆźXK\‰ƒ·lį¼T’µIŒ? xr1`•˵åāUkL¾§&­¶)ŠĘӋŠWźę:h_„ą¼µ€‹dšßØO ĄóŌŁ¤q­¶ĮWŽzŖ*Ø4¦EžĪ{¶:ŌW»ao4«›‡yƒ-=ČļĖéN¤ųõędžl<Ÿ)ŌżVś½,üŃp¾ŽøüÓæżūŸ’øxžąnEē«~üī Ÿ‹ī_ūõƋß_ÖO²ųšsį’·y­GĆūŽŠOĖ»žŸŽĘź.€šwżžćšī©ßī€©'šu…­V;©O`,ķ¹d§mĖz‚é5œ»µ@ū|ō?Ēū­Ž/›oŻ^½Zõ=Ēé­5]ÆĪćČÓ{Hl]~må ¬ x'ż^Iy?]Īō L½æć9YčćŲÕŻM›øtų™=ā(Æ.ņī:ó«ų»śŽ„«æöAš#šRÕ%c\ĄīĮ@9•b-°œk›SӞŽ‹{Oōq{xTu24Ļ1EO©‘”S¬‡č`]XŸvĶŅóĆn­y‚z˜L„«4% Z«}yˆv”AĄ» ėŽk=Ģ«Xƒ4Ŗj `sSa*° č!X&mœœÕDµ.e0ńĄ”H]¶Ć2Ó*Ji±•óšJłŃ¹mGĆŪ”ONOE¢Ė¤õģR ”ķß³ÉÖuIeŹBģ€! ×Ų¤1× ,žFē21ØŁģpĖ͆ąˉ6ŠåźęõY™,u€Ńh¶2¹bHk–8³A“Ӟ巘I—sÓ R”j”ģ¬ķmĪkd€yؘ@\‹Hƒų'<œ’«ĮP #Ūkʉƒ†jTé{6žŠlY²­šfŠĄocõfįĮ«Ø®'X›¤p<}±ŽP)L„IÖĒ–+-ų@iQ4†v`DšĻŽ“ ę/ŒRĻR+S.[čNīˆĒXbZOTĘRgtžŲI²9F×Ń©x»€óęKŒP$ƒ3’Æf)¦K¶äŒ ŸšZ1ŽŃō[0—įǶ—F±Ō=¾‰»Tl`æ“·Ü§0Ø“ņ@ęx^ēFĆ”o5Óamc5Œ qŖ1ĮÕżŖøåƒ.gįza ęĪź@ĮYć˜ŪŅ{ІŒAéF¦dTŽ˜éĻ%–ø/]TYkąų…Ģts…žF½u²;Œ÷ŸO†FüäUd„IŸĀėžÆmjZp=Dk;M ·Ļ<¶ڶ×;I[vļĀś?¹ƒü“^2œx孋„S’æĮ•įļO"œńŗ’| M0æTŻ;f™ćaāĄģŽĆRƒ/lķīgīžóĒĒŃżA&V}G‘_Ģ£„ˆŃƒÆt„=b°øĶa—[½q°ł”ćcÓ”õT7̉ š25 øĀÕyÆ^9ąņuč© •Y*-•<µ$÷.)ŃĄ@zĢ˦žŠ2¼«°:¬Ē]8LͱUząoØzX ęéM’R­€‡Ba^cfóZ3Žl¬Ó­ZĻüńę¦YÆŠ BĄYBŸŌ;š†y\CS޼‹a£]L¶5k#ū«OUWF #žŅh0l†ŗA,Œ#„%2bB¦ˆp#¶Ō.¦·2|¶ö·­š®,‡»§ĪhĢŹĶZÆDō•am.ŠMŃłƒ5o†ŠóXŲ1c<Ø9ŗŠY9­ßÜČėĢE£©ųa £XK®ŽV“+F%ȱ•™rŚ \ Źt˜` O•t•˜ZQŅĮ €˜2Ź™āX`]zbČY䊗e•Ų@­Žœ›Ź8c£”ł ˜åU&’nŖ OtSŗ.až(fą6F®Ō©ČÅ7j†8„;f½€‰3.ŗ°Ž°Ō<ŃΌöµą!g„‡É•ø<ųI†÷ƒgeĆu~P„?£“‹B5“°ŠŅóø|Œ–ŽĒ=sĶ<ø®mRb²öܬW. °kxķšŹØĀ‚UT@“Ģl\\o”ą·ūbŌ[CI®¢øāiR£Ų‰ŅTīˆē ’ÕŽ8ø WfVyŗ._ĄĆÆ(†RrSķ.x†ĪģŁ<öė›ć/ķ̜–īXżņėa”­ł7Gś„]^O§žr’ E«Ŗs?zÅėŸšŻÅæ SÆšß_·V»n¾¶KœźźJź§Å‡Ÿłrž?Ėżż§K¹[üĖÕĆõķķāƵ|Žś—ČśÕā÷—½\->žož’čEīīykųś?’}A6»ŗ¹¾9F ō„eµ½…«†cNłėõ+WzZ’ĖŻµ,·•dĒ_ĮĘ«¶¤zœS-ĘŽ8¼šŲ½ņJQĻEK”‚¢Z-‡?Ž™ €pA͌=^“š$€‹ŗu«Īɬ:•y_^ųL}ūöķųŒć›oļ}’ę—Oóī[¹oĒƋ£?~Õ ŌĆG/”¬Ēļx\=¼ø`Ŗ­ÓįƬģš6JŗjLµČ%ȲœAņ`›;¼ī»ķdŲEWDՁ,)o˜—ųǜ–æ9!mčA³ģ'W8*āAP˵œ  )•:ˆg.֍ˆ¤ķ8–kęVļ©[Ē“Œ Ł>D:/¦I^+% Īß©&MŃE3kŅéżhō&,6K“Ō{KNR¢HöŚ;’õ葨 ,.‹x ŽY¢ŁńKȁaš—ŻłĪ„‹7€H&É“RóxŃš5Ö)ų>HĻY”•:u‘Š‹§ ` =S.ō ::Q²6dNāļ(~‘©§©1ŃM)„Jü0½ˆA_»© ÷¦OßÖö¾ł/f­Ó&d˜š2%AüČŌ\ų„œSéĆ|§”¤eq} Ŗ&pēĖśp u(ž„48›™LįqµüĶ;ˆĮ ŗÅQŌÖ 8nĢõŠwp•F‘–1ŽØāY @M-41- ė±įÖѦ…ĪB‡,£»`gI.ĪĄIó1‡)<`„o®Š§s›8ĢI:ƒ$Ō¾ĄĶJaXąŠ˜ øR¢—d¶€ ,Ęvšił»„Tš„‰Ī˜Ķ€²×°¬R5 K@kA‡ē”Œņ²HŠ®¹ūʊn.Æ#GU>7z>vpžŹ„įJ€/ļ…-^ČÅ „¤aCŠJƒ tŠį!zd 3÷1š­ĶÕŠ&bī ˆdģ@+vM’Ø—Ś¹Ač3üLYP„™qą9x$3ŪxĪ@bl ģ\|ņA'Gģ×ō›Ņø §‚b¹ƒe¤e“‡÷i»’õ“¹:ļ,aaĮæOśņžÜb§ti#s? $pö).„BĆSš!8Hqr[ōx©xr y<JĘ÷@ĆĪ6Ń·Cx%uuJŁõRńé˜;°,ū—Z>ŪÜä)ʚ灔£¦į™;žILČĢŲ®FM.“6Šv;UäQŖ)łØ ,ę ÷K„Õ&;;ČĶÖó…īÓĶžŃ4‹ąī5zšĒ‘[Ś|»ęyhõ1„>ŗwÜ Æm =^÷ķ(ŲI9÷™§Ė6čź6(įa©céŒ]'Ž2r­:Cs™Vŗ“ūÓE“Īå§Ü)Ć·±‹Üż5ßĻ‹ŻϲŖŒHVƒ †"—ŃPQN'(ņńsßFs|#ėR3U•(eR²µqґІšĖ]سm9>“Ŗ„37Eœ=8É«‹RxH½"š"ö‘VŽs"Śą¬Ķ (æAÉT, AS©Å³źŽyčĶ -ś)”c«ŠžlčĒ( YÅ[éĆĶźƒ-ö°Óey#Z% /»’ õ³φ5ō4śp6jŽ€”²4¹€ūuGÆŃå”įšŽé‘żĢ’Š’)CzßŖ:yŖtšĒsĮ©ćb*w‘X©×N'ł¼Ŗ×HńŃ2äŒ^<;䊍ß2]“¬‚ÉfĀ’{x«vr—©I_āõęyh˜M •Č¢S½0©5.UšŠ‰ČÄ®Gæx˜¢3Xœž0oqtMapoÄ”Ÿ+5=kÜ.f†įGr.’ēĄT¦²”āĘhø6w¢DYåėW> 6‘ ą,Pš5‚GĪ­ž0P!•6ŗäe5alĄ 0˜Ō55 Œ˜-īøp±¢Uń‘&y…Ü91‹¶“ań o'ŽåĒŖ§é×2{źĖ2!"ŪVą'×ĪRš$ü€æŽģ19*…£Š!»¢"J ˆ”Ŗ#ƒÅDBĀ6‡ébƱ¢¬ĘżŒŃw஄&G –kGĆsUŅąē…^ž]Ģ®÷ĄÉLįÕū›Ļ_ļ^}+Čzē1 ņĶoȎ‹ŠĪž‡.וüĢf›u„Če „žōż+`Ė–›?mŽÖļųß_v©āĆūś {Tß“µ#ææßū­)ĖćnńÅ·Oųzż²­ŁŅūĖcy½;}öžÓµÕ#ǃb}ŻČŃ'Ļb…ćo9† 'FŪ y„§µ"ˆnƒv@t9šGPĮ¤+µ¦µy:/'žf>jʻƑŗ£IžU­Ś[v˜Ņµ¶Ź"†A1ÄI:³ ܝM'.vģŽ@Oń‘“^'7j}pŗÓź«­cc³®¹Ņė²TVŗŽŪɐ擐z²;B™dXĖq‹K·y„zoūL”‘Õo#śÆĄ¹ĄßČŖ}éŌū^ß§€`„dŗWU¤āVč„īĄT„łIk)·T+^Ó·Ę{„ŁåĄ{i®°Ä=‘;žJvČ`>ˆ®écvŅ2ŪśhŖFI芊lg[KĄn4°“–ķ÷õ ŃÕĶŠŲ`$²*·—Ś[ÆŗXš"q!ßL Œ~7&(•: «>GėWģ¢ kS¾`ł½VZ}¦¤M<}}›Ž$¬$”W_‚NµÄ60Œ ¾åŖ§Ó‰ ‘¦i¤3øv tćŹč;¦DŚ£ņh uhž-/žČŪÜ»ī©aJ°–†É:(FkIø³Ī†EIž#ĄTUļ~&N€ŪŖHß?ž4wå26z`V%1֐{P”š"m̊ĒÄøź!XŪyĢĶĢB,ӛč±ĻŲŠ1PŅPVæ+ĻX%žŘ.V\Æ1w “ä+Uš­Š”~°žėŠŃ€ŁRRWpōXj@6 ½śn0?©Gʽ©ø7Eœ“„ØĮ{zĘ%L €ė…E(–å`_Ÿ‹½ŅāGL”Y«±€ÕŽc\%c¼I4ˆĒ ĆūU£I-}šĻϱń(„`Lą(hQCW׌ •%{ōYĖĪ6W+¹“ĘŖ¹¬ØG¹J§¶åśeŠHćA~‘zÄĖŚw%§’Ų»§]7]xbͶč,M3ž’ „’ų–Bb0׀[C—Lłš‰¼0ń'ąY3'Ŗ*³\żUšóڐŽĀąV˜+ÕSę3¤ƒi%728hŠ©AbxŃhŽŠŸnī¾¼”Ļ‹iī½~nėgöŽžtóńJų—¾”|¹…ŽRF†>^™[Žh™ VdJEäRŹļ±¹M_ŅŅm’;m±D¤Öē„Ś€ÅŃ ³ ÷ŪE Š Ÿl×-Y@¼u‘Nˆöņ= ՎfX,€mxt˜+ń-ąć-±vŚef Q¦ø7caA@ę±½äŽv&č`Åą¹č¼É5vä0$N)`ä’Ę5¼/#ŚĒķŐ\2kuEéę;sRG,‹G:UˆhĪ-„ͬ&ŒA¤I­"3ilf†D¹…xžå¾‰ źäķ<½?Gęp7-Į"Ó%§¢Sń2^ xl€VXŚ!x®\6)‚?<8MeĮÖ_\¹#ž„žqÓ>u”8’ßt9 Üė8ŗ’‚ŹēóJ¼2©<Ø#ZH¬ōwПžSR>oˆµŸCžŽ ;,üśfÅEĪg£Ēįņ|Jzx}…¦rzFČ”Ą /“„£_§īŲPėčPž\ųŻįPÜķās› Ņ‹ŗ* zŌÖŠ(Ļqä YÄ~žb‡ ˆ`MˆÖsxbź"? ēÄ„ģgõĶrŁ_n×)eåĆR\ī‰ŌZź¦iiÜ5ćtšõ·ĻÓ 1Š^aü’XšÅ`!#„Īęé6m†ź5ݹ¹†ŗ,ĮQ(––·ItPŁfŸŃŌ鎝$b Fė¤CÖĄEƒõ@†ēk£õąap¬ °y ŚĄ€@Īfō+:*„©\RR_Z犭w“¾FžHY&+ŅZv ØH)T¢RhĆįŗÕ«¹je t.ČŠģ&|/M"Į·fł ċ¶µ™Ü“UåāøüHĒīü>¹Öąr#pv‘@?)®ūØ)‹—ÕYˆ9÷ÆØŪā]Ī–i2cŽ“¦hĄY5čsƒ9CĪH«<րFėśH/Ń֛.¾t” ÷¹āĮp_€ųF.¤ źĪ”3•,«Æ\h ŸÓ&­z7š÷“e²ĄG¬#ģ“6öN©’ę‡X ­/ŃÄŗZ‚*W܊N „P'B‰b'ķją“×<ŲAEH£Ž€^— 8cbĖøĪ0d“Ć'#ŖńŠ?`Ė‚ĮPŅŠjaˆėī@puŽÖlŽ`’ žŹ ųi%Rõæ²²[xĹų„Ę#Ē+Ę\š„•„~8K ŽsųWöõłŗ†’fx¼Ä>QoÓócŹ>‘Ø÷Włˆ6>tīK©ćżV$ģ‡ļz>_ßæ¼ŠF’©‰ ’Ūża©‘āIÆ ®Æ„ć+æ{$÷&ÕŌiKMŗ§Ķ0ŲżŻ ęłéŠŁ Цē/s4­›+ƒŽŠ“ BŽCēE*ėś¹ÆōŠÆŠ<ķą“cķ§įI›ģķĖśr§U 0e(źŸ}™CF±¾aLQƒ‚ČR±ĆCkšÜKĮOąÉŻ$®ŽüŹ‚H`…’gœVsZäń©ĮĻč/Ąr³hå&Ć"!™?©Šo]õ,*-ƽ©gy>„Vd5–ē$Ń4pf &“a:£-*T„…ˆłē‘üTaūéĄ1>1fšw#“&C–ć _€uLŅZ%y„@™?óĻR57n;Šj­”ĒŠ4©ćj¦÷=8Fq3ĪD¹]M^[éwīÓēĮĄó•~ūŲčkßŪ¤Øõ½Ž(€ˆ¤/É[žŚ™ŚAøÕCͶfo¼Ž݃®£ƒōc–s’ĄĶāb¼#ŅČĪž¾Ź©åd„gÆŻVß#T#jPø ńS³ˆimM#YŠH+%·%\Õ HŚÄļb'kōEŻm‡6ą"=a&-åøÉ 4Ś©ø#-¦uEč}ŒĮą–5Vź2˜hĻ‹·Q&?;čGd)· õ¢ńØįdŠõĮu¾Č8‘2ī ×WĀŖʋnoWOĻ ®TfČÜ=D€ę¦O¼ŃqHroĄDHY,÷R;mPcEZ@^Ą=†ī€.ūr ˆ·‰<–Ū’D6•gźAgēōŠXJl¬:-Ą”‘Ź ¦„1V=åĘZ@ÓxśōyUē(’Y†śl+Żŗś˜xŃ īźö‘ *@]2qńżĢf…vŽŒŌ‘×k£ęÆĒCĶI)ūT—ó˜Å“‡) Ś;£‘µŻ»ŸH¾ōÆ?Ÿ/üڽēLńÆ-ĖąĶėóŪz‹óAłc¹ū3Āž/ķÓŻŻęķĶņŪ—ƒŠ¬½ršŗy_EžķÓ ĀŲocó 2å•ŪĶŪ²¼pٱ7=-äĀĶQW|OČ|čæ~}ßeļīn÷²Mw"Œ7t(O|xsŽ.Źīwwć÷»S&¾§cķ¶ļŸ„Łåϫĭ3-@€»Cīw"bĀT0Č[2hĘĢżß=>É{œd„ø:_;E“*[˜k)ėHŽ_>TE9kĶ-ßF™QRŚ„ŹfU'¢ lĄcžoĮł²¤0²4_'Ÿ!É¢¾‘Š]jD4DØc°źÜĪĄB•§¹›ŗ€h‚Wb#ēWō&Nāš;­,6c'-&ēˆ‹Ŗ“S³iJ0­‚‚Ń—Üń6Ź×j¦ąQø ŽQxœ%tÜ]f¹Œ![T&,“ĪƒŗŻj °±‚Üvžėžī®m7ŽäJž _ ‹TŽ/€Ö6ģ1vķ—cwŽ„¼œ”Q”@RƒżFTU·ŗÉ¾TÓ 0P7»««ņ™ēÄ9ŻĮ@8š'O.ÓŚŖA°¤c1w’ŹA!āj­6€wV¦GoYŪĻ0ˆaMem\,¤ź@Š” ¼eÜni²)¢…˜¢ĘŽĘmżāń¬傶}MŪĶ’*]/żŲM¬:”Y嘖Ęč üIO{¶ŠЈ@śę4S“xS’ĀĮ¢ŒÉŠbˊUä˜&”.C óŅŗŲ -$똼\kUu#:č33-Až1ŗŠū¤H­°¼cd{ĘÓVŚ Q9¼+P5Z€±ÆéKh,uņ]čՋ¦Óį&8VWę¾7”_QĶaŲvÆķ‰usĄpĖ%Ń®~Mß”ĻzČu¬'ކNtÄĢtĀst"œŖÄJņ˜8!3™p`4¦ö”s”°ńEļ żš$ĘZeL3®(¶{ƂUm“įDż«ŚČGP¬mĻ”¬ģū=|«žp&ūjłŠ›]4x³}ūś®~>Ź9¬q~‰ƒ’f5õÓ_~Ü\ė³Ü?-†|óM汞ćēņpóIīåīŹž…ä7—ń›«?.łį?ząžžź]EϜŗV/KŌ¢knļo?nŲŪ= ~VÆv ćŅoŸ¶@_ļ>ĶW[€^Ē ęŁl,øņŻP~ž\¾roųE˜^ݶo/C¹ž0’į@ä6ŗå†)_;Żņö+˜GõKZ°%3żx鳯RĖ•V•åŲWÓ’y~{’ųTīīŠŌ碲ƒĪSANĢ}ڇmJm“O]·³¬uÜžŅūp(f5pį©šŖ°¬LįrŁ2FÕ%Ē’jŚ“Uzv•ē^}tÜW†€•Eć¦t]Ą™0÷”Šįųœ©¤Ńho‡ÅwŲnrNbf%Ż •ńÖ_;ū“š•[«ˆę:Ź€”€Īˆ•–]FAę®ĶŖ§fv«÷Yķwč„jVl@Ś:ÕBHĶū×?żLR ™øĒ\z -ÆŠĻu2±ÅŹŽń‹ ~Ā}<Ż[wе@1Xp,ĆL¾'ēŚE%9ĻļŚ18¦XāA,n­zė“‘›ĶµhĒ‘$&քML£^Õ^`>UqcC”•Q¢„Zę2«ž!· ]¦:q¦²@ fÖnaę^żśvœ ‹ć( *Óą63ˆ™Um ¦RøĆk½ø°4=xN‘kĻÖc"‚š¦8ŒY“ŹóMMk—”%$ś00Ż^å‚?L†9®¬Ui¾œĄSĘķŠ~WĆ=^: £YoYT.6Ķhįč h}G„¤,­]ČMXt.h—iSćķH”V< īT¼³Z––w"˜5L t•'ĖąÉtĆxAµŖsB/jAøČąŠ«lė™>ʘ‹"Ę{NöS_†w S‚±S»b–œ“ĮiĶŌt*#!h`aź”ū1ÉõѾΆB£cÆ4oęAĘEć`—¼<ÜÜåīäx2o6’˜äĶ« ^NHuscoĀū™ 4žżĒ¬Ģ¤:^wž@&Õw³ŻŽū«Ļwjķ½^ź—żņ€™QzŁnU7łĘOž'ž®§œŖ¹<Ś?ē .ĀGöi/ޓŅ߲/ىŻ|ē(ś?=žļ] ÷'_ĘĢęs‡Œ`öĘÕ* ß7é-s@°¶¬šŽš½aÖW©éŹ(Źšō~Š‹7HęŁ}#Ō+ƒ)žsģ%³¼§½‚¬wĢ+Ż|q_™Ši#R³āŽnĮöĀƗŁf(ĘÆxÄč÷ö؁­™¶ éĖÄsHÅ2ĀHĶbė} Æe•ĢräIŖŠājh¹Óé3 ¦MŖƒ›„=ø¢M%žy"ƒÕ0ĆŌįQBņŠH¾bżbķUīŲšyåØÖ>ŁĶ“‘„©&귃КĒe&©!øaMÖĶւ“Qƒe暊PźĒž9 :ėĄ‰ §³I„¹} µ$<øŸŖÖ#GgóŻ& öL[d.ž=LŠÖ#"Ԉ„Į„Zu±ŗÕ“öPĄdC‘bT:Æm£%~™)c‰99 Ļj^N Ć]mi }Ÿ6)j®b0>XŒ÷@^4+X‰‰LŌI.ƒ1»ąX,“²ƒk½™‰bEnÉÓÓ¶$šWåhc=RŖ;ŅĘ †fjG,AČlĘšĶą)Ø:‚l¢i«c‰uĢžh³PXŠŽ^¹Ķ­Ę8iVa£Ā Ą\ķģÕ ”ČŖŒœV¶`( ]ŗ9ÓG,‚Į±š‰˜)¶&4H;j萜ŗĒšÉ“ϧ_°w1ZŒnéą|€śOCīƒÕbŽݳ€ĖJśĢT:č4A[s“ÜұRXˆ*óØ!bšÕ}¼©‡AužĖ©£Rnūn"¢Üoā¬4œ?+}&ŖŸéŁĆ‡¤;gŖK°ņŃSÓI`ĄŚų{{9ÖB‘杻ń“Ż~ėdŌtŁēr›o®8å„҂̪¬€ÜCt¬µvEsĖ‹óŻĪW{æ?Ź–S7Īȁ®ū čČŽĪNZ ō–µŚļ^ajZ(­Ü°B×ѹ‡KµÕ‡šö’<”÷ČCIĒPq“,I®õ0ę¬N@æ)ŒčģĮäsOg±źd±cĘc £qēTƒ1½ULXą$KļgŸ2ēH4ōó@uÕ#l}<ųĄ^‹+“%³†ų‰ż,ŅYÜԜR‰}*Ź^/n·ÅDÕīß”s×,č(@@g,xĶրŪbķQŠ<•]ČĘ9Ę<°ˆ£xÅĆj0•ĮŚ:W& k c‡­±™ę %ІO¬\Y!>}Ī2ģŁv7Šŗ™‘YŒĪoŽ6l“Bo”c†é!XŌFöZ€@Š„Xįå”±ŹT€īM³€Ū`Y¼)µ$›{YŃŽJ/KĮäa*09Šƒ‹i“nŖģAAõĢ›õVq§;^ņÅ]³Ø÷ ^fŠ“?ƒlšo=si œƒ‘Āƒ©cl`|į¹…ī[Iuƒßī =֙H’zĻ©Q‚fiēĄyõĢ%Ó<>‚lÖŖ0@>BĪć¢Žöȧ»ó7h“RM¤·ōī3™Dy§Ė\¬"ƒf„C&{«±^؈ßpq|”€ājR“ÄŗąUŚY tб“Iƒ>õ±3Õ®F-VS¶ģ{Iē‡F(Īsū¹jžŗeß5Cēj0–ahŪąöšŅ ?ĀČT4:īē2E””72ų4Ī`I$¬XXA¹™f5½ xn± L‹ŹU -‹õ×ĢnŸŠcm‹ŁŠ·ĘLĘ“f¤R³ WB’E(‹rĘź)DÅD]Xb2Ēōo3ĶĮ’Šxģ’į6NVAėFć²™IłĢ«“Ń,Vq0¬įV ĶJōI~­_Ą 6ł>ÉѧzŻĖSy³ż×”øƒ½œ)scӆŠ)PóŪ£KSżāeÆįprõrÜ?%“ĻĢčóŻõ×ņ@ū^\šn¢G×lķÅČćy-æM=™ƒ;į÷ęw+\·&®?ż×2žōŗ¼/ŽŠ·/FÓ%„ėąNrÆēæöœ…-ƒõDŠöž€^wž°“(w„éźSX:ƒŅĀ†‘ a„łgŅ/ęŲū½É±œG 4%ĪåPXž%¶ź#–Ż>ņ–U£B8|±g”®GĒsJÉX"8n Š‹D€ŅŸ#;uö¶Žn®±®Ńū,X ņS›ŗTÄ`ī&»Dė¹õßęF“¤Fų ,Ķi€Æ«_GP©tĶ`$ĀżZ7BUÜ šŒBpŅ] Į`ķŹ$ÓW7ĘŪ.`6Ü?é&ŪųБƬj}·8ŹÓ- \21@ū„¼ˆ‘®¹3øÅB A;p¤1Œ ģ©““öTEņ‡$`9žE¼}r“÷©Ó•¹ć:ˆ‰Ć’S9ĄpÕKŗU³¼ G/2"“¹ęøsšKd"€³`£±1—»8:}zø(ī‹4Ł HĖQK¦Vmģł˜ 2B͓ޓŠOx­zAÓĄ&#ع¹lXģŠĄ#7č÷c%ļĖÓķϲ,¹łŌ bĀŚ:ēM¾Īƒ žž·ėųūß®><|łöuĖ"?|¾;@$vėŁ|y”ÆÆž lł¹zWäįĖćÓķSūx>ÜŠ®¦Gœ\š£kń-ȇYœÕ7ķ¹Ę~ń$zo.žµ—÷'Ōf?œĄ_fDo(ČÜm.Ż,†6Sf;m/SŪ+¾ßöż"dKŁb@‚šHbP}:–ŚŠø¦Zn*[}šėG£ž«—>p•ÉŻ!ń$zr4Ŗm å}R‡öęō}„Š{‚WŌ&6żJ%ŖˆNŚbuЬ\Ś­pÉż-Ž^Õ1:ŽéŒ©K[>EcÕōc±^&&éŖ F8+Æ±Ā¶2ĶńLv>uēė5On”«“ŲĮ?™wŖ RÖ{`IÖVņ©ĢÖ7ˆÉÄÄ[}Ł-&–čpk}ņF\‰ŹTFWØDmHŽ5™?Æi8ģ,ŹcK£’<” Š=ēĄ3'‹Ē_Y¹LĄUCL¾ ĄZ±\‡uIQܰ-īE D®§[„̀Ҧ€w •da€“Ģŗ;“ĒāØÜܧ%ňŹ{üg±Ü'UKŠƒ„ż ŌxØNJIϧŠ­- V°ÅuF˜LΘŚ;~ ļ­±ŅōÉpōY©šcß÷tē×»’¾†l»|¼Ū{ļĆż·§EÉlŽĀgö?Ņ~żśōꟊ%ū—örwžyĄH¼>½9be;­ģ?ģ­ģŪuķė§+ ƒüē—÷W’ssõG¹ūĢōZ–/[ž¹}žßr/W¾’ w±ä_½{Ąė•äõ;ćÉĶs¾6ŸĖż,§†5;uą§Ī0iūŗĀīlźŪ›h6jčČŻĪ6ß_@ƒźē±äGōīÓ'öą\•^ļ÷ęćZuÖæŪāØów©@ļnŪÓV’ųõĮĶ·öīn xh®ķ1}[īäÓ£üŹż€·óŠYk1žĮ¦Éš äć÷Īßtéqró_ĪĘæ}Ÿ«Bź¾Ļ S˜śr"®½y0­ż4FŚŚ.ĖČÉļ¶Ł”'Ū9l:z{•-)zŒ„ĘĀ:kśpQĀĬŪ\šżf5YNb”ĶY ‹w‘ģ<)mƒ»œiŁŌž`ēėĻŽęćĮ žÕŅB×+YQč2×ŅcųÅœéĻFiĄ)n<ˆ6%11č:[M߯Ī4g„¬÷§žo}T»ąbŻ0ļa^ gm¬ĻŁz,«žsPŗä;Ķ6MļüŸEi Ė üw&B˽āygƒĖRdb0=IiŖ–|`å±pm=U>ńäŲCÕ”ŖJ†rõ­œj‰}-0›!ok]X|“Ą:)5.C’ńÜk¢ó€DĮi­‹Ē® Ć:¦ćŠÅ`%0ŒŪąŻX2]ę”QigĻÄ;Hnɤ%` *šž-·IUƽd4…¢ÄÆß#kŲ•Į8Ā$Üo)<¶q¦xÆ,Dč.ę}/-$nB”,YZĻatn<0įR ‰*Ėį–T!Å„ėN*ٹyc]S”³,ķ©–O“Õ.ĆXŻ€67t2P²¦bĢĮ³ŗbNøck* ąTØå¬1XE˜ihUÆF‡ĢxļÄ ŗg—:ȟLŠ…éC†JPi²ÖŃjŖ§"=¶‹1®ź9Gž ŗæ)(ˆęp'­įW Ūt1꓁8‡–¶BæĆ ;ū µåŠŠtjƒ”.S³ˆ€ż2Ó‚/\'0Ų&VŠŗĄšŽ–1<üŗžßauĄØĆ›śZS<~ęNõnE‹gu=~¾ķņåńęPŻ‹łżł[ß«€ÕÆŪŻ­Ü?m=ØĻ’·)²ĪŲĮyõ§ė’÷’Ųžl¶ö’?OĄ‹fJv£ĆÓpōĢąė4^]¬TŪķm?Z,ž—9ļāś„ ÄEūņ;ß;Fių·ē:~;¾NīæļŽ•“dæćŪįwņ;ųäµōÕßŲN™“ß8éC³³Ē‘éB^T§©sŹPu1cEn&N§F½óH?ü~oĶkŖŖŹÜ„ŖPTaõkSĖ“C†¹U:Ņģłå÷yĻ`ŁHQs{"ßwžåhƒæYČ«ēĢŠŒS7ø“Słō˶ziƆ14”ŗiŒØĄoX?.¼Į™–Ā2Xé‹‰ķ’ˆ»²%7’äų+½k&rņ>d«‡]ż‚ŽÖĘh‘‰%ŃŻÖ gH™Lß.÷]@ć(4W;/< uFfFzdFø=Bt%ŗÖ”0½L/ ‘7~Æd!-“ŅĢėōŌ+WlZ«Ål³v•I׊&ŲĀ”XŅÄŌ; W†eŠp©YjŽQʼn­¬»ń“ž9NK,ńp"»kš:°~…pĆ'!1LKI“S—^sŅS–š†ŽĖ³xp2SŽ®ō¹Ż£q¢.ŗŽZ2·%¬ĮŒC‚! ĆQʎéó²IlĢĖT˜ńš‰YZACśl2 ÉąTį’ON+ÕhvüYqŅYs×-:·MdXÓ=0Ÿ1Fi³žįšL£Ųiq_  ;bnŹŪHŃZ"0#×Mz8#2:ĆNöüė“^ņo³³Æ0„Ę÷ŌZ½māś³åw‰š9vüŌ)”Å÷N‘śnGYæO¼ĮC-Ÿ¹$²˜N”;Ń;ÅŃé˜"‡ĒIōō,&÷÷›ŗžĻGõ€Öļņ˾eNq‚ŸøĆł\šÖ¶'ĻmĻ?Lž›õ™ė„']8s_fą]Ń8S”uF3é©Éhā0t§ģķ_nūaßēž““C"[ €i©–"ä„ūZ9_ˆ“Ņī\ΌnpĢłė)!Ć5Ń:¼O‰TÉ9ödJš•²ČˆŅé—8·aÜXM‹ąŗm€¹šŻ«ˆų!–¹y×ņpõŹ÷„Čź-X&)ržĆ †Ī$®$g0|2¹G€¬}g³‘Ģ*T¾.zf²#¶Ė!ä‰O»œ&č[æw·'Œø­PŻj! @- ŠO±˜ŠІ‹-™‹į˜ƒj䁔¢J%eR \“„ 832qJ\ˆza é»X×(‘¦—ŗ4'‘aPt³"“Xd”ĆVÄ”źčjwŁŗŽ0O';(ĶĮ\³?Ę“œ&¼går…‹•Éö[-·[ĶĻ Ł³Ī>X¼c¾¢µ¢v'·x(4ĀŗŪ0Łą}“G¤G¹ŽīBS®`ąü‘^ķM…Ī ““©ĪhüxšźD˜=1ć0MźGöŚ©8|_m5ā{+"AnÉ¢Ļiŗ§„÷ä~»×=ŗģYĆ)Kł‹ĢĤö‰¾P÷[jž“źĀÄüŻ™„Sėī|3±k µŒŁÆé”¼‹Z}ßM®R ˆ¼P¾$3*¢›š›'3ó, ƒ#\'mLS"0‚b“.ęl̽0fåTŌ6ŗĘ(&ā{¦#jŖS9”čP€QfAĖĶĘ[ō|z>ž#ėŻ”||hWd~Bņ¾oøŸšŪ˜’Ü?żxzł’>~y“w›‡o˜‰nł„”śćZ kžŻP¹*ü”¤čŹP¤ÅÉnóĄõØ(«)n|é”Xųt(øsōå[Jņ}¹Ą~“BĮĪ¤ĪłžõIīgw{oßļųNńøŁC¶“ńĻå õ·YB[×ĒĆBü—‚¾Ņģ7ĆŹĄŻOŸĖĄŌ}ęĀĒÕ÷5lžR„äßļ’XW˜ śf3ūU›÷Yķ.Ž.Ąo_š¾żŗ}ʁ„ėö‘^æ³¾ūūžĶę×ķ–MŸĢyÕū¤^Ÿ(ßvCÆ~iOėCVAßł’ÅžōéŪS{·²)üŗKKŌļÖ}#ū³óū]¤ģ†Ö˫ߒ¾ŗßrż]Ö-8` õöĻN<“ž4ī>=>Źļ~·ü“^=nöį$ž=>üޟėóߛĒ~÷ų·¹ż'l>¹_w;Vß¾kŚ]­Ź©ŸŽŠGĆ%ĪõēSU1iwōq=;]ó½}ĒsO?ūZė³ßņusö¢§¾9Ū¹Wß~|¦˜äo3”ąWu<›OėŃļė¬ļć–ÆūF|ųžcvŽļę}šī3ÓQ˦½t»~Š.žś±Ģ,‹ĮuåĪSBm-/߀wžŸ)Ūvž’Ķ'yģźąŠ¶łO›|ÖįƏ¬Ö˜ņŽÕZ×īč¹ėĆs>÷›ėĶįŪN•T‡ē}’ķš’æ|?:aŒ>­Ō¬EŲ±géŻÆ’ŽiĀ=³Xł¶™ł3ųÓžēĒęk_·“.eŒi„œŽ!žžß;ÖęźšēnžžeŽ2nYū’ßJڳ“Ė’üń“śr÷·§o_zyXmīžņyUV×i÷ókŚżĆ­““lėd)%ßeÉÓż®Ä©oÕ<=}—Ė˜õąĢS»‡ūB×·­¼+ŻnźĮĆ Ū‡–†!@•2ć*Å·žšÜuvłÓŗøI §?”“(Š"K`5y.f«ĀŒwīFGl%eč©Fī€śÖTϬ$żs‡.æÓ9„‰ś”Vh˜w‡ …źŖ“9dx-- ?»#³¬"p.ś&5F?ōõ7Ü÷øéó“1ƒ*™vŠ‘‰ńdļĆđą®])&kēS}£v[ļĀ$1`B‡PI]c(g˜Œ•,ü²ŅS +ŸY“^%$7„Q{Õ/4PNĮ²’žZ*F蠎L#1ŠĆDĻHĮŒ“†Óŗ‹¬B“°›3į&Ća"ӝJ°˜K„+9oø/6E6FQQ1A«KcÅY§u¶+µŃ;ßhŠŻŽZĒ”ŗ.£ŌU¦åž`<“ŃØBJŸi ‹ø^`ģŃ]*>FÅLé;š„Eī7īĄu4€T’C`ĪqŖyĮœ^ ¾Ŗ—ņÄg±¤AÄP§Ęńv˜ÅX¹Ņ[ŖP…Ł  h„x6ŪŚY˜Œ…†ÕūŖóĄÄ…P…“Ѥ%ŃŚpKvŠ ӘėGG# b ɀ¾„“<·`&½­A;7©(į+ 0F2‘¢j.’ŹCXQQ:µ×`ēĄäŚ °€‘šŒ‚ļĢcĄcP”öē–‡(…&¢`¢é[åĪM#Rļā=­Ņ½Wˆš„Ė;ÄįL=­€ŸĖęŪ/Ÿ µ›ÆŸ?­ĢŃ”½¬×ģŲĒ/ēhzfĒžWĢöŸś¦ßŸvŠõ‡“éS{ušyyuvpSŸī7ņŪ«ćŪ4«Ćc/ōC/‡øčõQN}Z8ŠŪ®ڱÕęK y”1Üėŗ|Ö+Œ˜?˜£ą<—š6gćŻ0ćj~Čļv=+åų§.ćMmšĖ~¢7^m‡Łė|Ę#¢H‚ ‡/ķTeĀ“š6ß±ŗ“@w<2ßx?n_±ՋO”ęZzÅÖ#,>}ę/_³÷&ĖÆŲūš.Łoō,½äĄO-¾jļÅ_±ß¶Z|Į‹¼ķš­¼éš™÷\~ŻĢ·^¹hæVĖlĄAay§H©čIĢ;T*ÕĈ€žĪ:ü±ĖžŻņ³4³b>’xŻĒ¤©¼ų\nj Ä&¬’ŌįÕ ŽP„.1I·ŽŚÉŽLæIY ėܦ’żŅĮ¹[ģčÓ*¹4ł¼ƒó”ź}Œī({•N~̹h¤6˜Ń°”D 0XN:›;B“Ö…Įj-Øāüe3ÅԘß;2ŠoŃŗĮø RQ¼©ŗŌuœźbżBs՞ŠfŁ PB.ņ`Gq‡Z·³%Ū —š š­•8ІōnfH$÷n]³ö¦¹„ƽŃ|»ÕWÄFr¤øo”ę•g>R+vBęSe:ągŠDcIż&ĆąˆC`ąŅ/ֈ͹ĒČE”|H¦NfiélŗT-"0°FtCÖ.–³  ™hm°ÖŁ…÷m…~„Kź@'㔪•łDĆ'ϊ©Ąśfń±ÓrĆ”q}·]ÜŅžKe ĻnåØnŠ'YÜ3±ŽzØØŃ‡¾G;AccŠ:d P€¹G{cm£¢Śz£lõš¼=ī-3tO ]cĮP4’JBšģš™0H¼ŽAgQŚėŅjnē=žÉ‚«ēŸYĄĪŸpIīuŻüæ d™-Öž×jżp÷WATqßļļžņõ2ż{Ańū*-‡Ü²$ާX=ēQŌܾmv¼Ożœļ£Iƒ{Ą)ŗ½zėi5%"\č_7u]½ŻÅ éĀ[‡MēO=ĶeŻ.€‹ÕļĒ_§ĘĒ•āX»ü ᦯VhҌ%Jo“N=²ČõüĆ?ģ†Ün-“+Ĺ(ÜĆKcŁhdī6}X!5ļ…ټ¾~Ć£ü:]WU˜6’蒕°\w̓Ģgō¾·Üs—N`É1š½=y€‰¼§M²Ŗ˜iļt0..ūü³27°¢er±a•7”ŪŲ#]>„o1ŪT|aŁżM–v©XŗNȐ Ōę`W[Éļā72Uso“x‹5‚õ3ĒŖ‚ONąpø˜ŖéėM‡›|£åc&Ż)ąŒŸhĢ`‰į¹–éK4tKņßž\ l1°ÄX5 Ue{יźķ˜F»X\¹DŸ… ų6Óŗµ“• D†“ķʶ!Z±L˜IĢoĄCu ®wKõ?TdDbK¦¶‹»`öē ¦# y[›!~Ć(Du%i‡Ī²lŽBéʅLZæh’) ą3\\2ä#l}xķõ[ŪŅ枦sKĮ»aÅy@„D §1œMĢY€? šüśĆ[4³B €0u؟mć]U”P–ŚM¤LZĀ“^¢ š !نxP •5|ˆT£ "šæ¶÷ĘHčĻM“Įhć)Pś²vS¬.ņ«®ČI…”XüĀā$|„ ·zʦ," ō ąe²‚' Wbvƒ€ż6…ĒD¼Ö ŗ B^‹ĮsŠdå3$ĒÅ厗 ™’,Ę}(t5E,«Š‘kŃ~½ O*©Ģˆ™źm}¬ro€éVIkA Ogń%ŽßOŗēbØHŅ>ƒ'Äöe ѧo$½n$!œč$ļ“­vu"4Õ,:L®}ķ„Odę°%ė$浏"tš®¬ķ3†H@”d©ÄrĪŽČ~Yą•™cV3¤‰†^{éKVX€-^ r¢!l#¬&§7膗`õüÄ« zbįŪǾT[1R1ēr„)ąµ_Ōłē|xīö»µBų¤g8R(=[½Į„™LÜ8ęŽõÖ_½ßŃäɓ Oß Z*¤ü˜’ą=2EŖØŸcō¢—<‡4cH 3‡xįrąźį²¢Ž ˜’bwĆuĢu·™ž¼Å Ø\LĻMh˜Č‘Øū wŁ1÷Ēń6³HĮmrȱ„–#¬n|bšrpBłŅY=>ż”yž¹–(l„i DՊS”Ž`^®(ą5M…ŻPFĖ”ŹŹØ"n<*ar›įJ„v—°Ų±GÜ/Ŗ!Ū(Ż3yY„ĀR-¤b6Ž­Rc Q“iµ¾Ķ d·$#0.S|7M€ Q;Ÿk!‘Ļ–ŹĮŌĄĀ·w(F€B?ič-xÉv"tŒ…9ŽŃ ä$&! ķhļ‘I‡äŠ•Ÿ‰֋枝ļĢŲ›ķ 7¹MļŒļ«Ō‚ĒaJwŁź\T”c½÷ś*£”¼Lä±&ōˆķk@É>r ŃŁ’+>D  .å|ĢŖę¬.\c”N-<ˆ\”ˆŻĆ­¢dŒé„ĆźŒ•«‹ļbćž6vŸg™ÕĻ|J_—DņĶ ^J1q8Oµ0Ŗ8„¦Š{ÆĶ ģ0%Źr"sӔNŃX¼—õ£D;z’žļĻeŚŪ?Š®L3O¼ŪžČõ’WÕĻ'W•tżįaž|E¼Ż×”ĄćZrąķżŸ&ĮćsĻĄŗÜ›ŗPŖU¤·øķ©HŪOėÕPuć¼Z>pƒ7'K:½ˆØG³AŻ~äĮ <@óhč4BŖ7¾©?~µ{\—uŲŽTFP¬“V{§ŪųĄµT:qćc¹ą‚·¾ĮŖŖŽ„;Ž~ØkŽĢKRķ3oŌėlŌļ[?(ī6øŠŃ“”0ƖÜ[‰łŠEW“s_޾²ł’Ńm½×¬„øĪ^Ō£3t¶/Ę%Ō*ļ›šŁÖU£Œ·…CœŪ®b“7^źØq¹Z™¼ŗ ¤Ęõ׌vŖRHó]ŠŁFkŌQå4Ŗ«±ąØ ›Sb‹yŃØßĀQ’Ķ©ķ2Ųz0œøŌŌ3F8ķ¹]KÅ4e·2#ĮĶ”ƒ,fÖl6õKę£3—SĶ@ėĄD×`·Zģź@ŽÜjÜÓ°­ķ=ŹŖ ;KĖś„ įēkęɅ`°~UošŪN«~Ā=ZøŸ S’6 Ś¢©ÉĢ0=5¶‡uZæjžšgĀŲżFŅvļ6€Ģćū£uM ]Ę¶ŚŅ''ōj.īDHG“>‚ų¢y=•{±KK‚µÉ95[”0Ų ČŲH„–ś<@̨޾lÅst§Sė؜mOĖū\ ŅžŌˆ^‚‹ āT&ęŹéLQµ`¢­­†ō™i‚óĒUs‘ōķóķ¢@ ‰‰Z”bį0隼nWLT„Į`$i/S“fqZ-CKÕē@‹Ż¬äŠ$²÷`YGÓŁÜĮ–#;CµĶŻa^Į©T…č28s›{㯱+½Ód(ÖXI-”»N̉ŽR*SķtėP¦3˜Ć)ĢagJNaĆS}cĮ$ÕńOKӑŸ^–oe·²*ļX€«[„jLéć ’cĄAsÆSœ;ĖÜ.s“ŽĘ…YÅ=FžĶpÆŅāūó’®F“’¬¼#Ę÷ŠŒyk ÆĆ˜Ēµ.dĢŪū?͘Ēē.Łs‹¬5<Āf}s®•”!É »€PSO` Dd]aõåøk¦,‡Å“CĖJ2uĪ©[ŖĪ:÷ʓ٪„Z+\`«pLˆ;IR˜ %ß®›Ź¼z÷jĮJ fšĻĖī 1ęčø©D©Źč{łŅõJ]‡Ā=š|{51æ|ŠOE:Õ*Ģ܎:PŪunäęZ‡üršÉo判5»Į%¬8Ć9DŽ]¹zˆ”÷‚µ«ļ8ˆ©ćĄŖŽrA±äÆL9¹‘ĝVs¹„CˆĄ®+Ld Zß>K¤K‰;Ņ”čÖJ%@\ “²…;9kc(Å©ė…Óˈ”ZĖ®*RRć ųo5K«bŸ° n?}ÅE¼’v¬Cķńo[ ¢ ųÆ11be„­źP]Ń Q½Ł…U# ‡dø(Ø®‘.Ž©i¤ŽP1ł‚«^,“ Ė-=‘Ō×WƁ” Obų„ Y lKŽje„ć!ä7†™šz¾ĘD;+W-©H3Č;D@.ˤ…‚Ó°¹0\ŲŃźA}BĶ#½P  öœĒd€{S“ Ł2¦0õz)«< —”’Õeltf»¾tP£77טų£X č­wĻÅŚŪßćÖC÷¾żM½ōųŁÆ’yüņļīØMKϵŚü/ŖT Fł»x~ŽļņĻ?¬’¾ł÷öƏß}€ē÷·ŗŪźņߎŽoŪzĒ Ś÷ė]_?üõęO?žśē»Ÿ}ß~yūžķ;=Qūųq½ē¢ļŪßī]š?ß~ėĆǼήõóŠæ_¹~čZlžM?ųlրóĻH;8']¾1·“l²’}>Éō¾w$$}WßųžŌļCjøgkEóDēĆJńõž¹½ūėo?Ģ/4ŸæŻ·Ö.MēOĀĪ÷õžz¾«īŒkūE į/č¦8rč{7)ļ~öÕ~ĀF?ūżI<ł¾Ęó:Ž'ńć'«»^3ćÖU¼Nˆt\ėĀéöžO‡HĒē ‘4ń_i²æŗėھŗćھ’kūĮ³Õ(į’ 6ƒcFGā ¢ %ßøRĻn”Ēƒ¼9ļO¢bģzvqX5Zaė‹óč_Tfö6ŽXźÖzŁÕļ3KżŒŃŲ«dk‡³AвVXs¤cÅś@¾Żć_ąĮDV•%—Ān·Õfbƒ"¾IĀI­”Ģ”’ŅԙРĘmzĻn]mōJŌ“’‰,ʼĘȃ±ź2>m«ęCsn"Ö ūnir©œŽĢųźU•õzķŽ?ZĘ&sÆ:#·„Ń!ĆöS„Śe°r‰Ģfc°Ņr³*¤a+@€­Gó+3ÓQ ½ģŅøµe‰ļ*#V v"MåģF½mŒĆŌi„āõ$€V”JmöœŹv6/ń5X.^Kż^ā”a1æŃ*ki›™ÖćŌŽE'µR'œŹĘÜL‹ˆ“i!‡A÷¹¼ ė¶q(†Bõf±0fs#b„•°M½bv]|Į.ł¶—[„Ļ‚­ ė'ŒQŹ"ugģ ēŚ(Ł1ęDŠ k:чW³9e Œd£Q¶Ńbz: ļ±˜ĪšssDÜ]żt¤#»vMRž(8• å$äķ_jQrū‡ļ~śyµgW}śų“eA· Glžzōüx¾ĢÉÜÆŲ’5Oųy"ääæ.ßøœK¤=ĶŪ¹“J°}M\ūdÆlŸžś2dūō OCŪé“Ļ.J]aō”­¼L«G ^‰Ņv«½qɞ}½uŗŃ›»k⤖¤ŒjŻ®j$UKˆ£śÅ:q ū†½ĒÖ³Igw/{OžćŲœzJēŖ…&}2Ś2U8sŹ3õĖ£‹Pęčf…–*.{„…Ó ¹Œā¹iēM“!žuV ƒY³Ł/ĒN¤¦Üs65Ė“8Åäc +¦Õ”Ā’\¾jŌSp>ŝ„Ź*‰é„Tķ#« µsnvÕ|åč³w%Ļ>&M›Ź“U7ĀØ©ä ė×Ū^; ©«˜„IµiŲÖ« üp*Ųp¦v›¤Ļ9¼ŁøCvęŁZSEé£VµųnĶu7‹8DŖģŹwé&ÆŁÕS\GX½ŪØdˆÓUó„ł²łłīFņ&€œ‰ ˜²Ŗł5lāgMyŽŖłŸŠ‚}Ӏ̪V¾võš5ł³ī»Lno±…UŠS1 *‘ʆJzØÜ Ć ;Ö¬:?¼zu%Xr³KqO6V4 4cR¶`NjĮг¹ Źœ¬8ŚėĢ÷-vG@„Ę“„lµ5eŸ,`ō† ¦vV[ȕ;õƒČŠ ŒŹÓ·2$·Ń«˃@.[†…ÖōÕ u®!½8Ų· \9S|ݬl¢‰bģuėŚŹÉ©!ĄōlķDžŹu0½:×øC6•(ŗ([!B»ÅO—ī,öÕ+Ä;nÆÓ׹ūö|w•>“BŲ՗]źt,©¬ĮśŃk™XŚń^…ķJ{ƒ•ČģzuāÖ ~{ČzéSē,q75k.¹Öč7Ž„ iØTžŽwI ŸĻu(ZxT*¶ØńÄ3Iu.o”’ņ;4ÓĒ ‡{’Z{µS-&=nsHģ7óō+Yžįē!’Ø'bz]kµ“ąq‡ —ņ1“j̦“ ÕŃn›ö†X/ń˰SaĮĢ–·ō1J‹»Ø“ź*2ĘDTr­½? Å’õ˳²łčg„÷ć÷oĒz,!ƒgł&ž8Ż`ŖöŸSVv-ŹĪoæžžļæ=śE>TZVæ _`ķŌE~Ó”²)y ˆżw™6¤Æó?žšČł«¤25ź_·ß½ūģČŲ:įšgŸ9=óüµß_Ī÷IĀłö»ś?j ϟwž.ū=‹ąµO>e„ƃŃ\éB„Ö½ŸĘg>õ¬¤c;ż­*ų ŽÆW[*#µńøÅŖ3žēĖŁXžGysfm¦śH£I‘œfdüK”T zזŁ4m†OžŻ{5+Ęj¢F;6F™½[ ›ó¼±A)ї<ōƒDģ+Žų]3*sŪ±1,5Ł‘œKĒYŖuQlėŗa‚ńB*U “!ö56-LĒ®āŁ·‹’_6\ø} mśĶ:: G‰‰ ī[=wņŚŹ…x„a»Eף{#tPa£rUkˆ5G¶vĆbń„_ʲž9ƒ›£.+ā§%×z¾n@÷qf+\yxXdėm"Ä˜ź—”Ę]pģŻ“ĶńHč}2 F=¤_2ŠQšUƒŻw°į)})§$Ś–„&e·3ą$鶙{–Š'`ź}ÄšJpŹ…(ĄkR*ŚŹ‚ZŠ¶²Y÷ΰk2„ yĆĄ˜0»Ž›§Dgc©Rś€8ŃrWSq‡;Č64Uõ“K6”¬<­ŹĘ&8éI‰FĄ ›®›@Č&'Ŗ; ęjÕ”7”J ”£ŠŽ¼ˆ_•[™čk¬ę‰¹ó°źŅ0›ĘµØś³¦lSØĖŽÉų–¼z#YEŃ:¹V޵ß½į=Į鉲āĖ M·Ņ³{6}VæxFö¬;!ģĮŽį’Ąę%-ž§#šĢ“ŁpGXé‘žĻÆP‡”¼AéR"Ōq÷§J»0³öWŪ}Vbķ”ĻĄ„¾ś¼'šg2H½ݤŌJ¦~Ī¢āS5c LT žzˆ7w–Ē)ž#Ķāŗ•ŹÜĄ„UcVV!°A |ÅĖ?qÉ»~Œ­ĀāvšMJ|MŹzéŠkŻm—p“Ī»Čó×ūtŠi»lō šGé–Įö]¶#ōUŁį|Ź’¹/žÆ„^Ób?—¦ćv×p§÷Ž«·v ŖM0rrméŗg//€_„;·wÜŹl+šCgLżŠŃf—­«Ķ^—ƒa»`ÓK²‡ĆW³Ņ€X1_3계XMƒ\4ŖpqK’†:qÉŅF· śóĖG’T%ĘųJ0O×KnzMߣpŁ Łg(sÅ”löōÕ}ke/«Ž »2 ļÅóŅ—5Ųśģ{.†± IǤsBu[5±{6į\‡KѰŸZ%&ŗ|ˆuė-ģóQ€ż‘Æā¤ ¤Ö¶n/ ÉĄ›`]UōŠ»](„“®RmH„'€æCī×Ģ#“““Čy—”ŽŸ³N ' “$Ū“FlĮ”>- oNjékł—Ļļ‰*1ńb$o®”žŒy銤¶ņP/0I‡ĘØJ¦1Z˜Žx¦WIU?ŗsź Ųę qc' œń#“’)ī\šėø‘,¼ļ_ĮåtŒ%įUx8z1ѽšżģx¶ŁI %ŁV/üŪē;u/EJ|ˆ¤% éŽ[(Č<•8)V”x[õ>}Š!,`MX n4Ķ/„šb¹ķÉö ņš‰ĮqjĖ—-bXMßw7%³—lBĻ1ĄząbMH½€āł,dƒsfPģ}^ _ ¦ÓłwĆ +VGöxöZ,­Ū “[ļ®<þ¶ąŪĘ:1 ϲ±€ü yyü—nhVS ģ[Ł]K¶ŒNOƒŹBĄóżéŋ•OÜ2OĖŅ·Z XŁjkVb˜1‚{įam`”L'Ϭ‹Ļ±Ļ8ÅfÜ >d¦€ų¢Ž12ʬą’!0n{hŖōe0ńµkė„9qt’^Ī-*5BÆ’cu,›ä¦’ĖŅ>*¦ņ_*@—$v°Ą¾Ļ‹ƒŽ³_ėå|4ģ=üś“=&Ōź_J8ūģm½éw‚’±€g”īz<½k/ņ^|zćŻū#e­nmŽČ{ż­¾ædBÆvÆ/ū–÷0Ļßćī=åzšœ»’š~¤{Lˆüdš×;‚ŅĪĶ«oĶd½„-© ®ę‰ƒ?ØōÜć‚÷žtm×G„Ī™rĘ{hāš-[k–oE)ųšöA84VüÕæH׳®Ž(į›  lRlM”ÆFWZ× Ņ;ØīmņØ5ßżt“žJd'¬¾'U}iÉAŻĶ8‘䬝zzw<żżāTr„ÕĪBLJͻ Ū ¤LÓ3>[ü“GŚĒ…݇ķ·ƒąaUdŪ…>ųģy#^u¾bu>¹¦–3„gpIō.u%œĶÕ¶śĢ‘ÆFÕLCIIuSJӋv§ “™UiU•ŽiÕüį8UķóT½¼Ļ:‰ÄŻ€zK„‰5IĖĖ4@ĄģōĮŅ}ޱ[Ŗ³›{źÜųźŹ²‚£`D&%ŃÖJŪ½õrJ l*š€že‚=6©H A‡ēĶ™ó Ū•š—öėU*øó¬Rķ4 ŸV‹ņ½@|€ŌLėŽKq5ĘgĪ„1œ-ŖĄ(C`t(Yx§ĆiV*oŖ››daĢ%’H×Q ČŌžćXMKg#ČĒ0oqzÕIū…“Ø‹%VŠŠšŠĪ®–“[č²?ĄN3®KKYU 0²eĄe@ł”·­É˜÷ŽNņQ>»Iś @[žj#ą oŅšƒYĖąx¬®*+=$ TIŃŖZ<@ĀLqƒÕrÖ&ę\.©±” e+‹Ua9ĆAž \6Ł_ݶģ¢7d]ʰ ?Óʬu/³ZÉķ“„³§[ĘÆšĢŅPČ’XQ¬h©J`l)šƒīSYyY…ʽõQruNvˆTp…œgHn 3«f-»Į˜·ēŚča čČ ŪŚhįBkø Œ—Čź»W’ÆrnĻŖpīY¤K #ŹÕ–#Nb[“%ąńŠĢ$kYUDŅ\š”Ł•M‚­aVYińϰń€Øsžīntŗõµŗ±öOŃ©ŗqlė/OߜüżņƛŁ.Nߝüķõi;żŗ‚ü3pjżšžā¬¾žO)6{Ü5/¾Ž'ćĮ³O†”ąÓWĒI{ x¼¾ģA˜xhųKLųÉØ{…śš$Ę*7Ü-¼  ŽišĢQ4“īµ%m96ł“½)Źb`ņP3åč`ģŽćb öē%%čsŹ7’ģŚ/D’½Įå­j³ė®KDěؓ“zW¹u¹pīÖ½ļCW8ąj‚Ŗ(&įĘ#ļ„kj[ʰų­Cī%Ó| „ˆÆ?Y^Ų>*“X¦*øg‚1„ųΈk§Ņjż„Ē·«#ķ „Š‘Ž)nŚóŖÅŪŌ«ø4˜ŲDOXŹǜq«½.ķH‹3ÆūŸ=d|¶”÷ˆ†<0€‡˜éTk©IÜiīG{ĮtæpĶÖėż±ŽM©tē×ĒÄ`N6ca•‘žU*ŚSZ•˜ 7„h+fĘaˆ”™^UŖ čÉ(Łłų±: €*]‹š1:ŗ—I³{Piʵb1Ét£ŖrģRŠ_%Š`Wo!ź Ī©¹Į͘:GMžø‘ ›0¤ĶĶŲÖZ»8–W]ślķŅyš{ĒšČ™]°˜Ø›½ »$(E`_ҵB껊owvč,ż_`9 yō.˜wu ?”č" . Š»īc03$o‹O†į„\xßXŌĆXƒ?ć×ējÄ1+ų0.Ąq-¦†æµ³šU iĢ8cŻZĻĪq+•čŚ AqŖāfBó£jļ ~–‡tźģÖXsmŪξ␬i0 .Ė p˜œėњלń ĮćS<$pžüĒžzÆ~ōõ+?īu!óŸŸ]bå)‰egóÉīØ?x·Ųųžł|{ńŪĒkyņ~łńķõžĖMµņsąĖi}1’łęÅqØ8ÓŚ¹3’K’{ŻAéĘńןĻÖ<ļ7>łåÓ??»Ń~ø™G>»8?n<}¾ u(_¾c‚nDGś±•«„¶wßö¬ķ±łWŸ,š)ąĖ‹ÄW7ų ?ō± GĒiźĢÕVz6Qš5P‘:k±,ūāö©ŁŸ®–Ė1ł .Kģ÷Śo&ąqkŹŚC°ė…`-I’ģĖėÆ]ĻoŅžŃÄiUŚ%(m–®rmxUbƒSÕær«7[8fĖ&„·:ƚ°ŗ`£8Ŗ“ķŪæķ’·Ÿä0ĒŽÜ®8-A`‹¬Žź¤Å±-Ó”Ūæ2Ci1šÅJkń§o¦°|äVō²ŪމH~”Ē X[`ń%¢ZAlVŁūjš½¤/źrōųøóŁAŗ`j ŅRÕ³Ų$Ŗģ£¦ß+ZnŹ+³ĻĄ†™‘&ˆ¹MU…żņ¶¢+Ņžˆ¹&Ā•ą@Qš »‚ įNÕsk]#ĪšąŠkéż^ĒĄ‹Į’a@Ėā7éwTCcŸ”NXč–;˜¦‚W%œ¦GŚčŹŻƃ€0²ńJ½×®Fƒå‰żkĆuzyTšØėĄ½ŗs*$Ó¬ń› !kł¬¬¼(Ś—8ŸŻÕ“j’%x]GiX_¶sĆÅ­0عb[öY6~€NS’&¬Ŗŗō½Bõ¬ĮHķ:høĀµŠ™D_•Ć  L0 “OR€šźe%ÕücbķtŽĪ»’=sļrė šv0¹z›‚(WßTMłNń¢‘›ķŅŠ|0I‘ˆn]„m„9:é*5§ū.UC-WzŁF©]EģX™Ž/mō€H ų¾ĮHÓl@\ŠZsF £XW؏3‘Š£m6†µ5ŪvōŲ6ģ-ś:×ōö ’eµ#§l ęŽt*|XŅä3ļy„ĪP‚4“’'TŸgĆ0z—Ńę{m,Šh·a“s“čķćLläŅVWM„$#™•Øzā>ć°·±pā»Ž³¼ś¤/žX@NĒ«“…'żžĪrš9ye`&#ń£÷‘óŠ3‚½Tˆf©Å§Č:(Uœi¢×ˆļßæœõ70ę|„Bæ[æ~Qߞ~J6qėėīøā€+ŚRŁ+éüŽģļ{ŠŽ!ņ7 •µĮ½¼œüśćK”XūĀņĻ>Špčß÷LrūĒÅåüxņ÷ĖõüżÉßŗž÷²ķ’ūÆ^Ļ/ĪO{}søüNģɳ»ąFēōŗ{7æÓ“öŽ]ōėlķÓ¾ĻyćēėŁ›ż+’ŅŖ™cÓ?œØK’»S”Ėæüz’{’qßUcŗōƒ}ŚŽĘy(cż?h²šWgk_DÆæÕ:{ńn¼¾?sŁĖ7õĆy’łm/ÕWæ-ūśÉ«Ć'ÆžóŻÅøÕ«Ū^ą²ž6ĶŽ‰·’}ĒæŽ÷z˜‰Ó›»Šˆßé­ö Ķ=æzų²Oˆ6š‚ŽeÕoŖA7Fmō”¤“|ā `åÖ=~zŽĒ;ā³& Ā^ZßŖJuå˜v‰›Ļ%+{œčņĒīy«(nĢfŖŌN± b’—æSIµŠĶI0.³‡|˜>Ōø%kŻŅV‰Ž—ī{PįI`ģ%ÖH°żöæõ¬¼ņ=›ˆ‰fŠįw`dōpą0)6óļ0Įķ¬̤£ń›Ķ:$©—mŪR cĆJ³ÅųgMā†tm{gWW¹‚œį¬R|dbkoĶĀBėH:ØāXKµ“–ßH¬øVæż-%3TÕ8g*Ņ&Ud˜J,ŁIŹ%.i˜« eČĄR jRŽYé3µõ¦N²ļu²lü ±e0ƒ*½8^Ū^ÖGŚłzĻhqsāR¢ošńČ֔^ɀ† GõJAKźe”b:uhLkĶö ś”ć­[TiK›Qi”yb¢=ĄW 6’čŖ n‰Ø.#Ė„FźŌpP„•ƒa0RģÅ«PĮ†[Ÿæƒ»ÄŽy€ÉUƒh¬Ķć,!>Sā£%Ż”;½;qŚH]>²žk,°°d= #óŪĢÓ©»Ŗ«ā‚*„IRł6øQ\š² ä©½ÅÉ@{’&U„‡SpŒœ©!6œō¬Ćą5X}ÆŅ gŖŖnµĮ;ū~ņ=$æńF+²”-l-4ÜøōˆÅŻŚ,Ć@/p&*¼5TōØ©°üŹCU31ˆś=½Ģ_ž¦!³qź././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680649068.0 ppa_dev_tools-0.6.0/tests/data/source/Sources.xz0000664000175000017500000010502014413125554020772 0ustar00brycebryceż7zXZęÖ“F!t/å£įźp‰Ļ](HfŪŚ0…žßbD Kϰ Ę,ęū’‚Ć)ńT‹1yVluS{ĆŽĒ—õPŌņśŅjåå…’TŚļr%a[”Ę,v »k²Ģµ ū±Wčؗj’y?ÖvRĪ–;“øó¶>õšĻŻ/«“kDÕóo² l­h®Įå­źõ1(Ŗ; ĻL+ĄPćyćtŗŪķ·cR«ŅH6­ÄR­N]{sīHDZxó^Ļ>š:uLĄĄoÖĘĢŽČł÷(S3ŚüŽ5Óŗ ¼w‘ę_+ø l2æ”5Žx;”2Ə4_+Ņ‘ {nJŸĢ®üŸŒŹ5/ÅūØLłųGŹbĶ‹l˜Te€Ė6Ŗšėvœ“ŅTGAȬ†Ļ9…Ķī‡_ļŹLnŽA±w1Ÿ>Ōš ēCĚHG0 åērӟŽ:vp¹pJ}>X"$ņ¹U -©“÷¬€C8~„Rn܅~ﱨėÄErÄęߒTéKŃŪ°pf%p};:39 fŖS;?@>ēĢ­ši?›JŽ=ĆĶ0otŸARD±ļX@ƒœt©ęÕg"ģP–¤Gći Ūé–N°§žj7„uŖ p£•MéŗŚ‘V‚ēLĆC™~s²{tŠ›™ĘŖ"j ¦!:‹Ę ÷ī§•ņ[–8ᆓ;ˆ§˜Ö·Zq{ż«\«+“›Ēaü‘WŠ/ņ¹"ž“‚»|£±Ö“Øa32BėFžÕ(³YU *SQ’ö;v:ŗ­“Ac÷_žĄ€=(ŖLŗ^OŖ€ųZ…&Wz\÷Ūsd† yĄĮlZł-”eŁ·ö ­ ~N\”$šś“gģq‡Ń'/\Ūö¶™½‡ˆy•“ŖjNļ~Ō[üŻA„tž„Ó ®čŻ-œąźėŌAætX0šųCr€ūż¦OZ ŹäŽŒ9ēŗ4W7Ż+@©ńN–aß ybD¦S¼¤m½)µć¼jł%"u39Ķ?½œŲy¼€ˆņi0Æp Ų·¼Q¼ņHöĆ&,„ŽœĢ[Ė™’Vى<q}€Å8T¬QčŸéæņéŹøčkȞ@_¢Ło‚įr°Ū™Œ•…vcŻzŽžŁĖ.ž¦a›«Ń:fü")CŠa°œ'Ź5L”~EņĘ%„ 1śwŹ?K ÷ß¾ŃpŁhlč|Uuf^›€Dwf~`ŠÆŁńż“—{&t ‰³ƒŃ‹PY¬$ś£¹µęĢu˜>«*E",`QžĒrČth`@O<įŅ|ŚV†‹9Ø8āĻQ Õԁ'ČšGŻ7ĒĪōŗŚxŠōĆŹ!0rQ®ÓZĒaĖ®8ŌŠ†¦Lč÷€žJZ%%§Ęé`ķ§ņ¦²|łlŚė§[“‘¹F ÕYꊹ̾‚Ģ£Š{Ą®(”¹p}ĢŒ¶ō`O= ‘öYyšhŲܚ•2T(øG}ÆWįģżŸ+­‹x~ĻÅgyä?Ø-e{Ęŗ2š¬žMŽė£Y•kHņ%9x˾ւČĀ5Ų ä§”ė¶Ź³%R”ä ;µt! 2:ēU•±æ>Į08ķÄŪ½j,ƒ™[³CÖŻt%īW®õ S<®$Źg"*¹½£;*‚ĮŃcĄ”ß=fń÷TzAhūRnŹ]­«÷Jy XIp&ĀäĪ6 ƒć f¾ŗā%ņģ¹08-hJ]č’£Ė6Åæ;ņ!@PA³³™Ū1ż™½JÄ6ØhŅ‹DŒś„¹›‚ŒöJ' šČĄŽ|ųųUøzŒś7€udˆĢUŪ½§ä7™7”ųźĘĘBDöI—¦€ę¦łR>~'Õ¤ŽK‚&žŃ°×žĻ©Ö!lX*&Ö.ć¤ÕĶĒÄ >3p¹Ā…éH—kõsyŌDB”#YS q™”ó„’#øąONŻĖ ¤©|^ĆjF/ /ć)ÄAZx žŠČ—k—n‰“A;ĄČēYy…šüĄÖrRŸŅ¼ Ł Cń‹]”üļ°p³Ž ¼ŅUdõ+Ō2„X¢u8Ņ\x^€ōg@żÉźżŲѶ% ø6ĆŻŒ KĪmÖč}ĶGšķŚŠt›)%ß̓šMŪŻØØā¤{a(\AMŒm™¾H‹¾źį„Ćäˁ£G#5rč '6žå¢6‘Ē!#Ž FŚ<3\”Ą~Ȍ,÷āE Ć{ŗmĄƒÜž0™7D %ė—uĶwŅļt·±m^®ÅŠčTśÓI“ׯLÆ!š™ņ+ņɂš‚·£ł…7Vŗ7™ĒGÓĪaÆóŠl§ĮĢ/{^‘hø Ž' Į&źFĮ>£m9_\u€NFŠė&Q myc9Ņ—]WmĢīĆ6Q†8Ų|*=įęŚå!¹ÆŌÆÖ—žhĶĄ‚OŁ1 ź /‡ń>²j-Ø( ‡Ņ“ŗ!~ų ę`ä -jŪģEåąSÜmYģG!Icżbķ9}ƒ¦€uKÜ&k(ęBµä°©“ķĶdżÜ»P]‹Ū|qz…)ŗĶ/uTTŃ25R#ł¼*ҌĄ«+Mޱ°«hxT’ʵ‰—rص×ĪH¾b_1]MKŠiŅĘņAöZjrč~“÷Wß  “ šF$Ūšk‹«ŖDōŒŲę~.V75@ģ’|öΈcH­.·t•a_7h=~”śÖJŖÅ"Eųv Œƒ¹[¦SĶöéWČĀ*a҈żœMŗÜƈSołŻ²ey7ŠgóÜš²€Ėjš„¦Ō£s §äź×^„8oL÷‚U’e±:¾ 2²”?@ź)ź±Rv’sDaPĪX÷dDOHpŹo©;æ9ęūكĶß(}4p²b4‘Č? ‹Rb{½ĪŲyŃ=x~ŠǬŠ;½„I0°=śŚ•c™@!«‘†ƒÖ§÷źĘė€ī"?”ޱ©č‘ģ Äū#Ą Źø! ķGsū&–7ė>³l žPf–©łųcdæ\lµķa”°Ń\Źr"ŽņĘ=k•‡I%±üŗu2yóƒŖÜžē›@~eÜz"r/ĒÖJQö¬§ņ²Ö &å¾Ko‡š Ž$ųĀƒš1Jk HiO”go½LE;õ²]֑š<±Ÿu­‚“ ¦ópˆßŁ» öh“Hœń²2:vĆtµ>rh¤{lŅt“«øin;ŹĘ€o%_½åø@—h2ōn)-ŗąLžøńņŗ–R@šéö²’žbŅtŗHx#5ŗõ›‰ót€Ä©†‘­Œæ =2»šŠęĪ_4˜Ź ;U•ø/Ąķ>Ćšœ¤øń?œÆ¢¤uk°ļ ­Ę¶„‰`ŗ’=†q› 5¶ÅƝĆ9åqā}Éc毲ń‹™=pļ"uĶ꥟ö`j8ż‰~6¦Z³ŸėnbĄD_0ēˆW\ĶŚd¢c±ĖןŲUrÕÜĮ“«÷08Ģß:Š„6ā(eē¬n9 īF-µ²čšL’Bž4xˆg©`»ņ:÷›ĶqµŠ’Œ"”™' %@2mĻØ6@b±Ež[¬ ŗĢDlŽĢ/‹uų’…_YųŹAŗŹ—z¼iåȬO‡‘ČlĶJˆŖ8Ņu,āŪ;ņ_ǐ`¼“ŹŻ•>+°įvźarœ·šĖfē³łžö{Š?‚&š…Ś,źZńPÅ0+«ł!A¼G<8Ī„é!¼%ż™Ą„Ī„w±Ā”%ĢH™š¾ŽE;^GOĪjXĶ*”ĖØģ?S²V.Ń£ŚgErx—k“»¼±IČ8śjÓŌ7"dņ»j7”R@iéõŸXƒńĻ|ēĪÓ¼ļ?šŠ`Ž9^¢É .Ī|Ģļ?³÷ĪYgFk¼öźÕXŖB³¢`€’ČŁĆ¾°ismļĻŌÉŠ<֎&ī¢s¾ī×# FÕČ@k%³b½Af‘EGE‹X?ŁFµQa;7÷•ŃsEƒ5|†„ēdOŽ”ĘĀ’ lœāB4:wP>ń¬“{Öčń2Ź^õęč¶ä<،Š-īAė G—ķāoŅü3Ę[™ē˜W8}ĮeØÉKUŠUhÓCJp’j«~p –,)eęGļY Q7o¦¦~ÆÅvfaOĢźlÆęA¤Ą#ņ²e€é±*®'X¦Ī²Ó :~ėzųÓ V~æÅ•*č‚&÷ń,z[ēQŲ—}–Ä”—lŻŚÆ0`—-ćeŁ3p8z•⢿<Ē»īįy“k”’ßO×"˜čŽ Va›§õNV ädśŻ_’ع ¹õfzÓuNkN«āŸ’ŒŸ§.˜ÜA>vXŅyī Šł»åØ“śu ų^RF0™A“ƍ =½šöRĖćuŁ­oAeĄØść¤ȲŠĮŠ&ŒfĄYˆm>Õ_—/¼”æŗÓgiķ"VäLķw ±œ„ełčtA]7 »ž-ŻC½µšvGsz% <Ž‚Dķ§‹;¬-Łt&—QōTkže%ŲT/u’¤oĮiy©Ą.œˆU#Ģ”Ę;eŌ1¬“Wķ:uõ‡>šµj’)±^’#›EĮüъ¦ÖÖkJ«ö>6Ėcģō” ,p&½6øż“ä?č 'c›×µ]EÉWSl“S²˜ń˜HśĶŅēPżšōö3iū“…äś ē3—2џ”Y’ Ń^ƒÜóąbØ=­ą„j4&®×&½å‡æÓCOÆ/j u’¼}Ž”žϟ±}į%-`2ŁĮ¶“ų4ŠJ:čL>į”ĪŅ{øų%…–…Ż;·¬Łū6CŖĪśź‚YhNž qÜN¶m A­„ ½~?ŸMšˆÆˆlŽ--Ūī9œķؘ%éĖxį°s«¾P*-^«ŠÜ¢Īü9bxP਼»ž«é1ˆŻåšģ“)ąM~4’Łpw}ČÉOrŗżėa ’„UuS¾ŪMjCą˜? rčn” Ģ8>HĢ…Ąl…׳2™ž‹&Eė•põ‡Ÿ{­–Ż»Ÿbž«£ŚŽ”g‘†OķĘćVĖa8T ­€i'Õ!a>ŽtĮ¶Zń†R‚H9ŪßąQ'Y’žSdŗ÷!Č* øĪgął7ē.f`%-'ŃYCó„]jkV>gėõĻ+'ą U@DTŻø'-H'Źž¦g9z¢°ōšš”]Ēš…7C3ś¶E|ämŸ“JQŻŖ¾ģ(97Ź8‚»™cŒ§VwpČ3&Õ+ž½LčÜ<—`C ØÄWŽēaõä#ˆęŠ²Æ“ŌĄ»žīī,ä(Ž¹ė ®“P_"½U-,A v”ćū«°y! õœesķY™ŗśĆ"j15Ņ zĻ—bPš¢WŸ—¢śŹxbeņg&±åńe“ÅŃČ æÓ5 qŲl|ø=Mޱ)ĒfÄ·|ĪpJģ+`E¶—Tt/d“@ĆĆ%†bL-]āh “.;‚ī(µ…„<[MoŚŃóƒ4¤$‡ŗ¢"‚¾IœeÓē6½„³’cńŻĪŻ[]šYvÕ›Ś »ū?-HżŠ$Ó“=Įčū3#±V„ķn‰± ‰Bž”(ač—=*~ūōN1ĪT­@4v)¢`i©pÄŅ ©„ą‘æ—²ųmÉż…ļWÓÖqīŪÅyu”Į Žö9£õü†12Ø)Q/Ve<&59ļŽķ£Žuźö©“.c§wƀc50…|SüaRŃ5cź¹X²ś$eCKj •v¤ęĄē,n’õ:.j‡i;N!%wącˆ`ł0¶bĶ‚Aˇ¢~kl} dTŚāēÄ*ļ^Ē½ >«X°&n™³į– 4’©hčŒćįö4śbV÷&[Ś.ŁSÄ¦Ē$#% 3'h`é1ć|®=žnŽš;ķz]#Ŗ˜[tę'śÜ$Za µ§”ŠŁn’5ß½&qį-ČÖCÜÓ¼ś"˜ŠC+Gļ$ž“ +ę,n‡ųv`ÅÖÓbĀ8Æ#;bq4E›“?p~Ż!ķ‹jo„¹ŌĘÖģBsLcäÉäĆEŸĮēU£5-9h"(²š.¦čņĻk ŅYæ8TQW¹sJļÓ0Č2}»¹#[¬lø“”‰ŃŽæķ³; Ō@‡n‚#a3³i?xPŠ6Ąė5 ęDloŚn00„6³ņ{Ņ…Ėž³0žĒ Ćæ4)ÆX­‡ŪH3’ĢÉaųšÄ;ÄÖ?‡¶ķ÷3lžY”ģÓRŁĄMźŅĶv¢qΆcCØ`§äÓf`øŠv8‹SņȎt©Ų—§:€mŠö,5Q)šµOŽØZ`P «O`ݹh˜“r`’‰_Š’ņupJ<Öčøæ®żWeˆ‰&©ØOą$ā½&RęÓļ¼%””2gĆ°Ū ¢ Å6Sw{{„čąæ“ĆE.ÜüyõŪ~įž_Ī’ā8śŃŠ@ΐö”&“1ł#}2P6·2ŃB7&Žugt¼sķˆš­Ń!,­å ½0ŠLpIÕEF §b“ˆ›i¦É0½ÆžN}®×įł ™Ģ±÷ÜØXYķ ¹†SqU×]ütÄ5CŃ©#f-Ć«j¢&ž›Æ…7zh÷½šŹī2y‡‰vŅrĖb¤a×¶†RIHńIšf­É~°X1“śŒ…š5Ŗ,R*hxąü{ÆŽxˆiļ~ąĒyfæJ ÅēoT`įvŃīĻ—@¢÷¶‹_ą£ŽĒrü±ł&š’‘›‰¶[k«=9.b·‘ū³”sj„ćĖ˲ĆŪɳ%ćÖāJŁäĪ_]ł(Ć%‰£DĪŻĪĒ‹˜v„"ģ’P%–×äÜė9ךBęč’•µ”9‹Õ,jTt6¦g=ČH7˜“IA±”½Ž«c&:&9õj,ÆŖž¾[mą™·ŹS  žÄƞ?8ČĄY@,eö·ux-”ŗ/Ī£%‰ ļyC°īŹ«ƒĀ^óÖ?:‰Ü›#$(a6ź`õœąó~F±±Üxg4Ęõ†Ē”XŃc@ż065«%jhKÕ»ūŗ"čļ±–ŠMż~„®éD®Ō=«6%„œŖ¬(`PµZs‰œ¬˜!49ųĻuŒ„ɑ¼zĪĖtČ]ŒĶüĘ’‰—°}vüŖIȅbV(.“pĮxŚUn6#!Äaķ.®#¢ö)’¼åŪ¤?ɓ˜'?Ģn„ĒøŖÆ yxźSiŖo‰;¶-DŒā.ØŌ‹^¢H0uŒø}¾}£V¤očļ,ĢÕOsŹ~NFpī ėgjŃ5źXłįęŹįŁ=¾>W"7*& S9Ō@”š_+7®ū®ŻĮ&bāÓč-ąZSZLNмō•ĮīAā1JTüł®ÅQ­9AgN”:Ą‹‘ļŸĒ„£84_>mŌ½ĀūbrrŖõƒ”ĪÆ²ęæ«w ~wÅCøö;BŽ u-jkŠzßp¹d°ž¢šéęņV0e*āMXż„=võń,÷õ“½jɈ.0 ĄĻLŲVä§.’#ž°Ņl>b]3ņ£O°€x.ĘE¤]Š>Vx)ņž!/¢Ņ±» %y~ )©L/DŒX³V²SNL{O Š`ŖY×ū±A‰­}¶ŠŽš|V¾[8TW¬^ Ģ«ŒvĀłĢ QtėŲ#uš“+ŸšÆ•A…†ņ„|$1+ƓuÖ³ējKŁńµÜeŽ“F¦|‘‘jŽV‰¢I~öū„y+u~ŌøéøÕQ0Ʋ ż‘“Ćļš“¼k6R[GY¢óm OAlĖ@Ęė y–”G>!ŠŹ(Oņˆ’›Xęqąõf jb®JhŹbUsh›ŸM$Q„E:„Æ]8Nb]i?±?±[ż@ūÕN†ē]ØĮĖJHj×ŗe|ģJp¤E(ĀG<œ˜’½:ÓUN:Ń£÷“żšųa*i¤½/R’#¼›z;<žl±aC\ßXˆLVĶŃ3ŠŪPŌc€Ū:BÜBUümī”3kg‘Y›gv·ś§8šƒ$ŹX<‰1Ööż5BĒō”£įš^įłĘšj>„‹µ\÷įč‹Ńtq‚ŲŠŚ¬AŻ‘,æĻrµ]¢ SõwD< Ę[½#@šÉ¹ĶšZx`ƒņƂ8µĒ]ąÄ Q€lõɐ c«…Y—\hŒ”Ę@śGöZ‰{+Õ!¢6Ķ7īŅ¢.!ī2_¹ \ægOjqu“GnZsilōō,r€9;¦ćcā6 Ą›pTšt!¼~{?ńƒ’\˜å`œXų–h$2Ģ X–Łu ™ž¼?ńõ„ƒROń~Z—ƒ˜=Ž ­Ōg°ŚŃšV'Y,xZŒÅ9ΤóćTO€“ĪóaĮ“ŒŹCŅȐĪ)JyĀŽ”Ŗųc,¤³’É’eéץ*Žēvžēś’PōČŁY@:‹Ļ»f½Œkę-™™Ņ^’<ĘEsĒ„ÜTŠ"Æ%ĀÉ3)čÖd]Ęc!<ó=p)ópK.ŗē¹/ĔZäīšŻ*Ää‚P:­ļMœKE¶“'ĮČ·€.j~9P„– Wäßł#?QĘ^³„ØHG †ÄŹ{"Ŗ“ £3ÜČcf”yV’B k9F“²ćĶ„¤7•O!Ä:OIƒ³Į†—Łō18VŽd|ŸqĪé>ŗŁÉ'Ōčž>ū$›…‡ū`ŗ>åŽ(hq}±|Ėć=?DEŠN Ę%»+×A”€R. »WķH½ķü‰ÆN­Ž‡V»ØtŁ\ÕaĒùƒ†ų<ģ®Ļ¢^$&uj6»‡7·ĆBZŒtK^O’ÉʙGÜ4ŽōIJW64„ńƒ§č0C„ģ±~©¦“—8±õX¼äSŠrŪ¦ū˜-fxpFģŌńõq\RJ»j•Ͳ“%ēĻBe/7ń@¹I§Öoćrģž+g†z sB’½Ģō⢻Õõ ūõ` d0ķäPó“ĘM›pšÄ„G@s„†āŽÉ†4č)ą†¬«PüMO?l‚—le+ö/ųyQÅׂ–äāzTń<³FˆŲ›Ž<Į£āńĖ& ĄĖRĶ“S…zXČ>RlZ™f+µņ¬‘|­ōT¤Ii<ŠŃ¾9V‚pąĻa‹Žx’1Q]w7uČPČC¹*•˜!¶XCwµ2)‹lŻ:› žkew8RŒhØĻ’¶L¦e<„Rø5#Õ±Dšž(§j¼mwkWVź›Ėš^TbłT—ÖMBÓ¢N§ØHgēR.˜”šÄ‡Ł/ļÜ,€‹E‰Ü'ņ—)ŚŠ„਷łˆJ%;qש÷ŻkĶhYŽl~ū‡ņ5ń”¬ņ= eNš+r˜¢ŃlŌåynu›"l·¾-,.dĒ*2‚V'õFūY™Øa•¦Ž}°Æ(Źf aæ N,]·ģ5uŅ CīėØŽįg§ĒĀ«˜ŁY%f1 /҆ެ³Æ¤GŲKrźĄż_T¹¼f†”Ā!ī éb£ĆŹJ<⽂UUFDœÓwbaDŸ~¬š“>¬ńž"6wÜŽCEkd:”VŲŽ€"Qn…Xü@V¤'¢’°•gļõŅßׁ_RŻ]|'q­€‘Z Ļ‡é|7ĒkĒP9łlęB‹2G+ģ1۟øÄZyķįˆć~^y ¤śˆĶ•rēܽKf.m€Ęƒktr‘Ž“&"ŪQxćÉ«FĪ#v .¢vėłģŚ‘”Ń”žR}Iš}ń:ž¬ļć7Ł Ž9y¢²9k3… SˆF–ŗ$ѾOf €ŗ™ ŸŖŠj3)65|;Īś,{Œxė±!«Ėś)ź8nāM|­|'ʍ _^ꙈɁCÅÜ1Ėł §ßÄ~¤ęŃ" ø@–Ę8hį²č‚`/eЬUéŠĢĒ;ŠI”s æ‡ø„c@ålŲRKOó“¾¹Z…ĘV²GEMĻéØoƒ*^o?|ŽDH}–X`$”ßļy€ęCšļfēͶ‘~åTŃÖ•uŗķDśZŁ9”k ‚–XRįÕaﶚ,ČV5I…œģ]ķB<ÕJX«‹/²ÕRŚŲ“ųOšbY]SÖó6é¶WJ¼“j#”‚¦ÅÜ$Vb°6VęIR7%­}/µO)@ŁļL-KīW3 YN J•U>@š()dܓl–øĪrņ,~élZŪŚ£,‰Ž×f@%˜ •¦Ą9•^pˆmx3Ŷu Ō¦š‰++¾K%Zdׄ x!EÉĆŅāt‚č·{ŃjR°ŗÄ6õö‚üÉßžšÄˆĔŖ;Dœao&GK~¶²œOÕn…sm“äøÓŚžģE¤H%T€k”W¤œZø ĄĪVS¹Ōķ!éŒ$XĻ!¼Įū€ęĄ™ɅOJJbs2ÉĻ;s)3£Ż÷oń…{L`ˆ;Ķ+‚ŒÅ“Āķ±¶/a›Wņ“ś„ĶwCšĢĶ¬Õš•ךqńõö_&1>‰“”@ é„*ĪRäsmQ×-Ņrόł B ր^kŽČģ`’ yM×¼āy·łn |Ģ$)Eˆü$ßō§y.~ššnģ×^1O‡—#ōg¢Pģ–™T=­*PcīV’;¢š9Ó Ūń½,m;ČĘÄŻ\­6!Ż%iēĒlŗ&üZāųk“œLmķ9ŻFo©|`óUčæģ9Iš Ü —gß l$""ŠŪ,‚> ÅEZµ¬n·¢jlēcWT se9y /3JP±šĖBrÆxÜücV‹·–DlæÜ–6/ŠžĀ÷бzłWh8½5ą%ł‘1Ė/ģ:;”ōzs}Ø+’5w+ŽńøŃ.²(;Ó,¹x;8ķ(ė[Ģśé7ńšUaeÖ‹Šła6 Ē{T=1 1"E=ČŠć–£bņś‡š"N%\ łhJĪÜßӌi5Ņ ‘į#ū†æĄÜ™%ćŠÓ£Š‘sd<.0`YoÆlõTyŒ{1ķ0b(”»Ż2Śv…ćg±wĒe©š¬Ł*ĪÉmi̬č-łf)6¢Ŗ®ģOY“]J†'BN»²Tx€/C0̼Õ":÷ „sTĘo’“Ņåm‘Y8*‡‰Hˆ¾Źæؑ• ¶XäǶ4åā’eg Ju“©”æłMTŅņÄf)rٹūž’Aߎ嬋µŒ“/±Ū-žĶ‘łŻ¾µ/ēŪæĒŽšVŻŅ%ŠčŌöŌ™š7©3‡ š¶!0ŲB!Š­!O¹UŻĆ‡īšT6?p®w3³tćŹy“dÄ^_lŒyUżŖ÷uĄbo I~źl%|»«³Rf­xе§*ćū'küShŅw2šL@™|#aæö$Ėb¶Ā{8ĄĮܗŹlV~m#YA Ė47źv§ä¶j%ƌ }S'įIŌźŒ"¶öh…óʒ¤e]ĄÕĖr&“äłtė;.Š¢\…µż#ĀõN;$Ol,“õå‚Ig=‚N$)ˆ}Ćø^’“©gā/Ć Q°ÜäćµI)0CĖé²C2ba’ĪžŚia©X’§žŪ+Xße[](ØZÄnY²KÖ}[±v‰ Ÿ%nv~C­}“­é?ō&̧/”f“ą„ķœjTžœ"ńIŅś†Ń™Ēę›Öķ^ĆA čõą{–]0±ŠÆ“GŒLķ–uNj ,’_ 'Ž’Ó•oFPŠK„@-­•dDź+˜ąµeŒō%JŒµhLüißäĘOXęõ÷ P”vŌ+¹j“źr»˜Yš(d”mńņÓ÷üŠŖØÕ"įŠ÷ąglśĒĖZéąĘSĖü?Ęō c( NąR¦Ē„“²¶y+LP q“ņ“į1µ@ū~Tξ3øń×Ń”›§ūW6Č įFüƒæ‚“»Oµ ˆF ‡2śÄ”>¦hc?{ē')tŽ(õcÖ¾¾».„4ß1q!ŪpĮ7,ƒuq`€”ż`M@ŖĶb<(Ē”d8™oœR uzš6é"ū1®ćŸk8š‘Šu9ŌéšĮK’(~¶¢ģ£ )c,ŻĖbōż "pĮ’ćQ—D½ķ(®Šs//\åSĆcv…‘ˆā(Æ<€_µ_–ŗ`vSMĖ'֝üȘ8”“JҲŗēĶ\ŪNTÆl‚F±K™`Xr2s ä·Œ m2µš§Öy:Ó»|ä[Ļxt3(ź-‡×&+.‚3hz†¬'#šL«ź żÉče½—W.氞/®É”–ŻŒé&˜wžżyŻß9Qø[2gķŅ<]ŽY_³īčė¦2KūČe|#NÖl¢Ļŗ„™SƒŪ!€knßi¶u+2SVÜ³ā‚ž’ –±²[žp§å‚ķńS‰#Yf¶Ŗ~,>׌œbś£ĖzÕQ}±£€Fх}ŅwĮ„梦qFįF”„"„ėÅ£fSˆ‘{"汄źe†A$µ„„u€óYēāĀÜį‰ģŪ² -ʌ ēņc˜3Ń|x…»BM}„ĢŚ¤'x~(„Ɓ>ģä¼ł˜NĶ‚yx ·žęzÕ’AHkœyöŪ#ĶÜ ęƒiYb É2Olė0čÄ.‰A>x±’øųFXņ?xC•qGē9R!ź.'J \:¾Šé¾ĶB€Æ? ¾ŗńD» [¶œŚŲXéP4LŪ{bo-0Eb_ņ왫UüĄ[jÄBŸõq6&uĀƧė0ķRĄCóPóv¦ź:’1zāĀū ‹Š„ ®V¬,7•ŠmŁ56Q͇°AĘ>[- śdސœŖÉ’˜į݈ö° 䖛«rē”S³óØFžE_C»€Ę5¶ĀśréaWq®Ā5ńwi¶'UÄåaÕ&OĄmÄćß4e9ąąŌ¤f½k9hŽŠ;č…!Y†čX‚ńž‘ Å"›c–œ°ģLF;'ī;/Ī“o:* £pįĻmķńFV±r$’X¶½žQ“rä w…$^}Üqά/°¼Ąģ źoäÅt{c¼ę@1ūI¦%ūŒō¢7~ŠõJą">ƒl żł‘£éŹīßĘņŚ8I€ Šž‰_Ēż_ѱ¬¹¼¬Ģf¼ĘļÄʆŖ0Š`Š©nūƛõĖ®G;bcm‡…Ļa‡fE x`¦5Ó-R«ÄēXø`Ÿįgzś4|8ēĆe’±ĢŸa!÷ńȆ °Ī'4/­)…Iīh>F1ō.§ŗ0ÅOĄņ^ŁqęĮ8īUČ4E ø–²® Ė29z˜ĖÖ·³å"†'óĮš0$|Qɶ–‡Ņ3§qj½é#¦©£‰ų˜:+rūØ}„ó=”ųIžœŠœp± żŸ¼Ņ¶7 ŻžR®¶UoissŠ'uŸ†ĀO¢įT²ŹxO¦ķżĆ×v.D¶Kł× ÷„–ąLž"3'”w—0»õj8,žAņBIP»€§¶ ĘńŃ-œ0§°Ö)sćœü‚dżX,Fąi×!.‹eBX}·(ś†2Ä{.³GJ‡—eğŇ²r¼«#ØGjēsяˆ!Ł÷QŽfŸš_üŌ‹:5”W„ ŚT†QĮœéĆß²Žńzókš¶GAĢsdQ;¬ń5![ÜĮfޱŠ">zæŻØ’\T5gĪ·cåŸ8@¬—e ōŅ›6”-äł²!43eźk³«›Ķ/$GŃę€Ć ĶVóĘčŹ²>Vc’CQņ ćEyxQ{AŪ ŃŽ½ČwŒ#mpWńöŽŠŃ1$tĖ„ē°,ᰃJIļ8}b,Ø”0€ZɕŌ7ą«Œ˜–šAɬ^Ī3<ō}·?œgŌ7jsjļ#ķ}f“du”4Ó_ć“zm[o#@GŚJĘ4Ēż(Oó£—éµ’Ī@›ŒĒJc? x¤„Į†RŚē4“Ūx˜„ø2ö±Õ¢·ćĘóa”÷§~«óøW“«bõ¹ī`Có”Hs(žµW±‚Īϰ¬³:4Ą6f÷Ąų»LŽŅž~mūW|^µgˆ“( Xßō&ř®®QōßŅÖ0”(SE|åk÷›Š^U®ŸÓ–¹”ŽWGt*ž‚Øb>-ƒœ[+?”ēå¹$ϾzeŲēĮæćų°Ŗēī0_n!…ł‰‘–”k¾qī+Œ”­rŖ¦ų–NīF,kœłˆ—”Ł"X+„ģś*ZĪqW‹Lw³¤Į8©łd—‡,ÕV1—żöżį’g2æž2rlÕ3MY˜ +“ŽÅŠ{_xzZ!ųü“ÆqĢŠ%°†Kž-Pvś÷@nčĻĶhÖ)Ų”ø‚DĀe  N „¶2‰s‘Y]Ćۊü·Ō1!Ō2« wŪ^žeß?I°~Œ÷&ŽĶŲ¹ōéwThŽćÉiÖ*”ĀšĘ¤ŻŽ”hŻ^ökŗ@ČvT퇻Ś>śھ=ߌΠd-”x”Œćp!ę Ł“!Ņ’ŪĪ3› 3Øtņ6+ūļ ŠćžéšwšĀė~l?¦ŗU,Ņīķö—ĀxGPQTf,öÆø\u™ŗdŻv„Ē)$žvU»‘A18œ €ö©„ŌŽ°…źV(%'#®_c{ŪŠēõę‘Ćģ[¾IÕ żä艦ļ;ŒWūłx_Cƒ©ÆÖf2“Ā>UՐ¤ėiAōÜH'¾|¤v©ߚ¼Z#āb o(źī.°@{n×@åĖż©V-¤‰vj(Ą00D Ć£nņÓµhÕb¾ČÖāŽB£Ī5½³^G®øe^3U-Ūć» “dŪ›3ꑒŸV·T[-1[žµŠ¼BϽjĖst0*ŁÄ“S[ĒB*²%œ@9@"„”fA¼¹t ”‘ōL暟[& rOݦœJąż’exAĻ’ÕEh^֚Aœģė*ž |8‘V‡éaŸ!x(čQķ %ščĒ®™Ź÷s°[ƒP"ŗķ@d+~żˆF„ĶūiHóäµ]­ĢZF4-µń čK³ƒ1ųŽņĽV’-–UļA ė22!Tēæį„)<ź>Ā(lœŖü M¼Ā2Ę.m ,|sęø=ĮC©…Ų—³<ĀÓń= ‹ōŠź€„Rņ·HĘ-.­Æ xŸĖ‡øWUz“Pźšc!<šŻČŽD;B/±E'Ś@Ż[šč ė ¼l²ŚŅ&šĮ7ę,c –»Žž:€*9·ćŅ$é [Mڬ”“တr–“Y^ ”ÖƊŹ„}i “„>Śbŗ†¶D:Y³ČÓF’«åņ"=ś½SŁńl,Ö«N£PP<”+”œ¾‡Ėųģ’ٹ|—v–陓ņ™Ŗž?Yljå†ņ؁LĢėwĢIīm*"Wv|V=|/lRIć .MĮHn 1Ķ:¢–įō>[ī “Ÿ=śM}­r€csåm”‡q–ēy-ąŠ’„¢‡ž†xiPėł 1ŠĒŸ7µWkz –ĢÆ_Ńt1K—ŲØf³¼ Šægµ<£+ŁŹ5¦ėĒĶĪ6dń³…†uؗ)›S’QĻ”hR‘UGĒaęÓÓE¢ŃļpĒqp?‹ö!²,Ś ó…Č.V–ę¼\āʧß;ó–¼ŅwŠ1śž~ÕĀŁ°±9ÜśŖU—­zq÷Ē€e½hLĻāĻ®¢\‰˜’䅱Ąä#  9¬Ŗq{o³%[›ų Ÿ ’x˜Qõ§SŃ®[īŠ)j‹ŪxQ¹!*ī5cZōg•U `ō#;p¶ZłčĖĮ:Žs}cĻČ,• Ęźķ&“;åDDÜ2¾³]Ć.ŗk„>ń_ ė|AUŻYžÅäÓu0µ6ĆcBośĄõ‚„j×Ē™ŠŹ©ÖF}ü3gó’ M§<}W ÜuóKf6?ė„QčBTū+Év „÷Ķ+ÜŗŠN9_¦–G|f™@‡¢Õ„`ßÅMėöŻŁČ°”ØCĖź;vœkĄ¦–‰¼+HĖŪnA˜īD£Ī+<®į§%nV³…ę÷6oå¦ķʉä!ō@HšŽé£ŹĄ¼€ D?ˆ Éq…#=ź&…eźāŽ;ų¤‹ø+©Sęą^ѹ?0¦‰@ŚŌ—”‘™˜wē»U]¼ź5Į=ńRź²'wÖŗ7“mµ5“ t.ąjąŗR•{nt²ø^9_é™;;1] ^Īˆ’éŽøŽ!Ę01āĖ]2ĢÓśˆ”PΘńgĆ‹¹jöGn“žo y­–¤§ZˆŠÓ¼œģo“>AėbO_¢ fźĢ„L‘ŠpÉLIŲŗĶ‹Ī~į岇oźn–¾L:„p&Ä@Ŗ§TńŸźV²ń¾¢“}ĘČ»šRĄ7ošØ²Ę<e'ß²/5]K\ > EƃŸ8×gU€EŹpLz$ŗœŲ¤Hųā±ė„2‚@ņ’"Ę*÷7 !¢ÄĖǦq”ėEŚfÖ 01øt ,4·¾ģ郣F!»÷D±å'O54€#Ѥ‡s[ź§ßĻ»÷‘~™ ļŽÓüŪµņh$‚2X“yW}wƒ¹Š ¢!~aC7ū¦d“żš›Ā¶Ņj;UdZ%JĶD¼D%•’z †ļoŌXĮ·µĒÄÉBżAk1ܤݚa- įFu©ÅVųM†ÜT”© —#Õ.‚¢ł?lŚVŒ7KI©Ø wT–Ķיõćv°x€—œ©eÉĪžųś|o‡»ˆNņTįz¾–żEĄ•/ń’‰ŗvHœć½māi»\³Ć&ÕśźĮ…6ižP£3ąe'‹DŖ'­døBˆŁPœiœź å[”ĘāŁ¦Ē6…1ÉXó¦óbC?d]_ŗ•Bb1õÅ%3#°\uN¬ŪŚi Q‚]µÅ‡ ²;ÜHzĘ>ޱ_?­#]Õ½Ü }†ż{ś Įu±ū<Ó ˜×Ģ^`t‡X ¤B{ ¦u€²?†ī0¼€W„龝Ă[T½«óĢó_Ńŗoł/ƒ:Żś{v¶7¦ĶTp›ßü–GNUk”P†Ž:"Š“i€‡$"$‡§ēZßįņc c¹x*ŠōZé¬Qp`#'#ÖOeė8Ėf×bšč/*ĀWWšœæ¶•¶täC°Łiś8Éb²’kāņ_cŖ2M}_}¶“ßpā²°’Cø.[IŚEZ°Ęצq/Š'šļō*`O+ÓžČ#nl# Š=xńŁ—³ŠĒuŚŒŽ\˜Ü‡–O"Z7^6t$8€sL¤Ókń½įšm‰¢|tĘ$+ż¾Hsß žµqŻXą;xČć|S\/RŲ. u¤ė(Čuµ#y„ģcŽ[…čąÓ˜ž§”±ł"Š©+WJx.tņ+k‚Ī}į?×–Ł“QńĄēü·’‘_iĶė>žVk ugÕ½^]P— ÕąŪ!¹€q¾Žssłe[ͧt‹ņĖ÷Ė›ü‚²cdE±‚ŗny}俥”śDŁŗpµv•‘AØgŲ[ł¢$ÖŅæB`²l!OÓŚé?+ßwxRŽŌ³`µŁ‡–wŁ‚(YHL7?OŪ•ņ”¾—FrÄ:Į÷³’™[c?9įƒ¹Æą8†Ģ7łGŽ +Ł’ģ_’?‘“3„ßŗ?Į=–rÉŁ£dg]õ?“čÕaAŠņ‘«5f¢`ǧVē =ÖæŲQū+#’Žēډ˜Ÿ³ŠÓƒ‚ĶSՇl­dł/Īw8ų—É“V9WĀoĒ֣ͻm¦z¢¾ÖDRÆnBrŗoīģ#Æh ‚æĮ™ļ¶x"«EĶ{7Ī.’eAŪw=𢗩`u©šˆyźžą³Žf0ƾ†čž;„įµtA#O”v5ö1jsęĪ„(Dć4€ĢgŪp…ŠBŽŁq.±¶šĻ 5¾Ļ.[Ū¹.Ž}™Ś÷”G„!B2D”J •Oü-“J3W‡”B›2Ą=cącT„÷·†Š­ÕŁÄįń”ÓZŠ-³ņķ9†ł¹•容Tv7LŻžoĻšS•‘炵°»ņģ ¼•rg/Q2,ļ}Źqؗ™·č(ß"] óŠaਿ$ĢóTȄ”Ø8æž,™&eŠĆ™.øķÜčˆVsFÖ“Sže©‡ĶGų¼ļÜŹo » m„i,ŁW™ óNŻxu”÷*›Ķ«<—×¾””¶“0SpŠŠžĘ\&·~‚;UQu— ¤J4R(I‡POž ^O[)Æb…ß—ÄŸg÷/śÅ¦;*g‹tąŻ®bT'ó¹£qņģ^­šŌÖU¢ÄÕŽłŚRø”j¼äõIšŚjĄ¾>UšĀĆIé¼ŻAl9‚bK®Y ›6öō3PŠ2š‘uńē›™–•>¤\Ŗ<ó{}k›Æ)€Žåa„f Ć+wqü];ū ½Š78Š É&›SūkNĒrIŠ’‹Ł³O¦®ø¶¢Aß 9o&¾īū/;ŲŃ"ē_ąCŠ’+ÖōS^ęג€ BÅ=«™Ć_ō„„ÄpęŲ¦K•‡ å.€—į-k]Ž'q†Jžfi“q<“›ųął,Ģ‚±˜«v—ÕŻŹN³Ŗ(z”üėR™ž«õȾōąĻ©«©|+äŒņ%ŽwbŌĪÅd½Ć;ōgø@ĄšJGÜE¦­b„śŽŁŅ1‘ßēŖ·•iuēūūqzi’„y 0Š nŠó³äb(¼¾ŗYĶøś®Ę62!ŪÜO8ø4|axHä¾r¶ę šC‰8įōŖA7eTöį„2³Ņ2Å"ŠĄę?ą‡Ę©¦Ż/tó‡Oq³›ÕŅ1Œųļ!@“_ŗ#I“'¹$äßemŖI“„4¹%-J–c.H $ł{…‚E^…sī7”PĒtMęąXf$Łw]śdʁzbtę©Ml“ÆÅE0p°PEīGr i·Æ/ Q%Ro”ŸŒ‹Ó,“<1n÷@ĻVk’°:Óm'‹XCA³Hü°Ó ¢©ļj`”%G³Ÿ»ėĆ9¾Ŗō"DŌGā`ud”÷Ō±‹Ņ¹ĆE G5A¢ī ˜#Ÿ‡}ņ‚ŽĶHū¶Ü’®Ž=’—)Üʀ¢¦‚^8¦@iiŅ"fÅazÉīVĻŠ †gQ’Č’ó]K ā:u{I”P&YīńźĀD_Ö]ā>/ŸėQš±ąm#?³†å½Īc‘= >žaįĖ!ų`ˆøÜ?ĻZ—łA`ó Ų§„|€Æ_‚÷S)ĆŁ{ÕćÅ"µ"XCŖt8šĒ¢ī;BįÕ×ņĢ«Ōėp,•z[ɚyɒ²‡6ń€NL}š!2×RÄŽ7wģEa¹Q޵:JāYH՞2ąæ×MβšĀCK—{Xk`Ĭā>y^?xÜ šŲū* *†÷±P‰A Ōą™OCšŖĶš¹ĆgÉ~F“R.„÷˜ū’¼×IJ«ćS¹oX`ĒvJUŲ©P§|,Øy;Öy<‚Š›ęJ…ܠ瀅•†ł:–¼uó¼Y,0č;–™$֒9äwŅ¢ØŒ¾­ŪrdšKµroęŚOæł€%Ćsf-—żp‘ß«Ngx° ę įė³O`Ž1ō0q/Ąuy6ü`-c2«ś\£”™äSwlŚ”ĢśõÄģŒ4•‡śy8r«&@ ƒ<‡Ė„‰.¼ū›c‚¼†$6½ »1 Œ`ųĆŽ’(*4*¾ü¢gsׁÆń›.+¬”4Ń*Pļh>r¼¤.4q RKū…ld…¶|¶,±1¤¤Qü7‘{e|$BÕņD #qt§²ŽĀ±ÆVP„U“ŖźņłYŽŠÅ!ßń/ēēx7Yō3D˜IŅAtī“gŚ:ŲŽ{7¢sóuß%lņ”›„ƒ 1/ŠYņ[Čc€“ RX©5Ķų“Õ§±ų³łėƍ Ū;”,r37‚M>p«įØĮĶM†»lśöu¤²/E%H?Z‡ŗĢśĖüiÓƒęó"ēĮCŲēL˜Ä+…ü\h)WBš„n_Øē§xņą Åp=Ž®)ē@£^‡Uʵ„-)Ū$QUļoČ>4¼U”Q»Õ=ō{#§ƒ”DŪ@¦…k¶R¬RƒÄq}ŌĶ:B—ā™zµSF°»ą’“pßō”H05²j+ĮMLOŃ7+ī©J.•†lŁ…Š{wfʕĆųrØ$“ s IȽ”¦tö@Žs2Į¤™;‹”Yń¤ł Ü®äé·bł¤:¦Ÿ‹4Uv_ׄāžLŸ=ʋ2AE•Ģė`óŹ›ĆQ…N€÷fó™™å”uōpW0ĆI~²~óL‡Ņ¾čL™”& 9_{/ūS‹37SĆ3)»EréĮT`č.i)oÆöJmõw­±„±Ō1ĀöUBĆÜōčqš[¼ÜyŌ7ų‹d›€ė ”×L8n Ėš[JdåŚcPˆv‰ūå±ĢÓ©ؽō#ūŪ€”v³(Ļ}gĢĖŲ;³¬ī‹~p’?%$;`k€ÖNė”ųAyZ²ž-mL-’Ņ0Ņ$Ž)x7«,¶c¢üG‚Z%Ķ'„G„=oß@‚öoLėͲmJm„ąĖ½qŅRüVLąVvī`»e*ȆœVŌł‡ē$%)Žõ[cćQ‚Vø¦EĄcXDĻŽ9ÓĖGÕ"ÕĒĄF°1ȍ­PYhU3ˆ h¹„üó-9µž%°³æY[cūuÆhėRéō—ZÅ?³ÅT ‰FžŚ·æIõįwõńŃ»{ėL3½®ać\’—-č×uVÄB¾f222É ‰€V¾ –ņÆėÜ*ēś!Ī{D&„JøĀ•& uŠŅ.R jˆobø ęŸ$:®ŃÅć_Tƾ XļóC{6.Ļ¢"@ōŠ`„}Ēż ž¦iG°“±ĪŽ1BŸĻČā…ü ČØm­ĪT‡5) ›_āŠŲ0ÆĮłœķ„^”€tps’×S–ėŌBöš_ö\؈Ⱦa[_P(“šŻ)UŠcÕÖŽ‡pĶ!“¾č©JUt u6Ż[µŖ œ)Źć•ōĻĮCžs-³®£séH0Sk®r?»×lU‚¹ĮŹ6XF™!19šLL«j^“+ś×aEń¤tč~<~sDœėe”©§˜sŲ/E4ä~Ń…NDĘĮ\ńĖŹU–ėM›śR®:šÆWŗĘΫꗸK ž!³²o¾xFˆź ,usTµŠ/n®jރ—ŹŸta18u”Ł^҉ "čšw¦·fŻ©…1zЬI×IMŗÉĄ _‚™ģaṵ̈דT>ł–6&ńź·•÷aĖ8‰¹XÄp€NōK#tWŗžĒ:wFŲBŁ7T™ ·[£B©&k±JD”ģīĒ­ś¢Ö—å_efĘ Ļ§č°.kĆĖ,©/ūe5²éW[+Ō=™Ü(+żėO@™ć—¶¹DąN^Ż£oģž/OZĪ §ę$““lzdÓ3ž£čߣ²¬?‡ń]šŽAwo²°^}y7ĢüĖ1Ö=2ų3Œ;ł TNRZČ!äÖGT0é>uʆ¹<*²LŌ¼B„§w™®Ż°źśÅĖŪméZ—ąž,]VŒ·ƒĻĢ’›ĻīČKŽkģ=ņ&'w*Ę<ō¦oŒ.{¦v¾Ī(õ4Õ”ÅĘ6“Ó¢#%sJ Ā“«õ‚męjH­2ĖŃæYŽīI$ÓÉĄõü’Ć×5¼ī2S6‡ŠxR“z§ŲŠ#Õ 2żĪ3˜ˆ(‡ČīNķøč§<}!S¼ƒc;*ćłé%ŚCjżŸņ~q bķ@MFpļ\§ĖśĀ”¼ŻbŅ^՚)F·M×ķœ ?øM°˜³†gu°ćG{ķȔ ¹ŠÄż JYÓ9ĮuŅÉłpßöÆļ_y(\”ƒ’ī±Š¹żĮ‹wWKé?LßÕĆ č²3[9æ·ÅŸ…©¹Āö2"tšpĮŁq›ł;_ŅQõ¬Aj”•ņœ­[WlūæŽĆ/*“Ė'Ä„V7q!Zż½zÆŃ!·[äß8· ļ …-µ·‡Š] åé©į  ™` ćī„ͧńax¤IÖffӔāeƈęłv r/cƒuļåŅ1ē*„ސÄuaˆł|{ŅėłN©@×ģRmź+˵Ł@Ī®ŃFud¶ŁÆ„œb²"š›Łæ&~·Äœß~"uW =H_wMāųę^÷“å2ˆĆ¦}učŸFōMŪūæ]-UŒųWzhwŻCJFͳŖ±õ½ŖŁ”ĒJR…~2ilx&vóŁx6[óĀź™GZ“2Œā0K·%Ės:KZ…P1~Ź­l|P6W¬·č­80œh—æ““iÜ8'ėE6±c9IĻo¦xźU» ±s—²U=$(_ ß]ķõø 6n Zõ¹ą£īė邻³Īž“HÆē0„Ģ£# ¤›xż-»®Łmß:†ŲWŖµ†©Üķ`Ń/Ɲßb³cˆOĪV’ƒŠé”°&Ē[+!Ęė3īŻ^ņK֌õv}C z•Ņtˆ|

>źµą“1Ļ»@”~„rēP'~£0[€HįÖ f¹oS@3©ĶO.°8)ō}ś)a€¢ņÅ}²U¤ü ”¼«;SøäqĢTtńsA°ß=ŌqéBė82:™a™ …€‹§ä"ŗ“ćčķ¶÷Ńw§i^ŗtmūį6<ķÓŃ!nčnˆ„eĒraœˆć$š²D&$TQ½“^“ šó’įÉY5¼‹Č±K²éŗ#4—“ -Į$łŹĆK[ōœńoš)~Ē ąé¾/–Šię0…l3rāx*ė!$»N®żĪ}é4Œ˜Ų̹sWā”IÓ)I¤±B›Ōé=zŽ÷>}S@­°öp†i bZņ Ō_jļŹ€9÷5Īŗ6›Ņ”Ō‰!b0‚Ųoē3‡6­,”Gj\öT)ž¬p߆fĪøŒĢSvVI L—f^ ×?}ī¬Oū$ŁČ»„ŅEŽŌÅĻN5"geŃ+šĀÄ8ęHF€ tÓ-¼#Wł0†¦ X² |ĀįĪĄ•u`Ž›²<;¬„Š3¤…а5€Ę E®+ū”÷Ą?gę­@ZŚO<ĘrĮ*‘+hłSŹy$õŹj—w#€“ƒ½Š·%GŒ€ą»Nj?z×W^hų–õĻź—ąóʜiŒ™I,0ZŽ‚0eDlJĄN /!z ’Ń+š%ųŠćG–Ęø`„K¹šÄK‘;¢žŃ)Ś#“°’Óo<*Œ¤ė*ś¶ 8 ^‘āł­§‹ĶƒĖÖ*”‡ĶyHńŅ·]ƒPāE”ƒŻoĮīBcø†×—ŗĢÄŃĖ71®½ÄŲ|f&’.ö¤[1˜ßüW1ųķLwŁ(“@ؼ)Ēŗg’“Ÿęæš7č ­ó‚+Fż­{¹žūĒ,~=_ ~e-]<Ī H¬f V®µ …¼žēį™˜i Ō€ƒÉmzZłŲ£ÆxØs…’tl'TčZĒĖįĪD½Ń¦_ Ą-³ŅŅ'cM"CÕŲ¬®š ˜v’ēuåāz2M«i¼E¹āĆ{p6Xu!IM²5R&ܾµ‚8DŻÅræhĪ€ē{ū?™p…Õķ*yöß8pŚŽs×®eų‹Õ–L©eZčM·ō’ČXĘjĮ€tØ•-e»‡éQƒĆ¹ü«Ž‡.·3hNy.Ņ+z/ļ,#u_lƒĄÜR}5zµåø.#F:z˜ž|Z‡DspĘ5+,ź%FcΤ©³wCRßä ŃĢx쐹ēäņ›nՈtļÅ=q¼ŗ,P*VÖéž³—3{§˜[»l’˜™R°‰G¼Ę3eCX&iz6Ę’ģ~HŃöOfzøI`o"?…ķķ•™Ķ˜œ‹Äv*¾Ņ„ędv‘ikRI]_Ö:ø3×Y”Ŧf‹°»287oź‰ įH¶m؍_:>t#2`Ķ"GV”¼7.V²?]Ó 3Ül“+ܬZ_åHų¢—.÷cŗØ/åśHŸZåW2×Aßy'½5Lŗgx·qˆ1µ5fß®¦õqO. wāŽöDTfžŠŻ›×Śfr2ʤjhĆ~~”ŽtxœÄÜä”'0.ņł¦C«~?ø €;ÜĀ&pX²³—¶Q6OYŪI™1Ü@7A¾)l¾īąÄŚ‹·ē%ź[€r'Ż„†7Ģ©ŌLRF|ūū<źKAö¹ä+"›IķźĄxŽŁ,]‰p•X̌C³š4Ÿ‰¢Ģ9·¾c„՛¼„PhČ}Ļąg‘¹Üź:Žb’ [}y3Ö.ßGėżC –·~Ÿ0õPy¤ØśūÆL“ą®<6Mć4—ÓM4mžq®uĮ-‘DnY€ĢŚĆߌßśRŌBŻĘŪ“§C7’ˆ;%™‡ŽdAž)š.ĘĒ{m@ł¦{ŽtĘõ,P͐eö4ƒē>+%Z)I˜b§Ÿ=k*Å~Ņ߄DR§é4Ą¬®ĄĀÕy$uØÓĒ6&L×‡¦Wƒśe×ó-f Wƒåč„;'¬U*«QJ–lT*·uBåQvʖÉĘŗT:]õ1ĪĒ“@ih‡løRœ33cbˆ†÷wš]ŸŃØ@ż®¢?OSˆ{!aRĖ"G‡°źj†ī®|ĪUhH˜ŗ¼#„C„x2比'ė āN-@'łŠS”WܐłGńJ’Ż}Ī^Įż^/,$Ā™v3.KżÆ*.ĮÕG‚>”Ÿ*QĒ ;įŅŗZĪ“äy—dazrģŃĀąĀ’Źŗ„ęƒk9Æ?‰œ“³=®Žx¦ēŃBSŪ?'e’“%ŠĶį—s%?t¦3÷eŲ.9/ŽZeŗ½ś™ ļp<–6Ū»3JlŔВFt]ćBm;ū‚·tā”{ĀķŪbnń `f)"¶įŃÖš+Uņ®{6Ōqz4k¬9¬ALĄ4 #dI“Q&3ĻžŖŽłv!kāåŽÜG9Z;‘§o¦ŁcśH°³ĖĆŻ=ĢvŪ_čźaé5é@ūwy±¢ć/Æ}=÷æ BhbpśšŪėTÜž£ŹvoÖ(„vźX Y, öN¾é³”pĶēź”«7©)-†?s8ձ–Ż+dBŠhVĪ!ŻPae“#ÖF~In.bwŁŖ:ˆ¶ˆF v`NŚžu6•mbk’‘xGÄÅ2ссHžuP°2JÜ'xć*6įtåU0ēØSĖ 4ļą-,Ą 0ųyæŹ‚cėå7CœiÜaīpš‚üGy³ęńõģ|‚Ģ wLˆ€ŽOĢā­ŗ yōHGEz3)ąĪB™Z„hČÄk£($$qså ŠČ@ŻšūAž›4Ź4ƽ%œ-™Ą`„ .*ŽŅFSœµ¤™ö”R §<5—!G±}W{wœ uPł×3™?ŠŽ{üIĆN _/vĖgRé»Ń¹Fu’óyE/®Ā½j^i2¢ćLČ98Häł"Ž’M94Šb-ž»'Śķį—ZKgFUqF§Ė`Ś0³“$ Ä®MY#id²5J„ Ūøć£vu%̾#‚incUā¢UC”xŠÓýLŠBķÖ§},±Ćh’hƒ¤ ¼~1Ōu½"NfiM +jü‡6™æ:;(Ū”%ćŒė=tžĶ¹õ~¦ÅmLĄMĄ>¤×~ˆRęT;o(‰€6Ėdbøķėš|ŽxR.ęāšn‰÷ż u ‘žoÜ3Ą²pmųŗTØ 7ņJ|f²@̽oWSV&M†¦šĶRøœžœó¬Ć8ż6źg·FY>Ō{vÄlYīr7ī†ļ¶ß‰)h+SŌRØO-“XɕqČéÕ@õd8€Ióu(īų)ŒF•–ćüXdjĻ`. q½„ö€ļL¤é­o‘C?>o1®\ų:HÅqI„«Š®rķm•É£<˚= ĄŅƁ6\^ĢŌāšī‚tĮ_äɂļ ǃOŅØ?¹­Ł¢Ö4Č4Nø|† ėŌL`˜;ó–p効(žf3¾ē¬F»WĪżµū›eļ‘€ “śq¦.]漗·rķ¹ \0«ń§f >ųÖīŗ¦¦Žāwęø“yPPµĄ ŽÉČŹ\±Ėķ[`źTrĀĻV’ŸĮź³{Ėń¹Ł·£C ĀŲń*Žīž°k“eƒ?ńMżūŗ‘åXA§ž’*)¼”Y‚Młńõ A+Š©wæX×Y.ķ^fÉżĻ—v.”.ÆīD—ķX«VLÜ«„cP–äTA— ꃞƒ”×HUĄ1ŽĆßm/°Gē`·²dęē:u£¹–Ö;6i6†C*-Ö„ń¢"ünĮŸ!ä,ɎÓ}ż‰6üż®)JHĻ?ڰ“™¢D%g}Y+;¾/²-šh©«Ž‚Ė>Rģ‹2'uĀf’»I‰Üi+ßļś}ĒzŗwŒńq+ŃčÆūBB2œ…ą«_>Ÿę³µ ł«y1bšŃ½Ćheį씃%śmĖ€¤Ņ  †Cβڊć|žFDb™©@Ī®Ō]É%ĖŃEKų.$‡&= ¬\Ąsœ®“WGbf®™g ÷x!šk· Õü[oØh.lƒ–Č÷ŗ-{FŪ0rvM·eY6ˆƒ.Q ż8)å6ķ“H×¶öÓqG>C s]J“l‚c<¾ŸS§žV±ß5ŃeŲ9»<ūĀ÷”™ŁŖį‘`ĢKHīńüۻʟ“a¼©ųd¤Ō"9ivB%+÷ß ‘œ®eē`Żēdöuiz·„źŸ£|D^ō]šwÆĪBsŲb šv ÜcGŅö'śc©Ą¬ö+j;>†č¬bĶŗŠ[×ײ=Ā®ļū栟00ˆķAž·/n!”žd{Å::Ć·…zuöš‚q<ōÆ"N Wķ+"ÉżwØʔ…вō§Ćœ=Ū0jp)Æiœ£·¹€’čāK±^œY¢²ßÖ#L4øŽv»S›u±ž¬‡Feś1æ(Ž9³źkąŸęg—²’o@Ē‹{ĶƓ¶ĶŠ0|²xm’æDžRśÕf8ĀsåĪø_Ź©Žedc\9=¬?½ ¢ęŠ¢¾g+R1œJY™ßxķé²ĄBį±Ādõ™/‚0n`s/”:`—~æĶø(Żä»v`ŻQõE8åŖÄī,č{‚{oWuvŲ’Ģū™ķŽv¼įfƕŠl”ny)žČŠn½1Š76MŸIĀž½Š%¾ž£ŚAŅXf(Żļ²o™$į<9kę`·3ö.Ÿ­šrøĻóĢ·>žqm †'_¶kÆ„E 6ć>ž góšt’>ļ™.&dTžøˆvX“Ćä%>¬Ćb¼ŽTŌ€S×P^ŸˆAQōĄe];żéõA„MJ–ŖQ¤?Įiį2MQŒ4‡ų­ī™£ō×ĪŌń­™|ż*# `]˜^k£5[“gÅ †˜f’ -Łrōˆ<čdÆ;¹Di3ƒ‡OÖ,šĖÉq”$t–]¾‡“ūłałģ.ŗhäcx=lĄ'ņŽQé=ž!UģXŊśÄ]×čø±p­•K ź–œĻʇ¶¹€P9ŗŃ=ēn¹źp²-ŠT”Eseł1ć*]öé4Q%HßVoę “V¦Į£“¶„­*6c^Åˁ!q[Qb°cŻņź«r<ö"‰PżhƇFīģ­4‰é‘ĢD4gwsHhī=h|«µøq”Š#QŪäXŃgpĮ T”ś¬Ē̽.ܱ&Ó3p…ū“AX%4E@G é"ö%ü*ėŌ$¢ˆøøo ²Sj„Ķ„Ž‘v¾­ŒX–żoB¼Ś³<ä'_·;6ś–÷(³L‚#}¾Ķ._©Lg"¢I½—do_HkS J– qĮļę¼īį"GšĆ¤Į.ü¼ėņÉiéFSĀ1WdŽNšī}WČÓģ4ą õuj’øRćQQ;Hžķō’„ęļä–ŲŽĒG«ą””RV v¢ī’ƒŠ[)ü)dsšfm²:XŽL~q~*8¬)M |nZZźB¹#HöŌŚ;®˜ł™öQ)†²‹q.ā^Śfä+żĪĶźY‚ÌśaąY/gp,ł—f+¹ĢTŁl!’ņ‡\Q¬ģ73ķś VUaßx§=’ģÉRzćõõ(w© ą^āū‹’)!Ϯҫ (s£”ÉćĒĒį'Š4yåĘeś4Ɣ蟾ĆK½•‚$öN[ٚ;įŖd³OŲóć4 1};v !¢×€ L˜t«ŹĘTJz3,z β **оw8õ 1FŒ÷ 'µäćj%øöfüĮ ējZ±Ż³xӏ®-tØ×ā¶~"ńnƒĶ—\$x Ūī¾}nŽmģč[Ź0NÉČž«GŸ.µ°qm’ ģ!ĻP³BčU€WŖGÉ×ņKzS=šģމŖų˜¤ĻÕ£“uFUķęyEč5AĪ CXņSĄ°Šł(oæüxBįfņ«Ņņ¾Ī6ČÉ#įIOĪø>K–2-»ŁŽ·Yż’Ø,pF0ĖĶŅgvĄĆ/˜­ÖWó÷‰æźÕÕžņup2…ŅĶ«č£S°»ÅŚŽ!UXń˲š}¾0Hh¢0œ½Šž„Ź2åśżĻķ—āŖ4SåEæč`żƒ9†į$šżL„ły™Ć,^(”Õ ’ŕq³~Ä BĘ$®ų.lx+φЉ2¬’ˉ Ā6c{š.!(=w˜Æz\T”lRŁA®C$2Sųš€ā܏ cb²či¶ õ‚lŅF³d…ĮyJƒóV¹švąt —–Įį-Z0ņĖS““ėIMR0žSĆN£ŗū4NŖQjÖÅv“jÖ:˜±Žū³żŒ¬døü5gā᳊ĻS«‘78Ќ=“XD·j&5§Ū€rȬ³j£ÖJ÷ŻāA%97k¢lÓ¹øłÄ<ĄxŹ "u“·NvxœŒÉÖRĶR€ŅųDLA>½įÜwµ^I=>t‚]Ü€Čw†EĄR2¾éjÉÕ¼ēv7@3Ō|i$‰Ø J‰i`łB>B‡!6ß§ļķÅJĪøÆ¶čźśŠøłŌ²<{D“³ģK ŌMŲņwĆoŅĒ&„MIžÖA׳]ż4aŗBKāœ[LOÕüEČBfdLrę =§EAC˜ĄK½%™²c9v²Mćļą a.†¦Ć}‹Å+°åŚŠ÷ųŠZŲ\ĘóÆ3•ĻdY:­óćØšG^ =ąühĒ“AÆiśYŠ}ą‚zńāYŸŅj·¤ćw 'ļ Ø •›bÆ×q'ā}Nßqßd»|%łõŒ%Ä­bųJ»`_“gš£ĮŃ%ģ3w³­L[ķźN0NīuB~`g7šŠØų®n <¬kģ ģjAĮöĻÉéöKĒö¾śRTb y6~Ā ĪĀ»¢ęąC "_!+Z^KZŻŠ²]Ü(­¶†gW*°œI›ĖP>VqX.Åm>'<^÷ԃQ.8×øåS3M²8#Ńńā™|QS‰åņyĻY4‰€5Īń”½ā– g\Źg č²äæ›Žéoēū©Ā–€_Ո]ˆ##ÆįhÆy€¼ŅķsŖ“Žņī£ĶĢŚ/‡Q ·ß†JõōŃ4ĒÄNgÅ0rp=æūĀ:Ē&Öćę ēXhĮ ŽŠžZa'wāsĖgFZĖtRßÓ:%.=O`ĒŖß{|ČQ\–8āʛ­S‹ī_µü•¹Šź­$ä3W~䯞†¢[7*wYN VøżµČM;§y«×JŲņąÄORŹnhPa«­ åj]~Ņ·ßTŚ&­TÜŽßĖR”PįŹæ™SōĘŗ/€‡>fØ?E4UW^?² óÉ* Į:äīxE•=X–V$„ŻvĪ“„o&›b3ÕŁ‚šĀkŗӐō¶Ņœe…z‘>ry·’³I³T»]¤X™#%ģkč)Ä+>ēŸ]]dŗlԘ NŁė’Ī9Œ·@kµg[Ģhɩ؞ī fjÆŹW] -*#‚¤WŲĢ^Ylé{ŠY.dĻ}yJé£C"£q:ąG3½’–™óAčj—w04åă\#>OŽ>ŲŪ\,ÕTݦ¼…xFtd2VyąÆCBL@&‰iĮ.·yXA8}ū`°*EÆ ÷…Œ·eÄ,ėržH?āĚŽ lSÖTŃĶN“µe4S#ü&AŽA÷C’^ˆ¤§W”‹sŠØ$”CÄcF9j’.Õ}©œ3Pył3j`d(};”{¢{*ģĮ…™­:ĮRŲ°œY…a‹Ģ9’Jbī’thļīāyū’ +,½QåU€ÉTp·2¢2£ 5­īc»ā©ĻՁ֭aé0øZ…h¶ üć™Ņę}„FB¼™gG*fF†ĄF egMsićŠ6Vą'ź;±_ŖŲ$.’­U»&iQ¤Ł‚//3ų=7ĢŒčŲ&ą:ę:˜ŹFŃOäæÓžå*f„IńmŸvĀŃćżg81j.›ĆNd'·oęƒ6“v’eA?Ä%ó?§Hõß`¦"õxugBßtÅ`/n52Ņę2 %b#Ež%aījņuš.! jb˜Ą R¼{œQüį÷Y,”žźŠš¬&ґ‡QŅL@„ >#ė«×ļ(™n0QāßwÕņ¬go]ÓS¢Šڬr¹Ø;ĢįÓ§ÜDT§īhåN1:¾[å3³ LįĶ,±ńAČøžVNޱ`,ŖKų¼łrM9Rī P©<żģż]§ v°§åD¾GTūųbŠq/³—r*żšØGįæŹšäÆÓäLģ@qV]SŪ¦ĄóvöEęńWeēƒ„Æžg‰”ʃ¤ō³6Žݳѷ„É|ģl¦6<[7„Łż= |l=½kh,ęūšŚĶa`Į(ŌŖVskK²¦HŚaòbˆā {€Ł+|P/_¤½Ų3ģ ąō`]vöĪØŻšx&<ō.įĘX’7ĘRgF²ų’ōO6Łą3rŠ£Š/!ÅLjÕ0vŒ£¢+Ø}SšāĢqU€¹2£t"œŚ„ŸY­ę}”]öį·\Įœ+*dÜ["Żu µ[ČÆB|ØŒ‡ źōLN£e(S…ä4AŸtF”Ü‹Fi°z(»pó’ -QłE›į)m²ßNć% "?rMŖ9(4 ×Ti$©7³z}»sŒ’ń8©‚×/ŌēŹLż·Ł:Ā+$»ZšŽČź]° J‘j†ĖWԁ„ŲŹĢ^3Œ žY1ğ•`Ū$„ , \¬Ń’ėÆźųöģŻrŖė§\'Z¦5 ŹČc¬2B@^įZź8ŠMČ}HŹÜūh?köębžnw“6ŠjųŌ£%3|iU(y"Y'k/pM·¾¤ÅąāBļ֓;ŻSz`‹ļWłŌŗjƱf¶Ó/Ź\»frLOWM:fõT„zz$½„]Śy}ęiģlž.ÉĀǚąŲø>6ź~5"}ŒOč×]”–··ŹõZ†O£„Ė+·° !1÷2!{o‹«F“²F\p€{ėĢi¢qpÄßō4”ųžrb¤ØŁC«F5 ŅČßtĢf\f8D]ūƒŲæ䖽7kš„Ši;ü’<}ń‘&ŁSė§§†…;§8MŲńŪ±Óo.Zéף®Æ™¾$˜e"ęĆ ¦™%|½Ī×P®lĄ—FB’wҼłq‰/T޲÷ĮPłćŸpGąéĮŃ9*0źdĮžž„–ƒīRŽĒ·‚Gpņ%ō+äž?ęB°\HÓ-IŲfC—&i£·uĶa6ź[”{\o m„-œ‡A²ī^ [ūzżwŚyĒv=®®Q“P§äÕµÅ!%W(żČĀøČmŁßŸ[łB‚]ɬ[ ¹7ÄÄĮʁŖ–$`Æ&pA3 ¢ ’Ė„Ś=²\ lc“/’|ļR‡udū%ŗžĄ ņÅXŠE‡Ck‘0–…G9syģŹČ^ĪщCÓCtl’6ė„„9D,ū«'Ä Ō*…”;ŻŻ¬i†sŽ<“Ü<–£ הąæDm1ože8ö¤Ö֑Q$<Ė«zŠ‘ŃŌU€o¶Į% °¼*Ļ=SŻOM²ż¦å½Ż±§”ƒĘĢ›¬‹ģpLÄŸē™·Rl)ĄÆÆ†ģ;Uņiä­d•aČ×s>Q°x!zó@˜•;JČQQޔ؋m£÷aē1޽œTŠF’5¹ø 'Į»ē"Č<ܶy9œAēĆė·ÜŖ{s ' Ÿ”b |ÓÜ3\wqĶńµ‚µxüų‘–dĖŽj®ÖįN FÄ1Œ¾\Ł6ŽĻŁ—Ę×c袊 A¢Ē”įśĒSĮTƒFŁ~øFŌų7Į"½ Ód60ø'ŒT¬"i/UčŃźźół~ƒ`'֞ZŸēHElš=Š˜šYN&ėÄ ŽX5’ īܞÓ0Ķ]×åos>–«5߁62×ī2*Ūź ÷Ÿžx]ē¬YņŹ{3·dÓ i{&LīĄ8ŃE°XYiuÄģuu BÆå>7lĶĻ †yS7oHÕ­Šś0Oѵ±ĻĻGjSŠ[Ķ[ö¹{.vVƒ\rXü6°B²ņņvB•÷)^šŽ[Õ)kßČ>™¦ŗd³<Ā–ųpQDŪ3]õ'wėœżģ“ņō²ėfĖ-†m2ÓĀU‹·%j{[£õ¢e€‘;VNū…ÖµA9ÓÖšJ6«üGŌ'šĒōDćJ“—JfAnČż©{’ųB`ĮŪ#“¹ŁŃNLń „SÅ&¶ ‡ŗb“JÕæé %./„Žcķ{ `Óe–zÖ5’ŸˆoŁģŽ%=/WœŪ’¦ \Lé/ŌL$¬{œ”?‡f¶k{’|8ŽfWnŁyŖ_YfØ j؜Ö™×Ė–Ŗ¹|5qź`×ĖpŹjōø ¢.ų«ĘÜÆQ6jŹ8śžŌØDŠ”&ēł>„ć’& ’•66p÷žĖżžĪ I£µ0®†`HØ Ģ‹H”K§Kó#ĘĀ"u‹×īN”Ų‘Īõvp”%Óø½Šż7¢. õō ö;æ^[÷ōsvW·,¬`@Eœ³ŁcĪšł—įŌŠÖėŽ$`"¹“A!1g»ĘÄģļŅ>špįŹYZ½ś½„Kujаbn|nL箆cłC¾©_‚Č;e6½Ó_(¶OJ=<¹ŗ Jkś’‰gĻz¶Ó:õØéöQ²0 aÕ÷Bå)ł“õf&(Į|ß[¬Ś’`Œ„›¦šŌAĻDór…Œ'jéż#ņŸƒ·č$ Ņg®ģ›ńó`tč½™ĘīYé$·»Éę ę’8LFfUf!Å“NB Į(N’’SWfcīUx‹MY"/No€F]·ŖU³€7ā¼ŗ…[eŻJ—IćŚģ¾Wą‚ż¦l9§Ŗį«¹ŒI6Žuī3 ›£\³õ®qqÅ .†+ĀĮĮæŅ±EƲ6˜‚ŸłO…&uŽŗ§ī``‡"„—<ÆĖh%ØÕŻBiE%ė99]ś"Qė9j śµĄ†- Š®†ź]>]˜˜Žė”±ļaŠÆÖ¹ō«ČƒI__?ŌĄń™S9ģNŃÖ;Č„ŒŹjžā:\Čŗ÷¤I<°RS¬ŠµÄ™HÜ53Ё«#ĢÜ(fs3mgŌRćƒ]FóZh :”¾ß̳:ŸĆ9­÷NÉveń:ĶAU_Ņ„¬±;/Ļęhœµä‚r9³ÆF°ČØ ē¢iDZĢģĻēX…[0&qŌE5@ćæ]ēāœcµ§?¹ą0t[cT䦬W Ÿ:+1k!”Ā“3Ńō`ϐõ‹c lŲ@Ö­”īėĀ“ „F‘#øbSßōZæälÉkY —?‰Ž4žūņ؟C­S"$ZJ‡‰dÄsļΦ ʶrA”€¶ćųAÓæ7šø§¶ ‘×KUĀą\#ĘWœw5¾ŪļĘ ĖĄ°0¾#23cp|mŚP’!¼÷@pąwćĒonį¹Ēć»"E5ćEAĻos‘åōį W97o‚™žÕŗŁÆgKžZ‰iu«)uĪŁ„؝č>°õņøfZóy·lö ¤¾»(ŚŲ å-XéĖÆ9š‚Ś™ūä ‹WégD™ųĶm¢ēÜapˆōЁڼZ .Nż³) ą§vźĻ\æĒĮb˜āo7™0_"Ćæ}ŠĪ(Q± R„ØĢ²Ą»īµØK#÷Ģ„W·Ŗ7®s£äƒM“üQPÕn½Æė{³ø±l‚J‡°äé‡HG$²¢V9ĶŃ{c*®r½ĪĆąōķ÷ąŃbc<)Ē—rČq¹qäøeBh¶_šWÖŹ+śķś’ľō³ĻI.Ī9rK~.dEŁĪHIŽ ļ' ę‚Ņ_Hi›ÆĢņKöÕzÅHO:ķ­ō+Ń~Ćgü;·/.­tęˆ9¼}Åžo°¬Łf0żćuū><÷R@å²uł‹`²T1^uzĘ{uϧ'1ČĻ™¶¦®¦µ ˜Žō«X,Ҧ²Ńe…JźŃco—I33ĄÉ.rœŽvG‹”d\23‰u¬½É¹ēŲ©sŒ|²‹[ĻuHčy:ÆÅ^KŁ+ü”‹˜ŖY‚Ń—q›!`|ÓL”¢šKÜ4½‘š!{\€ZZN¢ł&3y8RĄn÷_Ę ćłį.y?¤ĖŌ£ņŽõnś Ś! \DŒżvNY`xpŠ’w+æeˆ9,ߏ ·Ež¦Ķś%iŖż%dE ·ž4„ńR„“ׇóĢßz‚²z’`Ą“ŖH ]L’žpBó0MbŲqŒJ0YÖ ,“š ø¹Š9opBcƒŖ|¢S“Qę·{¬[ 7ÖŁĆkčM1ŗ„R6Ų"_Vdwń'L°ń[[ā{TŖŚ“ēģju1ØŖĀ²Ææ9ŠYėXåXB©'ŲĘb9Yg÷šZX>bV“1ŽĒҬ’F ©$ń„;ĢSn…:żŠ}¹­T aBUśk÷vL"{Ѱ‡m„ņ 2(`Chk»z”‘A&ĘTVVø‡ł$<¶ ;·œÕœ²KÓŃ~53Ÿ|+ģ2iĢūĖ®‹>2°łg$°‡°>b5ÄŁ”ŪD#]?Żā*K­ūƒÕ>a„šéBŒį–™Øł`9­šŚIa3 –ŪDk“¾2ÉīfŹ Ü”2Ćū­^:M÷D\MQdÜ-Ī‹ķE5N­‡©UeŒjQ|āŐ­˜‚ęķ¤HØ2ĆÖsœĮVƒw$GۜšæŲ"‹S^óSęįÅ&_^޹õw}–E³ĻŸĀ±č{ŸzEĢ'Y\p„T›`›…Š€;Ā`Ć<Į6,3Ā«)ĒöF­Ū*„el^G“‰½õܰÅīäÅŹt‘FĪG' „‘9;ętoƒX„™Gč%^B¶ŽdÕ@P׳d¬|‘y~¶"÷ Æs7^×½łöČžŠpłV~ӍķŽÕyšlņ«õūŃ€ÓĄÆ:ØOę9ķ˜ ”VĀsB ;n÷’NōŸGbō6=ĆčW®žLĮ5-Bä%ƒrķi×ųŅ5 ŠJ`ļSĀpZ°°‘ń©B ē^ŽŌUĖė8×°Į«üÅŃ$…ŠėŗY$¶Xš×F¬~ČvJ RHČ£į“.4ğ£¦cÄä½źŚ`bČéāTŠ~5׊<“īʛ€}@†g»‰ńżLĆž…;GŠQ1ó$pšB4‚V¬¼U6øžćN%rL¦ļ +³<”n0jŽp¬\ch;R£!HÆ÷l^RH7®‡VÓŚébŲž‡£oŒóG(öPŸqu;a#1¬©[s‹dšø+WJ0Ą5œ „åX@Ÿow:ńI=ļ4rŲCßeŅŃCŠ’ķĻx;"¢ōśMcŗĖĄRÅUČ2 ¤Zw?<ļ¶·ŪU¼ø\I¬®ćįŌ=.ŅRėNę^4uwެ”Øüfšü—h]¦½īō‘š½;>Š‹<' c—óM3‚’«,Ī{-kHćżæ5e D„>-°ņ ćłĮŗ‹K„†d2[G•z)6·ä¤éĆ®CŖ‰Ś„?Ą c{ęæq'‰ćģztžŹŽzxŒż2™uŌŁ ę}xÜLŪ­ę†Ói¦ņ¶#쁔ƾO”Qį‰cB:Å4eHķęöČĶ\«½@’ŚĢę`>sæŒJSž¾?DŠPŒk ĻńÜ%lwV5;WģĪց߿ē×2UQJ…IFD€ 'ĢŅķ°™•·ĮĻŃIŻšL1±Zö¢Ŗ‹śŖƒ«½䮍•ÅśÄŹR?ÉP̆÷’“¼“§sĮpsDõVtµe\Āõ:\|§ń©ŁÄV$k¬/·üri%²v$ŪĪ4y‹Ė⿌ß쬧_†‚”q޶i)H2ī‚˜(Ł«{ę·ʜ®}bVyóL ÉH-ēZrõĮīCĶq’+«ÜN±IL#.ČRd|ĢøGéų^"^ŽŒęZżc]!WįZŚĒū¼9žĪ’GM ‰ĻäµrA6üŲN~ŹhÅc(KęŹŲ[?N'NdUĮQóŪŪ$žĀ’zaT²”2Æ£“wŻ"ó--ŅFBŅż."kPū÷Œ¶VW%4’ńD€Oą&ą…ą/^c·‹ĀxŽś¬dĘõC g…€G€ŅA‹ź>ؼ|×Ōó ÷ޘ8œRßYļ=%åīĘk.ź*N®…¬ [ŒŲ÷ÓIŪf—čV<ļ­÷/ÅlųɊ€^7Š”\gCazģU&Ž8³qųœ· ƒB”ź+'ö^R{.ÉA£›+å`qŖy œu¤zį«8tj¼<²7&QHŽ|S·jC¦ü–ŒpА³Õl젊Ą9B_µo‚$B—ąœņ„ģnWdė"Łś‡yżēŸ!;“…“0sX%öļ(ŚįFmd]fąµ±õÆz­“lĄ¼Y;ćᗐަUł–i–ą¦É͇ Žž“ļd›ņĢ'į>@Č>ķuK0Ŗpgįez]l˜¦ŒŽx-r„ė'…Ō֒ö‚Ó¾Åf·-Ӛ\™=ƤɦĄ \ņ3%uĶžw €`ĪéļpČB©ŒEZQÖZ’+aŅóV,:÷„’‰8sė ‰›īŽ?1&ĆĀe—½-Ė ÆĖōliQyÄ©Ö eÅ ‰\Žäid›øBOƒĆŖa:XSX,Ą…®×szš#OV6»aĀM“dŠ„Óœć‘˜f3cŹßh«ćė©-˜y(eÉż" ĶQ9„•3äxÉą}0³įO2*ŽNćeE ņĮ#fC7L=ŻūD»°¢1··–1&2RKBešų ĪĆ/zĶSūØU…NE yhUæˆH¬¼ ›õčq·ļB,aO|Óī@g^Ē®“oŽÜf%GĒÉ÷K`]——ČƒšCž+ ²x ftߒTj÷'ŃōŖŁØ~Ÿónžä>OwĄ^Ży©F Ļ4m\ń/Ŗżˆ³ŲG:–· z6Ę3ߒ,»ńĢŠ>Ķ”æ}{yœ•2Æ­I†–8~ĪŚ‰“L8MŚh•qH«Æ;NŽSę7•®§’³ła¶r4ž2œ ‚©p%˜ź`ŠßĢ$-,>āMō…Ū|"Ļī/p•óiėN ęI‚uüķ9Ģ7ĀzŠ•h*¢€ā8i…©gåŌ«³Ü¤Ū}źӊd-”åaw½&_÷ĄP&ģZÉJв^¶WįĮ•äAžj™…Vż}éh²!J–šŠ’:[(&™t*»ž:?Ė’žmĀĢ-‡h4ÕŖ0£: åZn)¦æ#õnŹÓda3µÅĒ%łZ£A€­I£¾īHn€„¼²Ū éųćøīS·¦e×>ĢŽ o¾ē<»sė¼£vہM5šžnw(Q8ÉS¶Œ]ź4׏żk"ūyĄŌeŃU!«‚ž{æf‹LoGūi'äb pwģjK ye˜z}Õ)lŻÖåƒgÖ~ ŠčņH“ČU É«2ū¹ž¦gŒy‘oć¬TÕP9įüRzöڲ؃-*e,tųŁ5±P&`+/s|XģĶ&zĮwC NŗzŚFÄ8±¦Į™9Ņ’9k”³—'@+?Ri½0…’eŗņĖVä)¶J×lŹHė@üč5?G„PWźxiŌ­ĘźO1XuJ®pņÆ Ōqtž’<¾a`%Ū!‡ŠˆāŖ*³ę.ÖŲ[²|g‘’"°sĀkżaYtDPt;ƒ6xĪŅz`ćyŚ»3ĖžĆ’Ļ™ĄR¶ń<ū“%vĀ'‚Äāā+Ū~æ’*¼ÆSQ—:é‡@߂:{Øōüi]Z‹(•솶“Ņ3#P`f*n‚””޳Zŗ&¼Žre?ŸX”–z‘ŗåNƒńµ/Ö@€4t֟ėœYõė“ńŌˆ&OL±ÄgūYZ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/tests/helpers.py0000664000175000017500000001004414627412314016570 0ustar00brycebryce#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # pylint: disable=invalid-name import os import sys from functools import lru_cache from unittest.mock import Mock from launchpadlib.credentials import Credentials sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.ppa import Ppa from ppa.constants import ARCHES_PPA_DEFAULT from ppa.ppa_group import PpaAlreadyExists class SeriesMock: def __init__(self, name): self.name = name class PublicationMock: def __init__(self, name, version, status, series): self.source_package_name = name self.source_package_version = version self.status = status self.distro_series = SeriesMock(series) class ProcessorMock: """A stand-in for a Launchpad Processor object.""" def __init__(self, name): self.name = name class ArchiveMock: """A stand-in for a Launchpad Archive object.""" def __init__(self, name, description, owner): self.displayname = name self.description = description self.owner = owner self.private = False self.processors = [ProcessorMock(proc_name) for proc_name in ARCHES_PPA_DEFAULT] self.publish = True self.published_sources = [] def setProcessors(self, processors): self.processors = [ProcessorMock(proc.split('/')[-1]) for proc in processors] def getPublishedSources(self, created_since_date=None, status=None, source_name=None): return self.published_sources def lp_save(self): return True class PersonMock: """A stand-in for a Launchpad Person object.""" def __init__(self, name): self.name = name self._ppas = [] def createPPA(self, name, description, displayname, private=None): for ppa in self._ppas: if ppa.name == name: raise PpaAlreadyExists(name) ppa = Ppa(name, self.name, description) Ppa.archive = ArchiveMock(ppa.name, ppa.description, self) if isinstance(private, bool): Ppa.archive.private = private self._ppas.append(ppa) return True def getPPAByName(self, name): for ppa in self._ppas: if ppa.name == name: return ppa.archive return None def lp_save(self): return True @property def ppas(self): return self._ppas class LaunchpadMock: """A stand-in for Launchpad.""" def __init__(self): self.people = {'me': PersonMock('me')} def add_person(self, name): print(f"Adding person {name}") self.people[name] = PersonMock(name) @property def me(self): return self.people['me'] class LpServiceMock: """A stand-in for the Lp service object.""" ROOT_URL = 'https://mocklaunchpad.net/' API_ROOT_URL = 'https://api.mocklaunchpad.net/devel/' BUGS_ROOT_URL = 'https://bugs.mocklaunchpad.net/' CODE_ROOT_URL = 'https://code.mocklaunchpad.net/' def __init__(self, credentials=None): self.launchpad = LaunchpadMock() self._credentials = credentials @property @lru_cache def credentials(self): return Mock(Credentials) @property def me(self): return self.launchpad.people['me'] @property def people(self): return self.launchpad.people def get_bug(self, bug_id): class BugMock: @property def title(self): return "Mock bug report" @property def description(self): return "Description line 1\n\ndescription line 2" return BugMock() class RequestResponseMock: """A stand-in for a request result.""" def __init__(self, text): self._text = text.encode('utf-8') def read(self): """Simply returns the exact text provided in initializer.""" return self._text ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/test_binary_package.py0000664000175000017500000001116514410675017021132 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2023 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. '''Tests BinaryPackage as an interface to an Apt binary package record.''' import os import sys import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.binary_package import BinaryPackage @pytest.mark.parametrize('pkg_dict, expected_repr, expected_str', [ ({'package': 'a', 'architecture': 'b', 'version': '1'}, "BinaryPackage(pkg_dict={'package': 'a', 'architecture': 'b', 'version': '1'})", 'a (1) [b]'), ]) def test_object(pkg_dict, expected_repr, expected_str): """Checks that BinaryPackage objects can be instantiated.""" obj = BinaryPackage(pkg_dict) assert obj assert repr(obj) == expected_repr assert str(obj) == expected_str @pytest.mark.parametrize('pkg_dict, expected_exception', [ ({}, ValueError), ({'package': 'x'}, ValueError), ({'architecture': 'x'}, ValueError), ({'version': 'x'}, ValueError), ({'package': None, 'architecture': None, 'version': None}, ValueError), ({'package': None, 'architecture': 'x', 'version': 'x'}, ValueError), ({'package': 'x', 'architecture': None, 'version': 'x'}, ValueError), ({'package': 'x', 'architecture': 'x', 'version': None}, ValueError), ]) def test_object_error(pkg_dict, expected_exception): """Checks that BinaryPackage objects can be instantiated.""" with pytest.raises(expected_exception): obj = BinaryPackage(pkg_dict) assert obj @pytest.mark.parametrize('pkg_dict, expected_binary_package_name', [ ({'package': 'a', 'architecture': 'b', 'version': '1'}, 'a'), ]) def test_name(pkg_dict, expected_binary_package_name): """Checks the package name is obtained from pkg_dict.""" binary_package = BinaryPackage(pkg_dict) assert binary_package.name == expected_binary_package_name @pytest.mark.parametrize('pkg_info, expected_deps', [ ({'package': 'x', 'architecture': 'x', 'version': 'x', 'depends': 'a'}, {'a': ''}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'depends': 'a, b, c'}, {'a': '', 'b': '', 'c': ''}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'depends': 'a | b | c'}, {('a', 'b', 'c'): {'a': '', 'b': '', 'c': ''}}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'depends': 'a (= 1) | b (> 2) | c (<= 3)'}, {('a', 'b', 'c'): {'a': '(= 1)', 'b': '(> 2)', 'c': '(<= 3)'}}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'depends': 'a (>= 1.0)'}, {'a': '(>= 1.0)'}), ({'package': 'zlib1g-dev', 'architecture': 'amd64', 'version': '1:1.2.13.dfsg-1ubuntu4', 'depends': 'zlib1g (= 1:1.2.13.dfsg-1ubuntu4), libc6-dev | libc-dev'}, {('libc6-dev', 'libc-dev'): {'libc-dev': '', 'libc6-dev': ''}, 'zlib1g': '(= 1:1.2.13.dfsg-1ubuntu4)'}), ]) def test_installation_dependencies(pkg_info, expected_deps): """Checks that BinaryPackage objects parse their Dependencies field.""" binary_package = BinaryPackage(pkg_info) assert binary_package.installation_dependencies == expected_deps @pytest.mark.parametrize('pkg_info, expected_recommends', [ ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a'}, {'a': ''}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a'}, {'a': ''}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a, b, c'}, {'a': '', 'b': '', 'c': ''}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a | b | c'}, {('a', 'b', 'c'): {'a': '', 'b': '', 'c': ''}}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a (= 1) | b (> 2) | c (<= 3)'}, {('a', 'b', 'c'): {'a': '(= 1)', 'b': '(> 2)', 'c': '(<= 3)'}}), ({'package': 'x', 'architecture': 'x', 'version': 'x', 'recommends': 'a (>= 1.0)'}, {'a': '(>= 1.0)'}), ({'package': 'zlib1g-dev', 'architecture': 'amd64', 'version': '1:1.2.13.dfsg-1ubuntu4', 'recommends': 'zlib1g (= 1:1.2.13.dfsg-1ubuntu4), libc6-dev | libc-dev'}, {('libc6-dev', 'libc-dev'): {'libc-dev': '', 'libc6-dev': ''}, 'zlib1g': '(= 1:1.2.13.dfsg-1ubuntu4)'}), ]) def test_recommended_packages(pkg_info, expected_recommends): """Checks that BinaryPackage objects parse their Recommends field.""" binary_package = BinaryPackage(pkg_info) assert binary_package.recommended_packages == expected_recommends ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1678243338.0 ppa_dev_tools-0.6.0/tests/test_dict.py0000664000175000017500000000752214401773012017112 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2023 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Tests helper routines from the dict module.""" import os import sys import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.dict import unpack_to_dict @pytest.mark.parametrize('text, expected', [ ('a', {'a': ''}), ('a=1', {'a': '1'}), ('a=1:2', {'a': '1:2'}), ('a = 1', {'a': '1'}), ('a:x', {'a': ''}), ('a:x:', {'a': ''}), ('a:x:y', {'a': ''}), ('a:x=1', {'a': '1'}), ('a:x = 1', {'a': '1'}), ('a=x=1', {'a': 'x=1'}), ('a : x=1', {'a': '1'}), ('a,b', {'a': '', 'b': ''}), ('a, b', {'a': '', 'b': ''}), ('a,b=1.2.3,c:x=4', {'a': '', 'b': '1.2.3', 'c': '4'}), ('a, b=1.2.3, c:x=4', {'a': '', 'b': '1.2.3', 'c': '4'}), ('a, b|c', {'a': '', ('b', 'c'): {'b': '', 'c': ''}}), ('a, b=1|c=2', {'a': '', ('b', 'c'): {'b': '1', 'c': '2'}}), ('a, b=1|c:x=2, d=3', {'a': '', ('b', 'c'): {'b': '1', 'c': '2'}, 'd': '3'}), ]) def test_unpack_to_dict(text, expected): """Checks the unpack_to_dict() routine's string unpacking.""" result = unpack_to_dict(text) assert result assert isinstance(result, dict) assert result == expected @pytest.mark.parametrize('text, expected_exception', [ (None, ValueError), ('', ValueError), (',', ValueError), (',z', ValueError), (':', ValueError), (':z', ValueError), ('=', ValueError), ('=z', ValueError), ]) def test_unpack_to_dict_error(text, expected_exception): """Checks the unpack_to_dict() routine's string unpacking.""" with pytest.raises(expected_exception): unpack_to_dict(text) @pytest.mark.parametrize('text, key_cut, sep, expected', [ ('a:x=1', ':', '=', {'a': '1'}), ('a.x=1', '.', '=', {'a': '1'}), ('a+x=1', '+', '=', {'a': '1'}), ('a-x=1', '-', '=', {'a': '1'}), ('a~x=1', '~', '=', {'a': '1'}), ('a_x=1', '_', '=', {'a': '1'}), ('a!x=1', '!', '=', {'a': '1'}), ('a;x=1', ';', '=', {'a': '1'}), ('a/x=1', '/', '=', {'a': '1'}), ('a:x.1', ':', '.', {'a': '1'}), ('a:x+1', ':', '+', {'a': '1'}), ('a:x-1', ':', '-', {'a': '1'}), ('a:x~1', ':', '~', {'a': '1'}), ('a:x_1', ':', '_', {'a': '1'}), ('a:x!1', ':', '!', {'a': '1'}), ('a:x;1', ':', ';', {'a': '1'}), ('a:x/1', ':', '/', {'a': '1'}), # Spaces are allowed as separators ('a 1', ':', ' ', {'a': '1'}), ('a 1, b, c 3', ':', ' ', {'a': '1', 'b': '', 'c': '3'}), ]) def test_unpack_to_dict_parameters(text, sep, key_cut, expected): """Checks the unpack_to_dict() routine's string unpacking.""" result = unpack_to_dict(text, key_sep=sep, key_cut=key_cut) assert result assert isinstance(result, dict) assert result == expected @pytest.mark.parametrize('text, key_cut, sep, expected_exception', [ # Commas are reserved as the item separator ('a:x=1', ',', '=', ValueError), ('a:x=1', ':', ',', ValueError), ('a:x=1', ',', ',', ValueError), # key_cut and sep have to be different ('a:x=1', ':', ':', ValueError), ('a:x=1', '=', '=', ValueError), ('a:x=1', '.', '.', ValueError), ]) def test_unpack_to_dict_parameters_error(text, sep, key_cut, expected_exception): """Checks the unpack_to_dict() error handling, with invalid parameters.""" with pytest.raises(expected_exception): unpack_to_dict(text, key_sep=sep, key_cut=key_cut) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1666823941.0 ppa_dev_tools-0.6.0/tests/test_io.py0000664000175000017500000000157514326333405016604 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Tests for utilities used to read and write data externally.""" import os import sys import urllib sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.io import open_url def test_open_url(tmp_path): """Checks that the open_url() object reads from a valid URL. :param fixture tmp_path: Temp dir. """ f = tmp_path / "open_url.txt" f.write_text("abcde") request = open_url(f"file://{f}") assert request assert isinstance(request, urllib.response.addinfourl) assert request.read().decode() == 'abcde' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1716323271.0 ppa_dev_tools-0.6.0/tests/test_job.py0000664000175000017500000002151714623201707016744 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Job class tests.""" import os import sys import json import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.job import Job, get_running, get_waiting from tests.helpers import RequestResponseMock def test_object(): """Checks that Job objects can be instantiated.""" job = Job(0, '', '', '', '') assert job def test_init(): """Checks the initialization of a Job object.""" job = Job(0, 'a', 'b', 'c', 'd') assert job.number == 0 assert job.submit_time == 'a' assert job.source_package == 'b' assert job.series == 'c' assert job.arch == 'd' def test_repr(): """Checks Job object machine-parsable representation.""" job = Job(0, 'a', 'b', 'c', 'd') assert repr(job) == "Job(source_package='b', series='c', arch='d')" def test_str(): """Checks Job object textual presentation.""" job = Job(0, 'a', 'b', 'c', 'd') assert f"{job}" == 'b c (d)' def test_to_dict(): """Checks Job object structural representation.""" job = Job(0, 'a', 'b', 'c', 'd') expected_keys = [ 'number', 'submit_time', 'source_package_name', 'series', 'arch', 'triggers', 'ppas' ] expected_types = [str, int, list] d = job.to_dict() assert isinstance(d, dict), f"type of d is {type(d)} not dict" # Verify expected keys are present assert sorted(d.keys()) == sorted(expected_keys) # Verify values are within set of expected types for k, v in d.items(): assert type(v) in expected_types, f"'{k}={v}' is unexpected type {type(v)}" # Verify full dict can be written as JSON try: assert json.dumps(d) except UnicodeDecodeError as e: assert False, f"Wrong UTF codec detected: {e}" except json.JSONDecodeError as e: assert False, f"JSON decoding error: {e.msg}, {e.doc}, {e.pos}" def test_triggers(): """Checks Job object's triggers.""" job = Job(0, '', '', '', '', triggers=['a/1', 'b/2']) assert job.triggers == ['a/1', 'b/2'] def test_ppas(): """Checks Job object textual presentation.""" job = Job(0, '', '', '', '', ppas=['ppa:a/b', 'ppa:c/d']) assert job.ppas == ['ppa:a/b', 'ppa:c/d'] @pytest.mark.parametrize('triggers, endswith', [ (['t/1'], '?release=c&arch=d&package=b&trigger=t%2F1'), (['t/2.3'], '?release=c&arch=d&package=b&trigger=t%2F2.3'), (['t/2.3-1'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1'), (['t/2.3-1ubuntu2'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2'), (['t/2.3-1ubuntu2~ppa1'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2~ppa1'), (['t/2.3-1ubuntu2+ppa2'], '?release=c&arch=d&package=b&trigger=t%2F2.3-1ubuntu2%2Bppa2'), (['t/1', 'u/2'], '?release=c&arch=d&package=b&trigger=t%2F1&trigger=u%2F2'), ]) def test_request_url(triggers, endswith): """Checks Job object can create valid URLs for starting the test runs.""" jobinfo = { 'triggers': triggers, 'ppas': ['ppa:a/b', 'ppa:c/d'] } job = Job(0, 'a', 'b', 'c', 'd', jobinfo['triggers'], jobinfo['ppas']) assert job.request_url.startswith("https://autopkgtest.ubuntu.com/request.cgi") assert job.request_url.endswith(endswith) @pytest.mark.parametrize('json_text, params, expected', [ ( # No Jobs returned if nothing is running in autopkgtest '', {'releases': [], 'sources': None}, {'repr': '', 'triggers': [], 'ppas': []} ), ( # No Jobs returned if nothing is running for the specified PPA ( '{"x": {"x-job-id": {"focal": { "x": [' '{"submit-time": "2022-08-19 20:59:01", ' '"triggers": ["x/1.2.3"], ' '"ppas": ["ppa:x/x"]}, ' '1234, ' '"Log Output Here"' '] } } } }' ), {'releases': [], 'ppa': 'ppa:me/myppa', 'sources': None}, {'repr': '', 'triggers': [], 'ppas': []} ), ( # No Jobs returned if nothing running for the PPA matches the specified release ( '{"x": {"x-job-id": {"focal": { "x": [' '{"submit-time": "2022-08-19 20:59:01", ' '"triggers": ["x/1.2.3"], ' '"ppas": ["ppa:me/myppa"]}, ' '1234, ' '"Log Output Here"' '] } } } }' ), {'releases': ['jammy'], 'ppa': 'ppa:me/myppa', 'sources': None}, {'repr': '', 'triggers': [], 'ppas': []} ), ( # No Jobs returned if nothing running for the PPA matches the specified package ( '{"x": {"x-job-id": {"focal": { "arm64": [' '{"submit-time": "2022-08-19 20:59:01", ' '"triggers": ["x/1.2.3"], ' '"ppas": ["ppa:me/myppa"]}, ' '1234, ' '"Log Output Here"' '] } } } }' ), {'releases': None, 'ppa': 'ppa:me/myppa', 'sources': ['mypackage']}, {'repr': '', 'triggers': [], 'ppas': []} ), ( # Correct Job should be returned for matching criteria ( '{"mypackage": {"x-job-id": {"focal": { "arm64": [' '{"submit-time": "2022-08-19 20:59:01", ' '"triggers": ["x/1.2.3"], ' '"ppas": ["ppa:me/myppa"]}, ' '1234, ' '"Log Output Here"' '] } } } }' ), {'releases': ['focal'], 'ppa': 'ppa:me/myppa', 'sources': None}, { 'repr': "Job(source_package='mypackage', series='focal', arch='arm64')", 'triggers': ["x/1.2.3"], 'ppas': ["ppa:me/myppa"] } ), ]) def test_get_running(json_text, params, expected): """Checks result of the get_running() command.""" fake_response = RequestResponseMock(json_text) try: job = next(get_running(fake_response, **params)) assert repr(job) == expected['repr'] assert job.triggers == expected['triggers'] assert job.ppas == expected['ppas'] except StopIteration: assert expected['repr'] == '' assert expected['triggers'] == [] assert expected['ppas'] == [] @pytest.mark.parametrize('json_text, params, expected', [ ( # No Jobs returned if nothing is running in autopkgtest "", {'releases': [], 'sources': None}, {'repr': '', 'source_package': [], 'triggers': [], 'ppas': []} ), ( # No Jobs returned if nothing is running for the specified PPA ( '{ "ubuntu": { "focal": { "amd64": [' ' "a\\n{\\"requester\\": \\"you\\",' ' \\"submit-time\\": \\"2022-08-19 07:37:56\\",' ' \\"triggers\\": [ \\"a/1.2-3\\", \\"b/1-1\\" ] }",' ' "b\\n{\\"requester\\": \\"you\\",' ' \\"submit-time\\": \\"2022-08-19 07:37:57\\",' ' \\"ppas\\": [ \\"ppa:x/x\\" ],' ' \\"triggers\\": [ \\"c/3.2-1\\", \\"d/2-2\\" ] }"' '] } } }' ), {'releases': None, 'ppa': 'ppa:me/myppa', 'sources': None}, {'repr': '', 'source_package': None, 'triggers': [], 'ppas': []} ), ( # Correct Job should be returned for matching criteria ( '{ "ubuntu": { "focal": { "amd64": [' ' "a\\n{\\"requester\\": \\"you\\",' ' \\"submit-time\\": \\"2022-08-19 07:37:56\\",' ' \\"triggers\\": [ \\"a/1.2-3\\", \\"b/1-1\\" ] }",' ' "b\\n{\\"requester\\": \\"you\\",' ' \\"submit-time\\": \\"2022-08-19 07:37:57\\",' ' \\"ppas\\": [ \\"ppa:me/myppa\\" ],' ' \\"triggers\\": [ \\"c/3.2-1\\", \\"d/2-2\\" ] }"' '] } } }' ), {'releases': ['focal'], 'ppa': 'ppa:me/myppa', 'sources': None}, { 'repr': "Job(source_package='b', series='focal', arch='amd64')", 'source_package': 'b', 'triggers': ['c/3.2-1', 'd/2-2'], 'ppas': ['ppa:me/myppa'] } ), ]) def test_get_waiting(json_text, params, expected): """Checks result of the get_waiting() command.""" # TODO: I think ppas need to be in "ppa" instead of under "ubuntu" but need to doublecheck. fake_response = RequestResponseMock(json_text) try: job = next(get_waiting(fake_response, **params)) assert job assert repr(job) == expected['repr'] assert job.source_package == expected['source_package'] assert job.triggers == expected['triggers'] assert job.ppas == expected['ppas'] except StopIteration: assert expected['repr'] == '' assert expected['triggers'] == [] assert expected['ppas'] == [] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/tests/test_lp.py0000664000175000017500000001322114627412314016600 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # # Copyright (C) 2019-2020 Bryce Harrington # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # pylint: disable=W0212 """Launchpad Interface Tests. Tests for our launchpadlib wrapper & helper methods. """ import sys import os.path from unittest.mock import Mock, patch import logging import pytest from launchpadlib.launchpad import Launchpad sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.lp import Lp APPNAME = 'test-lp' @pytest.fixture(name='fakelp') def fixture_fakelp(): """Connect to Launchpad.""" mock_launchpad = Mock(spec=Launchpad) return Lp( application_name=APPNAME, service=mock_launchpad) def test_new_connection(): """Verifies the Lp object will auto-login properly.""" mock_launchpad = Mock(spec=Launchpad) lp = Lp( application_name=APPNAME, service=mock_launchpad) # Cause the lp._instance() internal property to be triggered logging.debug(lp.me) logging.debug(lp.people) # Verify the triggering resulted in a login attempt mock_launchpad.login_with.assert_called_once_with( application_name=APPNAME, service_root='production', allow_access_levels=['WRITE_PRIVATE'], version='devel', ) @patch("ppa.lp.Credentials") def test_new_connection_creds(credentials_mock): """Verifies the Lp object will login if credentials are provided.""" mock_launchpad = Mock(spec=Launchpad) lp = Lp( application_name=APPNAME, service=mock_launchpad, credentials='...') # Cause the lp._instance() internal property to be triggered logging.debug(lp.me) logging.debug(lp.people) # Verify the triggering did not result in a login attempt mock_launchpad.login_with.assert_not_called() # Rather that the login was done via envvar # creating the credentials credentials_mock.from_string.assert_called_once() # and the service was created with the given credentials mock_launchpad.assert_called_once_with( credentials_mock.from_string.return_value, None, None, service_root="production", version="devel" ) def test_api_root(fakelp): """Ensures we can get LP's API root.""" fakelp.load(Lp.API_ROOT_URL + 'hi') fakelp._instance.load.assert_called_once_with( 'https://api.launchpad.net/devel/hi') def test_ubuntu(fakelp): """Checks the .ubuntu property.""" fakelp._instance.distributions = {'ubuntu': 'UBUNTU'} assert fakelp.ubuntu == 'UBUNTU' def test_ubuntu_active_series(fakelp): """Checks the active series names for Ubuntu.""" mock_hirsute = Mock(active=False) mock_hirsute.name = 'hirsute' mock_jammy = Mock(active=True) mock_jammy.name = 'jammy' mock_ubuntu = Mock(series=[mock_hirsute, mock_jammy]) fakelp._instance.distributions = {'ubuntu': mock_ubuntu} assert fakelp.ubuntu_active_series()[0] == mock_jammy assert fakelp.ubuntu_active_series()[0].name == 'jammy' def test_debian(fakelp): """Checks the .debian property.""" fakelp._instance.distributions = {'debian': 'DEBIAN'} assert fakelp.debian == 'DEBIAN' def test_debian_active_series(fakelp): """Checks the active series names for Debian.""" mock_woody = Mock(active=False) mock_woody.name = 'woody' mock_buster = Mock(active=True) mock_buster.name = 'buster' mock_sid = Mock(active=False) mock_sid.name = 'experimental' mock_debian = Mock(series=[mock_woody, mock_buster, mock_sid]) fakelp._instance.distributions = {'debian': mock_debian} assert fakelp.debian_active_series()[0].name == 'buster' def test_debian_experimental_series(fakelp): """Checks the experimental series name for Debian.""" mock_woody = Mock(active=False) mock_woody.name = 'woody' mock_buster = Mock(active=True) mock_buster.name = 'buster' mock_sid = Mock(active=False) mock_sid.name = 'experimental' mock_debian = Mock(series=[mock_woody, mock_buster, mock_sid]) fakelp._instance.distributions = {'debian': mock_debian} assert fakelp.debian_experimental_series() == mock_sid def test_get_teams(fakelp): """Checks that a person's teams can be retrieved.""" mock_me = Mock(memberships_details=[ Mock(name='t1', self_link="https://launchpad.net/~t1"), Mock(name='t2', self_link="https://launchpad.net/~t2/+blah"), Mock(name='t3', self_link="https://launchpad.net/~t3/+blah"), ]) fakelp._instance.people = {'me': mock_me} assert fakelp.get_teams('me') == ['t1', 't2', 't3'] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/tests/test_ppa.py0000664000175000017500000001310514627412314016746 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Ppa class tests""" import os import sys import time from unittest.mock import patch import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.constants import URL_AUTOPKGTEST from ppa.ppa import Ppa, ppa_address_split, get_ppa from ppa.result import Result def test_object(): """Check that PPA objects can be instantiated.""" ppa = Ppa('test-ppa-name', 'test-owner-name', ppa_description='test-desc', service='test-svc') assert ppa assert ppa.ppa_name == 'test-ppa-name' assert ppa.owner_name == 'test-owner-name' assert ppa.ppa_description == 'test-desc' def test_repr(): """Check Ppa object representation.""" ppa = Ppa('a', 'b', 'c', 'd') assert repr(ppa) == "Ppa(ppa_name='a', owner_name='b')" def test_str(): """Check Ppa object textual presentation.""" ppa = Ppa('a', 'b', 'c', 'd') assert f"{ppa}" == 'b/a' def test_address(): """Check getting the PPA address.""" ppa = Ppa('test', 'owner') assert ppa.address == "ppa:owner/test" def test_description(): """Check specifying a description when creating a PPA.""" ppa = Ppa('test-ppa-name', 'test-owner-name', 'test-description') assert 'test-description' in ppa.ppa_description @pytest.mark.parametrize('releases, architectures, expected_num_results, expected_num_triggers', [ ([], [], 0, 0), (['x'], ['amd64'], 1, 1), (['x', 'y', 'z'], ['amd64'], 3, 1), (['x'], ['amd64', 'armhf', 'i386'], 1, 3), (['x', 'y', 'z'], ['amd64', 'armhf', 'i386'], 3, 3), ]) @patch('ppa.ppa.get_results') @patch('ppa.ppa.open_url') def test_get_autopkgtest_results(mock_open_url, mock_get_results, releases, architectures, expected_num_results, expected_num_triggers): """Check that autopkgtest results are retrieved and iterated correctly.""" owner_name = 'a' ppa_name = 'b' # Bypass open_url() entirely so we don't try to retrieve anything. # Usually this returns a response that if valid is then passed to # get_results(), but since we'll be patching get_results(), all that # matters is that validity check passes. We can do that by having # our mock open_url return a generic valid value, True. mock_open_url.return_value = True # Substitute in our fake results to be returned by get_results(). # We need to have semi-valid looking URLs to pass internal checks, # but can provide trivially fake data. fake_results = {} fake_data_url = "https://fake.data" timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") for release in releases: k = f"{URL_AUTOPKGTEST}/results/autopkgtest-{release}-{owner_name}-{ppa_name}/" fake_results[k] = [] for arch in architectures: # We don't care about the triggers for the result, just the # number of results and their basic identity, so replace the # get_triggers() call to avoid it making any remote calls. result = Result(url=fake_data_url, time=timestamp, series=release, arch=arch, source=None) result.get_triggers = lambda: "x" fake_results[k].append(result) def fake_get_results(response, base_url, arches, sources): return fake_results[base_url] mock_get_results.side_effect = fake_get_results ppa = Ppa(ppa_name, owner_name) results = ppa.get_autopkgtest_results(releases, architectures) assert len(results) == expected_num_results for trigger_set in results: assert isinstance(trigger_set, dict) assert all(len(triggers) == expected_num_triggers for triggers in trigger_set.values()) @pytest.mark.parametrize('address, expected', [ # Successful cases ('bb', (None, 'bb')), ('123', (None, '123')), ('a/123', ('a', '123')), ('ppa:A/bb', ('a', 'bb')), ('ppa:a/bb', ('a', 'bb')), ('ppa:Ƨ/bb', ('Ƨ', 'bb')), ('https://launchpad.net/~a/+archive/ubuntu/bb', ('a', 'bb')), ('https://launchpad.net/~a/+archive/ubuntu/bb/', ('a', 'bb')), ('https://launchpad.net/~a/+archive/ubuntu/bb////', ('a', 'bb')), ('https://launchpad.net/~a/+archive/ubuntu/bb/+packages', ('a', 'bb')), ('https://launchpad.net/~a/+archive/ubuntu/bb/+x', ('a', 'bb')), # Expected failure cases ('ppa:', (None, None)), (None, (None, None)), ('', (None, None)), ('/', (None, None)), (':/', (None, None)), ('////', (None, None)), ('ppa:/', (None, None)), ('ppa:a/', (None, None)), ('ppa:/bb', (None, None)), ('ppa:a/bƧ', (None, None)), ('ppa/a/bb', (None, None)), ('ppa:a/bb/c', (None, None)), ('ppa:a/bB', (None, None)), ('http://launchpad.net/~a/+archive/ubuntu/bb', (None, None)), ('https://example.com/~a/+archive/ubuntu/bb', (None, None)), ('https://launchpad.net/~a/+archive/nobuntu/bb', (None, None)), ('https://launchpad.net/~a/+archive/ubuntu/bb/x', (None, None)), ('https://launchpad.net/~a/+archive/ubuntu/bb/+', (None, None)), ]) def test_ppa_address_split(address, expected): """Check ppa address input strings can be parsed properly.""" result = ppa_address_split(address) assert result == expected def test_get_ppa(): ppa = get_ppa(None, {'owner_name': 'a', 'ppa_name': 'bb'}) assert type(ppa) is Ppa assert ppa.owner_name == 'a' assert ppa.ppa_name == 'bb' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1691013389.0 ppa_dev_tools-0.6.0/tests/test_ppa_group.py0000664000175000017500000000534614462550415020174 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. import os import sys import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.ppa_group import PpaGroup, PpaAlreadyExists from tests.helpers import LpServiceMock def test_object(): """Checks that PpaGroup objects can be instantiated.""" ppa_group = PpaGroup(service=LpServiceMock(), name='test-ppa') assert ppa_group with pytest.raises(ValueError): ppa_group = PpaGroup(service=LpServiceMock(), name=None) with pytest.raises(ValueError): ppa_group = PpaGroup(service=None, name='test-ppa') def test_create_ppa(): """Checks that PpaGroups can create PPAs.""" name = 'test_ppa' ppa_group = PpaGroup(service=LpServiceMock(), name='me') ppa = ppa_group.create(name) assert ppa is not None assert name in ppa.address assert type(ppa.description) is str def test_create_existing_ppa(): """Check exception creating an already created PPA.""" name = 'test_ppa' ppa_group = PpaGroup(service=LpServiceMock(), name='me') ppa_group.create(name) with pytest.raises(PpaAlreadyExists): ppa_group.create(name) def test_create_with_description(): """Check setting a description for a PPA.""" ppa_group = PpaGroup(service=LpServiceMock(), name='me') description = 'PPA Test Description' ppa = ppa_group.create('test_ppa_with_description', description) assert ppa is not None assert ppa.description == description def test_create_with_owner(): """Check creating a PPA for a particular owner.""" lp = LpServiceMock() lp.launchpad.add_person('test_owner_name') ppa_group = PpaGroup(service=lp, name='test_owner_name') ppa = ppa_group.create('ppa_test_name') assert ppa is not None assert ppa.address == 'ppa:test_owner_name/ppa_test_name' def test_create_private(): """Check creating a private PPA.""" lp = LpServiceMock() ppa_group = PpaGroup(service=lp, name='me') ppa = ppa_group.create('private_ppa', private=True) assert ppa is not None assert ppa.address == 'ppa:me/private_ppa' assert ppa.is_private is True def test_list_ppas(): """Check listing the PPAs for a PPA group.""" test_ppa_list = ['a', 'b', 'c', 'd'] ppa_group = PpaGroup(service=LpServiceMock(), name='me') # Add several ppas for ppa in test_ppa_list: ppa_group.create(ppa) ppas = [ppa.name for ppa in list(ppa_group.ppas)] assert test_ppa_list == ppas ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680046607.0 ppa_dev_tools-0.6.0/tests/test_repository.py0000664000175000017500000000265714410675017020420 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2023 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Tests the Repository class as an interface to an Apt repository.""" import os import sys sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.repository import Repository from ppa.suite import Suite def test_object(tmp_path): """Checks that Repository objects can be instantiated.""" repository = Repository(tmp_path) assert repository def test_suites(tmp_path): """Checks getting all suites from the repository.""" suites = ['a', 'b', 'b-0', 'b-1'] for suite in suites: suite_dir = tmp_path / suite suite_dir.mkdir() repository = Repository(tmp_path) assert sorted(repository.suites.keys()) == sorted(suites) for suite in repository.suites.values(): assert isinstance(suite, Suite) def test_get_suite(tmp_path): """Checks getting a specific suite from the repository.""" suites = ['a', 'b', 'b-0', 'b-1'] for suite in suites: suite_dir = tmp_path / suite suite_dir.mkdir() repository = Repository(tmp_path) suite = repository.get_suite('b', '1') assert suite assert str(suite) == 'b-1' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717748802.0 ppa_dev_tools-0.6.0/tests/test_result.py0000664000175000017500000004602714630542102017506 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Results class tests.""" import os import sys import time import gzip import json import pytest from typing import List, Dict sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) DATA_DIR = os.path.realpath( os.path.join(os.path.dirname(__file__), "data")) from ppa.result import Result, get_results, show_results from ppa.subtest import Subtest from ppa.io import open_url def test_object(): """Checks that Result objects can be instantiated.""" timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result = Result('url', timestamp, 'b', 'c', 'd') assert result assert result.url == 'url' assert result.time == timestamp assert result.series == 'b' assert result.arch == 'c' assert result.source == 'd' assert not result.error_message def test_repr(): """Checks Result object representation.""" result = Result('url', None, 'b', 'c', 'd') # TODO: Should this include the full set of args? assert repr(result) == "Result(url='url')" def test_str(): """Checks Result object textual presentation.""" timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result = Result('url', timestamp, 'b', 'c', 'd') assert f"{result}" == 'd on b for c @ 01.02.03 04:05:06' @pytest.mark.parametrize('timestamp, subtests, show_urls, expected', [ ( # With show_urls enabled, output should show a text URL. '20030201_040506', [], True, """ + āœ… source on series for arch @ 01.02.03 04:05:06 • Log: file:///x """ ), ( # Without show_urls, output should create console-clickable URLs. '20030201_040506', [], False, """ + āœ… source on series for arch @ 01.02.03 04:05:06 \x1b]8;;file:///x\x1b\\Logļø šŸ—’ļø \x1b]8;;\x1b\\ """ ), ( # When no Subtests fail, no detailed results should be shown. '20030201_040506', [Subtest('x PASS'), Subtest('y PASS'), Subtest('z SKIP')], True, """ + āœ… source on series for arch @ 01.02.03 04:05:06 • Log: file:///x """ ), ( # When at least one Subtest fails, all subtest results should be shown. '20030201_040506', [Subtest('x PASS'), Subtest('y FAIL'), Subtest('f FLAKY'), Subtest('z SKIP')], True, """ + āŒ source on series for arch @ 01.02.03 04:05:06 • Log: file:///x • Status: FAIL • x PASS 🟩 • y FAIL 🟄 • f FLAKY 🟫 • z SKIP 🟧 """ ), ]) def test_to_bullet_tree(timestamp, subtests, show_urls, expected): """Checks representation of Result as a bullet-tree text list.""" tm = time.strptime(timestamp, "%Y%m%d_%H%M%S") result = Result(f"file://{DATA_DIR}/x", tm, 'series', 'arch', 'source') # Substitute in our fake subtest data in place of Result's get_subtests() routine result.get_subtests = lambda: subtests out = result.to_bullet_tree(show_urls) assert out == expected.replace("", DATA_DIR) def test_timestamp(): """Checks Result object formats the result's time correctly.""" timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result = Result('url', timestamp, 'b', 'c', 'd') assert f"{result.timestamp}" == '01.02.03 04:05:06' def test_log(tmp_path): """Checks that the log content of a Result is available.""" f = tmp_path / "result.log.gz" compressed_text = gzip.compress(bytes('abcde', 'utf-8')) f.write_bytes(compressed_text) result = Result(f"file://{f}", None, None, None, None) assert result.log == "abcde" @pytest.mark.parametrize('filename, expected_triggers', [ ('results-rabbitmq-server-armhf.log.gz', ['rabbitmq-server/3.9.27-0ubuntu0.1~jammy8']), ('results-six-s390x.log.gz', ['pygobject/3.42.2-2', 'six/1.16.0-4']), ('results-chrony-armhf.log.gz', ['dpkg/1.22.6ubuntu5']) ]) def test_triggers(filename, expected_triggers): """Checks that autopkgtest triggers can be extracted from test result logs.""" result = Result(f"file://{DATA_DIR}/{filename}", None, None, None, None) assert result.triggers == expected_triggers @pytest.mark.parametrize('triggers, name, expected', [ ([], None, []), (['x/1'], None, ["Trigger(package='x', version='1', arch=None, series=None, ppa=None, test_package='x')"]), (['x/1'], 'x', ["Trigger(package='x', version='1', arch=None, series=None, ppa=None, test_package='x')"]), pytest.param( ['x/1'], 'z', [], marks=pytest.mark.xfail(reason="Unimplemented") ), ( ['x/1', 'y/2', 'z/3'], None, [ "Trigger(package='x', version='1', arch=None, series=None, ppa=None, test_package='x')", "Trigger(package='y', version='2', arch=None, series=None, ppa=None, test_package='y')", "Trigger(package='z', version='3', arch=None, series=None, ppa=None, test_package='z')" ] ), pytest.param( ['x/1', 'y/2', 'z/3'], 'y', [ "Trigger(package='y', version='2', arch=None, series=None, ppa=None, test_package='y')" ], marks=pytest.mark.xfail(reason="Unimplemented"), ), ]) def test_get_triggers(monkeypatch, triggers, name, expected): """Checks retrieval of Trigger objects from autopkgtest results.""" result = Result('url', None, None, None, None) monkeypatch.setattr(Result, "triggers", triggers) triggers = result.get_triggers(name) assert [repr(t) for t in triggers] == expected @pytest.mark.parametrize('log_text, subtest_name, expected', [ ('', None, {'testbed': 'BAD'}), ( ( "x: @@@@@@@@@@@@@@@@@@@@ summary\n" "test-a PASS\n" "test-b FAIL ignorable-note\n" "test-c FLAKY some-detail\n" "test-d NoTaVaLiDsTaTuS\n" ), None, {'test-a': 'PASS', 'test-b': 'FAIL', 'test-c': 'FLAKY'} ), ( ( "autopkgtest [21:13:56]: starting date: 2022-11-18\n" "The following packages have unmet dependencies:\n" " builddeps:.../12-autopkgtest-satdep.dsc:i386 : Depends: gcc:i386 but it is not installable\n" "E: Unable to correct problems, you have held broken packages.\n" "chroot FAIL badpkg\n" "blame: apache2\n" "badpkg: Test dependencies are unsatisfiable. A common reason is ...\n" "autopkgtest [21:48:03]: @@@@@@@@@@@@@@@@@@@@ summary\n" "run-test-suite FAIL badpkg\n" "blame: apache2\n" "badpkg: Test dependencies are unsatisfiable. A common reason is...\n" "duplicate-module-load PASS\n" "default-mods PASS\n" "run-htcacheclean PASS\n" "ssl-passphrase PASS\n" "check-http2 PASS\n" "run-chroot FAIL badpkg\n" "blame: apache2\n" ), 'run-', { 'run-test-suite': 'FAIL', 'run-htcacheclean': 'PASS', 'run-chroot': 'FAIL', } ), ( ( "3657s rm: cannot remove '.../mountpoint': Device or resource busy\n" "3661s autopkgtest [03:41:43]: test minimized: -----------------------]\n" "3663s autopkgtest [03:41:45]: test minimized: - - - - - - - - - - results - - - - - - - - - -\n" "3663s minimized FAIL non-zero exit status 1\n" "3663s autopkgtest [03:41:45]: test minimized: - - - - - - - - - - stderr - - - - - - - - - -\n" "3663s rm: cannot remove '.../mountpoint': Device or resource busy\n" "3664s autopkgtest [03:41:46]: @@@@@@@@@@@@@@@@@@@@ summary\n" "3664s default-bootstraps FAIL non-zero exit status 1\n" "3664s minimized FAIL non-zero exit status 1'\n" ), None, { 'default-bootstraps': 'FAIL', 'minimized': 'FAIL' } ), ]) def test_get_subtests(tmp_path, log_text: str, subtest_name: str, expected: Dict[str, str]): """Checks retrieval of Subtest objects from autopkgtest results. This test exercises the parser that extracts subtest information out of autopkgtest logs of various formats. It also verifies the parameter to get_subtests() is handled correctly. :param fixture tmp_path: Temp dir. :param str log_text: Text to write into the log file. :param str subtest_name: Only retrieve subtests starting with this text. :param Dict[str] expected: Dictionary of subtest names to pass/fail status. """ f = tmp_path / "result.log.gz" compressed_text = gzip.compress(bytes(log_text, 'utf-8')) f.write_bytes(compressed_text) result = Result(f"file://{f}", None, None, None, None) subtests = result.get_subtests(subtest_name) assert {s.desc: s.status for s in subtests} == expected @pytest.mark.parametrize('subtest_states, error_message, expected', [ ([], None, 'PASS'), (['PASS'], None, 'PASS'), (['FAIL'], None, 'FAIL'), (['SKIP'], None, 'PASS'), (['FLAKY'], None, 'PASS'), (['PASS', 'FAIL'], None, 'FAIL'), (['FAIL', 'PASS'], None, 'FAIL'), (['PASS', 'PASS', 'PASS'], None, 'PASS'), (['PASS', 'FLAKY'], None, 'PASS'), (['PASS', 'SKIP'], None, 'PASS'), (['PASS'], 'x', 'BAD'), (['FAIL'], 'x', 'BAD'), ]) def test_status(monkeypatch, subtest_states, error_message, expected): """Checks retrieval of status from autopkgtest results.""" result = Result("file://tmp/x", None, None, None, None) result.error_message = error_message # Add subtests with given states subtests = [Subtest(f"... {state}...") for state in subtest_states] monkeypatch.setattr(Result, "get_subtests", lambda x: subtests) assert result.status == expected @pytest.mark.parametrize('status, expected', [ ('PASS', "āœ…"), ('FAIL', "āŒ"), ('BAD', "ā›”"), ]) def test_status_icon(monkeypatch, status, expected): """Checks generation of correct icon based on autopkgtest results.""" result = Result("file://tmp/x", None, None, None, None) monkeypatch.setattr(Result, "status", status) assert result.status_icon == expected @pytest.mark.parametrize('status, expected_exception', [ (None, KeyError), ('x', KeyError), ]) def test_status_icon_error(monkeypatch, status, expected_exception): """Checks generation of correct icon based on autopkgtest results.""" result = Result("file://tmp/x", None, None, None, None) monkeypatch.setattr(Result, "status", status) with pytest.raises(expected_exception): print(result.status_icon) @pytest.mark.parametrize('log_text, series, arch, source, expected_dict', [ ( # Empty/invalid log should return empty triggers 'x', 'x', 'x', 'x', {'triggers': []} ), ( # Empty/invalid log counts as an overall test state BAD. 'x', 'x', 'x', 'x', { 'status': 'BAD', 'status_icon': 'ā›”', 'subtests': [ { 'desc': 'testbed', 'line': 'testbed setup failure BAD', 'status': 'BAD', 'status_icon': 'ā›”' } ] } ), ( # Init parameters are registered in the class as provided. 'l', 's', 'a', 'pkg', {'log': 'l', 'series': 's', 'arch': 'a', 'source': 'pkg'} ), ( # Log with valid syntax for a trigger should create a Trigger dict. '--env=ADT_TEST_TRIGGERS=t/1 -- \n: @@@@@@@@@@@@@@@@@@@@', 's', 'a', 'pkg', { 'triggers': [ { 'arch': 'a', 'package': 't', 'series': 's', 'ppa': None, 'test_package': 't', 'version': '1' }, ] } ), ( # Log with valid syntax for a subtest should create a Subtest dict. ': @@@@@@@@@@@@@@@@@@@@ summary\n999s tst FAIL', 's', 'a', 'pkg', { 'subtests': [ { 'desc': 'tst', 'line': 'tst FAIL', 'status': 'FAIL', 'status_icon': '🟄' }, ], 'status': 'FAIL', 'status_icon': 'āŒ' } ) ]) def test_to_dict(tmp_path, log_text, series, arch, source, expected_dict): """Checks Result object structural representation.""" f = tmp_path / "result.log.gz" f.write_bytes(gzip.compress(bytes(log_text, 'utf-8'))) timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result = Result(f"file://{f}", timestamp, series, arch, source) expected_keys = [ 'url', 'timestamp', 'series', 'arch', 'source', 'error_message', 'log', 'triggers', 'subtests', 'status', 'status_icon' ] expected_types = [str, type(None), list] d = result.to_dict() assert isinstance(d, dict), f"type of d is {type(d)} not dict" # Verify expected keys are present assert sorted(d.keys()) == sorted(expected_keys) # Verify values are within set of expected types for k, v in d.items(): assert type(v) in expected_types, f"'{k}={v}' is unexpected type {type(v)}" # Verify values match what we expect for k, v in expected_dict.items(): assert v == d.get(k) # Verify full dict can be written as JSON try: assert json.dumps(d) except UnicodeDecodeError as e: assert False, f"Wrong UTF codec detected: {e}" except json.JSONDecodeError as e: assert False, f"JSON decoding error: {e.msg}, {e.doc}, {e.pos}" return True @pytest.mark.parametrize('results_text, arches, sources, expected', [ ( # Specifying no args should return all logs "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz\n", None, None, ["/results/noble/amd64/e/exim4/20240104_193939_e912d@/log.gz')"], ), ( # Specifying empty args should return all logs "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz\n", [], [], ["/results/noble/amd64/e/exim4/20240104_193939_e912d@/log.gz')"], ), ( # Specifying a missing architecture should return no results "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz", ['a'], None, [] ), ( # Specifying an unrelated package should return no results "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz\n", None, ['pkg'], [] ), ( # Specifying an arch and package present should return # corresponding result 'noble/amd64/e/exim4/20240104_193939_e912d@/log.gz', ['amd64'], ['exim4'], ["/results/noble/amd64/e/exim4/20240104_193939_e912d@/log.gz')"], ), ( # Specified architectures should provide results for those # architectures and no others. ( "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/armhf/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/arm64/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/i386/e/exim4/20240104_193939_e912d@/log.gz\n" ), ['amd64', 'armhf', 'i386'], ['exim4'], [ "/results/noble/amd64/e/exim4/20240104_193939_e912d@/log.gz')", "/results/noble/armhf/e/exim4/20240104_193939_e912d@/log.gz')", "/results/noble/i386/e/exim4/20240104_193939_e912d@/log.gz')", ], ), ( # Specifying mix of present and missing architectures should # correctly return proper subset of matches. ( "noble/amd64/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/armhf/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/arm64/e/exim4/20240104_193939_e912d@/log.gz\n" "noble/i386/e/exim4/20240104_193939_e912d@/log.gz\n" ), ['amd64', 'x', 'y', 'z'], ['exim4'], [ "/results/noble/amd64/e/exim4/20240104_193939_e912d@/log.gz')", ], ), ( # Specifying a mix of present and missing packages should # correctly return proper subset of matches. ( "noble/amd64/x/xxx/20240104_193939_e912d@/log.gz\n" "noble/amd64/y/yyy/20240104_193939_e912d@/log.gz\n" ), ['amd64'], ['xxx', 'yyy', 'zzz', 'non-existing'], [ "/results/noble/amd64/x/xxx/20240104_193939_e912d@/log.gz')", "/results/noble/amd64/y/yyy/20240104_193939_e912d@/log.gz')", ], ), ]) def test_get_results(tmp_path, results_text: str, arches: 'List[str]|None', sources: 'List[str]|None', expected: List[str]): """Checks that expected results can be found from autopkgtest logs.""" f = tmp_path / "results" f.write_text(results_text) url = f"file://{f}" response = open_url(url) assert response results = list(get_results(response, url, arches, sources)) print("results: ", results) # Verify expected number, type, and representation of returned results assert len(results) == len(expected) assert all([isinstance(result, Result) for result in results]) for r in results: assert repr(r).startswith("Result(url='") assert True in [repr(r).endswith(e) for e in expected], f"{repr(r)} not in {expected}" @pytest.mark.parametrize('data, show_urls, expected_num_lines, expected_in_stdout', [ ( # When there are no results, indicate '(none)' {}, True, 1, "* Results: (none)\n" ), ( {'trigger-1': ('a', 'b', 'c', 'x')}, True, 6, "- trigger-1\n + ā›” c on a for b" ), ({'t1': ('a', 'b', 'c', 'x'), 't2': ('a', 'b', 'c', 'x')}, True, 11, "- t2"), ]) def test_show_results(capfd, tmp_path, data, show_urls, expected_num_lines, expected_in_stdout): """Checks that results output includes the expected text.""" results = [] for trigger, (series, arch, source, item) in data.items(): trigger_sets = {} trigger_sets.setdefault(trigger, []) f = tmp_path / f"{trigger}-result.log.gz" compressed_text = gzip.compress(bytes(item, 'utf-8')) f.write_bytes(compressed_text) timestamp = time.strptime('20030201_040506', "%Y%m%d_%H%M%S") result = Result(f"file://{f}", timestamp, series, arch, source) trigger_sets[trigger].append(result) results.append(trigger_sets) show_results(results, show_urls) out, err = capfd.readouterr() print(out) assert out.count('\n') == expected_num_lines assert expected_in_stdout in out ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1717441740.0 ppa_dev_tools-0.6.0/tests/test_scripts_ppa.py0000664000175000017500000006672314627412314020533 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2021 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """ppa command-line script tests.""" import os import io import sys import types import importlib.machinery import argparse from unittest.mock import patch import pytest SCRIPT_NAME = "ppa" BASE_PATH = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "..")) sys.path.insert(0, BASE_PATH) from ppa.ppa import Ppa from ppa.constants import ( ARCHES_PPA_ALL, ARCHES_PPA_DEFAULT ) from tests.helpers import ( LpServiceMock, PublicationMock ) if '.pybuild' in BASE_PATH: # pylint: disable-next=invalid-name python_version = '.'.join([str(v) for v in sys.version_info[0:2]]) scripts_path = os.path.join( BASE_PATH.replace(f'/.pybuild/cpython3_{python_version}/', '/'), f'scripts-{python_version}' ) else: scripts_path = os.path.join(BASE_PATH, 'scripts') script_path = os.path.join(scripts_path, SCRIPT_NAME) loader = importlib.machinery.SourceFileLoader(SCRIPT_NAME, script_path) script = types.ModuleType(loader.name) loader.exec_module(script) @pytest.fixture def fake_config(): return { 'ppa_name': 'testing', 'owner_name': 'me', 'wait_seconds': 0.1, 'quiet': True } @pytest.fixture def fake_source_package(): # TODO: Implement return { 'name': 'test-source', 'version': '1.0-2ubuntu3', 'binaries': [ {'name': 'foo'}, {'name': 'bar'} ] } @pytest.fixture def fake_binary_package(): # TODO: Implement return { 'name': 'test-binary', 'source': 'test-source', } @pytest.fixture def fake_build(): # TODO: Implement, including build errors return { 'binary': 'foo', 'status': 'Failed', } @pytest.fixture def fake_bug_report(): # TODO: Implement return { 'id': 1234, 'title': 'foobar', 'desc': 'baz', } def test_create_arg_parser(): """ Checks that the main argument processor is created properly. It must support the top level options as well as the expected set of subparsers. Note we don't test --help or --version since these are built-ins from argparse so we don't control their behavior. They also both exit when done which is not conducive to testing. """ parser = script.create_arg_parser() # Check command is recognized args = parser.parse_args(['show', 'test-ppa']) assert args.command == 'show' # Check -A, --credentials args = parser.parse_args(['-A', 'my-creds', 'show', 'test-ppa']) assert args.credentials_filename == "my-creds" args.credentials_filename = None args = parser.parse_args(['--credentials', 'my-creds', 'show', 'test-ppa']) assert args.credentials_filename == "my-creds" args.credentials_filename = None # Check -D, --debug args = parser.parse_args(['-D', 'show', 'test-ppa']) assert args.debug is True args.debug = None args = parser.parse_args(['--debug', 'show', 'test-ppa']) assert args.debug is True args.debug = None # Check -q, --dry-run args = parser.parse_args(['--dry-run', 'show', 'test-ppa']) assert args.dry_run is True args.dry_run = None # Check -v, --verbose args = parser.parse_args(['-v', 'show', 'test-ppa']) assert args.verbose is True args.verbose = None args = parser.parse_args(['--verbose', 'show', 'test-ppa']) assert args.verbose is True args.verbose = None # Check -q, --quiet args = parser.parse_args(['-q', 'show', 'test-ppa']) assert args.quiet is True args.quiet = None args = parser.parse_args(['--quiet', 'show', 'test-ppa']) assert args.quiet is True args.quiet = None # Verify all expected subparsers are present subparsers_actions = [ action for action in parser._actions if isinstance(action, argparse._SubParsersAction)] subparsers = [] for subparsers_action in subparsers_actions: for choice, _ in subparsers_action.choices.items(): subparsers.append(choice) assert subparsers == [ 'create', 'credentials', 'desc', 'destroy', 'list', 'set', 'show', 'tests', 'wait' ] @pytest.mark.parametrize('command', ['create', 'set']) def test_create_arg_parser_basic_config(command): """Checks argument parsing for the basic PPA config options. This test covers the set of options used by 'create' and 'set' for configuring various properties of the PPA's behaviors, such as dependencies, publication policy, access control, etc. It does not cover settings that require Launchpad administrator involvement. The testing checks only that the options are being received and registered as expected, and does not cover the processing of the inputs nor the actual underlying functionality. """ parser = script.create_arg_parser() # Check command and ppa_name args = parser.parse_args([command, 'test-ppa']) assert args.command == command assert args.ppa_name == 'test-ppa' # Check that command args can come before or after the ppa name args = parser.parse_args([command, 'test-ppa', '-a', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, '-a', 'x', 'test-ppa']) assert args.architectures == 'x' args.architectures = None # Check --all-arches and --default-arches args = parser.parse_args([command, 'test-ppa', '--all-arches']) assert args.architectures == ','.join(ARCHES_PPA_ALL) args.architectures = None args = parser.parse_args([command, 'test-ppa', '--all-architectures']) assert args.architectures == ','.join(ARCHES_PPA_ALL) args.architectures = None args = parser.parse_args([command, 'test-ppa', '--default-arches']) assert args.architectures == ','.join(ARCHES_PPA_DEFAULT) args.architectures = None args = parser.parse_args([command, 'test-ppa', '--default-architectures']) assert args.architectures == ','.join(ARCHES_PPA_DEFAULT) args.architectures = None # Check -a, --arch, --arches, --architectures args = parser.parse_args([command, 'test-ppa', '-a', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arch', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arches', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--architectures', 'a,b,c']) assert args.architectures == 'a,b,c' args.architectures = None # Check --displayname args = parser.parse_args([command, 'test-ppa', '--displayname', 'x']) assert args.displayname == 'x' args.displayname = None # Check --description args = parser.parse_args([command, 'test-ppa', '--description', 'x']) assert args.description == 'x' args.description = None # Check --public / -P|--private args = parser.parse_args([command, 'test-ppa', '--public']) assert args.private is False args.public = None args = parser.parse_args([command, 'test-ppa', '--private']) assert args.private is True args.private = None args = parser.parse_args([command, 'test-ppa', '-P']) assert args.private is True args.private = None # Check --ppa-dependencies args = parser.parse_args([command, 'test-ppa', '--ppa-dependencies', 'a,b,c']) assert args.ppa_dependencies == "a,b,c" args.ppa_dependencies = None args = parser.parse_args([command, 'test-ppa', '--ppa-depends', 'a,b,c']) assert args.ppa_dependencies == "a,b,c" args.ppa_dependencies = None # Check --publish args = parser.parse_args([command, 'test-ppa', '--publish']) assert args.publish is True args.publish = None args = parser.parse_args([command, 'test-ppa', '--no-publish']) assert args.publish is False args.publish = None def test_create_arg_parser_create(): """Checks argument parsing for the 'create' command. Most of the create command's args are covered by test_create_arg_parser_basic_config(), this just verifies the few that aren't. """ parser = script.create_arg_parser() command = 'create' # Check ppa_name args = parser.parse_args([command, 'test-ppa']) assert args.ppa_name == 'test-ppa' args = parser.parse_args([command, 'my-team/test-ppa']) assert args.ppa_name == 'my-team/test-ppa' args = parser.parse_args([command, 'ppa:my-team/test-ppa']) assert args.ppa_name == 'ppa:my-team/test-ppa' # Check --owner, --owner-name, --team, --team-name args = parser.parse_args([command, 'test-ppa', '--owner', 'x']) assert args.owner_name == 'x' args.owner_name = None args = parser.parse_args([command, 'test-ppa', '--owner-name', 'x']) assert args.owner_name == 'x' args.owner_name = None args = parser.parse_args([command, 'test-ppa', '--team', 'x']) assert args.owner_name == 'x' args.owner_name = None args = parser.parse_args([command, 'test-ppa', '--team-name', 'x']) assert args.owner_name == 'x' args.owner_name = None def test_create_arg_parser_show(): """Checks argument parsing for the 'show' command.""" parser = script.create_arg_parser() command = 'show' # Check ppa_name args = parser.parse_args([command, 'test-ppa']) assert args.ppa_name == 'test-ppa' # Check -a, --arch, --arches, --architectures args = parser.parse_args([command, 'test-ppa', '-a', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arch', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arches', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--architectures', 'a,b,c']) assert args.architectures == 'a,b,c' args.architectures = None # Check -r, --release, --releases args = parser.parse_args([command, 'test-ppa', '-r', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--release', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--releases', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--releases', 'x,y,z']) assert args.releases == 'x,y,z' args.releases = None # Check -p, --package, --packages args = parser.parse_args([command, 'tests-ppa', '-p', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--package', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--packages', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--packages', 'x,y,z']) assert args.packages == 'x,y,z' args.packages = None def test_create_arg_parser_tests(): """Checks argument parsing for the 'tests' command.""" parser = script.create_arg_parser() command = 'tests' # Check ppa_name args = parser.parse_args([command, 'test-ppa']) assert args.ppa_name == 'test-ppa' # Check -a, --arch, --arches, --architectures args = parser.parse_args([command, 'test-ppa', '-a', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arch', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--arches', 'x']) assert args.architectures == 'x' args.architectures = None args = parser.parse_args([command, 'test-ppa', '--architectures', 'a,b,c']) assert args.architectures == 'a,b,c' args.architectures = None # Check -r, --release, --releases args = parser.parse_args([command, 'test-ppa', '-r', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--release', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--releases', 'x']) assert args.releases == 'x' args.releases = None args = parser.parse_args([command, 'test-ppa', '--releases', 'x,y,z']) assert args.releases == 'x,y,z' args.releases = None # Check -p, --package, --packages args = parser.parse_args([command, 'tests-ppa', '-p', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--package', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--packages', 'x']) assert args.packages == 'x' args.packages = None args = parser.parse_args([command, 'tests-ppa', '--packages', 'x,y,z']) assert args.packages == 'x,y,z' args.packages = None # Check --show-urls, --show-url, -L args = parser.parse_args([command, 'tests-ppa']) assert args.show_urls is False args.show_urls = None args = parser.parse_args([command, 'tests-ppa', '--show-urls']) assert args.show_urls is True args.show_urls = None args = parser.parse_args([command, 'tests-ppa', '--show-url']) assert args.show_urls is True args.show_urls = None args = parser.parse_args([command, 'tests-ppa', '-L']) assert args.show_urls is True args.show_urls = None # Check --show-rdepends args = parser.parse_args([command, 'tests-ppa']) assert args.show_rdepends is False args.show_rdepends = None args = parser.parse_args([command, 'tests-ppa', '--show-rdepends']) assert args.show_rdepends is True args.show_rdepends = None def test_create_arg_parser_wait(): """Checks argument parsing for the 'wait' command.""" parser = script.create_arg_parser() command = "wait" # Check ppa_name args = parser.parse_args([command, 'test-ppa']) assert args.ppa_name == 'test-ppa' # Check -l, --log args = parser.parse_args([command, 'test-ppa']) assert args.wait_logging is False args = parser.parse_args([command, 'test-ppa', '-l']) assert args.wait_logging is True args = parser.parse_args([command, 'test-ppa', '--log']) assert args.wait_logging is True @pytest.mark.parametrize('command_line_options, expected_config', [ pytest.param([], {}), (['show', 'ppa:aa/bb'], {'command': 'show', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['show', 'aa/bb'], {'owner_name': 'aa', 'ppa_name': 'bb'}), (['show', 'bb'], {'owner_name': 'me', 'ppa_name': 'bb'}), (['--debug', 'show', 'ppa:aa/bb'], {'debug': True}), (['--dry-run', 'show', 'ppa:aa/bb'], {'dry_run': True}), (['--verbose', 'show', 'ppa:aa/bb'], {'verbose': True}), (['--quiet', 'show', 'ppa:aa/bb'], {'quiet': True}), (['create', 'ppa:aa/bb'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['create', 'aa/bb'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['create', 'bb', '--owner', 'aa'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['create', 'bb', '--owner-name', 'aa'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['create', 'bb', '--private'], {'command': 'create', 'private': True}), (['create', 'bb', '--public'], {'command': 'create', 'private': False}), (['create', 'bb', '--team', 'aa'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), (['create', 'bb', '--team-name', 'aa'], {'command': 'create', 'owner_name': 'aa', 'ppa_name': 'bb'}), ]) def test_create_config_from_args(command_line_options, expected_config): '''Checks creation of a config object from an argparser object. Prior tests cover the creation of proper args from the command line; this test relies on the already-tested argparse machinery to create various args to pass to create_config() in order to assure that the right config dict is generated in response. ''' lp = LpServiceMock() parser = script.create_arg_parser() args = parser.parse_args(command_line_options) config = script.create_config(lp, args) for key, value in expected_config.items(): assert key in config.keys() assert config[key] == value @pytest.mark.parametrize('args, expected_exception', [ # Bad command ([None], SystemExit), ([''], SystemExit), (['INVALID'], SystemExit), ([1], TypeError), # Bad ppa name (['show'], SystemExit), (['show', None], ValueError), (['show', ''], ValueError), (['show', 'INVALID'], ValueError), (['show', 1], TypeError), # Bad argument name (['--invalid', 'show', 'ppa:aa/bb'], SystemExit), ]) def test_create_config_from_args_error(args, expected_exception): '''Checks creation of a config object from an argparser object.''' lp = LpServiceMock() parser = script.create_arg_parser() with pytest.raises(expected_exception): args = parser.parse_args(args) script.create_config(lp, args) def test_create_lp_via_file(tmp_path): '''Checks loading of credentials provided by --credentials arg.''' expected_credentials = "[1]\na: 1\nb: 2\n" credentials_file = tmp_path / 'x' credentials_file.write_text(expected_credentials) lp = LpServiceMock() parser = script.create_arg_parser() args = parser.parse_args([ '--credentials', str(credentials_file), 'show', 'test-ppa', ]) lp = script.create_lp('x', args) assert lp._credentials == expected_credentials @patch.dict(os.environ, {"LP_CREDENTIALS": "[1]\na: 1\nb: 2\n"}) def test_create_lp_via_envvar(tmp_path): '''Checks loading of credentials provided by $LP_CREDENTIALS.''' lp = LpServiceMock() parser = script.create_arg_parser() args = parser.parse_args([ 'show', 'test-ppa', ]) lp = script.create_lp('x', args) assert lp._credentials == os.environ['LP_CREDENTIALS'] @pytest.mark.parametrize('stdin, params, expected_ppa_config', [ # Defaults (None, {}, {'description': ''}), # Overrides ('x', {}, {'description': 'x'}), (None, {'description': 'a'}, {'description': 'a'}), (None, {'ppa_name': 'a'}, {'displayname': 'a'}), (None, {'publish': True}, {'publish': True}), (None, {'publish': False}, {'publish': False}), (None, {'private': True}, {'private': True}), (None, {'private': False}, {'private': False}), ]) def test_command_create(fake_config, monkeypatch, stdin, params, expected_ppa_config): '''Checks create command produces a PPA with expected configuration.''' lp = LpServiceMock() monkeypatch.setattr("sys.stdin", io.StringIO(stdin)) # Check success of the create command config = {**fake_config, **params} print(config) assert script.command_create(lp, config) == 0 # Retrieve the newly created PPA owner = lp.people[config['owner_name']] lp_ppa = owner.getPPAByName(config['ppa_name']) assert lp_ppa # Verify the expected items are present in the new PPA for key, value in expected_ppa_config.items(): assert getattr(lp_ppa, key) == value @pytest.mark.parametrize('params, owner_name', [ # Defaults ({'owner_name': 'a', 'ppa_name': 'x'}, 'a'), ]) def test_command_create_with_owner(fake_config, monkeypatch, params, owner_name): '''Checks create command produces a PPA for a specified owner.''' lp = LpServiceMock() lp.launchpad.add_person(owner_name) monkeypatch.setattr("sys.stdin", io.StringIO('x')) # Check success of the create command config = {**fake_config, **params} print(config) assert script.command_create(lp, config) == 0 # Retrieve the newly created PPA owner = lp.people[owner_name] lp_ppa = owner.getPPAByName(config['ppa_name']) assert lp_ppa @pytest.mark.parametrize('architectures, expected_processors', [ (None, ARCHES_PPA_DEFAULT), ('a', ['a']), ('a,b,c', ['a', 'b', 'c']), ('a, b, c', ['a', 'b', 'c']), ('amd64,arm64,armhf,i386,powerpc,ppc64el,s390x', ["amd64", "arm64", "armhf", "i386", "powerpc", "ppc64el", "s390x"]), ]) def test_command_create_with_architectures(monkeypatch, fake_config, architectures, expected_processors): '''Checks that PPAs can be created with non-default architecture support.''' lp = LpServiceMock() config = {**fake_config, **{'architectures': architectures}} monkeypatch.setattr("sys.stdin", io.StringIO('x')) assert script.command_create(lp, config) == 0 # Retrieve the newly created PPA owner = lp.people[config['owner_name']] lp_ppa = owner.getPPAByName(config['ppa_name']) # Check processor architectures assert lp_ppa.processors assert type(lp_ppa.processors) is list assert [proc.name for proc in lp_ppa.processors] == expected_processors @pytest.mark.parametrize('params, expected_filename', [ ({}, 'credentials.oauth'), ({'credentials_filename': 'a'}, 'a'), ({'credentials_filename': '~/.x/creds.oauth'}, '~/.x/creds.oauth'), ]) def test_command_credentials(fake_config, params, expected_filename): """Check that credentials command saves LP creds to file.""" lp = LpServiceMock() config = {**fake_config, **params} assert script.command_credentials(lp, config) == 0 lp.credentials.save_to_path.assert_called_once() @pytest.mark.xfail(reason="Unimplemented") def test_command_desc(fake_config): lp = LpServiceMock() assert script.command_desc(lp, fake_config) == 0 # TODO: Assert that if --dry-run specified, there are no actual # changes requested of launchpad # TODO: Verify the description gets set as expected @pytest.mark.xfail(reason="Unimplemented") def test_command_destroy(fake_config): lp = LpServiceMock() # TODO: Create a fake ppa to be destroyed assert script.command_destroy(lp, fake_config) == 0 # TODO: Verify the ppa is requested to be deleted @pytest.mark.xfail(reason="Unimplemented") def test_command_list(fake_config): lp = LpServiceMock() # TODO: Create a fake ppa with contents to be listed assert script.command_list(lp, fake_config) == 0 # TODO: Verify the ppa addresses get listed @pytest.mark.xfail(reason="Unimplemented") def test_command_exists(fake_config): lp = LpServiceMock() # TODO: Create fake ppa that exists assert script.command_exists(lp, fake_config) == 0 # TODO: Verify this returns true when the ppa does exist @pytest.mark.xfail(reason="Unimplemented") def test_command_not_exists(fake_config): lp = LpServiceMock() # TODO: Verify this returns true when the ppa does not exist assert script.command_exists(lp, fake_config) == 1 @pytest.mark.parametrize('params, expected_ppa_config', [ ({'displayname': 'a'}, {'displayname': 'a'}), ({'description': 'a'}, {'description': 'a'}), ({}, {'publish': True}), ({'publish': False}, {'publish': False}), ({'publish': True}, {'publish': True}), ({}, {'private': False}), ({'private': False}, {'private': False}), ({'private': True}, {'private': True}), ]) def test_command_set(fake_config, params, expected_ppa_config): '''Checks that the set command properly requests PPA configuration changes.''' lp = LpServiceMock() # Create a default PPA, for modification later owner = lp.people[fake_config['owner_name']] owner.createPPA(fake_config['ppa_name'], 'x', 'y') # Check success of the set command config = {**fake_config, **params} assert script.command_set(lp, config) # Retrieve the PPA we created earlier lp_ppa = owner.getPPAByName(fake_config['ppa_name']) # Verify the expected items are present in the updated PPA for key, value in expected_ppa_config.items(): assert getattr(lp_ppa, key) == value @pytest.mark.parametrize('architectures, expected_processors', [ (None, ARCHES_PPA_DEFAULT), ('a', ['a']), ('a,b,c', ['a', 'b', 'c']), ('a, b, c', ['a', 'b', 'c']), ('amd64,arm64,armhf,i386,powerpc,ppc64el,s390x', ["amd64", "arm64", "armhf", "i386", "powerpc", "ppc64el", "s390x"]), ]) def test_command_set_architectures(fake_config, architectures, expected_processors): '''Checks that existing PPAs can have their architectures changed.''' lp = LpServiceMock() # Create a default PPA, for modification later owner = lp.people[fake_config['owner_name']] owner.createPPA(fake_config['ppa_name'], 'x', 'y') # Check success of the set command config = {**fake_config, **{'architectures': architectures}} assert script.command_set(lp, config) # Retrieve the PPA we created earlier lp_ppa = owner.getPPAByName(fake_config['ppa_name']) # Check processor architectures assert lp_ppa.processors assert type(lp_ppa.processors) is list assert [proc.name for proc in lp_ppa.processors] == expected_processors @pytest.mark.xfail(reason="Unimplemented") def test_command_show(fake_config): lp = LpServiceMock() assert script.command_show(lp, fake_config) == 0 @pytest.mark.parametrize('params, pubs, format, expected_in_stdout', [ ( # General behavior { 'releases': None, 'architectures': 'amd64', 'show_urls': True }, [('x', '1', 'Published', 'jammy')], 'plain', 'arch=amd64&trigger=x%2F1&ppa=me%2Ftesting' ), ( # Specified release { 'releases': 'focal', 'architectures': 'amd64', 'show_urls': True }, [ ('x', '3.2.1', 'Published', 'jammy'), ('x', '1.2.3', 'Published', 'focal'), ('x', '1.0.0', 'Published', 'bionic'), ], 'plain', 'arch=amd64&trigger=x%2F1.2.3&ppa=me%2Ftesting' ), ( # Default behavior should include ESM releases (LP: #2038651) { 'releases': None, 'architectures': 'amd64', 'show_urls': True }, [ ('x', '3.2.1', 'Published', 'jammy'), ('x', '1.2.3', 'Published', 'focal'), ('x', '1.0.0', 'Published', 'bionic'), ], 'plain', 'arch=amd64&trigger=x%2F1.0.0&ppa=me%2Ftesting' ), ]) @patch('urllib.request.urlopen') @patch('ppa.io.open_url') def test_command_tests(urlopen_mock, open_url_mock, fake_config, capfd, params, pubs, format, expected_in_stdout): '''Checks that the tests command retrieves and displays correct results.''' lp = LpServiceMock() urlopen_mock.return_value = "{}" Ppa.get_autopkgtest_running = lambda x, y, z: [] Ppa.get_autopkgtest_waiting = lambda x, y, z: [] # Create a default PPA, for modification later owner = lp.people[fake_config['owner_name']] owner.createPPA(fake_config['ppa_name'], 'x', 'y') the_ppa = lp.me.getPPAByName(fake_config['ppa_name']) # Add some fake publications for pub in pubs: the_ppa.published_sources.append(PublicationMock(*pub)) config = {**fake_config, **params} assert script.command_tests(lp, config) == 0 out, err = capfd.readouterr() assert expected_in_stdout in out @pytest.mark.xfail(reason="Unimplemented") def test_command_wait(fake_config): lp = LpServiceMock() # TODO: Set wait period to 1 sec assert script.command_wait(lp, fake_config) == 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1680649068.0 ppa_dev_tools-0.6.0/tests/test_source_package.py0000664000175000017500000000560014413125554021142 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2023 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. '''Tests SourcePackage as an interface to an Apt source package record.''' import os import sys import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.source_package import SourcePackage @pytest.mark.parametrize('pkg_dict, expected_repr, expected_str', [ ({'package': 'a', 'version': 'b', 'binary': 'c'}, "SourcePackage(pkg_dict={'package': 'a', 'version': 'b', 'binary': 'c'})", "a (b)", ), ]) def test_object(pkg_dict, expected_repr, expected_str): """Checks that SourcePackage objects can be instantiated.""" source_package = SourcePackage(pkg_dict) assert source_package assert repr(source_package) == expected_repr assert str(source_package) == expected_str @pytest.mark.parametrize('pkg_dict, expected_exception', [ ({}, ValueError), ({'package': 'x'}, ValueError), ({'version': 'x'}, ValueError), ({'binary': 'x'}, ValueError), ({'package': None, 'version': None, 'binary': None}, ValueError), ({'package': None, 'version': 'x', 'binary': 'x'}, ValueError), ({'package': 'x', 'version': None, 'binary': 'x'}, ValueError), ({'package': 'x', 'version': 'x', 'binary': None}, ValueError), ]) def test_object_error(pkg_dict, expected_exception): """Checks that SourcePackage objects can be instantiated.""" with pytest.raises(expected_exception): source_package = SourcePackage(pkg_dict) assert source_package @pytest.mark.parametrize('pkg_dict, expected_binaries', [ ({'package': 'x', 'version': 'x', 'binary': 'a, b, c'}, {'a': '', 'b': '', 'c': ''}), ({'package': 'dovecot', 'version': '1:2.3.19.1+dfsg1-2ubuntu4', 'binary': 'dovecot-core, dovecot-dev, dovecot-imapd, dovecot-pop3d, dovecot-lmtpd'}, {'dovecot-core': '', 'dovecot-dev': '', 'dovecot-imapd': '', 'dovecot-pop3d': '', 'dovecot-lmtpd': '', }), ]) def test_provides_binaries(pkg_dict, expected_binaries): """Checks that SourcePackage objects parse their Provides field.""" source_package = SourcePackage(pkg_dict) assert source_package.provides_binaries == expected_binaries @pytest.mark.parametrize('pkg_dict, expected_build_dependencies', [ ({'package': 'x', 'version': 'x', 'binary': '', 'build-depends': 'a, b, c [x]'}, {'a': '', 'b': '', 'c': '[x]'}), ]) def test_build_dependencies(pkg_dict, expected_build_dependencies): """Checks that SourcePackage objects parse BuildDepends field.""" source_package = SourcePackage(pkg_dict) assert source_package.build_dependencies == expected_build_dependencies ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1716327749.0 ppa_dev_tools-0.6.0/tests/test_subtest.py0000664000175000017500000000650714623212505017663 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Subtest class tests.""" import os import sys import json import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.subtest import Subtest def test_object(): """Checks that Subtest objects can be instantiated.""" subtest = Subtest('a UNKNOWN') # TODO: If no ':' in description, should throw exception? # TODO: Or add a function that parses lines and returns subtests? assert subtest def test_repr(): """Checks Subtest object representation.""" subtest = Subtest('a PASS') assert repr(subtest) == "Subtest(line='a PASS')" def test_str(): """Checks Subtest object textual presentation.""" subtest = Subtest('a PASS') assert 'PASS' in f"{subtest}" assert 'a' in f"{subtest}" assert '🟩' in f"{subtest}" def test_to_dict(): """Checks Subtest object structural representation.""" subtest = Subtest('a PASS') expected_keys = ['desc', 'line', 'status', 'status_icon'] expected_types = [str] d = subtest.to_dict() assert isinstance(d, dict), f"type of d is {type(d)} not dict" # Verify expected keys are present assert sorted(d.keys()) == sorted(expected_keys) # Verify values are within set of expected types for k, v in d.items(): assert type(v) in expected_types, f"'{k}={v}' is unexpected type {type(v)}" # Verify full dict can be written as JSON try: assert json.dumps(d) except UnicodeDecodeError as e: assert False, f"Wrong UTF codec detected: {e}" except json.JSONDecodeError as e: assert False, f"JSON decoding error: {e.msg}, {e.doc}, {e.pos}" def test_desc(): """Checks Subtest description is parsed correctly.""" subtest = Subtest('a PASS') assert subtest.desc == 'a' subtest = Subtest('a FAIL descriptive text') assert subtest.desc == 'a' subtest = Subtest('a:b PASS') assert subtest.desc == 'a:b' @pytest.mark.parametrize('line, status', [ ('a PASS', 'PASS'), ('b SKIP', 'SKIP'), ('c FAIL', 'FAIL'), ('d FAIL non-zero exit status 123', 'FAIL'), ('librust-clang-sys-dev:clang_10_0 FAIL non-zero exit status 101', 'FAIL'), ('librust-clang-sys-dev:static FLAKY non-zero exit status 101', 'FLAKY'), ('f BAD', 'BAD'), ('g UNKNOWN', 'UNKNOWN'), ('h invalid', 'UNKNOWN'), ('i bAd', 'UNKNOWN'), ]) def test_status(line, status): """Checks Subtest status is parsed correctly.""" subtest = Subtest(line) assert subtest.status == status subtest = Subtest('a PASS') @pytest.mark.parametrize('line, icon', [ ('x PASS', "🟩"), ('x SKIP', "🟧"), ('x FAIL', "🟄"), ('x FLAKY', "🟫"), ('x BAD', "ā›”"), ('x UNKNOWN', "⚪"), ('x invalid', "⚪"), ('x bAd', "⚪"), ]) def test_status_icon(line, icon): """Checks Subtest provides correct icon for status. :param str line: Subtest status line to be parsed. :param str icon: Resulting status icon that should be returned. """ subtest = Subtest(line) assert subtest.status_icon == icon ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1683034943.0 ppa_dev_tools-0.6.0/tests/test_suite.py0000664000175000017500000005462314424211477017333 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2023 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. # pylint: disable=protected-access,line-too-long """Tests the Suite class as an interface to Apt suite records.""" import os import sys import lzma as xz import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), '..'))) from ppa.suite import Suite from ppa.source_package import SourcePackage from ppa.binary_package import BinaryPackage @pytest.mark.parametrize('suite_name, cache_dir, expected_repr, expected_str', [ ('x', '/tmp', "Suite(suite_name='x', cache_dir='/tmp')", "x"), ('a-1', '/tmp', "Suite(suite_name='a-1', cache_dir='/tmp')", "a-1"), ('b-2', '/tmp', "Suite(suite_name='b-2', cache_dir='/tmp')", "b-2"), ]) def test_object(suite_name, cache_dir, expected_repr, expected_str): """Checks that Suite objects can be instantiated.""" suite = Suite(suite_name, cache_dir) assert suite assert repr(suite) == expected_repr assert str(suite) == expected_str @pytest.mark.parametrize('suite_name, cache_dir, expected_exception', [ ('x', '', ValueError), ('', 'x', ValueError), ('x', 'x', FileNotFoundError), ('', '', ValueError), ('a-1', None, ValueError), (None, 'x', ValueError), (None, None, ValueError), ]) def test_object_error(suite_name, cache_dir, expected_exception): """Checks that Suite objects handle invalid input properly.""" with pytest.raises(expected_exception): suite = Suite(suite_name, cache_dir) assert suite @pytest.mark.parametrize('release_contents, expected_info', [ ('a: 1', {'a': '1'}), (""" Origin: Ubuntu Label: Ubuntu Suite: lunar Version: 23.04 Codename: lunar Date: Tue, 28 Feb 2023 19:49:32 UTC Architectures: amd64 arm64 armhf i386 ppc64el riscv64 s390x Components: main restricted universe multiverse Description: Ubuntu Lunar 23.04 """, { 'Suite': 'lunar', 'Codename': 'lunar', 'Architectures': 'amd64 arm64 armhf i386 ppc64el riscv64 s390x', 'Components': 'main restricted universe multiverse', }), (""" Origin: Ubuntu Label: Ubuntu Suite: lunar-proposed Version: 23.04 Codename: lunar Date: Tue, 28 Feb 2023 19:50:27 UTC Architectures: amd64 arm64 armhf i386 ppc64el riscv64 s390x Components: main restricted universe multiverse Description: Ubuntu Lunar Proposed NotAutomatic: yes ButAutomaticUpgrades: yes MD5Sum: 7de6b7c0ed6b4bfb662e07fbc449dfdd 148112816 Contents-amd64 """, { 'Suite': 'lunar-proposed', 'Codename': 'lunar', 'NotAutomatic': 'yes' }), ]) def test_info(tmp_path, release_contents, expected_info): """Checks the parsing of info loaded from the Release file.""" # Create Release file using release_contents in synthetic tree suite_dir = tmp_path / 'x' suite_dir.mkdir() release_file = suite_dir / 'Release' release_file.write_text(release_contents) suite = Suite(suite_dir.name, suite_dir) # Verify the expected items are present in the suite's info dict for key, value in expected_info.items(): assert key in suite.info.keys() assert suite.info[key] == value @pytest.mark.parametrize('info, expected_series_codename', [ ({'Suite': 'x'}, 'x'), ({'Suite': 'x-y'}, 'x'), ({'Suite': 'lunar'}, 'lunar'), ({'Suite': 'lunar-proposed'}, 'lunar'), ({'Suite': 'focal-security'}, 'focal'), ]) def test_series_codename(monkeypatch, info, expected_series_codename): """Checks the codename is extracted properly from the suite name.""" suite = Suite('x', '/tmp') # Substitute in our fake test info in place of Suite's info() routine monkeypatch.setattr(Suite, "info", info) assert suite.series_codename == expected_series_codename @pytest.mark.parametrize('info, expected_pocket', [ ({'Suite': 'x'}, 'release'), ({'Suite': 'x-backports'}, 'backports'), ({'Suite': 'lunar'}, 'release'), ({'Suite': 'lunar-proposed'}, 'proposed'), ({'Suite': 'focal-security'}, 'security'), ]) def test_pocket(monkeypatch, info, expected_pocket): """Checks the pocket is extracted properly from the suite name.""" suite = Suite('x', '/tmp') # Substitute in our fake test info in place of Suite's info() routine monkeypatch.setattr(Suite, "info", info) assert suite.pocket == expected_pocket @pytest.mark.parametrize('info, expected_architectures', [ ({'Architectures': 'x y z'}, ['x', 'y', 'z']), ({'Architectures': 'x y z'}, ['x', 'y', 'z']), ({'Architectures': 'amd64 arm64 armhf i386 ppc64el riscv64 s390x'}, ['amd64', 'arm64', 'armhf', 'i386', 'ppc64el', 'riscv64', 's390x']), ]) def test_architectures(monkeypatch, info, expected_architectures): """Checks that the architecture list is parsed from the info dict.""" suite = Suite('x', '/tmp') # Substitute in our fake test info in place of Suite's info() routine monkeypatch.setattr(Suite, "info", info) assert sorted(suite.architectures) == sorted(expected_architectures) @pytest.mark.parametrize('suite_name, component_paths, expected_components', [ ('a-1', ['a-1/main', 'a-1/universe', 'a-1/multiverse'], ['main', 'universe', 'multiverse']), ('a-1', ['a-1/main', 'b-1/universe', 'c-1/multiverse'], ['main']), ('a-1', ['a-1/main', 'a-1/main/y', 'c-1/multiverse/x'], ['main']), ('x', ['x/main', 'x/restricted', 'x/universe', 'x/multiverse'], ['main', 'restricted', 'universe', 'multiverse']), ]) def test_components(tmp_path, suite_name, component_paths, expected_components): """Checks that the components are read from the Apt directory tree. The repository could have multiple suites (b-1, c-1, ...) so we specify that we're just looking for the components in @param suite_name. """ # Stub in suite's directory structure with component subdirs for component_path in component_paths: component_dir = tmp_path / component_path component_dir.mkdir(parents=True) suite = Suite(suite_name, tmp_path / suite_name) assert sorted(suite.components) == sorted(expected_components) @pytest.mark.parametrize('sources_contents, expected_sources', [ ('Package: a\nVersion: b\nBinary: c', {'a': SourcePackage({'Package': 'a', 'Version': 'b', 'Binary': 'c'})}), (""" Package: aalib Version: Binary: Package: abseil Version: Binary: Package: accountsservice Version: Binary: Package: acct Version: Binary: """, { 'aalib': SourcePackage({'Package': 'aalib', 'Version': '', 'Binary': ''}), 'abseil': SourcePackage({'Package': 'abseil', 'Version': '', 'Binary': ''}), 'accountsservice': SourcePackage({'Package': 'accountsservice', 'Version': '', 'Binary': ''}), 'acct': SourcePackage({'Package': 'acct', 'Version': '', 'Binary': ''}), }), (""" Package: libsigc++-2.0 Format: 3.0 (quilt) Binary: libsigc++-2.0-0v5, libsigc++-2.0-dev, libsigc++-2.0-doc Architecture: any all Version: 2.12.0-1 Priority: optional Section: devel Maintainer: Debian GNOME Maintainers Uploaders: Jeremy Bicha , Michael Biebl Standards-Version: 4.6.1 Build-Depends: debhelper-compat (= 13), dh-sequence-gnome, docbook-xml, docbook-xsl, doxygen, graphviz, libxml2-utils , meson (>= 0.50.0), mm-common (>= 1.0.0), python3-distutils, xsltproc Homepage: https://libsigcplusplus.github.io/libsigcplusplus/ Vcs-Browser: https://salsa.debian.org/gnome-team/libsigcplusplus Vcs-Git: https://salsa.debian.org/gnome-team/libsigcplusplus.git Directory: pool/main/libs/libsigc++-2.0 Package-List: libsigc++-2.0-0v5 deb libs optional arch=any libsigc++-2.0-dev deb libdevel optional arch=any libsigc++-2.0-doc deb doc optional arch=all Files: 23feb2cc5036384f94a3882c760a7eb4 2336 libsigc++-2.0_2.12.0-1.dsc 8685af8355138b1c48a6cd032e395303 163724 libsigc++-2.0_2.12.0.orig.tar.xz d60ca8c15750319f52d3b7eaeb6d99e1 10800 libsigc++-2.0_2.12.0-1.debian.tar.xz Checksums-Sha1: 81840b1d39dc48350de207566c86b9f1ea1e22d2 2336 libsigc++-2.0_2.12.0-1.dsc f66e696482c4ff87968823ed17b294c159712824 163724 libsigc++-2.0_2.12.0.orig.tar.xz a699c88f7c91157af4c5cdd0f4d0ddebeea9092e 10800 libsigc++-2.0_2.12.0-1.debian.tar.xz """, # noqa: E501 { 'libsigc++-2.0': SourcePackage({ 'Package': 'libsigc++-2.0', 'Version': '2.12.0-1', 'Binary': 'libsigc++-2.0-0v5, libsigc++-2.0-dev, libsigc++-2.0-doc', }), }), ]) def test_sources(tmp_path, sources_contents, expected_sources): """Checks that the source packages are read from the Apt record. We don't care about the SourcePackage object itself (the value in @param expected_sources is just a placeholder), but need to ensure the Sources.xz file is read and the expected list of packages parsed out of it. """ # Create Sources.xz file using sources_contents in synthetic tree suite_dir = tmp_path / 'x' suite_dir.mkdir() component_dir = suite_dir / 'main' component_dir.mkdir() arch_dir = component_dir / 'source' arch_dir.mkdir() sources_file = arch_dir / 'Sources.xz' sources_file.write_bytes(xz.compress(str.encode(sources_contents))) # Create the suite to wrapper our path and access Sources.xz suite = Suite(suite_dir.name, suite_dir) assert sorted(suite.sources) == sorted(expected_sources) @pytest.mark.parametrize('architectures, packages_contents, expected_binaries', [ (['x'], 'Package: a\nVersion:\nArchitecture: x', {'a:x': BinaryPackage({'Package': 'a', 'Version': '', 'Architecture': ''})}), (['amd64'], """ Package: aalib Version: Architecture: Package: abseil Version: Architecture: Package: accountsservice Version: Architecture: Package: acct Version: Architecture: """, { 'aalib:amd64': BinaryPackage({'Package': 'aalib', 'Version': '', 'Architecture': ''}), 'abseil:amd64': BinaryPackage({'Package': 'abseil', 'Version': '', 'Architecture': ''}), 'accountsservice:amd64': BinaryPackage({'Package': 'accountsservice', 'Version': '', 'Architecture': ''}), 'acct:amd64': BinaryPackage({'Package': 'acct', 'Version': '', 'Architecture': ''}), }), (['amd64'], """ Package: accountsservice Architecture: amd64 Version: 22.08.8-1ubuntu4 Priority: optional Section: gnome Origin: Ubuntu Maintainer: Ubuntu Developers Original-Maintainer: Debian freedesktop.org maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebug Installed-Size: 504 Depends: dbus (>= 1.9.18), libaccountsservice0 (= 22.08.8-1ubuntu4), libc6 (>= 2.34), libglib2.0-0 (>= 2.63.5), libpolkit-gobject-1-0 (>= 0.99) Recommends: default-logind | logind Suggests: gnome-control-center Filename: pool/main/a/accountsservice/accountsservice_22.08.8-1ubuntu4_amd64.deb Size: 68364 MD5sum: a10447714f0ce3c5f607b7b27c0f9299 SHA1: 252482d8935d16b7fc5ced0c88819eeb7cad6c65 SHA256: 4e341a8e288d8f8f9ace6cf90a1dcc3211f06751d9bec3a68a6c539b0c711282 SHA512: eb91e21b4dfe38e9768e8ca50f30f94298d86f07e78525ab17df12eb3071ea21cfbdc2ade3e48bd4e22790aa6ce3406bb10fbd17d8d668f84de1c8adeee249cb Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/ Description: query and manipulate user account information Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-desktop-raspi, ubuntu-wsl, kubuntu-desktop, xubuntu-minimal, xubuntu-desktop, lubuntu-desktop, ubuntustudio-desktop-core, ubuntustudio-desktop, ubuntukylin-desktop, ubuntu-mate-core, ubuntu-mate-desktop, ubuntu-budgie-desktop, ubuntu-budgie-desktop-raspi, ubuntu-unity-desktop, edubuntu-desktop-minimal, edubuntu-desktop, edubuntu-desktop-raspi, edubuntu-wsl Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e """, { # noqa: E501 'accountsservice:amd64': BinaryPackage({ 'Package': 'accountsservice', 'Version': '', 'Architecture': 'amd64' }) }), ( ['amd64', 'arm64', 'armhf', 'i386', 'ppc64el', 'riscv64', 's390x'], 'Package: libsigc++-2.0\nVersion:\nArchitecture: amd64 arm64 armhf i386 ppc64el riscv64 s390x\n', { 'libsigc++-2.0:amd64': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'amd64'}), 'libsigc++-2.0:arm64': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'arm64'}), 'libsigc++-2.0:armhf': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'armhf'}), 'libsigc++-2.0:i386': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'i386'}), 'libsigc++-2.0:ppc64el': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'ppc64el'}), 'libsigc++-2.0:riscv64': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 'riscv64'}), 'libsigc++-2.0:s390x': BinaryPackage({ 'Package': 'libsigc++-2.0', 'Version': '', 'Architecture': 's390x'}), }, ), ]) def test_binaries(tmp_path, architectures, packages_contents, expected_binaries): """Checks that the binary packages are read from the Apt record. We don't care about the BinaryPackage (the value) itself, just that the package name and arch are registered correctly, and that typical Packages.xz files are processed as intended. """ suite_dir = tmp_path / 'x' suite_dir.mkdir() release_file = suite_dir / 'Release' release_file.write_text(f'Architectures: {" ".join(architectures)}') component_dir = suite_dir / 'main' component_dir.mkdir() for arch in architectures: arch_dir = component_dir / f'binary-{arch}' arch_dir.mkdir() packages_file = arch_dir / 'Packages.xz' packages_file.write_bytes(xz.compress(str.encode(packages_contents))) # Create the suite to wrapper our path and access Packages.xz suite = Suite(suite_dir.name, suite_dir) assert sorted(suite.binaries.keys()) == sorted(expected_binaries.keys()) @pytest.mark.parametrize('sources, expected_rdepends, expected_provides', [ ({}, [], []), ( {'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Build-Depends': 'a', 'Binary': 'x'})}, ['a'], ['x'] ), ( {'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Build-Depends': 'a, b, c', 'Binary': 'x'})}, ['a', 'b', 'c'], ['x'] ), ( { 'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Binary': 'a1'}), 'b': SourcePackage({'Package': 'b', 'Version': 'x', 'Build-Depends': 'a1', 'Binary': 'b1'}), 'c': SourcePackage({'Package': 'c', 'Version': 'x', 'Build-Depends': 'a1, b1', 'Binary': 'c1'}), }, ['a1', 'b1'], ['a1', 'b1', 'c1'] ), ( {'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Binary': 'a'})}, [], ['a']), ( {'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Binary': 'a, b, c'})}, [], ['a', 'b', 'c'] ), ( { 'dovecot': SourcePackage( { 'Package': 'dovecot', 'Version': '1:2.3.19.1+dfsg1-2ubuntu4', 'Binary': 'dovecot-core, dovecot-dev, dovecot-imapd, dovecot-pop3d, dovecot-lmtpd, dovecot-managesieved, dovecot-pgsql, dovecot-mysql, dovecot-sqlite, dovecot-ldap, dovecot-gssapi, dovecot-sieve, dovecot-solr, dovecot-lucene, dovecot-submissiond, dovecot-auth-lua', # noqa: E501 'Architecture': 'any', 'Build-Depends': 'debhelper-compat (= 13), default-libmysqlclient-dev, krb5-multidev, libapparmor-dev [linux-any], libbz2-dev, libcap-dev [linux-any], libclucene-dev, libdb-dev, libexpat-dev, libexttextcat-dev, libicu-dev, libldap2-dev, liblua5.3-dev, liblz4-dev, liblzma-dev, libpam0g-dev, libpq-dev, libsasl2-dev, libsodium-dev, libsqlite3-dev, libssl-dev, libstemmer-dev, libsystemd-dev [linux-any], libunwind-dev [amd64 arm64 armel armhf hppa i386 ia64 mips mips64 mips64el mipsel powerpc powerpcspe ppc64 ppc64el sh4], libwrap0-dev, libzstd-dev, lsb-release, pkg-config, zlib1g-dev', # noqa: E501 'Testsuite-Triggers': 'lsb-release, python3, systemd-sysv', } ) }, [ 'debhelper-compat', 'default-libmysqlclient-dev', 'krb5-multidev', 'libapparmor-dev', 'libbz2-dev', 'libcap-dev', 'libclucene-dev', 'libdb-dev', 'libexpat-dev', 'libexttextcat-dev', 'libicu-dev', 'libldap2-dev', 'liblua5.3-dev', 'liblz4-dev', 'liblzma-dev', 'libpam0g-dev', 'libpq-dev', 'libsasl2-dev', 'libsodium-dev', 'libsqlite3-dev', 'libssl-dev', 'libstemmer-dev', 'libsystemd-dev', 'libunwind-dev', 'libwrap0-dev', 'libzstd-dev', 'lsb-release', 'pkg-config', 'zlib1g-dev', ], [ 'dovecot-core', 'dovecot-dev', 'dovecot-imapd', 'dovecot-pop3d', 'dovecot-lmtpd', 'dovecot-managesieved', 'dovecot-pgsql', 'dovecot-mysql', 'dovecot-sqlite', 'dovecot-ldap', 'dovecot-gssapi', 'dovecot-sieve', 'dovecot-solr', 'dovecot-lucene', 'dovecot-submissiond', 'dovecot-auth-lua', ] ), ]) def test_rebuild_tables(monkeypatch, sources, expected_rdepends, expected_provides): """Checks generation of the internal lookup tables for provides and rdepends.""" monkeypatch.setattr(Suite, "sources", sources) # Verify provides and rdepends table are as expected suite = Suite('x', '/tmp') suite._rebuild_lookup_tables() assert sorted(suite._rdepends_table.keys()) == sorted(expected_rdepends) assert sorted(suite._provides_table.keys()) == sorted(expected_provides) def test_rebuild_tables_mapping(monkeypatch): """Checks the mapping of rdepends to provides in the generated tables. The two lookup tables are essential to the rdepends test functionality since they define the mappings between various source package provides and depends. This test builds a synthetic collection of source packages, generates the tables, and then verifies the tables can be used to lookup the appropriate related packages. For purposes of this test, we assume each source package provides binaries of the same name appended with either '1' or '2'. Also, note that the packages are set up with a circular dependency (a depends on c, but c depends on a). This is an unhealthy situation for an archive to be in, but it certainly does happen in the wild. We're just setting it up that way for convenience since we can then assume all provided binaries will be required by something in the archive. """ sources = { 'a': SourcePackage({'Package': 'a', 'Version': 'x', 'Build-Depends': 'c1', 'Binary': 'a1'}), 'b': SourcePackage({'Package': 'b', 'Version': 'x', 'Build-Depends': 'a1, c2', 'Binary': 'b1'}), 'c': SourcePackage({'Package': 'c', 'Version': 'x', 'Build-Depends': 'a1, b1', 'Binary': 'c1, c2'}), } monkeypatch.setattr(Suite, "sources", sources) suite = Suite('x', '/tmp') suite._rebuild_lookup_tables() # Check the integrity of the lookup tables for the sources we gave it for source in sources.values(): # Verify our dependency is satisfied by a SourcePackage in the collection for dependency in source.build_dependencies: assert dependency in suite._provides_table package = suite._provides_table[dependency] assert isinstance(package, SourcePackage) assert dependency in [f"{package.name}1", f"{package.name}2"] # Verify SourcePackages that depend on us can be located for binary in source.provides_binaries: assert binary in suite._rdepends_table for package in suite._rdepends_table[binary]: assert isinstance(package, SourcePackage) assert binary in package.build_dependencies @pytest.mark.parametrize('sources_dict, source_package_name, expected_packages', [ pytest.param( [{'Package': 'a', 'Version': 'x', 'Binary': 'a1'}], 'a', [], marks=pytest.mark.xfail(reason='Does not handle undefined build-depends'), ), pytest.param( [{'Package': 'a', 'Version': 'x', 'Build-Depends': None, 'Binary': 'a1'}], 'a', [], marks=pytest.mark.xfail(reason='Does not handle undefined build-depends'), ), pytest.param( [{'Package': 'a', 'Version': 'x', 'Build-Depends': '', 'Binary': 'a1'}], 'a', [], marks=pytest.mark.xfail(reason='Does not handle undefined build-depends'), ), ( [ {'Package': 'a', 'Version': 'x', 'Build-Depends': 'b1', 'Binary': 'a1'}, {'Package': 'b', 'Version': 'x', 'Build-Depends': 'a1', 'Binary': 'b1'}, {'Package': 'c', 'Version': 'x', 'Build-Depends': 'b1', 'Binary': 'c1'}, ], 'a', ['b'], ), ( [ {'Package': 'a', 'Version': 'x', 'Build-Depends': 'd1', 'Binary': 'a1'}, {'Package': 'b', 'Version': 'x', 'Build-Depends': 'a1', 'Binary': 'b1'}, {'Package': 'c', 'Version': 'x', 'Build-Depends': 'b1', 'Binary': 'c1, c2'}, {'Package': 'd', 'Version': 'x', 'Build-Depends': 'a1, b1, c2', 'Binary': 'd1'}, ], 'd', ['a'], ), ]) def test_dependent_packages(monkeypatch, sources_dict, source_package_name, expected_packages): '''Checks that dependent_packages() returns the right packages to test. This member function is the main API for looking up what packages should have autopkgtests run, triggered against our desired package. ''' sources = {pkg['Package']: SourcePackage(pkg) for pkg in sources_dict} monkeypatch.setattr( Suite, "sources", sources ) suite = Suite('x', '/tmp') source_package = sources[source_package_name] assert sorted(suite.dependent_packages(source_package)) == expected_packages ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1666823941.0 ppa_dev_tools-0.6.0/tests/test_text.py0000664000175000017500000000244414326333405017155 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. import os import sys import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) import ppa.text @pytest.mark.parametrize('input, expected', [ ('true', True), ('t', True), ('yes', True), ('y', True), ('1', True), ('false', False), ('f', False), ('no', False), ('n', False), ('0', False), ('', False), (1, True), (0, False), (1.0, True), (0.0, False), ((), False), ((1,), True), (None, False), (object(), True), ]) def test_to_bool(input, expected): """Check that the given input produces the expected true/false result. :param * input: Any available type to be converted to boolean. :param bool expected: The True or False result to expect. """ assert ppa.text.to_bool(input) == expected def test_ansi_hyperlink(): """Check that text can be linked with a url.""" assert ppa.text.ansi_hyperlink("xxx", "yyy") == "\u001b]8;;xxx\u001b\\yyy\u001b]8;;\u001b\\" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1712962647.0 ppa_dev_tools-0.6.0/tests/test_trigger.py0000664000175000017500000001536414606336127017646 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2022 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. """Trigger class tests.""" import os import sys import json import pytest sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa.trigger import Trigger, get_triggers, show_triggers def test_object(): """Checks that Trigger objects can be instantiated.""" trigger = Trigger('a', 'b', 'c', 'd', 'e') assert trigger @pytest.mark.parametrize('pkg, ver, arch, series, ppa, testpkg, expected_repr', [ ('a', 'b', 'c', 'd', 'e', 'f', "Trigger(package='a', version='b', arch='c', series='d', ppa='e', test_package='f')"), ('a', 'b', 'c', 'd', 'e', None, "Trigger(package='a', version='b', arch='c', series='d', ppa='e', test_package='a')"), ]) def test_repr(pkg, ver, arch, series, ppa, testpkg, expected_repr): """Checks Trigger object representation.""" trigger = Trigger(pkg, ver, arch, series, ppa, testpkg) assert repr(trigger) == expected_repr def test_str(): """Checks Trigger object textual presentation.""" trigger = Trigger('a', 'b', 'c', 'd', 'e') assert f"{trigger}" == 'a/b' trigger = Trigger('dovecot', '1:2.3.19.1+dfsg1-2ubuntu2', 'i386', 'kinetic', None) assert f"{trigger}" == 'dovecot/1:2.3.19.1+dfsg1-2ubuntu2' def test_to_dict(): """Checks Trigger object structural representation.""" trigger = Trigger('a', 'b', 'c', 'd', 'e') expected_keys = [ 'package', 'version', 'test_package', 'arch', 'series', 'ppa' ] expected_types = [str] d = trigger.to_dict() assert isinstance(d, dict), f"type of d is {type(d)} not dict" # Verify expected keys are present assert sorted(d.keys()) == sorted(expected_keys) # Verify values are within set of expected types for k, v in d.items(): assert type(v) in expected_types, f"'{k}={v}' is unexpected type {type(v)}" # Verify full dict can be written as JSON try: assert json.dumps(d) except UnicodeDecodeError as e: assert False, f"Wrong UTF codec detected: {e}" except json.JSONDecodeError as e: assert False, f"JSON decoding error: {e.msg}, {e.doc}, {e.pos}" @pytest.mark.parametrize('trigger, expected', [ ( Trigger('a', 'b', 'c', 'd', 'e'), "/packages/a/a/d/c" ), ( Trigger('apache2', '2.4', 'amd64', 'kinetic', None), "/packages/a/apache2/kinetic/amd64" ), ( Trigger('libwebsockets', '4.1.6-3', 'armhf', 'jammy', None), "/packages/libw/libwebsockets/jammy/armhf" ) ]) def test_history_url(trigger, expected): """Checks that Trigger objects generate valid autopkgtest history urls.""" assert expected in trigger.history_url @pytest.mark.parametrize('trigger, expected', [ ( Trigger('a', 'b', 'c', 'd', 'e'), "/request.cgi?release=d&package=a&arch=c&trigger=a%2Fb&ppa=e" ), ( Trigger('a', '1.2+git345', 'c', 'd', None), "/request.cgi?release=d&package=a&arch=c&trigger=a%2F1.2%2Bgit345" ), ( Trigger('apache2', '2.4', 'amd64', 'kinetic', None), "/request.cgi?release=kinetic&package=apache2&arch=amd64&trigger=apache2%2F2.4" ), ( Trigger('nut', '2.7.4-1', 'armhf', 'jammy', None), "/request.cgi?release=jammy&package=nut&arch=armhf&trigger=nut%2F2.7.4-1" ), ( Trigger('apache2', '2.4', 'amd64', 'kinetic', 'ppa:aaa/bbb'), "/request.cgi?release=kinetic&package=apache2&arch=amd64&trigger=apache2%2F2.4&ppa=ppa%3Aaaa%2Fbbb" ), ( Trigger('apache2', '2.4', 'amd64', 'kinetic', 'ppa:aaa/bbb', 'cinder'), "/request.cgi?release=kinetic&package=cinder&arch=amd64&trigger=apache2%2F2.4&ppa=ppa%3Aaaa%2Fbbb" ) ]) def test_action_url(trigger, expected): """Checks that Trigger objects generate valid autopkgtest action urls.""" assert expected in trigger.action_url @pytest.mark.parametrize('params, expected', [ ( ['a', 'b', 'c', 'd', ['x', 'y', 'z'], ['1', '2', '3']], [ Trigger('a', 'b', 'x', 'd', 'c', ['1', '2', '3']), Trigger('a', 'b', 'y', 'd', 'c', ['1', '2', '3']), Trigger('a', 'b', 'z', 'd', 'c', ['1', '2', '3']), ], ), ]) def test_get_triggers(params, expected): """Checks that Trigger objects get generated properly from inputs.""" for trigger in get_triggers(*params): assert repr(trigger) in [repr(t) for t in expected] @pytest.mark.parametrize('triggers, params, expected_in_stdout', [ ( # Basic function parameters, no triggers [], {'package': 'pkg', 'version': '123', 'status': 'OK'}, [" - Source \x1b]8;;https://launchpad.net/ubuntu/+source/pkg/123\x1b\\pkg/123\x1b]8;;\x1b\\: OK\n"] ), ( # Specified trigger (clickable) [('pkg', '123', 'i386')], {'show_trigger_urls': False}, [ "&trigger=pkg%2F123&ppa=z\x1b\\Trigger basic @i386ā™»ļø \x1b]8;;\x1b", "&trigger=pkg%2F123&ppa=z&all-proposed=1\x1b\\Trigger all-proposed @i386šŸ’\x1b]8;;\x1b\\\n" ] ), ( # Specified trigger (display plain URLs) [('pkg', '123', 'i386')], {'show_trigger_urls': True}, [ "&trigger=pkg%2F123&ppa=zā™»ļø \n", "&trigger=pkg%2F123&ppa=z&all-proposed=1šŸ’\n" ] ), ( # Display names of packages in trigger lines [('pkg', '123', 'i386')], {'show_trigger_names': True}, ["Trigger basic x@i386ā™»ļø ", "Trigger all-proposed x@i386šŸ’"] ), ( # Omit package names if specified [('pkg', '123', 'i386')], {'show_trigger_names': False}, ["Trigger basic @i386", "Trigger all-proposed @i386"] ), ( # Display names of packages in trigger lines when trigger URLs are shown [('pkg', '123', 'i386')], {'show_trigger_urls': True, 'show_trigger_names': True}, ["x@i386: https:", "trigger=pkg%2F123"] ), ( # Multiple triggers [('pkg', '123', 'i386'), ('lib', '321', 'i386')], {'show_trigger_urls': True}, ["trigger=pkg%2F123", "trigger=lib%2F321"] ), ]) def test_show_triggers(capfd, triggers, params, expected_in_stdout): params.setdefault('package', 'x') params.setdefault('version', '1.x') params.setdefault('triggers', []) params.setdefault('status', 'x') for t in triggers: params['triggers'].append(Trigger(t[0], t[1], t[2], 'y', 'z', 'x')) show_triggers(**params) out, err = capfd.readouterr() print(out) for text in expected_in_stdout: assert text in out ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1666823941.0 ppa_dev_tools-0.6.0/tests/test_version.py0000664000175000017500000000167614326333405017664 0ustar00brycebryce#!/usr/bin/env python3 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- # Author: Bryce Harrington # # Copyright (C) 2019 Bryce W. Harrington # # Released under GNU GPLv2 or later, read the file 'LICENSE.GPLv2+' for # more information. import os import sys sys.path.insert(0, os.path.realpath( os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."))) from ppa._version import __version__, __version_info__ def test_version(): """Checks that the __version__ is specified correctly.""" assert type(__version__) is str assert '.' in __version__ assert __version__[0].isdigit() assert __version__[-1] != '.' def test_version_info(): """Checks that the __version_info__ is specified correctly.""" assert type(__version_info__) is tuple assert len(__version_info__) > 1 for elem in __version_info__: assert type(elem) is int assert elem >= 0