Package: adduser
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 686
Maintainer: Debian Adduser Developers <adduser@packages.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 3.134
Depends: passwd
Suggests: liblocale-gettext-perl, perl, cron, quota
Conffiles:
 /etc/adduser.conf cc3493ecd2d09837ffdcc3e25fdfff18
 /etc/deluser.conf 11a06baf8245fd8d690b99024d228c1f
Description: add and remove users and groups
 This package includes the 'adduser' and 'deluser' commands for creating
 and removing users.
 .
  - 'adduser' creates new users and groups and adds existing users to
    existing groups;
  - 'deluser' removes users and groups and removes users from a given
    group.
 .
 Adding users with 'adduser' is much easier than adding them manually.
 'Adduser' will choose UID and GID values that conform to Debian policy,
 create a home directory, copy skeletal user configuration, and
 automate setting initial values for the user's password, real name
 and so on.
 .
 'Deluser' can back up and remove users' home directories
 and mail spool or all the files they own on the system.
 .
 A custom script can be executed after each of the commands.
 .
 'Adduser' and 'Deluser' are intended to be used by the local
 administrator in lieu of the tools from the 'useradd' suite, and
 they provide support for easy use from Debian package maintainer
 scripts, functioning as kind of a policy layer to make those scripts
 easier and more stable to write and maintain.

Package: apparmor
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 2567
Maintainer: Debian AppArmor Team <pkg-apparmor-team@lists.alioth.debian.org>
Architecture: amd64
Version: 3.0.8-3
Replaces: fcitx-data (<< 1:4.2.9.1-1ubuntu2)
Depends: debconf, 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~)
Conffiles:
 /etc/apparmor.d/abi/3.0 f97e410509c5def279aa227c7de12e06
 /etc/apparmor.d/abi/kernel-5.4-outoftree-network 57b68acd4e6418fe5a06dc8c04713e3d
 /etc/apparmor.d/abi/kernel-5.4-vanilla 77047e6f0b014fa8bf27681998382044
 /etc/apparmor.d/abstractions/X e08b3a65c568c19b5922de1db3df0d92
 /etc/apparmor.d/abstractions/apache2-common b33a994a5406661304a5e2659e7b5f35
 /etc/apparmor.d/abstractions/apparmor_api/change_profile 4e10aac635b960dd6a2a94330d9dc4ce
 /etc/apparmor.d/abstractions/apparmor_api/examine db7f9bf417820acdfc4c6386c749582d
 /etc/apparmor.d/abstractions/apparmor_api/find_mountpoint 0380ddf9878be96962df2e81dc74f867
 /etc/apparmor.d/abstractions/apparmor_api/introspect ca4db5b278f4c08892c2ef7027495051
 /etc/apparmor.d/abstractions/apparmor_api/is_enabled ca0172ca6c89703ff9d8f4bc50998ddc
 /etc/apparmor.d/abstractions/aspell f8676bccab5b82b0b6d723549b3a1a83
 /etc/apparmor.d/abstractions/audio b45b7ef3c54e5e824157b0030c34ce1c
 /etc/apparmor.d/abstractions/authentication b3238cd14352633630d980a6e3b43613
 /etc/apparmor.d/abstractions/base ddee3a30c093993c33287bef194807c9
 /etc/apparmor.d/abstractions/bash bc217483455477e1431f9e0b14fe2caf
 /etc/apparmor.d/abstractions/consoles bea9fc84b0a5d025b0baa2012fb5f187
 /etc/apparmor.d/abstractions/crypto c735eefc509d328d994c9935fdd72dac
 /etc/apparmor.d/abstractions/cups-client b34dde998ba9e2008a449b7e806b4e8a
 /etc/apparmor.d/abstractions/dbus a940df2475b2aadae7f0f352426ac0eb
 /etc/apparmor.d/abstractions/dbus-accessibility 26e593998ef58a443df94b30c462969c
 /etc/apparmor.d/abstractions/dbus-accessibility-strict 373b1eb5eab3ed798b87b63f395e59ec
 /etc/apparmor.d/abstractions/dbus-network-manager-strict 2faa81c15df866984bbefe675dd7c535
 /etc/apparmor.d/abstractions/dbus-session aae714455fab265eeaf1b6a8e347895a
 /etc/apparmor.d/abstractions/dbus-session-strict 92b0802aa074d2fa736e6a34fb21dae6
 /etc/apparmor.d/abstractions/dbus-strict 40f5d3c55ee978c6741d4d489357661c
 /etc/apparmor.d/abstractions/dconf 7c1eb2f1eb19d459e86f262c0e682107
 /etc/apparmor.d/abstractions/dovecot-common dc5a9e349cdac4d77aa883777c523c5a
 /etc/apparmor.d/abstractions/dri-common 82e78cab7a0b877758d8d6a3dce1f50d
 /etc/apparmor.d/abstractions/dri-enumerate 94c00f262a2e2ecc567417dd655bf06b
 /etc/apparmor.d/abstractions/enchant 4b0d599339d403df6444e116f3b49095
 /etc/apparmor.d/abstractions/exo-open c02b86d89bdf4954faecdc39bbe8da40
 /etc/apparmor.d/abstractions/fcitx a272b0bc5d085b59eafdb3e91662ce1a
 /etc/apparmor.d/abstractions/fcitx-strict ae494d8b71f3074ce9ae46d08c895113
 /etc/apparmor.d/abstractions/fonts 8594bed8b12b8b8d531c9614a2e03b75
 /etc/apparmor.d/abstractions/freedesktop.org 20d29d43d5f9040dd034b842f7119297
 /etc/apparmor.d/abstractions/gio-open e1170caef97ca7544f73394db5f29fd6
 /etc/apparmor.d/abstractions/gnome 8f952820da814db21fb3664b0ec572c5
 /etc/apparmor.d/abstractions/gnupg 28bb447b06d329b9a0307fa3957738a9
 /etc/apparmor.d/abstractions/gtk ab9e908a770d69cedd3804bbaca3cb60
 /etc/apparmor.d/abstractions/gvfs-open 75e1db87e189996c93b7f6a54898027d
 /etc/apparmor.d/abstractions/hosts_access 77d68b32a830118794977e7d9685e41e
 /etc/apparmor.d/abstractions/ibus 3ccdcd8334042d7abc1691235d14a0e8
 /etc/apparmor.d/abstractions/kde 40da8726c9a51c68a0c865e588ddc74e
 /etc/apparmor.d/abstractions/kde-globals-write aa5efc180fc7f48e257e3a745525bb10
 /etc/apparmor.d/abstractions/kde-icon-cache-write 0fe4c3bfdccd6098242ac94efb132a13
 /etc/apparmor.d/abstractions/kde-language-write f6419d3ec59c4f72af6ff62c85e6b50f
 /etc/apparmor.d/abstractions/kde-open5 719648196aaa5921cbbee56884ed0a0a
 /etc/apparmor.d/abstractions/kerberosclient 9eec8b4b7751bfc24c7527366652332b
 /etc/apparmor.d/abstractions/ldapclient 2d5fbb27b438f3a723af1bd0ec6589cc
 /etc/apparmor.d/abstractions/libpam-systemd 54f5c7966013802550bcd298093356a8
 /etc/apparmor.d/abstractions/likewise 5b5adaa576726b606437def545b213d9
 /etc/apparmor.d/abstractions/mdns 97550547e53831aed4566fe0412f7fae
 /etc/apparmor.d/abstractions/mesa b7521344335439370fe52982eeb0082a
 /etc/apparmor.d/abstractions/mir c04cae04705882b43888b8bdad39ab7c
 /etc/apparmor.d/abstractions/mozc 51778ed730a4ad9d06ad39a848f98ae3
 /etc/apparmor.d/abstractions/mysql d0220787933388d0a1ee1e641ecdeb8d
 /etc/apparmor.d/abstractions/nameservice 111503b5f2db97e4fa92cdcacda09b87
 /etc/apparmor.d/abstractions/nis 42d818438562ff0a7d21566c52bdf373
 /etc/apparmor.d/abstractions/nss-systemd e51b32af03e4b39ad223a921fc08daf2
 /etc/apparmor.d/abstractions/nvidia 32f9a5a22b46bcd4696f42d3c1004a99
 /etc/apparmor.d/abstractions/opencl 390dd92d75c06bf01a0b380fa279816f
 /etc/apparmor.d/abstractions/opencl-common eddad0564696b2ecab52f34c4cb0bf44
 /etc/apparmor.d/abstractions/opencl-intel 5a07573a7082eb6906c62707415f86b7
 /etc/apparmor.d/abstractions/opencl-mesa d847b3acc2ba5df53309564428b32c5e
 /etc/apparmor.d/abstractions/opencl-nvidia 7a28b9490805d8d885c118004584fd63
 /etc/apparmor.d/abstractions/opencl-pocl 45de7095b4df796a2a49a1f50bc6af83
 /etc/apparmor.d/abstractions/openssl eebb603cd3a947c952ae9e7b2a21176a
 /etc/apparmor.d/abstractions/orbit2 3243686cfb77b2eb8ddf4dd9b1dacf51
 /etc/apparmor.d/abstractions/p11-kit 66b3abf2da8bd45e868a97a8b5c1c2de
 /etc/apparmor.d/abstractions/perl 831a9730e6f5901c26e7370e72d6e4ca
 /etc/apparmor.d/abstractions/php a13c99b453937ad35123f7f06b081920
 /etc/apparmor.d/abstractions/php-worker d63894f8faa7f2f4fe6616f9aa6c66fa
 /etc/apparmor.d/abstractions/php5 349438200b0b1be7b44f44d2a8edb2d8
 /etc/apparmor.d/abstractions/postfix-common 43269973845c1185a9a49dc989e46885
 /etc/apparmor.d/abstractions/private-files ed54f0bf093512ab1278415225bd7c76
 /etc/apparmor.d/abstractions/private-files-strict 863e1204a719f9d3ef434c51d10c9aae
 /etc/apparmor.d/abstractions/python 085157c119b1c08179d0df54243879a8
 /etc/apparmor.d/abstractions/qt5 82345ad67eb8610fd5416145758802b5
 /etc/apparmor.d/abstractions/qt5-compose-cache-write d9590e9a862c5475024675006bf2b0ad
 /etc/apparmor.d/abstractions/qt5-settings-write 08e907106f6afdd628ce7953d6804264
 /etc/apparmor.d/abstractions/recent-documents-write 8e878574cc41a1db88eadc9c2386a323
 /etc/apparmor.d/abstractions/ruby a376a4d9edd9b6e95196f04316846410
 /etc/apparmor.d/abstractions/samba b6013c9085d30556cb8c0ea682381f99
 /etc/apparmor.d/abstractions/samba-rpcd c2613f9459234e0fa6b37de3b5ddae5d
 /etc/apparmor.d/abstractions/smbpass 22d2a76d6718f69140430f2e4160a17c
 /etc/apparmor.d/abstractions/snap_browsers ca9d858751091cc53ea94370171fc7c8
 /etc/apparmor.d/abstractions/ssl_certs 2f3965aa2a66be11bc5acca29d3b303b
 /etc/apparmor.d/abstractions/ssl_keys 8610f0658edabc1b88a71676f0f5831b
 /etc/apparmor.d/abstractions/svn-repositories ff8e52c4e1962b96d234dd7a67f1d8f8
 /etc/apparmor.d/abstractions/ubuntu-bittorrent-clients d7c1be4622fa1a1a95cc710157495a8b
 /etc/apparmor.d/abstractions/ubuntu-browsers 4637c1d896dc3f2348636d216f57b12d
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/chromium-browser 153113ed58cd2b82ae59e3cf99e3df49
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/java 6e3557f9b8d6d7bfa53e5773a1d1701c
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/kde 079bbcda041f2ab3b28a0aa73e808779
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/mailto 2d485cfd81cbaa43ea61d754f937f722
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/multimedia 975af60c3988f0f29bc7650281add89d
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/plugins-common 109801b1eeb3215b1940302855106050
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/productivity f7141d1791df3cd70f1f1ffc598357de
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/text-editors 530a78215e8a637dee7df2dc06bef104
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/ubuntu-integration c36564692bd37edd33abe677b820aa0a
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/ubuntu-integration-xul 24a74fcfac9a35ff3213b5cf861f894b
 /etc/apparmor.d/abstractions/ubuntu-browsers.d/user-files 6a97ede75f91e3ffadd94c192b47d203
 /etc/apparmor.d/abstractions/ubuntu-console-browsers 449cc0ce0d1645dfe750bc59286f3ac4
 /etc/apparmor.d/abstractions/ubuntu-console-email 5df8527a131f6073c0105e55855921c2
 /etc/apparmor.d/abstractions/ubuntu-email 4ed454816879d62df7390b625196eef8
 /etc/apparmor.d/abstractions/ubuntu-feed-readers 652ddbb016d2970643ac0854be6afb7b
 /etc/apparmor.d/abstractions/ubuntu-gnome-terminal 4a73e5a52f0aa3155b3ce5ce3f0b88a1
 /etc/apparmor.d/abstractions/ubuntu-helpers 33dde905865b59b43bd830845e72b780
 /etc/apparmor.d/abstractions/ubuntu-konsole 49c45901c2aa6522869f6ecd11fc4885
 /etc/apparmor.d/abstractions/ubuntu-media-players 1cc28886d11782d036f5ad31c1fe6c0e
 /etc/apparmor.d/abstractions/ubuntu-unity7-base 76a91b15a0ac3045947dfb417f4be4e9
 /etc/apparmor.d/abstractions/ubuntu-unity7-launcher 71beb26198b3834a8cf87cb3958ce49e
 /etc/apparmor.d/abstractions/ubuntu-unity7-messaging d9524c849811152e7aaabfcac5bcd1ad
 /etc/apparmor.d/abstractions/ubuntu-xterm bed284d239d3fad55ec4138c1db49b1d
 /etc/apparmor.d/abstractions/user-download b0084d0cf20ab46c99a443d0bf4293e8
 /etc/apparmor.d/abstractions/user-mail 93afccf07c25a810459abb567bdf0ccd
 /etc/apparmor.d/abstractions/user-manpages 9f157582739dc69c3f2c092aa4cb76a2
 /etc/apparmor.d/abstractions/user-tmp 7adbf0673a8185216a529092e1bafe25
 /etc/apparmor.d/abstractions/user-write a35ac2aa74b253ad4d48c52d3e58e86c
 /etc/apparmor.d/abstractions/video cc02171362a3819ae3ec5e041afe46ef
 /etc/apparmor.d/abstractions/vulkan 6dc5c9c5fb65ea32f7dd3f20314fd9fe
 /etc/apparmor.d/abstractions/wayland 0dc88e01e40a1f7710cde25cf2d3e665
 /etc/apparmor.d/abstractions/web-data cb78fbb2953fa52805f371c166fd4fbd
 /etc/apparmor.d/abstractions/winbind 456c2a26ca32421ac44bd8924fbf55a8
 /etc/apparmor.d/abstractions/wutmp 5c2b39fe9978bb8b5e9637519c522c7f
 /etc/apparmor.d/abstractions/xad 4716a62377ebebbe55f0246c35591485
 /etc/apparmor.d/abstractions/xdg-desktop d0833b7462602d6008ad86a9ba724a1e
 /etc/apparmor.d/abstractions/xdg-open 79c6f5afd2a89b7fbc53d23cbba367ea
 /etc/apparmor.d/local/README e3739c14b4f8bb9b1934d7a4cdbf72c5
 /etc/apparmor.d/lsb_release 0909b9f0e2446fb21e6afa1819c213b0
 /etc/apparmor.d/nvidia_modprobe 89b64f211a74288347bd148f64a4623c
 /etc/apparmor.d/tunables/alias 45dca5dd72a6c862d27caa936e6c00ad
 /etc/apparmor.d/tunables/apparmorfs 99b56bc365d01a8d83cc60c359eb8184
 /etc/apparmor.d/tunables/dovecot 1b0d5ec63a9c87387142bdb2c94e7ede
 /etc/apparmor.d/tunables/etc e31a6ae15aa518bb5b826db5f6aaf9ff
 /etc/apparmor.d/tunables/global bf4f0b3b17bf1625879e7e90cbe7f8a7
 /etc/apparmor.d/tunables/home 7294038da607cb4310d40dc1cb89f398
 /etc/apparmor.d/tunables/home.d/site.local 3b274206fb06833ee3e151e351dad51b
 /etc/apparmor.d/tunables/kernelvars 5d30bf3c3c6e33927ba26784985ed8ab
 /etc/apparmor.d/tunables/multiarch b484327cecfb698fc83ac505699b255a
 /etc/apparmor.d/tunables/multiarch.d/site.local 3c9eef1fbfb41fc452060086262e7bcb
 /etc/apparmor.d/tunables/proc ffaa055ceb36031c973ffaece22a5fc0
 /etc/apparmor.d/tunables/run 780b70bb51fba582c115b085a962373b
 /etc/apparmor.d/tunables/securityfs 45d73edb5f03d141634ec6a5ba2b10f3
 /etc/apparmor.d/tunables/share a15f039c6615aa63acbec04b313f08f2
 /etc/apparmor.d/tunables/sys 30f2fdf4695c26642ea02b5a2063cfbc
 /etc/apparmor.d/tunables/xdg-user-dirs 6d1a4ea99a9af4cbab2255535a1c7077
 /etc/apparmor/parser.conf fb17692051e880a8bf1686326d188bbf
 /etc/init.d/apparmor 42e157dc91f6554abefa2160c2bc42db
Description: user-space parser utility for AppArmor
 apparmor provides the system initialization scripts needed to use the
 AppArmor Mandatory Access Control system, including the AppArmor Parser
 which is required to convert AppArmor text profiles into machine-readable
 policies that are loaded into the kernel for use with the AppArmor Linux
 Security Module.
Homepage: https://apparmor.net/

Package: apt
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 4232
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Version: 2.6.1
Replaces: apt-transport-https (<< 1.5~alpha4~), apt-utils (<< 1.3~exp2~)
Provides: apt-transport-https (= 2.6.1)
Depends: adduser, gpgv | gpgv2 | gpgv1, libapt-pkg6.0 (>= 2.6.1), debian-archive-keyring, libc6 (>= 2.34), libgcc-s1 (>= 3.0), 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)
Conffiles:
 /etc/apt/apt.conf.d/01autoremove 879455db9b938ce287b23383629aedce
 /etc/cron.daily/apt-compat 1400ab07a4a2905b04c33e3e93d42b7b
 /etc/logrotate.d/apt 179f2ed4f85cbaca12fa3d69c2a4a1c3
Description: commandline package manager
 This package provides commandline tools for searching and
 managing as well as querying information about packages
 as a low-level access to all features of the libapt-pkg library.
 .
 These include:
  * apt-get for retrieval of packages and information about them
    from authenticated sources and for installation, upgrade and
    removal of packages together with their dependencies
  * apt-cache for querying available information about installed
    as well as installable packages
  * apt-cdrom to use removable media as a source for packages
  * apt-config as an interface to the configuration settings
  * apt-key as an interface to manage authentication keys

Package: apt-listchanges
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 423
Maintainer: Debian QA Group <packages@qa.debian.org>
Architecture: all
Version: 3.24
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
Conffiles:
 /etc/apt/apt.conf.d/20listchanges 105aa4aeb0527308bf3a0c70151d7684
Description: package change history notification tool
 The tool apt-listchanges can compare a new version of a
 package with the one currently installed and show what has been
 changed, by extracting the relevant entries from the Debian changelog
 and NEWS files.
 .
 It can be run on several .deb archives at a time to get a list of all
 changes that would be caused by installing or upgrading a group of
 packages. When configured as an APT plugin it will do this
 automatically during upgrades.

Package: apt-transport-https
Status: install ok installed
Priority: optional
Section: oldlibs
Installed-Size: 35
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: apt
Version: 2.6.1
Depends: apt (>= 1.5~alpha4)
Description: transitional package for https support
 This is a dummy transitional package - https support has been moved into
 the apt package in 1.5. It can be safely removed.

Package: apt-utils
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 1037
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Source: apt
Version: 2.6.1
Depends: apt (= 2.6.1), libapt-pkg6.0 (>= 2.6.1), libc6 (>= 2.34), libdb5.3, libgcc-s1 (>= 3.0), libstdc++6 (>= 11)
Description: package management related utility programs
 This package contains some less used commandline utilities related
 to package management with APT.
 .
  * apt-extracttemplates is used by debconf to prompt for configuration
    questions before installation.
  * apt-ftparchive is used to create Packages and other index files
    needed to publish an archive of Debian packages
  * apt-sortpkgs is a Packages/Sources file normalizer.

Package: base-files
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 341
Maintainer: Santiago Vila <sanvila@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 12.4+deb12u11
Replaces: base, dpkg (<= 1.15.0), miscutils
Provides: base
Pre-Depends: awk
Breaks: debian-security-support (<< 2019.04.25), initscripts (<< 2.88dsf-13.3), sendfile (<< 2.1b.20080616-5.2~)
Conffiles:
 /etc/debian_version 8031d1483ffa9c819e6be94c6c77fd2a
 /etc/dpkg/origins/debian c47b6815f67ad1aeccb0d4529bd0b990
 /etc/host.conf 4eb63731c9f5e30903ac4fc07a7fe3d6
 /etc/issue 349d61a0e072d678e3e94923f0c3ce0e
 /etc/issue.net 3ae9b9ff69a78d614864f1957778fecb
 /etc/update-motd.d/10-uname 9e1b832b7b06f566156e7c9e0548247b
Description: Debian base system miscellaneous files
 This package contains the basic filesystem hierarchy of a Debian system, and
 several important miscellaneous files, such as /etc/debian_version,
 /etc/host.conf, /etc/issue, /etc/motd, /etc/profile, and others,
 and the text of several common licenses in use on Debian systems.

Package: base-passwd
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 247
Maintainer: Colin Watson <cjwatson@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 3.6.1
Replaces: base
Depends: libc6 (>= 2.34), libdebconfclient0 (>= 0.145), libselinux1 (>= 3.1~)
Recommends: debconf (>= 0.5) | debconf-2.0
Description: Debian base system master password and group files
 These are the canonical master copies of the user database files
 (/etc/passwd and /etc/group), containing the Debian-allocated user and
 group IDs. The update-passwd tool is provided to keep the system databases
 synchronized with these master files.

Package: bash
Essential: yes
Status: install ok installed
Priority: required
Section: shells
Installed-Size: 7164
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: bash (5.2.15-2)
Version: 5.2.15-2+b8
Replaces: bash-completion (<< 20060301-0), bash-doc (<= 2.05-1)
Depends: base-files (>= 2.1.12), debianutils (>= 5.6-0.1)
Pre-Depends: libc6 (>= 2.36), libtinfo6 (>= 6)
Recommends: bash-completion (>= 20060301-0)
Suggests: bash-doc
Conflicts: bash-completion (<< 20060301-0)
Conffiles:
 /etc/bash.bashrc 89269e1298235f1b12b4c16e4065ad0d
 /etc/skel/.bash_logout 22bfb8c1dd94b5f3813a2b25da67463f
 /etc/skel/.bashrc ee35a240758f374832e809ae0ea4883a
 /etc/skel/.profile f4e81ade7d6f9fb342541152d08e7a97
Description: GNU Bourne Again SHell
 Bash is an sh-compatible command language interpreter that executes
 commands read from the standard input or from a file.  Bash also
 incorporates useful features from the Korn and C shells (ksh and csh).
 .
 Bash is ultimately intended to be a conformant implementation of the
 IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
 .
 The Programmable Completion Code, by Ian Macdonald, is now found in
 the bash-completion package.
Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html

Package: bash-completion
Status: install ok installed
Priority: standard
Section: shells
Installed-Size: 1463
Maintainer: Gabriel F. T. Gomes <gabriel@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1:2.11-6
Provides: dh-sequence-bash-completion
Conffiles:
 /etc/bash_completion a81b3f1cb197219b815942f4fc7fa94e
 /etc/profile.d/bash_completion.sh 4257431f99f10e5fbe86b39b6b9e5002
Description: programmable completion for the bash shell
 bash completion extends bash's standard completion behavior to achieve
 complex command lines with just a few keystrokes.  This project was
 conceived to produce programmable completion routines for the most
 common Linux/UNIX commands, reducing the amount of typing sysadmins
 and programmers need to do on a daily basis.
Homepage: https://github.com/scop/bash-completion

Package: bind9-dnsutils
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 496
Maintainer: Debian DNS Team <team+dns@tracker.debian.org>
Architecture: amd64
Source: bind9
Version: 1:9.18.33-1~deb12u2
Provides: dnsutils
Depends: bind9-host | host, bind9-libs (= 1:9.18.33-1~deb12u2), libc6 (>= 2.34), libedit2 (>= 2.11-20080614-0), libidn2-0 (>= 2.0.0), libjemalloc2 (>= 3.5.0), libkrb5-3 (>= 1.6.dfsg.2), libprotobuf-c1 (>= 1.0.0)
Breaks: bind-dnsutils (<< 1:9.13.6~), dnsutils (<< 1:9.13.6~)
Conflicts: bind-dnsutils (<< 1:9.13.6~), dnsutils (<< 1:9.13.6~)
Description: Clients provided with BIND 9
 The Berkeley Internet Name Domain (BIND 9) implements an Internet domain
 name server.  BIND 9 is the most widely-used name server software on the
 Internet, and is supported by the Internet Software Consortium, www.isc.org.
 .
 This package delivers various client programs related to DNS that are
 derived from the BIND 9 source tree.
 .
  - dig - query the DNS in various ways
  - nslookup - the older way to do it
  - nsupdate - perform dynamic updates (See RFC2136)
Homepage: https://www.isc.org/downloads/bind/

Package: bind9-host
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 143
Maintainer: Debian DNS Team <team+dns@tracker.debian.org>
Architecture: amd64
Source: bind9
Version: 1:9.18.33-1~deb12u2
Replaces: bind-host (<< 1:9.13.6~)
Provides: host
Depends: bind9-libs (= 1:9.18.33-1~deb12u2), libc6 (>= 2.34), libidn2-0 (>= 2.0.0), libjemalloc2 (>= 3.5.0)
Breaks: bind-host (<< 1:9.13.6~)
Description: DNS Lookup Utility
 This package provides the 'host' DNS lookup utility in the form that
 is bundled with the BIND 9 sources.
Homepage: https://www.isc.org/downloads/bind/

Package: bind9-libs
Status: install ok installed
Priority: standard
Section: libs
Installed-Size: 3501
Maintainer: Debian DNS Team <team+dns@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: bind9
Version: 1:9.18.33-1~deb12u2
Replaces: bind-libs (<< 1:9.13.6~)
Depends: libuv1 (>= 1.40.0), libc6 (>= 2.34), libfstrm0 (>= 0.2.0), libgssapi-krb5-2 (>= 1.17), libjemalloc2 (>= 4.0.0), libjson-c5 (>= 0.15), libkrb5-3 (>= 1.6.dfsg.2), liblmdb0 (>= 0.9.7), libmaxminddb0 (>= 1.3.0), libnghttp2-14 (>= 1.12.0), libprotobuf-c1 (>= 1.0.1), libssl3 (>= 3.0.0), libxml2 (>= 2.7.4), zlib1g (>= 1:1.1.4)
Breaks: bind-libs (<< 1:9.13.6~)
Description: Shared Libraries used by BIND 9
 The Berkeley Internet Name Domain (BIND 9) implements an Internet domain
 name server.  BIND 9 is the most widely-used name server software on the
 Internet, and is supported by the Internet Software Consortium, www.isc.org.
 .
 This package contains a bundle of shared libraries used by BIND 9.
Homepage: https://www.isc.org/downloads/bind/

Package: binutils
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 109
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Version: 2.40-2
Provides: binutils-gold, elf-binutils
Depends: binutils-common (= 2.40-2), libbinutils (= 2.40-2), binutils-x86-64-linux-gnu (= 2.40-2)
Suggests: binutils-doc (>= 2.40-2)
Conflicts: binutils-mingw-w64-i686 (<< 2.23.52.20130612-1+3), binutils-mingw-w64-x86-64 (<< 2.23.52.20130612-1+3), binutils-multiarch (<< 2.27-8), modutils (<< 2.4.19-1)
Description: GNU assembler, linker and binary utilities
 The programs in this package are used to assemble, link and manipulate
 binary and object files.  They may be used in conjunction with a compiler
 and various libraries to build programs.
Homepage: https://www.gnu.org/software/binutils/

Package: binutils-common
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 15021
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: binutils
Version: 2.40-2
Replaces: binutils (<< 2.38.50.20220527-2), binutils-multiarch (<< 2.38.50.20220527-2)
Breaks: binutils (<< 2.38.50.20220527-2), binutils-multiarch (<< 2.38.50.20220527-2)
Conffiles:
 /etc/gprofng.rc d8f321679d2ce58b1399e4e6de17fcc9
Description: Common files for the GNU assembler, linker and binary utilities
 This package contains the localization files used by binutils packages for
 various target architectures and parts of the binutils documentation. It is
 not useful on its own.
Homepage: https://www.gnu.org/software/binutils/

Package: binutils-x86-64-linux-gnu
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 11428
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: binutils
Version: 2.40-2
Replaces: binutils (<< 2.29-6), binutils-dev (<< 2.38.50.20220609-2)
Depends: binutils-common (= 2.40-2), libbinutils (= 2.40-2), libc6 (>= 2.36), libctf-nobfd0 (>= 2.36), libctf0 (>= 2.36), libgcc-s1 (>= 4.2), libgprofng0 (>= 2.40-2), libjansson4 (>= 2.14), libstdc++6 (>= 5), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Suggests: binutils-doc (= 2.40-2)
Breaks: binutils (<< 2.29-6), binutils-dev (<< 2.38.50.20220609-2)
Description: GNU binary utilities, for x86-64-linux-gnu target
 This package provides GNU assembler, linker and binary utilities
 for the x86-64-linux-gnu target.
 .
 You don't need this package unless you plan to cross-compile programs
 for x86-64-linux-gnu and x86-64-linux-gnu is not your native platform.
Homepage: https://www.gnu.org/software/binutils/

Package: bsdextrautils
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 337
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Replaces: bsdmainutils (<< 12.1.3), nwrite
Depends: libc6 (>= 2.34), libsmartcols1 (>= 2.38), libtinfo6 (>= 6)
Breaks: bsdmainutils (<< 12.1.3), nwrite
Conflicts: nwrite
Description: extra utilities from 4.4BSD-Lite
 This package contains some extra BSD utilities: col, colcrt, colrm, column,
 hd, hexdump, look, ul and write.
 Other BSD utilities are provided by bsdutils and calendar.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: bsdutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 355
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux (2.38.1-5+deb12u3)
Version: 1:2.38.1-5+deb12u3
Pre-Depends: libc6 (>= 2.34), libsystemd0
Recommends: bsdextrautils
Description: basic utilities from 4.4BSD-Lite
 This package contains the bare minimum of BSD utilities needed for a Debian
 system: logger, renice, script, scriptlive, scriptreplay and wall. The
 remaining standard BSD utilities are provided by bsdextrautils.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: build-essential
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 20
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Version: 12.9
Depends: libc6-dev | libc-dev, gcc (>= 4:10.2), g++ (>= 4:10.2), make, dpkg-dev (>= 1.17.11)
Description: Informational list of build-essential packages
 If you do not plan to build Debian packages, you don't need this
 package.  Starting with dpkg (>= 1.14.18) this package is required
 for building Debian packages.
 .
 This package contains an informational list of packages which are
 considered essential for building Debian packages.  This package also
 depends on the packages on that list, to make it easy to have the
 build-essential packages installed.
 .
 If you have this package installed, you only need to install whatever
 a package specifies as its build-time dependencies to build the
 package.  Conversely, if you are determining what your package needs
 to build-depend on, you can always leave out the packages this
 package depends on.
 .
 This package is NOT the definition of what packages are
 build-essential; the real definition is in the Debian Policy Manual.
 This package contains merely an informational list, which is all
 most people need.   However, if this package and the manual disagree,
 the manual is correct.

Package: busybox
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 817
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: amd64
Source: busybox (1:1.35.0-4)
Version: 1:1.35.0-4+b4
Replaces: busybox-static
Depends: libc6 (>= 2.34)
Conflicts: busybox-static
Description: Tiny utilities for small and embedded systems
 BusyBox combines tiny versions of many common UNIX utilities into a single
 small executable. It provides minimalist replacements for the most common
 utilities you would usually find on your desktop system (i.e., ls, cp, mv,
 mount, tar, etc.). The utilities in BusyBox generally have fewer options than
 their full-featured GNU cousins; however, the options that are included
 provide the expected functionality and behave very much like their GNU
 counterparts.
 .
 This package installs the BusyBox binary but does not install
 symlinks for any of the supported utilities. Some of the utilities
 can be used in the system by installing the busybox-syslogd,
 busybox-udhcpc or busybox-udhcpd packages.
Homepage: http://www.busybox.net

Package: bzip2
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 121
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: bzip2 (1.0.8-5)
Version: 1.0.8-5+b1
Replaces: libbz2 (<< 0.9.5d-3)
Depends: libbz2-1.0 (= 1.0.8-5+b1), libc6 (>= 2.34)
Suggests: bzip2-doc
Description: high-quality block-sorting file compressor - utilities
 bzip2 is a freely available, patent free, data compressor.
 .
 bzip2 compresses files using the Burrows-Wheeler block-sorting text
 compression algorithm, and Huffman coding.  Compression is generally
 considerably better than that achieved by more conventional
 LZ77/LZ78-based compressors, and approaches the performance of the PPM
 family of statistical compressors.
 .
 The archive file format of bzip2 (.bz2) is incompatible with that of its
 predecessor, bzip (.bz).
Homepage: https://sourceware.org/bzip2/

Package: ca-certificates
Status: install ok installed
Priority: standard
Section: misc
Installed-Size: 387
Maintainer: Julien Cristau <jcristau@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 20230311+deb12u1
Depends: openssl (>= 1.1.1), debconf (>= 0.5) | debconf-2.0
Breaks: ca-certificates-java (<< 20121112+nmu1)
Enhances: openssl
Description: Common CA certificates
 Contains the certificate authorities shipped with Mozilla's browser to allow
 SSL-based applications to check for the authenticity of SSL connections.
 .
 Please note that Debian can neither confirm nor deny whether the
 certificate authorities whose certificates are included in this package
 have in any way been audited for trustworthiness or RFC 3647 compliance.
 Full responsibility to assess them belongs to the local system
 administrator.

Package: cifs-utils
Status: install ok installed
Priority: optional
Section: otherosfs
Installed-Size: 317
Maintainer: Debian Samba Maintainers <pkg-samba-maint@lists.alioth.debian.org>
Architecture: amd64
Version: 2:7.0-2
Replaces: smbfs (<< 2:4.0~rc1-1)
Depends: libc6 (>= 2.34), libcap-ng0 (>= 0.7.9), libgssapi-krb5-2 (>= 1.17), libkeyutils1 (>= 1.4), libkrb5-3 (>= 1.13~alpha1+dfsg), libpam0g (>= 0.99.7.1), libtalloc2 (>= 2.0.4~git20101213), libwbclient0 (>= 2:4.0.3+dfsg1), python3
Recommends: keyutils
Suggests: smbclient, winbind, bash-completion
Conffiles:
 /etc/request-key.d/cifs.idmap.conf 4c95734a68b45b65a5dc7b108836427b
 /etc/request-key.d/cifs.spnego.conf db5289bad3063aea58e1814380259a28
Description: Common Internet File System utilities
 The SMB/CIFS protocol provides support for cross-platform file sharing with
 Microsoft Windows, OS X, and other Unix systems.
 .
 This package provides utilities for managing mounts of CIFS network
 file systems.
Homepage: https://www.samba.org/~jlayton/cifs-utils/

Package: console-setup
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 428
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1.221
Depends: console-setup-linux | console-setup-freebsd | hurd, xkb-data (>= 0.9), keyboard-configuration (= 1.221), debconf (>= 0.5) | debconf-2.0
Pre-Depends: debconf | debconf-2.0
Suggests: lsb-base (>= 3.0-6), locales
Breaks: lsb (<< 2.0-6), lsb-base (<< 3.0-6), lsb-core (<< 2.0-6)
Conflicts: console-setup-mini
Description: console font and keymap setup program
 This package provides the console with the same keyboard
 configuration scheme as the X Window System. As a result, there is no
 need to duplicate or change the keyboard files just to make simple
 customizations such as the use of dead keys, the key functioning as
 AltGr or Compose key, the key(s) to switch between Latin and
 non-Latin mode, etc.
 .
 The package also installs console fonts supporting many of the
 world's languages.  It provides an unified set of font faces - the
 classic VGA, the simplistic Fixed, and the cleaned Terminus,
 TerminusBold and TerminusBoldVGA.

Package: console-setup-linux
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 2192
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: console-setup
Version: 1.221
Replaces: console-setup (<< 1.71), console-terminus
Provides: console-terminus
Depends: kbd (>= 0.99-12) | console-tools (>= 1:0.2.3-16), keyboard-configuration (= 1.221), init-system-helpers (>= 1.29~) | initscripts
Suggests: console-setup
Breaks: console-cyrillic (<= 0.9-11), console-setup (<< 1.71), console-terminus
Conflicts: console-setup-freebsd
Conffiles:
 /etc/console-setup/compose.ARMSCII-8.inc fef36b61fb8b1cacc151ad3db127f777
 /etc/console-setup/compose.CP1251.inc fef88d8c8dd4c726498003fd3cd84a7f
 /etc/console-setup/compose.CP1255.inc c972a2e90938657e97b643366b98b2ed
 /etc/console-setup/compose.CP1256.inc 5ea5e4d41da7a88f742863810e86144b
 /etc/console-setup/compose.GEORGIAN-ACADEMY.inc b6d80f40abff7e8af236796ebaca0247
 /etc/console-setup/compose.GEORGIAN-PS.inc cf45272b6bf35a22223b132600dc36c3
 /etc/console-setup/compose.IBM1133.inc a31102602f7e7cab9738022b6c5469ae
 /etc/console-setup/compose.ISIRI-3342.inc 5ada7fbba750192f11fa238add232ba9
 /etc/console-setup/compose.ISO-8859-1.inc f22c32b3b801b60434016c975b5fb66e
 /etc/console-setup/compose.ISO-8859-10.inc e5fce59617c839b56574c9e323d34686
 /etc/console-setup/compose.ISO-8859-11.inc ad2f3cc7ee64602a790bad8a2a989243
 /etc/console-setup/compose.ISO-8859-13.inc abbb4fb36d084295075305e33195bd4a
 /etc/console-setup/compose.ISO-8859-14.inc 3a7519688a9cee5d5f90a5f74b854490
 /etc/console-setup/compose.ISO-8859-15.inc 6fd4b1ba84bb627815f6119440e84906
 /etc/console-setup/compose.ISO-8859-16.inc 8245c19b5262d8d23ca856587739eb20
 /etc/console-setup/compose.ISO-8859-2.inc cd59fdcc7891012d905cdafd3704144a
 /etc/console-setup/compose.ISO-8859-3.inc 904839fe56359e4822667d241c131f3a
 /etc/console-setup/compose.ISO-8859-4.inc 414ddf28bfcc94a43191b134e264dfdd
 /etc/console-setup/compose.ISO-8859-5.inc f861a4b0403490677e6d400f2d7129da
 /etc/console-setup/compose.ISO-8859-6.inc 41ea36ea1c1a1c0c9bebdf0016395e1f
 /etc/console-setup/compose.ISO-8859-7.inc 83ee498d8b5eba5ce8ba593b3036f832
 /etc/console-setup/compose.ISO-8859-8.inc 9cceaa9f3312f89aba371d3c893f4e7b
 /etc/console-setup/compose.ISO-8859-9.inc 2df0be84482af83b9d3e124e9ea37513
 /etc/console-setup/compose.KOI8-R.inc b6a49ca842c8002b4e3de916f98d180e
 /etc/console-setup/compose.KOI8-U.inc d59865b46fcb821935da42feb335c1c5
 /etc/console-setup/compose.TIS-620.inc 31b73af83ef3993c128e2b983b9eaf89
 /etc/console-setup/compose.VISCII.inc edf0e2f7abd0de5184ba5c6d27939af6
 /etc/console-setup/remap.inc b72cfe32ffa93987f74c5cec9ac180fd
 /etc/init.d/console-setup.sh 6d5b1d0c7a12da4e4f70836fe3fec827
 /etc/init.d/keyboard-setup.sh 5746e83ec4ca1bda09967a00fe9266fb
Description: Linux specific part of console-setup
 This package includes fonts in psf format and definitions of various
 8-bit charmaps.

Package: coreutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 18062
Maintainer: Michael Stone <mstone@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 9.1-1
Pre-Depends: libacl1 (>= 2.2.23), libattr1 (>= 1:2.4.44), libc6 (>= 2.34), libgmp10 (>= 2:6.2.1+dfsg1), libselinux1 (>= 3.1~)
Description: GNU core utilities
 This package contains the basic file, shell and text manipulation
 utilities which are expected to exist on every operating system.
 .
 Specifically, this package includes:
 arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp
 csplit cut date dd df dir dircolors dirname du echo env expand expr
 factor false flock fmt fold groups head hostid id install join link ln
 logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt
 od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm
 rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac
 tail tee test timeout touch tr true truncate tsort tty uname unexpand
 uniq unlink users vdir wc who whoami yes
Homepage: http://gnu.org/software/coreutils

Package: cpio
Status: install ok installed
Priority: important
Section: utils
Installed-Size: 1141
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.13+dfsg-7.1
Replaces: cpio-mt
Depends: libc6 (>= 2.34)
Suggests: libarchive-dev
Conflicts: cpio-mt, mt-st (<< 0.6)
Description: GNU cpio -- a program to manage archives of files
 GNU cpio is a tool for creating and extracting archives, or copying
 files from one place to another.  It handles a number of cpio formats
 as well as reading and writing tar files.
Homepage: https://www.gnu.org/software/cpio/

Package: cpp
Status: install ok installed
Priority: optional
Section: interpreters
Installed-Size: 30
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: gcc-defaults (1.203)
Version: 4:12.2.0-3
Depends: cpp-12 (>= 12.2.0-1~)
Suggests: cpp-doc
Conflicts: cpp-doc (<< 1:2.95.3)
Description: GNU C preprocessor (cpp)
 The GNU C preprocessor is a macro processor that is used automatically
 by the GNU C compiler to transform programs before actual compilation.
 .
 This package has been separated from gcc for the benefit of those who
 require the preprocessor but not the compiler.
 .
 This is a dependency package providing the default GNU C preprocessor.

Package: cpp-12
Status: install ok installed
Priority: optional
Section: interpreters
Installed-Size: 33848
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.36), libgmp10 (>= 2:6.2.1+dfsg1), libisl23 (>= 0.15), libmpc3 (>= 1.1.0), libmpfr6 (>= 3.1.3), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Suggests: gcc-12-locales (>= 12), cpp-12-doc (>= 12)
Breaks: hardening-wrapper (<< 2.8+nmu3), libmagics++-dev (<< 2.28.0-4)
Description: GNU C preprocessor
 A macro processor that is used automatically by the GNU C compiler
 to transform programs before actual compilation.
 .
 This package has been separated from gcc for the benefit of those who
 require the preprocessor but not the compiler.
Homepage: http://gcc.gnu.org/

Package: cron
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 217
Maintainer: Javier Fernández-Sanguino Peña <jfs@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 3.0pl1-162
Replaces: bcron, cronie, systemd-cron
Provides: cron-daemon
Depends: libc6 (>= 2.34), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), sensible-utils, libpam-runtime
Pre-Depends: init-system-helpers (>= 1.54~), cron-daemon-common
Recommends: default-mta | mail-transport-agent
Suggests: anacron, logrotate, checksecurity
Conflicts: bcron, cronie, systemd-cron
Conffiles:
 /etc/default/cron eae0d979b5007d2af41540d8c2631359
 /etc/init.d/cron 4824366b523de668591f5b6e258c7043
 /etc/pam.d/cron 11e788a7f7cd5477b10da2c7fd5ecdf0
Description: process scheduling daemon
 The cron daemon is a background process that runs particular programs at
 particular times (for example, every minute, day, week, or month), as
 specified in a crontab. By default, users may also create crontabs of
 their own so that processes are run on their behalf.
 .
 Output from the commands is usually mailed to the system administrator
 (or to the user in question); you should probably install a mail system
 as well so that you can receive these messages.
 .
 This cron package does not provide any system maintenance tasks. Basic
 periodic maintenance tasks are provided by other packages, such
 as checksecurity.
Homepage: https://ftp.isc.org/isc/cron/

Package: cron-daemon-common
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 44
Maintainer: Javier Fernández-Sanguino Peña <jfs@debian.org>
Architecture: all
Source: cron
Version: 3.0pl1-162
Replaces: bcron (<< 0.11-9.1), cron (<< 3.0pl1-140), cronie (<< 1.6.1-5), systemd-cron (<< 1.15.18-1.1)
Depends: adduser
Breaks: systemd-cron (<< 1.15.19-5~)
Conflicts: bcron (<< 0.11-9.1), cron (<< 3.0pl1-140), cronie (<< 1.6.1-5), systemd-cron (<< 1.15.18-1.1)
Conffiles:
 /etc/cron.d/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/cron.daily/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/cron.hourly/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/cron.monthly/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/cron.weekly/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/cron.yearly/.placeholder e5e12910bf011222160404d7bdb824f2
 /etc/crontab db66112a5d1014af79fd8077170ddcfa
Description: process scheduling daemon's configuration files
 The cron daemon is a background process that runs particular programs at
 particular times (for example, every minute, day, week, or month), as
 specified in a crontab. By default, users may also create crontabs of
 their own so that processes are run on their behalf.
 .
 This package provides configuration files which must be there to
 define scheduled process sets.
Homepage: https://ftp.isc.org/isc/cron/

Package: curl
Status: install ok installed
Priority: optional
Section: web
Installed-Size: 489
Maintainer: Alessandro Ghedini <ghedo@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 7.88.1-10+deb12u12
Depends: libc6 (>= 2.34), libcurl4 (= 7.88.1-10+deb12u12), zlib1g (>= 1:1.1.4)
Description: command line tool for transferring data with URL syntax
 curl is a command line tool for transferring data with URL syntax, supporting
 DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3,
 POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
 .
 curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form
 based upload, proxies, cookies, user+password authentication (Basic, Digest,
 NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a
 busload of other useful tricks.
Homepage: https://curl.se/

Package: dash
Essential: yes
Status: install ok installed
Priority: required
Section: shells
Installed-Size: 191
Maintainer: Andrej Shadura <andrewsh@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 0.5.12-2
Depends: debianutils (>= 5.6-0.1), dpkg (>= 1.19.1)
Pre-Depends: libc6 (>= 2.34)
Description: POSIX-compliant shell
 The Debian Almquist Shell (dash) is a POSIX-compliant shell derived
 from ash.
 .
 Since it executes scripts faster than bash, and has fewer library
 dependencies (making it more robust against software or hardware
 failures), it is used as the default system shell on Debian systems.
Homepage: http://gondor.apana.org.au/~herbert/dash/

Package: dbus
Status: install ok installed
Priority: standard
Section: admin
Installed-Size: 182
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.14.10-1~deb12u1
Provides: dbus-system-bus (= 1.14.10-1~deb12u1), default-dbus-system-bus
Depends: dbus-bin (= 1.14.10-1~deb12u1), dbus-daemon (= 1.14.10-1~deb12u1), dbus-system-bus-common (>= 1.14.10-1~deb12u1), libc6 (>= 2.34), libdbus-1-3 (= 1.14.10-1~deb12u1), libexpat1 (>= 2.1~beta3), libsystemd0
Pre-Depends: init-system-helpers (>= 1.54~)
Suggests: default-dbus-session-bus | dbus-session-bus
Conffiles:
 /etc/default/dbus 0d0f25a2f993509c857eb262f6e22015
 /etc/init.d/dbus d78b20b35de983cf6f1475dcf8cb21a1
Description: simple interprocess messaging system (system message bus)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 D-Bus supports broadcast messages, asynchronous messages (thus
 decreasing latency), authentication, and more. It is designed to be
 low-overhead; messages are sent using a binary protocol, not using
 XML. D-Bus also supports a method call mapping for its messages, but
 it is not required; this makes using the system quite simple.
 .
 It comes with several bindings, including GLib, Python, Qt and Java.
 .
 This package provides a fully-functional D-Bus system bus with activation
 support, used for communication between system services, and depends on
 most of the other components of the reference implementation of D-Bus.
 .
 To provide a complete D-Bus session bus, install one of the packages
 that implement the dbus-session-bus virtual package, such as
 dbus-user-session. The recommended implementation is indicated by
 the default-dbus-session-bus virtual package.
Homepage: https://dbus.freedesktop.org/

Package: dbus-bin
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 213
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: dbus
Version: 1.14.10-1~deb12u1
Replaces: dbus (<< 1.13.18-2~)
Depends: libc6 (>= 2.34), libdbus-1-3 (= 1.14.10-1~deb12u1)
Breaks: dbus (<< 1.13.18-2~)
Description: simple interprocess messaging system (command line utilities)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 This package contains the D-Bus command-line utilities such as dbus-send
 and dbus-monitor.
Homepage: https://dbus.freedesktop.org/

Package: dbus-daemon
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 375
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: dbus
Version: 1.14.10-1~deb12u1
Replaces: dbus (<< 1.13.18-2~)
Depends: dbus-bin (= 1.14.10-1~deb12u1), dbus-session-bus-common (>= 1.14.10-1~deb12u1), libapparmor1 (>= 2.8.94), libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcap-ng0 (>= 0.7.9), libdbus-1-3 (= 1.14.10-1~deb12u1), libexpat1 (>= 2.1~beta3), libselinux1 (>= 3.1~), libsystemd0
Breaks: dbus (<< 1.13.18-2~)
Description: simple interprocess messaging system (reference message bus)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 This package contains dbus-daemon, the reference implementation of a
 D-Bus message bus, and dbus-run-session, a utility to start a temporary
 session dbus-daemon in a constrained environment or for automated tests.
 .
 To provide a complete D-Bus session bus, install one of the packages
 that implement the dbus-session-bus virtual package, such as
 dbus-user-session. The recommended implementation is indicated by
 the default-dbus-session-bus virtual package.
Homepage: https://dbus.freedesktop.org/

Package: dbus-session-bus-common
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 107
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: dbus
Version: 1.14.10-1~deb12u1
Replaces: dbus (<< 1.13.18-2~)
Breaks: dbus (<< 1.13.18-2~)
Description: simple interprocess messaging system (session bus configuration)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 This package contains the configuration files defining the behaviour of
 the D-Bus session bus, used for applications and per-user services.
 These are used by the reference implementation in the dbus package,
 and by the reimplementation in the dbus-broker package.
 .
 To provide a complete D-Bus session bus, install one of the packages
 that implement the dbus-session-bus virtual package, such as
 dbus-user-session. The recommended implementation is indicated by
 the default-dbus-session-bus virtual package.
Homepage: https://dbus.freedesktop.org/

Package: dbus-system-bus-common
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 119
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: dbus
Version: 1.14.10-1~deb12u1
Replaces: dbus (<< 1.13.18-2~)
Depends: adduser
Breaks: dbus (<< 1.13.18-2~)
Description: simple interprocess messaging system (system bus configuration)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 This package contains the configuration files defining the behaviour of
 the D-Bus system bus, used for system services such as networking and
 storage management services. It is also responsible for creating the
 'messagebus' system user account used to run the system bus.
 These are used by the reference implementation in the dbus package,
 and by the reimplementation in the dbus-broker package.
 .
 To provide a complete D-Bus system bus, install one of the packages
 that implement the dbus-system-bus virtual package, such as dbus.
 The recommended implementation is indicated by the default-dbus-system-bus
 virtual package.
Homepage: https://dbus.freedesktop.org/

Package: dbus-user-session
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 111
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: dbus
Version: 1.14.10-1~deb12u1
Provides: dbus-session-bus, default-dbus-session-bus
Depends: dbus-daemon (= 1.14.10-1~deb12u1) | dbus-broker, dbus-session-bus-common (>= 1.14.10-1~deb12u1), libpam-systemd, systemd
Recommends: systemd-sysv
Conffiles:
 /etc/X11/Xsession.d/20dbus_xdg-runtime f11c70d9f51a152cedf939d36ef038bf
Description: simple interprocess messaging system (systemd --user integration)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 On systemd systems, this package opts in to the session model in which
 a user's session starts the first time they log in, and does not end
 until all their login sessions have ended. This model merges all
 parallel non-graphical login sessions (text mode, ssh, cron, etc.), and up
 to one graphical session, into a single "user-session" or "super-session"
 within which all background D-Bus services are shared.
 .
 Multiple graphical sessions per user are not currently supported in this
 mode; as a result, it is particularly suitable for gdm, which responds to
 requests to open a parallel graphical session by switching to the existing
 graphical session and unlocking it.
 .
 To retain dbus' traditional session semantics, in which login sessions
 are artificially isolated from each other, remove this package and install
 dbus-x11 instead.
 .
 See the dbus package description for more information about D-Bus in general.
Homepage: https://dbus.freedesktop.org/

Package: debconf
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 491
Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1.5.82
Replaces: debconf-tiny
Provides: debconf-2.0
Recommends: apt-utils, debconf-i18n
Suggests: debconf-doc, debconf-kde-helper, debconf-utils, libgtk3-perl, libnet-ldap-perl, libterm-readline-gnu-perl, perl, whiptail | dialog
Conflicts: debconf-tiny, whiptail-utf8 (<= 0.50.17-13)
Conffiles:
 /etc/apt/apt.conf.d/70debconf 7e9d09d5801a42b4926b736b8eeabb73
 /etc/debconf.conf 8c0619be413824f1fc7698cee0f23811
Description: Debian configuration management system
 Debconf is a configuration management system for debian packages. Packages
 use Debconf to ask questions when they are installed.

Package: debconf-i18n
Status: install ok installed
Priority: important
Section: localization
Installed-Size: 805
Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org>
Architecture: all
Source: debconf
Version: 1.5.82
Depends: debconf (= 1.5.82), liblocale-gettext-perl, libtext-charwidth-perl, libtext-iconv-perl, libtext-wrapi18n-perl
Conflicts: debconf-english
Description: full internationalization support for debconf
 This package provides full internationalization for debconf, including
 translations into all available languages, support for using translated
 debconf templates, and support for proper display of multibyte character
 sets.

Package: debian-archive-keyring
Status: install ok installed
Priority: important
Section: misc
Installed-Size: 293
Maintainer: Debian Release Team <packages@release.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 2023.3+deb12u2
Conffiles:
 /etc/apt/trusted.gpg.d/debian-archive-bookworm-automatic.asc 55eec060916a9d4a0db7560ab4d7bdce
 /etc/apt/trusted.gpg.d/debian-archive-bookworm-security-automatic.asc bec0a1224f667bcd1e231b874db9bc4f
 /etc/apt/trusted.gpg.d/debian-archive-bookworm-stable.asc fac2ec9faba2c2d82c70a6e2805c5b79
 /etc/apt/trusted.gpg.d/debian-archive-bullseye-automatic.asc 1f30ce1ba8532d523017acb1a69c106a
 /etc/apt/trusted.gpg.d/debian-archive-bullseye-security-automatic.asc 9fbe7b0d8ebb38e240aeec6b0830ac7b
 /etc/apt/trusted.gpg.d/debian-archive-bullseye-stable.asc 85a4c0e5c747a38509b33562d4c950be
 /etc/apt/trusted.gpg.d/debian-archive-trixie-automatic.asc 556202307f6f23e343c1ba12790507be
 /etc/apt/trusted.gpg.d/debian-archive-trixie-security-automatic.asc f421db9e00d9a98c66c396b2a210f52c
 /etc/apt/trusted.gpg.d/debian-archive-trixie-stable.asc 91c5c0b4f6878239622087c64866c909
Description: GnuPG archive keys of the Debian archive
 The Debian project digitally signs its Release files. This package
 contains the archive keys used for that.

Package: debian-faq
Status: install ok installed
Priority: standard
Section: doc
Installed-Size: 790
Maintainer: Javier Fernandez-Sanguino Peña <jfs@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 11.1
Suggests: pdf-viewer, www-browser
Description: Debian Frequently Asked Questions
 In this package you will find the Debian GNU/Linux FAQ, which gives
 frequently asked questions (with their answers!) about the Debian distribution
 (Debian GNU/Linux and others) and about the Debian project.
 Some answers assume some knowledge of Unix-like operating systems.
 However, as little prior knowledge as possible is assumed: answers to general
 beginners questions will be kept simple.
 .
 This document is available at https://www.debian.org/doc/manuals/debian-faq/
 as well as from the Debian file server at https://deb.debian.org/debian/doc/FAQ
 and mirrors thereof.
 .
 The document is supplied in HTML, PDF, and plain text.
 .
 If you're new to Debian, and like to read documentation from your local system,
 without using the network, install this package.
Homepage: https://www.debian.org/doc/user-manuals#faq

Package: debianutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 243
Maintainer: Clint Adams <clint@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 5.7-0.5~deb12u1
Pre-Depends: libc6 (>= 2.34)
Breaks: ifupdown (<< 0.8.36+nmu1), printer-driver-pnm2ppa (<< 1.13-12), x11-common (<< 1:7.7+23~)
Description: Miscellaneous utilities specific to Debian
 This package provides a number of small utilities which are used
 primarily by the installation scripts of Debian packages, although
 you may use them directly.
 .
 The specific utilities included are:
 add-shell installkernel ischroot remove-shell run-parts savelog
 update-shells which

Package: dictionaries-common
Status: install ok installed
Priority: optional
Section: text
Installed-Size: 717
Maintainer: Agustin Martin Domingo <agmartin@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1.29.5
Replaces: openoffice.org-updatedicts
Provides: openoffice.org-updatedicts
Depends: debconf (>= 0.5) | debconf-2.0, libtext-iconv-perl, emacsen-common
Suggests: ispell | aspell | hunspell, wordlist
Breaks: myspell-ca (<= 0.6-10), myspell-cs-cz (<= 20040229-5), myspell-de-de-oldspell (<= 1:2-27), myspell-eu-es (<= 0.4.20081029-4), myspell-fi (<= 0.7-17.3), myspell-gl-es (<= 2.2a-8), myspell-ku (<= 0.20.0-1.1), myspell-nl (<= 1:2.0-1), myspell-nr (<< 20070206-4ubuntu1), myspell-ns (<< 20070206-4ubuntu1), myspell-sl (<< 1.0-3ubuntu1), myspell-ss (<< 20070206-4ubuntu1), myspell-tn (<< 20070206-4ubuntu1), myspell-ts (<< 20070207-4ubuntu1), myspell-ve (<< 20070206-3ubuntu1), myspell-xh (<< 20070206-4ubuntu1), myspell-zu (<< 20070207-5ubuntu1), openoffice.org-thesaurus-it (<< 2.0.7.gh.deb1-1.1ubuntu3)
Conffiles:
 /etc/emacs/site-start.d/50dictionaries-common.el 6e5295d702ddc90ac894acba3c2961b0
Description: spelling dictionaries - common utilities
 This package provides utilities shared between all wordlists and spelling
 dictionaries for Ispell, Aspell, or MySpell/Hunspell. It also includes
 support infrastructure for software using them (such as JED and Mutt),
 and some patched spell-checking Lisp files for better Emacs integration.
 .
 More information about the availability of these dictionaries and their
 naming conventions is available in the README.Debian file.
Homepage: https://salsa.debian.org/debian/dictionaries-common

Package: diffutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 1598
Maintainer: Santiago Vila <sanvila@debian.org>
Architecture: amd64
Version: 1:3.8-4
Replaces: diff
Pre-Depends: libc6 (>= 2.34)
Suggests: diffutils-doc, wdiff
Description: File comparison utilities
 The diffutils package provides the diff, diff3, sdiff, and cmp programs.
 .
 `diff' shows differences between two files, or each corresponding file
 in two directories.  `cmp' shows the offsets and line numbers where
 two files differ.  `cmp' can also show all the characters that
 differ between the two files, side by side.  `diff3' shows differences
 among three files.  `sdiff' merges two files interactively.
 .
 The set of differences produced by `diff' can be used to distribute
 updates to text files (such as program source code) to other people.
 This method is especially useful when the differences are small compared
 to the complete files.  Given `diff' output, the `patch' program can
 update, or "patch", a copy of the file.
Homepage: https://www.gnu.org/software/diffutils/

Package: dirmngr
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1328
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg2 (<< 2.1.10-2)
Depends: adduser, gpgconf (= 2.2.40-1.1), lsb-base (>= 3.2-13), init-system-helpers (>= 1.52), libassuan0 (>= 2.5.0), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgnutls30 (>= 3.7.5), libgpg-error0 (>= 1.42), libksba8 (>= 1.3.5), libldap-2.5-0 (>= 2.5.4), libnpth0 (>= 0.90)
Recommends: gnupg (= 2.2.40-1.1)
Suggests: dbus-user-session, libpam-systemd, pinentry-gnome3, tor
Breaks: gnupg2 (<< 2.1.10-2)
Enhances: gpg, gpgsm, squid
Description: GNU privacy guard - network certificate management service
 dirmngr is a server for managing and downloading OpenPGP and X.509
 certificates, as well as updates and status signals related to those
 certificates.  For OpenPGP, this means pulling from the public
 HKP/HKPS keyservers, or from LDAP servers.  For X.509 this includes
 Certificate Revocation Lists (CRLs) and Online Certificate Status
 Protocol updates (OCSP).  It is capable of using Tor for network
 access.
 .
 dirmngr is used for network access by gpg, gpgsm, and dirmngr-client,
 among other tools.  Unless this package is installed, the parts of
 the GnuPG suite that try to interact with the network will fail.
Homepage: https://www.gnupg.org/

Package: discover
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 98
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: amd64
Version: 2.1.2-10
Depends: libc6 (>= 2.4), libdiscover2 (= 2.1.2-10), debconf (>= 0.5) | debconf-2.0
Suggests: lsb-base
Conflicts: discover1 (<< 2.0)
Conffiles:
 /etc/discover-modprobe.conf 68df2d938e71f2723c42fce528070682
Description: hardware identification system
 Discover is a hardware identification system based on the libdiscover2
 library.  Discover provides a flexible interface that programs can
 use to report a wide range of information about the hardware that is
 installed on a Linux system.  In addition to reporting information,
 Discover includes support for doing hardware detection at boot time.

Package: discover-data
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 4281
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Version: 2.2013.01.13
Recommends: pciutils (>= 1:2.2.4)
Suggests: python3
Conflicts: libdiscover2 (<< 2.0.4-4)
Description: Data lists for Discover hardware detection system
 The Discover hardware detection library uses XML data files to describe
 software interfaces to various ATA, PCI, PMCMIA, SCSI, and USB devices.
 While the Discover library can retrieve data from anywhere on the net, it is
 often convenient to have a set of Discover XML data files on one's system;
 thus, this package.

Package: distro-info-data
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 18
Maintainer: Benjamin Drung <bdrung@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.58+deb12u4
Breaks: distro-info (<< 1.0~)
Description: information about the distributions' releases (data files)
 Information about all releases of Debian and Ubuntu. The distro-info script
 will give you the codename for e.g. the latest stable release of your
 distribution. To get information about a specific distribution there are the
 debian-distro-info and the ubuntu-distro-info scripts.
 .
 This package contains the data files.

Package: dmeventd
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 224
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Source: lvm2 (2.03.16-2)
Version: 2:1.02.185-2
Depends: libc6 (>= 2.34), libdevmapper-event1.02.1 (>= 2:1.02.110), libdevmapper1.02.1 (>= 2:1.02.110), liblvm2cmd2.03 (>= 2.03.16)
Description: Linux Kernel Device Mapper event daemon
 The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management)
 Team's implementation of a minimalistic kernel-space driver that handles
 volume management, while keeping knowledge of the underlying device layout
 in user-space.  This makes it useful for not only LVM, but software raid,
 and other drivers that create "virtual" block devices.
 .
 This package contains a daemon to monitor events of devmapper devices.
Homepage: https://sourceware.org/lvm2/

Package: dmidecode
Status: install ok installed
Priority: important
Section: utils
Installed-Size: 221
Maintainer: Jörg Frings-Fürst <debian@jff.email>
Architecture: amd64
Multi-Arch: foreign
Version: 3.4-1
Depends: libc6 (>= 2.33)
Description: SMBIOS/DMI table decoder
 Dmidecode reports information about the system's hardware as described in the
 system BIOS according to the SMBIOS/DMI standard.
 .
 This information typically includes system manufacturer, model name, serial
 number, BIOS version, asset tag as well as a lot of other details of varying
 level of interest and reliability depending on the manufacturer. This will
 often include usage status for the CPU sockets, expansion slots (e.g. AGP, PCI,
 ISA) and memory module slots, and the list of I/O ports (e.g. serial, parallel,
 USB).
 .
 Beware that DMI data have proven to be too unreliable to be blindly trusted.
 Dmidecode does not scan the hardware, it only reports what the BIOS told it to.
Homepage: https://nongnu.org/dmidecode/

Package: dmsetup
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 246
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: lvm2 (2.03.16-2)
Version: 2:1.02.185-2
Depends: libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.181)
Description: Linux Kernel Device Mapper userspace library
 The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management)
 Team's implementation of a minimalistic kernel-space driver that handles
 volume management, while keeping knowledge of the underlying device layout
 in user-space.  This makes it useful for not only LVM, but software raid,
 and other drivers that create "virtual" block devices.
 .
 This package contains a utility for modifying device mappings.
Homepage: https://sourceware.org/lvm2/

Package: doc-debian
Status: install ok installed
Priority: standard
Section: doc
Installed-Size: 187
Maintainer: Javier Fernández-Sanguino Peña <jfs@debian.org>
Architecture: all
Version: 11.3+nmu1
Recommends: debian-faq
Suggests: postscript-viewer, www-browser
Description: Debian Project documentation and other documents
 The Debian Project is an association of individuals who have made
 common cause to create a free operating system.
 .
 In this package, you will find:
   * Debian Linux Manifesto,
   * Constitution for the Debian Project,
   * Debian Social Contract,
   * Debian Free Software Guidelines.
 .
 Additionally provided are:
   * Debian Bug Tracking System documentation, and
   * Introduction to the Debian mailing lists.
 .
 All of these files are available at http://ftp.debian.org/debian/doc/ and
 mirrors thereof.

Package: dosfstools
Status: install ok installed
Priority: optional
Section: otherosfs
Installed-Size: 315
Maintainer: Andreas Bombe <aeb@debian.org>
Architecture: amd64
Version: 4.2-1
Depends: libc6 (>= 2.14)
Description: utilities for making and checking MS-DOS FAT filesystems
 The dosfstools package includes the mkfs.fat and fsck.fat utilities, which
 respectively make and check MS-DOS FAT filesystems.
Homepage: https://github.com/dosfstools/dosfstools

Package: dpkg
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 6409
Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.21.22
Depends: tar (>= 1.28-1)
Pre-Depends: libbz2-1.0, libc6 (>= 2.34), liblzma5 (>= 5.4.0), libmd0 (>= 0.0.0), libselinux1 (>= 3.1~), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Suggests: apt, debsig-verify
Breaks: libapt-pkg5.0 (<< 1.7~b), lsb-base (<< 10.2019031300)
Conffiles:
 /etc/alternatives/README 7be88b21f7e386c8d5a8790c2461c92b
 /etc/cron.daily/dpkg 94bb6c1363245e46256908a5d52ba4fb
 /etc/dpkg/dpkg.cfg f4413ffb515f8f753624ae3bb365b81b
 /etc/logrotate.d/alternatives 5fe0af6ce1505fefdc158d9e5dbf6286
 /etc/logrotate.d/dpkg 9e25c8505966b5829785f34a548ae11f
Description: Debian package management system
 This package provides the low-level infrastructure for handling the
 installation and removal of Debian software packages.
 .
 For Debian package development tools, install dpkg-dev.
Homepage: https://wiki.debian.org/Teams/Dpkg

Package: dpkg-dev
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1728
Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: dpkg
Version: 1.21.22
Depends: perl:any, libdpkg-perl (= 1.21.22), tar (>= 1.28-1), bzip2, xz-utils (>= 5.4.0), patch (>= 2.7), make, binutils
Recommends: build-essential, gcc | c-compiler, fakeroot, gnupg | sq | sqop | pgpainless-cli, gpgv | sq | sqop | pgpainless-cli, libalgorithm-merge-perl
Suggests: debian-keyring
Breaks: debhelper (<< 10.10.1~), libsop-java-java (<< 4.0.7~), pgpainless-cli (<< 1.3.13~), sq (<< 0.25.0~), sqop (<< 0.27.2~)
Conffiles:
 /etc/dpkg/shlibs.default 1a2b9d0a869e2aa885ae3621c557fb95
 /etc/dpkg/shlibs.override 84b1e69080569cc5c613a50887af5200
Description: Debian package development tools
 This package provides the development tools (including dpkg-source)
 required to unpack, build and upload Debian source packages.
 .
 Most Debian source packages will require additional tools to build;
 for example, most packages need make and the C compiler gcc.
Homepage: https://wiki.debian.org/Teams/Dpkg

Package: e2fsprogs
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 1496
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Architecture: amd64
Multi-Arch: foreign
Version: 1.47.0-2
Depends: logsave
Pre-Depends: libblkid1 (>= 2.36), libc6 (>= 2.34), libcom-err2 (>= 1.43.9), libext2fs2 (= 1.47.0-2), libss2 (>= 1.38), libuuid1 (>= 2.16)
Recommends: e2fsprogs-l10n
Suggests: gpart, parted, fuse2fs, e2fsck-static
Conffiles:
 /etc/cron.d/e2scrub_all bc533e09f3b3d96bfe1633ad57eb7026
 /etc/e2scrub.conf df38534cc670c70a91cf9b035845d244
 /etc/mke2fs.conf 6a2103e33d9e48b5f6f3190045c37561
Description: ext2/ext3/ext4 file system utilities
 The ext2, ext3 and ext4 file systems are successors of the original ext
 ("extended") file system. They are the main file system types used for
 hard disks on Debian and other Linux systems.
 .
 This package contains programs for creating, checking, and maintaining
 ext2/3/4-based file systems.  It also includes the "badblocks" program,
 which can be used to scan for bad blocks on a disk or other storage device.
Homepage: http://e2fsprogs.sourceforge.net
Important: yes

Package: eject
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 132
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libc6 (>= 2.34), libmount1 (>= 2.24.2)
Description: ejects CDs and operates CD-Changers under Linux
 This program will eject CD-ROMs (assuming your drive supports the CDROMEJECT
 ioctl). It also allows setting the autoeject feature.
 .
 On supported ATAPI/IDE multi-disc CD-ROM changers, it allows changing
 the active disc.
 .
 You can also use eject to properly disconnect external mass-storage
 devices like digital cameras or portable music players.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: emacsen-common
Status: install ok installed
Priority: optional
Section: editors
Installed-Size: 55
Maintainer: Rob Browning <rlb@defaultvalue.org>
Architecture: all
Version: 3.0.5
Conflicts: emacs19, emacs20, emacs21-common, emacs22-common, emacs23-common, emacs24-common, emacs25-common, xemacs21-support (<< 21.4.24-6~)
Description: Common facilities for all emacsen
 This package contains code that is needed by all the (x)emacs
 packages.  It will be automatically installed when needed.

Package: fakeroot
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 208
Maintainer: Clint Adams <clint@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.31-1.2
Depends: libfakeroot (>= 1.31-1.2), libc6 (>= 2.34)
Description: tool for simulating superuser privileges
 fakeroot provides a fake "root environment" by means of LD_PRELOAD and
 SysV IPC (or TCP) trickery. It puts wrappers around getuid(), chown(),
 stat(), and other file-manipulation functions, so that unprivileged
 users can (for instance) populate .deb archives with root-owned files;
 various build tools use fakeroot for this by default.
 .
 This package contains fakeroot command and the daemon that remembers
 fake ownership/permissions of files manipulated by fakeroot
 processes.

Package: fdisk
Status: install ok installed
Priority: important
Section: utils
Installed-Size: 479
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libc6 (>= 2.34), libfdisk1 (>= 2.38), libmount1 (>= 2.24.2), libncursesw6 (>= 6), libreadline8 (>= 6.0), libsmartcols1 (>= 2.28~rc1), libtinfo6 (>= 6)
Recommends: sensible-utils
Description: collection of partitioning utilities
 This package contains the classic fdisk, sfdisk and cfdisk partitioning
 utilities from the util-linux suite.
 .
 The utilities included in this package allow you to partition
 your hard disk. The utilities supports both modern and legacy
 partition tables (eg. GPT, MBR, etc).
 .
 The fdisk utility is the classical text-mode utility.
 The cfdisk utilitity gives a more userfriendly curses based interface.
 The sfdisk utility is mostly for automation and scripting uses.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: file
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 79
Maintainer: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
Architecture: amd64
Multi-Arch: foreign
Version: 1:5.44-3
Depends: libc6 (>= 2.34), libmagic1 (= 1:5.44-3)
Breaks: debhelper (<< 12.2~)
Description: Recognize the type of data in a file using "magic" numbers
 The file command is "a file type guesser", a command-line tool that
 tells you in words what kind of data a file contains.
 .
 This package contains the file program itself.
Homepage: https://www.darwinsys.com/file/

Package: findutils
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 1746
Maintainer: Andreas Metzler <ametzler@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 4.9.0-4
Pre-Depends: libc6 (>= 2.34), libselinux1 (>= 3.1~)
Breaks: binstats (<< 1.08-8.1), guilt (<< 0.36-0.2), libpython3.4-minimal (<< 3.4.4-2), libpython3.5-minimal (<< 3.5.1-3), lsat (<< 0.9.7.1-2.1), mc (<< 3:4.8.11-1), switchconf (<< 0.0.9-2.1)
Description: utilities for finding files--find, xargs
 GNU findutils provides utilities to find files meeting specified
 criteria and perform various actions on the files which are found.
 This package contains 'find' and 'xargs'; however, 'locate' has
 been split off into a separate package.
Homepage: https://savannah.gnu.org/projects/findutils/

Package: firmware-linux-free
Status: install ok installed
Priority: optional
Section: kernel
Installed-Size: 85
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: firmware-free
Version: 20200122-1
Suggests: initramfs-tools
Description: Binary firmware for various drivers in the Linux kernel
 This package contains firmware which was previously included in the Linux
 kernel and which is compliant with the Debian Free Software Guidelines.
 .
 Most firmware previously included in the Linux kernel is non-free and has
 been moved to the firmware-linux-nonfree package.
 .
 Contents:
  * AV7110 DVB card firmware (av7110/bootcode.bin)
  * Atheros AR9170 free firmware for use with carl9170 (carl9170-1.fw)
  * 3Com Megahertz 3CCFEM556 CIS fix (cis/3CCFEM556.cis)
  * 3Com Megahertz 3CXEM556 CIS fix (cis/3CXEM556.cis)
  * Advantech COMpad-32/85 CIS fix (cis/COMpad2.cis)
  * Advantech COMpad-32/85B-4 CIS fix (cis/COMpad4.cis)
  * NSC DP83903 PCMCIA Ethernet card CIS fix (cis/DP83903.cis)
  * Allied Telesis LA-PCM CIS fix (cis/LA-PCM.cis)
  * MultiTech PCMCIA 56K DataFax CIS fix (cis/MT5634ZLX.cis)
  * NDC PCMCIA Ethernet card CIS fix (cis/NE2K.cis)
  * EN2218-LAN/MODEM CIS fix (cis/PCMLM28.cis)
  * PreMax PE-200 CIS fix (cis/PE-200.cis)
  * LanPro EP-4000A CIS fix (cis/PE520.cis)
  * RS-COM 2P CIS fix (cis/RS-COM-2P.cis)
  * Sierra Aircard 555 CIS fix (cis/SW_555_SER.cis)
  * Sierra Wireless AC710/AC750 CIS fix (cis/SW_7xx_SER.cis)
  * Sierra Wireless AC850/AC860 CIS fix (cis/SW_8xx_SER.cis)
  * Tamarack PCMCIA Ethernet card CIS fix (cis/tamarack.cis)
  * Atari Falcon DSP56001 firmware (dsp56k/bootstrap.bin)
  * Intel C600 SAS/SATA controller default parameters, version 1.3
    (isci/isci_firmware.bin)
  * Keyspan USA-19 firmware (keyspan_pda/keyspan_pda.fw)
  * Xircom PGSDB9/Entrega PortGear firmware (keyspan_pda/xircom_pgs.fw)
  * USB-DUX firmware (usbdux_firmware.bin)
  * USB-DUXfast firmware (usbduxfast_firmware.bin)
  * USB-DUXsigma firmware (usbduxsigma_firmware.bin)
Homepage: http://git.kernel.org/?p=linux/kernel/git/firmware/linux-firmware.git

Package: fontconfig-config
Status: install ok installed
Priority: optional
Section: fonts
Installed-Size: 527
Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: fontconfig
Version: 2.14.1-4
Depends: debconf (>= 0.5) | debconf-2.0, fonts-dejavu-core | ttf-bitstream-vera | fonts-liberation | fonts-liberation2 | fonts-croscore | fonts-freefont-otf | fonts-freefont-ttf | fonts-urw-base35 | fonts-texgyre
Breaks: libfontconfig1 (<< 2.13.0)
Conffiles:
 /etc/fonts/conf.d/README ad6182d0b838d9d8f39219a37b88b24d
 /etc/fonts/fonts.conf 9632eb1c8b4d81e0e300cd733a4beefe
Description: generic font configuration library - configuration
 Fontconfig is a font configuration and customization library, which
 does not depend on the X Window System. It is designed to locate
 fonts within the system and select them according to requirements
 specified by applications.
 .
 This package contains the configuration files and scripts for fontconfig.
Homepage: https://www.freedesktop.org/wiki/Software/fontconfig/

Package: fonts-dejavu-core
Status: install ok installed
Priority: optional
Section: fonts
Installed-Size: 2960
Maintainer: Debian Fonts Task Force <debian-fonts@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: fonts-dejavu
Version: 2.37-6
Conffiles:
 /etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans-mono.conf 10d6f2176d76ee9b89a19a17811257f2
 /etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-sans.conf 6488b24401e477e35aa71237054c8ada
 /etc/fonts/conf.avail/20-unhint-small-dejavu-lgc-serif.conf 0b01522fe76b4e5b8ab3d12383371348
 /etc/fonts/conf.avail/20-unhint-small-dejavu-sans-mono.conf 0cbf30e4580c5a8570da071ab12c5e4d
 /etc/fonts/conf.avail/20-unhint-small-dejavu-sans.conf f7df7bba810dd953dd78212900f4dcad
 /etc/fonts/conf.avail/20-unhint-small-dejavu-serif.conf e90c678d46f49bb9d6ba469b64e80c0c
 /etc/fonts/conf.avail/57-dejavu-sans-mono.conf b9a76edd2aeb35cd1095e378963e2cdd
 /etc/fonts/conf.avail/57-dejavu-sans.conf 2156c2353cfcc81f33150cf889193c28
 /etc/fonts/conf.avail/57-dejavu-serif.conf 2604487cb2eee1bdb7010ea716faf408
 /etc/fonts/conf.avail/58-dejavu-lgc-sans-mono.conf d2ee39274982cb4f831783cff742c8bc
 /etc/fonts/conf.avail/58-dejavu-lgc-sans.conf b4a8f51e45aa24fdee47b3f838cc0205
 /etc/fonts/conf.avail/58-dejavu-lgc-serif.conf 5f0b00e681b1f40b65dd336696ee0bbb
Description: Vera font family derivate with additional characters
 DejaVu provides an expanded version of the Vera font family aiming for
 quality and broader Unicode coverage while retaining the original Vera
 style. DejaVu currently works towards conformance with the Multilingual
 European Standards (MES-1 and MES-2) for Unicode coverage. The DejaVu
 fonts provide serif, sans and monospaced variants.
 .
 This package only contains the sans, sans-bold, serif, serif-bold,
 mono and mono-bold variants. For additional variants, see the
 fonts-dejavu-extra package.
 .
 DejaVu fonts are intended for use on low-resolution devices (mainly
 computer screens) but can be used in printing as well.
Homepage: https://dejavu-fonts.github.io/

Package: fonts-font-awesome
Status: install ok installed
Priority: optional
Section: fonts
Installed-Size: 1369
Maintainer: Debian Fonts Task Force <debian-fonts@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 5.0.10+really4.7.0~dfsg-4.1
Provides: node-font-awesome (= 4.7.0~5.0.10+really4.7.0~dfsg-4.1), sass-stylesheets-fonts-awesome
Enhances: libjs-twitter-bootstrap, node-less, sass
Description: iconic font designed for use with Twitter Bootstrap
 This font contains about 249 various icon glyphs. Glyphs are designed
 as scalable vector graphics hence display very well at any screen
 size. This font was basically designed to be used with the Twitter
 bootstrap  library but can be used in other places also.
 .
 This package also provides Sass and LESS files to use webfonts from
 this package.
 .
 Please note that this package provides Font Awesome 4
 (not Font Awesome 5 or Font Awesome 6
 which are different fonts with different licensing).
Homepage: http://fontawesome.io/

Package: fonts-glyphicons-halflings
Status: install ok installed
Priority: optional
Section: javascript
Installed-Size: 298
Maintainer: Debian Javascript Maintainers <pkg-javascript-devel@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: twitter-bootstrap3 (3.4.1+dfsg-3+deb12u1)
Version: 1.009~3.4.1+dfsg-3+deb12u1
Description: icons made for smaller graphic
 GLYPHICONS is a family of icon fonts
 created with an emphasis to simplicity and easy orientation.
 .
 GLYPHICONS Halflings, a subset optimized for smaller graphics,
 were freely licensed as part of Bootstrap 2.x and 3.x.
Homepage: https://getbootstrap.com/

Package: fuse3
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 100
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Version: 3.14.0-4
Replaces: fuse
Provides: fuse (= 3.14.0-4)
Depends: libc6 (>= 2.34), libfuse3-3 (= 3.14.0-4), adduser, mount (>= 2.19.1), sed (>= 4)
Breaks: fuse
Conffiles:
 /etc/fuse.conf ba9c9667f7df01ae7081d2c05d1d24e6
Description: Filesystem in Userspace (3.x version)
 Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
 export a virtual filesystem to the Linux kernel. It also aims to provide a
 secure method for non privileged users to create and mount their own filesystem
 implementations.
Homepage: https://github.com/libfuse/libfuse/wiki

Package: g++
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 14
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Source: gcc-defaults (1.203)
Version: 4:12.2.0-3
Provides: c++-compiler, g++-x86-64-linux-gnu (= 4:12.2.0-3)
Depends: cpp (= 4:12.2.0-3), gcc (= 4:12.2.0-3), g++-12 (>= 12.2.0-1~), gcc-12 (>= 12.2.0-1~)
Suggests: g++-multilib
Description: GNU C++ compiler
 This is the GNU C++ compiler, a fairly portable optimizing compiler for C++.
 .
 This is a dependency package providing the default GNU C++ compiler.

Package: g++-12
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 36161
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Source: gcc-12
Version: 12.2.0-14+deb12u1
Provides: c++-compiler, c++abi2-dev
Depends: gcc-12-base (= 12.2.0-14+deb12u1), gcc-12 (= 12.2.0-14+deb12u1), libstdc++-12-dev (= 12.2.0-14+deb12u1), libc6 (>= 2.36), libgmp10 (>= 2:6.2.1+dfsg1), libisl23 (>= 0.15), libmpc3 (>= 1.1.0), libmpfr6 (>= 3.1.3), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Suggests: g++-12-multilib, gcc-12-doc (>= 12)
Description: GNU C++ compiler
 This is the GNU C++ compiler, a fairly portable optimizing compiler for C++.
Homepage: http://gcc.gnu.org/

Package: gcc
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 47
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Source: gcc-defaults (1.203)
Version: 4:12.2.0-3
Provides: c-compiler, gcc-x86-64-linux-gnu (= 4:12.2.0-3)
Depends: cpp (= 4:12.2.0-3), gcc-12 (>= 12.2.0-1~)
Recommends: libc6-dev | libc-dev
Suggests: gcc-multilib, make, manpages-dev, autoconf, automake, libtool, flex, bison, gdb, gcc-doc
Conflicts: gcc-doc (<< 1:2.95.3)
Description: GNU C compiler
 This is the GNU C compiler, a fairly portable optimizing compiler for C.
 .
 This is a dependency package providing the default GNU C compiler.

Package: gcc-12
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 68236
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Version: 12.2.0-14+deb12u1
Replaces: cpp-12 (<< 7.1.1-8)
Provides: c-compiler
Depends: cpp-12 (= 12.2.0-14+deb12u1), gcc-12-base (= 12.2.0-14+deb12u1), libcc1-0 (>= 12.2.0-14+deb12u1), binutils (>= 2.40), libgcc-12-dev (= 12.2.0-14+deb12u1), libc6 (>= 2.36), libgcc-s1 (>= 3.0), libgmp10 (>= 2:6.2.1+dfsg1), libisl23 (>= 0.15), libmpc3 (>= 1.1.0), libmpfr6 (>= 3.1.3), libstdc++6 (>= 5), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Recommends: libc6-dev (>= 2.23-1~)
Suggests: gcc-12-multilib, gcc-12-doc (>= 12), gcc-12-locales (>= 12)
Description: GNU C compiler
 This is the GNU C compiler, a fairly portable optimizing compiler for C.
Homepage: http://gcc.gnu.org/

Package: gcc-12-base
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 100
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Breaks: gnat (<< 7)
Description: GCC, the GNU Compiler Collection (base package)
 This package contains files common to all languages and libraries
 contained in the GNU Compiler Collection (GCC).
Homepage: http://gcc.gnu.org/

Package: gettext-base
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 645
Maintainer: Santiago Vila <sanvila@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gettext
Version: 0.21-12
Depends: libc6 (>= 2.34)
Description: GNU Internationalization utilities for the base system
 This package includes the gettext and ngettext programs which allow
 other packages to internationalize the messages given by shell scripts.
Homepage: https://www.gnu.org/software/gettext/

Package: gir1.2-glib-2.0
Status: install ok installed
Priority: optional
Section: introspection
Installed-Size: 719
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gobject-introspection
Version: 1.74.0-3
Provides: gir1.2-gio-2.0 (= 1.74.0-3), gir1.2-girepository-2.0 (= 1.74.0-3), gir1.2-gmodule-2.0 (= 1.74.0-3), gir1.2-gobject-2.0 (= 1.74.0-3)
Depends: libgirepository-1.0-1 (>= 1.72.0), libglib2.0-0 (>= 2.74.0)
Description: Introspection data for GLib, GObject, Gio and GModule
 GObject Introspection is a project for providing machine readable
 introspection data of the API of C libraries. This introspection
 data can be used in several different use cases, for example
 automatic code generation for bindings, API verification and documentation
 generation.
 .
 GObject Introspection contains tools to generate and handle the
 introspection data.
 .
 This package contains the introspection data for the GLib, GObject,
 GModule and Gio libraries.
Homepage: https://wiki.gnome.org/GObjectIntrospection

Package: git
Status: install ok installed
Priority: optional
Section: vcs
Installed-Size: 44890
Maintainer: Jonathan Nieder <jrnieder@gmail.com>
Architecture: amd64
Multi-Arch: foreign
Version: 1:2.39.5-0+deb12u2
Provides: git-completion, git-core
Depends: libc6 (>= 2.34), libcurl3-gnutls (>= 7.56.1), libexpat1 (>= 2.0.1), libpcre2-8-0 (>= 10.34), zlib1g (>= 1:1.2.2), perl, liberror-perl, git-man (>> 1:2.39.5), git-man (<< 1:2.39.5-.)
Recommends: ca-certificates, patch, less, ssh-client
Suggests: gettext-base, git-daemon-run | git-daemon-sysvinit, git-doc, git-email, git-gui, gitk, gitweb, git-cvs, git-mediawiki, git-svn
Breaks: bash-completion (<< 1:1.90-1), cogito (<= 0.18.2+), dgit (<< 5.1~), git-buildpackage (<< 0.6.5), git-el (<< 1:2.32.0~rc2-1~), gitosis (<< 0.2+20090917-7), gitpkg (<< 0.15), guilt (<< 0.33), openssh-client (<< 1:6.8), stgit (<< 0.15), stgit-contrib (<< 0.15)
Conffiles:
 /etc/bash_completion.d/git-prompt 7baac5c3ced94ebf2c0e1dde65c3b1a6
Description: fast, scalable, distributed revision control system
 Git is popular version control system designed to handle very large
 projects with speed and efficiency; it is used for many high profile
 open source projects, most notably the Linux kernel.
 .
 Git falls in the category of distributed source code management tools.
 Every Git working directory is a full-fledged repository with full
 revision tracking capabilities, not dependent on network access or a
 central server.
 .
 This package provides the git main components with minimal dependencies.
 Additional functionality, e.g. a graphical user interface and revision
 tree visualizer, tools for interoperating with other VCS's, or a web
 interface, is provided as separate git* packages.
Homepage: https://git-scm.com/

Package: git-man
Status: install ok installed
Priority: optional
Section: doc
Installed-Size: 2106
Maintainer: Jonathan Nieder <jrnieder@gmail.com>
Architecture: all
Multi-Arch: foreign
Source: git
Version: 1:2.39.5-0+deb12u2
Description: fast, scalable, distributed revision control system (manual pages)
 Git is popular version control system designed to handle very large
 projects with speed and efficiency; it is used for many high profile
 open source projects, most notably the Linux kernel.
 .
 Git falls in the category of distributed source code management tools.
 Every Git working directory is a full-fledged repository with full
 revision tracking capabilities, not dependent on network access or a
 central server.
 .
 This package provides reference documentation for use by the 'man'
 utility and the 'git help' command.
Homepage: https://git-scm.com/

Package: gnupg
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 885
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg2 (<< 2.1.11-7+exp1)
Depends: dirmngr (<< 2.2.40-1.1.1~), dirmngr (>= 2.2.40-1.1), gnupg-l10n (= 2.2.40-1.1), gnupg-utils (<< 2.2.40-1.1.1~), gnupg-utils (>= 2.2.40-1.1), gpg (<< 2.2.40-1.1.1~), gpg (>= 2.2.40-1.1), gpg-agent (<< 2.2.40-1.1.1~), gpg-agent (>= 2.2.40-1.1), gpg-wks-client (<< 2.2.40-1.1.1~), gpg-wks-client (>= 2.2.40-1.1), gpg-wks-server (<< 2.2.40-1.1.1~), gpg-wks-server (>= 2.2.40-1.1), gpgsm (<< 2.2.40-1.1.1~), gpgsm (>= 2.2.40-1.1), gpgv (<< 2.2.40-1.1.1~), gpgv (>= 2.2.40-1.1)
Suggests: parcimonie, xloadimage
Breaks: debsig-verify (<< 0.15), dirmngr (<< 2.2.40-1.1), gnupg2 (<< 2.1.11-7+exp1), libgnupg-interface-perl (<< 0.52-3), libgnupg-perl (<= 0.19-1), libmail-gnupg-perl (<= 0.22-1), monkeysphere (<< 0.38~), php-crypt-gpg (<= 1.4.1-1), python-apt (<= 1.1.0~beta4), python-gnupg (<< 0.3.8-3), python3-apt (<= 1.1.0~beta4)
Description: GNU privacy guard - a free PGP replacement
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package contains the full suite of GnuPG tools for cryptographic
 communications and data storage.
Homepage: https://www.gnupg.org/

Package: gnupg-l10n
Status: install ok installed
Priority: optional
Section: localization
Installed-Size: 4874
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg (<< 2.1.14-2~), gnupg2 (<< 2.1.14-2~)
Breaks: gnupg (<< 2.1.14-2~), gnupg2 (<< 2.1.14-2~)
Enhances: dirmngr, gpg, gpg-agent
Description: GNU privacy guard - localization files
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC 4880.
 .
 This package contains the translation files for the use of GnuPG in
 non-English locales.
Homepage: https://www.gnupg.org/

Package: gnupg-utils
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1836
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4)
Depends: libassuan0 (>= 2.5.0), libbz2-1.0, libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), libksba8 (>= 1.3.5), libreadline8 (>= 6.0), zlib1g (>= 1:1.1.4)
Recommends: gpg, gpg-agent, gpgconf, gpgsm
Breaks: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4)
Description: GNU privacy guard - utility programs
 GnuPG is GNU's tool for secure communication and data storage.
 .
 This package contains several useful utilities for manipulating
 OpenPGP data and other related cryptographic elements.  It includes:
 .
  * addgnupghome -- create .gnupg home directories
  * applygnupgdefaults -- run gpgconf --apply-defaults for all users
  * gpgcompose -- an experimental tool for constructing arbitrary
                  sequences of OpenPGP packets (e.g. for testing)
  * gpgparsemail -- parse an e-mail message into annotated format
  * gpgsplit -- split a sequence of OpenPGP packets into files
  * gpgtar -- encrypt or sign files in an archive
  * kbxutil -- list, export, import Keybox data
  * lspgpot -- convert PGP ownertrust values to GnuPG
  * migrate-pubring-from-classic-gpg -- use only "modern" formats
  * symcryptrun -- use simple symmetric encryption tool in GnuPG framework
  * watchgnupg -- watch socket-based logs
Homepage: https://www.gnupg.org/

Package: gpg
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1581
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg (<< 2.1.21-4)
Depends: gpgconf (= 2.2.40-1.1), libassuan0 (>= 2.5.0), libbz2-1.0, libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), libreadline8 (>= 6.0), libsqlite3-0 (>= 3.7.15), zlib1g (>= 1:1.1.4)
Recommends: gnupg (= 2.2.40-1.1)
Breaks: gnupg (<< 2.1.21-4)
Description: GNU Privacy Guard -- minimalist public key operations
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package contains /usr/bin/gpg itself, and is useful on its own
 only for public key operations (encryption, signature verification,
 listing OpenPGP certificates, etc).  If you want full capabilities
 (including secret key operations, network access, etc), please
 install the "gnupg" package, which pulls in the full suite of tools.
Homepage: https://www.gnupg.org/

Package: gpg-agent
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1348
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg-agent (<< 2.1.21-4)
Provides: gnupg-agent
Depends: gpgconf (= 2.2.40-1.1), pinentry-curses | pinentry, init-system-helpers (>= 1.52), libassuan0 (>= 2.5.1), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), libnpth0 (>= 0.90)
Recommends: gnupg (= 2.2.40-1.1)
Suggests: dbus-user-session, libpam-systemd, pinentry-gnome3, scdaemon
Breaks: gnupg-agent (<< 2.1.21-4)
Conffiles:
 /etc/X11/Xsession.d/90gpg-agent fbb9ce5e8e4ba5727090f0aa51b61a82
 /etc/logcheck/ignore.d.server/gpg-agent 2d0fbc91a955ba69408ca033d7ae2455
Description: GNU privacy guard - cryptographic agent
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package contains the agent program gpg-agent which handles all
 secret key material for OpenPGP and S/MIME use.  The agent also
 provides a passphrase cache, which is used by pre-2.1 versions of
 GnuPG for OpenPGP operations.  Without this package, trying to do
 secret-key operations with any part of the modern GnuPG suite will
 fail.
Homepage: https://www.gnupg.org/

Package: gpg-wks-client
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 682
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Depends: dirmngr (= 2.2.40-1.1), gpg (= 2.2.40-1.1), gpg-agent (= 2.2.40-1.1), libassuan0 (>= 2.5.0), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42)
Recommends: gnupg (= 2.2.40-1.1)
Description: GNU privacy guard - Web Key Service client
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package provides the GnuPG client for the Web Key Service
 protocol.
 .
 A Web Key Service is a service that allows users to upload keys per
 mail to be verified over https as described in
 https://tools.ietf.org/html/draft-koch-openpgp-webkey-service
 .
 For more information see: https://wiki.gnupg.org/WKS
Homepage: https://www.gnupg.org/

Package: gpg-wks-server
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 657
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Depends: gpg (= 2.2.40-1.1), gpg-agent (= 2.2.40-1.1), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42)
Recommends: gnupg (= 2.2.40-1.1)
Description: GNU privacy guard - Web Key Service server
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package provides the GnuPG server for the Web Key Service
 protocol.
 .
 A Web Key Service is a service that allows users to upload keys per
 mail to be verified over https as described in
 https://tools.ietf.org/html/draft-koch-openpgp-webkey-service
 .
 For more information see: https://wiki.gnupg.org/WKS
Homepage: https://www.gnupg.org/

Package: gpgconf
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 803
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4)
Depends: libassuan0 (>= 2.5.0), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), libreadline8 (>= 6.0)
Breaks: gnupg (<< 2.1.21-4), gnupg-agent (<< 2.1.21-4)
Description: GNU privacy guard - core configuration utilities
 GnuPG is GNU's tool for secure communication and data storage.
 .
 This package contains core utilities used by different tools in the
 suite offered by GnuPG.  It can be used to programmatically edit
 config files for tools in the GnuPG suite, to launch or terminate
 per-user daemons (if installed), etc.
Homepage: https://www.gnupg.org/

Package: gpgsm
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 992
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg2 (<< 2.1.10-2)
Depends: gpgconf (= 2.2.40-1.1), libassuan0 (>= 2.5.0), libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), libksba8 (>= 1.6.0), libreadline8 (>= 6.0)
Recommends: gnupg (= 2.2.40-1.1)
Breaks: gnupg2 (<< 2.1.10-2)
Description: GNU privacy guard - S/MIME version
 GnuPG is GNU's tool for secure communication and data storage.
 It can be used to encrypt data and to create digital signatures.
 It includes an advanced key management facility and is compliant
 with the proposed OpenPGP Internet standard as described in RFC4880.
 .
 This package contains the gpgsm program. gpgsm is a tool to provide
 digital encryption and signing services on X.509 certificates and the
 CMS protocol. gpgsm includes complete certificate management.
Homepage: https://www.gnupg.org/

Package: gpgv
Status: install ok installed
Priority: important
Section: utils
Installed-Size: 917
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: gnupg2
Version: 2.2.40-1.1
Replaces: gnupg2 (<< 2.0.21-2), gpgv2 (<< 2.1.11-7+exp1)
Depends: libbz2-1.0, libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgpg-error0 (>= 1.42), zlib1g (>= 1:1.1.4)
Suggests: gnupg
Breaks: gnupg2 (<< 2.0.21-2), gpgv2 (<< 2.1.11-7+exp1), python-debian (<< 0.1.29)
Description: GNU privacy guard - signature verification tool
 GnuPG is GNU's tool for secure communication and data storage.
 .
 gpgv is actually a stripped-down version of gpg which is only able
 to check signatures. It is somewhat smaller than the fully-blown gpg
 and uses a different (and simpler) way to check that the public keys
 used to make the signature are valid. There are no configuration
 files and only a few options are implemented.
Homepage: https://www.gnupg.org/

Package: grep
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 1245
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 3.8-5
Provides: rgrep
Depends: dpkg (>= 1.15.4) | install-info
Pre-Depends: libc6 (>= 2.34), libpcre2-8-0 (>= 10.32)
Conflicts: rgrep
Description: GNU grep, egrep and fgrep
 'grep' is a utility to search for text in files; it can be used from the
 command line or in scripts.  Even if you don't want to use it, other packages
 on your system probably will.
 .
 The GNU family of grep utilities may be the "fastest grep in the west".
 GNU grep is based on a fast lazy-state deterministic matcher (about
 twice as fast as stock Unix egrep) hybridized with a Boyer-Moore-Gosper
 search for a fixed string that eliminates impossible text from being
 considered by the full regexp matcher without necessarily having to
 look at every character. The result is typically many times faster
 than Unix grep or egrep. (Regular expressions containing backreferencing
 will run more slowly, however.)
Homepage: https://www.gnu.org/software/grep/

Package: groff-base
Status: install ok installed
Priority: important
Section: text
Installed-Size: 3673
Maintainer: Colin Watson <cjwatson@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: groff
Version: 1.22.4-10
Depends: libc6 (>= 2.35), libgcc-s1 (>= 4.0), libstdc++6 (>= 4.1.1), libuchardet0 (>= 0.0.1)
Suggests: groff
Conffiles:
 /etc/groff/man.local c8d6e2bf36a23e2e9599f7f66ab05463
 /etc/groff/mdoc.local 4bc6267468942826b757fa2f868c8237
Description: GNU troff text-formatting system (base system components)
 This package contains the traditional UN*X text formatting tools
 troff, nroff, tbl, eqn, and pic. These utilities, together with the
 man-db package, are essential for displaying the on-line manual pages.
 .
 groff-base is a stripped-down package containing the necessary components
 to read manual pages in ASCII, Latin-1, and UTF-8, plus the PostScript
 device (groff's default). Users who want a full groff installation, with
 the standard set of devices, fonts, macros, and documentation, should
 install the groff package.
Homepage: https://www.gnu.org/software/groff/

Package: grub-common
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 17773
Maintainer: GRUB Maintainers <pkg-grub-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: foreign
Source: grub2
Version: 2.06-13+deb12u1
Replaces: grub-coreboot (<< 2.00-4), grub-efi (<< 1.99-1), grub-efi-amd64 (<< 2.00-4), grub-efi-ia32 (<< 2.00-4), grub-efi-ia64 (<< 2.00-4), grub-ieee1275 (<< 2.00-4), grub-linuxbios (<< 1.96+20080831-1), grub-pc (<< 2.00-4), grub-yeeloong (<< 2.00-4), init-select
Depends: libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.36), libefiboot1 (>= 37), libefivar1 (>= 37), libfreetype6 (>= 2.2.1), libfuse2 (>= 2.8.4-1.4), liblzma5 (>= 5.1.1alpha+20120614), gettext-base
Recommends: os-prober (>= 1.33)
Suggests: multiboot-doc, grub-emu, mtools, xorriso (>= 0.5.6.pl00), desktop-base (>= 4.0.6), console-setup
Breaks: apport (<< 2.1.1), friendly-recovery (<< 0.2.13), lupin-support (<< 0.55), mdadm (<< 2.6.7-2)
Conflicts: init-select
Conffiles:
 /etc/default/grub.d/init-select.cfg 86dea2a78312ca80f740098987d9c0fb
 /etc/grub.d/00_header cd52708cba4d78d7ef96176258d4593d
 /etc/grub.d/05_debian_theme 7af00bf2d834b3104688c9cbf40b23b3
 /etc/grub.d/10_linux 16adfed0ec58a4db1e3f3f38e49f06fc
 /etc/grub.d/20_linux_xen 80253021369176084e3483b13c9e689e
 /etc/grub.d/30_os-prober e5c89c9c421bbe7c2ad9eb86129fd4e0
 /etc/grub.d/30_uefi-firmware ed41aff510f9176cdbbecfe1a964e4c5
 /etc/grub.d/40_custom babe7de352fe18de5a238569cf4b8a11
 /etc/grub.d/41_custom 1d876baff8ca3841aa6ba057e881a2e4
 /etc/grub.d/README be58f42dfe74feb6eeb98c6a843c743f
Description: GRand Unified Bootloader (common files)
 This package contains common files shared by the distinct flavours of GRUB.
 It is shared between GRUB Legacy and GRUB 2, although a number of files
 specific to GRUB 2 are here as long as they do not break GRUB Legacy.
 .
 grub-mkrescue needs the suggested packages mtools (for UEFI targets) and
 xorriso.
Homepage: https://www.gnu.org/software/grub/

Package: grub-pc
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 551
Maintainer: GRUB Maintainers <pkg-grub-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: foreign
Source: grub2
Version: 2.06-13+deb12u1
Replaces: grub, grub-common (<= 1.97~beta2-1), grub-coreboot, grub-efi-amd64, grub-efi-ia32, grub-ieee1275, grub-legacy, grub2 (<< 2.06-13+deb12u1)
Depends: debconf (>= 0.5) | debconf-2.0, grub-common (= 2.06-13+deb12u1), grub2-common (= 2.06-13+deb12u1), grub-pc-bin (= 2.06-13+deb12u1), ucf
Conflicts: grub (<< 0.97-54), grub-coreboot, grub-efi-amd64, grub-efi-ia32, grub-ieee1275, grub-legacy, grub-xen
Description: GRand Unified Bootloader, version 2 (PC/BIOS version)
 GRUB is a portable, powerful bootloader.  This version of GRUB is based on a
 cleaner design than its predecessors, and provides the following new features:
 .
  - Scripting in grub.cfg using BASH-like syntax.
  - Support for modern partition maps such as GPT.
  - Modular generation of grub.cfg via update-grub.  Packages providing GRUB
    add-ons can plug in their own script rules and trigger updates by invoking
    update-grub.
  - VESA-based graphical mode with background image support and complete 24-bit
    color set.
  - Support for extended charsets.  Users can write UTF-8 text to their menu
    entries.
 .
 This is a dependency package for a version of GRUB that has been built for
 use with the traditional PC/BIOS architecture.  Installing this package
 indicates that this version of GRUB should be the active boot loader.
Homepage: https://www.gnu.org/software/grub/

Package: grub-pc-bin
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 3101
Maintainer: GRUB Maintainers <pkg-grub-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: foreign
Source: grub2
Version: 2.06-13+deb12u1
Replaces: grub-common (<= 1.97~beta2-1), grub-pc (<< 1.99-1), grub2 (<< 2.06-13+deb12u1)
Depends: libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.36), grub-common (= 2.06-13+deb12u1)
Suggests: desktop-base (>= 4.0.6)
Description: GRand Unified Bootloader, version 2 (PC/BIOS modules)
 GRUB is a portable, powerful bootloader.  This version of GRUB is based on a
 cleaner design than its predecessors, and provides the following new features:
 .
  - Scripting in grub.cfg using BASH-like syntax.
  - Support for modern partition maps such as GPT.
  - Modular generation of grub.cfg via update-grub.  Packages providing GRUB
    add-ons can plug in their own script rules and trigger updates by invoking
    update-grub.
  - VESA-based graphical mode with background image support and complete 24-bit
    color set.
  - Support for extended charsets.  Users can write UTF-8 text to their menu
    entries.
 .
 This package contains GRUB modules that have been built for use with the
 traditional PC/BIOS architecture.  It can be installed in parallel with
 other flavours, but will not automatically install GRUB as the active boot
 loader nor automatically update grub.cfg on upgrade unless grub-pc is also
 installed.
Homepage: https://www.gnu.org/software/grub/

Package: grub2-common
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 1344
Maintainer: GRUB Maintainers <pkg-grub-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: foreign
Source: grub2
Version: 2.06-13+deb12u1
Replaces: grub, grub-cloud-amd64 (<< 0.0.4), grub-common (<< 1.99-1), grub-coreboot (<< 2.02+dfsg1-7), grub-doc (<< 0.97-32), grub-efi-amd64 (<< 2.02+dfsg1-7), grub-efi-arm (<< 2.02+dfsg1-7), grub-efi-arm64 (<< 2.02+dfsg1-7), grub-efi-ia32 (<< 2.02+dfsg1-7), grub-efi-ia64 (<< 2.02+dfsg1-7), grub-ieee1275 (<< 2.02+dfsg1-7), grub-legacy, grub-legacy-doc (<< 0.97-59), grub-pc (<< 2.02+dfsg1-7), grub-uboot (<< 2.02+dfsg1-7), grub-xen (<< 2.02+dfsg1-7), grub-yeeloong (<< 2.02+dfsg1-7)
Depends: grub-common (= 2.06-13+deb12u1), dpkg (>= 1.15.4), libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.36), libefiboot1 (>= 37), libefivar1 (>= 37), liblzma5 (>= 5.1.1alpha+20120614)
Breaks: grub (<< 0.97-54), grub-cloud-amd64 (<< 0.0.4), grub-coreboot (<< 2.02+dfsg1-7), grub-doc (<< 0.97-32), grub-efi-amd64 (<< 2.02+dfsg1-7), grub-efi-arm (<< 2.02+dfsg1-7), grub-efi-arm64 (<< 2.02+dfsg1-7), grub-efi-ia32 (<< 2.02+dfsg1-7), grub-efi-ia64 (<< 2.02+dfsg1-7), grub-ieee1275 (<< 2.02+dfsg1-7), grub-legacy-doc (<< 0.97-59), grub-pc (<< 2.02+dfsg1-7), grub-uboot (<< 2.02+dfsg1-7), grub-xen (<< 2.02+dfsg1-7), grub-yeeloong (<< 2.02+dfsg1-7), shim (<< 0.9+1474479173.6c180c6-0ubuntu1~)
Conflicts: grub-legacy
Conffiles:
 /etc/kernel/postinst.d/zz-update-grub 5a98abefbfe97dbed36db7899251e433
 /etc/kernel/postrm.d/zz-update-grub 5a98abefbfe97dbed36db7899251e433
Description: GRand Unified Bootloader (common files for version 2)
 This package contains common files shared by the distinct flavours of GRUB.
 The files in this package are specific to GRUB 2, and would break GRUB
 Legacy if installed on the same system.
Homepage: https://www.gnu.org/software/grub/

Package: gzip
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 252
Maintainer: Milan Kupcevic <milan@debian.org>
Architecture: amd64
Version: 1.12-1
Depends: dpkg (>= 1.15.4) | install-info
Pre-Depends: libc6 (>= 2.33)
Suggests: less
Description: GNU compression utilities
 This package provides the standard GNU file compression utilities, which
 are also the default compression tools for Debian.  They typically operate
 on files with names ending in '.gz', but can also decompress files ending
 in '.Z' created with 'compress'.
Homepage: https://www.gnu.org/software/gzip/

Package: hostname
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 46
Maintainer: Michael Meskes <meskes@debian.org>
Architecture: amd64
Version: 3.23+nmu1
Replaces: nis (<< 3.17-30)
Pre-Depends: libc6 (>= 2.34)
Breaks: nis (<< 3.17-30)
Description: utility to set/show the host name or domain name
 This package provides commands which can be used to display the system's
 DNS name, and to display or set its hostname or NIS domain name.

Package: htop
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 378
Maintainer: Daniel Lange <DLange@debian.org>
Architecture: amd64
Version: 3.2.2-2
Depends: libc6 (>= 2.34), libncursesw6 (>= 6), libnl-3-200 (>= 3.2.7), libnl-genl-3-200 (>= 3.2.7), libtinfo6 (>= 6)
Suggests: lm-sensors, lsof, strace
Description: interactive processes viewer
 Htop is an ncursed-based process viewer similar to top, but it
 allows one to scroll the list vertically and horizontally to see
 all processes and their full command lines.
 .
 Tasks related to processes (killing, renicing) can be done without
 entering their PIDs.
Homepage: https://htop.dev/

Package: iamerican
Status: install ok installed
Priority: optional
Section: text
Installed-Size: 209
Maintainer: Robert Luberda <robert@debian.org>
Architecture: all
Source: ispell
Version: 3.4.05-1
Provides: ispell-dictionary
Depends: ienglish-common (= 3.4.05-1), dictionaries-common (>= 1.23~), ispell, debconf (>= 0.5) | debconf-2.0
Suggests: wamerican
Description: American English dictionary for ispell (standard version)
 This package provides the standard, medium-sized American English dictionary,
 based on the americanmed+ dictionary supplied with the source for ispell,
 with additional words added from the more comprehensive wamerican word
 list package.
 .
 There are also -small, -large, -huge, and -insane versions of this dictionary,
 and there are ibritish* packages as well.
 .
 The package also suggests wamerican because ispell's (L)ookup command
 needs a word list.
Homepage: https://www.cs.hmc.edu/~geoff/ispell.html

Package: ibritish
Status: install ok installed
Priority: optional
Section: text
Installed-Size: 209
Maintainer: Robert Luberda <robert@debian.org>
Architecture: all
Source: ispell
Version: 3.4.05-1
Provides: ispell-dictionary
Depends: ienglish-common (= 3.4.05-1), dictionaries-common (>= 1.23~), ispell, debconf (>= 0.5) | debconf-2.0
Suggests: wbritish
Description: British English dictionary for ispell (standard version)
 This package provides the standard, medium-sized British English dictionary,
 based on the britishmed+ dictionary supplied with the source for ispell, with
 additional words added from the more comprehensive wbritish word list package.
 .
 There are also -small, -large, -huge, and -insane versions of this dictionary,
 and there are iamerican* packages as well.
 .
 The package also suggests wbritish because ispell's (L)ookup command
 needs a word list.
Homepage: https://www.cs.hmc.edu/~geoff/ispell.html

Package: ienglish-common
Status: install ok installed
Priority: optional
Section: text
Installed-Size: 68
Maintainer: Robert Luberda <robert@debian.org>
Architecture: all
Multi-Arch: foreign
Source: ispell
Version: 3.4.05-1
Depends: ispell (>= 3.4.05)
Recommends: iamerican | iamerican-small | iamerican-large | iamerican-huge | iamerican-insane | ibritish | ibritish-small | ibritish-large | ibritish-huge | ibritish-insane
Description: Common files for British and American ispell dictionaries
 This package provides common files and dependencies for all American and
 British ispell dictionary packages. The package is useless if none of the
 dictionaries is also installed.
Homepage: https://www.cs.hmc.edu/~geoff/ispell.html

Package: ifupdown
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 199
Maintainer: Josué Ortega <josue@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 0.8.41
Replaces: systemd (<< 228-3~)
Depends: libc6 (>= 2.34), adduser, iproute2
Recommends: isc-dhcp-client | dhcp-client
Suggests: ppp, rdnssd
Breaks: systemd (<< 228-3~)
Conffiles:
 /etc/default/networking 3f34a1868c2e6cd41caec70c8d1e5659
 /etc/init.d/networking 6cd48e85fd010cd8a98a80c3c5707776
 /etc/network/if-down.d/resolved 67bb64fad6b8aa428801e8bb3417ec5a
 /etc/network/if-up.d/resolved 576db38f04d2e8d4bd7b86a5f4fa9d8f
Description: high level tools to configure network interfaces
 This package provides the tools ifup and ifdown which may be used to
 configure (or, respectively, deconfigure) network interfaces based on
 interface definitions in the file /etc/network/interfaces.

Package: inetutils-telnet
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 256
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Source: inetutils
Version: 2:2.4-2+deb12u1
Provides: telnet, telnet-client
Depends: libc6 (>= 2.34), libcom-err2 (>= 1.43.9), libk5crypto3 (>= 1.6.dfsg.2), libkrb5-3 (>= 1.13~alpha1+dfsg), libtinfo6 (>= 6), netbase
Description: telnet client
 The telnet command is used for interactive communication with another host
 using the TELNET protocol.
 .
 This implementation supports Kerberos, for authentication and encryption.
Homepage: https://www.gnu.org/software/inetutils/

Package: init
Status: install ok installed
Priority: important
Section: metapackages
Installed-Size: 24
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: init-system-helpers
Version: 1.65.2
Pre-Depends: systemd-sysv | sysvinit-core
Description: metapackage ensuring an init system is installed
 This package is a metapackage which allows you to select from the available
 init systems while ensuring that one of these is available on the system at
 all times.
Important: yes

Package: init-system-helpers
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 140
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1.65.2
Depends: usrmerge | usr-is-merged
Description: helper tools for all init systems
 This package contains helper tools that are necessary for switching between
 the various init systems that Debian contains (e. g. sysvinit or
 systemd). An example is deb-systemd-helper, a script that enables systemd unit
 files without depending on a running systemd.
 .
 It also includes the "service", "invoke-rc.d", and "update-rc.d" scripts which
 provide an abstraction for enabling, disabling, starting, and stopping
 services for all supported Debian init systems as specified by the policy.
 .
 While this package is maintained by pkg-systemd-maintainers, it is NOT
 specific to systemd at all. Maintainers of other init systems are welcome to
 include their helpers in this package.

Package: initramfs-tools
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 58
Maintainer: Debian kernel team <debian-kernel@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.142+deb12u3
Provides: linux-initramfs-tool
Depends: initramfs-tools-core (= 0.142+deb12u3), linux-base
Suggests: bash-completion
Breaks: e2fsprogs (<< 1.42.13), initscripts (<< 2.88dsf-59.3~), upstart
Conflicts: linux-initramfs-tool, usplash (<< 0.5.50)
Conffiles:
 /etc/initramfs-tools/update-initramfs.conf e2026d4603e7161efaccca519aeb1297
 /etc/kernel/postinst.d/initramfs-tools c1cb0e052a2cdeef4f3257585c83c58d
 /etc/kernel/postrm.d/initramfs-tools e7471d253a5b24e2fd85b40be4e43218
Description: generic modular initramfs generator (automation)
 This package builds a bootable initramfs for Linux kernel packages.  The
 initramfs is loaded along with the kernel and is responsible for
 mounting the root filesystem and starting the main init system.

Package: initramfs-tools-core
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 161
Maintainer: Debian kernel team <debian-kernel@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: initramfs-tools
Version: 0.142+deb12u3
Replaces: initramfs-tools (<< 0.121~)
Depends: klibc-utils (>= 2.0.4-8~), cpio (>= 2.12), kmod, udev, coreutils (>= 8.24), logsave | e2fsprogs (<< 1.45.3-1~)
Recommends: busybox (>= 1:1.22.0-17~) | busybox-static (>= 1:1.22.0-17~), zstd
Suggests: bash-completion
Breaks: busybox (<< 1:1.22.0-17~), busybox-static (<< 1:1.22.0-17~), initramfs-tools (<< 0.121~)
Conffiles:
 /etc/initramfs-tools/initramfs.conf 7cd32817dcb81991da2e2a928a32fdb0
Description: generic modular initramfs generator (core tools)
 This package contains the mkinitramfs program that can be used to
 create a bootable initramfs for a Linux kernel.  The initramfs should
 be loaded along with the kernel and is then responsible for mounting
 the root filesystem and starting the main init system.

Package: installation-report
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 33
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Version: 2.89
Recommends: reportbug, pciutils
Description: system installation report
 This package contains instructions and programs for reporting on
 the installation of a new system. It can help you fill out an
 installation report and send it to the Debian bug tracking system.
 .
 Purging this package will remove the logs of the system's installation.

Package: intel-microcode
Status: install ok installed
Priority: standard
Section: non-free-firmware/admin
Installed-Size: 19287
Maintainer: Henrique de Moraes Holschuh <hmh@debian.org>
Architecture: amd64
Version: 3.20250512.1~deb12u1
Depends: iucode-tool (>= 1.0)
Recommends: initramfs-tools (>= 0.113~)
Conflicts: microcode.ctl (<< 0.18~0)
Conffiles:
 /etc/default/intel-microcode 6a68a0e6e2d2ef001f1a374ece3c8558
 /etc/kernel/preinst.d/intel-microcode 4324b7d12701909b3a76bb5c6468a571
 /etc/modprobe.d/intel-microcode-blacklist.conf 71327241f6583b34944e638a955aba91
Description: Processor microcode firmware for Intel CPUs
 This package contains updated system processor microcode for
 Intel i686 and Intel X86-64 processors.  Intel releases microcode
 updates to correct processor behavior as documented in the
 respective processor specification updates.
 .
 For AMD processors, please refer to the amd64-microcode package.
Homepage: https://github.com/intel/Intel-Linux-Processor-Microcode-Data-Files

Package: iproute2
Status: install ok installed
Priority: important
Section: net
Installed-Size: 3516
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 6.1.0-3
Replaces: iproute
Provides: arpd
Depends: debconf (>= 0.5) | debconf-2.0, libbpf1 (>= 1:0.6.0), libbsd0 (>= 0.0), libc6 (>= 2.34), libcap2 (>= 1:2.10), libdb5.3, libelf1 (>= 0.131), libmnl0 (>= 1.0.3-4~), libselinux1 (>= 3.1~), libtirpc3 (>= 1.0.2), libxtables12 (>= 1.6.0+snapshot20161117), libcap2-bin
Recommends: libatm1 (>= 2.4.1-17~)
Suggests: iproute2-doc, python3:any
Conflicts: arpd, iproute (<< 20130000-1)
Conffiles:
 /etc/iproute2/bpf_pinning fd070252e6e9996bd04d9d59e4ce21eb
 /etc/iproute2/ematch_map 0e0f36cafc6a9cf76bc704cfd8f96ece
 /etc/iproute2/group 3aea2c0e0dd75e13a5f8f48f2936915f
 /etc/iproute2/nl_protos 393e42fa549d0974eb66d576675779c2
 /etc/iproute2/rt_dsfield 4c80d267a84d350d89d88774efe48a0f
 /etc/iproute2/rt_protos 35b7f1673d1d0486c4188fd06b46a410
 /etc/iproute2/rt_protos.d/README 88e45597012c565f9a10ffef1bc14312
 /etc/iproute2/rt_realms 7137bdf40e8d58c87ac7e3bba503767f
 /etc/iproute2/rt_scopes 6298b8df09e9bda23ea7da49021ca457
 /etc/iproute2/rt_tables a1313318d6778fe6b8c680248ef5a463
 /etc/iproute2/rt_tables.d/README 18bfdabbd4d5b14eae350720ea5ff431
Description: networking and traffic control tools
 The iproute2 suite is a collection of utilities for networking and
 traffic control.
 .
 These tools communicate with the Linux kernel via the (rt)netlink
 interface, providing advanced features not available through the
 legacy net-tools commands 'ifconfig' and 'route'.
Homepage: https://wiki.linuxfoundation.org/networking/iproute2

Package: iptables
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 2408
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.8.9-2
Replaces: iptables-nftables-compat (<< 1.6.2~)
Depends: libip4tc2 (= 1.8.9-2), libip6tc2 (= 1.8.9-2), libxtables12 (= 1.8.9-2), netbase (>= 6.0), libc6 (>= 2.34), libmnl0 (>= 1.0.3-4~), libnetfilter-conntrack3 (>= 1.0.6), libnfnetlink0 (>= 1.0.2), libnftnl11 (>= 1.1.5)
Recommends: nftables
Suggests: firewalld, kmod
Breaks: iptables-nftables-compat (<< 1.6.2~)
Description: administration tools for packet filtering and NAT
 The iptables/xtables framework has been replaced by nftables. You should
 consider migrating now.
 .
 iptables is the userspace command line program used to configure
 the Linux packet filtering and NAT ruleset. It is targeted towards systems
 and networks administrators.
 .
 This package contains several different utilities, the most important ones:
 .
 iptables-nft, iptables-nft-save, iptables-nft-restore (nft-based version)
 .
 iptables-legacy, iptables-legacy-save, iptables-legacy-restore (legacy version)
 .
 ip6tables-nft, ip6tables-nft-save, ip6tables-nft-restore (nft-based version)
 .
 ip6tables-legacy, ip6tables-legacy-save, ip6tables-legacy-restore (legacy
 version)
 .
 arptables-nft, arptables-nft-save, arptables-nft-restore (nft-based version)
 .
 ebtables-nft, ebtables-nft-save, ebtables-nft-restore (nft-based version)
Homepage: https://www.netfilter.org/

Package: iputils-ping
Status: install ok installed
Priority: important
Section: net
Installed-Size: 121
Maintainer: Noah Meyerhans <noahm@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: iputils
Version: 3:20221126-1+deb12u1
Provides: ping
Depends: libcap2-bin, libc6 (>= 2.34), libcap2 (>= 1:2.10), libidn2-0 (>= 0.6)
Description: Tools to test the reachability of network hosts
 The ping command sends ICMP ECHO_REQUEST packets to a host in order to
 test if the host is reachable via the network.
 .
 This package includes a ping6 utility which supports IPv6 network
 connections.
Homepage: https://github.com/iputils/iputils/

Package: isc-dhcp-client
Status: install ok installed
Priority: important
Section: net
Installed-Size: 2857
Maintainer: Debian ISC DHCP Maintainers <isc-dhcp@packages.debian.org>
Architecture: amd64
Source: isc-dhcp
Version: 4.4.3-P1-2
Provides: dhcp-client
Depends: libc6 (>= 2.36), debianutils (>= 2.8.2), iproute2
Recommends: isc-dhcp-common
Suggests: resolvconf, avahi-autoipd, isc-dhcp-client-ddns
Conffiles:
 /etc/apparmor.d/sbin.dhclient 4b18441217660d94d1edd6341e0775d1
 /etc/dhcp/debug 521717b5f9e08db15893d3d062c59aeb
 /etc/dhcp/dhclient-exit-hooks.d/rfc3442-classless-routes 95e21c32fa7f603db75f1dc33db53cf5
 /etc/dhcp/dhclient.conf 649563ef7a61912664a400a5263958a6
Description: DHCP client for automatically obtaining an IP address
 This is the Internet Software Consortium's DHCP client.
 .
 Dynamic Host Configuration Protocol (DHCP) is a protocol like BOOTP
 (actually dhcpd includes much of the functionality of bootpd). It
 gives client machines "leases" for IP addresses and can
 automatically set their network configuration. If your machine
 depends on DHCP (especially likely if it's a workstation on a large
 network, or a laptop, or attached to a cable modem), keep this or
 another DHCP client installed.
 .
 Extra documentation can be found in the package isc-dhcp-common.
 .
 ISC has decided to stop maintaining the client and relay parts of isc-dhcp,
 and they will be removed after the 4.4.3 release, keeping only the server
 component. Please, consider using an alternative for isc-dhcp-client
 (dhclient).
 .
 More information can be found in the ISC official announcement:
 https://www.isc.org/blogs/dhcp-client-relay-eom/
Homepage: http://www.isc.org

Package: isc-dhcp-common
Status: install ok installed
Priority: important
Section: net
Installed-Size: 122
Maintainer: Debian ISC DHCP Maintainers <isc-dhcp@packages.debian.org>
Architecture: amd64
Source: isc-dhcp
Version: 4.4.3-P1-2
Depends: debianutils (>= 2.8.2)
Description: common manpages relevant to all of the isc-dhcp packages
 This package includes manpages that are relevant to the various ISC DHCP
 packages.
 .
 The dhcp-options manpage describes available options for dhcpd and dhclient.
 The dhcp-eval manpage describes evaluation of conditional expressions.
Homepage: http://www.isc.org

Package: iso-codes
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 20086
Maintainer: Dr. Tobias Quathamer <toddy@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 4.15.0-1
Suggests: isoquery
Description: ISO language, territory, currency, script codes and their translations
 This package provides the ISO 639, ISO 639-3, and ISO 639-5 language
 code lists, the ISO 4217 currency code list, the ISO 3166 territory
 code list, the ISO 3166-2 sub-territory list, and the ISO 15924
 script code list as JSON files.
 .
 More importantly, it also provides their translations to be used by
 other programs.
Homepage: https://salsa.debian.org/iso-codes-team/iso-codes

Package: ispell
Status: install ok installed
Priority: optional
Section: text
Installed-Size: 381
Maintainer: Robert Luberda <robert@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 3.4.05-1
Depends: libc6 (>= 2.33), libtinfo6 (>= 6)
Recommends: iamerican | ispell-dictionary, wamerican | wordlist
Suggests: spell
Breaks: ifinnish (<= 0.7-17.3), ifinnish-large (<= 0.7-17.3)
Description: International Ispell (an interactive spelling corrector)
 Ispell corrects spelling in plain text, LaTeX, sgml/html/xml, and nroff files.
 [x]Emacs and jed have nice interfaces to ispell, and ispell works from many
 other tools and from the command line as well.
 .
 No ispell dictionaries are included in this package; you must install
 at least one of them ("iamerican" is recommended by default for no good
 reason); install the "ispell-dictionary" package(s) for the language(s)
 you and your users will want to spell-check.
 .
 It's a good idea to install "word list" package(s) for the same language(s),
 because they'll be used by ispell's (L)ookup command.
Homepage: https://www.cs.hmc.edu/~geoff/ispell.html

Package: iucode-tool
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 109
Maintainer: Henrique de Moraes Holschuh <hmh@debian.org>
Architecture: amd64
Version: 2.3.1-3
Depends: libc6 (>= 2.34)
Suggests: intel-microcode (>= 1)
Description: Intel processor microcode tool
 iucode_tool is a program to manipulate Intel® X86 and X86-64 processor
 microcode collections, and to use the kernel facilities to upgrade the
 microcode on Intel system processors.
 .
 It can load microcode data files in text and binary format, sort, list and
 filter the microcodes contained in these files, write selected microcodes to a
 new file in binary format, or upload them to the kernel.
 .
 It operates on non-free microcode data downloaded directly from Intel or
 installed by the intel-microcode package.
Homepage: https://gitlab.com/iucode-tool

Package: kbd
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 1815
Maintainer: Console utilities maintainers <pkg-kbd-devel@lists.alioth.debian.org>
Architecture: amd64
Source: kbd (2.5.1-1)
Version: 2.5.1-1+b1
Provides: console-utilities
Depends: libc6 (>= 2.34)
Recommends: console-setup | console-data
Conflicts: console-utilities
Description: Linux console font and keytable utilities
 This package allows you to set up the Linux console, change the font,
 resize text mode virtual consoles and remap the keyboard.
 .
 You will probably want to install the “console-setup” package which
 sets up console font and keymap data files.
Homepage: http://www.kbd-project.org/

Package: keyboard-configuration
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 2798
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: console-setup
Version: 1.221
Replaces: console-setup (<< 1.47), console-setup-mini (<< 1.47)
Depends: debconf (>= 0.5) | debconf-2.0, liblocale-gettext-perl, xkb-data (>= 2.35.1~), xkb-data (<< 2.35.1A)
Pre-Depends: debconf | debconf-2.0
Breaks: console-setup (<< 1.71), console-setup-mini (<< 1.47)
Description: system-wide keyboard preferences
 This package maintains the keyboard preferences in
 /etc/default/keyboard.  Other packages can use the information
 provided by this package in order to configure the keyboard on the
 console or in X Window.

Package: keyutils
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 161
Maintainer: Christian Kastner <ckk@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.6.3-2
Depends: libc6 (>= 2.34), libkeyutils1 (>= 1.6.3)
Conffiles:
 /etc/request-key.conf 8ad8d7d3deb6e3fbaaf483ed94fb6284
Description: Linux Key Management Utilities
 Keyutils is a set of utilities for managing the key retention facility in the
 kernel, which can be used by filesystems, block devices and more to gain and
 retain the authorization and encryption keys required to perform secure
 operations.
Homepage: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git

Package: klibc-utils
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 569
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: klibc
Version: 2.0.12-1
Depends: libklibc (= 2.0.12-1)
Description: small utilities built with klibc for early boot
 This package contains a collection of programs that are linked
 against klibc. These duplicate some of the functionality of a
 regular Linux toolset, but are typically much smaller than their
 full-function counterparts.  They are intended for inclusion in
 initramfs images and embedded systems.
Homepage: https://git.kernel.org/cgit/libs/klibc/klibc.git

Package: kmod
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 251
Maintainer: Marco d'Itri <md@linux.it>
Architecture: amd64
Multi-Arch: foreign
Version: 30+20221128-1
Depends: libc6 (>= 2.34), liblzma5 (>= 5.1.1alpha+20120614), libssl3 (>= 3.0.0), libzstd1 (>= 1.5.2), libkmod2 (= 30+20221128-1)
Conffiles:
 /etc/init.d/kmod c5df572a7bc622632284b75441ee066e
Description: tools for managing Linux kernel modules
 This package contains a set of programs for loading, inserting, and
 removing kernel modules for Linux.
 It replaces module-init-tools.

Package: krb5-locales
Status: install ok installed
Priority: optional
Section: localization
Installed-Size: 273
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: all
Multi-Arch: foreign
Source: krb5
Version: 1.20.1-2+deb12u3
Description: internationalization support for MIT Kerberos
 Kerberos is a system for authenticating users and services on a network.
 Kerberos is a trusted third-party service.  That means that there is a
 third party (the Kerberos server) that is trusted by all the entities on
 the network (users and services, usually called "principals").
 .
 This is the MIT reference implementation of Kerberos V5.
 .
 This package contains internationalized messages for MIT Kerberos.
Homepage: https://web.mit.edu/kerberos/

Package: laptop-detect
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 20
Maintainer: Simó Albert i Beltran <sim6@probeta.net>
Architecture: all
Version: 0.16
Recommends: dmidecode
Description: system chassis type checker
 This package provides a simple shell script which attempts to determine
 whether it is being run on a laptop (or similar portable machine). It is
 mainly useful for installers.
Homepage: https://gitlab.com/debiants/laptop-detect

Package: less
Status: install ok installed
Priority: important
Section: text
Installed-Size: 313
Maintainer: Milan Kupcevic <milan@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 590-2.1~deb12u2
Depends: libc6 (>= 2.34), libtinfo6 (>= 6)
Description: pager program similar to more
 This package provides "less", a file pager (that is, a memory-efficient
 utility for displaying text one screenful at a time). Less has many
 more features than the basic pager "more". As part of the GNU project,
 it is widely regarded as the standard pager on UNIX-derived systems.
 .
 Also provided are "lessecho", a simple utility for ensuring arguments
 with spaces are correctly quoted; "lesskey", a tool for modifying the
 standard (vi-like) keybindings; and "lesspipe", a filter for specific
 types of input, such as .doc or .txt.gz files.
Homepage: http://www.greenwoodsoftware.com/less/

Package: libabsl20220623
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1913
Maintainer: Benjamin Barenblat <bbaren@debian.org>
Architecture: amd64
Multi-Arch: same
Source: abseil
Version: 20220623.1-1+deb12u2
Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.0), libstdc++6 (>= 11)
Description: extensions to the C++ standard library
 Abseil is an open-source collection of C++ library code designed to augment the
 C++ standard library. The Abseil library code is collected from Google's C++
 codebase and has been extensively tested and used in production. In some cases,
 Abseil provides pieces missing from the C++ standard; in others, Abseil
 provides alternatives to the standard for special needs.
 .
 This package contains Abseil's shared libraries.
Homepage: https://abseil.io/

Package: libacl1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 73
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: acl
Version: 2.3.1-3
Depends: libc6 (>= 2.33)
Description: access control list - shared library
 This package contains the shared library containing the POSIX 1003.1e
 draft standard 17 functions for manipulating access control lists.
Homepage: https://savannah.nongnu.org/projects/acl/

Package: libafflib0v5
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 565
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: afflib
Version: 3.7.20-1
Replaces: libafflib0
Depends: libc6 (>= 2.34), libcurl4 (>= 7.16.2), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.0), libssl3 (>= 3.0.0), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
Conflicts: libafflib0
Description: Advanced Forensics Format Library
 The Advanced Forensic Format (AFF) is on-disk format for storing
 computer forensic information. Critical features of AFF include:
 .
  - AFF allows you to store both computer forensic data and associated
    metadata in one or more files.
  - AFF allows files to be digital signed, to provide for
    chain-of-custody and long-term file integrity.
  - AFF allows for forensic disk images to stored encrypted and
    decrypted on-the-fly for processing. This allows disk images
    containing privacy sensitive material to be stored on the Internet.
Homepage: https://github.com/sshock/AFFLIBv3

Package: libaio1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 37
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libaio
Version: 0.3.113-4
Depends: libc6 (>= 2.4)
Description: Linux kernel AIO access library - shared library
 This library enables userspace to use Linux kernel asynchronous I/O
 system calls, important for the performance of databases and other
 advanced applications.
 .
 This package contains the shared library.
Homepage: https://pagure.io/libaio

Package: libalgorithm-diff-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 129
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 1.201-1
Depends: perl:any
Recommends: libalgorithm-diff-xs-perl
Description: module to find differences between files
 Algorithm::Diff is a Perl module that allows users to analyze text based on a
 Longest Common Subsequence (LCS) algorithm. It can compare two files and find
 the differences between them, which can produce the same information as the
 common Unix tool 'diff'.
 .
 There is an XS-optimized implementation of the core loop, which accelerates
 some types of diff output (see libalgorithm-diff-xs-perl).
Homepage: https://metacpan.org/release/Algorithm-Diff

Package: libalgorithm-diff-xs-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 47
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libalgorithm-diff-xs-perl (0.04-8)
Version: 0.04-8+b1
Depends: perl (>= 5.36.0-4), perlapi-5.36.0, libc6 (>= 2.14), libalgorithm-diff-perl
Description: module to find differences between files (XS accelerated)
 Algorithm::Diff::XS is a Perl diff utility module based on Joe Schaefer's
 excellent but not very well-known Algorithm::LCS module, with a drop-in
 interface identical to Algorithm::Diff.
 .
 Note that only the LCSidx function is optimized in XS at the moment, which
 means only compact_diff will get significantly faster for large data sets,
 while diff and sdiff will run in identical speed as Algorithm::Diff.
Homepage: https://metacpan.org/release/Algorithm-Diff-XS

Package: libalgorithm-merge-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 43
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.08-5
Depends: perl:any, libalgorithm-diff-perl
Description: Perl module for three-way merge of textual data
 Algorithm::Merge provides three-way merge and diff functions, complementing
 the functionality offered by Algorithm::Diff (libalgorithm-diff-perl). Given
 three sets of items, known as the original, left and right, this module can
 take a three-way difference or merge them. Taking a difference provides an
 array reference that is very similar to the behaviour of Algorithm::Diff. One
 can also implement custom conflict resolution using the CONFLICT callback.
Homepage: https://metacpan.org/release/Algorithm-Merge

Package: libaom3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 5550
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: aom
Version: 3.6.0-1+deb12u1
Depends: libc6 (>= 2.34)
Description: AV1 Video Codec Library
 AOMedia Video 1 (AV1) is an open and royalty free video encoding format
 optimized for the Internet and the successor of VP9. aom is the
 reference encoder and decoder implementation published by the Alliance
 for Open Media.
 .
 This package contains the shared library.
Homepage: https://aomedia.googlesource.com/aom/

Package: libapparmor1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 109
Maintainer: Debian AppArmor Team <pkg-apparmor-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: apparmor
Version: 3.0.8-3
Replaces: libapparmor-perl (<< 3.0.3-3)
Depends: libc6 (>= 2.34)
Breaks: libapparmor-perl (<< 3.0.3-3)
Description: changehat AppArmor library
 libapparmor1 provides a shared library one can compile programs
 against in order to use various AppArmor functionality,
 such as transitioning to a different AppArmor profile or hat.
Homepage: https://apparmor.net/

Package: libapt-pkg6.0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 3297
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: apt
Version: 2.6.1
Provides: libapt-pkg (= 2.6.1)
Depends: libbz2-1.0, libc6 (>= 2.34), libgcc-s1 (>= 3.0), libgcrypt20 (>= 1.10.0), liblz4-1 (>= 0.0~r127), liblzma5 (>= 5.1.1alpha+20120614), libstdc++6 (>= 11), libsystemd0 (>= 221), libudev1 (>= 183), libxxhash0 (>= 0.7.1), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.2.2.3)
Recommends: apt (>= 2.6.1)
Breaks: appstream (<< 0.9.0-3~), apt (<< 1.6~), aptitude (<< 0.8.9), dpkg (<< 1.20.8), libapt-inst1.5 (<< 0.9.9~)
Description: package management runtime library
 This library provides the common functionality for searching and
 managing packages as well as information about packages.
 Higher-level package managers can depend upon this library.
 .
 This includes:
  * retrieval of information about packages from multiple sources
  * retrieval of packages and all dependent packages
    needed to satisfy a request either through an internal
    solver or by interfacing with an external one
  * authenticating the sources and validating the retrieved data
  * installation and removal of packages in the system
  * providing different transports to retrieve data over cdrom, ftp,
    http(s), rsh as well as an interface to add more transports like
    tor+http(s) (apt-transport-tor).

Package: libargon2-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 56
Maintainer: Luca Bruno <lucab@debian.org>
Architecture: amd64
Multi-Arch: same
Source: argon2
Version: 0~20171227-0.3+deb12u1
Depends: libc6 (>= 2.34)
Breaks: cryptsetup-initramfs (<< 2:2.6.1-2)
Description: memory-hard hashing function - runtime library
 Argon2 is a password-hashing function that can be used to hash passwords
 for credential storage, key derivation, or other applications.
 .
 There are two main versions of Argon2: Argon2i and Argon2d.
 Argon2i is the safest against side-channel attacks, while Argon2d provides
 the highest resistance against GPU cracking attacks.
 .
 Argon2i and Argon2d are parametrized by:
  * A time cost, which defines the amount of computation realized and
    therefore the execution time, given in number of iterations
  * A memory cost, which defines the memory usage, given in kibibytes
  * A parallelism degree, which defines the number of parallel threads
 .
 This package includes the dynamic library against which programs are linked.
Homepage: https://github.com/P-H-C/phc-winner-argon2

Package: libasan8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 8017
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34), libgcc-s1 (>= 3.3)
Description: AddressSanitizer -- a fast memory error detector
 AddressSanitizer (ASan) is a fast memory error detector.  It finds
 use-after-free and {heap,stack,global}-buffer overflow bugs in C/C++ programs.
Homepage: http://gcc.gnu.org/

Package: libassuan0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 117
Maintainer: Debian GnuPG-Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libassuan
Version: 2.5.5-5
Depends: libc6 (>= 2.34), libgpg-error0 (>= 1.33)
Description: IPC library for the GnuPG components
 Libassuan is a small library implementing the so-called "Assuan
 protocol". This protocol is used for IPC between most newer GnuPG
 components. Both server and client side functions are provided.
Homepage: https://www.gnupg.org/related_software/libassuan/index.html

Package: libatomic1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 45
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.14)
Description: support library providing __atomic built-in functions
 library providing __atomic built-in functions. When an atomic call cannot
 be turned into lock-free instructions, GCC will make calls into this library.
Homepage: http://gcc.gnu.org/

Package: libattr1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 59
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: attr
Version: 1:2.5.1-4
Depends: libc6 (>= 2.4)
Conffiles:
 /etc/xattr.conf 743ca3f83ea263f1f56ad1f63f907bdb
Description: extended attribute handling - shared library
 Contains the runtime environment required by programs that make use
 of extended attributes.
Homepage: https://savannah.nongnu.org/projects/attr/

Package: libaudit-common
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 22
Maintainer: Laurent Bigonville <bigon@debian.org>
Architecture: all
Multi-Arch: foreign
Source: audit
Version: 1:3.0.9-1
Conffiles:
 /etc/libaudit.conf cdc703f9d27f0d980271a9e95d0f18b2
Description: Dynamic library for security auditing - common files
 The audit-libs package contains the dynamic libraries needed for
 applications to use the audit framework. It is used to monitor systems for
 security related events.
 .
 This package contains the libaudit.conf configuration file and the associated
 manpage.
Homepage: https://people.redhat.com/sgrubb/audit/

Package: libaudit1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 150
Maintainer: Laurent Bigonville <bigon@debian.org>
Architecture: amd64
Multi-Arch: same
Source: audit
Version: 1:3.0.9-1
Depends: libaudit-common (>= 1:3.0.9-1), libc6 (>= 2.33), libcap-ng0 (>= 0.7.9)
Description: Dynamic library for security auditing
 The audit-libs package contains the dynamic libraries needed for
 applications to use the audit framework. It is used to monitor systems for
 security related events.
Homepage: https://people.redhat.com/sgrubb/audit/

Package: libavif15
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 203
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libavif
Version: 0.11.1-1+deb12u1
Depends: libaom3 (>= 3.2.0), libc6 (>= 2.14), libdav1d6 (>= 0.1.0), libgav1-1 (>= 0.18.0), librav1e0 (>= 0.5.1), libsvtav1enc1 (>= 1.4.1+dfsg), libyuv0 (>= 0.0~git20221206)
Description: Library for handling .avif files
 This library aims to be a friendly, portable C implementation of the AV1
 Image File Format as described in https://aomediacodec.github.io/av1-avif/.
 .
 This package provides the shared library files.
Homepage: https://github.com/AOMediaCodec/libavif

Package: libbfio1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 885
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libbfio
Version: 20170123-6
Depends: libc6 (>= 2.14)
Description: Library to provide basic input/output abstraction
 Libbfio is a library to provide basic file input/output abstraction. It is
 used in multiple other libraries like libewf, libmsiecf, libnk2, libolecf and
 libpff. It is used to chain I/O to support file-in-file access.
 .
 This package contains the shared library.
Homepage: https://github.com/libyal/libbfio

Package: libbinutils
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 2469
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: binutils
Version: 2.40-2
Replaces: binutils (<< 2.29-6)
Depends: libc6 (>= 2.34), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.2.0), binutils-common (= 2.40-2)
Breaks: binutils (<< 2.29-6)
Description: GNU binary utilities (private shared library)
 This package includes the private shared libraries libbfd and libopcodes.
Homepage: https://www.gnu.org/software/binutils/

Package: libblas3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 464
Maintainer: Debian Science Team <debian-science-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lapack
Version: 3.11.0-2
Provides: libblas.so.3
Depends: libc6 (>= 2.14)
Description: Basic Linear Algebra Reference implementations, shared library
 BLAS (Basic Linear Algebra Subroutines) is a set of efficient
 routines for most of the basic vector and matrix operations.
 They are widely used as the basis for other high quality linear
 algebra software, for example lapack and linpack.  This
 implementation is the Fortran 77 reference implementation found
 at netlib.
 .
 This package contains a shared version of the library.
Homepage: https://www.netlib.org/lapack/

Package: libblkid1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 398
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libc6 (>= 2.33)
Description: block device ID library
 The blkid library allows system programs such as fsck and mount to
 quickly and easily find block devices by filesystem UUID or label.
 This allows system administrators to avoid specifying filesystems by
 hard-coded device names and use a logical naming system instead.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: libbpf1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 384
Maintainer: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Architecture: amd64
Multi-Arch: same
Source: libbpf (1.1.0-1)
Version: 1:1.1.0-1
Depends: libc6 (>= 2.34), libelf1 (>= 0.144), zlib1g (>= 1:1.2.3.3)
Description: eBPF helper library (shared library)
 libbpf is a library for loading eBPF programs and reading and
 manipulating eBPF objects from user-space.
 .
 This package contains the shared library.

Package: libbrotli1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 783
Maintainer: Tomasz Buchert <tomasz@debian.org>
Architecture: amd64
Multi-Arch: same
Source: brotli (1.0.9-2)
Version: 1.0.9-2+b6
Depends: libc6 (>= 2.29)
Description: library implementing brotli encoder and decoder (shared libraries)
 Brotli is a generic-purpose lossless compression algorithm
 that compresses data using a combination of a modern variant
 of the LZ77 algorithm, Huffman coding and 2nd order context modeling,
 with a compression ratio comparable to the best currently available
 general-purpose compression methods. It is similar in speed with
 deflate but offers more dense compression.
 .
 This package installs shared libraries.
Homepage: https://github.com/google/brotli

Package: libbsd0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 202
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libbsd
Version: 0.11.7-2
Depends: libc6 (>= 2.34), libmd0 (>= 1.0.3-2)
Description: utility functions from BSD systems - shared library
 This library provides some C functions such as strlcpy() that are commonly
 available on BSD systems but not on others like GNU systems.
 .
 For a detailed list of the provided functions, please see the libbsd-dev
 package description.
Homepage: https://libbsd.freedesktop.org/

Package: libbz2-1.0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 106
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: amd64
Multi-Arch: same
Source: bzip2 (1.0.8-5)
Version: 1.0.8-5+b1
Depends: libc6 (>= 2.4)
Description: high-quality block-sorting file compressor library - runtime
 This package contains libbzip2 which is used by the bzip2 compressor.
 .
 bzip2 is a freely available, patent free, data compressor.
 .
 bzip2 compresses files using the Burrows-Wheeler block-sorting text
 compression algorithm, and Huffman coding.  Compression is generally
 considerably better than that achieved by more conventional
 LZ77/LZ78-based compressors, and approaches the performance of the PPM
 family of statistical compressors.
 .
 The archive file format of bzip2 (.bz2) is incompatible with that of its
 predecessor, bzip (.bz).
Homepage: https://sourceware.org/bzip2/

Package: libc-bin
Essential: yes
Status: install ok installed
Priority: required
Section: libs
Installed-Size: 2041
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: glibc
Version: 2.36-9+deb12u10
Depends: libc6 (>> 2.36), libc6 (<< 2.37)
Recommends: manpages
Breaks: dh-lua (<< 27+nmu1~)
Conffiles:
 /etc/bindresvport.blacklist 4c09213317e4e3dd3c71d74404e503c5
 /etc/default/nss d6d5d6f621fb3ead2548076ce81e309c
 /etc/gai.conf 28fa76ff5a9e0566eaa1e11f1ce51f09
 /etc/ld.so.conf 4317c6de8564b68d628c21efa96b37e4
 /etc/ld.so.conf.d/libc.conf d4d833fd095fb7b90e1bb4a547f16de6
Description: GNU C Library: Binaries
 This package contains utility programs related to the GNU C Library.
 .
  * getconf: query system configuration variables
  * getent: get entries from administrative databases
  * iconv, iconvconfig: convert between character encodings
  * ldd, ldconfig: print/configure shared library dependencies
  * locale, localedef: show/generate locale definitions
  * tzselect, zdump, zic: select/dump/compile time zones
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libc-dev-bin
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 93
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: glibc
Version: 2.36-9+deb12u10
Depends: libc6 (>> 2.36), libc6 (<< 2.37)
Recommends: manpages, manpages-dev, libc-devtools (>> 2.36)
Description: GNU C Library: Development binaries
 This package contains utility programs related to the GNU C Library
 development package.
 .
  * gencat: generate message catalogs
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libc-devtools
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 137
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: glibc
Version: 2.36-9+deb12u10
Replaces: libc-dev-bin (<< 2.31-8)
Depends: libc6 (>= 2.34), libgd3 (>= 2.1.0~alpha~)
Recommends: manpages, manpages-dev
Breaks: libc-dev-bin (<< 2.31-8)
Description: GNU C Library: Development tools
 This package contains development tools shipped by the GNU C
 Library.
 .
  * memusage, memusagestat: profile a program's memory usage
  * mtrace: interpret the malloc trace log
  * sotruss: trace shared library calls
  * sprof: display shared object profiling data
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libc-l10n
Status: install ok installed
Priority: standard
Section: localization
Installed-Size: 4349
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: glibc
Version: 2.36-9+deb12u10
Description: GNU C Library: localization files
 This package contains the translation files for the GNU C library and
 utility programs.
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libc6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 12996
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: glibc
Version: 2.36-9+deb12u10
Replaces: libc6-amd64
Depends: libgcc-s1
Recommends: libidn2-0 (>= 2.0.5~)
Suggests: glibc-doc, debconf | debconf-2.0, libc-l10n, locales, libnss-nis, libnss-nisplus
Breaks: aide (<< 0.17.3-4+b3), busybox (<< 1.30.1-6), chrony (<< 4.2-3~), fakechroot (<< 2.19-3.5), firefox (<< 91~), firefox-esr (<< 91~), gnumach-image-1.8-486 (<< 2:1.8+git20210923~), gnumach-image-1.8-486-dbg (<< 2:1.8+git20210923~), gnumach-image-1.8-xen-486 (<< 2:1.8+git20210923~), gnumach-image-1.8-xen-486-dbg (<< 2:1.8+git20210923~), hurd (<< 1:0.9.git20220301-2), ioquake3 (<< 1.36+u20200211.f2c61c1~dfsg-2~), iraf-fitsutil (<< 2018.07.06-4), libgegl-0.4-0 (<< 0.4.18), libtirpc1 (<< 0.2.3), locales (<< 2.36), locales-all (<< 2.36), macs (<< 2.2.7.1-3~), nocache (<< 1.1-1~), nscd (<< 2.36), openarena (<< 0.8.8+dfsg-4~), openssh-server (<< 1:8.1p1-5), python3-iptables (<< 1.0.0-2), r-cran-later (<< 0.7.5+dfsg-2), tinydns (<< 1:1.05-14), valgrind (<< 1:3.19.0-1~), wcc (<< 0.0.2+dfsg-3)
Conffiles:
 /etc/ld.so.conf.d/x86_64-linux-gnu.conf d4e7a7b88a71b5ffd9e2644e71a0cfab
Description: GNU C Library: Shared libraries
 Contains the standard libraries that are used by nearly all programs on
 the system. This package includes shared versions of the standard C library
 and the standard math library, as well as many others.
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libc6-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 11974
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: glibc
Version: 2.36-9+deb12u10
Replaces: libc6 (<= 2.32-1)
Provides: libc-dev (= 2.36-9+deb12u10)
Depends: libc6 (= 2.36-9+deb12u10), libc-dev-bin (= 2.36-9+deb12u10), linux-libc-dev, libcrypt-dev, libnsl-dev, rpcsvc-proto
Suggests: glibc-doc, manpages-dev
Breaks: binutils (<< 2.38), catch (<< 1.12.2-0.1), heimdal-multidev (<= 7.7.0+dfsg-4), igblast (<= 1.19.0-1), libassimp-dev (<= 5.2.4~ds0-1), libasyncns-dev (<= 0.8-6+b2), libatm1-dev (<= 1:2.5.1-4), libaws20-dev (<= 20.2-2+b1), libboinc-app-dev (<= 7.20.2+dfsg-1), libbson-dev (<= 1.22.0-1), libc6-dev-amd64-cross (<< 2.36~), libcups2-dev (<= 2.4.2-1), libdeal.ii-dev (<= 9.4.0-1), libdkim-dev (<= 1:1.0.21-4+b2), libdolfin-dev-common (<= 2019.2.0~git20220407.d29e24d-5), libeckit-dev (<= 1.20.0-1), libfclib-dev (<= 3.1.0+dfsg-2), libfltk1.3-dev (<= 1.3.8-4+b1), libgcc-10-dev (<< 10-20200321-1~), libgcc-7-dev (<< 7.5.0-6~), libgcc-8-dev (<< 8.4.0-2~), libgcc-9-dev (<< 9.3.0-5~), libghc-resolv-dev (<= 0.1.2.0-3), libghc-resolv-prof (<= 0.1.2.0-3), libglib2.0-dev (<= 2.72.3-1), libgloox-dev (<= 1.0.24-2+b1), libhesiod-dev (<= 3.2.1-3.1+b1), libinfinity-0.7-dev (<= 0.7.2-1+b1), libinsighttoolkit4-dev (<= 4.13.3withdata-dfsg2-3+b1), libinsighttoolkit5-dev (<= 5.2.1-5+b1), libismrmrd-dev (<= 1.8.0-2), libldap-dev (<= 2.5.12+dfsg-2), liblog4cplus-dev (<= 2.0.7-1), libloudmouth1-dev (<= 1.5.4-1), libmgl-dev (<= 8.0.1-2), libmimalloc2.0 (<= 2.0.6+ds-1), libminc-dev (<= 2.4.03-5), libmongoc-dev (<= 1.22.1-1), libmrpt-ros1bridge-dev (<= 1:2.4.9+ds-4+b2), libmysqlclient-dev (<= 8.0.29-1), libnetcdf-dev (<= 1:4.9.0-3), libnetcdf-mpi-dev (<= 1:4.9.0-1), libnetcdf-pnetcdf-dev (<= 1:4.9.0-1), libnfsidmap-dev (<= 1:2.6.1-2), libns3-dev (<= 3.36.1+dfsg-4), libola-dev (<= 0.10.8.nojsmin-2), libopenafs-dev (<= 1.8.8.1-3), libopendkim-dev (<= 2.11.0~beta2-7), libopendmarc-dev (<= 1.4.2-1), libopenms-dev (<= 2.6.0+cleaned1-3+b1), libopenzwave1.6-dev (<= 1.6.1914+ds-1), libperl5.26 (<< 5.26.1-3), libpg-query-dev (<= 13-2.1.2-2), librbl-dev (<= 2.11.0~beta2-7), libre-dev (<= 1.1.0-1+b1), libshishi-dev (<= 1.0.2-11), libslurm-dev (<= 21.08.8.2-1), libsocksd0-dev (<= 1.4.2+dfsg-7+b4), libspf2-dev (<= 1.2.10-7.1+b1), libstrophe-dev (<= 0.12.1-2), libtaningia-dev (<= 0.2.2-2+b1), libtrilinos-amesos-dev (<= 13.2.0-3), libtrilinos-amesos2-dev (<= 13.2.0-3), libtrilinos-anasazi-dev (<= 13.2.0-3), libtrilinos-aztecoo-dev (<= 13.2.0-3), libtrilinos-belos-dev (<= 13.2.0-3), libtrilinos-epetra-dev (<= 13.2.0-3), libtrilinos-epetraext-dev (<= 13.2.0-3), libtrilinos-galeri-dev (<= 13.2.0-3), libtrilinos-ifpack-dev (<= 13.2.0-3), libtrilinos-ifpack2-dev (<= 13.2.0-3), libtrilinos-intrepid-dev (<= 13.2.0-3), libtrilinos-intrepid2-dev (<= 13.2.0-3), libtrilinos-isorropia-dev (<= 13.2.0-3), libtrilinos-kokkos-dev (<= 13.2.0-3), libtrilinos-kokkos-kernels-dev (<= 13.2.0-3), libtrilinos-komplex-dev (<= 13.2.0-3), libtrilinos-ml-dev (<= 13.2.0-3), libtrilinos-moertel-dev (<= 13.2.0-3), libtrilinos-muelu-dev (<= 13.2.0-3), libtrilinos-nox-dev (<= 13.2.0-3), libtrilinos-phalanx-dev (<= 13.2.0-3), libtrilinos-pike-dev (<= 13.2.0-3), libtrilinos-piro-dev (<= 13.2.0-3), libtrilinos-pliris-dev (<= 13.2.0-3), libtrilinos-rol-dev (<= 13.2.0-3), libtrilinos-rtop-dev (<= 13.2.0-3), libtrilinos-rythmos-dev (<= 13.2.0-3), libtrilinos-sacado-dev (<= 13.2.0-3), libtrilinos-shylu-dev (<= 13.2.0-3), libtrilinos-stokhos-dev (<= 13.2.0-3), libtrilinos-stratimikos-dev (<= 13.2.0-3), libtrilinos-teko-dev (<= 13.2.0-3), libtrilinos-teuchos-dev (<= 13.2.0-3), libtrilinos-thyra-dev (<= 13.2.0-3), libtrilinos-tpetra-dev (<= 13.2.0-3), libtrilinos-trilinoscouplings-dev (<= 13.2.0-3), libtrilinos-triutils-dev (<= 13.2.0-3), libtrilinos-xpetra-dev (<= 13.2.0-3), libtrilinos-zoltan2-dev (<= 13.2.0-3), libvbr-dev (<= 2.11.0~beta2-7), libvisp-dev (<= 3.5.0-2+b1), libvotca-dev (<= 2022-3), libvtk6-dev (<= 6.3.0+dfsg2-8.1+b1), libvtk7-dev (<= 7.1.1+dfsg2-10.2), open-vm-tools-dev (<= 2:12.0.5-2), pidgin-librvp (<= 0.9.7cvs-3), proftpd-dev (<= 1.3.7d+dfsg-2), python3.7 (<< 3.7.7-1+b1), python3.8 (<< 3.8.2-1+b1), slurm-wlm-basic-plugins-dev (<= 21.08.8.2-1)
Conflicts: libc0.1-dev, libc0.3-dev, libc6.1-dev
Description: GNU C Library: Development Libraries and Header Files
 Contains the symlinks, headers, and object files needed to compile
 and link programs which use the standard C library.
Homepage: https://www.gnu.org/software/libc/libc.html

Package: libcap-ng0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 65
Maintainer: Håvard F. Aasen <havard.f.aasen@pfft.no>
Architecture: amd64
Multi-Arch: same
Source: libcap-ng (0.8.3-1)
Version: 0.8.3-1+b3
Depends: libc6 (>= 2.33)
Description: alternate POSIX capabilities library
 This library implements the user-space interfaces to the POSIX
 1003.1e capabilities available in Linux kernels.  These capabilities are
 a partitioning of the all powerful root privilege into a set of distinct
 privileges.
 .
 The libcap-ng library is intended to make programming with POSIX
 capabilities much easier than the traditional libcap library.
 .
 This package contains dynamic libraries for libcap-ng.
Homepage: https://people.redhat.com/sgrubb/libcap-ng

Package: libcap2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 94
Maintainer: Christian Kastner <ckk@debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1:2.66-4+deb12u1
Depends: libc6 (>= 2.34)
Description: POSIX 1003.1e capabilities (library)
 Libcap implements the user-space interfaces to the POSIX 1003.1e capabilities
 available in Linux kernels. These capabilities are a partitioning of the all
 powerful root privilege into a set of distinct privileges.
 .
 This package contains the shared library.
Homepage: https://sites.google.com/site/fullycapable/

Package: libcap2-bin
Status: install ok installed
Priority: important
Section: utils
Installed-Size: 132
Maintainer: Christian Kastner <ckk@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: libcap2
Version: 1:2.66-4+deb12u1
Replaces: libcap-bin
Depends: libc6 (>= 2.34), libcap2 (>= 1:2.63)
Recommends: libpam-cap
Breaks: libcap-bin
Description: POSIX 1003.1e capabilities (utilities)
 Libcap implements the user-space interfaces to the POSIX 1003.1e capabilities
 available in Linux kernels. These capabilities are a partitioning of the all
 powerful root privilege into a set of distinct privileges.
 .
 This package contains additional utilities.
Homepage: https://sites.google.com/site/fullycapable/

Package: libcbor0.8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 98
Maintainer: Vincent Bernat <bernat@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libcbor (0.8.0-2)
Version: 0.8.0-2+b1
Depends: libc6 (>= 2.14)
Description: library for parsing and generating CBOR (RFC 7049)
 CBOR is a general-purpose schema-less binary data format, defined in
 RFC 7049. This package provides a C library for parsing and generating
 CBOR. The main features are:
 .
  - Complete RFC conformance
  - Robust C99 implementation
  - Layered architecture offers both control and convenience
  - Flexible memory management
  - No shared global state - threading friendly
  - Proper handling of UTF-8
  - Full support for streams & incremental processing
  - Extensive documentation and test suite
  - No runtime dependencies, small footprint
 .
 This package contains the runtime library.
Homepage: https://github.com/PJK/libcbor

Package: libcc1-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 136
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.14), libgcc-s1 (>= 3.0), libstdc++6 (>= 5.2)
Description: GCC cc1 plugin for GDB
 libcc1 is a plugin for GDB.
Homepage: http://gcc.gnu.org/

Package: libcom-err2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 54
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Architecture: amd64
Multi-Arch: same
Source: e2fsprogs
Version: 1.47.0-2
Replaces: libcomerr2 (<< 1.43.9-1~)
Provides: libcomerr2 (= 1.47.0-2)
Depends: libc6 (>= 2.17)
Breaks: libcomerr2 (<< 1.43.9-1~)
Description: common error description library
 libcomerr is an attempt to present a common error-handling mechanism to
 manipulate the most common form of error code in a fashion that does not
 have the problems identified with mechanisms commonly in use.
Homepage: http://e2fsprogs.sourceforge.net

Package: libcrypt-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 341
Maintainer: Marco d'Itri <md@linux.it>
Architecture: amd64
Multi-Arch: same
Source: libxcrypt
Version: 1:4.4.33-2
Replaces: libc6-dev (<< 2.29-4), libcrypt1-dev, libcrypt2-dev, manpages-dev (<< 5.01-1)
Provides: libcrypt1-dev
Depends: libcrypt1 (= 1:4.4.33-2)
Breaks: libc6-dev (<< 2.29-4), manpages-dev (<< 5.01-1)
Conflicts: libcrypt1-dev, libcrypt2-dev
Description: libcrypt development files
 This package contains the files needed for developing applications that
 use libcrypt.

Package: libcrypt1
Protected: yes
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 233
Maintainer: Marco d'Itri <md@linux.it>
Architecture: amd64
Multi-Arch: same
Source: libxcrypt
Version: 1:4.4.33-2
Replaces: libc6 (<< 2.29-4)
Depends: libc6 (>= 2.36)
Conflicts: libpam0g (<< 1.4.0-10)
Description: libcrypt shared library
 libxcrypt is a modern library for one-way hashing of passwords.
 It supports DES, MD5, NTHASH, SUNMD5, SHA-2-256, SHA-2-512, and
 bcrypt-based password hashes
 It provides the traditional Unix 'crypt' and 'crypt_r' interfaces,
 as well as a set of extended interfaces like 'crypt_gensalt'.
Important: yes

Package: libcryptsetup12
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 563
Maintainer: Debian Cryptsetup Team <pkg-cryptsetup-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: same
Source: cryptsetup
Version: 2:2.6.1-4~deb12u2
Depends: libargon2-1 (>= 0~20171227), libblkid1 (>= 2.24.2), libc6 (>= 2.34), libdevmapper1.02.1 (>= 2:1.02.97), libjson-c5 (>= 0.15), libssl3 (>= 3.0.0), libuuid1 (>= 2.16)
Description: disk encryption support - shared library
 Cryptsetup provides an interface for configuring encryption on block
 devices (such as /home or swap partitions), using the Linux kernel
 device mapper target dm-crypt. It features integrated Linux Unified Key
 Setup (LUKS) support.
 .
 This package provides the libcryptsetup shared library.
Homepage: https://gitlab.com/cryptsetup/cryptsetup

Package: libctf-nobfd0
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 301
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: binutils
Version: 2.40-2
Replaces: libbinutils (<< 2.33.50.20191128-1~)
Depends: libc6 (>= 2.14), zlib1g (>= 1:1.2.0)
Breaks: libbinutils (<< 2.33.50.20191128-1~)
Description: Compact C Type Format library (runtime, no BFD dependency)
 This package includes the libctf-nobfd shared library.  The Compact C Type
 Format (CTF) is a way of representing information about a binary program
Homepage: https://www.gnu.org/software/binutils/

Package: libctf0
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 232
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: binutils
Version: 2.40-2
Depends: libbinutils (= 2.40-2), libc6 (>= 2.33), zlib1g (>= 1:1.2.0)
Description: Compact C Type Format library (runtime, BFD dependency)
 This package includes the libctf shared library.  The Compact C Type
 Format (CTF) is a way of representing information about a binary program
Homepage: https://www.gnu.org/software/binutils/

Package: libcurl3-gnutls
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 828
Maintainer: Alessandro Ghedini <ghedo@debian.org>
Architecture: amd64
Multi-Arch: same
Source: curl
Version: 7.88.1-10+deb12u12
Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.34), libgnutls30 (>= 3.7.5), libgssapi-krb5-2 (>= 1.17), libidn2-0 (>= 0.6), libldap-2.5-0 (>= 2.5.4), libnettle8, libnghttp2-14 (>= 1.50.0), libpsl5 (>= 0.16.0), librtmp1 (>= 2.3), libssh2-1 (>= 1.7.0), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Recommends: ca-certificates
Description: easy-to-use client-side URL transfer library (GnuTLS flavour)
 libcurl is an easy-to-use client-side URL transfer library, supporting DICT,
 FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S,
 RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
 .
 libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP
 form based upload, proxies, cookies, user+password authentication (Basic,
 Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling
 and more!
 .
 libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported,
 fast, thoroughly documented and is already used by many known, big and
 successful companies and numerous applications.
 .
 SSL support is provided by GnuTLS.
Homepage: https://curl.se/

Package: libcurl4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 840
Maintainer: Alessandro Ghedini <ghedo@debian.org>
Architecture: amd64
Multi-Arch: same
Source: curl
Version: 7.88.1-10+deb12u12
Replaces: libcurl3
Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.34), libgssapi-krb5-2 (>= 1.17), libidn2-0 (>= 0.6), libldap-2.5-0 (>= 2.5.4), libnghttp2-14 (>= 1.50.0), libpsl5 (>= 0.16.0), librtmp1 (>= 2.3), libssh2-1 (>= 1.7.0), libssl3 (>= 3.0.0), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Recommends: ca-certificates
Conflicts: libcurl3
Description: easy-to-use client-side URL transfer library (OpenSSL flavour)
 libcurl is an easy-to-use client-side URL transfer library, supporting DICT,
 FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S,
 RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
 .
 libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP
 form based upload, proxies, cookies, user+password authentication (Basic,
 Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling
 and more!
 .
 libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported,
 fast, thoroughly documented and is already used by many known, big and
 successful companies and numerous applications.
 .
 SSL support is provided by OpenSSL.
Homepage: https://curl.se/

Package: libdate-manip-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 11400
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 6.91-1
Depends: perl:any
Description: module for manipulating dates
 Date::Manip is a Perl module that contains a set of routines designed to make
 any common date/time manipulation easy to do. It aims to make operations like
 comparing two times, calculating a time a given amount of time from another,
 or parsing international times simpler.
 .
 The focus of Date::Manip has been to be able to do ANY desired date or time
 operation easily, though not necessarily quickly. There are other modules
 that can do a small subset of these operations quicker, so if speed is a
 primary issue, you should look elsewhere.
Homepage: https://metacpan.org/release/Date-Manip

Package: libdav1d6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1616
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: dav1d
Version: 1.0.0-2+deb12u1
Depends: libc6 (>= 2.34)
Description: fast and small AV1 video stream decoder (shared library)
 dav1d is an AOMedia Video 1 (AV1) cross-platform decoder and focused on speed
 and correctness.
 .
 dav1d supports the following features:
  * support for all features of the AV1 bitstream
  * support for all bitdepth, 8, 10 and 12bits
  * support for all chroma subsamplings 4:2:0, 4:2:2, 4:4:4 and grayscale
  * full acceleration for AVX-2 chips
  * full acceleration for SSSE3+ chips
  * full acceleration for ARMv8 chips
  * partial acceleration for ARMv7 chips
 .
 This package provides the shared library.
Homepage: https://www.videolan.org/projects/dav1d.html

Package: libdb5.3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1833
Maintainer: Bastian Germann <bage@debian.org>
Architecture: amd64
Multi-Arch: same
Source: db5.3
Version: 5.3.28+dfsg2-1
Depends: libc6 (>= 2.34)
Description: Berkeley v5.3 Database Libraries [runtime]
 This is the runtime package for programs that use the v5.3 Berkeley
 database library.
Homepage: http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/overview/index.html

Package: libdbus-1-3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 468
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: dbus
Version: 1.14.10-1~deb12u1
Depends: libc6 (>= 2.34), libsystemd0
Recommends: dbus
Description: simple interprocess messaging system (library)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 D-Bus supports broadcast messages, asynchronous messages (thus
 decreasing latency), authentication, and more. It is designed to be
 low-overhead; messages are sent using a binary protocol, not using
 XML. D-Bus also supports a method call mapping for its messages, but
 it is not required; this makes using the system quite simple.
 .
 It comes with several bindings, including GLib, Python, Qt and Java.
 .
 The message bus daemon can be found in the dbus-daemon package.
Homepage: https://dbus.freedesktop.org/

Package: libde265-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 470
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libde265
Version: 1.0.11-1+deb12u2
Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.0), libstdc++6 (>= 11)
Description: Open H.265 video codec implementation
 libde265 is an open source implementation of the H.265 video codec.
 It is written from scratch in plain C for simplicity and efficiency.
 Its simple API makes it easy to integrate it into other software.
Homepage: https://github.com/strukturag/libde265

Package: libdebconfclient0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 37
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: cdebconf
Version: 0.270
Depends: libc6 (>= 2.4)
Description: Debian Configuration Management System (C-implementation library)
 Debconf is a configuration management system for Debian packages. It is
 used by some packages to prompt you for information before they are
 installed. cdebconf is a reimplementation of the original debconf in C.
 .
 This library allows C programs to interface with cdebconf.

Package: libdeflate0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 161
Maintainer: Debian Med Packaging Team <debian-med-packaging@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libdeflate
Version: 1.14-1
Depends: libc6 (>= 2.14)
Description: fast, whole-buffer DEFLATE-based compression and decompression
 The supported formats are:
  * DEFLATE (raw)
  * zlib (a.k.a. DEFLATE with a zlib wrapper)
  * gzip (a.k.a. DEFLATE with a gzip wrapper)
 .
 libdeflate is heavily optimized. It is significantly faster than the zlib
 library, both for compression and decompression, and especially on x86
 processors. In addition, libdeflate provides optional high compression modes
 that provide a better compression ratio than the zlib's "level 9".
Homepage: https://github.com/ebiggers/libdeflate

Package: libdevmapper-event1.02.1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 53
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lvm2 (2.03.16-2)
Version: 2:1.02.185-2
Depends: libc6 (>= 2.33), libdevmapper1.02.1 (>= 2:1.02.97)
Description: Linux Kernel Device Mapper event support library
 The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management)
 Team's implementation of a minimalistic kernel-space driver that handles
 volume management, while keeping knowledge of the underlying device layout
 in user-space.  This makes it useful for not only LVM, but software raid,
 and other drivers that create "virtual" block devices.
 .
 This package contains the userspace library to help with event monitoring
 for devmapper devices, in conjunction with the dmevent daemon.
Homepage: https://sourceware.org/lvm2/

Package: libdevmapper1.02.1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 474
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lvm2 (2.03.16-2)
Version: 2:1.02.185-2
Depends: libc6 (>= 2.33), libselinux1 (>= 3.1~), libudev1 (>= 183), dmsetup (>= 2:1.02.185-2~)
Description: Linux Kernel Device Mapper userspace library
 The Linux Kernel Device Mapper is the LVM (Linux Logical Volume Management)
 Team's implementation of a minimalistic kernel-space driver that handles
 volume management, while keeping knowledge of the underlying device layout
 in user-space.  This makes it useful for not only LVM, but software raid,
 and other drivers that create "virtual" block devices.
 .
 This package contains the (user-space) shared library for accessing the
 device-mapper; it allows usage of the device-mapper through a clean,
 consistent interface (as opposed to through kernel ioctls).
Homepage: https://sourceware.org/lvm2/

Package: libdiscover2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 263
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: amd64
Source: discover
Version: 2.1.2-10
Depends: libc6 (>= 2.33), libexpat1 (>= 2.0.1), libusb-1.0-0 (>= 2:1.0.8), discover-data (>> 2.2004.04)
Conflicts: discover (<< 2.0), discover1 (<< 2.0), libdiscover1 (<< 2.0)
Conffiles:
 /etc/discover.conf.d/00discover 210206a7fc71cd0e5dae4836809e41e9
Description: hardware identification library
 libdiscover is a library enabling identification of various PCI,
 PCMCIA, and USB devices.

Package: libdpkg-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 1987
Maintainer: Dpkg Developers <debian-dpkg@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: dpkg
Version: 1.21.22
Depends: perl:any, dpkg (>= 1.18.11)
Recommends: libfile-fcntllock-perl, liblocale-gettext-perl, bzip2, xz-utils (>= 5.4.0)
Suggests: debian-keyring, gnupg | sq | sqop | pgpainless-cli, gpgv | sq | sqop | pgpainless-cli, gcc | c-compiler, binutils, patch, sensible-utils, git, bzr
Breaks: dgit (<< 3.13~), libsop-java-java (<< 4.0.7~), pgpainless-cli (<< 1.3.13~), pkg-kde-tools (<< 0.15.28~), sq (<< 0.25.0~), sqop (<< 0.27.2~)
Description: Dpkg perl modules
 This package provides the perl modules used by the scripts
 in dpkg-dev. They cover a wide range of functionality. Among them
 there are the following public modules:
 .
  - Dpkg: core variables
  - Dpkg::Arch: architecture handling functions
  - Dpkg::BuildFlags: set, modify and query compilation build flags
  - Dpkg::BuildInfo: build information functions
  - Dpkg::BuildOptions: parse and manipulate DEB_BUILD_OPTIONS
  - Dpkg::BuildProfiles: parse and manipulate build profiles
  - Dpkg::Changelog: parse changelogs
  - Dpkg::Changelog::Entry: represents a changelog entry
  - Dpkg::Changelog::Parse: generic changelog parser for dpkg-parsechangelog
  - Dpkg::Checksums: generate and parse checksums
  - Dpkg::Compression: simple database of available compression methods
  - Dpkg::Compression::FileHandle: transparently (de)compress files
  - Dpkg::Compression::Process: wrapper around compression tools
  - Dpkg::Conf: parse dpkg configuration files
  - Dpkg::Control: parse and manipulate Debian control information
    (.dsc, .changes, Packages/Sources entries, etc.)
  - Dpkg::Control::Changelog: represent fields output by dpkg-parsechangelog
  - Dpkg::Control::Fields: manage (list of known) control fields
  - Dpkg::Control::Hash: parse and manipulate a block of RFC822-like fields
  - Dpkg::Control::Info: parse files like debian/control
  - Dpkg::Control::Tests: parse files like debian/tests/control
  - Dpkg::Control::Tests::Entry: represents a debian/tests/control stanza
  - Dpkg::Deps: parse and manipulate dependencies
  - Dpkg::Deps::Simple: represents a single dependency statement
  - Dpkg::Deps::Multiple: base module to represent multiple dependencies
  - Dpkg::Deps::Union: list of unrelated dependencies
  - Dpkg::Deps::AND: list of AND dependencies
  - Dpkg::Deps::OR: list of OR dependencies
  - Dpkg::Deps::KnownFacts: list of installed and virtual packages
  - Dpkg::Exit: push, pop and run exit handlers
  - Dpkg::Gettext: wrapper around Locale::gettext
  - Dpkg::IPC: spawn sub-processes and feed/retrieve data
  - Dpkg::Index: collections of Dpkg::Control (Packages/Sources files for
    example)
  - Dpkg::Interface::Storable: base object serializer
  - Dpkg::Path: common path handling functions
  - Dpkg::Source::Format: manipulate debian/source/format files
  - Dpkg::Source::Package: extract Debian source packages
  - Dpkg::Substvars: substitute variables in strings
  - Dpkg::Vendor: identify current distribution vendor
  - Dpkg::Version: parse and manipulate Debian package versions
 .
 All the packages listed in Suggests or Recommends are used by some of the
 modules.
Homepage: https://wiki.debian.org/Teams/Dpkg

Package: libedit2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 258
Maintainer: LLVM Packaging Team <pkg-llvm-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libedit
Version: 3.1-20221030-2
Replaces: libedit-dev (<< 3.1-20180525-2~)
Depends: libbsd0 (>= 0.1.3), libc6 (>= 2.33), libtinfo6 (>= 6)
Description: BSD editline and history libraries
 Command line editor library provides generic line editing,
 history, and tokenization functions.
 .
 It slightly resembles GNU readline.
Homepage: https://www.thrysoee.dk/editline/

Package: libefiboot1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 117
Maintainer: Debian UEFI Maintainers <debian-efi@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: efivar
Version: 37-6
Depends: libc6 (>= 2.14), libefivar1 (>= 37)
Breaks: efibootmgr (<< 0.12-2)
Description: Library to manage UEFI variables
 Library to allow for the manipulation of UEFI variables related to booting.
Homepage: https://github.com/rhinstaller/efivar

Package: libefivar1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 170
Maintainer: Debian UEFI Maintainers <debian-efi@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: efivar
Version: 37-6
Depends: libc6 (>= 2.14)
Breaks: efibootmgr (<< 0.12-2)
Description: Library to manage UEFI variables
 Library to allow for the simple manipulation of UEFI variables.
Homepage: https://github.com/rhinstaller/efivar

Package: libelf1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1036
Maintainer: Debian Elfutils Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: elfutils
Version: 0.188-2.1
Depends: libc6 (>= 2.34), zlib1g (>= 1:1.1.4)
Description: library to read and write ELF files
 The libelf1 package provides a shared library which allows reading and
 writing ELF files on a high level.  Third party programs depend on
 this package to read internals of ELF files.  The programs of the
 elfutils package use it also to generate new ELF files.
 .
 This library is part of elfutils.
Homepage: https://sourceware.org/elfutils/

Package: liberror-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 73
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.17029-2
Depends: perl:any
Description: Perl module for error/exception handling in an OO-ish way
 The Error module provides two interfaces.  Firstly "Error" provides a
 procedural interface to exception handling. Secondly "Error" is a base class
 for errors/exceptions that can either be thrown, for subsequent catch, or can
 simply be recorded.
 .
 Errors in the class "Error" should not be thrown directly, but the user
 should throw errors from a sub-class of "Error".
 .
 Warning: Using the "Error" module is no longer recommended due to the
 black-magical nature of its syntactic sugar, which often tends to break. Its
 maintainers have stopped actively writing code that uses it, and discourage
 people from doing so.
 .
 Recommended alternatives are Exception::Class (libexception-class-perl),
 Error::Exception (not packaged), TryCatch (libtrycatch-perl), and Try::Tiny
 (libtry-tiny-perl).
Homepage: https://metacpan.org/release/Error

Package: libevent-core-2.1-7
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 302
Maintainer: Nicolas Mora <babelouest@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libevent
Version: 2.1.12-stable-8
Depends: libc6 (>= 2.36)
Description: Asynchronous event notification library (core)
 Libevent is an asynchronous event notification library that provides a
 mechanism to execute a callback function when a specific event occurs
 on a file descriptor or after a timeout has been reached.
 .
 It is meant to replace the asynchronous event loop found in
 event driven network servers. Currently, libevent supports /dev/poll,
 kqueue(2), event ports, select(2), poll(2) and epoll(4).
 .
 The libevent_core library includes event loops, timers, buffer code,
 and various small compatibility functions.
 .
 If you're writing software that only uses libevent's event loop, you
 should link against only the libevent_core library.
Homepage: https://libevent.org/

Package: libewf2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1780
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Source: libewf (20140813-1)
Version: 20140813-1+b1
Depends: libc6 (>= 2.34), zlib1g (>= 1:1.1.4)
Description: library with support for Expert Witness Compression Format
 Libewf is a library with support for reading and writing the Expert Witness
 Compression Format (EWF).
 This library allows you to read media information of EWF files in the SMART
 (EWF-S01) format and the EnCase (EWF-E01) format. It supports files created
 by EnCase 1 to 6, linen and FTK Imager. The libewf is useful for forensics
 investigations.
Homepage: https://github.com/libyal/libewf-legacy

Package: libexpat1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 387
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: expat
Version: 2.5.0-1+deb12u1
Depends: libc6 (>= 2.36)
Description: XML parsing C library - runtime library
 This package contains the runtime, shared library of expat, the C
 library for parsing XML. Expat is a stream-oriented parser in
 which an application registers handlers for things the parser
 might find in the XML document (like start tags).
Homepage: https://libexpat.github.io/

Package: libext2fs2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 534
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Architecture: amd64
Multi-Arch: same
Source: e2fsprogs
Version: 1.47.0-2
Replaces: e2fslibs (<< 1.43.9-1~)
Provides: e2fslibs (= 1.47.0-2)
Depends: libc6 (>= 2.34)
Breaks: e2fslibs (<< 1.43.9-1~)
Description: ext2/ext3/ext4 file system libraries
 The ext2, ext3 and ext4 file systems are successors of the original ext
 ("extended") file system. They are the main file system types used for
 hard disks on Debian and other Linux systems.
 .
 This package provides the ext2fs and e2p libraries, for userspace software
 that directly accesses extended file systems. Programs that use libext2fs
 include e2fsck, mke2fs, and tune2fs. Programs that use libe2p include
 dumpe2fs, chattr, and lsattr.
Homepage: http://e2fsprogs.sourceforge.net

Package: libfakeroot
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 144
Maintainer: Clint Adams <clint@debian.org>
Architecture: amd64
Multi-Arch: same
Source: fakeroot
Version: 1.31-1.2
Replaces: fakeroot (<< 1.20-2~)
Depends: libc6 (>= 2.34)
Breaks: fakeroot (<< 1.20-2~)
Conffiles:
 /etc/ld.so.conf.d/fakeroot-x86_64-linux-gnu.conf f9f2331782e9078d5472c77e1d9cd869
Description: tool for simulating superuser privileges - shared libraries
 fakeroot provides a fake "root environment" by means of LD_PRELOAD and
 SysV IPC (or TCP) trickery. It puts wrappers around getuid(), chown(),
 stat(), and other file-manipulation functions, so that unprivileged
 users can (for instance) populate .deb archives with root-owned files;
 various build tools use fakeroot for this by default.
 .
 This package contains the LD_PRELOAD libraries.

Package: libfdisk1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 533
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libblkid1 (>= 2.24.2), libc6 (>= 2.33), libuuid1 (>= 2.16)
Description: fdisk partitioning library
 The libfdisk library is used for manipulating partition tables. It is
 the core of the fdisk, cfdisk, and sfdisk tools.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: libffi8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 68
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libffi
Version: 3.4.4-1
Replaces: libffi8ubuntu1 (<< 3.4.2-1)
Provides: libffi8ubuntu1 (= 3.4.4-1)
Depends: libc6 (>= 2.34)
Breaks: libffi8ubuntu1 (<< 3.4.2-1)
Description: Foreign Function Interface library runtime
 A foreign function interface is the popular name for the interface that
 allows code written in one language to call code written in another
 language.
Homepage: https://sourceware.org/libffi/

Package: libfido2-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 241
Maintainer: Debian Authentication Maintainers <pkg-auth-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libfido2 (1.12.0-2)
Version: 1.12.0-2+b1
Depends: libc6 (>= 2.36), libcbor0.8 (>= 0.8.0), libssl3 (>= 3.0.0), libudev1 (>= 183), zlib1g (>= 1:1.1.4)
Description: library for generating and verifying FIDO 2.0 objects
 A library for communicating with a FIDO device over USB or NFC, and for
 verifying attestation and assertion signatures. FIDO U2F (CTAP 1) and FIDO
 2.0 (CTAP 2) are supported.
 .
 This package contains the library.
Homepage: https://developers.yubico.com/libfido2/

Package: libfile-fcntllock-perl
Status: install ok installed
Priority: optional
Section: perl
Installed-Size: 129
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: amd64
Source: libfile-fcntllock-perl (0.22-4)
Version: 0.22-4+b1
Depends: perl (>= 5.36.0-4), perlapi-5.36.0, libc6 (>= 2.28)
Suggests: gcc | c-compiler
Description: Perl module for file locking with fcntl(2)
 File::FcntlLock is a Perl module to do file locking in an object oriented
 fashion using the fcntl(2) system call. This allows locks on parts of a file
 as well as on the whole file and overcomes some known problems with flock(2),
 on which Perl's flock() function is based.
 .
 Furthermore due to its design it supports reliable locking over NFS.
Homepage: https://metacpan.org/release/File-FcntlLock

Package: libfontconfig1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 579
Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: fontconfig
Version: 2.14.1-4
Provides: libfontconfig
Depends: libc6 (>= 2.33), libexpat1 (>= 2.0.1), libfreetype6 (>= 2.9.1), fontconfig-config (>= 2.14.1-4)
Breaks: xpdf (<= 3.03-11)
Description: generic font configuration library - runtime
 Fontconfig is a font configuration and customization library, which
 does not depend on the X Window System. It is designed to locate
 fonts within the system and select them according to requirements
 specified by applications.
 .
 This package contains the runtime library needed to launch applications
 using fontconfig.
Homepage: https://www.freedesktop.org/wiki/Software/fontconfig/

Package: libfreetype6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 886
Maintainer: Hugh McMaster <hugh.mcmaster@outlook.com>
Architecture: amd64
Multi-Arch: same
Source: freetype
Version: 2.12.1+dfsg-5+deb12u4
Depends: libbrotli1 (>= 0.6.0), libc6 (>= 2.33), libpng16-16 (>= 1.6.2-1), zlib1g (>= 1:1.1.4)
Description: FreeType 2 font engine, shared library files
 The FreeType project is a team of volunteers who develop free,
 portable and high-quality software solutions for digital typography.
 They specifically target embedded systems and focus on providing small,
 efficient and ubiquitous products.
 .
 The FreeType 2 library is their new software font engine.  It has been
 designed to provide the following important features:
  * A universal and simple API to manage font files
  * Support for several font formats through loadable modules
  * High-quality anti-aliasing
  * High portability & performance
 .
 Supported font formats include:
  * TrueType files (.ttf) and collections (.ttc)
  * Type 1 font files both in ASCII (.pfa) or binary (.pfb) format
  * Type 1 Multiple Master fonts.  The FreeType 2 API also provides
    routines to manage design instances easily
  * Type 1 CID-keyed fonts
  * OpenType/CFF (.otf) fonts
  * CFF/Type 2 fonts
  * Adobe CEF fonts (.cef), used to embed fonts in SVG documents with
    the Adobe SVG viewer plugin.
  * Windows FNT/FON bitmap fonts
 .
 This package contains the files needed to run programs that use the
 FreeType 2 library.
Homepage: https://freetype.org

Package: libfstrm0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 70
Maintainer: Robert Edmonds <edmonds@debian.org>
Architecture: amd64
Multi-Arch: same
Source: fstrm
Version: 0.6.1-1
Depends: libc6 (>= 2.32)
Description: Frame Streams (fstrm) library
 Frame Streams is a light weight, binary clean protocol that allows for the
 transport of arbitrarily encoded data payload sequences with minimal framing
 overhead -- just four bytes per data frame. Frame Streams does not specify an
 encoding format for data frames and can be used with any data serialization
 format that produces byte sequences, such as Protocol Buffers, XML, JSON,
 MessagePack, YAML, etc. Frame Streams can be used as both a streaming
 transport over a reliable byte stream socket (TCP sockets, TLS connections,
 AF_UNIX sockets, etc.) for data in motion as well as a file format for data
 at rest. A "Content Type" header identifies the type of payload being carried
 over an individual Frame Stream and allows cooperating programs to determine
 how to interpret a given sequence of data payloads.
 .
 This is the "fstrm" implementation of Frame Streams in C.
 .
 This package contains the shared library.
Homepage: https://github.com/farsightsec/fstrm

Package: libfuse-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 6624
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: fuse (2.9.9-6)
Version: 2.9.9-6+b1
Depends: libfuse2 (= 2.9.9-6+b1), libselinux-dev
Suggests: fuse
Description: Filesystem in Userspace (development)
 Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
 export a virtual filesystem to the Linux kernel. It also aims to provide a
 secure method for non privileged users to create and mount their own filesystem
 implementations.
 .
 This package contains the development files.
Homepage: https://github.com/libfuse/libfuse/wiki

Package: libfuse2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 345
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: fuse (2.9.9-6)
Version: 2.9.9-6+b1
Depends: libc6 (>= 2.34)
Suggests: fuse
Conflicts: fuse (<< 2.9.9-6+b1)
Description: Filesystem in Userspace (library)
 Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
 export a virtual filesystem to the Linux kernel. It also aims to provide a
 secure method for non privileged users to create and mount their own filesystem
 implementations.
 .
 This package contains the shared library.
Homepage: https://github.com/libfuse/libfuse/wiki

Package: libfuse3-3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 305
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: fuse3
Version: 3.14.0-4
Depends: libc6 (>= 2.34)
Suggests: fuse3
Description: Filesystem in Userspace (library) (3.x version)
 Filesystem in Userspace (FUSE) is a simple interface for userspace programs to
 export a virtual filesystem to the Linux kernel. It also aims to provide a
 secure method for non privileged users to create and mount their own filesystem
 implementations.
 .
 This package contains the shared library.
Homepage: https://github.com/libfuse/libfuse/wiki

Package: libgav1-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 945
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libgav1 (0.18.0-1)
Version: 0.18.0-1+b1
Depends: libabsl20220623 (>= 0~20220623.0-1), libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 12)
Description: AV1 decoder developed by Google -- runtime library
 This package contains the runtime, shared library of gav1. Gav1 is
 a new decoder implementation for AV1 video encoding format (supporting
 profiles 0 and 1).
Homepage: https://chromium.googlesource.com/codecs/libgav1/

Package: libgcc-12-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 14284
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Replaces: libtsan2 (<< 12-20211113-2~)
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libgcc-s1 (>= 12.2.0-14+deb12u1), libgomp1 (>= 12.2.0-14+deb12u1), libitm1 (>= 12.2.0-14+deb12u1), libatomic1 (>= 12.2.0-14+deb12u1), libasan8 (>= 12.2.0-14+deb12u1), liblsan0 (>= 12.2.0-14+deb12u1), libtsan2 (>= 12.2.0-14+deb12u1), libubsan1 (>= 12.2.0-14+deb12u1), libquadmath0 (>= 12.2.0-14+deb12u1)
Recommends: libc6-dev (>= 2.23-1~)
Breaks: libtsan2 (<< 12-20211113-2~)
Description: GCC support library (development files)
 This package contains the headers and static library files necessary for
 building C programs which use libgcc, libgomp, libquadmath, libssp or libitm.
Homepage: http://gcc.gnu.org/

Package: libgcc-s1
Protected: yes
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 140
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Replaces: libgcc1 (<< 1:10)
Provides: libgcc1 (= 1:12.2.0-14+deb12u1)
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.35)
Description: GCC support library
 Shared version of the support library, a library of internal subroutines
 that GCC uses to overcome shortcomings of particular machines, or
 special needs for some languages.
Homepage: http://gcc.gnu.org/
Important: yes

Package: libgcrypt20
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1592
Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1.10.1-3
Depends: libc6 (>= 2.34), libgpg-error0 (>= 1.27)
Suggests: rng-tools
Description: LGPL Crypto library - runtime library
 libgcrypt contains cryptographic functions.  Many important free
 ciphers, hash algorithms and public key signing algorithms have been
 implemented:
 .
 Arcfour, Blowfish, CAST5, DES, AES, Twofish, Serpent, rfc2268 (rc2), SEED,
 Poly1305, Camellia, ChaCha20, IDEA, Salsa, SM4, Blake-2, CRC, MD2, MD4, MD5,
 RIPE-MD160, SM3, SHA-1, SHA-256, SHA-512, SHA3-224, SHA3-256, SHA3-384,
 SHA3-512, SHAKE128, SHAKE256, Tiger, Whirlpool, DSA, DSA2, ElGamal, RSA, ECC
 (Curve25519, sec256k1, GOST R 34.10-2001 and GOST R 34.10-2012, etc.)
Homepage: https://directory.fsf.org/project/libgcrypt/

Package: libgd3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 448
Maintainer: GD Team <team+gd@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libgd2
Version: 2.3.3-9
Depends: libavif15 (>= 0.11.1), libc6 (>= 2.29), libfontconfig1 (>= 2.12.6), libfreetype6 (>= 2.2.1), libheif1 (>= 1.3.2), libjpeg62-turbo (>= 1.3.1), libpng16-16 (>= 1.6.2-1), libtiff6 (>= 4.0.3), libwebp7 (>= 1.2.4), libxpm4
Suggests: libgd-tools
Description: GD Graphics Library
 GD is a graphics library. It allows your code to quickly draw images
 complete with lines, arcs, text, multiple colours, cut and paste from
 other images, flood fills, and write out the result as a PNG file.
 This is particularly useful in World Wide Web applications, where PNG is
 one of the formats accepted for inline images by most browsers.
 .
 This is the runtime package of the library.
Homepage: http://www.libgd.org/

Package: libgdbm-compat4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 70
Maintainer: Nicolas Mora <babelouest@debian.org>
Architecture: amd64
Multi-Arch: same
Source: gdbm
Version: 1.23-3
Depends: libc6 (>= 2.33), libgdbm6 (>= 1.16)
Description: GNU dbm database routines (legacy support runtime version) 
 GNU dbm ('gdbm') is a library of database functions that use extendible
 hashing and works similarly to the standard UNIX 'dbm' functions.
 .
 The basic use of 'gdbm' is to store key/data pairs in a data file, thus
 providing a persistent version of the 'dictionary' Abstract Data Type
 ('hash' to perl programmers).
 This package includes library files, required to run old programs,
 that use legacy 'dbm' interface. For new programs, please use modern
 interface, provided by libgdbm6 and libgdbm-dev.
Homepage: https://gnu.org/software/gdbm

Package: libgdbm6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 129
Maintainer: Nicolas Mora <babelouest@debian.org>
Architecture: amd64
Multi-Arch: same
Source: gdbm
Version: 1.23-3
Depends: libc6 (>= 2.34)
Suggests: gdbm-l10n (= 1.23-3)
Description: GNU dbm database routines (runtime version) 
 GNU dbm ('gdbm') is a library of database functions that use extendible
 hashing and works similarly to the standard UNIX 'dbm' functions.
 .
 The basic use of 'gdbm' is to store key/data pairs in a data file, thus
 providing a persistent version of the 'dictionary' Abstract Data Type
 ('hash' to perl programmers).
Homepage: https://gnu.org/software/gdbm

Package: libgirepository-1.0-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 295
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gobject-introspection
Version: 1.74.0-3
Provides: libgirepository-1.0-1-with-libffi8 (= 1.74.0-3)
Depends: libc6 (>= 2.29), libffi8 (>= 3.4), libglib2.0-0 (>= 2.74.0)
Breaks: libcjs0 (<< 4.8.2-1+b1), libgjs0g (<< 1.68.4-1+b1), libglib-object-introspection-perl (<< 0.049-1+b2), python-gi (<< 3.42.0-1+b1), python3-gi (<< 3.42.0-1+b1), ruby-gobject-introspection (<< 3.4.3-1+b2)
Description: Library for handling GObject introspection data (runtime library)
 GObject Introspection is a project for providing machine readable
 introspection data of the API of C libraries. This introspection
 data can be used in several different use cases, for example
 automatic code generation for bindings, API verification and documentation
 generation.
 .
 GObject Introspection contains tools to generate and handle the
 introspection data.
 .
 This package contains a C library for handling the introspection data.
Homepage: https://wiki.gnome.org/GObjectIntrospection

Package: libglib2.0-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 4132
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: glib2.0
Version: 2.74.6-2+deb12u6
Depends: libc6 (>= 2.34), libffi8 (>= 3.4), libmount1 (>= 2.35.2-7~), libpcre2-8-0 (>= 10.22), libselinux1 (>= 3.1~), zlib1g (>= 1:1.2.2)
Recommends: libglib2.0-data, shared-mime-info, xdg-user-dirs
Suggests: low-memory-monitor
Breaks: gimp (<< 2.10.14-3~), glib-networking-tests (<< 2.70.0~), gnome-keyring (<< 40.0-3~), libedataserver-1.2-26 (<< 3.44.3-2~), libgirepository-1.0-1 (<< 1.62.0-4~), libgladeui-2-6 (<< 3.22.2), libsoup2.4-tests (<< 2.72.0-3~)
Description: GLib library of C routines
 GLib is a library containing many useful C routines for things such
 as trees, hashes, lists, and strings.  It is a useful general-purpose
 C library used by projects such as GTK+, GIMP, and GNOME.
 .
 This package contains the shared libraries.
Homepage: https://wiki.gnome.org/Projects/GLib

Package: libglib2.0-data
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 9405
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: glib2.0
Version: 2.74.6-2+deb12u6
Description: Common files for GLib library
 GLib is a library containing many useful C routines for things such
 as trees, hashes, lists, and strings.  It is a useful general-purpose
 C library used by projects such as GTK+, GIMP, and GNOME.
 .
 This package is needed for the runtime libraries to display messages in
 languages other than English.
Homepage: https://wiki.gnome.org/Projects/GLib

Package: libgmp10
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 855
Maintainer: Debian Science Team <debian-science-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gmp
Version: 2:6.2.1+dfsg1-1.1
Depends: libc6 (>= 2.14)
Breaks: libmath-gmp-perl (<< 2.20-1), libmath-prime-util-gmp-perl (<< 0.51-2), postgresql-pgmp (<< 1.0.3-1)
Description: Multiprecision arithmetic library
 GNU MP is a programmer's library for arbitrary precision
 arithmetic (ie, a bignum package).  It can operate on signed
 integer, rational, and floating point numeric types.
 .
 It has a rich set of functions, and the functions have a regular
 interface.
Homepage: https://gmplib.org/

Package: libgnutls30
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 3382
Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gnutls28
Version: 3.7.9-2+deb12u5
Depends: libc6 (>= 2.34), libgmp10 (>= 2:6.2.1+dfsg1), libhogweed6 (>= 3.6), libidn2-0 (>= 2.0.0), libnettle8 (>= 3.7~), libp11-kit0 (>= 0.23.18.1), libtasn1-6 (>= 4.14), libunistring2 (>= 0.9.7)
Suggests: gnutls-bin
Description: GNU TLS library - main runtime library
 GnuTLS is a portable library which implements the Transport Layer
 Security (TLS 1.0, 1.1, 1.2, 1.3) and Datagram
 Transport Layer Security (DTLS 1.0, 1.2) protocols.
 .
 GnuTLS features support for:
  - certificate path validation, as well as DANE and trust on first use.
  - the Online Certificate Status Protocol (OCSP).
  - public key methods, including RSA and Elliptic curves, as well as password
    and key authentication methods such as SRP and PSK protocols.
  - all the strong encryption algorithms, including AES and Camellia.
  - CPU-assisted cryptography with VIA padlock and AES-NI instruction sets.
  - HSMs and cryptographic tokens, via PKCS #11.
 .
 This package contains the main runtime library.
Homepage: https://www.gnutls.org/

Package: libgomp1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 312
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34)
Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2)
Description: GCC OpenMP (GOMP) support library
 GOMP is an implementation of OpenMP for the C, C++, and Fortran compilers
 in the GNU Compiler Collection.
Homepage: http://gcc.gnu.org/

Package: libgpg-error0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 192
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libgpg-error
Version: 1.46-1
Depends: libc6 (>= 2.34)
Recommends: libgpg-error-l10n
Description: GnuPG development runtime library
 Library that defines common error values, messages, and common
 runtime functionality for all GnuPG components.  Among these are GPG,
 GPGSM, GPGME, GPG-Agent, libgcrypt, pinentry, SmartCard Daemon and
 possibly more in the future.
 .
 It will likely be renamed "gpgrt" in the future.
Homepage: https://www.gnupg.org/related_software/libgpg-error/

Package: libgprofng0
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 3958
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: binutils
Version: 2.40-2
Depends: libbinutils (= 2.40-2), libc6 (>= 2.34), libgcc-s1 (>= 3.3.1), libstdc++6 (>= 5.2), zlib1g (>= 1:1.1.4)
Description: GNU Next Generation profiler (runtime library)
 Gprofng is the GNU Next Generation profiler for analyzing the performance
 of Linux applications.  Gprofng allows you to:
 .
  - Profile C / C++ / Java / Scala applications without needing to recompile
  - Profile multi-threaded applications
  - Analyze and compare multiple experiments
  - Use time-based sampling and / or hardware event counters
 .
 This package includes the libgprofng shared library.
Homepage: https://www.gnu.org/software/binutils/

Package: libgssapi-krb5-2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 425
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: krb5
Version: 1.20.1-2+deb12u3
Depends: libc6 (>= 2.33), libcom-err2 (>= 1.43.9), libk5crypto3 (>= 1.20), libkrb5-3 (= 1.20.1-2+deb12u3), libkrb5support0 (>= 1.15~beta1)
Suggests: krb5-doc, krb5-user
Breaks: moonshot-gss-eap (<= 1.0)
Description: MIT Kerberos runtime libraries - krb5 GSS-API Mechanism
 Kerberos is a system for authenticating users and services on a network.
 Kerberos is a trusted third-party service.  That means that there is a
 third party (the Kerberos server) that is trusted by all the entities on
 the network (users and services, usually called "principals").
 .
 This is the MIT reference implementation of Kerberos V5.
 .
 This package contains the runtime library for the MIT Kerberos
 implementation of GSS-API used by applications and Kerberos clients.
Homepage: https://web.mit.edu/kerberos/

Package: libheif1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 659
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libheif
Version: 1.15.1-1+deb12u1
Depends: libaom3 (>= 3.2.0), libc6 (>= 2.34), libdav1d6 (>= 0.1.0), libde265-0 (>= 1.0.7), libgcc-s1 (>= 3.0), libstdc++6 (>= 11), libx265-199 (>= 3.5), zlib1g (>= 1:1.1.4)
Description: ISO/IEC 23008-12:2017 HEIF file format decoder - shared library
 libheif is an ISO/IEC 23008-12:2017 HEIF file format decoder. HEIF is a new
 image file format employing HEVC (h.265) image coding for the best compression
 ratios currently possible.
 .
 This package contains the shared library.
Homepage: http://www.libheif.org

Package: libhogweed6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 463
Maintainer: Magnus Holmgren <holmgren@debian.org>
Architecture: amd64
Multi-Arch: same
Source: nettle
Version: 3.8.1-2
Depends: libc6 (>= 2.14), libgmp10 (>= 2:6.2.1+dfsg1), libnettle8
Description: low level cryptographic library (public-key cryptos)
 Nettle is a cryptographic library that is designed to fit easily in more or
 less any context: In crypto toolkits for object-oriented languages (C++,
 Python, Pike, ...), in applications like LSH or GNUPG, or even in kernel
 space.
 .
 It tries to solve a problem of providing a common set of cryptographic
 algorithms for higher-level applications by implementing a
 context-independent set of cryptographic algorithms. In that light, Nettle
 doesn't do any memory allocation or I/O, it simply provides the
 cryptographic algorithms for the application to use in any environment and
 in any way it needs.
 .
 This package contains the asymmetric cryptographic algorithms, which,
 require the GNU multiple precision arithmetic library (libgmp) for
 their large integer computations.
Homepage: http://www.lysator.liu.se/~nisse/nettle/

Package: libicu72
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 36170
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: icu
Version: 72.1-3+deb12u1
Replaces: libiculx63 (<< 63.1-5)
Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.0), libstdc++6 (>= 12)
Breaks: libiculx63 (<< 63.1-5), openttd (<< 1.8.0-2~)
Description: International Components for Unicode
 ICU is a C++ and C library that provides robust and full-featured
 Unicode and locale support.  This package contains the runtime
 libraries for ICU.
Homepage: https://icu.unicode.org/

Package: libidn2-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 439
Maintainer: Debian Libidn team <help-libidn@gnu.org>
Architecture: amd64
Multi-Arch: same
Source: libidn2 (2.3.3-1)
Version: 2.3.3-1+b1
Depends: libc6 (>= 2.14), libunistring2 (>= 0.9.7)
Description: Internationalized domain names (IDNA2008/TR46) library
 Libidn2 implements the revised algorithm for internationalized domain
 names called IDNA2008/TR46.
 .
 This package contains runtime libraries.
Homepage: https://www.gnu.org/software/libidn/#libidn2

Package: libip4tc2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 66
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: iptables
Version: 1.8.9-2
Depends: libc6 (>= 2.28)
Description: netfilter libip4tc library
 The iptables/xtables framework has been replaced by nftables. You should
 consider migrating now.
 .
 This package contains the user-space iptables (IPv4) C library from the
 Netfilter xtables framework.
 .
 iptables IPv4 ruleset ADT and kernel interface.
 .
 This library has been considered private for years (and still is), in the
 sense of changing symbols and backward compatibility not guaranteed.
Homepage: https://www.netfilter.org/

Package: libip6tc2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 66
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: iptables
Version: 1.8.9-2
Depends: libc6 (>= 2.28)
Description: netfilter libip6tc library
 The iptables/xtables framework has been replaced by nftables. You should
 consider migrating now.
 .
 This package contains the user-space iptables (IPv6) C library from the
 Netfilter xtables framework.
 .
 iptables IPv6 ruleset ADT and kernel interface.
 .
 This library has been considered private for years (and still is), in the
 sense of changing symbols and backward compatibility not guaranteed.
Homepage: https://www.netfilter.org/

Package: libisl23
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2302
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: isl
Version: 0.25-1.1
Replaces: libisl-dbg (<< 0.19)
Depends: libc6 (>= 2.14), libgmp10 (>= 2:6.2.1+dfsg1)
Breaks: libisl-dbg (<< 0.19)
Description: manipulating sets and relations of integer points bounded by linear constraints
 isl is a library for manipulating sets and relations of integer points
 bounded by linear constraints. Supported operations on sets include
 intersection, union, set difference, emptiness check, convex hull,
 (integer) affine hull, integer projection, and computing the lexicographic
 minimum using parametric integer programming. It also includes an ILP solver
 based on generalized basis reduction.
 .
 This package contains the runtime library.
Homepage: http://isl.gforge.inria.fr/

Package: libitm1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 115
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34)
Description: GNU Transactional Memory Library
 GNU Transactional Memory Library (libitm) provides transaction support for
 accesses to the memory of a process, enabling easy-to-use synchronization of
 accesses to shared memory by several threads.
Homepage: http://gcc.gnu.org/

Package: libjansson4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 101
Maintainer: Alessandro Ghedini <ghedo@debian.org>
Architecture: amd64
Multi-Arch: same
Source: jansson
Version: 2.14-2
Depends: libc6 (>= 2.14)
Description: C library for encoding, decoding and manipulating JSON data
 Jansson is a C library for encoding, decoding and manipulating JSON data.
 .
 It features:
  * Simple and intuitive API and data model
  * Comprehensive documentation
  * No dependencies on other libraries
  * Full Unicode support (UTF-8)
  * Extensive test suite
Homepage: http://www.digip.org/jansson/

Package: libjbig0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 84
Maintainer: Michael van der Kolff <mvanderkolff@gmail.com>
Architecture: amd64
Multi-Arch: same
Source: jbigkit
Version: 2.1-6.1
Depends: libc6 (>= 2.4)
Description: JBIGkit libraries
 JBIG-KIT provides a portable library of compression and decompression functions
 with a documented interface that you can include very easily into your image or
 document processing software.
 .
 This package contains the dynamically linked library.
Homepage: http://www.cl.cam.ac.uk/~mgk25/jbigkit/

Package: libjemalloc2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 872
Maintainer: Faidon Liambotis <paravoid@debian.org>
Architecture: amd64
Multi-Arch: same
Source: jemalloc
Version: 5.3.0-1
Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.3), libstdc++6 (>= 4.4)
Description: general-purpose scalable concurrent malloc(3) implementation
 A library providing a malloc(3) implementation for multi-threaded processes on
 multi-processor systems.
 .
 Notable features are reduced lock contention, predictable low fragmentation,
 and introspection with heap profiling.
Homepage: http://jemalloc.net/

Package: libjpeg62-turbo
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 677
Maintainer: Ondřej Surý <ondrej@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libjpeg-turbo
Version: 1:2.1.5-2
Replaces: libjpeg62
Provides: libjpeg62 (= 1:2.1.5-2)
Depends: libc6 (>= 2.14)
Conflicts: libjpeg62
Description: libjpeg-turbo JPEG runtime library
 The libjpeg-turbo JPEG library is a library for handling JPEG files.
 .
 libjpeg-turbo is a JPEG image codec that uses SIMD instructions (MMX,
 SSE2, NEON) to accelerate baseline JPEG compression and decompression
 on x86, x86-64, and ARM systems.  The libjpeg-turbo JPEG library is
 an API/ABI compatible with the IJG JPEG library.
 .
 This package contains the shared runtime library.
Homepage: https://www.libjpeg-turbo.org/

Package: libjs-bootstrap
Status: install ok installed
Priority: optional
Section: javascript
Installed-Size: 859
Maintainer: Debian Javascript Maintainers <pkg-javascript-devel@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: twitter-bootstrap3
Version: 3.4.1+dfsg-3+deb12u1
Depends: fonts-glyphicons-halflings
Description: HTML, CSS and JS framework
 Bootstrap is a popular HTML, CSS, and JS framework for developing
 responsive, mobile first projects on the web.
 .
 It includes base CSS and HTML for typography, forms, buttons, tables,
 grids, navigation, and more.
Homepage: https://getbootstrap.com/

Package: libjson-c5
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 109
Maintainer: Nicolas Mora <babelouest@debian.org>
Architecture: amd64
Multi-Arch: same
Source: json-c
Version: 0.16-2
Depends: libc6 (>= 2.33)
Description: JSON manipulation library - shared library
 This library allows you to easily construct JSON objects in C,
 output them as JSON formatted strings and parse JSON formatted
 strings back into the C representation of JSON objects.
Homepage: https://github.com/json-c/json-c/wiki

Package: libk5crypto3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 261
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: krb5
Version: 1.20.1-2+deb12u3
Depends: libc6 (>= 2.33), libkrb5support0 (>= 1.20)
Suggests: krb5-doc, krb5-user
Breaks: libgssapi-krb5-2 (<= 1.18~), libkrb5-3 (<= 1.18~)
Description: MIT Kerberos runtime libraries - Crypto Library
 Kerberos is a system for authenticating users and services on a network.
 Kerberos is a trusted third-party service.  That means that there is a
 third party (the Kerberos server) that is trusted by all the entities on
 the network (users and services, usually called "principals").
 .
 This is the MIT reference implementation of Kerberos V5.
 .
 This package contains the runtime cryptography libraries used by
 applications and Kerberos clients.
Homepage: https://web.mit.edu/kerberos/

Package: libkeyutils1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 40
Maintainer: Christian Kastner <ckk@debian.org>
Architecture: amd64
Multi-Arch: same
Source: keyutils
Version: 1.6.3-2
Depends: libc6 (>= 2.14)
Description: Linux Key Management Utilities (library)
 Keyutils is a set of utilities for managing the key retention facility in the
 kernel, which can be used by filesystems, block devices and more to gain and
 retain the authorization and encryption keys required to perform secure
 operations.
 .
 This package provides a wrapper library for the key management facility system
 calls.
Homepage: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/keyutils.git

Package: libklibc
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 97
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: klibc
Version: 2.0.12-1
Description: minimal libc subset for use with initramfs
 klibc is intended to be a minimalistic libc subset for use with
 initramfs.  It is deliberately written for small size, minimal
 entanglement, and portability, not speed.  It is definitely a work in
 progress, and a lot of things are still missing.
Homepage: https://git.kernel.org/cgit/libs/klibc/klibc.git

Package: libkmod2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 141
Maintainer: Marco d'Itri <md@linux.it>
Architecture: amd64
Multi-Arch: same
Source: kmod
Version: 30+20221128-1
Depends: libc6 (>= 2.33), liblzma5 (>= 5.1.1alpha+20120614), libssl3 (>= 3.0.0), libzstd1 (>= 1.5.2)
Description: libkmod shared library
 This library provides an API for insertion, removal, configuration and
 listing of kernel modules.

Package: libkrb5-3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1077
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: krb5
Version: 1.20.1-2+deb12u3
Depends: libc6 (>= 2.34), libcom-err2 (>= 1.43.9), libk5crypto3 (>= 1.20), libkeyutils1 (>= 1.5.9), libkrb5support0 (= 1.20.1-2+deb12u3), libssl3 (>= 3.0.0)
Recommends: krb5-locales
Suggests: krb5-doc, krb5-user
Breaks: libapache2-mod-auth-kerb (<= 5.4-2.4), libsmbclient (<= 2:3.6.1-2), sssd (<= 1.2.1-4.3)
Description: MIT Kerberos runtime libraries
 Kerberos is a system for authenticating users and services on a network.
 Kerberos is a trusted third-party service.  That means that there is a
 third party (the Kerberos server) that is trusted by all the entities on
 the network (users and services, usually called "principals").
 .
 This is the MIT reference implementation of Kerberos V5.
 .
 This package contains the runtime library for the main Kerberos v5 API
 used by applications and Kerberos clients.
Homepage: https://web.mit.edu/kerberos/

Package: libkrb5support0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 134
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: krb5
Version: 1.20.1-2+deb12u3
Depends: libc6 (>= 2.34)
Breaks: libgssapi-krb5-2 (<< 1.20), libk5crypto3 (<< 1.20), libkadm5clnt-mit9 (<< 1.13~alpha1-1), libkadm5srv-mit9 (<< 1.13~alpha1-1), libkdb5-8 (<< 1.16)
Description: MIT Kerberos runtime libraries - Support library
 Kerberos is a system for authenticating users and services on a network.
 Kerberos is a trusted third-party service.  That means that there is a
 third party (the Kerberos server) that is trusted by all the entities on
 the network (users and services, usually called "principals").
 .
 This is the MIT reference implementation of Kerberos V5.
 .
 This package contains an internal runtime support library used by other
 Kerberos libraries.
Homepage: https://web.mit.edu/kerberos/

Package: libksba8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 316
Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libksba
Version: 1.6.3-2
Depends: libc6 (>= 2.14), libgpg-error0 (>= 1.46)
Description: X.509 and CMS support library
 KSBA (pronounced Kasbah) is a library to make X.509 certificates as
 well as the CMS easily accessible by other applications.  Both
 specifications are building blocks of S/MIME and TLS.
 .
 KSBA provides these subsystems: ASN.1 Parser, BER Decoder, BER
 Encoder, Certificate Handling and CMS Handling.
 .
 This package contains the runtime library files.
Homepage: https://www.gnupg.org/related_software/libksba/

Package: libldap-2.5-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 553
Maintainer: Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: openldap
Version: 2.5.13+dfsg-5
Replaces: libldap-2.3-0, libldap2
Depends: libc6 (>= 2.34), libgnutls30 (>= 3.7.5), libsasl2-2 (>= 2.1.28+dfsg)
Recommends: libldap-common
Conflicts: ldap-utils (<= 2.1.23-1)
Description: OpenLDAP libraries
 These are the run-time libraries for the OpenLDAP (Lightweight Directory
 Access Protocol) servers and clients.
Homepage: https://www.openldap.org/

Package: libldap-common
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 92
Maintainer: Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: openldap
Version: 2.5.13+dfsg-5
Replaces: libldap-2.4-2 (<< 2.4.44+dfsg-1)
Conffiles:
 /etc/ldap/ldap.conf 4f02c6860a58b7402a4b5c5ec24aa7b2
Description: OpenLDAP common files for libraries
 These are common files for the run-time libraries for the OpenLDAP
 (Lightweight Directory Access Protocol) servers and clients.
Homepage: https://www.openldap.org/

Package: liblerc4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 649
Maintainer: Debian GIS Project <pkg-grass-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lerc
Version: 4.0.0+ds-2
Depends: libc6 (>= 2.29), libgcc-s1 (>= 3.0), libstdc++6 (>= 11)
Description: Limited Error Raster Compression library
 LERC is an open-source image or raster format which
 supports rapid encoding and decoding for any pixel
 type (not just RGB or Byte). Users set the maximum
 compression error per pixel while encoding, so the
 precision of the original input image is preserved
 (within user defined error bounds).
Homepage: https://github.com/Esri/lerc

Package: liblinear4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 102
Maintainer: Debian Science Maintainers <debian-science-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: liblinear
Version: 2.3.0+dfsg-5
Depends: libblas3 | libblas.so.3, libc6 (>= 2.29), libgcc-s1 (>= 3.0), libstdc++6 (>= 5)
Suggests: liblinear-tools (= 2.3.0+dfsg-5), liblinear-dev (= 2.3.0+dfsg-5)
Description: Library for Large Linear Classification
 LIBLINEAR is a library for learning linear classifiers for large scale
 applications. It supports Support Vector Machines (SVM) with L2 and L1
 loss, logistic regression, multi class classification and also Linear
 Programming Machines (L1-regularized SVMs). Its computational complexity
 scales linearly with the number of training examples making it one of
 the fastest SVM solvers around. It also provides Python bindings.
 .
 This package contains the shared libraries.
Homepage: https://www.csie.ntu.edu.tw/~cjlin/liblinear/

Package: liblmdb0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 104
Maintainer: LMDB <lmdb@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lmdb
Version: 0.9.24-1
Depends: libc6 (>= 2.14)
Description: Lightning Memory-Mapped Database shared library
 This package contains the LMDB shared library.
 .
 Lighting Memory-Mapped Database (LMDB) is an ultra-fast, ultra-compact
 key-value embedded data store developed for the OpenLDAP Project.  It uses
 memory-mapped files, so it has the read performance of a pure in-memory
 database while still offering the persistence of standard disk-based
 databases, and is only limited to the size of the virtual address space, (it
 is not limited to the size of physical RAM).
Homepage: http://symas.com/mdb/

Package: liblocale-gettext-perl
Status: install ok installed
Priority: required
Section: perl
Installed-Size: 51
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: amd64
Version: 1.07-5
Depends: libc6 (>= 2.3)
Pre-Depends: perl-base (>= 5.36.0-5), perlapi-5.36.0
Description: module using libc functions for internationalization in Perl
 The Locale::gettext module permits access from perl to the gettext() family of
 functions for retrieving message strings from databases constructed
 to internationalize software.
 .
 It provides gettext(), dgettext(), dcgettext(), textdomain(),
 bindtextdomain(), bind_textdomain_codeset(), ngettext(), dcngettext()
 and dngettext().
Homepage: https://metacpan.org/release/gettext

Package: liblockfile-bin
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 53
Maintainer: Miquel van Smoorenburg <miquels@cistron.nl>
Architecture: amd64
Multi-Arch: foreign
Source: liblockfile (1.17-1)
Version: 1.17-1+b1
Replaces: liblockfile1 (<< 1.09-1)
Depends: libc6 (>= 2.14)
Breaks: liblockfile1 (<< 1.09-1)
Description: support binaries for and cli utilities based on liblockfile
 This package contains support binaries for the liblockfile library,
 and the command-line utility ``dotlockfile''.
Homepage: https://github.com/miquels/liblockfile

Package: liblsan0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2942
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34), libgcc-s1 (>= 3.3)
Description: LeakSanitizer -- a memory leak detector (runtime)
 LeakSanitizer (Lsan) is a memory leak detector which is integrated
 into AddressSanitizer.
Homepage: http://gcc.gnu.org/

Package: liblua5.3-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 495
Maintainer: Debian Lua Team <pkg-lua-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lua5.3
Version: 5.3.6-2
Depends: libc6 (>= 2.34), libstdc++6 (>= 4.1.1)
Description: Shared library for the Lua interpreter version 5.3
 Lua is a powerful, light-weight programming language designed for extending
 applications.  The language engine is accessible as a library, having a C
 API which allows the application to exchange data with Lua programs and also
 to extend Lua with C functions.  Lua is also used as a general-purpose,
 stand-alone language through the simple command line interpreter provided.
 .
 This package contains runtime libraries.  You shouldn't need to install it
 explicitly.
Homepage: https://www.lua.org

Package: liblvm2cmd2.03
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 3054
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: lvm2
Version: 2.03.16-2
Depends: libaio1 (>= 0.3.93), libblkid1 (>= 2.24.2), libc6 (>= 2.34), libdevmapper-event1.02.1 (>= 2:1.02.74), libselinux1 (>= 3.1~), libsystemd0 (>= 233), libudev1 (>= 183), dmeventd
Description: LVM2 command library
 This package contains the lvm2cmd shared library.
Homepage: https://sourceware.org/lvm2/

Package: liblz4-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 169
Maintainer: Nobuhiro Iwamatsu <iwamatsu@debian.org>
Architecture: amd64
Multi-Arch: same
Source: lz4
Version: 1.9.4-1
Replaces: liblz4-1a
Depends: libc6 (>= 2.14)
Breaks: liblz4-1a
Description: Fast LZ compression algorithm library - runtime
 LZ4 is a very fast lossless compression algorithm, providing compression speed
 at 400 MB/s per core, scalable with multi-cores CPU. It also features an
 extremely fast decoder, with speed in multiple GB/s per core, typically
 reaching RAM speed limits on multi-core systems.
 .
 This package includes the shared library.
Homepage: https://github.com/lz4/lz4

Package: liblzf1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 39
Maintainer: Timo Röhling <timo@gaussglocke.de>
Architecture: amd64
Multi-Arch: same
Source: liblzf
Version: 3.6-3
Depends: libc6 (>= 2.4)
Description: Very small data compression library
 This library implements the very, very fast LZF compression algorithm written
 in C. Compression ratios are moderate with 40 to 50 percent for typical
 binary data, but decompression speed is basically at unoptimized memcpy
 speed.
Homepage: http://software.schmorp.de/pkg/liblzf.html

Package: liblzma5
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 333
Maintainer: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Architecture: amd64
Multi-Arch: same
Source: xz-utils
Version: 5.4.1-1
Depends: libc6 (>= 2.34)
Breaks: liblzma2 (<< 5.1.1alpha+20110809-3~)
Description: XZ-format compression library
 XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm
 compression format, which provides memory-hungry but powerful
 compression (often better than bzip2) and fast, easy decompression.
 .
 The native format of liblzma is XZ; it also supports raw (headerless)
 streams and the older LZMA format used by lzma. (For 7-Zip's related
 format, use the p7zip package instead.)
Homepage: https://tukaani.org/xz/

Package: libmagic-mgc
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 8130
Maintainer: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
Architecture: amd64
Multi-Arch: foreign
Source: file
Version: 1:5.44-3
Replaces: libmagic1 (<< 1:5.28-4~)
Breaks: libmagic1 (<< 1:5.28-4~)
Description: File type determination library using "magic" numbers (compiled magic file)
 This package provides the compiled magic file "magic.mgc". It has
 been separated from libmagic1 in order to meet the multiarch
 requirements without breaking applications that expect this file
 at its absolute path.
Homepage: https://www.darwinsys.com/file/

Package: libmagic1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 232
Maintainer: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
Architecture: amd64
Multi-Arch: same
Source: file
Version: 1:5.44-3
Depends: libbz2-1.0, libc6 (>= 2.33), liblzma5 (>= 5.1.1alpha+20120614), zlib1g (>= 1:1.1.4), libmagic-mgc (= 1:5.44-3)
Suggests: file
Conffiles:
 /etc/magic 272913026300e7ae9b5e2d51f138e674
 /etc/magic.mime 272913026300e7ae9b5e2d51f138e674
Description: Recognize the type of data in a file using "magic" numbers - library
 This library can be used to classify files according to magic number
 tests. It implements the core functionality of the file command.
Homepage: https://www.darwinsys.com/file/

Package: libmaxminddb0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 76
Maintainer: Faidon Liambotis <paravoid@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libmaxminddb
Version: 1.7.1-1
Depends: libc6 (>= 2.33)
Suggests: mmdb-bin
Description: IP geolocation database library
 The libmaxminddb library provides a C library for reading MaxMind DB files,
 including the GeoIP2 databases from MaxMind. This is a custom binary format
 designed to facilitate fast lookups of IP addresses while allowing for great
 flexibility in the type of data associated with an address.
 .
 The MaxMind DB format is an open format. The spec is available at
 http://maxmind.github.io/MaxMind-DB/. This spec is licensed under the Creative
 Commons Attribution-ShareAlike 3.0 Unported License.
Homepage: https://maxmind.github.io/libmaxminddb/

Package: libmd0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 79
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libmd
Version: 1.0.4-2
Depends: libc6 (>= 2.33)
Description: message digest functions from BSD systems - shared library
 The libmd library provides various message digest ("hash") functions,
 as found on various BSDs on a library with the same name and with a
 compatible API.
Homepage: https://www.hadrons.org/software/libmd/

Package: libmnl0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 46
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libmnl
Version: 1.0.4-3
Depends: libc6 (>= 2.14)
Description: minimalistic Netlink communication library
 libmnl is a minimalistic user-space library oriented to Netlink developers.
 There are a lot of common tasks in parsing, validating, constructing of
 both the Netlink header and TLVs that are repetitive and easy to get wrong.
 This library aims to provide simple helpers that allows you to re-use code
 and to avoid re-inventing the wheel.
 .
 The main features of this library are:
 .
 Small: the shared library requires around 30KB for an x86-based computer.
 .
 Simple: this library avoids complexity and elaborated abstractions that
 tend to hide Netlink details.
 .
 Easy to use: the library simplifies the work for Netlink-wise developers.
 It provides functions to make socket handling, message building,
 validating, parsing and sequence tracking, easier.
 .
 Easy to re-use: you can use the library to build your own abstraction
 layer on top of this library.
 .
 Decoupling: the interdependency of the main bricks that compose the
 library is reduced, i.e. the library provides many helpers, but the
 programmer is not forced to use them.
 .
 This package contains the shared libraries needed to run programs that use
 the minimalistic Netlink communication library.
Homepage: https://netfilter.org/projects/libmnl/

Package: libmount1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 454
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.34), libselinux1 (>= 3.1~)
Suggests: cryptsetup-bin
Description: device mounting library
 This device mounting library is used by mount and umount helpers.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: libmpc3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 149
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: mpclib3
Version: 1.3.1-1
Depends: libc6 (>= 2.4), libgmp10 (>= 2:6.2.1+dfsg1), libmpfr6 (>= 4.0.0)
Description: multiple precision complex floating-point library
 MPC is a portable library written in C for arbitrary precision
 arithmetic on complex numbers providing correct rounding. For the time
 being, it contains all arithmetic operations over complex numbers, the
 exponential and the logarithm functions, the trigonometric and
 hyperbolic functions.
 .
 Ultimately, it should implement a multiprecision equivalent of the ISO
 C99 standard.
 .
 It builds upon the GNU MP and the MPFR libraries.
Homepage: http://www.multiprecision.org/mpc/

Package: libmpfr6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1177
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: mpfr4
Version: 4.2.0-1
Depends: libc6 (>= 2.14), libgmp10 (>= 2:6.2.1+dfsg1)
Breaks: libcgal13 (<< 4.11-2+b1), libflint-2.5.2 (<< 2.5.2-17+b2), libgiac0 (<< 1.2.3.57+dfsg1-2+b4), libgmp3 (<< 4.1.4-3), libmpc3 (<< 1.1.0-1~), libnormaliz3 (<< 3.5.1+ds-4), sagemath (<< 8.1-2+b2)
Description: multiple precision floating-point computation
 MPFR provides a library for multiple-precision floating-point computation
 with correct rounding.  The computation is both efficient and has a
 well-defined semantics. It copies the good ideas from the
 ANSI/IEEE-754 standard for double-precision floating-point arithmetic
 (53-bit mantissa).
Homepage: https://www.mpfr.org/

Package: libncursesw6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 412
Maintainer: Craig Small <csmall@debian.org>
Architecture: amd64
Multi-Arch: same
Source: ncurses
Version: 6.4-4
Depends: libtinfo6 (= 6.4-4), libc6 (>= 2.34)
Recommends: libgpm2
Description: shared libraries for terminal handling (wide character support)
 The ncurses library routines are a terminal-independent method of
 updating character screens with reasonable optimization.
 .
 This package contains the shared libraries necessary to run programs
 compiled with ncursesw, which includes support for wide characters.
Homepage: https://invisible-island.net/ncurses/

Package: libnetfilter-acct1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 29
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnetfilter-acct
Version: 1.0.3-3
Depends: libc6 (>= 2.4), libmnl0 (>= 1.0.3-4~)
Description: Netfilter acct library
 libnetfilter_acct is a userspace library providing an interface to the
 extended netfilter accounting infrastructure.
Homepage: https://www.netfilter.org/projects/libnetfilter_acct/

Package: libnetfilter-conntrack3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 139
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnetfilter-conntrack
Version: 1.0.9-3
Depends: libc6 (>= 2.14), libmnl0 (>= 1.0.3-4~), libnfnetlink0 (>= 1.0.2)
Description: Netfilter netlink-conntrack library
 libnetfilter_conntrack is a userspace library providing a programming
 interface (API) to the in-kernel connection tracking state table.
Homepage: https://www.netfilter.org/projects/libnetfilter_conntrack/

Package: libnettle8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 520
Maintainer: Magnus Holmgren <holmgren@debian.org>
Architecture: amd64
Multi-Arch: same
Source: nettle
Version: 3.8.1-2
Depends: libc6 (>= 2.17)
Description: low level cryptographic library (symmetric and one-way cryptos)
 Nettle is a cryptographic library that is designed to fit easily in more or
 less any context: In crypto toolkits for object-oriented languages (C++,
 Python, Pike, ...), in applications like LSH or GNUPG, or even in kernel
 space.
 .
 It tries to solve a problem of providing a common set of cryptographic
 algorithms for higher-level applications by implementing a
 context-independent set of cryptographic algorithms. In that light, Nettle
 doesn't do any memory allocation or I/O, it simply provides the
 cryptographic algorithms for the application to use in any environment and
 in any way it needs.
 .
 This package contains the symmetric and one-way cryptographic
 algorithms. To avoid having this package depend on libgmp, the
 asymmetric cryptos reside in a separate library, libhogweed.
Homepage: http://www.lysator.liu.se/~nisse/nettle/

Package: libnewt0.52
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 365
Maintainer: Alastair McKinstry <mckinstry@debian.org>
Architecture: amd64
Multi-Arch: same
Source: newt (0.52.23-1)
Version: 0.52.23-1+b1
Depends: libc6 (>= 2.34), libslang2 (>= 2.2.4)
Recommends: libfribidi0
Description: Not Erik's Windowing Toolkit - text mode windowing with slang
 Newt is a windowing toolkit for text mode built from the slang library.
 It allows color text mode applications to easily use stackable windows,
 push buttons, check boxes, radio buttons, lists, entry fields, labels,
 and displayable text. Scrollbars are supported, and forms may be nested
 to provide extra functionality. This package contains the shared library
 for programs that have been built with newt.
Homepage: https://pagure.io/newt

Package: libnfnetlink0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 51
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnfnetlink
Version: 1.0.2-2
Depends: libc6 (>= 2.14)
Description: Netfilter netlink library
 libnfnetlink is the low-level library for netfilter related
 kernel/userspace communication. It provides a generic messaging
 infrastructure for in-kernel netfilter subsystems (such as
 nfnetlink_log, nfnetlink_queue, nfnetlink_conntrack) and their
 respective users and/or management tools in userspace.
Homepage: https://git.netfilter.org/libnfnetlink

Package: libnfsidmap1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 276
Maintainer: Debian kernel team <debian-kernel@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: nfs-utils
Version: 1:2.6.2-4+deb12u1
Replaces: libnfsidmap-regex, libnfsidmap2 (<< 0.25-7~)
Provides: libnfsidmap-regex, libnfsidmap2
Depends: libc6 (>= 2.34), libldap-2.5-0 (>= 2.5.4)
Breaks: libnfsidmap-regex, libnfsidmap2 (<< 0.25-7~)
Conflicts: libnfsidmap-regex, libnfsidmap2
Description: NFS idmapping library
 libnfsidmap provides functions to map between NFSv4 names (which are
 of the form user@domain) and local uid's and gid's.
Homepage: https://linux-nfs.org/

Package: libnftables1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 920
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: nftables
Version: 1.0.6-2+deb12u2
Depends: libc6 (>= 2.34), libgmp10 (>= 2:6.2.1+dfsg1), libjansson4 (>= 2.14), libmnl0 (>= 1.0.3-4~), libnftnl11 (>= 1.2.2), libxtables12 (>= 1.6.0+snapshot20161117)
Description: Netfilter nftables high level userspace API library
 This library provides high level semantics to interact with the nftables
 framework by Netfilter project.
 .
 nftables replaces the old popular iptables, ip6tables, arptables and ebtables.
 .
 Netfilter software and nftables in particular are used in applications such
 as Internet connection sharing, firewalls, IP accounting, transparent
 proxying, advanced routing and traffic control.
 .
 A Linux kernel >= 3.13 is required. However, >= 4.14 is recommended.
 .
 This package contains the libnftables library.
Homepage: https://www.netfilter.org/

Package: libnftnl11
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 233
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnftnl
Version: 1.2.4-2
Depends: libc6 (>= 2.34), libmnl0 (>= 1.0.3-4~)
Description: Netfilter nftables userspace API library
 libnftnl is the low-level library for Netfilter 4th generation
 framework nftables.
 .
 Is the user-space library for low-level interaction with
 nftables Netlink's API over libmnl.
Homepage: https://git.netfilter.org/libnftnl

Package: libnghttp2-14
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 220
Maintainer: Tomasz Buchert <tomasz@debian.org>
Architecture: amd64
Multi-Arch: same
Source: nghttp2
Version: 1.52.0-1+deb12u2
Depends: libc6 (>= 2.17)
Description: library implementing HTTP/2 protocol (shared library)
 This is an implementation of the Hypertext Transfer Protocol version
 2 in C. The framing layer of HTTP/2 is implemented as a reusable C
 library.
 .
 This package installs a shared library.
Homepage: https://nghttp2.org/

Package: libnl-3-200
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 182
Maintainer: Heiko Stuebner <mmind@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnl3 (3.7.0-0.2)
Version: 3.7.0-0.2+b1
Depends: libc6 (>= 2.34)
Conffiles:
 /etc/libnl-3/classid 3e07259e58674631830b152e983ca995
 /etc/libnl-3/pktloc 7613dbc41b2dc3258195b6b6abd0f179
Description: library for dealing with netlink sockets
 This is a library for applications dealing with netlink sockets.
 The library provides an interface for raw netlink messaging and various
 netlink family specific interfaces.
Homepage: http://www.infradead.org/~tgr/libnl/

Package: libnl-genl-3-200
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 58
Maintainer: Heiko Stuebner <mmind@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnl3 (3.7.0-0.2)
Version: 3.7.0-0.2+b1
Depends: libnl-3-200 (= 3.7.0-0.2+b1), libc6 (>= 2.4)
Description: library for dealing with netlink sockets - generic netlink
 This is a library for applications dealing with netlink sockets.
 The library provides an interface for raw netlink messaging and various
 netlink family specific interfaces.
 .
 API to the generic netlink protocol, an extended version of the netlink
 protocol.
Homepage: http://www.infradead.org/~tgr/libnl/

Package: libnpth0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 50
Maintainer: Eric Dorland <eric@debian.org>
Architecture: amd64
Multi-Arch: same
Source: npth
Version: 1.6-3
Depends: libc6 (>= 2.17)
Description: replacement for GNU Pth using system threads
 nPth is a non-preemptive threads implementation using an API very
 similar to the one known from GNU Pth. It has been designed as a
 replacement of GNU Pth for non-ancient operating systems. In
 contrast to GNU Pth it is based on the system's standard threads
 implementation. Thus nPth allows the use of libraries which are not
 compatible to GNU Pth.
Homepage: https://www.gnupg.org/

Package: libnsl-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 345
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnsl
Version: 1.3.0-2
Replaces: libc6-dev (<< 2.31-4)
Depends: libnsl2 (= 1.3.0-2), libtirpc-dev
Breaks: libc6-dev (<< 2.31-4)
Description: libnsl development files
 This package contains the files needed for developing applications that
 use libnsl.
Homepage: https://github.com/thkukuk/libnsl

Package: libnsl2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 127
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libnsl
Version: 1.3.0-2
Depends: libc6 (>= 2.14), libtirpc3 (>= 1.0.2)
Description: Public client interface for NIS(YP) and NIS+
 This package contains the libnsl library, which contains the public client
 interface for NIS(YP) and NIS+. This code was formerly part of glibc, but is
 now standalone to be able to link against TI-RPC for IPv6 support.
Homepage: https://github.com/thkukuk/libnsl

Package: libnss-systemd
Status: install ok installed
Priority: standard
Section: admin
Installed-Size: 388
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: systemd
Version: 252.38-1~deb12u1
Depends: libc6 (>= 2.34), libcap2 (>= 1:2.10), systemd (= 252.38-1~deb12u1)
Description: nss module providing dynamic user and group name resolution
 nss-systemd is a plug-in module for the GNU Name Service Switch (NSS)
 functionality of the GNU C Library (glibc), providing UNIX user and group name
 resolution for dynamic users and groups allocated through the DynamicUser=
 option in systemd unit files. See systemd.exec(5) for details on this
 option.
 .
 Installing this package automatically adds the module to /etc/nsswitch.conf.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: libntfs-3g89
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 366
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: ntfs-3g
Version: 1:2022.10.3-1+deb12u2
Depends: libc6 (>= 2.33)
Description: read/write NTFS driver for FUSE (runtime library)
 NTFS-3G uses FUSE (Filesystem in Userspace) to provide support for the NTFS
 filesystem used by Microsoft Windows.
 .
 This package contains the actual library.
Homepage: https://github.com/tuxera/ntfs-3g/wiki

Package: libnuma1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 71
Maintainer: Ian Wienand <ianw@debian.org>
Architecture: amd64
Multi-Arch: same
Source: numactl
Version: 2.0.16-1
Depends: libc6 (>= 2.34)
Description: Libraries for controlling NUMA policy
 Library to control specific NUMA (Non-Uniform Memory Architecture)
 scheduling or memory placement policies.
Homepage: https://github.com/numactl/numactl

Package: libp11-kit0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1408
Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: p11-kit
Version: 0.24.1-2
Depends: libc6 (>= 2.34), libffi8 (>= 3.4)
Description: library for loading and coordinating access to PKCS#11 modules - runtime
 The p11-kit library provides a way to load and enumerate Public-Key
 Cryptography Standard #11 modules, along with a standard configuration
 setup for installing PKCS#11 modules so that they're discoverable. It
 also solves problems with coordinating the use of PKCS#11 by different
 components or libraries living in the same process.
 .
 This package contains the shared library required for applications loading
 and accessing PKCS#11 modules.
Homepage: https://p11-glue.github.io/p11-glue/p11-kit.html

Package: libpam-modules
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 1031
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pam
Version: 1.5.2-6+deb12u1
Replaces: libpam-umask, libpam0g-util
Provides: libpam-mkhomedir, libpam-motd, libpam-umask
Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcrypt1 (>= 1:4.3.0), libdb5.3, libpam0g (>= 1.4.1), libselinux1 (>= 3.1~), debconf (>= 0.5) | debconf-2.0, libpam-modules-bin (= 1.5.2-6+deb12u1)
Conflicts: libpam-mkhomedir, libpam-motd, libpam-umask
Conffiles:
 /etc/security/access.conf dc21d0fd769d655b311d785670e5c6ae
 /etc/security/faillock.conf 164da8ffb87f3074179bc60b71d0b99f
 /etc/security/group.conf f1e26e8db6f7abd2d697d7dad3422c36
 /etc/security/limits.conf 0b1967ff9042a716ce6b01cb999aa1f5
 /etc/security/namespace.conf 6b3796403421d66db7defc46517711bc
 /etc/security/namespace.init d9e6a7c85e966427ef23a04ec6c7000f
 /etc/security/pam_env.conf 89cc8702173d5cd51abc152ae9f8d6bc
 /etc/security/sepermit.conf 3d82df292d497bbeaaf8ebef18cd14f1
 /etc/security/time.conf 06e05c6079e839c8833ac7c3abfde192
Description: Pluggable Authentication Modules for PAM
 This package completes the set of modules for PAM. It includes the
  pam_unix.so module as well as some specialty modules.
Homepage: http://www.linux-pam.org/

Package: libpam-modules-bin
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 227
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: pam
Version: 1.5.2-6+deb12u1
Replaces: libpam-modules (<< 1.5.2-5~)
Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcrypt1 (>= 1:4.3.0), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~)
Description: Pluggable Authentication Modules for PAM - helper binaries
 This package contains helper binaries used by the standard set of PAM
 modules in the libpam-modules package.
Homepage: http://www.linux-pam.org/

Package: libpam-runtime
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 876
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: all
Multi-Arch: foreign
Source: pam
Version: 1.5.2-6+deb12u1
Replaces: libpam0g-dev, libpam0g-util
Depends: debconf (>= 0.5) | debconf-2.0, debconf (>= 1.5.19) | cdebconf, libpam-modules (>= 1.0.1-6)
Conflicts: libpam0g-util
Conffiles:
 /etc/pam.conf 87fc76f18e98ee7d3848f6b81b3391e5
 /etc/pam.d/other 31aa7f2181889ffb00b87df4126d1701
Description: Runtime support for the PAM library
 Contains configuration files and  directories required for
 authentication  to work on Debian systems.  This package is required
 on almost all installations.
Homepage: http://www.linux-pam.org/

Package: libpam-systemd
Status: install ok installed
Priority: standard
Section: admin
Installed-Size: 531
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: systemd
Version: 252.38-1~deb12u1
Provides: default-logind (= 252.38-1~deb12u1), logind (= 252.38-1~deb12u1)
Depends: libc6 (>= 2.34), libcap2 (>= 1:2.10), libpam0g (>= 0.99.7.1), systemd (= 252.38-1~deb12u1), libpam-runtime, default-dbus-system-bus | dbus-system-bus, systemd-sysv
Recommends: dbus-user-session
Description: system and service manager - PAM module
 This package contains the PAM module which registers user sessions in
 the systemd control group hierarchy for logind.
 .
 If in doubt, do install this package.
 .
 Packages that depend on logind functionality need to depend on libpam-systemd.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: libpam0g
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 215
Maintainer: Sam Hartman <hartmans@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pam
Version: 1.5.2-6+deb12u1
Replaces: libpam0g-util
Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), debconf (>= 0.5) | debconf-2.0
Suggests: libpam-doc
Description: Pluggable Authentication Modules library
 Contains the shared library for Linux-PAM, a library that enables the
 local system administrator to choose how applications authenticate users.
 In other words, without rewriting or recompiling a PAM-aware application,
 it is possible to switch between the authentication mechanism(s) it uses.
 One may entirely upgrade the local authentication system without touching
 the applications themselves.
Homepage: http://www.linux-pam.org/

Package: libpcap0.8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 368
Maintainer: Romain Francoise <rfrancoise@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libpcap
Version: 1.10.3-1
Depends: libc6 (>= 2.33), libdbus-1-3 (>= 1.9.14)
Description: system interface for user-level packet capture
 libpcap (Packet CAPture) provides a portable framework for low-level
 network monitoring.  Applications include network statistics collection,
 security monitoring, network debugging, etc.
 .
 Since almost every system vendor provides a different interface for
 packet capture, and since there are several tools that require this
 functionality, the libpcap authors created this system-independent API
 to ease in porting and to alleviate the need for several
 system-dependent packet capture modules in each application.
Homepage: https://www.tcpdump.org/

Package: libpci3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 124
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pciutils
Version: 1:3.9.0-4
Depends: libc6 (>= 2.34), libudev1 (>= 196), zlib1g (>= 1:1.1.4), pci.ids (>= 0.0~2019.11.10-2)
Description: PCI utilities (shared library)
 This package contains the libpci shared library files.
 .
 The libpci library provides portable access to configuration
 registers of devices connected to the PCI bus.
Homepage: https://mj.ucw.cz/sw/pciutils/

Package: libpcre2-16-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 632
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre2
Version: 10.42-1
Depends: libc6 (>= 2.34)
Description: New Perl Compatible Regular Expression Library - 16 bit runtime files
 This is PCRE2, the new implementation of PCRE, a library of functions
 to support regular expressions whose syntax and semantics are as
 close as possible to those of the Perl 5 language. New projects
 should use this library in preference to the older library,
 confusingly called pcre3 in Debian.
 .
 This package contains the 16 bit runtime library, which operates on
 UTF-16 input.
Homepage: https://pcre.org/

Package: libpcre2-32-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 608
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre2
Version: 10.42-1
Depends: libc6 (>= 2.34)
Description: New Perl Compatible Regular Expression Library - 32 bit runtime files
 This is PCRE2, the new implementation of PCRE, a library of functions
 to support regular expressions whose syntax and semantics are as
 close as possible to those of the Perl 5 language. New projects
 should use this library in preference to the older library,
 confusingly called pcre3 in Debian.
 .
 This package contains the 32 bit runtime library, which operates on
 UTF-32 input.
Homepage: https://pcre.org/

Package: libpcre2-8-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 685
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre2
Version: 10.42-1
Depends: libc6 (>= 2.34)
Description: New Perl Compatible Regular Expression Library- 8 bit runtime files
 This is PCRE2, the new implementation of PCRE, a library of functions
 to support regular expressions whose syntax and semantics are as
 close as possible to those of the Perl 5 language. New projects
 should use this library in preference to the older library,
 confusingly called pcre3 in Debian.
 .
 This package contains the 8 bit runtime library, which operates on
 ASCII and UTF-8 input.
Homepage: https://pcre.org/

Package: libpcre2-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 2588
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre2
Version: 10.42-1
Depends: libc-dev, libpcre2-8-0 (= 10.42-1), libpcre2-16-0 (= 10.42-1), libpcre2-32-0 (= 10.42-1), libpcre2-posix3 (= 10.42-1)
Conflicts: libpcre3-dev (<< 2:8.35-8)
Description: New Perl Compatible Regular Expression Library - development files
 This is PCRE2, the new implementation of PCRE, a library of functions
 to support regular expressions whose syntax and semantics are as
 close as possible to those of the Perl 5 language. New projects
 should use this library in preference to the older library,
 confusingly called pcre3 in Debian.
 .
 This package contains the development files, including headers,
 static libraries, and documentation.
Homepage: https://pcre.org/

Package: libpcre2-posix3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 82
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre2
Version: 10.42-1
Replaces: libpcre2-posix0
Depends: libc6 (>= 2.4), libpcre2-8-0 (>= 10.22)
Conflicts: libpcre2-posix0
Description: New Perl Compatible Regular Expression Library - posix-compatible runtime files
 This is PCRE2, the new implementation of PCRE, a library of functions
 to support regular expressions whose syntax and semantics are as
 close as possible to those of the Perl 5 language. New projects
 should use this library in preference to the older library,
 confusingly called pcre3 in Debian.
 .
 This package contains the runtime library for the posix-compatible API.
Homepage: https://pcre.org/

Package: libpcre3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 680
Maintainer: Matthew Vernon <matthew@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pcre3
Version: 2:8.39-15
Depends: libc6 (>= 2.34)
Breaks: approx (<< 4.4-1~), cduce (<< 0.5.3-2~), cmigrep (<< 1.5-7~), galax (<< 1.1-7~), libpcre-ocaml (<< 6.0.1~), liquidsoap (<< 0.9.2-3~), ocsigen (<< 1.3.3-1~)
Conflicts: libpcre3-dev (<= 4.3-3)
Description: Old Perl 5 Compatible Regular Expression Library - runtime files
 This is a library of functions to support regular expressions whose syntax
 and semantics are as close as possible to those of the Perl 5 language.
 .
 New packages should use the newer pcre2 packages, and existing
 packages should migrate to pcre2.
 .
 This package contains the runtime libraries.

Package: libperl5.36
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 28863
Maintainer: Niko Tyni <ntyni@debian.org>
Architecture: amd64
Multi-Arch: same
Source: perl
Version: 5.36.0-7+deb12u2
Replaces: libarchive-tar-perl (<= 1.38-2), libcompress-raw-bzip2-perl (<< 2.103), libcompress-raw-zlib-perl (<< 2.105), libcompress-zlib-perl (<< 2.106), libdigest-md5-perl (<< 2.58), libdigest-sha-perl (<< 6.02), libencode-perl (<< 3.17), libio-compress-base-perl (<< 2.106), libio-compress-bzip2-perl (<< 2.106), libio-compress-perl (<< 2.106), libio-compress-zlib-perl (<< 2.106), libmime-base64-perl (<< 3.16), libmodule-corelist-perl (<< 2.14-2), libstorable-perl (<< 3.26), libsys-syslog-perl (<< 0.36), libthreads-perl (<< 2.27), libthreads-shared-perl (<< 1.64), libtime-hires-perl (<< 1.9770), libtime-piece-perl (<< 1.3401), perl (<< 5.22.0~), perl-base (<< 5.22.0~)
Depends: libbz2-1.0, libc6 (>= 2.35), libcrypt1 (>= 1:4.1.0), libdb5.3, libgdbm-compat4 (>= 1.18-3), libgdbm6 (>= 1.21), zlib1g (>= 1:1.2.2.3), perl-modules-5.36 (>= 5.36.0-7+deb12u2)
Suggests: sensible-utils
Breaks: libcompress-raw-bzip2-perl (<< 2.103), libcompress-raw-zlib-perl (<< 2.105), libcompress-zlib-perl (<< 2.106), libdigest-md5-perl (<< 2.58), libdigest-sha-perl (<< 6.02), libencode-perl (<< 3.17), libfilter-perl (<< 1.60), libio-compress-base-perl (<< 2.106), libio-compress-bzip2-perl (<< 2.106), libio-compress-perl (<< 2.106), libio-compress-zlib-perl (<< 2.106), libmime-base64-perl (<< 3.16), libstorable-perl (<< 3.26), libsys-syslog-perl (<< 0.36), libthreads-perl (<< 2.27), libthreads-shared-perl (<< 1.64), libtime-hires-perl (<< 1.9770), libtime-piece-perl (<< 1.3401)
Description: shared Perl library
 This package contains the shared Perl library, used by applications
 which embed a Perl interpreter.
 .
 It also contains the architecture-dependent parts of the standard
 library (and depends on perl-modules-5.36 which contains the
 architecture-independent parts).
Homepage: http://dev.perl.org/perl5/

Package: libpipeline1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 96
Maintainer: Colin Watson <cjwatson@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libpipeline
Version: 1.5.7-1
Depends: libc6 (>= 2.34)
Description: Unix process pipeline manipulation library
 This is a C library for setting up and running pipelines of processes,
 without needing to involve shell command-line parsing which is often
 error-prone and insecure.
Homepage: https://libpipeline.gitlab.io/libpipeline/

Package: libpkgconf3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 101
Maintainer: Andrej Shadura <andrewsh@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pkgconf
Version: 1.8.1-1
Depends: libc6 (>= 2.33)
Description: shared library for pkgconf
 pkgconf is an implementation of the pkg-config system, which helps to configure
 compiler and linker flags for development frameworks.
 .
 pkgconf is a replacement for pkg-config, providing additional functionality
 while also maintaining compatibility.
 .
 libpkgconf is a library which provides access to most of pkgconf's
 functionality, to allow other tooling such as compilers and IDEs to
 discover and use libraries configured by pkgconf.
 .
 This package ships a shared library for libpkgconf.
Homepage: http://pkgconf.org/

Package: libpng16-16
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 416
Maintainer: Maintainers of libpng1.6 packages <libpng1.6@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libpng1.6
Version: 1.6.39-2
Depends: libc6 (>= 2.29), zlib1g (>= 1:1.2.11.dfsg)
Description: PNG library - runtime (version 1.6)
 libpng is a library implementing an interface for reading and writing
 PNG (Portable Network Graphics) format files.
 .
 This package contains the runtime library files needed to run software
 using libpng.
Homepage: http://libpng.org/pub/png/libpng.html

Package: libpopt0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 245
Maintainer: Håvard F. Aasen <havard.f.aasen@pfft.no>
Architecture: amd64
Multi-Arch: same
Source: popt
Version: 1.19+dfsg-1
Depends: libc6 (>= 2.33)
Description: lib for parsing cmdline parameters
 Popt was heavily influenced by the getopt() and getopt_long() functions,
 but it allows more powerful argument expansion. It can parse arbitrary
 argv[] style arrays and automatically set variables based on command
 line arguments. It also allows command line arguments to be aliased via
 configuration files and includes utility functions for parsing arbitrary
 strings into argv[] arrays using shell-like rules.
 .
 This package contains the runtime library and locale data.
Homepage: https://github.com/rpm-software-management/popt

Package: libproc2-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 232
Maintainer: Craig Small <csmall@debian.org>
Architecture: amd64
Multi-Arch: same
Source: procps
Version: 2:4.0.2-3
Replaces: procps (<< 1:3.3.2-1)
Depends: libc6 (>= 2.34), libsystemd0 (>= 209)
Description: library for accessing process information from /proc
 The libproc2 library is a way of accessing information out of the /proc
 filesystem.
 .
 This package contains the shared libraries necessary to run programs
 compiled with libproc2.
Homepage: https://gitlab.com/procps-ng/procps

Package: libprotobuf-c1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 69
Maintainer: Robert Edmonds <edmonds@debian.org>
Architecture: amd64
Multi-Arch: same
Source: protobuf-c (1.4.1-1)
Version: 1.4.1-1+b1
Depends: libc6 (>= 2.14)
Description: Protocol Buffers C shared library (protobuf-c)
 Protocol Buffers are a flexible, efficient, automated mechanism for
 serializing structured data - similar to XML, but smaller, faster, and
 simpler. You define how you want your data to be structured once, then you can
 use special generated source code to easily write and read your structured
 data to and from a variety of data streams and using a variety of languages.
 You can even update your data structure without breaking deployed programs
 that are compiled against the "old" format.
 .
 This is the "protobuf-c" implementation of Protocol Buffers in C.
 .
 This package contains the shared library.
Homepage: https://github.com/protobuf-c/protobuf-c

Package: libpsl5
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 96
Maintainer: Tim Rühsen <tim.ruehsen@gmx.de>
Architecture: amd64
Multi-Arch: same
Source: libpsl
Version: 0.21.2-1
Depends: libidn2-0 (>= 0.16), libc6 (>= 2.33), libunistring2 (>= 0.9.7)
Recommends: publicsuffix (>= 20150507)
Description: Library for Public Suffix List (shared libraries)
 Libpsl allows checking domains against the Public Suffix List.
 It can be used to avoid privacy-leaking 'super-cookies',
 'super domain' certificates, for domain highlighting purposes
 sorting domain lists by site and more.
 .
 Please see https://publicsuffix.org for more detailed information.
 .
 This package contains runtime libraries.
Homepage: https://github.com/rockdaboot/libpsl

Package: libpython3-stdlib
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 27
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: python3-defaults (3.11.2-1)
Version: 3.11.2-1+b1
Depends: libpython3.11-stdlib (>= 3.11.2-1~)
Description: interactive high-level object-oriented language (default python3 version)
 This package contains the majority of the standard library for the Python
 language (default python3 version).
 .
 This package is a dependency package, which depends on Debian's default
 Python 3 version's standard library (currently v3.11).
Homepage: https://www.python.org/

Package: libpython3.11-minimal
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 5212
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: python3.11
Version: 3.11.2-6+deb12u6
Depends: libc6 (>= 2.14), libssl3 (>= 3.0.0)
Recommends: libpython3.11-stdlib
Conflicts: binfmt-support (<< 1.1.2)
Conffiles:
 /etc/python3.11/sitecustomize.py d6b276695157bde06a56ba1b2bc53670
Description: Minimal subset of the Python language (version 3.11)
 This package contains some essential modules. It is normally not
 used on it's own, but as a dependency of python3.11-minimal.

Package: libpython3.11-stdlib
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 8329
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: python3.11
Version: 3.11.2-6+deb12u6
Replaces: python3-gdbm (<< 3.9.9-1~)
Depends: libpython3.11-minimal (= 3.11.2-6+deb12u6), media-types | mime-support, libbz2-1.0, libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libdb5.3, libffi8 (>= 3.4), liblzma5 (>= 5.1.1alpha+20120614), libncursesw6 (>= 6.1), libnsl2 (>= 1.0), libreadline8 (>= 7.0~beta), libsqlite3-0 (>= 3.36.0), libtinfo6 (>= 6), libtirpc3 (>= 1.0.2), libuuid1 (>= 2.20.1)
Breaks: python3-gdbm (<< 3.9.9-1~)
Description: Interactive high-level object-oriented language (standard library, version 3.11)
 Python is a high-level, interactive, object-oriented language. Its 3.11 version
 includes an extensive class library with lots of goodies for
 network programming, system administration, sounds and graphics.
 .
 This package contains Python 3.11's standard library. It is normally not
 used on its own, but as a dependency of python3.11.

Package: libquadmath0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 292
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.23)
Description: GCC Quad-Precision Math Library
 A library, which provides quad-precision mathematical functions on targets
 supporting the __float128 datatype. The library is used to provide on such
 targets the REAL(16) type in the GNU Fortran compiler.
Homepage: http://gcc.gnu.org/

Package: librav1e0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2664
Maintainer: Debian Rust Maintainers <pkg-rust-maintainers@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: same
Source: rust-rav1e
Version: 0.5.1-6
Depends: libc6 (>= 2.34), libgcc-s1 (>= 4.2)
Description: Fastest and safest AV1 encoder - shared library
 rav1e is a encoder for the AV1 video codec.
 .
 This package contains the shared library.
Homepage: https://github.com/xiph/rav1e

Package: libreadline8
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 475
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: same
Source: readline
Version: 8.2-1.3
Depends: readline-common, libc6 (>= 2.33), libtinfo6 (>= 6)
Description: GNU readline and history libraries, run-time libraries
 The GNU readline library aids in the consistency of user interface
 across discrete programs that need to provide a command line
 interface.
 .
 The GNU history library provides a consistent user interface for
 recalling lines of previously typed input.

Package: librtmp1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 146
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: rtmpdump (2.4+20151223.gitfa8646d.1-2)
Version: 2.4+20151223.gitfa8646d.1-2+b2
Depends: libc6 (>= 2.14), libgmp10, libgnutls30 (>= 3.6.14), libhogweed6, libnettle8, zlib1g (>= 1:1.1.4)
Description: toolkit for RTMP streams (shared library)
 A small dumper for media content streamed over the RTMP protocol (like BBC's
 iPlayer high quality streams). Supplying an RTMP URL will result in a dumped
 flv file, which can be played/transcoded with standard tools.
 .
 This package contains the shared libraries, header files needed by
 programs that want to use librtmp.
Homepage: http://rtmpdump.mplayerhq.hu/

Package: libsasl2-2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 167
Maintainer: Debian Cyrus Team <team+cyrus@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: cyrus-sasl2
Version: 2.1.28+dfsg-10
Replaces: libsasl2
Depends: libsasl2-modules-db (>= 2.1.28+dfsg-10), libc6 (>= 2.34)
Recommends: libsasl2-modules (>= 2.1.28+dfsg-10)
Description: Cyrus SASL - authentication abstraction library
 This is the Cyrus SASL API implementation, version 2.1.
 .
 SASL is the Simple Authentication and Security Layer, a method for
 adding authentication support to connection-based protocols. To use
 SASL, a protocol includes a command for identifying and
 authenticating a user to a server and for optionally negotiating
 protection of subsequent protocol interactions. If its use is
 negotiated, a security layer is inserted between the protocol and the
 connection. See RFC 2222 for more information.
 .
 Any of: ANONYMOUS, SCRAM, CRAM-MD5, DIGEST-MD5, GSSAPI (MIT or Heimdal
 Kerberos 5), NTLM, OTP, PLAIN, or LOGIN can be used.
Homepage: https://www.cyrusimap.org/sasl/

Package: libsasl2-modules
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 284
Maintainer: Debian Cyrus Team <team+cyrus@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: cyrus-sasl2
Version: 2.1.28+dfsg-10
Replaces: libsasl2-modules-gssapi-mit (<< 2.1.28+dfsg-4)
Depends: libc6 (>= 2.14), libssl3 (>= 3.0.0)
Suggests: libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal, libsasl2-modules-ldap, libsasl2-modules-otp, libsasl2-modules-sql
Breaks: libsasl2-modules-gssapi-mit (<< 2.1.28+dfsg-4)
Description: Cyrus SASL - pluggable authentication modules
 This is the Cyrus SASL API implementation, version 2.1. See package
 libsasl2-2 and RFC 2222 for more information.
 .
 This package provides the following SASL modules: LOGIN, PLAIN, ANONYMOUS,
 NTLM, SCRAM, CRAM-MD5, and DIGEST-MD5 (with DES support, deprecated).
Homepage: https://www.cyrusimap.org/sasl/

Package: libsasl2-modules-db
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 77
Maintainer: Debian Cyrus Team <team+cyrus@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: cyrus-sasl2
Version: 2.1.28+dfsg-10
Depends: libc6 (>= 2.14), libdb5.3
Description: Cyrus SASL - pluggable authentication modules (DB)
 This is the Cyrus SASL API implementation, version 2.1. See package
 libsasl2-2 and RFC 2222 for more information.
 .
 This package provides the DB plugin, which supports Berkeley DB lookups.
Homepage: https://www.cyrusimap.org/sasl/

Package: libseccomp2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 148
Maintainer: Kees Cook <kees@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libseccomp
Version: 2.5.4-1+deb12u1
Depends: libc6 (>= 2.4)
Description: high level interface to Linux seccomp filter
 This library provides a high level interface to constructing, analyzing
 and installing seccomp filters via a BPF passed to the Linux Kernel's
 prctl() syscall.
Homepage: https://github.com/seccomp/libseccomp

Package: libselinux1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 199
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libselinux (3.4-1)
Version: 3.4-1+b6
Depends: libc6 (>= 2.34), libpcre2-8-0 (>= 10.22)
Description: SELinux runtime shared libraries
 This package provides the shared libraries for Security-enhanced
 Linux that provides interfaces (e.g. library functions for the
 SELinux kernel APIs like getcon(), other support functions like
 getseuserbyname()) to SELinux-aware applications. Security-enhanced
 Linux is a patch of the Linux kernel and a number of utilities with
 enhanced security functionality designed to add mandatory access
 controls to Linux.  The Security-enhanced Linux kernel contains new
 architectural components originally developed to improve the security
 of the Flask operating system. These architectural components provide
 general support for the enforcement of many kinds of mandatory access
 control policies, including those based on the concepts of Type
 Enforcement, Role-based Access Control, and Multi-level Security.
 .
 libselinux1 provides an API for SELinux applications to get and set
 process and file security contexts and to obtain security policy
 decisions.  Required for any applications that use the SELinux
 API. libselinux may use the shared libsepol to manipulate the binary
 policy if necessary (e.g. to downgrade the policy format to an older
 version supported by the kernel) when loading policy.
Homepage: https://selinuxproject.org

Package: libselinux1-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 702
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libselinux (3.4-1)
Version: 3.4-1+b6
Provides: libselinux-dev
Depends: libselinux1 (= 3.4-1+b6), libsepol-dev (>= 3.4), libpcre2-dev
Conflicts: libselinux-dev
Description: SELinux development headers
 This package provides the  static libraries and header files
 needed for developing SELinux applications.  Security-enhanced Linux
 is a patch of the Linux kernel and a number of utilities with
 enhanced security functionality designed to add mandatory access
 controls to Linux.  The Security-enhanced Linux kernel contains new
 architectural components originally developed to improve the security
 of the Flask operating system. These architectural components provide
 general support for the enforcement of many kinds of mandatory access
 control policies, including those based on the concepts of Type
 Enforcement, Role-based Access Control, and Multi-level Security.
Homepage: https://selinuxproject.org

Package: libsemanage-common
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 37
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: all
Multi-Arch: foreign
Source: libsemanage
Version: 3.4-1
Conffiles:
 /etc/selinux/semanage.conf 8e8dfac33a09c1b53ca08bf6d4201b10
Description: Common files for SELinux policy management libraries
 This package provides the common files used by the shared libraries
 for SELinux policy management.
 .
 Security-enhanced Linux is a patch of the Linux kernel and a
 number of utilities with enhanced security functionality designed to
 add mandatory access controls to Linux.  The Security-enhanced Linux
 kernel contains new architectural components originally developed to
 improve the security of the Flask operating system. These
 architectural components provide general support for the enforcement
 of many kinds of mandatory access control policies, including those
 based on the concepts of Type Enforcement, Role-based Access
 Control, and Multi-level Security.
Homepage: https://selinuxproject.org

Package: libsemanage2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 297
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libsemanage (3.4-1)
Version: 3.4-1+b5
Depends: libsemanage-common (>= 3.4-1), libaudit1 (>= 1:2.2.1), libbz2-1.0, libc6 (>= 2.34), libselinux1 (>= 3.4), libsepol2 (>= 3.4)
Breaks: policycoreutils (<< 3.0)
Description: SELinux policy management library
 This package provides the shared libraries for SELinux policy management.
 It uses libsepol for binary policy manipulation and libselinux for
 interacting with the SELinux system.  It also exec's helper programs
 for loading policy and for checking whether the file_contexts
 configuration is valid (load_policy and setfiles from
 policycoreutils) presently, although this may change at least for the
 bootstrapping case
 .
 Security-enhanced Linux is a patch of the Linux kernel and a
 number of utilities with enhanced security functionality designed to
 add mandatory access controls to Linux.  The Security-enhanced Linux
 kernel contains new architectural components originally developed to
 improve the security of the Flask operating system. These
 architectural components provide general support for the enforcement
 of many kinds of mandatory access control policies, including those
 based on the concepts of Type Enforcement, Role-based Access
 Control, and Multi-level Security.
Homepage: https://selinuxproject.org

Package: libsepol-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 1669
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libsepol
Version: 3.4-2.1
Replaces: libsepol1-dev (<< 3.2)
Depends: libsepol2 (= 3.4-2.1)
Breaks: libsepol1-dev (<< 3.2)
Description: SELinux binary policy manipulation library and development files
 libsepol allows programs to easily modify SELinux binary policies.  This
 means changing the default values for booleans, or reading the policy for
 analysis.
 .
 This package contains the headers and archives used for linking it into your
 programs.
Homepage: https://selinuxproject.org

Package: libsepol2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 775
Maintainer: Debian SELinux maintainers <selinux-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libsepol
Version: 3.4-2.1
Depends: libc6 (>= 2.33)
Description: SELinux library for manipulating binary security policies
 Security-enhanced Linux is a patch of the Linux kernel and a number
 of utilities with enhanced security functionality designed to add
 mandatory access controls to Linux.  The Security-enhanced Linux
 kernel contains new architectural components originally developed to
 improve the security of the Flask operating system. These
 architectural components provide general support for the enforcement
 of many kinds of mandatory access control policies, including those
 based on the concepts of Type Enforcement®, Role-based Access
 Control, and Multi-level Security.
 .
 libsepol provides an API for the manipulation of SELinux binary policies.
 It is used by checkpolicy (the policy compiler) and similar tools, as well
 as by programs like load_policy that need to perform specific transformations
 on binary policies such as customizing policy boolean settings.
Homepage: https://selinuxproject.org

Package: libslang2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2386
Maintainer: Alastair McKinstry <mckinstry@debian.org>
Architecture: amd64
Multi-Arch: same
Source: slang2
Version: 2.3.3-3
Depends: libc6 (>= 2.35)
Description: S-Lang programming library - runtime version
 S-Lang is a C programmer's library that includes routines for the rapid
 development of sophisticated, user friendly, multi-platform applications.
 .
 This package contains only the shared library libslang.so.* and copyright
 information. It is only necessary for programs that use this library (such
 as jed and slrn). If you plan on doing development with S-Lang, you will
 need the companion -dev package as well.
Built-Using: unicode-data (= 15.0.0-1)
Homepage: http://www.jedsoft.org/slang/

Package: libsmartcols1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 289
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libc6 (>= 2.33)
Description: smart column output alignment library
 This smart column output alignment library is used by fdisk utilities.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: libsqlite3-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1682
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: sqlite3
Version: 3.40.1-2+deb12u1
Depends: libc6 (>= 2.34)
Breaks: crowdsec (<< 1.4), python-migrate (<< 0.11.0-4~), python3-migrate (<< 0.11.0-4~)
Description: SQLite 3 shared library
 SQLite is a C library that implements an SQL database engine.
 Programs that link with the SQLite library can have SQL database
 access without running a separate RDBMS process.
Homepage: https://www.sqlite.org/

Package: libss2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 70
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Architecture: amd64
Multi-Arch: same
Source: e2fsprogs
Version: 1.47.0-2
Replaces: e2fsprogs (<< 1.34-1)
Depends: libcom-err2, libc6 (>= 2.34)
Description: command-line interface parsing library
 libss provides a simple command-line interface parser which will
 accept input from the user, parse the command into an argv argument
 vector, and then dispatch it to a handler function.
 .
 It was originally inspired by the Multics SubSystem library.
Homepage: http://e2fsprogs.sourceforge.net

Package: libssh2-1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 357
Maintainer: Nicolas Mora <babelouest@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libssh2 (1.10.0-3)
Version: 1.10.0-3+b1
Depends: libc6 (>= 2.14), libssl3 (>= 3.0.0), zlib1g (>= 1:1.1.4)
Description: SSH2 client-side library
 libssh2 is a client-side C library implementing the SSH2 protocol.
 It supports regular terminal, SCP and SFTP (v1-v5) sessions;
 port forwarding, X11 forwarding; password, key-based and
 keyboard-interactive authentication.
 .
 This package contains the runtime library.
Homepage: https://libssh2.org/

Package: libssl3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 6021
Maintainer: Debian OpenSSL Team <pkg-openssl-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: same
Source: openssl
Version: 3.0.17-1~deb12u1
Depends: libc6 (>= 2.34)
Description: Secure Sockets Layer toolkit - shared libraries
 This package is part of the OpenSSL project's implementation of the SSL
 and TLS cryptographic protocols for secure communication over the
 Internet.
 .
 It provides the libssl and libcrypto shared libraries.
Homepage: https://www.openssl.org/

Package: libstdc++-12-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 19446
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Provides: libstdc++-dev
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libgcc-12-dev (= 12.2.0-14+deb12u1), libstdc++6 (>= 12.2.0-14+deb12u1), libc6-dev (>= 2.23-1~)
Suggests: libstdc++-12-doc
Description: GNU Standard C++ Library v3 (development files)
 This package contains the headers and static library files necessary for
 building C++ programs which use libstdc++.
 .
 libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which
 was included up to g++-2.95. The first version of libstdc++-v3 appeared
 in g++-3.0.
Homepage: http://gcc.gnu.org/

Package: libstdc++6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2686
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Replaces: libstdc++6-12-dbg (<< 4.9.0-3)
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.36), libgcc-s1 (>= 4.2)
Breaks: gcc-4.3 (<< 4.3.6-1), gcc-4.4 (<< 4.4.6-4), gcc-4.5 (<< 4.5.3-2)
Conflicts: scim (<< 1.4.2-1)
Description: GNU Standard C++ Library v3
 This package contains an additional runtime library for C++ programs
 built with the GNU compiler.
 .
 libstdc++-v3 is a complete rewrite from the previous libstdc++-v2, which
 was included up to g++-2.95. The first version of libstdc++-v3 appeared
 in g++-3.0.
Homepage: http://gcc.gnu.org/

Package: libsvtav1enc1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 6632
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: svt-av1
Version: 1.4.1+dfsg-1
Depends: libc6 (>= 2.34)
Description: Scalable Video Technology for AV1 (libsvtav1enc shared library)
 The Scalable Video Technology for AV1 (SVT-AV1 Encoder and Decoder) is an
 AV1-compliant encoder/decoder library core. The SVT-AV1 encoder development
 is a work-in-progress targeting performance levels applicable to both VOD and
 Live encoding / transcoding video applications. The SVT-AV1 decoder
 implementation is targeting future codec research activities.
 .
 This package provides the shared library libsvtav1enc.
Homepage: https://gitlab.com/AOMediaCodec/SVT-AV1

Package: libsystemd-shared
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 5345
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: systemd
Version: 252.38-1~deb12u1
Depends: libacl1 (>= 2.2.23), libapparmor1 (>= 2.13), libaudit1 (>= 1:2.2.1), libblkid1 (>= 2.24), libc6 (>= 2.36), libcap2 (>= 1:2.10), libcrypt1 (>= 1:4.4.0), libgcrypt20 (>= 1.10.0), libip4tc2 (>= 1.8.3), libkmod2 (>= 15), liblz4-1 (>= 0.0~r130), liblzma5 (>= 5.1.1alpha+20120614), libmount1 (>= 2.30), libpam0g (>= 0.99.7.1), libseccomp2 (>= 2.4.1), libselinux1 (>= 3.1~), libssl3 (>= 3.0.0), libzstd1 (>= 1.5.2)
Description: systemd shared private library
 This internal shared library provides common code used by various systemd
 components. It is supposed to decrease memory and disk footprint.
 The shared library is not meant for public use and is not API or ABI stable.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: libsystemd0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 908
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: systemd
Version: 252.38-1~deb12u1
Depends: libc6 (>= 2.34), libcap2 (>= 1:2.10), libgcrypt20 (>= 1.10.0), liblz4-1 (>= 0.0~r122), liblzma5 (>= 5.1.1alpha+20120614), libzstd1 (>= 1.5.2)
Description: systemd utility library
 This library provides APIs to interface with various system components such as
 the system journal, the system service manager, D-Bus and more.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: libtalloc2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 86
Maintainer: Debian Samba Maintainers <pkg-samba-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: talloc
Version: 2.4.0-f2
Depends: libc6 (>= 2.16)
Breaks: python3-talloc (<< 2.1.13-2~)
Description: hierarchical pool based memory allocator
 A hierarchical pool based memory allocator with destructors. It uses
 reference counting to determine when memory should be freed.
Homepage: https://talloc.samba.org/

Package: libtasn1-6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 116
Maintainer: Debian GnuTLS Maintainers <pkg-gnutls-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Version: 4.19.0-2+deb12u1
Depends: libc6 (>= 2.14)
Description: Manage ASN.1 structures (runtime)
 Manage ASN1 (Abstract Syntax Notation One) structures.
 The main features of this library are:
   * on-line ASN1 structure management that doesn't require any C code
     file generation.
   * off-line ASN1 structure management with C code file generation
     containing an array.
   * DER (Distinguish Encoding Rules) encoding
   * no limits for INTEGER and ENUMERATED values
 .
 This package contains runtime libraries.
Homepage: https://www.gnu.org/software/libtasn1/

Package: libtext-charwidth-perl
Status: install ok installed
Priority: required
Section: perl
Installed-Size: 41
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Version: 0.04-11
Depends: libc6 (>= 2.4), perl-base (>= 5.36.0-4), perlapi-5.36.0
Description: get display widths of characters on the terminal
 Text::CharWidth permits one to get the display widths of characters
 and strings on the terminal, using wcwidth() and wcswidth() from libc.
 .
 It provides mbwidth(), mbswidth(), and mblen().
Homepage: https://metacpan.org/release/Text-CharWidth

Package: libtext-iconv-perl
Status: install ok installed
Priority: required
Section: perl
Installed-Size: 49
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1.7-8
Depends: libc6 (>= 2.4), perl-base (>= 5.36.0-4), perlapi-5.36.0
Description: module to convert between character sets in Perl
 The iconv() family of functions from XPG4 defines an API for converting
 between character sets (e.g. UTF-8 to Latin1, EBCDIC to ASCII). They
 are provided by libc6.
 .
 This package allows access to them from Perl via the Text::Iconv
 package.
Homepage: https://metacpan.org/release/Text-Iconv

Package: libtext-wrapi18n-perl
Status: install ok installed
Priority: required
Section: perl
Installed-Size: 26
Maintainer: Debian Perl Group <pkg-perl-maintainers@lists.alioth.debian.org>
Architecture: all
Version: 0.06-10
Depends: libtext-charwidth-perl
Description: internationalized substitute of Text::Wrap
 The Text::WrapI18N module is a substitution for Text::Wrap, supporting
 multibyte characters such as UTF-8, EUC-JP, and GB2312, fullwidth characters
 such as east Asian characters, combining characters such as diacritical marks
 and Thai, and languages which don't use whitespaces between words such as
 Chinese and Japanese.
 .
 It provides wrap().
Homepage: https://metacpan.org/release/Text-WrapI18N

Package: libtiff6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 716
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: same
Source: tiff
Version: 4.5.0-6+deb12u2
Depends: libc6 (>= 2.33), libdeflate0 (>= 1.0), libjbig0 (>= 2.0), libjpeg62-turbo (>= 1.3.1), liblerc4 (>= 3.0), liblzma5 (>= 5.1.1alpha+20120614), libwebp7 (>= 1.2.4), libzstd1 (>= 1.5.2), zlib1g (>= 1:1.1.4)
Description: Tag Image File Format (TIFF) library
 libtiff is a library providing support for the Tag Image File Format
 (TIFF), a widely used format for storing image data.  This package
 includes the shared library.
Homepage: https://libtiff.gitlab.io/libtiff/

Package: libtinfo6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 541
Maintainer: Craig Small <csmall@debian.org>
Architecture: amd64
Multi-Arch: same
Source: ncurses
Version: 6.4-4
Depends: libc6 (>= 2.34)
Description: shared low-level terminfo library for terminal handling
 The ncurses library routines are a terminal-independent method of
 updating character screens with reasonable optimization.
 .
 This package contains the shared low-level terminfo library.
Homepage: https://invisible-island.net/ncurses/

Package: libtirpc-common
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 35
Maintainer: Josue Ortega <josue@debian.org>
Architecture: all
Multi-Arch: foreign
Source: libtirpc
Version: 1.3.3+ds-1
Replaces: libtirpc1, libtirpc3 (<< 1.1.4-0.1~)
Breaks: libtirpc1, libtirpc3 (<< 1.1.4-0.1~)
Conffiles:
 /etc/netconfig ca8db53e3af4d735335c2607d21c7195
Description: transport-independent RPC library - common files
 This package contains a port of Sun's transport-independent RPC library to
 Linux. The library is intended as a replacement for the RPC code in the GNU C
 library, providing among others support for RPC (and in turn, NFS) over IPv6.
 .
 This package contains the netconfig configuration file as well as the
 associated manpage.
Homepage: http://sourceforge.net/projects/libtirpc

Package: libtirpc-dev
Status: install ok installed
Priority: optional
Section: libdevel
Installed-Size: 717
Maintainer: Josue Ortega <josue@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libtirpc
Version: 1.3.3+ds-1
Depends: libtirpc3 (= 1.3.3+ds-1)
Description: transport-independent RPC library - development files
 This package contains a port of Sun's transport-independent RPC library to
 Linux. The library is intended as a replacement for the RPC code in the GNU C
 library, providing among others support for RPC (and in turn, NFS) over IPv6.
 .
 This package contains the files needed for development against libtirpc.
Homepage: http://sourceforge.net/projects/libtirpc

Package: libtirpc3
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 226
Maintainer: Josue Ortega <josue@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libtirpc
Version: 1.3.3+ds-1
Depends: libc6 (>= 2.34), libgssapi-krb5-2 (>= 1.17), libtirpc-common (>= 1.3.3+ds-1)
Breaks: nfs-common (<< 1:1.2.8-7), nfs-kernel-server (<< 1:1.2.8-7)
Description: transport-independent RPC library
 This package contains a port of Sun's transport-independent RPC library to
 Linux. The library is intended as a replacement for the RPC code in the GNU C
 library, providing among others support for RPC (and in turn, NFS) over IPv6.
Homepage: http://sourceforge.net/projects/libtirpc

Package: libtsan2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 7815
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34), libgcc-s1 (>= 3.3)
Description: ThreadSanitizer -- a Valgrind-based detector of data races (runtime)
 ThreadSanitizer (Tsan) is a data race detector for C/C++ programs.
 The Linux and Mac versions are based on Valgrind.
Homepage: http://gcc.gnu.org/

Package: libtsk19
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1118
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: sleuthkit (4.11.1+dfsg-1)
Version: 4.11.1+dfsg-1+b1
Replaces: libtsk10v5
Depends: libafflib0v5 (>= 3.7.6), libc6 (>= 2.34), libewf2 (>= 20130416), libgcc-s1 (>= 4.2), libsqlite3-0 (>= 3.5.9), libstdc++6 (>= 11), libvhdi1 (>= 20150110), libvmdk1 (>= 20150516), zlib1g (>= 1:1.1.4)
Conflicts: libtsk10v5
Description: library for forensics analysis on volume and filesystem data
 The Sleuth Kit, also known as TSK, is a collection of UNIX-based command
 line file and volume system forensic analysis tools. The filesystem tools
 allow you to examine filesystems of a suspect computer in a non-intrusive
 fashion. Because the tools do not rely on the operating system to process the
 filesystems, deleted and hidden content is shown.
 .
 The volume system (media management) tools allow you to examine the layout of
 disks and other media. You can also recover deleted files, get information
 stored in slack spaces, examine filesystems journal, see partitions layout on
 disks or images etc. But is very important clarify that the TSK acts over the
 current filesystem only.
 .
 The Sleuth Kit supports DOS partitions, BSD partitions (disk labels), Mac
 partitions, Sun slices (Volume Table of Contents), and GPT disks. With these
 tools, you can identify where partitions are located and extract them so that
 they can be analyzed with filesystem analysis tools.
 .
 Currently, TSK supports several filesystems, as NTFS, FAT, exFAT, HFS+, Ext3,
 Ext4, UFS and YAFFS2.
 .
 This package contains the library which can be used to implement all of the
 functionality of the command line tools into an application that needs to
 analyze data from a disk image.
Homepage: http://www.sleuthkit.org/sleuthkit

Package: libubsan1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 2652
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: gcc-12
Version: 12.2.0-14+deb12u1
Depends: gcc-12-base (= 12.2.0-14+deb12u1), libc6 (>= 2.34), libgcc-s1 (>= 3.3), libstdc++6 (>= 4.1.1)
Description: UBSan -- undefined behaviour sanitizer (runtime)
 UndefinedBehaviorSanitizer can be enabled via -fsanitize=undefined.
 Various computations will be instrumented to detect undefined behavior
 at runtime. Available for C and C++.
Homepage: http://gcc.gnu.org/

Package: libuchardet0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 208
Maintainer: James Cowgill <jcowgill@debian.org>
Architecture: amd64
Multi-Arch: same
Source: uchardet
Version: 0.0.7-1
Depends: libc6 (>= 2.4), libgcc-s1 (>= 3.0), libstdc++6 (>= 4.1.1)
Description: universal charset detection library - shared library
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 This package contains the shared library.
Homepage: https://www.freedesktop.org/wiki/Software/uchardet/

Package: libudev1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 239
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: systemd
Version: 252.38-1~deb12u1
Depends: libc6 (>= 2.34)
Description: libudev shared library
 This library provides APIs to introspect and enumerate devices on the local
 system.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: libunistring2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1807
Maintainer: Jörg Frings-Fürst <debian@jff.email>
Architecture: amd64
Multi-Arch: same
Source: libunistring
Version: 1.0-2
Depends: libc6 (>= 2.34)
Description: Unicode string library for C
 The 'libunistring' library implements Unicode strings (in the UTF-8,
 UTF-16, and UTF-32 encodings), together with functions for Unicode
 characters (character names, classifications, properties) and
 functions for string processing (formatted output, width, word
 breaks, line breaks, normalization, case folding, regular
 expressions).
 .
 This package contains the shared library.
Homepage: https://www.gnu.org/software/libunistring/

Package: libusb-1.0-0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 155
Maintainer: Aurelien Jarno <aurel32@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libusb-1.0
Version: 2:1.0.26-1
Depends: libc6 (>= 2.17), libudev1 (>= 183)
Description: userspace USB programming library
 Library for programming USB applications without the knowledge
 of Linux kernel internals.
 .
 This package contains what you need to run programs that use this
 library.
Homepage: http://www.libusb.info

Package: libutempter0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 50
Maintainer: Christian Göttsche <cgzones@googlemail.com>
Architecture: amd64
Multi-Arch: same
Source: libutempter
Version: 1.2.1-3
Depends: libc6 (>= 2.34)
Description: privileged helper for utmp/wtmp updates (runtime)
 The libutempter library provides interface for terminal emulators such as
 screen and xterm to record user sessions to utmp and wtmp files.
 .
 The utempter is a privileged helper used by libutempter library to manipulate
 utmp and wtmp files.
Homepage: https://git.altlinux.org/people/ldv/packages/?p=libutempter.git

Package: libuuid1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 79
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: same
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: libc6 (>= 2.25)
Recommends: uuid-runtime
Description: Universally Unique ID library
 The libuuid library generates and parses 128-bit Universally Unique
 IDs (UUIDs). A UUID is an identifier that is unique within the space
 of all such identifiers across both space and time. It can be used for
 multiple purposes, from tagging objects with an extremely short lifetime
 to reliably identifying very persistent objects across a network.
 .
 See RFC 4122 for more information.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: libuv1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 294
Maintainer: Dominique Dumont <dod@debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1.44.2-1+deb12u1
Depends: libc6 (>= 2.34)
Description: asynchronous event notification library - runtime library
 Libuv is the asynchronous library behind Node.js. Very similar to libevent or
 libev, it provides the main elements for event driven systems: watching and
 waiting for availability in a set of sockets, and some other events like timers
 or asynchronous messages. However, libuv also comes with some other extras
 like:
  * files watchers and asynchronous operations
  * a portable TCP and UDP API, as well as asynchronous DNS resolution
  * processes and threads management, and a portable inter-process
    communications mechanism, with pipes and work queues
  * a plugins mechanism for loading libraries dynamically
  * interface with external libraries that also need to access the I/O.
 .
 This package includes the dynamic library against which you can link
 your program.
Homepage: https://github.com/libuv/libuv

Package: libvhdi-utils
Status: install ok installed
Priority: optional
Section: otherosfs
Installed-Size: 149
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: libvhdi (20210425-1)
Version: 20210425-1+b2
Depends: libc6 (>= 2.34), libfuse2 (>= 2.6), libvhdi1 (>= 20201018)
Description: Virtual Hard Disk image format access library -- Utilities
 libvhdi is a library to access the Virtual Hard Disk (VHD) image format.
 .
 This package contains tools to access data stored in VHD files:
 vhdiinfo, vhdimount.
Homepage: https://github.com/libyal/libvhdi

Package: libvhdi1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1182
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libvhdi (20210425-1)
Version: 20210425-1+b2
Depends: libc6 (>= 2.34)
Description: Virtual Hard Disk image format access library
 libvhdi is a library to access the Virtual Hard Disk (VHD) image format.
 .
 This package contains the shared library.
Homepage: https://github.com/libyal/libvhdi

Package: libvmdk1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1278
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libvmdk (20200926-2)
Version: 20200926-2+b2
Depends: libbfio1 (>= 20120425), libc6 (>= 2.34), zlib1g (>= 1:1.1.4)
Description: VMWare Virtual Disk format access library
 libvmdk is a library to access the VMware Virtual Disk (VMDK) format.
 .
 This package contains the shared library.
Homepage: https://github.com/libyal/libvmdk

Package: libwbclient0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 132
Maintainer: Debian Samba Maintainers <pkg-samba-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: samba
Version: 2:4.17.12+dfsg-0+deb12u2
Depends: libbsd0 (>= 0.0), libc6 (>= 2.34)
Breaks: samba-libs (<< 2:4.11.0+dfsg-1~)
Description: Samba winbind client library
 Samba is an implementation of the SMB/CIFS protocol for Unix systems,
 providing support for cross-platform file and printer sharing with
 Microsoft Windows, OS X, and other Unix systems.
 .
 This package provides a library for client applications that interact
 via the winbind pipe protocol with a Samba winbind server.
Homepage: https://www.samba.org

Package: libwebp7
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 544
Maintainer: Jeff Breidenbach <jab@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libwebp
Version: 1.2.4-0.2+deb12u1
Depends: libc6 (>= 2.34)
Description: Lossy compression of digital photographic images
 Image Compression format, based on the VP8 codec.
 WebP uses the modern VP8 compression format to deliver efficient
 compression of images for the web. More than 30% extra gain over
 optimized JPEG, for same quality, is not unusual.
Homepage: https://developers.google.com/speed/webp/

Package: libwrap0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 110
Maintainer: Marco d'Itri <md@linux.it>
Architecture: amd64
Multi-Arch: same
Source: tcp-wrappers
Version: 7.6.q-32
Depends: libc6 (>= 2.33), libnsl2 (>= 1.0)
Description: Wietse Venema's TCP wrappers library
 Wietse Venema's network logger, also known as TCPD or LOG_TCP.
 .
 These programs log the client host name of incoming telnet,
 ftp, rsh, rlogin, finger etc. requests.
 .
 Security options are:
  - access control per host, domain and/or service;
  - detection of host name spoofing or host address spoofing;
  - booby traps to implement an early-warning system.

Package: libx11-6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1562
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libx11
Version: 2:1.8.4-2+deb12u2
Depends: libc6 (>= 2.34), libxcb1 (>= 1.11.1), libx11-data
Breaks: libx11-xcb1 (<< 2:1.7.0-2)
Description: X11 client-side library
 This package provides a client interface to the X Window System, otherwise
 known as 'Xlib'.  It provides a complete API for the basic functions of the
 window system.
 .
 More information about X.Org can be found at:
 <URL:https://www.X.org>
 .
 This module can be found at
 https://gitlab.freedesktop.org/xorg/lib/libX11

Package: libx11-data
Status: install ok installed
Priority: optional
Section: x11
Installed-Size: 1577
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: libx11
Version: 2:1.8.4-2+deb12u2
Description: X11 client-side library
 This package provides the locale data files for libx11.
 .
 More information about X.Org can be found at:
 <URL:https://www.X.org>
 .
 This module can be found at
 https://gitlab.freedesktop.org/xorg/lib/libX11

Package: libx265-199
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 16203
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: x265 (3.5-2)
Version: 3.5-2+b1
Depends: libc6 (>= 2.34), libnuma1 (>= 2.0.11), libstdc++6 (>= 4.1.1)
Description: H.265/HEVC video stream encoder (shared library)
 libx265 is an encoding library for creating H.265/High Efficiency Video Coding
 (HEVC) video streams.
 .
 This package contains the shared library.
Homepage: http://x265.org

Package: libxau6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 42
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxau
Version: 1:1.0.9-1
Depends: libc6 (>= 2.4)
Description: X11 authorisation library
 This package provides the main interface to the X11 authorisation handling,
 which controls authorisation for X connections, both client-side and
 server-side.
 .
 More information about X.Org can be found at:
 <URL:https://www.X.org>
 .
 This module can be found at
 https://gitlab.freedesktop.org/xorg/lib/libxau

Package: libxcb1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 296
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxcb
Version: 1.15-1
Depends: libc6 (>= 2.14), libxau6 (>= 1:1.0.9), libxdmcp6
Breaks: alsa-utils (<< 1.0.24.2-5)
Description: X C Binding
 This package contains the library files needed to run software using libxcb,
 the X C Binding.
 .
 The XCB library provides an interface to the X Window System protocol,
 designed to replace the Xlib interface.  XCB provides several advantages over
 Xlib:
 .
  * Size: small library and lower memory footprint
  * Latency hiding: batch several requests and wait for the replies later
  * Direct protocol access: one-to-one mapping between interface and protocol
  * Thread support: access XCB from multiple threads, with no explicit locking
  * Easy creation of new extensions: automatically generates interface from
    machine-parsable protocol descriptions
Homepage: https://xcb.freedesktop.org

Package: libxdmcp6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 53
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxdmcp
Version: 1:1.1.2-3
Depends: libbsd0 (>= 0.2.0), libc6 (>= 2.4)
Description: X11 Display Manager Control Protocol library
 This package provides the main interface to the X11 display manager control
 protocol library, which allows for remote logins to display managers.
 .
 More information about X.Org can be found at:
 <URL:http://www.X.org>
 .
 This module can be found at
 git://anongit.freedesktop.org/git/xorg/lib/libXdmcp

Package: libxenstore4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 103
Maintainer: Debian Xen Team <pkg-xen-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: xen
Version: 4.17.5+23-ga4e5191dc0-1+deb12u1
Depends: libc6 (>= 2.34), libxentoolcore1 (>= 4.17.5+23-ga4e5191dc0)
Description: Xen runtime libraries - libxenstore
 Shared library for Xen utilities.
Homepage: https://xenproject.org/

Package: libxentoolcore1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 81
Maintainer: Debian Xen Team <pkg-xen-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: xen
Version: 4.17.5+23-ga4e5191dc0-1+deb12u1
Depends: libc6 (>= 2.2.5)
Description: Xen runtime libraries - libxentoolcore
 Shared library for Xen utilities.
Homepage: https://xenproject.org/

Package: libxext6
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 132
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxext (2:1.3.4-1)
Version: 2:1.3.4-1+b1
Depends: libc6 (>= 2.14), libx11-6 (>= 2:1.6.0)
Description: X11 miscellaneous extension library
 libXext provides an X Window System client interface to several extensions to
 the X protocol.
 .
 The supported protocol extensions are:
  - DOUBLE-BUFFER (DBE), the Double Buffer extension;
  - DPMS, the VESA Display Power Management System extension;
  - Extended-Visual-Information (EVI), an extension for gathering extra
    information about the X server's visuals;
  - LBX, the Low Bandwidth X extension;
  - MIT-SHM, the MIT X client/server shared memory extension;
  - MIT-SUNDRY-NONSTANDARD, a miscellaneous extension by MIT;
  - Multi-Buffering, the multi-buffering and stereo display extension;
  - SECURITY, the X security extension;
  - SHAPE, the non-rectangular shaped window extension;
  - SYNC, the X synchronization extension;
  - TOG-CUP, the Open Group's Colormap Utilization extension;
  - XC-APPGROUP, the X Consortium's Application Group extension;
  - XC-MISC, the X Consortium's resource ID querying extension;
  - XTEST, the X test extension (this is one of two client-side
    implementations; the other is in the libXtst library, provided by the
    libxtst6 package);
 .
 libXext also provides a small set of utility functions to aid authors of
 client APIs for X protocol extensions.
 .
 More information about X.Org can be found at:
 <URL:http://www.X.org>
 .
 This module can be found at
 git://anongit.freedesktop.org/git/xorg/lib/libXext

Package: libxml2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 1866
Maintainer: Debian XML/SGML Group <debian-xml-sgml-pkgs@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Version: 2.9.14+dfsg-1.3~deb12u2
Depends: libc6 (>= 2.34), libicu72 (>= 72.1~rc-1~), liblzma5 (>= 5.1.1alpha+20120614), zlib1g (>= 1:1.2.3.3)
Conflicts: w3c-dtd-xhtml
Description: GNOME XML library
 XML is a metalanguage to let you design your own markup language.
 A regular markup language defines a way to describe information in
 a certain class of documents (eg HTML). XML lets you define your
 own customized markup languages for many classes of document. It
 can do this because it's written in SGML, the international standard
 metalanguage for markup languages.
 .
 This package provides a library providing an extensive API to handle
 such XML data files.
Homepage: http://xmlsoft.org

Package: libxmuu1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 54
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxmu
Version: 2:1.1.3-3
Depends: libc6 (>= 2.4), libx11-6
Description: X11 miscellaneous micro-utility library
 libXmuu provides a set of miscellaneous utility convenience functions for X
 libraries to use.  It is a lighter version of libXmu that does not depend
 on libXt or libXext; for more information on libXmu, see libxmu6.
 .
 More information about X.Org can be found at:
 <URL:http://www.X.org>
 .
 This module can be found at
 git://anongit.freedesktop.org/git/xorg/lib/libXmu

Package: libxpm4
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 111
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libxpm
Version: 1:3.5.12-1.1+deb12u1
Depends: libc6 (>= 2.34), libx11-6
Description: X11 pixmap library
 The X PixMap image format is an extension of the monochrome X BitMap
 format specified in the X protocol, and is commonly used in traditional
 X applications.
 .
 This package provides runtime support for XPM format.
Homepage: https://www.x.org

Package: libxtables12
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 101
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: same
Source: iptables
Version: 1.8.9-2
Replaces: libxtables11 (>= 1.6.0+snapshot20161117-1)
Depends: libc6 (>= 2.34)
Breaks: libxtables11 (>= 1.6.0+snapshot20161117-1)
Description: netfilter xtables library
 The iptables/xtables framework has been replaced by nftables. You should
 consider migrating now.
 .
 However, even if a given system may be fully running on native nftables,
 there are other reasons why libxtables might be installed. For one, nftables
 itself uses it to be able to display old rulesets that were created using
 xtables extensions (to help folks migrate). Other third-party software might
 also be linked to this library.
 .
 This library being installed in the system should be harmless in any case.
 .
 This package contains the user-space interface to the Netfilter xtables
 kernel framework.
Homepage: https://www.netfilter.org/

Package: libxxhash0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 99
Maintainer: Josue Ortega <josue@debian.org>
Architecture: amd64
Multi-Arch: same
Source: xxhash
Version: 0.8.1-1
Depends: libc6 (>= 2.14)
Description: shared library for xxhash
 xxHash is an Extremely fast Hash algorithm, running at RAM speed limits.
 It successfully completes the SMHasher test suite which evaluates collision,
 dispersion and randomness qualities of hash functions. Code is highly portable,
 and hashes are identical on all platforms (little / big endian).
 .
 This package contains the shared library.
Homepage: https://cyan4973.github.io/xxHash

Package: libyaml-0-2
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 152
Maintainer: Florian Ernst <florian@debian.org>
Architecture: amd64
Multi-Arch: same
Source: libyaml
Version: 0.2.5-1
Depends: libc6 (>= 2.14)
Description: Fast YAML 1.1 parser and emitter library
 LibYAML is a C library for parsing and emitting data in YAML 1.1, a
 human-readable data serialization format.
Homepage: https://github.com/yaml/libyaml

Package: libyuv0
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 671
Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libyuv
Version: 0.0~git20230123.b2528b0-1
Replaces: libyuv
Provides: libyuv
Depends: libc6 (>= 2.14), libgcc-s1 (>= 3.0), libjpeg62-turbo (>= 1.3.1), libstdc++6 (>= 5)
Conflicts: libyuv
Description: Library for YUV scaling (shared library)
 libyuv is an open source project that includes YUV scaling and
 conversion functionality.
 .
 This package provides the shared library.
Homepage: https://chromium.googlesource.com/libyuv/libyuv/

Package: libzstd1
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 785
Maintainer: RPM packaging team <team+pkg-rpm@tracker.debian.org>
Architecture: amd64
Multi-Arch: same
Source: libzstd
Version: 1.5.4+dfsg2-5
Depends: libc6 (>= 2.34)
Description: fast lossless compression algorithm
 Zstd, short for Zstandard, is a fast lossless compression algorithm, targeting
 real-time compression scenarios at zlib-level compression ratio.
 .
 This package contains the shared library.
Homepage: https://github.com/facebook/zstd

Package: linux-base
Status: install ok installed
Priority: optional
Section: kernel
Installed-Size: 77
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 4.9
Replaces: kernel-common (<= 13.018+nmu1)
Depends: debconf (>= 0.5) | debconf-2.0
Breaks: kernel-common (<= 13.018+nmu1), linux-perf (<< 5.16.2-1~exp1)
Description: Linux image base package
 This package contains files and support scripts for all Linux
 images.

Package: linux-image-6.1.0-35-amd64
Status: install ok installed
Priority: optional
Section: kernel
Installed-Size: 399277
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Source: linux-signed-amd64 (6.1.137+1)
Version: 6.1.137-1
Replaces: linux-image-6.1.0-35-amd64-unsigned
Depends: kmod, linux-base (>= 4.3~), initramfs-tools (>= 0.120+deb8u2) | linux-initramfs-tool
Recommends: firmware-linux-free, apparmor
Suggests: linux-doc-6.1, debian-kernel-handbook, grub-pc | grub-efi-amd64 | extlinux
Breaks: fwupdate (<< 12-7), initramfs-tools (<< 0.120+deb8u2), wireless-regdb (<< 2019.06.03-1~)
Conflicts: linux-image-6.1.0-35-amd64-unsigned
Description: Linux 6.1 for 64-bit PCs (signed)
 The Linux kernel 6.1 and modules for use on PCs with AMD64, Intel 64 or
 VIA Nano processors.
 .
 The kernel image and modules are signed for use with Secure Boot.
Built-Using: linux (= 6.1.137-1)
Homepage: https://www.kernel.org/

Package: linux-image-6.1.0-37-amd64
Status: install ok installed
Priority: optional
Section: kernel
Installed-Size: 399275
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Source: linux-signed-amd64 (6.1.140+1)
Version: 6.1.140-1
Replaces: linux-image-6.1.0-37-amd64-unsigned
Depends: kmod, linux-base (>= 4.3~), initramfs-tools (>= 0.120+deb8u2) | linux-initramfs-tool
Recommends: firmware-linux-free, apparmor
Suggests: linux-doc-6.1, debian-kernel-handbook, grub-pc | grub-efi-amd64 | extlinux
Breaks: fwupdate (<< 12-7), initramfs-tools (<< 0.120+deb8u2), wireless-regdb (<< 2019.06.03-1~)
Conflicts: linux-image-6.1.0-37-amd64-unsigned
Description: Linux 6.1 for 64-bit PCs (signed)
 The Linux kernel 6.1 and modules for use on PCs with AMD64, Intel 64 or
 VIA Nano processors.
 .
 The kernel image and modules are signed for use with Secure Boot.
Built-Using: linux (= 6.1.140-1)
Homepage: https://www.kernel.org/

Package: linux-image-amd64
Status: install ok installed
Priority: optional
Section: kernel
Installed-Size: 13
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Source: linux-signed-amd64 (6.1.140+1)
Version: 6.1.140-1
Provides: linux-image-generic, linux-latest-modules-6.1.0-37-amd64, virtualbox-guest-modules, wireguard-modules (= 1.0.0)
Depends: linux-image-6.1.0-37-amd64 (= 6.1.140-1)
Description: Linux for 64-bit PCs (meta-package)
 This package depends on the latest Linux kernel and modules for use on PCs
 with AMD64, Intel 64 or VIA Nano processors.
Built-Using: linux (= 6.1.140-1)
Homepage: https://www.kernel.org/

Package: linux-libc-dev
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 6880
Maintainer: Debian Kernel Team <debian-kernel@lists.debian.org>
Architecture: amd64
Multi-Arch: same
Source: linux
Version: 6.1.140-1
Description: Linux support headers for userspace development
 This package provides userspaces headers from the Linux kernel.  These
 headers are used by the installed headers for GNU libc and other system
 libraries.
Homepage: https://www.kernel.org/

Package: locales
Status: install ok installed
Priority: standard
Section: localization
Installed-Size: 15846
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: all
Source: glibc
Version: 2.36-9+deb12u10
Depends: libc-bin (>> 2.36), libc-l10n (>> 2.36), debconf (>= 0.5) | debconf-2.0
Conffiles:
 /etc/locale.alias 4a3f5ef911616822ec6fe04e31930bbf
Description: GNU C Library: National Language (locale) data [support]
 Machine-readable data files, shared objects and programs used by the
 C library for localization (l10n) and internationalization (i18n) support.
 .
 This package contains tools to generate locale definitions from source
 files (included in this package). It allows you to customize which
 definitions actually get generated. This is a space-saver over how this
 package used to be, with all locales generated by default. This created
 a package that unpacked to an excess of 30 megs.
Homepage: https://www.gnu.org/software/libc/libc.html

Package: login
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 2550
Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: shadow
Version: 1:4.13+dfsg1-1+deb12u1
Pre-Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libpam0g (>= 0.99.7.1), libpam-runtime, libpam-modules
Conflicts: python-4suite (<< 0.99cvs20060405-1)
Conffiles:
 /etc/login.defs f43a7b1eb7e082f1d4e2cb8f8376e71b
 /etc/pam.d/login 5afbc06eb5f71fef25170cf3c936a442
Description: system login tools
 This package provides some required infrastructure for logins and for
 changing effective user or group IDs, including:
  * login, the program that invokes a user shell on a virtual terminal;
  * nologin, a dummy shell for disabled user accounts;
Homepage: https://github.com/shadow-maint/shadow

Package: logrotate
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 160
Maintainer: Christian Göttsche <cgzones@googlemail.com>
Architecture: amd64
Multi-Arch: foreign
Version: 3.21.0-1
Depends: cron | anacron | cron-daemon | systemd-sysv, libacl1 (>= 2.2.23), libc6 (>= 2.34), libpopt0 (>= 1.14), libselinux1 (>= 3.1~)
Suggests: bsd-mailx | mailx
Conffiles:
 /etc/cron.daily/logrotate 31da718265eaaa2fdabcfb2743bda171
 /etc/logrotate.conf bb61e48721fc3fb8e58002bce2f9a571
 /etc/logrotate.d/btmp 55631862595faf6432786dc335eb3f44
 /etc/logrotate.d/wtmp 46cd7ecb1810441bd450987a976f5540
Description: Log rotation utility
 The logrotate utility is designed to simplify the administration of
 log files on a system which generates a lot of log files.  Logrotate
 allows for the automatic rotation compression, removal and mailing of
 log files.  Logrotate can be set to handle a log file daily, weekly,
 monthly or when the log file gets to a certain size.  Normally, logrotate
 runs as a daily cron job.
Homepage: https://github.com/logrotate/logrotate

Package: logsave
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 49
Maintainer: Theodore Y. Ts'o <tytso@mit.edu>
Architecture: amd64
Multi-Arch: foreign
Source: e2fsprogs
Version: 1.47.0-2
Replaces: e2fsprogs (<< 1.45.3-1)
Depends: libc6 (>= 2.34)
Breaks: e2fsprogs (<< 1.45.3-1)
Description: save the output of a command in a log file
 The logsave program will execute cmd_prog with the specified
 argument(s), and save a copy of its output to logfile.  If the
 containing directory for logfile does not exist, logsave will
 accumulate the output in memory until it can be written out.  A copy
 of the output will also be written to standard output.
Homepage: http://e2fsprogs.sourceforge.net

Package: lsb-release
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 17
Maintainer: Gioele Barabucci <gioele@svario.it>
Architecture: all
Multi-Arch: foreign
Source: lsb-release-minimal
Version: 12.0-1
Description: Linux Standard Base version reporting utility (minimal implementation)
 The Linux Standard Base (http://www.linuxbase.org/) is a standard
 core system that third-party applications written for Linux can
 depend upon.
 .
 The lsb-release command is a simple tool to help identify the Linux
 distribution being used and its compliance with the Linux Standard Base.
 .
 This package contains a bare-bones implementation that uses the
 information in /etc/os-release instead of relying on LSB packages.
Homepage: https://gioele.io/lsb-release-minimal

Package: lsof
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 482
Maintainer: Andres Salomon <dilinger@debian.org>
Architecture: amd64
Version: 4.95.0-1
Depends: libc6 (>= 2.33), libselinux1 (>= 3.1~), libtirpc3 (>= 1.0.2)
Description: utility to list open files
 Lsof is a Unix-specific diagnostic tool.  Its name stands
 for LiSt Open Files, and it does just that.  It lists
 information about any files that are open, by processes
 currently running on the system.
Homepage: https://github.com/lsof-org/lsof

Package: lua-lpeg
Status: install ok installed
Priority: optional
Section: interpreters
Installed-Size: 252
Maintainer: Enrico Tassi <gareuselesinge@debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1.0.2-2
Provides: lua5.1-lpeg, lua5.2-lpeg, lua5.3-lpeg, lua5.4-lpeg
Depends: libc6 (>= 2.14)
Description: LPeg library for the Lua language
 LPeg is a new pattern-matching library for Lua, based on Parsing Expression
 Grammars (PEGs). PEGs look similar to regular expressions or context-free
 grammars in Backus-Naur form (BNF) notation. PEGs make a good replacement for
 regular expressions, because they are strictly more powerful. For example, a
 regular expression inherently cannot find matched pairs of parentheses, because
 it is not recursive, but a PEG can.
Homepage: http://www.inf.puc-rio.br/~roberto/lpeg.html
Lua-Versions: 5.1 5.2 5.3 5.4

Package: lvm2
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 4009
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.03.16-2
Depends: libaio1 (>= 0.3.93), libblkid1 (>= 2.24.2), libc6 (>= 2.34), libdevmapper-event1.02.1 (>= 2:1.02.74), libedit2 (>= 2.11-20080614-0), libselinux1 (>= 3.1~), libsystemd0 (>= 233), libudev1 (>= 183), lsb-base, dmsetup (>= 2:1.02.185-2~), dmeventd (>= 2:1.02.185-2~)
Recommends: thin-provisioning-tools
Conffiles:
 /etc/lvm/lvm.conf daa2538ce1abd1d6c249c8b53d951de2
 /etc/lvm/lvmlocal.conf a149b0ec175b15065a7ae82c849e77c9
 /etc/lvm/profile/cache-mq.profile 9df1883c03bac9d3041e75745cb5e0ec
 /etc/lvm/profile/cache-smq.profile d27b7f0947c6ac21944c05e6098b9850
 /etc/lvm/profile/command_profile_template.profile 3bab119bec857c31a53725da2d0a9408
 /etc/lvm/profile/lvmdbusd.profile ffa904d375ce53ebb6befe7d65cf391a
 /etc/lvm/profile/metadata_profile_template.profile bccbaf503cb8f0adb5b4f841f7c1f735
 /etc/lvm/profile/thin-generic.profile f57ede2b5b249024766c51a223e15ed5
 /etc/lvm/profile/thin-performance.profile f4de81439550553043e04f019a48a827
 /etc/lvm/profile/vdo-small.profile da26d10e71e517a6f02ff0d53395e3c9
Description: Linux Logical Volume Manager
 This is LVM2, the rewrite of The Linux Logical Volume Manager.  LVM
 supports enterprise level volume management of disk and disk subsystems
 by grouping arbitrary disks into volume groups. The total capacity of
 volume groups can be allocated to logical volumes, which are accessed as
 regular block devices.
Homepage: https://sourceware.org/lvm2/

Package: mailcap
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 86
Maintainer: Mime-Support Packagers <team+debian-mimesupport-packagers@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 3.70+nmu1
Replaces: mime-support (<< 3.65)
Provides: run-mailcap
Depends: perl, media-types
Recommends: bzip2, file, xz-utils
Breaks: mime-support (<< 3.65)
Conffiles:
 /etc/mailcap.order ba07e08a7fe3741d0b8339127963190e
Description: Debian's mailcap system, and support programs
 The mailcap system associates media types with programs that can handle them,
 using system and user configuration files.  A file's media type is determined
 by its extension or by running the "file" command if available.
 .
 Other packages register their programs as viewers/editors/composers/etc by
 placing mailcap entry files or FreeDesktop menu entries in predetermined
 directories monitored by this package's dpkg triggers.
 .
 This package provides a "run-mailcap" program to open arbitrary files, and in
 addition the "see", "edit", "compose", and "print" aliases to display, alter,
 create, and print (respectively).
 .
 This package also provides the "debian-view" utility to handle Debian packages
 interactively.

Package: make
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 1592
Maintainer: Manoj Srivastava <srivasta@debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: make-dfsg
Version: 4.3-4.1
Replaces: make-guile
Depends: libc6 (>= 2.27)
Suggests: make-doc
Conflicts: make-guile
Description: utility for directing compilation
 GNU Make is a utility which controls the generation of executables
 and other target files of a program from the program's source
 files. It determines automatically which pieces of a large program
 need to be (re)created, and issues the commands to (re)create
 them. Make can be used to organize any task in which targets (files)
 are to be automatically updated based on input files whenever the
 corresponding input is newer --- it is not limited to building
 computer programs. Indeed, Make is a general purpose dependency
 solver.
Homepage: https://www.gnu.org/software/make/

Package: man-db
Status: install ok installed
Priority: important
Section: doc
Installed-Size: 2963
Maintainer: Colin Watson <cjwatson@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.11.2-2
Replaces: man, nlsutils
Provides: man, man-browser
Depends: bsdextrautils | bsdmainutils (<< 12.1.1~), groff-base, debconf (>= 0.5) | debconf-2.0, libc6 (>= 2.34), libgdbm6 (>= 1.16), libpipeline1 (>= 1.5.0), libseccomp2 (>= 2.1.0), zlib1g (>= 1:1.1.4)
Suggests: apparmor, groff, less, www-browser
Conflicts: man
Conffiles:
 /etc/apparmor.d/usr.bin.man 4f614d75041882370498f7fe2d43a44b
 /etc/cron.daily/man-db 62423d7fa68568c9c0aefceac182d9ea
 /etc/cron.weekly/man-db eebc5bb3e1dac973301570da3f453334
 /etc/manpath.config 6d70333de0a08c7a71018da458201eb6
Description: tools for reading manual pages
 This package provides the man command, the primary way of examining the
 system help files (manual pages). Other utilities provided include the
 whatis and apropos commands for searching the manual page database, the
 manpath utility for determining the manual page search path, and the
 maintenance utilities mandb, catman and zsoelim. man-db uses the groff
 suite of programs to format and display the manual pages.
Homepage: https://man-db.gitlab.io/man-db/

Package: manpages
Status: install ok installed
Priority: standard
Section: doc
Installed-Size: 1548
Maintainer: Dr. Tobias Quathamer <toddy@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 6.03-2
Replaces: initscripts (<< 3.0.0-1), inn2-dev (<< 2.6.5-1), manpages-dev (<< 5.09-2)
Suggests: man-browser
Breaks: initscripts (<< 3.0.0-1), inn2-dev (<< 2.6.5-1), manpages-dev (<< 5.09-2)
Description: Manual pages about using a GNU/Linux system
 This package contains GNU/Linux manual pages for these sections:
  4 = Devices (e.g. hd, sd).
  5 = File formats and protocols, syntaxes of several system
      files (e.g. wtmp, /etc/passwd, nfs).
  7 = Conventions and standards, macro packages, etc.
      (e.g. nroff, ascii).
 .
 Beside the intro man page describing the section, a few manual
 pages from sections 1,6 and 8 are also provided.
 .
 The man pages describe syntaxes of several system files.
Homepage: https://www.kernel.org/doc/man-pages/

Package: manpages-dev
Status: install ok installed
Priority: optional
Section: doc
Installed-Size: 3732
Maintainer: Dr. Tobias Quathamer <toddy@debian.org>
Architecture: all
Multi-Arch: foreign
Source: manpages
Version: 6.03-2
Replaces: inn2-dev (<< 2.7.0-1)
Depends: manpages
Suggests: man-browser
Breaks: inn2-dev (<< 2.7.0-1), manpages (<< 6.01-1)
Description: Manual pages about using GNU/Linux for development
 These man pages describe the Linux programming interface, including
 these two sections:
  2 = Linux system calls.
  3 = Library calls (note that a more comprehensive source of information
      may be found in the glibc-doc and glibc-doc-reference packages).
Homepage: https://www.kernel.org/doc/man-pages/

Package: mawk
Status: install ok installed
Priority: required
Section: interpreters
Installed-Size: 263
Maintainer: Boyuan Yang <byang@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.3.4.20200120-3.1
Provides: awk
Depends: libc6 (>= 2.29)
Description: Pattern scanning and text processing language
 Mawk is an interpreter for the AWK Programming Language. The AWK
 language is useful for manipulation of data files, text retrieval and
 processing, and for prototyping and experimenting with algorithms. Mawk
 is a new awk meaning it implements the AWK language as defined in Aho,
 Kernighan and Weinberger, The AWK Programming Language, Addison-Wesley
 Publishing, 1988. (Hereafter referred to as the AWK book.) Mawk conforms
 to the POSIX 1003.2 (draft 11.3) definition of the AWK language
 which contains a few features not described in the AWK book, and mawk
 provides a small number of extensions.
 .
 Mawk is smaller and much faster than gawk. It has some compile-time
 limits such as NF = 32767 and sprintf buffer = 1020.
Homepage: https://invisible-island.net/mawk/

Package: media-types
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 92
Maintainer: Mime-Support Packagers <team+debian-mimesupport-packagers@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 10.0.0
Replaces: mime-support (<< 3.65)
Breaks: mime-support (<< 3.65)
Conffiles:
 /etc/mime.types e8937e06f21a0edb49813f91567be8e6
Description: List of standard media types and their usual file extension
 This package installs the configuration file /etc/mime.types, that lists
 standard media types (originally known as "MIME" types) and their usual file
 extension.  This provides a simple way for programs to have a first guess at a
 file's content.  On standard Debian desktop systems, one will also find more
 sophisticated tools, for instance provided by the "file" and "xdg-utils"
 packages.
 .
 The /etc/mime.types file is compiled by hand using mostly information provided
 by the Internet Assigned Numbers Authority (IANA).

Package: mime-support
Status: install ok installed
Priority: optional
Section: oldlibs
Installed-Size: 17
Maintainer: Mime-Support Packagers <team+debian-mimesupport-packagers@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 3.66
Depends: mailcap, media-types
Description: transitional package
 This is a transitional package. It will be possible to remove it
 safely once its dependency chain has adjusted to depend on mailcap
 or media-types directly.

Package: mount
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 393
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Pre-Depends: libblkid1 (>= 2.17.2), libc6 (>= 2.34), libmount1 (>= 2.38), libselinux1 (>= 3.1~), libsmartcols1 (>= 2.33)
Suggests: nfs-common
Description: tools for mounting and manipulating filesystems
 This package provides the mount(8), umount(8), swapon(8),
 swapoff(8), and losetup(8) commands.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: nano
Status: install ok installed
Priority: important
Section: editors
Installed-Size: 2804
Maintainer: Jordi Mallach <jordi@debian.org>
Architecture: amd64
Version: 7.2-1+deb12u1
Replaces: nano-tiny (<< 2.8.6-2), pico
Depends: libc6 (>= 2.34), libncursesw6 (>= 6), libtinfo6 (>= 6)
Suggests: hunspell
Breaks: nano-tiny (<< 2.8.6-2)
Conflicts: pico
Conffiles:
 /etc/nanorc be076483dde4364946fcf3d1ea5dce26
Description: small, friendly text editor inspired by Pico
 GNU nano is an easy-to-use text editor originally designed as a replacement
 for Pico, the ncurses-based editor from the non-free mailer package Pine
 (itself now available under the Apache License as Alpine).
 .
 However, GNU nano also implements many features missing in Pico, including:
  - undo/redo
  - line numbering
  - syntax coloring
  - soft-wrapping of overlong lines
  - selecting text by holding Shift
  - interactive search and replace (with regular expression support)
  - a go-to line (and column) command
  - support for multiple file buffers
  - auto-indentation
  - tab completion of filenames and search terms
  - toggling features while running
  - and full internationalization support
Homepage: https://www.nano-editor.org/

Package: ncurses-base
Essential: yes
Status: install ok installed
Priority: required
Section: misc
Installed-Size: 379
Maintainer: Craig Small <csmall@debian.org>
Architecture: all
Multi-Arch: foreign
Source: ncurses
Version: 6.4-4
Provides: ncurses-runtime
Breaks: bash-static (<< 4.4.18-1.1), libmono-corlib4.5-cil (<< 4.6.2.7+dfsg-2), libslang2 (<< 2.3.1a-3), libtinfo5 (<< 6.1), libunibilium0 (<< 2), libunibilium4 (<< 2.0.0-3), neovim (<< 0.6.0), vim-common (<< 2:9.0.1000-2), zsh-static (<< 5.4.2-4)
Conffiles:
 /etc/terminfo/README 45b6df19fb5e21f55717482fa7a30171
Description: basic terminal type definitions
 The ncurses library routines are a terminal-independent method of
 updating character screens with reasonable optimization.
 .
 This package contains terminfo data files to support the most common types of
 terminal, including ansi, dumb, linux, rxvt, screen, sun, vt100, vt102, vt220,
 vt52, and xterm.
Homepage: https://invisible-island.net/ncurses/

Package: ncurses-bin
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 636
Maintainer: Craig Small <csmall@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: ncurses
Version: 6.4-4
Pre-Depends: libc6 (>= 2.34), libtinfo6 (>= 6.3)
Description: terminal-related programs and man pages
 The ncurses library routines are a terminal-independent method of
 updating character screens with reasonable optimization.
 .
 This package contains the programs used for manipulating the terminfo
 database and individual terminfo entries, as well as some programs for
 resetting terminals and such.
Homepage: https://invisible-island.net/ncurses/

Package: ncurses-term
Status: install ok installed
Priority: standard
Section: misc
Installed-Size: 4289
Maintainer: Craig Small <csmall@debian.org>
Architecture: all
Multi-Arch: foreign
Source: ncurses
Version: 6.4-4
Replaces: alacritty (<< 0.3.4~), dvtm (<< 0.15-3), jfbterm (<< 0.4.7-10), kon2 (<< 0.3.9b-21), libiterm1 (<< 0.5-9), tn5250 (<< 0.17.4-3)
Depends: ncurses-base (>= 6.1+20190713)
Breaks: bash-static (<< 4.4.18-1.1), dvtm (<< 0.15-3), libmono-corlib4.5-cil (<< 4.6.2.7+dfsg-2), libslang2 (<< 2.3.1a-3), libtinfo5 (<< 6.1), libunibilium0 (<< 2), libunibilium4 (<< 2.0.0-3), vim-common (<< 2:9.0.1000-2), zsh-static (<< 5.4.2-4)
Description: additional terminal type definitions
 The ncurses library routines are a terminal-independent method of
 updating character screens with reasonable optimization.
 .
 This package contains all of the numerous terminal definitions not found in
 the ncurses-base package.
Homepage: https://invisible-island.net/ncurses/

Package: net-tools
Status: install ok installed
Priority: important
Section: net
Installed-Size: 978
Maintainer: net-tools Team <team+net-tools@tracker.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.10-0.1+deb12u2
Depends: libc6 (>= 2.34), libselinux1 (>= 3.1~)
Description: NET-3 networking toolkit
 This package includes the important tools for controlling the network
 subsystem of the Linux kernel.  This includes arp, ifconfig, netstat,
 rarp, nameif and route.  Additionally, this package contains utilities
 relating to particular network hardware types (plipconfig, slattach,
 mii-tool) and advanced aspects of IP configuration (iptunnel, ipmaddr).
 .
 In the upstream package 'hostname' and friends are included. Those are
 not installed by this package, since there is a special "hostname*.deb".
Homepage: http://sourceforge.net/projects/net-tools/

Package: netbase
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 36
Maintainer: Marco d'Itri <md@linux.it>
Architecture: all
Multi-Arch: foreign
Version: 6.4
Replaces: ebtables (<< 2.0.11-2)
Breaks: ebtables (<< 2.0.11-2)
Conffiles:
 /etc/ethertypes cd7fa874d85f7587e2ed11174d58cf83
 /etc/protocols 0c247591a720f534fe543401bd4844d6
 /etc/rpc 2d7748cd0feba2e43ee52d4d7f834188
 /etc/services 3975f0d8c4e1ecb25f035edfb1ba27ac
Description: Basic TCP/IP networking system
 This package provides the necessary infrastructure for basic TCP/IP based
 networking.
 .
 In particular, it supplies common name-to-number mappings in /etc/services,
 /etc/rpc, /etc/protocols and /etc/ethertypes.

Package: netcat-traditional
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 143
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: amd64
Source: netcat
Version: 1.10-47
Provides: netcat
Depends: libc6 (>= 2.15)
Description: TCP/IP swiss army knife
 A simple Unix utility which reads and writes data across network
 connections using TCP or UDP protocol. It is designed to be a reliable
 "back-end" tool that can be used directly or easily driven by other
 programs and scripts. At the same time it is a feature-rich network
 debugging and exploration tool, since it can create almost any kind
 of connection you would need and has several interesting built-in
 capabilities.
 .
 This is the "classic" netcat, written by *Hobbit*. It lacks many
 features found in netcat-openbsd.
Homepage: http://www.stearns.org/nc/

Package: netdata
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 46
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Architecture: all
Version: 1.37.1-2
Replaces: netdata-plugins-nodejs
Depends: netdata-core | netdata-core-no-sse, netdata-plugins-bash, netdata-web
Recommends: netdata-plugins-python
Breaks: netdata-plugins-nodejs
Description: real-time performance monitoring (metapackage)
 Netdata is distributed, real-time, performance and health monitoring for
 systems and applications. It provides insights of everything happening on the
 systems it runs using interactive web dashboards.
 .
 It can run autonomously without any third party components or it can be
 integrated to existing monitoring tool chains (Prometheus, Graphite,
 OpenTSDB, Kafka, Grafana, etc).
 .
 This package is a metapackage depending on the typical netdata components.
Homepage: https://github.com/netdata/netdata

Package: netdata-core
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 6921
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Architecture: amd64
Source: netdata
Version: 1.37.1-2
Replaces: netdata-core-no-sse, netdata-plugins-bash (<< 1.19.0-2~), netdata-plugins-python (<< 1.17.0-1~)
Depends: libcap2-bin, lsb-base, libc6 (>= 2.34), libcap2 (>= 1:2.10), libjson-c5 (>= 0.15), liblz4-1 (>= 1.8.2), libmnl0 (>= 1.0.3-4~), libnetfilter-acct1 (>= 1.0.3), libssl3 (>= 3.0.0), libuuid1 (>= 2.16), libuv1 (>= 1.4.2), zlib1g (>= 1:1.1.4)
Pre-Depends: init-system-helpers (>= 1.54~)
Recommends: curl
Suggests: apcupsd, iproute2, iw, lm-sensors, nc
Breaks: netdata-plugins-bash (<< 1.19.0-2~), netdata-plugins-python (<< 1.17.0-1~)
Conflicts: netdata-core-no-sse
Conffiles:
 /etc/init.d/netdata b26812d99f43e4ecea7d0be178457038
 /etc/logrotate.d/netdata 2ad4c6a55fc413856b986760523afa69
 /etc/netdata/.opt-out-from-anonymous-statistics d41d8cd98f00b204e9800998ecf8427e
 /etc/netdata/edit-config f4062b0d91299666d4a1887bea715490
 /etc/netdata/netdata.conf 1743d70094b6526f6d99711f3def31bf
Description: real-time performance monitoring (core)
 Netdata is distributed, real-time, performance and health monitoring for
 systems and applications. It provides insights of everything happening on the
 systems it runs using interactive web dashboards.
 .
 This package contains the minimal core build with SSE2 optimizations for
 current systems.
Homepage: https://github.com/netdata/netdata

Package: netdata-plugins-bash
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 2353
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Architecture: all
Multi-Arch: foreign
Source: netdata
Version: 1.37.1-2
Replaces: netdata-core (<< 1.19.0-2~), netdata-core-no-sse (<< 1.19.0-2~)
Provides: netdata-plugins
Depends: netdata-core (>= 1.37.1-2) | netdata-core-no-sse (>= 1.37.1-2)
Suggests: fping
Breaks: netdata-core (<< 1.19.0-2~), netdata-core-no-sse (<< 1.19.0-2~)
Enhances: netdata-core, netdata-core-no-sse
Description: real-time performance monitoring (bash plugins)
 Netdata is distributed, real-time, performance and health monitoring for
 systems and applications. It provides insights of everything happening on the
 systems it runs using interactive web dashboards.
 .
 This package contains the plugins using bash.
Homepage: https://github.com/netdata/netdata

Package: netdata-plugins-python
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 855
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Architecture: all
Multi-Arch: foreign
Source: netdata
Version: 1.37.1-2
Replaces: netdata-core (<< 1.17.0-1~), netdata-core-no-sse (<< 1.17.0-1~)
Provides: netdata-plugins
Depends: netdata-core (>= 1.37.1-2) | netdata-core-no-sse (>= 1.37.1-2), python3, python3-six, python3-urllib3 (>= 1.22), python3-yaml
Suggests: python3-psycopg2, python3-pymysql, python3-requests
Breaks: netdata-core (<< 1.17.0-1~), netdata-core-no-sse (<< 1.17.0-1~)
Enhances: netdata-core, netdata-core-no-sse
Description: real-time performance monitoring (python plugins)
 Netdata is distributed, real-time, performance and health monitoring for
 systems and applications. It provides insights of everything happening on the
 systems it runs using interactive web dashboards.
 .
 This package contains the plugins using python.
Homepage: https://github.com/netdata/netdata

Package: netdata-web
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 27157
Maintainer: Daniel Baumann <daniel.baumann@progress-linux.org>
Architecture: all
Source: netdata
Version: 1.37.1-2
Replaces: netdata-data
Depends: fonts-font-awesome, libjs-bootstrap, netdata-core (>= 1.37.1-2) | netdata-core-no-sse (>= 1.37.1-2)
Conflicts: netdata-data
Enhances: netdata-core, netdata-core-no-sse
Description: real-time performance monitoring (web)
 Netdata is distributed, real-time, performance and health monitoring for
 systems and applications. It provides insights of everything happening on the
 systems it runs using interactive web dashboards.
 .
 This package contains the web frontend.
Homepage: https://github.com/netdata/netdata

Package: nfs-common
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 1111
Maintainer: Debian kernel team <debian-kernel@lists.debian.org>
Architecture: amd64
Source: nfs-utils
Version: 1:2.6.2-4+deb12u1
Replaces: nfs-client
Provides: nfs-client
Depends: libc6 (>= 2.34), libcap2 (>= 1:2.10), libcom-err2 (>= 1.43.9), libdevmapper1.02.1 (>= 2:1.02.97), libevent-core-2.1-7 (>= 2.1.8-stable), libgssapi-krb5-2 (>= 1.17), libkeyutils1 (>= 1.5.9), libkrb5-3 (>= 1.10+dfsg~alpha1), libmount1 (>= 2.24.2), libnfsidmap1 (= 1:2.6.2-4+deb12u1), libtirpc3 (>= 1.0.2), libwrap0 (>= 7.6-4~), rpcbind, adduser, ucf, lsb-base, keyutils, python3
Pre-Depends: init-system-helpers (>= 1.54~)
Suggests: open-iscsi, watchdog
Conflicts: nfs-client
Conffiles:
 /etc/default/nfs-common ddcb1fbb90a14ff9850f22eed0127a10
 /etc/init.d/nfs-common 54a170f8dab112f2f6d7f49db71fcc34
 /etc/request-key.d/id_resolver.conf c7df239caa9880e7d6048cff6d46adc7
Description: NFS support files common to client and server
 Use this package on any machine that uses NFS, either as client or
 server.  Programs included: lockd, statd, showmount, nfsstat, gssd,
 idmapd and mount.nfs.
Homepage: https://linux-nfs.org/

Package: nftables
Status: install ok installed
Priority: important
Section: net
Installed-Size: 176
Maintainer: Debian Netfilter Packaging Team <pkg-netfilter-team@lists.alioth.debian.org>
Architecture: amd64
Version: 1.0.6-2+deb12u2
Depends: libnftables1 (= 1.0.6-2+deb12u2), libc6 (>= 2.34), libedit2 (>= 3.1-20130611-0)
Recommends: netbase
Suggests: firewalld
Conffiles:
 /etc/nftables.conf 4d4241fcd44b9a69b74f69d571f35a20
Description: Program to control packet filtering rules by Netfilter project
 This software provides an in-kernel packet classification framework that is
 based on a network-specific Virtual Machine (VM) and the nft userspace
 command line tool. The nftables framework reuses the existing Netfilter
 subsystems such as the existing hook infrastructure, the connection tracking
 system, NAT, userspace queueing and logging subsystem.
 .
 nftables replaces the old popular iptables, ip6tables, arptables and ebtables.
 .
 Netfilter software and nftables in particular are used in applications such
 as Internet connection sharing, firewalls, IP accounting, transparent
 proxying, advanced routing and traffic control.
 .
 A Linux kernel >= 3.13 is required. However, >= 4.14 is recommended.
Homepage: https://www.netfilter.org/

Package: nmap
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 4434
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Version: 7.93+dfsg1-1
Depends: nmap-common (= 7.93+dfsg1-1), libc6 (>= 2.34), libgcc-s1 (>= 3.0), liblinear4 (>= 2.01+dfsg), liblua5.3-0, libpcap0.8 (>= 1.5.1), libpcre3, libssh2-1 (>= 1.2.9), libssl3 (>= 3.0.0), libstdc++6 (>= 11), lua-lpeg (>= 1.0.2), zlib1g (>= 1:1.1.4)
Suggests: ncat, ndiff, zenmap
Description: The Network Mapper
 Nmap is a utility for network exploration or security auditing. It
 supports ping scanning (determine which hosts are up), many port
 scanning techniques, version detection (determine service protocols
 and application versions listening behind ports), and TCP/IP
 fingerprinting (remote host OS or device identification). Nmap also
 offers flexible target and port specification, decoy/stealth scanning,
 sunRPC scanning, and more. Most Unix and Windows platforms are
 supported in both GUI and commandline modes. Several popular handheld
 devices are also supported, including the Sharp Zaurus and the iPAQ.
Homepage: https://nmap.org/

Package: nmap-common
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 21188
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: nmap
Version: 7.93+dfsg1-1
Recommends: nmap
Description: Architecture independent files for nmap
 Nmap is a utility for network exploration or security auditing. It
 supports ping scanning (determine which hosts are up), many port
 scanning techniques, version detection (determine service protocols
 and application versions listening behind ports), and TCP/IP
 fingerprinting (remote host OS or device identification). Nmap also
 offers flexible target and port specification, decoy/stealth scanning,
 sunRPC scanning, and more. Most Unix and Windows platforms are
 supported in both GUI and commandline modes. Several popular handheld
 devices are also supported, including the Sharp Zaurus and the iPAQ.
 .
 This package contains the nmap files shared by all architectures.
Homepage: https://nmap.org/

Package: ntfs-3g
Status: install ok installed
Priority: optional
Section: otherosfs
Installed-Size: 1470
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Version: 1:2022.10.3-1+deb12u2
Depends: libc6 (>= 2.34), libgcrypt20 (>= 1.10.0), libgnutls30 (>= 3.7.2), libntfs-3g89 (= 1:2022.10.3-1+deb12u2), fuse3
Description: read/write NTFS driver for FUSE
 NTFS-3G uses FUSE (Filesystem in Userspace) to provide support for the NTFS
 filesystem used by Microsoft Windows.
Homepage: https://github.com/tuxera/ntfs-3g/wiki

Package: openssh-client
Status: install ok installed
Priority: standard
Section: net
Installed-Size: 5792
Maintainer: Debian OpenSSH Maintainers <debian-ssh@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: openssh
Version: 1:9.2p1-2+deb12u7
Replaces: openssh-sk-helper, ssh, ssh-krb5
Provides: ssh-client
Depends: adduser, passwd, libc6 (>= 2.36), libedit2 (>= 2.11-20080614-0), libfido2-1 (>= 1.8.0), libgssapi-krb5-2 (>= 1.17), libselinux1 (>= 3.1~), libssl3 (>= 3.0.17), zlib1g (>= 1:1.1.4)
Recommends: xauth
Suggests: keychain, libpam-ssh, monkeysphere, ssh-askpass
Breaks: openssh-sk-helper
Conflicts: sftp
Conffiles:
 /etc/ssh/ssh_config 8a5bddc82befb71d8ef34cc903d3d077
Description: secure shell (SSH) client, for secure access to remote machines
 This is the portable version of OpenSSH, a free implementation of
 the Secure Shell protocol as specified by the IETF secsh working
 group.
 .
 Ssh (Secure Shell) is a program for logging into a remote machine
 and for executing commands on a remote machine.
 It provides secure encrypted communications between two untrusted
 hosts over an insecure network. X11 connections and arbitrary TCP/IP
 ports can also be forwarded over the secure channel.
 It can be used to provide applications with a secure communication
 channel.
 .
 This package provides the ssh, scp and sftp clients, the ssh-agent
 and ssh-add programs to make public key authentication more convenient,
 and the ssh-keygen, ssh-keyscan, ssh-copy-id and ssh-argv0 utilities.
 .
 In some countries it may be illegal to use any encryption at all
 without a special permit.
 .
 ssh replaces the insecure rsh, rcp and rlogin programs, which are
 obsolete for most purposes.
Homepage: https://www.openssh.com/

Package: openssh-server
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 1930
Maintainer: Debian OpenSSH Maintainers <debian-ssh@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: openssh
Version: 1:9.2p1-2+deb12u7
Replaces: openssh-client (<< 1:7.9p1-8), ssh, ssh-krb5
Provides: ssh-server
Depends: adduser, libpam-modules, libpam-runtime, lsb-base, openssh-client (= 1:9.2p1-2+deb12u7), openssh-sftp-server, procps, ucf, debconf (>= 0.5) | debconf-2.0, runit-helper (>= 2.14.0~), libaudit1 (>= 1:2.2.1), libc6 (>= 2.36), libcom-err2 (>= 1.43.9), libcrypt1 (>= 1:4.1.0), libgssapi-krb5-2 (>= 1.17), libkrb5-3 (>= 1.13~alpha1+dfsg), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), libssl3 (>= 3.0.17), libsystemd0, libwrap0 (>= 7.6-4~), zlib1g (>= 1:1.1.4)
Pre-Depends: init-system-helpers (>= 1.54~)
Recommends: default-logind | logind | libpam-systemd, ncurses-term, xauth
Suggests: molly-guard, monkeysphere, ssh-askpass, ufw
Breaks: runit (<< 2.1.2-51~)
Conflicts: sftp, ssh-socks, ssh2
Conffiles:
 /etc/default/ssh 500e3cf069fe9a7b9936108eb9d9c035
 /etc/init.d/ssh 3649a6fe8c18ad1d5245fd91737de507
 /etc/pam.d/sshd 8b4c7a12b031424b2a9946881da59812
 /etc/ssh/moduli 1f68f6ab5e45958e61ff32297ea1c3ec
 /etc/sv/ssh/.meta/installed d41d8cd98f00b204e9800998ecf8427e
 /etc/sv/ssh/finish f5f032f6f3e569c821346294d410b636
 /etc/sv/ssh/log/run 63e0ec3e1080dafc68d6d71d42b150a9
 /etc/sv/ssh/run 411f69ac55d12f0c98998552846b1c78
 /etc/ufw/applications.d/openssh-server 486b78d54b93cc9fdc950c1d52ff479e
Description: secure shell (SSH) server, for secure access from remote machines
 This is the portable version of OpenSSH, a free implementation of
 the Secure Shell protocol as specified by the IETF secsh working
 group.
 .
 Ssh (Secure Shell) is a program for logging into a remote machine
 and for executing commands on a remote machine.
 It provides secure encrypted communications between two untrusted
 hosts over an insecure network. X11 connections and arbitrary TCP/IP
 ports can also be forwarded over the secure channel.
 It can be used to provide applications with a secure communication
 channel.
 .
 This package provides the sshd server.
 .
 In some countries it may be illegal to use any encryption at all
 without a special permit.
 .
 sshd replaces the insecure rshd program, which is obsolete for most
 purposes.
Homepage: https://www.openssh.com/

Package: openssh-sftp-server
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 217
Maintainer: Debian OpenSSH Maintainers <debian-ssh@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: openssh
Version: 1:9.2p1-2+deb12u7
Replaces: openssh-server (<< 1:6.5p1-5)
Depends: openssh-client (= 1:9.2p1-2+deb12u7), libc6 (>= 2.34)
Recommends: openssh-server | ssh-server
Breaks: openssh-server (<< 1:6.5p1-5)
Enhances: openssh-server, ssh-server
Description: secure shell (SSH) sftp server module, for SFTP access from remote machines
 This is the portable version of OpenSSH, a free implementation of
 the Secure Shell protocol as specified by the IETF secsh working
 group.
 .
 Ssh (Secure Shell) is a program for logging into a remote machine
 and for executing commands on a remote machine.
 It provides secure encrypted communications between two untrusted
 hosts over an insecure network. X11 connections and arbitrary TCP/IP
 ports can also be forwarded over the secure channel.
 It can be used to provide applications with a secure communication
 channel.
 .
 This package provides the SFTP server module for the SSH server. It
 is needed if you want to access your SSH server with SFTP. The SFTP
 server module also works with other SSH daemons like dropbear.
 .
 OpenSSH's sftp and sftp-server implement revision 3 of the SSH filexfer
 protocol described in:
 .
  http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt
 .
 Newer versions of the draft will not be supported, though some features
 are individually implemented as extensions.
Homepage: https://www.openssh.com/

Package: openssl
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 2303
Maintainer: Debian OpenSSL Team <pkg-openssl-devel@alioth-lists.debian.net>
Architecture: amd64
Multi-Arch: foreign
Version: 3.0.17-1~deb12u1
Depends: libc6 (>= 2.34), libssl3 (>= 3.0.9)
Suggests: ca-certificates
Conffiles:
 /etc/ssl/openssl.cnf fe1993ec22f6b8a46cb9706acd8fc68f
Description: Secure Sockets Layer toolkit - cryptographic utility
 This package is part of the OpenSSL project's implementation of the SSL
 and TLS cryptographic protocols for secure communication over the
 Internet.
 .
 It contains the general-purpose command line binary /usr/bin/openssl,
 useful for cryptographic operations such as:
  * creating RSA, DH, and DSA key parameters;
  * creating X.509 certificates, CSRs, and CRLs;
  * calculating message digests;
  * encrypting and decrypting with ciphers;
  * testing SSL/TLS clients and servers;
  * handling S/MIME signed or encrypted mail.
Homepage: https://www.openssl.org/

Package: os-prober
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 110
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: amd64
Version: 1.81
Depends: libc6 (>= 2.4), grub-common, mount
Description: utility to detect other OSes on a set of drives
 This package detects other OSes available on a system and outputs the
 results in a generic machine-readable format.

Package: passwd
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 2827
Maintainer: Shadow package maintainers <pkg-shadow-devel@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: shadow
Version: 1:4.13+dfsg1-1+deb12u1
Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.36), libcrypt1 (>= 1:4.1.0), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), libsemanage2 (>= 2.0.32), libpam-modules
Recommends: sensible-utils
Conffiles:
 /etc/default/useradd e03965d134c26725cbc51a57969da6c9
 /etc/pam.d/chfn 4d466e00a348ba426130664d795e8afa
 /etc/pam.d/chpasswd 9900720564cb4ee98b7da29e2d183cb2
 /etc/pam.d/chsh a6e9b589e90009334ffd030d819290a6
 /etc/pam.d/newusers 1454e29bfa9f2a10836563e76936cea5
 /etc/pam.d/passwd eaf2ad85b5ccd06cceb19a3e75f40c63
Description: change and administer password and group data
 This package includes passwd, chsh, chfn, and many other programs to
 maintain password and group data.
 .
 Shadow passwords are supported.  See /usr/share/doc/passwd/README.Debian
Homepage: https://github.com/shadow-maint/shadow

Package: patch
Status: install ok installed
Priority: optional
Section: vcs
Installed-Size: 248
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.7.6-7
Depends: libc6 (>= 2.17)
Suggests: ed, diffutils-doc
Description: Apply a diff file to an original
 Patch will take a patch file containing any of the four forms
 of difference listing produced by the diff program and apply
 those differences to an original file, producing a patched
 version.
Homepage: https://savannah.gnu.org/projects/patch/

Package: pci.ids
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 1343
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.0~2023.04.11-1
Replaces: pciutils (<< 1:3.6.2-4~)
Breaks: pciutils (<< 1:3.6.2-4~)
Description: PCI ID Repository
 This package contains the pci.ids file, a public repository of all known
 ID's used in PCI devices: ID's of vendors, devices, subsystems and device
 classes. It is used in various programs to display full human-readable
 names instead of cryptic numeric codes.
Homepage: https://pci-ids.ucw.cz/

Package: pciutils
Status: install ok installed
Priority: standard
Section: admin
Installed-Size: 210
Maintainer: Guillem Jover <guillem@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1:3.9.0-4
Depends: libc6 (>= 2.34), libkmod2 (>= 5~), libpci3 (= 1:3.9.0-4)
Suggests: bzip2, wget | curl | lynx
Description: PCI utilities
 This package contains various utilities for inspecting and setting of
 devices connected to the PCI bus.
Homepage: https://mj.ucw.cz/sw/pciutils/

Package: perl
Status: install ok installed
Priority: standard
Section: perl
Installed-Size: 670
Maintainer: Niko Tyni <ntyni@debian.org>
Architecture: amd64
Multi-Arch: allowed
Version: 5.36.0-7+deb12u2
Replaces: perl-base (<< 5.36.0-2), perl-modules (<< 5.22.0~)
Provides: libansicolor-perl (= 5.01), libarchive-tar-perl (= 2.40), libattribute-handlers-perl (= 1.02), libautodie-perl (= 2.34), libcompress-raw-bzip2-perl (= 2.103), libcompress-raw-zlib-perl (= 2.105), libcompress-zlib-perl (= 2.106), libcpan-meta-perl (= 2.150010), libcpan-meta-requirements-perl (= 2.140), libcpan-meta-yaml-perl (= 0.018), libdigest-md5-perl (= 2.58), libdigest-perl (= 1.20), libdigest-sha-perl (= 6.02), libencode-perl (= 3.17), libexperimental-perl (= 0.028), libextutils-cbuilder-perl (= 0.280236), libextutils-command-perl (= 7.64), libextutils-install-perl (= 2.20), libextutils-parsexs-perl (= 3.450000), libfile-spec-perl (= 3.8400), libhttp-tiny-perl (= 0.080), libi18n-langtags-perl (= 0.45), libio-compress-base-perl (= 2.106), libio-compress-bzip2-perl (= 2.106), libio-compress-perl (= 2.106), libio-compress-zlib-perl (= 2.106), libio-zlib-perl (= 1.11), libjson-pp-perl (= 4.07000), liblocale-maketext-perl (= 1.31), liblocale-maketext-simple-perl (= 0.21.01), libmath-bigint-perl (= 1.999830), libmath-complex-perl (= 1.5902), libmime-base64-perl (= 3.16), libmodule-corelist-perl (= 5.20220520), libmodule-load-conditional-perl (= 0.74), libmodule-load-perl (= 0.36), libmodule-metadata-perl (= 1.000037), libnet-perl (= 1:3.14), libnet-ping-perl (= 2.74), libparams-check-perl (= 0.38), libparent-perl (= 0.238), libparse-cpan-meta-perl (= 2.150010), libperl-ostype-perl (= 1.010), libpod-escapes-perl (= 1.07), libpod-simple-perl (= 3.43), libstorable-perl (= 3.26), libsys-syslog-perl (= 0.36), libtest-harness-perl (= 3.44), libtest-simple-perl (= 1.302190), libtest-tester-perl (= 1.302190), libtest-use-ok-perl (= 1.302190), libtext-balanced-perl (= 2.04), libthread-queue-perl (= 3.14), libthreads-perl (= 2.27), libthreads-shared-perl (= 1.64), libtime-hires-perl (= 1.9770), libtime-local-perl (= 1.3000), libtime-piece-perl (= 1.3401), libunicode-collate-perl (= 1.31), libversion-perl (= 1:0.9929), libversion-requirements-perl, podlators-perl (= 4.14)
Depends: perl-base (= 5.36.0-7+deb12u2), perl-modules-5.36 (>= 5.36.0-7+deb12u2), libperl5.36 (= 5.36.0-7+deb12u2)
Pre-Depends: dpkg (>= 1.17.17)
Recommends: netbase
Suggests: perl-doc, libterm-readline-gnu-perl | libterm-readline-perl-perl, make, libtap-harness-archive-perl
Breaks: apt-show-versions (<< 0.22.10), libdist-inkt-perl (<< 0.024-5), libmarc-charset-perl (<< 1.35-3), libperl-dev (<< 5.24.0~), perl-doc (<< 5.36.0-1), perl-modules-5.22, perl-modules-5.24, perl-modules-5.26 (<< 5.26.2-5)
Conflicts: libjson-pp-perl (<< 2.27200-2)
Conffiles:
 /etc/perl/Net/libnet.cfg fb2946cae573b8ed3d654a180d458733
Description: Larry Wall's Practical Extraction and Report Language
 Perl is a highly capable, feature-rich programming language with over
 20 years of development. Perl 5 runs on over 100 platforms from
 portables to mainframes. Perl is suitable for both rapid prototyping
 and large scale development projects.
 .
 Perl 5 supports many programming styles, including procedural,
 functional, and object-oriented. In addition to this, it is supported
 by an ever-growing collection of reusable modules which accelerate
 development. Some of these modules include Web frameworks, database
 integration, networking protocols, and encryption. Perl provides
 interfaces to C and C++ for custom extension development.
Homepage: http://dev.perl.org/perl5/

Package: perl-base
Essential: yes
Status: install ok installed
Priority: required
Section: perl
Installed-Size: 7639
Maintainer: Niko Tyni <ntyni@debian.org>
Architecture: amd64
Source: perl
Version: 5.36.0-7+deb12u2
Replaces: libfile-path-perl (<< 2.18), libfile-temp-perl (<< 0.2311), libio-socket-ip-perl (<< 0.41), libscalar-list-utils-perl (<< 1:1.62), libsocket-perl (<< 2.033), libxsloader-perl (<< 0.31), perl (<< 5.10.1-12), perl-modules (<< 5.20.1-3)
Provides: libfile-path-perl (= 2.18), libfile-temp-perl (= 0.2311), libio-socket-ip-perl (= 0.41), libscalar-list-utils-perl (= 1:1.62), libsocket-perl (= 2.033), libxsloader-perl (= 0.31), perlapi-5.36.0
Pre-Depends: libc6 (>= 2.35), libcrypt1 (>= 1:4.1.0), dpkg (>= 1.17.17)
Suggests: perl, sensible-utils
Breaks: amanda-common (<< 1:3.3.9-2), backuppc (<< 4.4.0-7~), bucardo (<< 5.5.0-1.1), debconf (<< 1.5.61), dh-haskell (<< 0.3), duck (<< 0.14.1), intltool (<< 0.51.0-4), kio-perldoc (<< 20.04.1-1), latexml (<< 0.8.4-2), libdevel-mat-dumper-perl (<< 0.42-3), libencode-arabic-perl (<< 14.2-2), libexception-class-perl (<< 1.42), libfile-path-perl (<< 2.18), libfile-spec-perl (<< 3.8400), libfile-temp-perl (<< 0.2311), libio-socket-ip-perl (<< 0.41), libmp3-tag-perl (<< 1.13-1.2), libsbuild-perl (<< 0.67.0-1), libscalar-list-utils-perl (<< 1:1.62), libsocket-perl (<< 2.033), libxsloader-perl (<< 0.31), mailagent (<< 1:3.1-81-2), perl (<< 5.36.0~), perl-modules (<< 5.36.0~), pod2pdf (<< 0.42-5.1), slic3r (<< 1.2.9+dfsg-6.1), slic3r-prusa (<< 1.37.0+dfsg-1.1), texinfo (<< 6.1.0.dfsg.1-8)
Conflicts: defoma (<< 0.11.12), doc-base (<< 0.10.3), mono-gac (<< 2.10.8.1-3), safe-rm (<< 0.8), update-inetd (<< 4.41)
Description: minimal Perl system
 Perl is a scripting language used in many system scripts and utilities.
 .
 This package provides a Perl interpreter and the small subset of the
 standard run-time library required to perform basic tasks. For a full
 Perl installation, install "perl" (and its dependencies, "perl-modules-5.36"
 and "perl-doc").
Homepage: http://dev.perl.org/perl5/

Package: perl-modules-5.36
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 17817
Maintainer: Niko Tyni <ntyni@debian.org>
Architecture: all
Multi-Arch: foreign
Source: perl
Version: 5.36.0-7+deb12u2
Replaces: libansicolor-perl (<< 5.01), libarchive-tar-perl (<< 2.40), libattribute-handlers-perl (<< 1.02), libautodie-perl (<< 2.34), libcpan-meta-perl (<< 2.150010), libcpan-meta-requirements-perl (<< 2.140), libcpan-meta-yaml-perl (<< 0.018), libdigest-perl (<< 1.20), libexperimental-perl (<< 0.028), libextutils-cbuilder-perl (<< 0.280236), libextutils-command-perl (<< 7.64), libextutils-install-perl (<< 2.20), libextutils-parsexs-perl (<< 3.450000), libfile-spec-perl (<< 3.8400), libhttp-tiny-perl (<< 0.080), libi18n-langtags-perl (<< 0.45), libio-zlib-perl (<< 1.11), libjson-pp-perl (<< 4.07000), liblocale-maketext-perl (<< 1.31), liblocale-maketext-simple-perl (<< 0.21.01), libmath-bigint-perl (<< 1.999830), libmath-complex-perl (<< 1.5902), libmodule-corelist-perl (<< 5.20220520), libmodule-load-conditional-perl (<< 0.74), libmodule-load-perl (<< 0.36), libmodule-metadata-perl (<< 1.000037), libnet-perl (<< 1:3.14), libnet-ping-perl (<< 2.74), libparams-check-perl (<< 0.38), libparent-perl (<< 0.238), libparse-cpan-meta-perl (<< 2.150010), libperl-ostype-perl (<< 1.010), libpod-escapes-perl (<< 1.07), libpod-simple-perl (<< 3.43), libtest-harness-perl (<< 3.44), libtest-simple-perl (<< 1.302190), libtest-tester-perl (<< 1.302190), libtest-use-ok-perl (<< 1.302190), libtext-balanced-perl (<< 2.04), libthread-queue-perl (<< 3.14), libtime-local-perl (<< 1.3000), libunicode-collate-perl (<< 1.31), libversion-perl (<< 1:0.9929), perl-base (<< 5.22.0~), perl-modules, podlators-perl (<< 4.14)
Provides: perl-modules
Depends: perl-base (>= 5.36.0-1)
Pre-Depends: dpkg (>= 1.17.17)
Recommends: perl (>= 5.36.0-1)
Breaks: libansicolor-perl (<< 5.01), libarchive-tar-perl (<< 2.40), libattribute-handlers-perl (<< 1.02), libautodie-perl (<< 2.34), libcpan-meta-perl (<< 2.150010), libcpan-meta-requirements-perl (<< 2.140), libcpan-meta-yaml-perl (<< 0.018), libdigest-perl (<< 1.20), libexperimental-perl (<< 0.028), libextutils-cbuilder-perl (<< 0.280236), libextutils-command-perl (<< 7.64), libextutils-install-perl (<< 2.20), libextutils-parsexs-perl (<< 3.450000), libfile-spec-perl (<< 3.8400), libhttp-tiny-perl (<< 0.080), libi18n-langtags-perl (<< 0.45), libio-zlib-perl (<< 1.11), libjson-pp-perl (<< 4.07000), liblocale-maketext-perl (<< 1.31), liblocale-maketext-simple-perl (<< 0.21.01), libmath-bigint-perl (<< 1.999830), libmath-complex-perl (<< 1.5902), libmodule-corelist-perl (<< 5.20220520), libmodule-load-conditional-perl (<< 0.74), libmodule-load-perl (<< 0.36), libmodule-metadata-perl (<< 1.000037), libnet-perl (<< 1:3.14), libnet-ping-perl (<< 2.74), libparams-check-perl (<< 0.38), libparent-perl (<< 0.238), libparse-cpan-meta-perl (<< 2.150010), libperl-ostype-perl (<< 1.010), libpod-escapes-perl (<< 1.07), libpod-simple-perl (<< 3.43), libtest-harness-perl (<< 3.44), libtest-simple-perl (<< 1.302190), libtest-tester-perl (<< 1.302190), libtest-use-ok-perl (<< 1.302190), libtext-balanced-perl (<< 2.04), libthread-queue-perl (<< 3.14), libtime-local-perl (<< 1.3000), libunicode-collate-perl (<< 1.31), libversion-perl (<< 1:0.9929), maildirsync (<< 1.2-2.1), perl (<< 5.36.0~), podlators-perl (<< 4.14)
Conflicts: perl-modules (<< 5.22.0~)
Description: Core Perl modules
 Architecture independent Perl modules.  These modules are part of Perl and
 required if the `perl' package is installed.
 .
 Note that this package only exists to save archive space and should be
 considered an internal implementation detail of the `perl' package.
 Other packages should not depend on `perl-modules-5.36' directly, they
 should use `perl' (which depends on `perl-modules-5.36') instead.
Homepage: http://dev.perl.org/perl5/

Package: pinentry-curses
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 140
Maintainer: Debian GnuPG Maintainers <pkg-gnupg-maint@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: pinentry
Version: 1.2.1-1
Provides: pinentry
Depends: libassuan0 (>= 2.1.0), libc6 (>= 2.34), libgpg-error0 (>= 1.16), libncursesw6 (>= 6), libtinfo6 (>= 6)
Suggests: pinentry-doc
Enhances: gnupg-agent
Description: curses-based PIN or pass-phrase entry dialog for GnuPG
 This package contains a program that allows for secure entry of PINs or
 pass phrases.  That means it tries to take care that the entered
 information is not swapped to disk or temporarily stored anywhere.
 This functionality is particularly useful for entering pass phrases
 when using encryption software such as GnuPG or e-mail clients using
 the same.  It uses an open protocol and is therefore not tied to
 particular software.
 .
 The program contained in this package implements a PIN entry dialog
 using the curses tool kit, meaning that it is useful for users
 working in text mode without the X Window System.  There are sibling
 packages that implement PIN entry dialogs that use an X tool kit.  If
 you install any of the graphical packages then this package is not
 necessary because the sibling packages automatically fall back to
 text mode if X is not active.
Homepage: https://www.gnupg.org/related_software/pinentry/

Package: pkg-config
Status: install ok installed
Priority: optional
Section: oldlibs
Installed-Size: 29
Maintainer: Andrej Shadura <andrewsh@debian.org>
Architecture: amd64
Multi-Arch: same
Source: pkgconf
Version: 1.8.1-1
Depends: pkgconf (>= 1.8.0-7~)
Conffiles:
 /etc/dpkg/dpkg.cfg.d/pkg-config-hook-config newconffile remove-on-upgrade
Description: manage compile and link flags for libraries (transitional package)
 pkgconf is an implementation of the pkg-config system, which helps to configure
 compiler and linker flags for development frameworks.
 .
 pkgconf is a replacement for pkg-config, providing additional functionality
 while also maintaining compatibility.
 .
 This package only provides a dependency link to the pkgconf package to help
 with package upgrades. It can be safely removed.
Homepage: http://pkgconf.org/

Package: pkgconf
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 65
Maintainer: Andrej Shadura <andrewsh@debian.org>
Architecture: amd64
Multi-Arch: same
Version: 1.8.1-1
Replaces: pkg-config (<< 1.8)
Provides: pkg-config (= 1.8.1-1)
Depends: pkgconf-bin
Breaks: pkg-config (<< 1.8)
Conffiles:
 /etc/dpkg/dpkg.cfg.d/pkgconf-hook-config newconffile remove-on-upgrade
Description: manage compile and link flags for libraries
 pkgconf is an implementation of the pkg-config system, which helps to configure
 compiler and linker flags for development frameworks.
 .
 pkgconf is a replacement for pkg-config, providing additional functionality
 while also maintaining compatibility.
Homepage: http://pkgconf.org/

Package: pkgconf-bin
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 81
Maintainer: Andrej Shadura <andrewsh@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: pkgconf
Version: 1.8.1-1
Replaces: pkg-config (<< 1.8), pkgconf (<< 1.8.0-2~)
Depends: libc6 (>= 2.34), libpkgconf3 (>= 1.8.0)
Breaks: pkgconf (<< 1.8.0-2~)
Description: manage compile and link flags for libraries (binaries)
 pkgconf is an implementation of the pkg-config system, which helps to configure
 compiler and linker flags for development frameworks.
 .
 pkgconf is a replacement for pkg-config, providing additional functionality
 while also maintaining compatibility.
 .
 This package contains the pkgconf binary and related files.
Homepage: http://pkgconf.org/

Package: procps
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 2091
Maintainer: Craig Small <csmall@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2:4.0.2-3
Replaces: manpages-de (<< 4.9.1-2), manpages-fr (<< 4.9.1-2), manpages-fr-extra (<< 20151231+nmu1), manpages-pl (<< 1:4.9.1-2)
Provides: watch
Depends: libc6 (>= 2.34), libncursesw6 (>= 6), libproc2-0 (>= 2:4.0.2), libtinfo6 (>= 6), init-system-helpers (>= 1.29~)
Recommends: psmisc
Breaks: guymager (<= 0.5.9-1), manpages-de (<< 4.9.1-2), manpages-fr (<< 4.9.1-2), manpages-fr-extra (<< 20151231+nmu1), manpages-pl (<< 1:4.9.1-2), open-vm-tools (<= 2011.12.20-562307-1)
Conffiles:
 /etc/init.d/procps f9903aa0d9f2f10714269befb4cdba8f
 /etc/sysctl.conf c0c09cba30da0565737cace8000d64ee
 /etc/sysctl.d/README.sysctl 48e64ce233c8aba8e0693adf8cf4c464
Description: /proc file system utilities
 This package provides command line and full screen utilities for browsing
 procfs, a "pseudo" file system dynamically generated by the kernel to
 provide information about the status of entries in its process table
 (such as whether the process is running, stopped, or a "zombie").
 .
 It contains free, kill, pkill, pgrep, pmap, ps, pwdx, skill, slabtop,
 snice, sysctl, tload, top, uptime, vmstat, w, and watch.
Homepage: https://gitlab.com/procps-ng/procps

Package: publicsuffix
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 339
Maintainer: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Architecture: all
Multi-Arch: foreign
Version: 20230209.2326-1
Provides: publicsuffix-dafsa
Description: accurate, machine-readable list of domain name suffixes
 A machine-readable list of domain name suffixes that accept public
 registration.  Each suffix represents the part of a domain name which
 is not under the control of the individual registrant, which makes
 the list useful for grouping cookies, deciding same-origin policies,
 collating spam, and other activities.
Homepage: https://publicsuffix.org

Package: python-apt-common
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 527
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: python-apt
Version: 2.6.0
Replaces: python-apt (<< 0.7.98+nmu1)
Breaks: python-apt (<< 0.7.98+nmu1)
Enhances: python-apt, python3-apt
Description: Python interface to libapt-pkg (locales)
 The apt_pkg Python interface will provide full access to the internal
 libapt-pkg structures allowing Python programs to easily perform a
 variety of functions.
 .
 This package contains locales.

Package: python3
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 81
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: python3-defaults (3.11.2-1)
Version: 3.11.2-1+b1
Replaces: python3-minimal (<< 3.1.2-2)
Provides: python3-profiler, python3-supported-max (= 3.11), python3-supported-min (= 3.11)
Depends: python3.11 (>= 3.11.2-1~), libpython3-stdlib (= 3.11.2-1+b1)
Pre-Depends: python3-minimal (= 3.11.2-1+b1)
Suggests: python3-doc (>= 3.11.2-1+b1), python3-tk (>= 3.11.2-1~), python3-venv (>= 3.11.2-1+b1)
Description: interactive high-level object-oriented language (default python3 version)
 Python, the high-level, interactive object oriented language,
 includes an extensive class library with lots of goodies for
 network programming, system administration, sounds and graphics.
 .
 This package is a dependency package, which depends on Debian's default
 Python 3 version (currently v3.11).
Homepage: https://www.python.org/

Package: python3-apt
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 685
Maintainer: APT Development Team <deity@lists.debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: python-apt
Version: 2.6.0
Replaces: python-apt (<< 0.7.98+nmu1)
Depends: python3 (<< 3.12), python3 (>= 3.11~), python3:any, libapt-pkg6.0 (>= 1.9.11~), libc6 (>= 2.33), libgcc-s1 (>= 3.0), libstdc++6 (>= 11), python-apt-common, distro-info-data
Recommends: lsb-release, iso-codes
Suggests: python-apt-doc, apt
Breaks: apt-xapian-index (<< 0.51~), kthresher (<= 1.4.0-1), python-apt (<< 0.7.98+nmu1)
Description: Python 3 interface to libapt-pkg
 The apt_pkg Python 3 interface will provide full access to the internal
 libapt-pkg structures allowing Python 3 programs to easily perform a
 variety of functions, such as:
 .
  - Access to the APT configuration system
  - Access to the APT package information database
  - Parsing of Debian package control files, and other files with a
    similar structure
 .
 The included 'aptsources' Python interface provides an abstraction of
 the sources.list configuration on the repository and the distro level.

Package: python3-certifi
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 324
Maintainer: Sebastien Delafond <seb@debian.org>
Architecture: all
Source: python-certifi
Version: 2022.9.24-1
Depends: ca-certificates, python3:any
Description: root certificates for validating SSL certs and verifying TLS hosts (python3)
 Certifi is a carefully curated collection of Root Certificates for
 validating the trustworthiness of SSL certificates while verifying
 the identity of TLS hosts. It has been extracted from the Requests
 project.
 .
 The version of certifi in this Debian package is patched to return
 the location of Debian-provided CA certificates, instead of those
 packaged by upstream.
 .
 This is the python3 package.
Homepage: https://github.com/certifi/python-certifi

Package: python3-chardet
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 1144
Maintainer: Piotr Ożarowski <piotr@debian.org>
Architecture: all
Multi-Arch: foreign
Source: chardet
Version: 5.1.0+dfsg-2
Replaces: python-chardet (<< 3.0.4-6)
Depends: python3:any, python3-pkg-resources
Breaks: python-chardet (<< 3.0.4-6)
Description: Universal Character Encoding Detector (Python3)
 Chardet is a continuation of Mark Pilgrim's excellent original chardet port
 from C, and Ian Cordasco's charade Python 3-compatible fork.
 Chardet takes a sequence of bytes in an unknown character encoding, and
 attempts to determine the encoding.
 .
 Supported encodings:
  * Big5, GB2312/GB18030, EUC-TW, HZ-GB-2312, and ISO-2022-CN (Traditional
    and Simplified Chinese)
  * EUC-JP, SHIFT_JIS, and ISO-2022-JP (Japanese)
  * EUC-KR and ISO-2022-KR (Korean)
  * KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, and windows-1251 (Russian)
  * ISO-8859-2 and windows-1250 (Hungarian)
  * ISO-8859-5 and windows-1251 (Bulgarian)
  * ISO-8859-1 and windows-1252 (Western European languages)
  * ISO-8859-7 and windows-1253 (Greek)
  * ISO-8859-8 and windows-1255 (Visual and Logical Hebrew)
  * TIS-620 (Thai)
  * UTF-32 BE, LE, 3412-ordered, or 2143-ordered (with a BOM)
  * UTF-16 BE or LE (with a BOM)
  * UTF-8 (with or without a BOM)
  * ASCII
 .
 This library is a port of the auto-detection code in Mozilla.
 .
 This package contains the Python 3 version of the library.
Homepage: https://github.com/chardet/chardet

Package: python3-charset-normalizer
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 209
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Source: python-charset-normalizer
Version: 3.0.1-2
Depends: python3:any
Description: charset, encoding and language detection (Python 3)
 charset-normalizer is a library for detection of charsets, encodings,
 and languages in Python programs. It can be compared to chardet, with
 a different approach, which intends to make it faster and more reliable.
 charset-normalizer can also detect natural languages.
 .
 All IANA character set names for which the Python core library provides
 codecs are supported.
 .
 This package installs the library for Python 3.
Homepage: https://github.com/ousret/charset_normalizer

Package: python3-dbus
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 405
Maintainer: Utopia Maintenance Team <pkg-utopia-maintainers@lists.alioth.debian.org>
Architecture: amd64
Source: dbus-python (1.3.2-4)
Version: 1.3.2-4+b1
Depends: python3 (<< 3.12), python3 (>= 3.11~), python3:any, libc6 (>= 2.4), libdbus-1-3 (>= 1.9.14), libglib2.0-0 (>= 2.16.0)
Recommends: python3-gi
Suggests: python-dbus-doc
Description: simple interprocess messaging system (Python 3 interface)
 D-Bus is a message bus, used for sending messages between applications.
 Conceptually, it fits somewhere in between raw sockets and CORBA in
 terms of complexity.
 .
 This package provides a Python 3 interface to D-Bus.
 .
 See the dbus description for more information about D-Bus in general.
Homepage: https://www.freedesktop.org/wiki/Software/DBusBindings#Python

Package: python3-debconf
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 18
Maintainer: Debconf Developers <debconf-devel@lists.alioth.debian.org>
Architecture: all
Source: debconf
Version: 1.5.82
Depends: debconf (= 1.5.82), python3:any
Description: interact with debconf from Python 3
 Debconf is a configuration management system for debian packages. Packages
 use Debconf to ask questions when they are installed.
 .
 This package provides a debconf module to allow Python 3 programs to
 interact with a debconf frontend.

Package: python3-debian
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 591
Maintainer: Debian python-debian Maintainers <pkg-python-debian-maint@lists.alioth.debian.org>
Architecture: all
Source: python-debian
Version: 0.1.49
Depends: python3-chardet, python3:any
Recommends: python3-apt, zstd
Suggests: gpgv
Description: Python 3 modules to work with Debian-related data formats
 This package provides Python 3 modules that abstract many formats of Debian
 related files. Currently handled are:
  * Debtags information (debian.debtags module)
  * debian/changelog (debian.changelog module)
  * Packages files, pdiffs (debian.debian_support module)
  * Control files of single or multiple RFC822-style paragraphs, e.g.
    debian/control, .changes, .dsc, Packages, Sources, Release, etc.
    (debian.deb822 module)
  * Raw .deb and .ar files, with (read-only) access to contained
    files and meta-information
Homepage: https://salsa.debian.org/python-debian-team/python-debian

Package: python3-debianbts
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 53
Maintainer: Bastian Venthur <venthur@debian.org>
Architecture: all
Source: python-debianbts
Version: 4.0.1
Depends: python3-pysimplesoap, python3:any
Description: Python interface to Debian's Bug Tracking System
 This package provides the debianbts module, which allows one to query Debian's
 BTS via it's SOAP-interface and returns the answer in Python's native data
 types.

Package: python3-distro-info
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 34
Maintainer: Benjamin Drung <bdrung@debian.org>
Architecture: all
Source: distro-info
Version: 1.5+deb12u1
Depends: distro-info-data (>= 0.46), python3:any
Description: information about distributions' releases (Python 3 module)
 Information about all releases of Debian and Ubuntu.
 .
 This package contains a Python 3 module for parsing the data in
 distro-info-data. There is also a command line interface in the distro-info
 package.

Package: python3-gi
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 730
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: pygobject (3.42.2-3)
Version: 3.42.2-3+b1
Depends: gir1.2-glib-2.0 (>= 1.48.0), python3 (<< 3.12), python3 (>= 3.11~), python3:any, libc6 (>= 2.14), libffi8 (>= 3.4), libgirepository-1.0-1 (>= 1.62.0-4~), libgirepository-1.0-1-with-libffi8 (>= 1.62.0-4~), libglib2.0-0 (>= 2.67.3)
Description: Python 3 bindings for gobject-introspection libraries
 GObject is an abstraction layer that allows programming with an object
 paradigm that is compatible with many languages. It is a part of Glib,
 the core library used to build GTK+ and GNOME.
 .
 This package contains the Python 3 binding generator for libraries that
 support gobject-introspection, i. e. which ship a gir1.2-<name>-<version>
 package. With these packages, the libraries can be used from Python 3.
Homepage: https://wiki.gnome.org/Projects/PyGObject

Package: python3-httplib2
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 133
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Source: python-httplib2
Version: 0.20.4-3
Depends: ca-certificates, python3-pyparsing, python3:any
Breaks: python3-wsgi-intercept (<< 1.9.0)
Description: comprehensive HTTP client library written for Python3
 httplib2.py supports many features left out of other HTTP libraries.
  * HTTP and HTTPS
  * Keep-Alive
  * Authentication
  * Caching
  * All Methods
  * Redirects
  * Compression
  * Lost update support
  * Unit Tested
 .
 This package provides module for python3 series.
Homepage: https://github.com/httplib2/httplib2

Package: python3-idna
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 335
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: python-idna
Version: 3.3-1+deb12u1
Depends: python3:any
Description: Python IDNA2008 (RFC 5891) handling (Python 3)
 A library to support the Internationalised Domain Names in Applications (IDNA)
 protocol as specified in RFC 5891. This version of the protocol is often
 referred to as “IDNA2008” and can produce different results from the earlier
 standard from 2003.
 .
 The library is also intended to act as a suitable drop-in replacement for the
 “encodings.idna” module that comes with the Python standard library but
 currently only supports the older 2003 specification.
 .
 This package contains the module for Python 3.
Homepage: https://github.com/kjd/idna

Package: python3-minimal
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 111
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: python3-defaults (3.11.2-1)
Version: 3.11.2-1+b1
Depends: dpkg (>= 1.13.20)
Pre-Depends: python3.11-minimal (>= 3.11.2-1~)
Description: minimal subset of the Python language (default python3 version)
 This package contains the interpreter and some essential modules.  It's used
 in the boot process for some basic tasks.
 See /usr/share/doc/python3.11-minimal/README.Debian for a list of the modules
 contained in this package.
Homepage: https://www.python.org/
Cnf-Visible-Pkgname: python3

Package: python3-pkg-resources
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 1052
Maintainer: Matthias Klose <doko@debian.org>
Architecture: all
Multi-Arch: foreign
Source: setuptools
Version: 66.1.1-1+deb12u1
Depends: python3:any
Suggests: python3-setuptools
Description: Package Discovery and Resource Access using pkg_resources
 The pkg_resources module provides an API for Python libraries to
 access their resource files, and for extensible applications and
 frameworks to automatically discover plugins.  It also provides
 runtime support for using C extensions that are inside zipfile-format
 eggs, support for merging packages that have separately-distributed
 modules or subpackages, and APIs for managing Python's current
 "working set" of active packages.
Homepage: https://pypi.python.org/pypi/setuptools

Package: python3-pycurl
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 201
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: amd64
Source: pycurl
Version: 7.45.2-3
Depends: python3 (<< 3.12), python3 (>= 3.11~), python3:any, libc6 (>= 2.15), libcurl3-gnutls (>= 7.88.1)
Suggests: libcurl4-gnutls-dev, python-pycurl-doc
Description: Python bindings to libcurl (Python 3)
 This module provides the Python bindings to libcurl. Please refer to
 the libcurl documentation available in libcurl4-gnutls-dev Debian package.
 .
 NOTE: the SSL support is provided by GnuTLS.
 .
 This package contains PyCURL for Python 3.
Homepage: http://pycurl.sourceforge.net

Package: python3-pyparsing
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 453
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: pyparsing
Version: 3.0.9-1
Depends: python3:any
Suggests: python-pyparsing-doc
Breaks: python3-translate (<< 3.6.0~), translate-toolkit (<< 3.6.0~)
Description: alternative to creating and executing simple grammars - Python 3.x
 The parsing module is an alternative approach to creating and
 executing simple grammars, vs. the traditional lex/yacc approach, or
 the use of regular expressions.  The parsing module provides a
 library of classes that client code uses to construct the grammar
 directly in Python code.
 .
 Here's an example:
 .
  from pyparsing import Word, alphas
  greet = Word(alphas) + "," + Word(alphas) + "!"
  hello = "Hello, World!"
  print hello, "->", greet.parseString(hello)
 .
 This package contains the Python 3.x version of python-pyparsing.
Homepage: https://github.com/pyparsing/pyparsing/

Package: python3-pysimplesoap
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 191
Maintainer: Sandro Tosi <morph@debian.org>
Architecture: all
Source: pysimplesoap
Version: 1.16.2-5
Depends: python3-httplib2, python3-pycurl, python3:any
Description: simple and lightweight SOAP Library (Python 3)
 Python simple and lightweight SOAP library for client and server webservices
 interfaces, aimed to be as small and easy as possible, supporting most common
 functionality. Initially it was inspired by PHP Soap Extension (mimicking its
 functionality, simplicity and ease of use), with many advanced features added.
 .
 This package contains the Python 3 version of pysimplesoap .
Homepage: https://github.com/pysimplesoap/pysimplesoap/

Package: python3-reportbug
Status: install ok installed
Priority: standard
Section: python
Installed-Size: 353
Maintainer: Reportbug Maintainers <debian-reportbug@lists.debian.org>
Architecture: all
Source: reportbug
Version: 12.0.0
Depends: apt, file, python3-apt, python3-debian, python3-debianbts (>= 2.10), python3-requests, sensible-utils, python3:any
Suggests: reportbug
Description: Python modules for interacting with bug tracking systems
 reportbug is a tool designed to make the reporting of bugs in Debian
 and derived distributions relatively painless.
 .
 This package includes Python modules which may be reusable by other
 tools that want to interact with the Debian bug tracking system.
 .
 To actually report a bug, install the reportbug package.

Package: python3-requests
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 232
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: requests
Version: 2.28.1+dfsg-1
Depends: python3-certifi, python3-charset-normalizer, python3-idna, python3-urllib3 (>= 1.21.1), python3:any, ca-certificates, python3-chardet (>= 3.0.2)
Suggests: python3-cryptography, python3-idna (>= 2.5), python3-openssl, python3-socks, python-requests-doc
Breaks: awscli (<< 1.11.139)
Description: elegant and simple HTTP library for Python3, built for human beings
 Requests allow you to send HTTP/1.1 requests. You can add headers, form data,
 multipart files, and parameters with simple Python dictionaries, and access
 the response data in the same way. It's powered by httplib and urllib3, but
 it does all the hard work and crazy hacks for you.
 .
 Features
 .
   - International Domains and URLs
   - Keep-Alive & Connection Pooling
   - Sessions with Cookie Persistence
   - Browser-style SSL Verification
   - Basic/Digest Authentication
   - Elegant Key/Value Cookies
   - Automatic Decompression
   - Unicode Response Bodies
   - Multipart File Uploads
   - Connection Timeouts
 .
 This package contains the Python 3 version of the library.
Homepage: http://python-requests.org

Package: python3-six
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 63
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: six
Version: 1.16.0-4
Depends: python3:any
Description: Python 2 and 3 compatibility library
 Six is a Python 2 and 3 compatibility library. It provides utility
 functions for smoothing over the differences between the Python versions
 with the goal of writing Python code that is compatible on both Python
 versions.
Homepage: https://github.com/benjaminp/six

Package: python3-urllib3
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 453
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: all
Source: python-urllib3
Version: 1.26.12-1+deb12u1
Depends: python3:any, python3-six
Recommends: ca-certificates
Suggests: python3-brotli, python3-cryptography, python3-idna, python3-openssl, python3-socks
Description: HTTP library with thread-safe connection pooling for Python3
 urllib3 supports features left out of urllib and urllib2 libraries.
 .
   - Re-use the same socket connection for multiple requests (HTTPConnectionPool
     and HTTPSConnectionPool) (with optional client-side certificate
     verification).
   - File posting (encode_multipart_formdata).
   - Built-in redirection and retries (optional).
   - Supports gzip and deflate decoding.
   - Thread-safe and sanity-safe.
   - Small and easy to understand codebase perfect for extending and
     building upon.
 .
 This package contains the Python 3 version of the library.
Homepage: https://urllib3.readthedocs.org

Package: python3-yaml
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 493
Maintainer: Debian Python Team <team+python@tracker.debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: pyyaml (6.0-3)
Version: 6.0-3+b2
Depends: python3 (<< 3.12), python3 (>= 3.11~), python3:any, libc6 (>= 2.14), libyaml-0-2 (>= 0.2.2~)
Description: YAML parser and emitter for Python3
 Python3-yaml is a complete YAML 1.1 parser and emitter for Python3.  It can
 parse all examples from the specification. The parsing algorithm is simple
 enough to be a reference for YAML parser implementors. A simple extension API
 is also provided.  The package is built using libyaml for improved speed.
Homepage: https://github.com/yaml/pyyaml

Package: python3.11
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 649
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: allowed
Version: 3.11.2-6+deb12u6
Depends: python3.11-minimal (= 3.11.2-6+deb12u6), libpython3.11-stdlib (= 3.11.2-6+deb12u6), media-types | mime-support
Recommends: ca-certificates
Suggests: python3.11-venv, python3.11-doc, binutils
Breaks: python3-all (<< 3.6.5~rc1-1), python3-dev (<< 3.6.5~rc1-1), python3-venv (<< 3.6.5-2)
Description: Interactive high-level object-oriented language (version 3.11)
 Python is a high-level, interactive, object-oriented language. Its 3.11 version
 includes an extensive class library with lots of goodies for
 network programming, system administration, sounds and graphics.

Package: python3.11-minimal
Status: install ok installed
Priority: optional
Section: python
Installed-Size: 6762
Maintainer: Matthias Klose <doko@debian.org>
Architecture: amd64
Multi-Arch: allowed
Source: python3.11
Version: 3.11.2-6+deb12u6
Depends: libpython3.11-minimal (= 3.11.2-6+deb12u6), libexpat1 (>= 2.1~beta3), zlib1g (>= 1:1.2.0)
Pre-Depends: libc6 (>= 2.35)
Recommends: python3.11
Suggests: binfmt-support
Conflicts: binfmt-support (<< 1.1.2)
Description: Minimal subset of the Python language (version 3.11)
 This package contains the interpreter and some essential modules.  It can
 be used in the boot process for some basic tasks.
 See /usr/share/doc/python3.11-minimal/README.Debian for a list of the modules
 contained in this package.
Cnf-Visible-Pkgname: python3.11

Package: readline-common
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 89
Maintainer: Matthias Klose <doko@debian.org>
Architecture: all
Multi-Arch: foreign
Source: readline
Version: 8.2-1.3
Replaces: libreadline-common, libreadline4 (<< 4.3-16), libreadline5 (<< 5.0-11)
Depends: dpkg (>= 1.15.4) | install-info
Suggests: readline-doc
Conflicts: libreadline-common, libreadline5 (<< 5.0-11)
Description: GNU readline and history libraries, common files
 The GNU readline library aids in the consistency of user interface
 across discrete programs that need to provide a command line
 interface.
 .
 The GNU history library provides a consistent user interface for
 recalling lines of previously typed input.

Package: redis-server
Status: install ok installed
Priority: optional
Section: database
Installed-Size: 183
Maintainer: Chris Lamb <lamby@debian.org>
Architecture: amd64
Source: redis
Version: 5:7.0.15-1~deb12u5
Depends: lsb-base (>= 3.2-14), redis-tools (= 5:7.0.15-1~deb12u5)
Pre-Depends: init-system-helpers (>= 1.54~)
Conffiles:
 /etc/default/redis-server 36255dd86b15accc2acd4db7f5e21f05
 /etc/init.d/redis-server 2a51c7aa28acf5d7244352e80d0b26ff
 /etc/logrotate.d/redis-server 420ce1e139dd2044c4a3e44a2781a0a3
 /etc/redis/redis.conf 3f070d8d3ef55ec295f647bec0cd3326
Description: Persistent key-value database with network interface
 Redis is a key-value database in a similar vein to memcache but the dataset
 is non-volatile. Redis additionally provides native support for atomically
 manipulating and querying data structures such as lists and sets.
 .
 The dataset is stored entirely in memory and periodically flushed to disk.
Homepage: https://redis.io/

Package: redis-tools
Status: install ok installed
Priority: optional
Section: database
Installed-Size: 5837
Maintainer: Chris Lamb <lamby@debian.org>
Architecture: amd64
Source: redis
Version: 5:7.0.15-1~deb12u5
Replaces: redis-server (<< 2:2.6.16-1)
Depends: adduser, libatomic1 (>= 4.8), libc6 (>= 2.34), libjemalloc2 (>= 3.5.0), liblzf1 (>= 1.5), libssl3 (>= 3.0.0), libsystemd0
Suggests: ruby-redis
Breaks: redis-server (<< 2:2.6.16-1)
Description: Persistent key-value database with network interface (client)
 Redis is a key-value database in a similar vein to memcache but the dataset
 is non-volatile. Redis additionally provides native support for atomically
 manipulating and querying data structures such as lists and sets.
 .
 This package contains the command line client and other tools.
Homepage: https://redis.io/

Package: reportbug
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 190
Maintainer: Reportbug Maintainers <debian-reportbug@lists.debian.org>
Architecture: all
Version: 12.0.0
Depends: apt, python3-reportbug (= 12.0.0), sensible-utils, python3:any
Suggests: claws-mail (>= 3.8.0), debconf, debsums (>= 2.0.47), default-mta | postfix | exim4 | mail-transport-agent, dlocate, emacs-bin-common, file (>> 1.30), gnupg | pgp, python3-urwid, reportbug-gtk (= 12.0.0), xdg-utils
Conffiles:
 /etc/reportbug.conf 705322b9a62d3b68f7edde9beeb31522
Description: reports bugs in the Debian distribution
 reportbug is a tool designed to make the reporting of bugs in Debian
 and derived distributions relatively painless.  Its features include:
 .
  * Integration with many mail user agents.
  * Access to outstanding bug reports to make it easier to identify
    whether problems have already been reported.
  * Automatic checking for newer versions of packages.
  * Optional automatic verification of integrity of packages via debsums.
  * Support for following-up on outstanding reports.
  * Optional PGP/GnuPG integration.
 .
 Bug reporting in Debian relies on email; reportbug can use a local
 mail transport agent (like exim or sendmail), submit directly through
 an external mail server, or pass messages to an installed mail user
 agent (e.g., mutt) for submission.
 .
 This package also includes the "querybts" script for browsing the
 Debian bug tracking system.

Package: rpcbind
Status: install ok installed
Priority: optional
Section: net
Installed-Size: 158
Maintainer: Josue Ortega <josue@debian.org>
Architecture: amd64
Source: rpcbind (1.2.6-6)
Version: 1.2.6-6+b1
Replaces: libc-bin (<< 2.16)
Provides: portmap
Depends: libc6 (>= 2.34), libsystemd0, libtirpc3 (>= 1.0.2), libwrap0 (>= 7.6-4~), lsb-base (>= 4.1+Debian3), adduser
Pre-Depends: init-system-helpers (>= 1.54~)
Breaks: libc-bin (<< 2.16)
Conflicts: portmap
Conffiles:
 /etc/default/rpcbind ee5f5f475d29ec8c38c391eeedf12e1b
 /etc/init.d/rpcbind 93b456a865b0633ee4e7b8be1cc88197
 /etc/insserv.conf.d/rpcbind 669a5c3a6ffa8b5b5ce263057934d118
Description: converts RPC program numbers into universal addresses
 The rpcbind utility is a server that converts RPC program numbers
 into universal addresses.
Homepage: http://sourceforge.net/projects/rpcbind/

Package: rpcsvc-proto
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 246
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.4.3-1
Replaces: libc-dev-bin (<< 2.31-14), libc6-dev (<< 2.31-14)
Depends: libc6 (>= 2.34)
Breaks: libc-dev-bin (<< 2.31-14), libc6-dev (<< 2.31-14)
Description: RPC protocol compiler and definitions
 rpcgen is a tool that generates C code to implement an RPC protocol. The input
 to rpcgen is a language similar to C known as RPC Language (Remote Procedure
 Call Language).
 .
 This package also includes several rpcsvc header files and RPC protocol
 definitions from SunRPC sources that were previously shipped by glibc.
Homepage: https://github.com/thkukuk/rpcsvc-proto

Package: runit-helper
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 19
Maintainer: Lorenzo Puliti <plorenzo@disroot.org>
Architecture: all
Multi-Arch: foreign
Source: dh-runit
Version: 2.15.2
Description: dh-runit implementation detail
 runit-helper provides code, which actually perform actions on system
 users on behalf of dh-runit package. This separation allows packages
 take advantage of improvement or fixes in 'dh-runit' without
 rebuilding.
 .
 This package is implementation detail of 'dh-runit'. It should never
 be installed manually. No assumption about its content can be made.
Homepage: https://salsa.debian.org/debian/dh-runit

Package: screen
Status: install ok installed
Priority: standard
Section: misc
Installed-Size: 997
Maintainer: Axel Beckert <abe@debian.org>
Architecture: amd64
Version: 4.9.0-4
Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libpam0g (>= 0.99.7.1), libtinfo6 (>= 6), libutempter0 (>= 1.1.5), debianutils (>= 5.3-1~)
Suggests: byobu | screenie | iselect (>= 1.4.0-1), ncurses-term
Conffiles:
 /etc/init.d/screen-cleanup 44ec7824f5ef10df73e92ad064331ea0
 /etc/screenrc 12c245238eb8b653625bba27dc81df6a
Description: terminal multiplexer with VT100/ANSI terminal emulation
 GNU Screen is a terminal multiplexer that runs several separate "screens" on
 a single physical character-based terminal. Each virtual terminal emulates a
 DEC VT100 plus several ANSI X3.64 and ISO 2022 functions. Screen sessions
 can be detached and resumed later on a different terminal.
 .
 Screen also supports a whole slew of other features, including configurable
 input and output translation, serial port support, configurable logging,
 and multi-user support.
Homepage: https://savannah.gnu.org/projects/screen

Package: sed
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 987
Maintainer: Clint Adams <clint@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 4.9-1
Pre-Depends: libacl1 (>= 2.2.23), libc6 (>= 2.34), libselinux1 (>= 3.1~)
Description: GNU stream editor for filtering/transforming text
 sed reads the specified files or the standard input if no
 files are specified, makes editing changes according to a
 list of commands, and writes the results to the standard
 output.
Homepage: https://www.gnu.org/software/sed/

Package: sensible-utils
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 56
Maintainer: Anibal Monsalve Salazar <anibal@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 0.0.17+nmu1
Replaces: debianutils (<= 2.32.3), manpages-pl (<= 20060617-3~)
Description: Utilities for sensible alternative selection
 This package provides a number of small utilities which are used
 by programs to sensibly select and spawn an appropriate browser,
 editor, or pager.
 .
 The specific utilities included are: sensible-browser sensible-editor
 sensible-pager

Package: shared-mime-info
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 5030
Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.2-1
Depends: libc6 (>= 2.33), libglib2.0-0 (>= 2.35.9), libxml2 (>= 2.7.4)
Description: FreeDesktop.org shared MIME database and spec
 This is the shared MIME-info database from the X Desktop Group. It is required
 by any program complying to the Shared MIME-Info Database spec, which is also
 included in this package.
 .
 At this time at least ROX, GNOME, KDE and Xfce use this database.
Homepage: https://freedesktop.org/wiki/Software/shared-mime-info

Package: sleuthkit
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 1607
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Architecture: amd64
Source: sleuthkit (4.11.1+dfsg-1)
Version: 4.11.1+dfsg-1+b1
Depends: file, libdate-manip-perl, perl:any, libafflib0v5 (>= 3.7.6), libc6 (>= 2.34), libewf2 (>= 20130416), libgcc-s1 (>= 4.2), libstdc++6 (>= 11), libtsk19 (>= 4.11.1+dfsg), libvhdi1 (>= 20150110), libvmdk1 (>= 20150516)
Suggests: autopsy, mac-robber
Conflicts: tct
Description: tools for forensics analysis on volume and filesystem data
 The Sleuth Kit, also known as TSK, is a collection of UNIX-based command
 line file and volume system forensic analysis tools. The filesystem tools
 allow you to examine filesystems of a suspect computer in a non-intrusive
 fashion. Because the tools do not rely on the operating system to process the
 filesystems, deleted and hidden content is shown.
 .
 The volume system (media management) tools allow you to examine the layout of
 disks and other media. You can also recover deleted files, get information
 stored in slack spaces, examine filesystems journal, see partitions layout on
 disks or images etc. But is very important clarify that the TSK acts over the
 current filesystem only.
 .
 The Sleuth Kit supports DOS partitions, BSD partitions (disk labels), Mac
 partitions, Sun slices (Volume Table of Contents), and GPT disks. With these
 tools, you can identify where partitions are located and extract them so that
 they can be analyzed with filesystem analysis tools.
 .
 Currently, TSK supports several filesystems, as NTFS, FAT, exFAT, HFS+, Ext3,
 Ext4, UFS and YAFFS2.
 .
 This package contains the set of command line tools in The Sleuth Kit.
Homepage: http://www.sleuthkit.org/sleuthkit

Package: sudo
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 6054
Maintainer: Sudo Maintainers <sudo@packages.debian.org>
Architecture: amd64
Version: 1.9.13p3-1+deb12u2
Replaces: sudo-ldap
Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), zlib1g (>= 1:1.2.0.2), libpam-modules
Pre-Depends: init-system-helpers (>= 1.54~)
Conflicts: sudo-ldap
Conffiles:
 /etc/init.d/sudo 4fd40c92739a3bb2242df7cc6af126df
 /etc/pam.d/sudo 7fa5090826481c517f23faa1e21c77a8
 /etc/pam.d/sudo-i 95199b1f3d5a60bcf98058d9f8b70e70
 /etc/sudo.conf 8c714b777580faea54a2eb6d5f17ad1d
 /etc/sudo_logsrvd.conf ad0ba586da300ae3ba46312ad744a6e2
 /etc/sudoers da8bee36494c904ba767f0dd58920878
 /etc/sudoers.d/README 44c75ff004a18eeefdde4c998914d6d3
Description: Provide limited super user privileges to specific users
 Sudo is a program designed to allow a sysadmin to give limited root
 privileges to users and log root activity.  The basic philosophy is to give
 as few privileges as possible but still allow people to get their work done.
 .
 This version is built with minimal shared library dependencies, use the
 sudo-ldap package instead if you need LDAP support for sudoers.
Homepage: https://www.sudo.ws/

Package: systemd
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 9667
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 252.38-1~deb12u1
Provides: systemd-sysusers (= 252.38-1~deb12u1), systemd-tmpfiles (= 252.38-1~deb12u1)
Depends: libacl1 (>= 2.2.23), libaudit1 (>= 1:2.2.1), libblkid1 (>= 2.24.2), libcryptsetup12 (>= 2:2.4), libfdisk1 (>= 2.33), libkmod2 (>= 15), libp11-kit0 (>= 0.23.18.1), libseccomp2 (>= 2.3.1), libsystemd-shared (= 252.38-1~deb12u1), libsystemd0 (= 252.38-1~deb12u1), mount
Pre-Depends: libblkid1 (>= 2.24), libc6 (>= 2.34), libcap2 (>= 1:2.10), libgcrypt20 (>= 1.10.0), liblz4-1 (>= 0.0~r122), liblzma5 (>= 5.1.1alpha+20120614), libmount1 (>= 2.30), libselinux1 (>= 3.1~), libssl3 (>= 3.0.0), libzstd1 (>= 1.5.2)
Recommends: default-dbus-system-bus | dbus-system-bus, systemd-timesyncd | time-daemon
Suggests: systemd-container, systemd-homed, systemd-userdbd, systemd-boot, systemd-resolved, libfido2-1, libqrencode4, libtss2-esys-3.0.2-0, libtss2-mu0, libtss2-rc0, polkitd | policykit-1
Breaks: less (<< 563), resolvconf (<< 1.83~), sicherboot (<< 0.1.6), udev (<< 247~)
Conflicts: consolekit, libpam-ck-connector, systemd-shim
Conffiles:
 /etc/systemd/journald.conf d2187d732ab2911016a4d4017c155dbb
 /etc/systemd/logind.conf 8276eeafa20aa65e6a5dca3bdcddafb4
 /etc/systemd/networkd.conf f461eed370e565cbe9890dd6b2c43996
 /etc/systemd/pstore.conf ea1d43113c41edaacb39180d60a50b08
 /etc/systemd/sleep.conf 72e9b6cd3c3c7c2abbe19564771336d0
 /etc/systemd/system.conf 36ace4ee4543e277db35948826aa6979
 /etc/systemd/user.conf a908ebf52cb61e955dcf6b6662666c8d
Description: system and service manager
 systemd is a system and service manager for Linux. It provides aggressive
 parallelization capabilities, uses socket and D-Bus activation for starting
 services, offers on-demand starting of daemons, keeps track of processes using
 Linux control groups, maintains mount and automount points and implements an
 elaborate transactional dependency-based service control logic.
 .
 Installing the systemd package will not switch your init system unless you
 boot with init=/lib/systemd/systemd or install systemd-sysv in addition.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: systemd-sysv
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 73
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: systemd
Version: 252.38-1~deb12u1
Replaces: sysvinit-core
Pre-Depends: systemd
Recommends: libpam-systemd, libnss-systemd
Conflicts: file-rc, systemd-shim, sysvinit-core
Description: system and service manager - SysV compatibility symlinks
 This package provides manual pages and compatibility symlinks needed for
 systemd to replace sysvinit.
 .
 Installing systemd-sysv will overwrite /sbin/init with a symlink to systemd.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: systemd-timesyncd
Status: install ok installed
Priority: standard
Section: admin
Installed-Size: 147
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: systemd
Version: 252.38-1~deb12u1
Replaces: systemd (<< 245.4-2~), time-daemon
Provides: time-daemon
Depends: libc6 (>= 2.34), libsystemd-shared (= 252.38-1~deb12u1), systemd
Breaks: systemd (<< 245.4-2~)
Conflicts: time-daemon
Conffiles:
 /etc/dhcp/dhclient-exit-hooks.d/timesyncd c66e563f4050725592e2da20a4e1bfef
 /etc/systemd/timesyncd.conf 9bca5bc8be90d2921301a24084ffcd55
Description: minimalistic service to synchronize local time with NTP servers
 The package contains the systemd-timesyncd system service that may be used to
 synchronize the local system clock with a remote Network Time Protocol server.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: sysvinit-utils
Essential: yes
Status: install ok installed
Priority: required
Section: admin
Installed-Size: 100
Maintainer: Debian sysvinit maintainers <debian-init-diversity@chiark.greenend.org.uk>
Architecture: amd64
Multi-Arch: foreign
Source: sysvinit
Version: 3.06-4
Replaces: lsb-base
Provides: lsb-base (= 11.1.0)
Depends: libc6 (>= 2.34)
Conflicts: lsb-base (<< 11.3~)
Description: System-V-like utilities
 This package contains the important System-V-like utilities.
 .
 Specifically, this package includes:
 init-d-script, fstab-decode, killall5, pidof
 .
 It also contains the library scripts sourced by init-d-script and other
 initscripts that were formally in lsb-base.
Homepage: https://github.com/slicer69/sysvinit

Package: tar
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 3144
Maintainer: Janos Lenart <ocsi@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.34+dfsg-1.2+deb12u1
Replaces: cpio (<< 2.4.2-39)
Pre-Depends: libacl1 (>= 2.2.23), libc6 (>= 2.34), libselinux1 (>= 3.1~)
Suggests: bzip2, ncompress, xz-utils, tar-scripts, tar-doc
Breaks: dpkg-dev (<< 1.14.26)
Conflicts: cpio (<= 2.4.2-38)
Description: GNU version of the tar archiving utility
 Tar is a program for packaging a set of files as a single archive in tar
 format.  The function it performs is conceptually similar to cpio, and to
 things like PKZIP in the DOS world.  It is heavily used by the Debian package
 management system, and is useful for performing system backups and exchanging
 sets of files with others.
Homepage: https://www.gnu.org/software/tar/

Package: task-english
Status: install ok installed
Priority: optional
Section: tasks
Installed-Size: 6
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Source: tasksel
Version: 3.73
Depends: tasksel (= 3.73), locales
Recommends: util-linux-locales, ibritish, iamerican
Description: General English environment
 This task installs packages and documentation in British
 and American English to help English speaking people use Debian.

Package: task-ssh-server
Status: install ok installed
Priority: optional
Section: tasks
Installed-Size: 6
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Source: tasksel
Version: 3.73
Depends: tasksel (= 3.73), openssh-server
Recommends: openssh-client
Description: SSH server
 This task sets up your system to be remotely accessed through SSH
 connections.

Package: tasksel
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 347
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Version: 3.73
Depends: debconf (>= 0.5) | debconf-2.0, liblocale-gettext-perl, apt, tasksel-data
Pre-Depends: debconf | cdebconf
Conflicts: base-config (<< 2.32)
Description: tool for selecting tasks for installation on Debian systems
 This package provides 'tasksel', a simple interface for users who
 want to configure their system to perform a specific task.

Package: tasksel-data
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 211
Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
Architecture: all
Source: tasksel
Version: 3.73
Depends: tasksel (= 3.73)
Recommends: laptop-detect
Description: official tasks used for installation of Debian systems
 This package contains data about the standard tasks available on a Debian
 system.

Package: thin-provisioning-tools
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 1404
Maintainer: Debian LVM Team <team+lvm@tracker.debian.org>
Architecture: amd64
Version: 0.9.0-2
Depends: libaio1 (>= 0.3.93), libc6 (>= 2.33), libexpat1 (>= 2.0.1), libgcc-s1 (>= 3.0), libstdc++6 (>= 11)
Description: Tools for handling thinly provisioned device-mapper meta-data
 This package contains tools to handle meta-data from the device-mapper
 thin target.  This target allows the use of a single backing store for multiple
 thinly provisioned volumes.  Numerous snapshots can be taken from such
 volumes.  The tools can check the meta-data for consistency, repair damaged
 information and dump or restore the meta-data in textual form.

Package: traceroute
Status: install ok installed
Priority: important
Section: net
Installed-Size: 155
Maintainer: Laszlo Boszormenyi (GCS) <gcs@debian.org>
Architecture: amd64
Version: 1:2.1.2-1
Depends: libc6 (>= 2.34)
Description: Traces the route taken by packets over an IPv4/IPv6 network
 The traceroute utility displays the route used by IP packets on their way to a
 specified network (or Internet) host. Traceroute displays the IP number and
 host name (if possible) of the machines along the route taken by the packets.
 Traceroute is used as a network debugging tool. If you're having network
 connectivity problems, traceroute will show you where the trouble is coming
 from along the route.
 .
 Install traceroute if you need a tool for diagnosing network connectivity
 problems.
Homepage: https://traceroute.sourceforge.net/

Package: tree
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 113
Maintainer: Florian Ernst <florian@debian.org>
Architecture: amd64
Version: 2.1.0-1
Depends: libc6 (>= 2.34)
Description: displays an indented directory tree, in color
 Tree is a recursive directory listing command that produces a depth indented
 listing of files, which is colorized ala dircolors if the LS_COLORS environment
 variable is set and output is to tty.
Homepage: http://mama.indstate.edu/users/ice/tree/

Package: tzdata
Status: install ok installed
Priority: required
Section: localization
Installed-Size: 2563
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Version: 2025b-0+deb12u1
Provides: tzdata-bookworm
Depends: debconf (>= 0.5) | debconf-2.0
Description: time zone and daylight-saving time data
 This package contains data required for the implementation of
 standard local time for many representative locations around the
 globe. It is updated periodically to reflect changes made by
 political bodies to time zone boundaries, UTC offsets, and
 daylight-saving rules.
Homepage: https://www.iana.org/time-zones

Package: ucf
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 214
Maintainer: Manoj Srivastava <srivasta@debian.org>
Architecture: all
Multi-Arch: foreign
Version: 3.0043+nmu1+deb12u1
Depends: debconf (>= 0.5) | debconf-2.0, sensible-utils
Conffiles:
 /etc/ucf.conf 5565b8b26108c49ba575ba452cd69b3e
Description: Update Configuration File(s): preserve user changes to config files
 Debian policy mandates that user changes to configuration files must be
 preserved during package upgrades. The easy way to achieve this behavior
 is to make the configuration file a 'conffile', in which case dpkg
 handles the file specially during upgrades, prompting the user as
 needed.
 .
 This is appropriate only if it is possible to distribute a default
 version that will work for most installations, although some system
 administrators may choose to modify it. This implies that the
 default version will be part of the package distribution, and must
 not be modified by the maintainer scripts during installation (or at
 any other time).
 .
 This script attempts to provide conffile-like handling for files that
 may not be labelled conffiles, and are not shipped in a Debian package,
 but handled by the postinst instead. This script allows one to
 maintain files in /etc, preserving user changes and in general
 offering the same facilities while upgrading that dpkg normally
 provides for 'conffiles'.
 .
 Additionally, this script provides facilities for transitioning a
 file that had not been provided with conffile-like protection to come
 under this schema, and attempts to minimize questions asked at
 installation time. Indeed, the transitioning facility is better than the
 one offered by dpkg while transitioning a file from a non-conffile to
 conffile status.

Package: udev
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 10788
Maintainer: Debian systemd Maintainers <pkg-systemd-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: systemd
Version: 252.38-1~deb12u1
Depends: libacl1 (>= 2.2.23), libblkid1 (>= 2.37.2), libc6 (>= 2.34), libcap2 (>= 1:2.10), libkmod2 (>= 15), libselinux1 (>= 3.1~), adduser, libudev1 (= 252.38-1~deb12u1)
Conffiles:
 /etc/init.d/udev e9424814d107af7d8f58a22b1011810a
 /etc/udev/udev.conf bf60be80a4cc51271a1618edf5a6d66f
Description: /dev/ and hotplug management daemon
 udev is a daemon which dynamically creates and removes device nodes from
 /dev/, handles hotplug events and loads drivers at boot time.
Homepage: https://www.freedesktop.org/wiki/Software/systemd

Package: ufw
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 857
Maintainer: Jamie Strandboge <jdstrand@ubuntu.com>
Architecture: all
Version: 0.36.2-1
Depends: iptables, ucf, python3:any, debconf (>= 0.5) | debconf-2.0
Suggests: rsyslog
Breaks: iptables-persistent, netfilter-persistent
Conffiles:
 /etc/default/ufw a921dd9d167380b04de4bc911915ea44
 /etc/init.d/ufw 4156943ab8a824fcf4b04cc1362eb230
 /etc/logrotate.d/ufw 969308e0ddfb74505f0da47b49ada218
 /etc/rsyslog.d/20-ufw.conf 98e2f72c9c65ca8d6299886b524e80d1
 /etc/ufw/applications.d/ufw-bittorent d9451245a3fb2aa85ed91533ce530f27
 /etc/ufw/applications.d/ufw-chat 73204a7a2819499d7802bc83b7e63ee9
 /etc/ufw/applications.d/ufw-directoryserver 28888bb4f7fa81ea2ca23bb86995df5b
 /etc/ufw/applications.d/ufw-dnsserver 7a2634d40515a5baab2d5b355873e1e6
 /etc/ufw/applications.d/ufw-fileserver d43adc11063000fc3c1a824071382047
 /etc/ufw/applications.d/ufw-loginserver 366b3845c4360ea626f78875a400446b
 /etc/ufw/applications.d/ufw-mailserver 37e7910a1da915bcf60dac1c2d157377
 /etc/ufw/applications.d/ufw-printserver 47e009dc96a9eac7b3f2c2483a889756
 /etc/ufw/applications.d/ufw-proxyserver 6e035b6921d41aeee89c3d5867c593c5
 /etc/ufw/applications.d/ufw-webserver 07a41595f0b2c9865b7220bea998f8cf
 /etc/ufw/sysctl.conf 7723079fc108eda8f57eddab3079c70a
Description: program for managing a Netfilter firewall
 The Uncomplicated FireWall is a front-end for iptables, to make managing a
 Netfilter firewall easier. It provides a command line interface with syntax
 similar to OpenBSD's Packet Filter. It is particularly well-suited as a
 host-based firewall.
Homepage: https://launchpad.net/ufw

Package: unattended-upgrades
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 301
Maintainer: Michael Vogt <mvo@debian.org>
Architecture: all
Version: 2.9.1+nmu3
Depends: debconf (>= 0.5) | debconf-2.0, debconf, python3, python3-apt (>= 1.9.6~), python3-dbus, python3-distro-info, ucf, lsb-release, lsb-base, xz-utils
Recommends: systemd-sysv | cron | cron-daemon | anacron
Suggests: bsd-mailx, default-mta | mail-transport-agent, needrestart, powermgmt-base, python3-gi
Conffiles:
 /etc/init.d/unattended-upgrades 290829a5efc55b7c435de0bb769f217b
 /etc/kernel/postinst.d/unattended-upgrades 21f0ac567d9738d1a017fc16e0150a35
 /etc/logrotate.d/unattended-upgrades e45049ee847f069a99e3e6ec39155d4a
 /etc/pm/sleep.d/10_unattended-upgrades-hibernate 0f5d54aa2dd322c805c90e409fc2724a
 /etc/update-motd.d/92-unattended-upgrades afa7546d3fe561e1f5783f7b9cf72096
Description: automatic installation of security upgrades
 This package can download and install security upgrades automatically
 and unattended, taking care to only install packages from the
 configured APT source, and checking for dpkg prompts about
 configuration file changes.
 .
 This script is the backend for the APT::Periodic::Unattended-Upgrade
 option.

Package: usbutils
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 320
Maintainer: Aurelien Jarno <aurel32@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1:014-1+deb12u1
Depends: libc6 (>= 2.34), libudev1 (>= 196), libusb-1.0-0 (>= 2:1.0.22)
Breaks: hwdata (<< 0.334-1~), isenkram (<< 0.45~), kinfocenter (<< 4:5.14.5-2~), libosinfo-1.0-0 (<< 1.8.0-1~), usbip (<< 2.0+5.10.4-1~)
Description: Linux USB utilities
 This package contains the lsusb utility for inspecting the devices
 connected to the USB bus. It shows a graphical representation of the
 devices that are currently plugged in, showing the topology of the
 USB bus. It also displays information on each individual device on
 the bus.
Homepage: https://github.com/gregkh/usbutils

Package: usr-is-merged
Status: install ok installed
Priority: optional
Section: oldlibs
Installed-Size: 13
Maintainer: Marco d'Itri <md@linux.it>
Architecture: all
Multi-Arch: foreign
Source: usrmerge
Version: 37~deb12u1
Breaks: cruft-ng (<< 0.4.4~), initramfs-tools (<< 0.121~)
Conflicts: acl (<< 2.2.52-3~), arptables (<< 0.0.4+snapshot20181021-1~), coreutils (<< 8.24-1~), cruft (<< 0.9.44~), cryptsetup (<< 2:1.7.0-1~), davfs2 (<< 1.5.2-1.2~), debianutils (<< 4.5~), dhcpcd (<< 1:5~), ebtables (<< 2.0.10.4+snapshot20181205-1~), elvis-tiny (<< 1.4-24~), kbd (<< 2.0.4-4~), ksh (<< 93u+20120801-3.1~), less (<< 481-2~), libbrlapi-dev (<< 5.3.1-1~), libc0.1 (<< 2.35-4), libc0.3 (<< 2.35-4), libc6 (<< 2.35-4), libc6.1 (<< 2.35-4), libdm0-dev, libjson-c-dev (<< 0.12.1-1.1~), libparted1.8-10 (<< 1.8.8.git.2008.03.24-11.2~), libpng12-0 (<< 1.2.54-6~), libusb-0.1-4 (<< 2:0.1.12-28~), lustre-utils (<< 1.8.5+dfsg-3.2~), mksh (<< 52b-1~), molly-guard (<< 0.7.1+exp1~), musl-dev (<< 1.1.9-1.1~), nano (<< 2.3.99pre3-1~), open-iscsi (<< 2.0.873+git0.3b4b4500-13~), open-vm-tools (<< 2:10.0.5-3227872-2~), policycoreutils (<< 2.4-4~), safe-rm (<< 0.12-6~), tcsh (<< 6.18.01-4~), vsearch (<< 1.9.5-2~), xfsdump (<< 3.1.6+nmu1~), xfslibs-dev (<< 4.9.0+nmu1~), yp-tools (<< 3.3-5~), zsh (<< 5.2-4~)
Description: Transitional package to assert a merged-/usr system
 This package can be successfully installed only on merged-/usr systems.
 .
 It can be safely removed once no other package depends on it anymore.
Homepage: https://wiki.debian.org/UsrMerge

Package: util-linux
Essential: yes
Status: install ok installed
Priority: required
Section: utils
Installed-Size: 4978
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 2.38.1-5+deb12u3
Replaces: hardlink
Provides: hardlink
Depends: util-linux-extra
Pre-Depends: libblkid1 (>= 2.37.2), libc6 (>= 2.34), libcap-ng0 (>= 0.7.9), libcrypt1 (>= 1:4.1.0), libmount1 (>= 2.38), libpam0g (>= 0.99.7.1), libselinux1 (>= 3.1~), libsmartcols1 (>= 2.38), libsystemd0, libtinfo6 (>= 6), libudev1 (>= 183), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4)
Recommends: sensible-utils
Suggests: dosfstools, kbd, util-linux-locales
Conflicts: hardlink
Conffiles:
 /etc/pam.d/runuser b8b44b045259525e0fae9e38fdb2aeeb
 /etc/pam.d/runuser-l 2106ea05877e8913f34b2c77fa02be45
 /etc/pam.d/su 60fbbe65c90d741bc0d380543cefe8af
 /etc/pam.d/su-l 756fef5687fecc0d986e5951427b0c4f
Description: miscellaneous system utilities
 This package contains a number of important utilities, most of which
 are oriented towards maintenance of your system. Some of the more
 important utilities included in this package allow you to view kernel
 messages, create new filesystems, view block device information,
 interface with real time clock, etc.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: util-linux-extra
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 366
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Replaces: util-linux (<< 2.38~)
Depends: libaudit1 (>= 1:2.2.1), libc6 (>= 2.34), libsmartcols1 (>= 2.38)
Breaks: util-linux (<< 2.38~)
Conffiles:
 /etc/default/hwclock 02f94aaf57aff4e2e6751ec7b877a997
 /etc/init.d/hwclock.sh c06bc68c12cbdd9c7f60ba25ee587efe
Description: interactive login tools
 Tools commonly found on systems where humans login interactively,
 or are needed with non-standard system configurations.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: util-linux-locales
Status: install ok installed
Priority: optional
Section: localization
Installed-Size: 7969
Maintainer: util-linux packagers <util-linux@packages.debian.org>
Architecture: all
Multi-Arch: foreign
Source: util-linux
Version: 2.38.1-5+deb12u3
Depends: util-linux (>= 2.38.1)
Description: locales files for util-linux
 This package contains the internationalization files for the util-linux
 package.
 .
 They are needed when you want the programs in util-linux to print their
 messages in other languages than English.
Homepage: https://www.kernel.org/pub/linux/utils/util-linux/

Package: vim-common
Status: install ok installed
Priority: important
Section: editors
Installed-Size: 245
Maintainer: Debian Vim Maintainers <team+vim@tracker.debian.org>
Architecture: all
Multi-Arch: foreign
Source: vim
Version: 2:9.0.1378-2+deb12u2
Recommends: xxd, vim | vim-gtk3 | vim-motif | vim-nox | vim-tiny
Conffiles:
 /etc/vim/vimrc a28f17fea43e405b96cdffd3d6522382
Description: Vi IMproved - Common files
 Vim is an almost compatible version of the UNIX editor Vi.
 .
 This package contains files shared by all non GUI-enabled vim variants
 available in Debian.  Examples of such shared files are: manpages and
 configuration files.
Homepage: https://www.vim.org/

Package: vim-tiny
Status: install ok installed
Priority: important
Section: editors
Installed-Size: 1689
Maintainer: Debian Vim Maintainers <team+vim@tracker.debian.org>
Architecture: amd64
Source: vim
Version: 2:9.0.1378-2+deb12u2
Provides: editor
Depends: vim-common (= 2:9.0.1378-2+deb12u2), libacl1 (>= 2.2.23), libc6 (>= 2.34), libselinux1 (>= 3.1~), libtinfo6 (>= 6)
Suggests: indent
Conffiles:
 /etc/vim/vimrc.tiny 750b961d2a0bb4851c7a924cb428a72f
Description: Vi IMproved - enhanced vi editor - compact version
 Vim is an almost compatible version of the UNIX editor Vi.
 .
 This package contains a minimal version of Vim compiled with no GUI and
 a small subset of features. This package's sole purpose is to provide
 the vi binary for base installations.
 .
 If a vim binary is wanted, try one of the following more featureful
 packages: vim, vim-nox, vim-motif, or vim-gtk3.
Homepage: https://www.vim.org/

Package: wamerican
Status: install ok installed
Priority: standard
Section: text
Installed-Size: 1004
Maintainer: Don Armstrong <don@debian.org>
Architecture: all
Multi-Arch: foreign
Source: scowl
Version: 2020.12.07-2
Provides: wordlist
Depends: debconf (>= 0.5) | debconf-2.0
Description: American English dictionary words for /usr/share/dict
 This package provides the file /usr/share/dict/american-english
 containing a list of English words with American spellings.
 This list can be used by spelling checkers, and by programs such
 as look(1).
 .
 There are also -small, -large, and -huge versions of this word list,
 and there are wbritish* and wcanadian* packages as well.
Homepage: http://wordlist.sourceforge.net/

Package: wget
Status: install ok installed
Priority: standard
Section: web
Installed-Size: 3521
Maintainer: Noël Köthe <noel@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.21.3-1+deb12u1
Depends: libc6 (>= 2.34), libgnutls30 (>= 3.7.5), libidn2-0 (>= 0.6), libnettle8, libpcre2-8-0 (>= 10.22), libpsl5 (>= 0.16.0), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4)
Recommends: ca-certificates
Conflicts: wget-ssl
Conffiles:
 /etc/wgetrc c43064699caf6109f4b3da0405c06ebb
Description: retrieves files from the web
 Wget is a network utility to retrieve files from the web
 using HTTP(S) and FTP, the two most widely used internet
 protocols. It works non-interactively, so it will work in
 the background, after having logged off. The program supports
 recursive retrieval of web-authoring pages as well as FTP
 sites -- you can use Wget to make mirrors of archives and
 home pages or to travel the web like a WWW robot.
 .
 Wget works particularly well with slow or unstable connections
 by continuing to retrieve a document until the document is fully
 downloaded. Re-getting files from where it left off works on
 servers (both HTTP and FTP) that support it. Both HTTP and FTP
 retrievals can be time stamped, so Wget can see if the remote
 file has changed since the last retrieval and automatically
 retrieve the new version if it has.
 .
 Wget supports proxy servers; this can lighten the network load,
 speed up retrieval, and provide access behind firewalls.
Homepage: https://www.gnu.org/software/wget/

Package: whiptail
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 57
Maintainer: Alastair McKinstry <mckinstry@debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: newt (0.52.23-1)
Version: 0.52.23-1+b1
Depends: libc6 (>= 2.34), libnewt0.52 (>= 0.52.23), libpopt0 (>= 1.14), libslang2 (>= 2.2.4)
Description: Displays user-friendly dialog boxes from shell scripts
 Whiptail is a "dialog" replacement using newt instead of ncurses. It
 provides a method of displaying several different types of dialog boxes
 from shell scripts. This allows a developer of a script to interact with
 the user in a much friendlier manner.
Homepage: https://pagure.io/newt

Package: xauth
Status: install ok installed
Priority: optional
Section: x11
Installed-Size: 81
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1:1.1.2-1
Depends: libc6 (>= 2.34), libx11-6, libxau6 (>= 1:1.0.9), libxext6, libxmuu1 (>= 2:1.1.3)
Description: X authentication utility
 xauth is a small utility to read and manipulate Xauthority files, which
 are used by servers and clients alike to control authentication and access
 to X sessions.

Package: xdg-user-dirs
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 376
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 0.18-1
Depends: libc6 (>= 2.34)
Conffiles:
 /etc/xdg/autostart/xdg-user-dirs.desktop 19075979fa4ac105aa08763bd68e9589
 /etc/xdg/user-dirs.conf 602a95ec7fe4068512bebb712c41102d
 /etc/xdg/user-dirs.defaults b8595963fe74aeb65e854ba9da7f1acb
Description: tool to manage well known user directories
 xdg-user-dirs is a tool to help manage "well known" user directories
 like the desktop folder and the music folder. It also handles
 localization (i.e. translation) of the filenames.
 .
 The way it works is that xdg-user-dirs-update is run very early in the
 login phase. This program reads a configuration file, and a set of
 default directories. It then creates localized versions of these
 directories in the users home directory and sets up a config file in
 $(XDG_CONFIG_HOME)/user-dirs.dirs (XDG_CONFIG_HOME defaults to
 ~/.config) that applications can read to find these directories.
Homepage: https://www.freedesktop.org/wiki/Software/xdg-user-dirs

Package: xen-guest-agent
Status: install ok installed
Priority: optional
Section: unknown
Installed-Size: 3720
Maintainer: Yann Dirson <yann.dirson@vates.tech>
Architecture: amd64
Version: 0.4.0
Replaces: xe-guest-utilities
Depends: libc6 (>= 2.28), libgcc1 (>= 1:4.2)
Conflicts: xe-guest-utilities
Description: Guest Agent for Xen-based virtual machines
 This agent collects informations about the VM it runs inside of,
 and makes them avilable to the management toolstack.
Homepage: https://gitlab.com/xen-project/xen-guest-agent/

Package: xenstore-utils
Status: install ok installed
Priority: optional
Section: admin
Installed-Size: 110
Maintainer: Debian Xen Team <pkg-xen-devel@lists.alioth.debian.org>
Architecture: amd64
Source: xen
Version: 4.17.5+23-ga4e5191dc0-1+deb12u1
Replaces: xen-utils-common (<= 4.11.1~pre+1.733450b39b-1~)
Depends: libc6 (>= 2.34), libxenstore4 (>= 4.16.0)
Suggests: xen-doc
Breaks: xen-utils-common (<= 4.11.1~pre+1.733450b39b-1~)
Description: Xenstore command line utilities for Xen
 This package contains command line utilities for interacting with
 XenStore.
 .
 XenStore is a shared database used for interdomain communication of
 configuration and status information.  It is accessible to all domains
 running on the same Xen host.  See https://wiki.xen.org/wiki/XenStore for
 more information.
 .
 In the common case these tools are used by the Xen toolstack running in
 domain0 (or a driver domain) however they may also be used in a guest
 domain to support local scripting which wants to communicate via XenStore.
Homepage: https://xenproject.org/

Package: xkb-data
Status: install ok installed
Priority: optional
Section: x11
Installed-Size: 6925
Maintainer: Debian X Strike Force <debian-x@lists.debian.org>
Architecture: all
Multi-Arch: foreign
Source: xkeyboard-config
Version: 2.35.1-1
Breaks: libx11-6 (<< 2:1.4.3), x11-xkb-utils (<< 7.7+5)
Description: X Keyboard Extension (XKB) configuration data
 This package contains configuration data used by the X Keyboard
 Extension (XKB), which allows selection of keyboard layouts when
 using a graphical interface.
 .
 Every X11 vendor provides its own XKB data files, so keyboard layout
 designers have to send their layouts to several places.  The
 xkeyboard-config project has been launched at FreeDesktop in order
 to provide a central repository that could be used by all vendors.
Homepage: https://www.freedesktop.org/Software/XKeyboardConfig

Package: xz-utils
Status: install ok installed
Priority: standard
Section: utils
Installed-Size: 1226
Maintainer: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Architecture: amd64
Multi-Arch: foreign
Version: 5.4.1-1
Replaces: lzip (<< 1.8~rc2), manpages-de (<< 4.17.0-2~bpo11+1), manpages-fr (<< 4.17.0-2~bpo11+1), xz-lzma
Provides: lzma
Depends: libc6 (>= 2.34), liblzma5 (>= 5.4.0)
Breaks: lzip (<< 1.8~rc2), manpages-de (<< 4.17.0-2~bpo11+1), manpages-fr (<< 4.17.0-2~bpo11+1)
Conflicts: lzma (<< 9.22-1), xz-lzma
Description: XZ-format compression utilities
 XZ is the successor to the Lempel-Ziv/Markov-chain Algorithm
 compression format, which provides memory-hungry but powerful
 compression (often better than bzip2) and fast, easy decompression.
 .
 This package provides the command line tools for working with XZ
 compression, including xz, unxz, xzcat, xzgrep, and so on. They can
 also handle the older LZMA format, and if invoked via appropriate
 symlinks will emulate the behavior of the commands in the lzma
 package.
 .
 The XZ format is similar to the older LZMA format but includes some
 improvements for general use:
 .
  * 'file' magic for detecting XZ files;
  * crc64 data integrity check;
  * limited random-access reading support;
  * improved support for multithreading (not used in xz-utils);
  * support for flushing the encoder.
Homepage: https://tukaani.org/xz/

Package: zlib1g
Status: install ok installed
Priority: optional
Section: libs
Installed-Size: 168
Maintainer: Mark Brown <broonie@debian.org>
Architecture: amd64
Multi-Arch: same
Source: zlib
Version: 1:1.2.13.dfsg-1
Provides: libz1
Depends: libc6 (>= 2.14)
Breaks: libxml2 (<< 2.7.6.dfsg-2), texlive-binaries (<< 2009-12)
Conflicts: zlib1 (<= 1:1.0.4-7)
Description: compression library - runtime
 zlib is a library implementing the deflate compression method found
 in gzip and PKZIP.  This package includes the shared library.
Homepage: http://zlib.net/

Package: zstd
Status: install ok installed
Priority: optional
Section: utils
Installed-Size: 2102
Maintainer: RPM packaging team <team+pkg-rpm@tracker.debian.org>
Architecture: amd64
Multi-Arch: foreign
Source: libzstd
Version: 1.5.4+dfsg2-5
Depends: libc6 (>= 2.34), libgcc-s1 (>= 3.0), liblz4-1 (>= 1.8.0), liblzma5 (>= 5.1.1alpha+20120614), libstdc++6 (>= 12), zlib1g (>= 1:1.1.4)
Description: fast lossless compression algorithm -- CLI tool
 Zstd, short for Zstandard, is a fast lossless compression algorithm, targeting
 real-time compression scenarios at zlib-level compression ratio.
 .
 This package contains the CLI program implementing zstd.
Homepage: https://github.com/facebook/zstd

                                                                                                                                                                                                                                                                                                                                                                                                                                                # Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import collections
import copy
import hashlib
import json
import multiprocessing
import os.path
import re
import signal
import subprocess
import sys
import gyp
import gyp.common
import gyp.msvs_emulation
import gyp.MSVSUtil as MSVSUtil
import gyp.xcode_emulation

from io import StringIO

from gyp.common import GetEnvironFallback
import gyp.ninja_syntax as ninja_syntax

generator_default_variables = {
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": "",
    "STATIC_LIB_PREFIX": "lib",
    "STATIC_LIB_SUFFIX": ".a",
    "SHARED_LIB_PREFIX": "lib",
    # Gyp expects the following variables to be expandable by the build
    # system to the appropriate locations.  Ninja prefers paths to be
    # known at gyp time.  To resolve this, introduce special
    # variables starting with $! and $| (which begin with a $ so gyp knows it
    # should be treated specially, but is otherwise an invalid
    # ninja/shell variable) that are passed to gyp here but expanded
    # before writing out into the target .ninja files; see
    # ExpandSpecial.
    # $! is used for variables that represent a path and that can only appear at
    # the start of a string, while $| is used for variables that can appear
    # anywhere in a string.
    "INTERMEDIATE_DIR": "$!INTERMEDIATE_DIR",
    "SHARED_INTERMEDIATE_DIR": "$!PRODUCT_DIR/gen",
    "PRODUCT_DIR": "$!PRODUCT_DIR",
    "CONFIGURATION_NAME": "$|CONFIGURATION_NAME",
    # Special variables that may be used by gyp 'rule' targets.
    # We generate definitions for these variables on the fly when processing a
    # rule.
    "RULE_INPUT_ROOT": "${root}",
    "RULE_INPUT_DIRNAME": "${dirname}",
    "RULE_INPUT_PATH": "${source}",
    "RULE_INPUT_EXT": "${ext}",
    "RULE_INPUT_NAME": "${name}",
}

# Placates pylint.
generator_additional_non_configuration_keys = []
generator_additional_path_sections = []
generator_extra_sources_for_rules = []
generator_filelist_paths = None

generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()


def StripPrefix(arg, prefix):
    if arg.startswith(prefix):
        return arg[len(prefix) :]
    return arg


def QuoteShellArgument(arg, flavor):
    """Quote a string such that it will be interpreted as a single argument
    by the shell."""
    # Rather than attempting to enumerate the bad shell characters, just
    # allow common OK ones and quote anything else.
    if re.match(r"^[a-zA-Z0-9_=.\\/-]+$", arg):
        return arg  # No quoting necessary.
    if flavor == "win":
        return gyp.msvs_emulation.QuoteForRspFile(arg)
    return "'" + arg.replace("'", "'" + '"\'"' + "'") + "'"


def Define(d, flavor):
    """Takes a preprocessor define and returns a -D parameter that's ninja- and
    shell-escaped."""
    if flavor == "win":
        # cl.exe replaces literal # characters with = in preprocessor definitions for
        # some reason. Octal-encode to work around that.
        d = d.replace("#", "\\%03o" % ord("#"))
    return QuoteShellArgument(ninja_syntax.escape("-D" + d), flavor)


def AddArch(output, arch):
    """Adds an arch string to an output path."""
    output, extension = os.path.splitext(output)
    return f"{output}.{arch}{extension}"


class Target:
    """Target represents the paths used within a single gyp target.

    Conceptually, building a single target A is a series of steps:

    1) actions/rules/copies  generates source/resources/etc.
    2) compiles              generates .o files
    3) link                  generates a binary (library/executable)
    4) bundle                merges the above in a mac bundle

    (Any of these steps can be optional.)

    From a build ordering perspective, a dependent target B could just
    depend on the last output of this series of steps.

    But some dependent commands sometimes need to reach inside the box.
    For example, when linking B it needs to get the path to the static
    library generated by A.

    This object stores those paths.  To keep things simple, member
    variables only store concrete paths to single files, while methods
    compute derived values like "the last output of the target".
    """

    def __init__(self, type):
        # Gyp type ("static_library", etc.) of this target.
        self.type = type
        # File representing whether any input dependencies necessary for
        # dependent actions have completed.
        self.preaction_stamp = None
        # File representing whether any input dependencies necessary for
        # dependent compiles have completed.
        self.precompile_stamp = None
        # File representing the completion of actions/rules/copies, if any.
        self.actions_stamp = None
        # Path to the output of the link step, if any.
        self.binary = None
        # Path to the file representing the completion of building the bundle,
        # if any.
        self.bundle = None
        # On Windows, incremental linking requires linking against all the .objs
        # that compose a .lib (rather than the .lib itself). That list is stored
        # here. In this case, we also need to save the compile_deps for the target,
        # so that the target that directly depends on the .objs can also depend
        # on those.
        self.component_objs = None
        self.compile_deps = None
        # Windows only. The import .lib is the output of a build step, but
        # because dependents only link against the lib (not both the lib and the
        # dll) we keep track of the import library here.
        self.import_lib = None
        # Track if this target contains any C++ files, to decide if gcc or g++
        # should be used for linking.
        self.uses_cpp = False

    def Linkable(self):
        """Return true if this is a target that can be linked against."""
        return self.type in ("static_library", "shared_library")

    def UsesToc(self, flavor):
        """Return true if the target should produce a restat rule based on a TOC
        file."""
        # For bundles, the .TOC should be produced for the binary, not for
        # FinalOutput(). But the naive approach would put the TOC file into the
        # bundle, so don't do this for bundles for now.
        if flavor == "win" or self.bundle:
            return False
        return self.type in ("shared_library", "loadable_module")

    def PreActionInput(self, flavor):
        """Return the path, if any, that should be used as a dependency of
        any dependent action step."""
        if self.UsesToc(flavor):
            return self.FinalOutput() + ".TOC"
        return self.FinalOutput() or self.preaction_stamp

    def PreCompileInput(self):
        """Return the path, if any, that should be used as a dependency of
        any dependent compile step."""
        return self.actions_stamp or self.precompile_stamp

    def FinalOutput(self):
        """Return the last output of the target, which depends on all prior
        steps."""
        return self.bundle or self.binary or self.actions_stamp


# A small discourse on paths as used within the Ninja build:
# All files we produce (both at gyp and at build time) appear in the
# build directory (e.g. out/Debug).
#
# Paths within a given .gyp file are always relative to the directory
# containing the .gyp file.  Call these "gyp paths".  This includes
# sources as well as the starting directory a given gyp rule/action
# expects to be run from.  We call the path from the source root to
# the gyp file the "base directory" within the per-.gyp-file
# NinjaWriter code.
#
# All paths as written into the .ninja files are relative to the build
# directory.  Call these paths "ninja paths".
#
# We translate between these two notions of paths with two helper
# functions:
#
# - GypPathToNinja translates a gyp path (i.e. relative to the .gyp file)
#   into the equivalent ninja path.
#
# - GypPathToUniqueOutput translates a gyp path into a ninja path to write
#   an output file; the result can be namespaced such that it is unique
#   to the input file name as well as the output target name.


class NinjaWriter:
    def __init__(
        self,
        hash_for_rules,
        target_outputs,
        base_dir,
        build_dir,
        output_file,
        toplevel_build,
        output_file_name,
        flavor,
        toplevel_dir=None,
    ):
        """
        base_dir: path from source root to directory containing this gyp file,
                  by gyp semantics, all input paths are relative to this
        build_dir: path from source root to build output
        toplevel_dir: path to the toplevel directory
        """

        self.hash_for_rules = hash_for_rules
        self.target_outputs = target_outputs
        self.base_dir = base_dir
        self.build_dir = build_dir
        self.ninja = ninja_syntax.Writer(output_file)
        self.toplevel_build = toplevel_build
        self.output_file_name = output_file_name

        self.flavor = flavor
        self.abs_build_dir = None
        if toplevel_dir is not None:
            self.abs_build_dir = os.path.abspath(os.path.join(toplevel_dir, build_dir))
        self.obj_ext = ".obj" if flavor == "win" else ".o"
        if flavor == "win":
            # See docstring of msvs_emulation.GenerateEnvironmentFiles().
            self.win_env = {}
            for arch in ("x86", "x64"):
                self.win_env[arch] = "environment." + arch

        # Relative path from build output dir to base dir.
        build_to_top = gyp.common.InvertRelativePath(build_dir, toplevel_dir)
        self.build_to_base = os.path.join(build_to_top, base_dir)
        # Relative path from base dir to build dir.
        base_to_top = gyp.common.InvertRelativePath(base_dir, toplevel_dir)
        self.base_to_build = os.path.join(base_to_top, build_dir)

    def ExpandSpecial(self, path, product_dir=None):
        """Expand specials like $!PRODUCT_DIR in |path|.

        If |product_dir| is None, assumes the cwd is already the product
        dir.  Otherwise, |product_dir| is the relative path to the product
        dir.
        """

        PRODUCT_DIR = "$!PRODUCT_DIR"
        if PRODUCT_DIR in path:
            if product_dir:
                path = path.replace(PRODUCT_DIR, product_dir)
            else:
                path = path.replace(PRODUCT_DIR + "/", "")
                path = path.replace(PRODUCT_DIR + "\\", "")
                path = path.replace(PRODUCT_DIR, ".")

        INTERMEDIATE_DIR = "$!INTERMEDIATE_DIR"
        if INTERMEDIATE_DIR in path:
            int_dir = self.GypPathToUniqueOutput("gen")
            # GypPathToUniqueOutput generates a path relative to the product dir,
            # so insert product_dir in front if it is provided.
            path = path.replace(
                INTERMEDIATE_DIR, os.path.join(product_dir or "", int_dir)
            )

        CONFIGURATION_NAME = "$|CONFIGURATION_NAME"
        path = path.replace(CONFIGURATION_NAME, self.config_name)

        return path

    def ExpandRuleVariables(self, path, root, dirname, source, ext, name):
        if self.flavor == "win":
            path = self.msvs_settings.ConvertVSMacros(path, config=self.config_name)
        path = path.replace(generator_default_variables["RULE_INPUT_ROOT"], root)
        path = path.replace(generator_default_variables["RULE_INPUT_DIRNAME"], dirname)
        path = path.replace(generator_default_variables["RULE_INPUT_PATH"], source)
        path = path.replace(generator_default_variables["RULE_INPUT_EXT"], ext)
        path = path.replace(generator_default_variables["RULE_INPUT_NAME"], name)
        return path

    def GypPathToNinja(self, path, env=None):
        """Translate a gyp path to a ninja path, optionally expanding environment
        variable references in |path| with |env|.

        See the above discourse on path conversions."""
        if env:
            if self.flavor == "mac":
                path = gyp.xcode_emulation.ExpandEnvVars(path, env)
            elif self.flavor == "win":
                path = gyp.msvs_emulation.ExpandMacros(path, env)
        if path.startswith("$!"):
            expanded = self.ExpandSpecial(path)
            if self.flavor == "win":
                expanded = os.path.normpath(expanded)
            return expanded
        if "$|" in path:
            path = self.ExpandSpecial(path)
        assert "$" not in path, path
        return os.path.normpath(os.path.join(self.build_to_base, path))

    def GypPathToUniqueOutput(self, path, qualified=True):
        """Translate a gyp path to a ninja path for writing output.

        If qualified is True, qualify the resulting filename with the name
        of the target.  This is necessary when e.g. compiling the same
        path twice for two separate output targets.

        See the above discourse on path conversions."""

        path = self.ExpandSpecial(path)
        assert not path.startswith("$"), path

        # Translate the path following this scheme:
        #   Input: foo/bar.gyp, target targ, references baz/out.o
        #   Output: obj/foo/baz/targ.out.o (if qualified)
        #           obj/foo/baz/out.o (otherwise)
        #     (and obj.host instead of obj for cross-compiles)
        #
        # Why this scheme and not some other one?
        # 1) for a given input, you can compute all derived outputs by matching
        #    its path, even if the input is brought via a gyp file with '..'.
        # 2) simple files like libraries and stamps have a simple filename.

        obj = "obj"
        if self.toolset != "target":
            obj += "." + self.toolset

        path_dir, path_basename = os.path.split(path)
        assert not os.path.isabs(path_dir), (
            "'%s' can not be absolute path (see crbug.com/462153)." % path_dir
        )

        if qualified:
            path_basename = self.name + "." + path_basename
        return os.path.normpath(
            os.path.join(obj, self.base_dir, path_dir, path_basename)
        )

    def WriteCollapsedDependencies(self, name, targets, order_only=None):
        """Given a list of targets, return a path for a single file
        representing the result of building all the targets or None.

        Uses a stamp file if necessary."""

        assert targets == [item for item in targets if item], targets
        if len(targets) == 0:
            assert not order_only
            return None
        if len(targets) > 1 or order_only:
            stamp = self.GypPathToUniqueOutput(name + ".stamp")
            targets = self.ninja.build(stamp, "stamp", targets, order_only=order_only)
            self.ninja.newline()
        return targets[0]

    def _SubninjaNameForArch(self, arch):
        output_file_base = os.path.splitext(self.output_file_name)[0]
        return f"{output_file_base}.{arch}.ninja"

    def WriteSpec(self, spec, config_name, generator_flags):
        """The main entry point for NinjaWriter: write the build rules for a spec.

        Returns a Target object, which represents the output paths for this spec.
        Returns None if there are no outputs (e.g. a settings-only 'none' type
        target)."""

        self.config_name = config_name
        self.name = spec["target_name"]
        self.toolset = spec["toolset"]
        config = spec["configurations"][config_name]
        self.target = Target(spec["type"])
        self.is_standalone_static_library = bool(
            spec.get("standalone_static_library", 0)
        )

        self.target_rpath = generator_flags.get("target_rpath", r"\$$ORIGIN/lib/")

        self.is_mac_bundle = gyp.xcode_emulation.IsMacBundle(self.flavor, spec)
        self.xcode_settings = self.msvs_settings = None
        if self.flavor == "mac":
            self.xcode_settings = gyp.xcode_emulation.XcodeSettings(spec)
            mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None)
            if mac_toolchain_dir:
                self.xcode_settings.mac_toolchain_dir = mac_toolchain_dir

        if self.flavor == "win":
            self.msvs_settings = gyp.msvs_emulation.MsvsSettings(spec, generator_flags)
            arch = self.msvs_settings.GetArch(config_name)
            self.ninja.variable("arch", self.win_env[arch])
            self.ninja.variable("cc", "$cl_" + arch)
            self.ninja.variable("cxx", "$cl_" + arch)
            self.ninja.variable("cc_host", "$cl_" + arch)
            self.ninja.variable("cxx_host", "$cl_" + arch)
            self.ninja.variable("asm", "$ml_" + arch)

        if self.flavor == "mac":
            self.archs = self.xcode_settings.GetActiveArchs(config_name)
            if len(self.archs) > 1:
                self.arch_subninjas = {
                    arch: ninja_syntax.Writer(
                        OpenOutput(
                            os.path.join(
                                self.toplevel_build, self._SubninjaNameForArch(arch)
                            ),
                            "w",
                        )
                    )
                    for arch in self.archs
                }

        # Compute predepends for all rules.
        # actions_depends is the dependencies this target depends on before running
        # any of its action/rule/copy steps.
        # compile_depends is the dependencies this target depends on before running
        # any of its compile steps.
        actions_depends = []
        compile_depends = []
        # TODO(evan): it is rather confusing which things are lists and which
        # are strings.  Fix these.
        if "dependencies" in spec:
            for dep in spec["dependencies"]:
                if dep in self.target_outputs:
                    target = self.target_outputs[dep]
                    actions_depends.append(target.PreActionInput(self.flavor))
                    compile_depends.append(target.PreCompileInput())
                    if target.uses_cpp:
                        self.target.uses_cpp = True
            actions_depends = [item for item in actions_depends if item]
            compile_depends = [item for item in compile_depends if item]
            actions_depends = self.WriteCollapsedDependencies(
                "actions_depends", actions_depends
            )
            compile_depends = self.WriteCollapsedDependencies(
                "compile_depends", compile_depends
            )
            self.target.preaction_stamp = actions_depends
            self.target.precompile_stamp = compile_depends

        # Write out actions, rules, and copies.  These must happen before we
        # compile any sources, so compute a list of predependencies for sources
        # while we do it.
        extra_sources = []
        mac_bundle_depends = []
        self.target.actions_stamp = self.WriteActionsRulesCopies(
            spec, extra_sources, actions_depends, mac_bundle_depends
        )

        # If we have actions/rules/copies, we depend directly on those, but
        # otherwise we depend on dependent target's actions/rules/copies etc.
        # We never need to explicitly depend on previous target's link steps,
        # because no compile ever depends on them.
        compile_depends_stamp = self.target.actions_stamp or compile_depends

        # Write out the compilation steps, if any.
        link_deps = []
        try:
            sources = extra_sources + spec.get("sources", [])
        except TypeError:
            print("extra_sources: ", str(extra_sources))
            print('spec.get("sources"): ', str(spec.get("sources")))
            raise
        if sources:
            if self.flavor == "mac" and len(self.archs) > 1:
                # Write subninja file containing compile and link commands scoped to
                # a single arch if a fat binary is being built.
                for arch in self.archs:
                    self.ninja.subninja(self._SubninjaNameForArch(arch))

            pch = None
            if self.flavor == "win":
                gyp.msvs_emulation.VerifyMissingSources(
                    sources, self.abs_build_dir, generator_flags, self.GypPathToNinja
                )
                pch = gyp.msvs_emulation.PrecompiledHeader(
                    self.msvs_settings,
                    config_name,
                    self.GypPathToNinja,
                    self.GypPathToUniqueOutput,
                    self.obj_ext,
                )
            else:
                pch = gyp.xcode_emulation.MacPrefixHeader(
                    self.xcode_settings,
                    self.GypPathToNinja,
                    lambda path, lang: self.GypPathToUniqueOutput(path + "-" + lang),
                )
            link_deps = self.WriteSources(
                self.ninja,
                config_name,
                config,
                sources,
                compile_depends_stamp,
                pch,
                spec,
            )
            # Some actions/rules output 'sources' that are already object files.
            obj_outputs = [f for f in sources if f.endswith(self.obj_ext)]
            if obj_outputs:
                if self.flavor != "mac" or len(self.archs) == 1:
                    link_deps += [self.GypPathToNinja(o) for o in obj_outputs]
                else:
                    print(
                        "Warning: Actions/rules writing object files don't work with "
                        "multiarch targets, dropping. (target %s)" % spec["target_name"]
                    )
        elif self.flavor == "mac" and len(self.archs) > 1:
            link_deps = collections.defaultdict(list)

        compile_deps = self.target.actions_stamp or actions_depends
        if self.flavor == "win" and self.target.type == "static_library":
            self.target.component_objs = link_deps
            self.target.compile_deps = compile_deps

        # Write out a link step, if needed.
        output = None
        is_empty_bundle = not link_deps and not mac_bundle_depends
        if link_deps or self.target.actions_stamp or actions_depends:
            output = self.WriteTarget(
                spec, config_name, config, link_deps, compile_deps
            )
            if self.is_mac_bundle:
                mac_bundle_depends.append(output)

        # Bundle all of the above together, if needed.
        if self.is_mac_bundle:
            output = self.WriteMacBundle(spec, mac_bundle_depends, is_empty_bundle)

        if not output:
            return None

        assert self.target.FinalOutput(), output
        return self.target

    def _WinIdlRule(self, source, prebuild, outputs):
        """Handle the implicit VS .idl rule for one source file. Fills |outputs|
        with files that are generated."""
        outdir, output, vars, flags = self.msvs_settings.GetIdlBuildData(
            source, self.config_name
        )
        outdir = self.GypPathToNinja(outdir)

        def fix_path(path, rel=None):
            path = os.path.join(outdir, path)
            dirname, basename = os.path.split(source)
            root, ext = os.path.splitext(basename)
            path = self.ExpandRuleVariables(path, root, dirname, source, ext, basename)
            if rel:
                path = os.path.relpath(path, rel)
            return path

        vars = [(name, fix_path(value, outdir)) for name, value in vars]
        output = [fix_path(p) for p in output]
        vars.append(("outdir", outdir))
        vars.append(("idlflags", flags))
        input = self.GypPathToNinja(source)
        self.ninja.build(output, "idl", input, variables=vars, order_only=prebuild)
        outputs.extend(output)

    def WriteWinIdlFiles(self, spec, prebuild):
        """Writes rules to match MSVS's implicit idl handling."""
        assert self.flavor == "win"
        if self.msvs_settings.HasExplicitIdlRulesOrActions(spec):
            return []
        outputs = []
        for source in filter(lambda x: x.endswith(".idl"), spec["sources"]):
            self._WinIdlRule(source, prebuild, outputs)
        return outputs

    def WriteActionsRulesCopies(
        self, spec, extra_sources, prebuild, mac_bundle_depends
    ):
        """Write out the Actions, Rules, and Copies steps.  Return a path
        representing the outputs of these steps."""
        outputs = []
        if self.is_mac_bundle:
            mac_bundle_resources = spec.get("mac_bundle_resources", [])[:]
        else:
            mac_bundle_resources = []
        extra_mac_bundle_resources = []

        if "actions" in spec:
            outputs += self.WriteActions(
                spec["actions"], extra_sources, prebuild, extra_mac_bundle_resources
            )
        if "rules" in spec:
            outputs += self.WriteRules(
                spec["rules"],
                extra_sources,
                prebuild,
                mac_bundle_resources,
                extra_mac_bundle_resources,
            )
        if "copies" in spec:
            outputs += self.WriteCopies(spec["copies"], prebuild, mac_bundle_depends)

        if "sources" in spec and self.flavor == "win":
            outputs += self.WriteWinIdlFiles(spec, prebuild)

        if self.xcode_settings and self.xcode_settings.IsIosFramework():
            self.WriteiOSFrameworkHeaders(spec, outputs, prebuild)

        stamp = self.WriteCollapsedDependencies("actions_rules_copies", outputs)

        if self.is_mac_bundle:
            xcassets = self.WriteMacBundleResources(
                extra_mac_bundle_resources + mac_bundle_resources, mac_bundle_depends
            )
            partial_info_plist = self.WriteMacXCassets(xcassets, mac_bundle_depends)
            self.WriteMacInfoPlist(partial_info_plist, mac_bundle_depends)

        return stamp

    def GenerateDescription(self, verb, message, fallback):
        """Generate and return a description of a build step.

        |verb| is the short summary, e.g. ACTION or RULE.
        |message| is a hand-written description, or None if not available.
        |fallback| is the gyp-level name of the step, usable as a fallback.
        """
        if self.toolset != "target":
            verb += "(%s)" % self.toolset
        if message:
            return f"{verb} {self.ExpandSpecial(message)}"
        else:
            return f"{verb} {self.name}: {fallback}"

    def WriteActions(
        self, actions, extra_sources, prebuild, extra_mac_bundle_resources
    ):
        # Actions cd into the base directory.
        env = self.GetToolchainEnv()
        all_outputs = []
        for action in actions:
            # First write out a rule for the action.
            name = "{}_{}".format(action["action_name"], self.hash_for_rules)
            description = self.GenerateDescription(
                "ACTION", action.get("message", None), name
            )
            win_shell_flags = (
                self.msvs_settings.GetRuleShellFlags(action)
                if self.flavor == "win"
                else None
            )
            args = action["action"]
            depfile = action.get("depfile", None)
            if depfile:
                depfile = self.ExpandSpecial(depfile, self.base_to_build)
            pool = "console" if int(action.get("ninja_use_console", 0)) else None
            rule_name, _ = self.WriteNewNinjaRule(
                name, args, description, win_shell_flags, env, pool, depfile=depfile
            )

            inputs = [self.GypPathToNinja(i, env) for i in action["inputs"]]
            if int(action.get("process_outputs_as_sources", False)):
                extra_sources += action["outputs"]
            if int(action.get("process_outputs_as_mac_bundle_resources", False)):
                extra_mac_bundle_resources += action["outputs"]
            outputs = [self.GypPathToNinja(o, env) for o in action["outputs"]]

            # Then write out an edge using the rule.
            self.ninja.build(outputs, rule_name, inputs, order_only=prebuild)
            all_outputs += outputs

            self.ninja.newline()

        return all_outputs

    def WriteRules(
        self,
        rules,
        extra_sources,
        prebuild,
        mac_bundle_resources,
        extra_mac_bundle_resources,
    ):
        env = self.GetToolchainEnv()
        all_outputs = []
        for rule in rules:
            # Skip a rule with no action and no inputs.
            if "action" not in rule and not rule.get("rule_sources", []):
                continue

            # First write out a rule for the rule action.
            name = "{}_{}".format(rule["rule_name"], self.hash_for_rules)

            args = rule["action"]
            description = self.GenerateDescription(
                "RULE",
                rule.get("message", None),
                ("%s " + generator_default_variables["RULE_INPUT_PATH"]) % name,
            )
            win_shell_flags = (
                self.msvs_settings.GetRuleShellFlags(rule)
                if self.flavor == "win"
                else None
            )
            pool = "console" if int(rule.get("ninja_use_console", 0)) else None
            rule_name, args = self.WriteNewNinjaRule(
                name, args, description, win_shell_flags, env, pool
            )

            # TODO: if the command references the outputs directly, we should
            # simplify it to just use $out.

            # Rules can potentially make use of some special variables which
            # must vary per source file.
            # Compute the list of variables we'll need to provide.
            special_locals = ("source", "root", "dirname", "ext", "name")
            needed_variables = {"source"}
            for argument in args:
                for var in special_locals:
                    if "${%s}" % var in argument:
                        needed_variables.add(var)
            needed_variables = sorted(needed_variables)

            def cygwin_munge(path):
                # pylint: disable=cell-var-from-loop
                if win_shell_flags and win_shell_flags.cygwin:
                    return path.replace("\\", "/")
                return path

            inputs = [self.GypPathToNinja(i, env) for i in rule.get("inputs", [])]

            # If there are n source files matching the rule, and m additional rule
            # inputs, then adding 'inputs' to each build edge written below will
            # write m * n inputs. Collapsing reduces this to m + n.
            sources = rule.get("rule_sources", [])
            num_inputs = len(inputs)
            if prebuild:
                num_inputs += 1
            if num_inputs > 2 and len(sources) > 2:
                inputs = [
                    self.WriteCollapsedDependencies(
                        rule["rule_name"], inputs, order_only=prebuild
                    )
                ]
                prebuild = []

            # For each source file, write an edge that generates all the outputs.
            for source in sources:
                source = os.path.normpath(source)
                dirname, basename = os.path.split(source)
                root, ext = os.path.splitext(basename)

                # Gather the list of inputs and outputs, expanding $vars if possible.
                outputs = [
                    self.ExpandRuleVariables(o, root, dirname, source, ext, basename)
                    for o in rule["outputs"]
                ]

                if int(rule.get("process_outputs_as_sources", False)):
                    extra_sources += outputs

                was_mac_bundle_resource = source in mac_bundle_resources
                if was_mac_bundle_resource or int(
                    rule.get("process_outputs_as_mac_bundle_resources", False)
                ):
                    extra_mac_bundle_resources += outputs
                    # Note: This is n_resources * n_outputs_in_rule.
                    # Put to-be-removed items in a set and
                    # remove them all in a single pass
                    # if this becomes a performance issue.
                    if was_mac_bundle_resource:
                        mac_bundle_resources.remove(source)

                extra_bindings = []
                for var in needed_variables:
                    if var == "root":
                        extra_bindings.append(("root", cygwin_munge(root)))
                    elif var == "dirname":
                        # '$dirname' is a parameter to the rule action, which means
                        # it shouldn't be converted to a Ninja path.  But we don't
                        # want $!PRODUCT_DIR in there either.
                        dirname_expanded = self.ExpandSpecial(
                            dirname, self.base_to_build
                        )
                        extra_bindings.append(
                            ("dirname", cygwin_munge(dirname_expanded))
                        )
                    elif var == "source":
                        # '$source' is a parameter to the rule action, which means
                        # it shouldn't be converted to a Ninja path.  But we don't
                        # want $!PRODUCT_DIR in there either.
                        source_expanded = self.ExpandSpecial(source, self.base_to_build)
                        extra_bindings.append(("source", cygwin_munge(source_expanded)))
                    elif var == "ext":
                        extra_bindings.append(("ext", ext))
                    elif var == "name":
                        extra_bindings.append(("name", cygwin_munge(basename)))
                    else:
                        assert var is None, repr(var)

                outputs = [self.GypPathToNinja(o, env) for o in outputs]
                if self.flavor == "win":
                    # WriteNewNinjaRule uses unique_name to create a rsp file on win.
                    extra_bindings.append(
                        ("unique_name", hashlib.md5(outputs[0]).hexdigest())
                    )

                self.ninja.build(
                    outputs,
                    rule_name,
                    self.GypPathToNinja(source),
                    implicit=inputs,
                    order_only=prebuild,
                    variables=extra_bindings,
                )

                all_outputs.extend(outputs)

        return all_outputs

    def WriteCopies(self, copies, prebuild, mac_bundle_depends):
        outputs = []
        if self.xcode_settings:
            extra_env = self.xcode_settings.GetPerTargetSettings()
            env = self.GetToolchainEnv(additional_settings=extra_env)
        else:
            env = self.GetToolchainEnv()
        for to_copy in copies:
            for path in to_copy["files"]:
                # Normalize the path so trailing slashes don't confuse us.
                path = os.path.normpath(path)
                basename = os.path.split(path)[1]
                src = self.GypPathToNinja(path, env)
                dst = self.GypPathToNinja(
                    os.path.join(to_copy["destination"], basename), env
                )
                outputs += self.ninja.build(dst, "copy", src, order_only=prebuild)
                if self.is_mac_bundle:
                    # gyp has mac_bundle_resources to copy things into a bundle's
                    # Resources folder, but there's no built-in way to copy files
                    # to other places in the bundle.
                    # Hence, some targets use copies for this.
                    # Check if this file is copied into the current bundle,
                    # and if so add it to the bundle depends so
                    # that dependent targets get rebuilt if the copy input changes.
                    if dst.startswith(
                        self.xcode_settings.GetBundleContentsFolderPath()
                    ):
                        mac_bundle_depends.append(dst)

        return outputs

    def WriteiOSFrameworkHeaders(self, spec, outputs, prebuild):
        """Prebuild steps to generate hmap files and copy headers to destination."""
        framework = self.ComputeMacBundleOutput()
        all_sources = spec["sources"]
        copy_headers = spec["mac_framework_headers"]
        output = self.GypPathToUniqueOutput("headers.hmap")
        self.xcode_settings.header_map_path = output
        all_headers = map(
            self.GypPathToNinja, filter(lambda x: x.endswith(".h"), all_sources)
        )
        variables = [
            ("framework", framework),
            ("copy_headers", map(self.GypPathToNinja, copy_headers)),
        ]
        outputs.extend(
            self.ninja.build(
                output,
                "compile_ios_framework_headers",
                all_headers,
                variables=variables,
                order_only=prebuild,
            )
        )

    def WriteMacBundleResources(self, resources, bundle_depends):
        """Writes ninja edges for 'mac_bundle_resources'."""
        xcassets = []

        extra_env = self.xcode_settings.GetPerTargetSettings()
        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)
        isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name)

        for output, res in gyp.xcode_emulation.GetMacBundleResources(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            map(self.GypPathToNinja, resources),
        ):
            output = self.ExpandSpecial(output)
            if os.path.splitext(output)[-1] != ".xcassets":
                self.ninja.build(
                    output,
                    "mac_tool",
                    res,
                    variables=[
                        ("mactool_cmd", "copy-bundle-resource"),
                        ("env", env),
                        ("binary", isBinary),
                    ],
                )
                bundle_depends.append(output)
            else:
                xcassets.append(res)
        return xcassets

    def WriteMacXCassets(self, xcassets, bundle_depends):
        """Writes ninja edges for 'mac_bundle_resources' .xcassets files.

        This add an invocation of 'actool' via the 'mac_tool.py' helper script.
        It assumes that the assets catalogs define at least one imageset and
        thus an Assets.car file will be generated in the application resources
        directory. If this is not the case, then the build will probably be done
        at each invocation of ninja."""
        if not xcassets:
            return

        extra_arguments = {}
        settings_to_arg = {
            "XCASSETS_APP_ICON": "app-icon",
            "XCASSETS_LAUNCH_IMAGE": "launch-image",
        }
        settings = self.xcode_settings.xcode_settings[self.config_name]
        for settings_key, arg_name in settings_to_arg.items():
            value = settings.get(settings_key)
            if value:
                extra_arguments[arg_name] = value

        partial_info_plist = None
        if extra_arguments:
            partial_info_plist = self.GypPathToUniqueOutput(
                "assetcatalog_generated_info.plist"
            )
            extra_arguments["output-partial-info-plist"] = partial_info_plist

        outputs = []
        outputs.append(
            os.path.join(self.xcode_settings.GetBundleResourceFolder(), "Assets.car")
        )
        if partial_info_plist:
            outputs.append(partial_info_plist)

        keys = QuoteShellArgument(json.dumps(extra_arguments), self.flavor)
        extra_env = self.xcode_settings.GetPerTargetSettings()
        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)

        bundle_depends.extend(
            self.ninja.build(
                outputs,
                "compile_xcassets",
                xcassets,
                variables=[("env", env), ("keys", keys)],
            )
        )
        return partial_info_plist

    def WriteMacInfoPlist(self, partial_info_plist, bundle_depends):
        """Write build rules for bundle Info.plist files."""
        info_plist, out, defines, extra_env = gyp.xcode_emulation.GetMacInfoPlist(
            generator_default_variables["PRODUCT_DIR"],
            self.xcode_settings,
            self.GypPathToNinja,
        )
        if not info_plist:
            return
        out = self.ExpandSpecial(out)
        if defines:
            # Create an intermediate file to store preprocessed results.
            intermediate_plist = self.GypPathToUniqueOutput(
                os.path.basename(info_plist)
            )
            defines = " ".join([Define(d, self.flavor) for d in defines])
            info_plist = self.ninja.build(
                intermediate_plist,
                "preprocess_infoplist",
                info_plist,
                variables=[("defines", defines)],
            )

        env = self.GetSortedXcodeEnv(additional_settings=extra_env)
        env = self.ComputeExportEnvString(env)

        if partial_info_plist:
            intermediate_plist = self.GypPathToUniqueOutput("merged_info.plist")
            info_plist = self.ninja.build(
                intermediate_plist, "merge_infoplist", [partial_info_plist, info_plist]
            )

        keys = self.xcode_settings.GetExtraPlistItems(self.config_name)
        keys = QuoteShellArgument(json.dumps(keys), self.flavor)
        isBinary = self.xcode_settings.IsBinaryOutputFormat(self.config_name)
        self.ninja.build(
            out,
            "copy_infoplist",
            info_plist,
            variables=[("env", env), ("keys", keys), ("binary", isBinary)],
        )
        bundle_depends.append(out)

    def WriteSources(
        self,
        ninja_file,
        config_name,
        config,
        sources,
        predepends,
        precompiled_header,
        spec,
    ):
        """Write build rules to compile all of |sources|."""
        if self.toolset == "host":
            self.ninja.variable("ar", "$ar_host")
            self.ninja.variable("cc", "$cc_host")
            self.ninja.variable("cxx", "$cxx_host")
            self.ninja.variable("ld", "$ld_host")
            self.ninja.variable("ldxx", "$ldxx_host")
            self.ninja.variable("nm", "$nm_host")
            self.ninja.variable("readelf", "$readelf_host")

        if self.flavor != "mac" or len(self.archs) == 1:
            return self.WriteSourcesForArch(
                self.ninja,
                config_name,
                config,
                sources,
                predepends,
                precompiled_header,
                spec,
            )
        else:
            return {
                arch: self.WriteSourcesForArch(
                    self.arch_subninjas[arch],
                    config_name,
                    config,
                    sources,
                    predepends,
                    precompiled_header,
                    spec,
                    arch=arch,
                )
                for arch in self.archs
            }

    def WriteSourcesForArch(
        self,
        ninja_file,
        config_name,
        config,
        sources,
        predepends,
        precompiled_header,
        spec,
        arch=None,
    ):
        """Write build rules to compile all of |sources|."""

        extra_defines = []
        if self.flavor == "mac":
            cflags = self.xcode_settings.GetCflags(config_name, arch=arch)
            cflags_c = self.xcode_settings.GetCflagsC(config_name)
            cflags_cc = self.xcode_settings.GetCflagsCC(config_name)
            cflags_objc = ["$cflags_c"] + self.xcode_settings.GetCflagsObjC(config_name)
            cflags_objcc = ["$cflags_cc"] + self.xcode_settings.GetCflagsObjCC(
                config_name
            )
        elif self.flavor == "win":
            asmflags = self.msvs_settings.GetAsmflags(config_name)
            cflags = self.msvs_settings.GetCflags(config_name)
            cflags_c = self.msvs_settings.GetCflagsC(config_name)
            cflags_cc = self.msvs_settings.GetCflagsCC(config_name)
            extra_defines = self.msvs_settings.GetComputedDefines(config_name)
            # See comment at cc_command for why there's two .pdb files.
            pdbpath_c = pdbpath_cc = self.msvs_settings.GetCompilerPdbName(
                config_name, self.ExpandSpecial
            )
            if not pdbpath_c:
                obj = "obj"
                if self.toolset != "target":
                    obj += "." + self.toolset
                pdbpath = os.path.normpath(os.path.join(obj, self.base_dir, self.name))
                pdbpath_c = pdbpath + ".c.pdb"
                pdbpath_cc = pdbpath + ".cc.pdb"
            self.WriteVariableList(ninja_file, "pdbname_c", [pdbpath_c])
            self.WriteVariableList(ninja_file, "pdbname_cc", [pdbpath_cc])
            self.WriteVariableList(ninja_file, "pchprefix", [self.name])
        else:
            cflags = config.get("cflags", [])
            cflags_c = config.get("cflags_c", [])
            cflags_cc = config.get("cflags_cc", [])

        # Respect environment variables related to build, but target-specific
        # flags can still override them.
        if self.toolset == "target":
            cflags_c = (
                os.environ.get("CPPFLAGS", "").split()
                + os.environ.get("CFLAGS", "").split()
                + cflags_c
            )
            cflags_cc = (
                os.environ.get("CPPFLAGS", "").split()
                + os.environ.get("CXXFLAGS", "").split()
                + cflags_cc
            )
        elif self.toolset == "host":
            cflags_c = (
                os.environ.get("CPPFLAGS_host", "").split()
                + os.environ.get("CFLAGS_host", "").split()
                + cflags_c
            )
            cflags_cc = (
                os.environ.get("CPPFLAGS_host", "").split()
                + os.environ.get("CXXFLAGS_host", "").split()
                + cflags_cc
            )

        defines = config.get("defines", []) + extra_defines
        self.WriteVariableList(
            ninja_file, "defines", [Define(d, self.flavor) for d in defines]
        )
        if self.flavor == "win":
            self.WriteVariableList(
                ninja_file, "asmflags", map(self.ExpandSpecial, asmflags)
            )
            self.WriteVariableList(
                ninja_file,
                "rcflags",
                [
                    QuoteShellArgument(self.ExpandSpecial(f), self.flavor)
                    for f in self.msvs_settings.GetRcflags(
                        config_name, self.GypPathToNinja
                    )
                ],
            )

        include_dirs = config.get("include_dirs", [])

        env = self.GetToolchainEnv()
        if self.flavor == "win":
            include_dirs = self.msvs_settings.AdjustIncludeDirs(
                include_dirs, config_name
            )
        self.WriteVariableList(
            ninja_file,
            "includes",
            [
                QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                for i in include_dirs
            ],
        )

        if self.flavor == "win":
            midl_include_dirs = config.get("midl_include_dirs", [])
            midl_include_dirs = self.msvs_settings.AdjustMidlIncludeDirs(
                midl_include_dirs, config_name
            )
            self.WriteVariableList(
                ninja_file,
                "midl_includes",
                [
                    QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                    for i in midl_include_dirs
                ],
            )

        pch_commands = precompiled_header.GetPchBuildCommands(arch)
        if self.flavor == "mac":
            # Most targets use no precompiled headers, so only write these if needed.
            for ext, var in [
                ("c", "cflags_pch_c"),
                ("cc", "cflags_pch_cc"),
                ("m", "cflags_pch_objc"),
                ("mm", "cflags_pch_objcc"),
            ]:
                include = precompiled_header.GetInclude(ext, arch)
                if include:
                    ninja_file.variable(var, include)

        arflags = config.get("arflags", [])

        self.WriteVariableList(ninja_file, "cflags", map(self.ExpandSpecial, cflags))
        self.WriteVariableList(
            ninja_file, "cflags_c", map(self.ExpandSpecial, cflags_c)
        )
        self.WriteVariableList(
            ninja_file, "cflags_cc", map(self.ExpandSpecial, cflags_cc)
        )
        if self.flavor == "mac":
            self.WriteVariableList(
                ninja_file, "cflags_objc", map(self.ExpandSpecial, cflags_objc)
            )
            self.WriteVariableList(
                ninja_file, "cflags_objcc", map(self.ExpandSpecial, cflags_objcc)
            )
        self.WriteVariableList(ninja_file, "arflags", map(self.ExpandSpecial, arflags))
        ninja_file.newline()
        outputs = []
        has_rc_source = False
        for source in sources:
            filename, ext = os.path.splitext(source)
            ext = ext[1:]
            obj_ext = self.obj_ext
            if ext in ("cc", "cpp", "cxx"):
                command = "cxx"
                self.target.uses_cpp = True
            elif ext == "c" or (ext == "S" and self.flavor != "win"):
                command = "cc"
            elif ext == "s" and self.flavor != "win":  # Doesn't generate .o.d files.
                command = "cc_s"
            elif (
                self.flavor == "win"
                and ext in ("asm", "S")
                and not self.msvs_settings.HasExplicitAsmRules(spec)
            ):
                command = "asm"
                # Add the _asm suffix as msvs is capable of handling .cc and
                # .asm files of the same name without collision.
                obj_ext = "_asm.obj"
            elif self.flavor == "mac" and ext == "m":
                command = "objc"
            elif self.flavor == "mac" and ext == "mm":
                command = "objcxx"
                self.target.uses_cpp = True
            elif self.flavor == "win" and ext == "rc":
                command = "rc"
                obj_ext = ".res"
                has_rc_source = True
            else:
                # Ignore unhandled extensions.
                continue
            input = self.GypPathToNinja(source)
            output = self.GypPathToUniqueOutput(filename + obj_ext)
            if arch is not None:
                output = AddArch(output, arch)
            implicit = precompiled_header.GetObjDependencies([input], [output], arch)
            variables = []
            if self.flavor == "win":
                variables, output, implicit = precompiled_header.GetFlagsModifications(
                    input,
                    output,
                    implicit,
                    command,
                    cflags_c,
                    cflags_cc,
                    self.ExpandSpecial,
                )
            ninja_file.build(
                output,
                command,
                input,
                implicit=[gch for _, _, gch in implicit],
                order_only=predepends,
                variables=variables,
            )
            outputs.append(output)

        if has_rc_source:
            resource_include_dirs = config.get("resource_include_dirs", include_dirs)
            self.WriteVariableList(
                ninja_file,
                "resource_includes",
                [
                    QuoteShellArgument("-I" + self.GypPathToNinja(i, env), self.flavor)
                    for i in resource_include_dirs
                ],
            )

        self.WritePchTargets(ninja_file, pch_commands)

        ninja_file.newline()
        return outputs

    def WritePchTargets(self, ninja_file, pch_commands):
        """Writes ninja rules to compile prefix headers."""
        if not pch_commands:
            return

        for gch, lang_flag, lang, input in pch_commands:
            var_name = {
                "c": "cflags_pch_c",
                "cc": "cflags_pch_cc",
                "m": "cflags_pch_objc",
                "mm": "cflags_pch_objcc",
            }[lang]

            map = {
                "c": "cc",
                "cc": "cxx",
                "m": "objc",
                "mm": "objcxx",
            }
            cmd = map.get(lang)
            ninja_file.build(gch, cmd, input, variables=[(var_name, lang_flag)])

    def WriteLink(self, spec, config_name, config, link_deps, compile_deps):
        """Write out a link step. Fills out target.binary. """
        if self.flavor != "mac" or len(self.archs) == 1:
            return self.WriteLinkForArch(
                self.ninja, spec, config_name, config, link_deps, compile_deps
            )
        else:
            output = self.ComputeOutput(spec)
            inputs = [
                self.WriteLinkForArch(
                    self.arch_subninjas[arch],
                    spec,
                    config_name,
                    config,
                    link_deps[arch],
                    compile_deps,
                    arch=arch,
                )
                for arch in self.archs
            ]
            extra_bindings = []
            build_output = output
            if not self.is_mac_bundle:
                self.AppendPostbuildVariable(extra_bindings, spec, output, output)

            # TODO(yyanagisawa): more work needed to fix:
            # https://code.google.com/p/gyp/issues/detail?id=411
            if (
                spec["type"] in ("shared_library", "loadable_module")
                and not self.is_mac_bundle
            ):
                extra_bindings.append(("lib", output))
                self.ninja.build(
                    [output, output + ".TOC"],
                    "solipo",
                    inputs,
                    variables=extra_bindings,
                )
            else:
                self.ninja.build(build_output, "lipo", inputs, variables=extra_bindings)
            return output

    def WriteLinkForArch(
        self, ninja_file, spec, config_name, config, link_deps, compile_deps, arch=None
    ):
        """Write out a link step. Fills out target.binary. """
        command = {
            "executable": "link",
            "loadable_module": "solink_module",
            "shared_library": "solink",
        }[spec["type"]]
        command_suffix = ""

        implicit_deps = set()
        solibs = set()
        order_deps = set()

        if compile_deps:
            # Normally, the compiles of the target already depend on compile_deps,
            # but a shared_library target might have no sources and only link together
            # a few static_library deps, so the link step also needs to depend
            # on compile_deps to make sure actions in the shared_library target
            # get run before the link.
            order_deps.add(compile_deps)

        if "dependencies" in spec:
            # Two kinds of dependencies:
            # - Linkable dependencies (like a .a or a .so): add them to the link line.
            # - Non-linkable dependencies (like a rule that generates a file
            #   and writes a stamp file): add them to implicit_deps
            extra_link_deps = set()
            for dep in spec["dependencies"]:
                target = self.target_outputs.get(dep)
                if not target:
                    continue
                linkable = target.Linkable()
                if linkable:
                    new_deps = []
                    if (
                        self.flavor == "win"
                        and target.component_objs
                        and self.msvs_settings.IsUseLibraryDependencyInputs(config_name)
                    ):
                        new_deps = target.component_objs
                        if target.compile_deps:
                            order_deps.add(target.compile_deps)
                    elif self.flavor == "win" and target.import_lib:
                        new_deps = [target.import_lib]
                    elif target.UsesToc(self.flavor):
                        solibs.add(target.binary)
                        implicit_deps.add(target.binary + ".TOC")
                    else:
                        new_deps = [target.binary]
                    for new_dep in new_deps:
                        if new_dep not in extra_link_deps:
                            extra_link_deps.add(new_dep)
                            link_deps.append(new_dep)

                final_output = target.FinalOutput()
                if not linkable or final_output != target.binary:
                    implicit_deps.add(final_output)

        extra_bindings = []
        if self.target.uses_cpp and self.flavor != "win":
            extra_bindings.append(("ld", "$ldxx"))

        output = self.ComputeOutput(spec, arch)
        if arch is None and not self.is_mac_bundle:
            self.AppendPostbuildVariable(extra_bindings, spec, output, output)

        is_executable = spec["type"] == "executable"
        # The ldflags config key is not used on mac or win. On those platforms
        # linker flags are set via xcode_settings and msvs_settings, respectively.
        if self.toolset == "target":
            env_ldflags = os.environ.get("LDFLAGS", "").split()
        elif self.toolset == "host":
            env_ldflags = os.environ.get("LDFLAGS_host", "").split()

        if self.flavor == "mac":
            ldflags = self.xcode_settings.GetLdflags(
                config_name,
                self.ExpandSpecial(generator_default_variables["PRODUCT_DIR"]),
                self.GypPathToNinja,
                arch,
            )
            ldflags = env_ldflags + ldflags
        elif self.flavor == "win":
            manifest_base_name = self.GypPathToUniqueOutput(
                self.ComputeOutputFileName(spec)
            )
            (
                ldflags,
                intermediate_manifest,
                manifest_files,
            ) = self.msvs_settings.GetLdflags(
                config_name,
                self.GypPathToNinja,
                self.ExpandSpecial,
                manifest_base_name,
                output,
                is_executable,
                self.toplevel_build,
            )
            ldflags = env_ldflags + ldflags
            self.WriteVariableList(ninja_file, "manifests", manifest_files)
            implicit_deps = implicit_deps.union(manifest_files)
            if intermediate_manifest:
                self.WriteVariableList(
                    ninja_file, "intermediatemanifest", [intermediate_manifest]
                )
            command_suffix = _GetWinLinkRuleNameSuffix(
                self.msvs_settings.IsEmbedManifest(config_name)
            )
            def_file = self.msvs_settings.GetDefFile(self.GypPathToNinja)
            if def_file:
                implicit_deps.add(def_file)
        else:
            # Respect environment variables related to build, but target-specific
            # flags can still override them.
            ldflags = env_ldflags + config.get("ldflags", [])
            if is_executable and len(solibs):
                rpath = "lib/"
                if self.toolset != "target":
                    rpath += self.toolset
                    ldflags.append(r"-Wl,-rpath=\$$ORIGIN/%s" % rpath)
                else:
                    ldflags.append("-Wl,-rpath=%s" % self.target_rpath)
                ldflags.append("-Wl,-rpath-link=%s" % rpath)
        self.WriteVariableList(ninja_file, "ldflags", map(self.ExpandSpecial, ldflags))

        library_dirs = config.get("library_dirs", [])
        if self.flavor == "win":
            library_dirs = [
                self.msvs_settings.ConvertVSMacros(library_dir, config_name)
                for library_dir in library_dirs
            ]
            library_dirs = [
                "/LIBPATH:"
                + QuoteShellArgument(self.GypPathToNinja(library_dir), self.flavor)
                for library_dir in library_dirs
            ]
        else:
            library_dirs = [
                QuoteShellArgument("-L" + self.GypPathToNinja(library_dir), self.flavor)
                for library_dir in library_dirs
            ]

        libraries = gyp.common.uniquer(
            map(self.ExpandSpecial, spec.get("libraries", []))
        )
        if self.flavor == "mac":
            libraries = self.xcode_settings.AdjustLibraries(libraries, config_name)
        elif self.flavor == "win":
            libraries = self.msvs_settings.AdjustLibraries(libraries)

        self.WriteVariableList(ninja_file, "libs", library_dirs + libraries)

        linked_binary = output

        if command in ("solink", "solink_module"):
            extra_bindings.append(("soname", os.path.split(output)[1]))
            extra_bindings.append(("lib", gyp.common.EncodePOSIXShellArgument(output)))
            if self.flavor != "win":
                link_file_list = output
                if self.is_mac_bundle:
                    # 'Dependency Framework.framework/Versions/A/Dependency Framework'
                    # -> 'Dependency Framework.framework.rsp'
                    link_file_list = self.xcode_settings.GetWrapperName()
                if arch:
                    link_file_list += "." + arch
                link_file_list += ".rsp"
                # If an rspfile contains spaces, ninja surrounds the filename with
                # quotes around it and then passes it to open(), creating a file with
                # quotes in its name (and when looking for the rsp file, the name
                # makes it through bash which strips the quotes) :-/
                link_file_list = link_file_list.replace(" ", "_")
                extra_bindings.append(
                    (
                        "link_file_list",
                        gyp.common.EncodePOSIXShellArgument(link_file_list),
                    )
                )
            if self.flavor == "win":
                extra_bindings.append(("binary", output))
                if (
                    "/NOENTRY" not in ldflags
                    and not self.msvs_settings.GetNoImportLibrary(config_name)
                ):
                    self.target.import_lib = output + ".lib"
                    extra_bindings.append(
                        ("implibflag", "/IMPLIB:%s" % self.target.import_lib)
                    )
                    pdbname = self.msvs_settings.GetPDBName(
                        config_name, self.ExpandSpecial, output + ".pdb"
                    )
                    output = [output, self.target.import_lib]
                    if pdbname:
                        output.append(pdbname)
            elif not self.is_mac_bundle:
                output = [output, output + ".TOC"]
            else:
                command = command + "_notoc"
        elif self.flavor == "win":
            extra_bindings.append(("binary", output))
            pdbname = self.msvs_settings.GetPDBName(
                config_name, self.ExpandSpecial, output + ".pdb"
            )
            if pdbname:
                output = [output, pdbname]

        if len(solibs):
            extra_bindings.append(
                ("solibs", gyp.common.EncodePOSIXShellList(sorted(solibs)))
            )

        ninja_file.build(
            output,
            command + command_suffix,
            link_deps,
            implicit=sorted(implicit_deps),
            order_only=list(order_deps),
            variables=extra_bindings,
        )
        return linked_binary

    def WriteTarget(self, spec, config_name, config, link_deps, compile_deps):
        extra_link_deps = any(
            self.target_outputs.get(dep).Linkable()
            for dep in spec.get("dependencies", [])
            if dep in self.target_outputs
        )
        if spec["type"] == "none" or (not link_deps and not extra_link_deps):
            # TODO(evan): don't call this function for 'none' target types, as
            # it doesn't do anything, and we fake out a 'binary' with a stamp file.
            self.target.binary = compile_deps
            self.target.type = "none"
        elif spec["type"] == "static_library":
            self.target.binary = self.ComputeOutput(spec)
            if (
                self.flavor not in ("ios", "mac", "netbsd", "openbsd", "win")
                and not self.is_standalone_static_library
            ):
                self.ninja.build(
                    self.target.binary, "alink_thin", link_deps, order_only=compile_deps
                )
            else:
                variables = []
                if self.xcode_settings:
                    libtool_flags = self.xcode_settings.GetLibtoolflags(config_name)
                    if libtool_flags:
                        variables.append(("libtool_flags", libtool_flags))
                if self.msvs_settings:
                    libflags = self.msvs_settings.GetLibFlags(
                        config_name, self.GypPathToNinja
                    )
                    variables.append(("libflags", libflags))

                if self.flavor != "mac" or len(self.archs) == 1:
                    self.AppendPostbuildVariable(
                        variables, spec, self.target.binary, self.target.binary
                    )
                    self.ninja.build(
                        self.target.binary,
                        "alink",
                        link_deps,
                        order_only=compile_deps,
                        variables=variables,
                    )
                else:
                    inputs = []
                    for arch in self.archs:
                        output = self.ComputeOutput(spec, arch)
                        self.arch_subninjas[arch].build(
                            output,
                            "alink",
                            link_deps[arch],
                            order_only=compile_deps,
                            variables=variables,
                        )
                        inputs.append(output)
                    # TODO: It's not clear if
                    # libtool_flags should be passed to the alink
                    # call that combines single-arch .a files into a fat .a file.
                    self.AppendPostbuildVariable(
                        variables, spec, self.target.binary, self.target.binary
                    )
                    self.ninja.build(
                        self.target.binary,
                        "alink",
                        inputs,
                        # FIXME: test proving order_only=compile_deps isn't
                        # needed.
                        variables=variables,
                    )
        else:
            self.target.binary = self.WriteLink(
                spec, config_name, config, link_deps, compile_deps
            )
        return self.target.binary

    def WriteMacBundle(self, spec, mac_bundle_depends, is_empty):
        assert self.is_mac_bundle
        package_framework = spec["type"] in ("shared_library", "loadable_module")
        output = self.ComputeMacBundleOutput()
        if is_empty:
            output += ".stamp"
        variables = []
        self.AppendPostbuildVariable(
            variables,
            spec,
            output,
            self.target.binary,
            is_command_start=not package_framework,
        )
        if package_framework and not is_empty:
            if spec["type"] == "shared_library" and self.xcode_settings.isIOS:
                self.ninja.build(
                    output,
                    "package_ios_framework",
                    mac_bundle_depends,
                    variables=variables,
                )
            else:
                variables.append(("version", self.xcode_settings.GetFrameworkVersion()))
                self.ninja.build(
                    output, "package_framework", mac_bundle_depends, variables=variables
                )
        else:
            self.ninja.build(output, "stamp", mac_bundle_depends, variables=variables)
        self.target.bundle = output
        return output

    def GetToolchainEnv(self, additional_settings=None):
        """Returns the variables toolchain would set for build steps."""
        env = self.GetSortedXcodeEnv(additional_settings=additional_settings)
        if self.flavor == "win":
            env = self.GetMsvsToolchainEnv(additional_settings=additional_settings)
        return env

    def GetMsvsToolchainEnv(self, additional_settings=None):
        """Returns the variables Visual Studio would set for build steps."""
        return self.msvs_settings.GetVSMacroEnv(
            "$!PRODUCT_DIR", config=self.config_name
        )

    def GetSortedXcodeEnv(self, additional_settings=None):
        """Returns the variables Xcode would set for build steps."""
        assert self.abs_build_dir
        abs_build_dir = self.abs_build_dir
        return gyp.xcode_emulation.GetSortedXcodeEnv(
            self.xcode_settings,
            abs_build_dir,
            os.path.join(abs_build_dir, self.build_to_base),
            self.config_name,
            additional_settings,
        )

    def GetSortedXcodePostbuildEnv(self):
        """Returns the variables Xcode would set for postbuild steps."""
        postbuild_settings = {}
        # CHROMIUM_STRIP_SAVE_FILE is a chromium-specific hack.
        # TODO(thakis): It would be nice to have some general mechanism instead.
        strip_save_file = self.xcode_settings.GetPerTargetSetting(
            "CHROMIUM_STRIP_SAVE_FILE"
        )
        if strip_save_file:
            postbuild_settings["CHROMIUM_STRIP_SAVE_FILE"] = strip_save_file
        return self.GetSortedXcodeEnv(additional_settings=postbuild_settings)

    def AppendPostbuildVariable(
        self, variables, spec, output, binary, is_command_start=False
    ):
        """Adds a 'postbuild' variable if there is a postbuild for |output|."""
        postbuild = self.GetPostbuildCommand(spec, output, binary, is_command_start)
        if postbuild:
            variables.append(("postbuilds", postbuild))

    def GetPostbuildCommand(self, spec, output, output_binary, is_command_start):
        """Returns a shell command that runs all the postbuilds, and removes
        |output| if any of them fails. If |is_command_start| is False, then the
        returned string will start with ' && '."""
        if not self.xcode_settings or spec["type"] == "none" or not output:
            return ""
        output = QuoteShellArgument(output, self.flavor)
        postbuilds = gyp.xcode_emulation.GetSpecPostbuildCommands(spec, quiet=True)
        if output_binary is not None:
            postbuilds = self.xcode_settings.AddImplicitPostbuilds(
                self.config_name,
                os.path.normpath(os.path.join(self.base_to_build, output)),
                QuoteShellArgument(
                    os.path.normpath(os.path.join(self.base_to_build, output_binary)),
                    self.flavor,
                ),
                postbuilds,
                quiet=True,
            )

        if not postbuilds:
            return ""
        # Postbuilds expect to be run in the gyp file's directory, so insert an
        # implicit postbuild to cd to there.
        postbuilds.insert(
            0, gyp.common.EncodePOSIXShellList(["cd", self.build_to_base])
        )
        env = self.ComputeExportEnvString(self.GetSortedXcodePostbuildEnv())
        # G will be non-null if any postbuild fails. Run all postbuilds in a
        # subshell.
        commands = (
            env
            + " ("
            + " && ".join([ninja_syntax.escape(command) for command in postbuilds])
        )
        command_string = (
            commands
            + "); G=$$?; "
            # Remove the final output if any postbuild failed.
            "((exit $$G) || rm -rf %s) " % output
            + "&& exit $$G)"
        )
        if is_command_start:
            return "(" + command_string + " && "
        else:
            return "$ && (" + command_string

    def ComputeExportEnvString(self, env):
        """Given an environment, returns a string looking like
            'export FOO=foo; export BAR="${FOO} bar;'
        that exports |env| to the shell."""
        export_str = []
        for k, v in env:
            export_str.append(
                "export %s=%s;"
                % (k, ninja_syntax.escape(gyp.common.EncodePOSIXShellArgument(v)))
            )
        return " ".join(export_str)

    def ComputeMacBundleOutput(self):
        """Return the 'output' (full output path) to a bundle output directory."""
        assert self.is_mac_bundle
        path = generator_default_variables["PRODUCT_DIR"]
        return self.ExpandSpecial(
            os.path.join(path, self.xcode_settings.GetWrapperName())
        )

    def ComputeOutputFileName(self, spec, type=None):
        """Compute the filename of the final output for the current target."""
        if not type:
            type = spec["type"]

        default_variables = copy.copy(generator_default_variables)
        CalculateVariables(default_variables, {"flavor": self.flavor})

        # Compute filename prefix: the product prefix, or a default for
        # the product type.
        DEFAULT_PREFIX = {
            "loadable_module": default_variables["SHARED_LIB_PREFIX"],
            "shared_library": default_variables["SHARED_LIB_PREFIX"],
            "static_library": default_variables["STATIC_LIB_PREFIX"],
            "executable": default_variables["EXECUTABLE_PREFIX"],
        }
        prefix = spec.get("product_prefix", DEFAULT_PREFIX.get(type, ""))

        # Compute filename extension: the product extension, or a default
        # for the product type.
        DEFAULT_EXTENSION = {
            "loadable_module": default_variables["SHARED_LIB_SUFFIX"],
            "shared_library": default_variables["SHARED_LIB_SUFFIX"],
            "static_library": default_variables["STATIC_LIB_SUFFIX"],
            "executable": default_variables["EXECUTABLE_SUFFIX"],
        }
        extension = spec.get("product_extension")
        extension = "." + extension if extension else DEFAULT_EXTENSION.get(type, "")

        if "product_name" in spec:
            # If we were given an explicit name, use that.
            target = spec["product_name"]
        else:
            # Otherwise, derive a name from the target name.
            target = spec["target_name"]
            if prefix == "lib":
                # Snip out an extra 'lib' from libs if appropriate.
                target = StripPrefix(target, "lib")

        if type in (
            "static_library",
            "loadable_module",
            "shared_library",
            "executable",
        ):
            return f"{prefix}{target}{extension}"
        elif type == "none":
            return "%s.stamp" % target
        else:
            raise Exception("Unhandled output type %s" % type)

    def ComputeOutput(self, spec, arch=None):
        """Compute the path for the final output of the spec."""
        type = spec["type"]

        if self.flavor == "win":
            override = self.msvs_settings.GetOutputName(
                self.config_name, self.ExpandSpecial
            )
            if override:
                return override

        if (
            arch is None
            and self.flavor == "mac"
            and type
            in ("static_library", "executable", "shared_library", "loadable_module")
        ):
            filename = self.xcode_settings.GetExecutablePath()
        else:
            filename = self.ComputeOutputFileName(spec, type)

        if arch is None and "product_dir" in spec:
            path = os.path.join(spec["product_dir"], filename)
            return self.ExpandSpecial(path)

        # Some products go into the output root, libraries go into shared library
        # dir, and everything else goes into the normal place.
        type_in_output_root = ["executable", "loadable_module"]
        if self.flavor == "mac" and self.toolset == "target":
            type_in_output_root += ["shared_library", "static_library"]
        elif self.flavor == "win" and self.toolset == "target":
            type_in_output_root += ["shared_library"]

        if arch is not None:
            # Make sure partial executables don't end up in a bundle or the regular
            # output directory.
            archdir = "arch"
            if self.toolset != "target":
                archdir = os.path.join("arch", "%s" % self.toolset)
            return os.path.join(archdir, AddArch(filename, arch))
        elif type in type_in_output_root or self.is_standalone_static_library:
            return filename
        elif type == "shared_library":
            libdir = "lib"
            if self.toolset != "target":
                libdir = os.path.join("lib", "%s" % self.toolset)
            return os.path.join(libdir, filename)
        else:
            return self.GypPathToUniqueOutput(filename, qualified=False)

    def WriteVariableList(self, ninja_file, var, values):
        assert not isinstance(values, str)
        if values is None:
            values = []
        ninja_file.variable(var, " ".join(values))

    def WriteNewNinjaRule(
        self, name, args, description, win_shell_flags, env, pool, depfile=None
    ):
        """Write out a new ninja "rule" statement for a given command.

        Returns the name of the new rule, and a copy of |args| with variables
        expanded."""

        if self.flavor == "win":
            args = [
                self.msvs_settings.ConvertVSMacros(
                    arg, self.base_to_build, config=self.config_name
                )
                for arg in args
            ]
            description = self.msvs_settings.ConvertVSMacros(
                description, config=self.config_name
            )
        elif self.flavor == "mac":
            # |env| is an empty list on non-mac.
            args = [gyp.xcode_emulation.ExpandEnvVars(arg, env) for arg in args]
            description = gyp.xcode_emulation.ExpandEnvVars(description, env)

        # TODO: we shouldn't need to qualify names; we do it because
        # currently the ninja rule namespace is global, but it really
        # should be scoped to the subninja.
        rule_name = self.name
        if self.toolset == "target":
            rule_name += "." + self.toolset
        rule_name += "." + name
        rule_name = re.sub("[^a-zA-Z0-9_]", "_", rule_name)

        # Remove variable references, but not if they refer to the magic rule
        # variables.  This is not quite right, as it also protects these for
        # actions, not just for rules where they are valid. Good enough.
        protect = ["${root}", "${dirname}", "${source}", "${ext}", "${name}"]
        protect = "(?!" + "|".join(map(re.escape, protect)) + ")"
        description = re.sub(protect + r"\$", "_", description)

        # gyp dictates that commands are run from the base directory.
        # cd into the directory before running, and adjust paths in
        # the arguments to point to the proper locations.
        rspfile = None
        rspfile_content = None
        args = [self.ExpandSpecial(arg, self.base_to_build) for arg in args]
        if self.flavor == "win":
            rspfile = rule_name + ".$unique_name.rsp"
            # The cygwin case handles this inside the bash sub-shell.
            run_in = "" if win_shell_flags.cygwin else " " + self.build_to_base
            if win_shell_flags.cygwin:
                rspfile_content = self.msvs_settings.BuildCygwinBashCommandLine(
                    args, self.build_to_base
                )
            else:
                rspfile_content = gyp.msvs_emulation.EncodeRspFileList(
                    args, win_shell_flags.quote)
            command = (
                "%s gyp-win-tool action-wrapper $arch " % sys.executable
                + rspfile
                + run_in
            )
        else:
            env = self.ComputeExportEnvString(env)
            command = gyp.common.EncodePOSIXShellList(args)
            command = "cd %s; " % self.build_to_base + env + command

        # GYP rules/actions express being no-ops by not touching their outputs.
        # Avoid executing downstream dependencies in this case by specifying
        # restat=1 to ninja.
        self.ninja.rule(
            rule_name,
            command,
            description,
            depfile=depfile,
            restat=True,
            pool=pool,
            rspfile=rspfile,
            rspfile_content=rspfile_content,
        )
        self.ninja.newline()

        return rule_name, args


def CalculateVariables(default_variables, params):
    """Calculate additional variables for use in the build (called by gyp)."""
    global generator_additional_non_configuration_keys
    global generator_additional_path_sections
    flavor = gyp.common.GetFlavor(params)
    if flavor == "mac":
        default_variables.setdefault("OS", "mac")
        default_variables.setdefault("SHARED_LIB_SUFFIX", ".dylib")
        default_variables.setdefault(
            "SHARED_LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )
        default_variables.setdefault(
            "LIB_DIR", generator_default_variables["PRODUCT_DIR"]
        )

        # Copy additional generator configuration data from Xcode, which is shared
        # by the Mac Ninja generator.
        import gyp.generator.xcode as xcode_generator

        generator_additional_non_configuration_keys = getattr(
            xcode_generator, "generator_additional_non_configuration_keys", []
        )
        generator_additional_path_sections = getattr(
            xcode_generator, "generator_additional_path_sections", []
        )
        global generator_extra_sources_for_rules
        generator_extra_sources_for_rules = getattr(
            xcode_generator, "generator_extra_sources_for_rules", []
        )
    elif flavor == "win":
        exts = gyp.MSVSUtil.TARGET_TYPE_EXT
        default_variables.setdefault("OS", "win")
        default_variables["EXECUTABLE_SUFFIX"] = "." + exts["executable"]
        default_variables["STATIC_LIB_PREFIX"] = ""
        default_variables["STATIC_LIB_SUFFIX"] = "." + exts["static_library"]
        default_variables["SHARED_LIB_PREFIX"] = ""
        default_variables["SHARED_LIB_SUFFIX"] = "." + exts["shared_library"]

        # Copy additional generator configuration data from VS, which is shared
        # by the Windows Ninja generator.
        import gyp.generator.msvs as msvs_generator

        generator_additional_non_configuration_keys = getattr(
            msvs_generator, "generator_additional_non_configuration_keys", []
        )
        generator_additional_path_sections = getattr(
            msvs_generator, "generator_additional_path_sections", []
        )

        gyp.msvs_emulation.CalculateCommonVariables(default_variables, params)
    else:
        operating_system = flavor
        if flavor == "android":
            operating_system = "linux"  # Keep this legacy behavior for now.
        default_variables.setdefault("OS", operating_system)
        default_variables.setdefault("SHARED_LIB_SUFFIX", ".so")
        default_variables.setdefault(
            "SHARED_LIB_DIR", os.path.join("$!PRODUCT_DIR", "lib")
        )
        default_variables.setdefault("LIB_DIR", os.path.join("$!PRODUCT_DIR", "obj"))


def ComputeOutputDir(params):
    """Returns the path from the toplevel_dir to the build output directory."""
    # generator_dir: relative path from pwd to where make puts build files.
    # Makes migrating from make to ninja easier, ninja doesn't put anything here.
    generator_dir = os.path.relpath(params["options"].generator_output or ".")

    # output_dir: relative path from generator_dir to the build directory.
    output_dir = params.get("generator_flags", {}).get("output_dir", "out")

    # Relative path from source root to our output files.  e.g. "out"
    return os.path.normpath(os.path.join(generator_dir, output_dir))


def CalculateGeneratorInputInfo(params):
    """Called by __init__ to initialize generator values based on params."""
    # E.g. "out/gypfiles"
    toplevel = params["options"].toplevel_dir
    qualified_out_dir = os.path.normpath(
        os.path.join(toplevel, ComputeOutputDir(params), "gypfiles")
    )

    global generator_filelist_paths
    generator_filelist_paths = {
        "toplevel": toplevel,
        "qualified_out_dir": qualified_out_dir,
    }


def OpenOutput(path, mode="w"):
    """Open |path| for writing, creating directories if necessary."""
    gyp.common.EnsureDirExists(path)
    return open(path, mode)


def CommandWithWrapper(cmd, wrappers, prog):
    wrapper = wrappers.get(cmd, "")
    if wrapper:
        return wrapper + " " + prog
    return prog


def GetDefaultConcurrentLinks():
    """Returns a best-guess for a number of concurrent links."""
    pool_size = int(os.environ.get("GYP_LINK_CONCURRENCY", 0))
    if pool_size:
        return pool_size

    if sys.platform in ("win32", "cygwin"):
        import ctypes

        class MEMORYSTATUSEX(ctypes.Structure):
            _fields_ = [
                ("dwLength", ctypes.c_ulong),
                ("dwMemoryLoad", ctypes.c_ulong),
                ("ullTotalPhys", ctypes.c_ulonglong),
                ("ullAvailPhys", ctypes.c_ulonglong),
                ("ullTotalPageFile", ctypes.c_ulonglong),
                ("ullAvailPageFile", ctypes.c_ulonglong),
                ("ullTotalVirtual", ctypes.c_ulonglong),
                ("ullAvailVirtual", ctypes.c_ulonglong),
                ("sullAvailExtendedVirtual", ctypes.c_ulonglong),
            ]

        stat = MEMORYSTATUSEX()
        stat.dwLength = ctypes.sizeof(stat)
        ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))

        # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM
        # on a 64 GiB machine.
        mem_limit = max(1, stat.ullTotalPhys // (5 * (2 ** 30)))  # total / 5GiB
        hard_cap = max(1, int(os.environ.get("GYP_LINK_CONCURRENCY_MAX", 2 ** 32)))
        return min(mem_limit, hard_cap)
    elif sys.platform.startswith("linux"):
        if os.path.exists("/proc/meminfo"):
            with open("/proc/meminfo") as meminfo:
                memtotal_re = re.compile(r"^MemTotal:\s*(\d*)\s*kB")
                for line in meminfo:
                    match = memtotal_re.match(line)
                    if not match:
                        continue
                    # Allow 8Gb per link on Linux because Gold is quite memory hungry
                    return max(1, int(match.group(1)) // (8 * (2 ** 20)))
        return 1
    elif sys.platform == "darwin":
        try:
            avail_bytes = int(subprocess.check_output(["sysctl", "-n", "hw.memsize"]))
            # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
            # 4GB per ld process allows for some more bloat.
            return max(1, avail_bytes // (4 * (2 ** 30)))  # total / 4GB
        except subprocess.CalledProcessError:
            return 1
    else:
        # TODO(scottmg): Implement this for other platforms.
        return 1


def _GetWinLinkRuleNameSuffix(embed_manifest):
    """Returns the suffix used to select an appropriate linking rule depending on
    whether the manifest embedding is enabled."""
    return "_embed" if embed_manifest else ""


def _AddWinLinkRules(master_ninja, embed_manifest):
    """Adds link rules for Windows platform to |master_ninja|."""

    def FullLinkCommand(ldcmd, out, binary_type):
        resource_name = {"exe": "1", "dll": "2"}[binary_type]
        return (
            "%(python)s gyp-win-tool link-with-manifests $arch %(embed)s "
            '%(out)s "%(ldcmd)s" %(resname)s $mt $rc "$intermediatemanifest" '
            "$manifests"
            % {
                "python": sys.executable,
                "out": out,
                "ldcmd": ldcmd,
                "resname": resource_name,
                "embed": embed_manifest,
            }
        )

    rule_name_suffix = _GetWinLinkRuleNameSuffix(embed_manifest)
    use_separate_mspdbsrv = int(os.environ.get("GYP_USE_SEPARATE_MSPDBSRV", "0")) != 0
    dlldesc = "LINK%s(DLL) $binary" % rule_name_suffix.upper()
    dllcmd = (
        "%s gyp-win-tool link-wrapper $arch %s "
        "$ld /nologo $implibflag /DLL /OUT:$binary "
        "@$binary.rsp" % (sys.executable, use_separate_mspdbsrv)
    )
    dllcmd = FullLinkCommand(dllcmd, "$binary", "dll")
    master_ninja.rule(
        "solink" + rule_name_suffix,
        description=dlldesc,
        command=dllcmd,
        rspfile="$binary.rsp",
        rspfile_content="$libs $in_newline $ldflags",
        restat=True,
        pool="link_pool",
    )
    master_ninja.rule(
        "solink_module" + rule_name_suffix,
        description=dlldesc,
        command=dllcmd,
        rspfile="$binary.rsp",
        rspfile_content="$libs $in_newline $ldflags",
        restat=True,
        pool="link_pool",
    )
    # Note that ldflags goes at the end so that it has the option of
    # overriding default settings earlier in the command line.
    exe_cmd = (
        "%s gyp-win-tool link-wrapper $arch %s "
        "$ld /nologo /OUT:$binary @$binary.rsp"
        % (sys.executable, use_separate_mspdbsrv)
    )
    exe_cmd = FullLinkCommand(exe_cmd, "$binary", "exe")
    master_ninja.rule(
        "link" + rule_name_suffix,
        description="LINK%s $binary" % rule_name_suffix.upper(),
        command=exe_cmd,
        rspfile="$binary.rsp",
        rspfile_content="$in_newline $libs $ldflags",
        pool="link_pool",
    )


def GenerateOutputForConfig(target_list, target_dicts, data, params, config_name):
    options = params["options"]
    flavor = gyp.common.GetFlavor(params)
    generator_flags = params.get("generator_flags", {})

    # build_dir: relative path from source root to our output files.
    # e.g. "out/Debug"
    build_dir = os.path.normpath(os.path.join(ComputeOutputDir(params), config_name))

    toplevel_build = os.path.join(options.toplevel_dir, build_dir)

    master_ninja_file = OpenOutput(os.path.join(toplevel_build, "build.ninja"))
    master_ninja = ninja_syntax.Writer(master_ninja_file, width=120)

    # Put build-time support tools in out/{config_name}.
    gyp.common.CopyTool(flavor, toplevel_build, generator_flags)

    # Grab make settings for CC/CXX.
    # The rules are
    # - The priority from low to high is gcc/g++, the 'make_global_settings' in
    #   gyp, the environment variable.
    # - If there is no 'make_global_settings' for CC.host/CXX.host or
    #   'CC_host'/'CXX_host' environment variable, cc_host/cxx_host should be set
    #   to cc/cxx.
    if flavor == "win":
        ar = "lib.exe"
        # cc and cxx must be set to the correct architecture by overriding with one
        # of cl_x86 or cl_x64 below.
        cc = "UNSET"
        cxx = "UNSET"
        ld = "link.exe"
        ld_host = "$ld"
    else:
        ar = "ar"
        cc = "cc"
        cxx = "c++"
        ld = "$cc"
        ldxx = "$cxx"
        ld_host = "$cc_host"
        ldxx_host = "$cxx_host"

    ar_host = ar
    cc_host = None
    cxx_host = None
    cc_host_global_setting = None
    cxx_host_global_setting = None
    clang_cl = None
    nm = "nm"
    nm_host = "nm"
    readelf = "readelf"
    readelf_host = "readelf"

    build_file, _, _ = gyp.common.ParseQualifiedTarget(target_list[0])
    make_global_settings = data[build_file].get("make_global_settings", [])
    build_to_root = gyp.common.InvertRelativePath(build_dir, options.toplevel_dir)
    wrappers = {}
    for key, value in make_global_settings:
        if key == "AR":
            ar = os.path.join(build_to_root, value)
        if key == "AR.host":
            ar_host = os.path.join(build_to_root, value)
        if key == "CC":
            cc = os.path.join(build_to_root, value)
            if cc.endswith("clang-cl"):
                clang_cl = cc
        if key == "CXX":
            cxx = os.path.join(build_to_root, value)
        if key == "CC.host":
            cc_host = os.path.join(build_to_root, value)
            cc_host_global_setting = value
        if key == "CXX.host":
            cxx_host = os.path.join(build_to_root, value)
            cxx_host_global_setting = value
        if key == "LD":
            ld = os.path.join(build_to_root, value)
        if key == "LD.host":
            ld_host = os.path.join(build_to_root, value)
        if key == "LDXX":
            ldxx = os.path.join(build_to_root, value)
        if key == "LDXX.host":
            ldxx_host = os.path.join(build_to_root, value)
        if key == "NM":
            nm = os.path.join(build_to_root, value)
        if key == "NM.host":
            nm_host = os.path.join(build_to_root, value)
        if key == "READELF":
            readelf = os.path.join(build_to_root, value)
        if key == "READELF.host":
            readelf_host = os.path.join(build_to_root, value)
        if key.endswith("_wrapper"):
            wrappers[key[: -len("_wrapper")]] = os.path.join(build_to_root, value)

    # Support wrappers from environment variables too.
    for key, value in os.environ.items():
        if key.lower().endswith("_wrapper"):
            key_prefix = key[: -len("_wrapper")]
            key_prefix = re.sub(r"\.HOST$", ".host", key_prefix)
            wrappers[key_prefix] = os.path.join(build_to_root, value)

    mac_toolchain_dir = generator_flags.get("mac_toolchain_dir", None)
    if mac_toolchain_dir:
        wrappers["LINK"] = "export DEVELOPER_DIR='%s' &&" % mac_toolchain_dir

    if flavor == "win":
        configs = [
            target_dicts[qualified_target]["configurations"][config_name]
            for qualified_target in target_list
        ]
        shared_system_includes = None
        if not generator_flags.get("ninja_use_custom_environment_files", 0):
            shared_system_includes = gyp.msvs_emulation.ExtractSharedMSVSSystemIncludes(
                configs, generator_flags
            )
        cl_paths = gyp.msvs_emulation.GenerateEnvironmentFiles(
            toplevel_build, generator_flags, shared_system_includes, OpenOutput
        )
        for arch, path in sorted(cl_paths.items()):
            if clang_cl:
                # If we have selected clang-cl, use that instead.
                path = clang_cl
            command = CommandWithWrapper(
                "CC", wrappers, QuoteShellArgument(path, "win")
            )
            if clang_cl:
                # Use clang-cl to cross-compile for x86 or x86_64.
                command += " -m32" if arch == "x86" else " -m64"
            master_ninja.variable("cl_" + arch, command)

    cc = GetEnvironFallback(["CC_target", "CC"], cc)
    master_ninja.variable("cc", CommandWithWrapper("CC", wrappers, cc))
    cxx = GetEnvironFallback(["CXX_target", "CXX"], cxx)
    master_ninja.variable("cxx", CommandWithWrapper("CXX", wrappers, cxx))

    if flavor == "win":
        master_ninja.variable("ld", ld)
        master_ninja.variable("idl", "midl.exe")
        master_ninja.variable("ar", ar)
        master_ninja.variable("rc", "rc.exe")
        master_ninja.variable("ml_x86", "ml.exe")
        master_ninja.variable("ml_x64", "ml64.exe")
        master_ninja.variable("mt", "mt.exe")
    else:
        master_ninja.variable("ld", CommandWithWrapper("LINK", wrappers, ld))
        master_ninja.variable("ldxx", CommandWithWrapper("LINK", wrappers, ldxx))
        master_ninja.variable("ar", GetEnvironFallback(["AR_target", "AR"], ar))
        if flavor != "mac":
            # Mac does not use readelf/nm for .TOC generation, so avoiding polluting
            # the master ninja with extra unused variables.
            master_ninja.variable("nm", GetEnvironFallback(["NM_target", "NM"], nm))
            master_ninja.variable(
                "readelf", GetEnvironFallback(["READELF_target", "READELF"], readelf)
            )

    if generator_supports_multiple_toolsets:
        if not cc_host:
            cc_host = cc
        if not cxx_host:
            cxx_host = cxx

        master_ninja.variable("ar_host", GetEnvironFallback(["AR_host"], ar_host))
        master_ninja.variable("nm_host", GetEnvironFallback(["NM_host"], nm_host))
        master_ninja.variable(
            "readelf_host", GetEnvironFallback(["READELF_host"], readelf_host)
        )
        cc_host = GetEnvironFallback(["CC_host"], cc_host)
        cxx_host = GetEnvironFallback(["CXX_host"], cxx_host)

        # The environment variable could be used in 'make_global_settings', like
        # ['CC.host', '$(CC)'] or ['CXX.host', '$(CXX)'], transform them here.
        if "$(CC)" in cc_host and cc_host_global_setting:
            cc_host = cc_host_global_setting.replace("$(CC)", cc)
        if "$(CXX)" in cxx_host and cxx_host_global_setting:
            cxx_host = cxx_host_global_setting.replace("$(CXX)", cxx)
        master_ninja.variable(
            "cc_host", CommandWithWrapper("CC.host", wrappers, cc_host)
        )
        master_ninja.variable(
            "cxx_host", CommandWithWrapper("CXX.host", wrappers, cxx_host)
        )
        if flavor == "win":
            master_ninja.variable("ld_host", ld_host)
        else:
            master_ninja.variable(
                "ld_host", CommandWithWrapper("LINK", wrappers, ld_host)
            )
            master_ninja.variable(
                "ldxx_host", CommandWithWrapper("LINK", wrappers, ldxx_host)
            )

    master_ninja.newline()

    master_ninja.pool("link_pool", depth=GetDefaultConcurrentLinks())
    master_ninja.newline()

    deps = "msvc" if flavor == "win" else "gcc"

    if flavor != "win":
        master_ninja.rule(
            "cc",
            description="CC $out",
            command=(
                "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_c "
                "$cflags_pch_c -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "cc_s",
            description="CC $out",
            command=(
                "$cc $defines $includes $cflags $cflags_c "
                "$cflags_pch_c -c $in -o $out"
            ),
        )
        master_ninja.rule(
            "cxx",
            description="CXX $out",
            command=(
                "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_cc "
                "$cflags_pch_cc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
    else:
        # TODO(scottmg) Separate pdb names is a test to see if it works around
        # http://crbug.com/142362. It seems there's a race between the creation of
        # the .pdb by the precompiled header step for .cc and the compilation of
        # .c files. This should be handled by mspdbsrv, but rarely errors out with
        #   c1xx : fatal error C1033: cannot open program database
        # By making the rules target separate pdb files this might be avoided.
        cc_command = (
            "ninja -t msvc -e $arch " + "-- "
            "$cc /nologo /showIncludes /FC "
            "@$out.rsp /c $in /Fo$out /Fd$pdbname_c "
        )
        cxx_command = (
            "ninja -t msvc -e $arch " + "-- "
            "$cxx /nologo /showIncludes /FC "
            "@$out.rsp /c $in /Fo$out /Fd$pdbname_cc "
        )
        master_ninja.rule(
            "cc",
            description="CC $out",
            command=cc_command,
            rspfile="$out.rsp",
            rspfile_content="$defines $includes $cflags $cflags_c",
            deps=deps,
        )
        master_ninja.rule(
            "cxx",
            description="CXX $out",
            command=cxx_command,
            rspfile="$out.rsp",
            rspfile_content="$defines $includes $cflags $cflags_cc",
            deps=deps,
        )
        master_ninja.rule(
            "idl",
            description="IDL $in",
            command=(
                "%s gyp-win-tool midl-wrapper $arch $outdir "
                "$tlb $h $dlldata $iid $proxy $in "
                "$midl_includes $idlflags" % sys.executable
            ),
        )
        master_ninja.rule(
            "rc",
            description="RC $in",
            # Note: $in must be last otherwise rc.exe complains.
            command=(
                "%s gyp-win-tool rc-wrapper "
                "$arch $rc $defines $resource_includes $rcflags /fo$out $in"
                % sys.executable
            ),
        )
        master_ninja.rule(
            "asm",
            description="ASM $out",
            command=(
                "%s gyp-win-tool asm-wrapper "
                "$arch $asm $defines $includes $asmflags /c /Fo $out $in"
                % sys.executable
            ),
        )

    if flavor not in ("ios", "mac", "win"):
        master_ninja.rule(
            "alink",
            description="AR $out",
            command="rm -f $out && $ar rcs $arflags $out $in",
        )
        master_ninja.rule(
            "alink_thin",
            description="AR $out",
            command="rm -f $out && $ar rcsT $arflags $out $in",
        )

        # This allows targets that only need to depend on $lib's API to declare an
        # order-only dependency on $lib.TOC and avoid relinking such downstream
        # dependencies when $lib changes only in non-public ways.
        # The resulting string leaves an uninterpolated %{suffix} which
        # is used in the final substitution below.
        mtime_preserving_solink_base = (
            "if [ ! -e $lib -o ! -e $lib.TOC ]; then "
            "%(solink)s && %(extract_toc)s > $lib.TOC; else "
            "%(solink)s && %(extract_toc)s > $lib.tmp && "
            "if ! cmp -s $lib.tmp $lib.TOC; then mv $lib.tmp $lib.TOC ; "
            "fi; fi"
            % {
                "solink": "$ld -shared $ldflags -o $lib -Wl,-soname=$soname %(suffix)s",
                "extract_toc": (
                    "{ $readelf -d $lib | grep SONAME ; "
                    "$nm -gD -f p $lib | cut -f1-2 -d' '; }"
                ),
            }
        )

        master_ninja.rule(
            "solink",
            description="SOLINK $lib",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": "@$link_file_list"},
            rspfile="$link_file_list",
            rspfile_content=(
                "-Wl,--whole-archive $in $solibs -Wl," "--no-whole-archive $libs"
            ),
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_module",
            description="SOLINK(module) $lib",
            restat=True,
            command=mtime_preserving_solink_base % {"suffix": "@$link_file_list"},
            rspfile="$link_file_list",
            rspfile_content="-Wl,--start-group $in $solibs $libs -Wl,--end-group",
            pool="link_pool",
        )
        master_ninja.rule(
            "link",
            description="LINK $out",
            command=(
                "$ld $ldflags -o $out "
                "-Wl,--start-group $in $solibs $libs -Wl,--end-group"
            ),
            pool="link_pool",
        )
    elif flavor == "win":
        master_ninja.rule(
            "alink",
            description="LIB $out",
            command=(
                "%s gyp-win-tool link-wrapper $arch False "
                "$ar /nologo /ignore:4221 /OUT:$out @$out.rsp" % sys.executable
            ),
            rspfile="$out.rsp",
            rspfile_content="$in_newline $libflags",
        )
        _AddWinLinkRules(master_ninja, embed_manifest=True)
        _AddWinLinkRules(master_ninja, embed_manifest=False)
    else:
        master_ninja.rule(
            "objc",
            description="OBJC $out",
            command=(
                "$cc -MMD -MF $out.d $defines $includes $cflags $cflags_objc "
                "$cflags_pch_objc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "objcxx",
            description="OBJCXX $out",
            command=(
                "$cxx -MMD -MF $out.d $defines $includes $cflags $cflags_objcc "
                "$cflags_pch_objcc -c $in -o $out"
            ),
            depfile="$out.d",
            deps=deps,
        )
        master_ninja.rule(
            "alink",
            description="LIBTOOL-STATIC $out, POSTBUILDS",
            command="rm -f $out && "
            "./gyp-mac-tool filter-libtool libtool $libtool_flags "
            "-static -o $out $in"
            "$postbuilds",
        )
        master_ninja.rule(
            "lipo",
            description="LIPO $out, POSTBUILDS",
            command="rm -f $out && lipo -create $in -output $out$postbuilds",
        )
        master_ninja.rule(
            "solipo",
            description="SOLIPO $out, POSTBUILDS",
            command=(
                "rm -f $lib $lib.TOC && lipo -create $in -output $lib$postbuilds &&"
                "%(extract_toc)s > $lib.TOC"
                % {
                    "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; "
                    "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }"
                }
            ),
        )

        # Record the public interface of $lib in $lib.TOC. See the corresponding
        # comment in the posix section above for details.
        solink_base = "$ld %(type)s $ldflags -o $lib %(suffix)s"
        mtime_preserving_solink_base = (
            "if [ ! -e $lib -o ! -e $lib.TOC ] || "
            # Always force dependent targets to relink if this library
            # reexports something. Handling this correctly would require
            # recursive TOC dumping but this is rare in practice, so punt.
            "otool -l $lib | grep -q LC_REEXPORT_DYLIB ; then "
            "%(solink)s && %(extract_toc)s > $lib.TOC; "
            "else "
            "%(solink)s && %(extract_toc)s > $lib.tmp && "
            "if ! cmp -s $lib.tmp $lib.TOC; then "
            "mv $lib.tmp $lib.TOC ; "
            "fi; "
            "fi"
            % {
                "solink": solink_base,
                "extract_toc": "{ otool -l $lib | grep LC_ID_DYLIB -A 5; "
                "nm -gP $lib | cut -f1-2 -d' ' | grep -v U$$; true; }",
            }
        )

        solink_suffix = "@$link_file_list$postbuilds"
        master_ninja.rule(
            "solink",
            description="SOLINK $lib, POSTBUILDS",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": solink_suffix, "type": "-shared"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_notoc",
            description="SOLINK $lib, POSTBUILDS",
            restat=True,
            command=solink_base % {"suffix": solink_suffix, "type": "-shared"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )

        master_ninja.rule(
            "solink_module",
            description="SOLINK(module) $lib, POSTBUILDS",
            restat=True,
            command=mtime_preserving_solink_base
            % {"suffix": solink_suffix, "type": "-bundle"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )
        master_ninja.rule(
            "solink_module_notoc",
            description="SOLINK(module) $lib, POSTBUILDS",
            restat=True,
            command=solink_base % {"suffix": solink_suffix, "type": "-bundle"},
            rspfile="$link_file_list",
            rspfile_content="$in $solibs $libs",
            pool="link_pool",
        )

        master_ninja.rule(
            "link",
            description="LINK $out, POSTBUILDS",
            command=("$ld $ldflags -o $out " "$in $solibs $libs$postbuilds"),
            pool="link_pool",
        )
        master_ninja.rule(
            "preprocess_infoplist",
            description="PREPROCESS INFOPLIST $out",
            command=(
                "$cc -E -P -Wno-trigraphs -x c $defines $in -o $out && "
                "plutil -convert xml1 $out $out"
            ),
        )
        master_ninja.rule(
            "copy_infoplist",
            description="COPY INFOPLIST $in",
            command="$env ./gyp-mac-tool copy-info-plist $in $out $binary $keys",
        )
        master_ninja.rule(
            "merge_infoplist",
            description="MERGE INFOPLISTS $in",
            command="$env ./gyp-mac-tool merge-info-plist $out $in",
        )
        master_ninja.rule(
            "compile_xcassets",
            description="COMPILE XCASSETS $in",
            command="$env ./gyp-mac-tool compile-xcassets $keys $in",
        )
        master_ninja.rule(
            "compile_ios_framework_headers",
            description="COMPILE HEADER MAPS AND COPY FRAMEWORK HEADERS $in",
            command="$env ./gyp-mac-tool compile-ios-framework-header-map $out "
            "$framework $in && $env ./gyp-mac-tool "
            "copy-ios-framework-headers $framework $copy_headers",
        )
        master_ninja.rule(
            "mac_tool",
            description="MACTOOL $mactool_cmd $in",
            command="$env ./gyp-mac-tool $mactool_cmd $in $out $binary",
        )
        master_ninja.rule(
            "package_framework",
            description="PACKAGE FRAMEWORK $out, POSTBUILDS",
            command="./gyp-mac-tool package-framework $out $version$postbuilds "
            "&& touch $out",
        )
        master_ninja.rule(
            "package_ios_framework",
            description="PACKAGE IOS FRAMEWORK $out, POSTBUILDS",
            command="./gyp-mac-tool package-ios-framework $out $postbuilds "
            "&& touch $out",
        )
    if flavor == "win":
        master_ninja.rule(
            "stamp",
            description="STAMP $out",
            command="%s gyp-win-tool stamp $out" % sys.executable,
        )
    else:
        master_ninja.rule(
            "stamp", description="STAMP $out", command="${postbuilds}touch $out"
        )
    if flavor == "win":
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="%s gyp-win-tool recursive-mirror $in $out" % sys.executable,
        )
    elif flavor == "zos":
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="rm -rf $out && cp -fRP $in $out",
        )
    else:
        master_ninja.rule(
            "copy",
            description="COPY $in $out",
            command="ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)",
        )
    master_ninja.newline()

    all_targets = set()
    for build_file in params["build_files"]:
        for target in gyp.common.AllTargets(
            target_list, target_dicts, os.path.normpath(build_file)
        ):
            all_targets.add(target)
    all_outputs = set()

    # target_outputs is a map from qualified target name to a Target object.
    target_outputs = {}
    # target_short_names is a map from target short name to a list of Target
    # objects.
    target_short_names = {}

    # short name of targets that were skipped because they didn't contain anything
    # interesting.
    # NOTE: there may be overlap between this an non_empty_target_names.
    empty_target_names = set()

    # Set of non-empty short target names.
    # NOTE: there may be overlap between this an empty_target_names.
    non_empty_target_names = set()

    for qualified_target in target_list:
        # qualified_target is like: third_party/icu/icu.gyp:icui18n#target
        build_file, name, toolset = gyp.common.ParseQualifiedTarget(qualified_target)

        this_make_global_settings = data[build_file].get("make_global_settings", [])
        assert make_global_settings == this_make_global_settings, (
            "make_global_settings needs to be the same for all targets. "
            f"{this_make_global_settings} vs. {make_global_settings}"
        )

        spec = target_dicts[qualified_target]
        if flavor == "mac":
            gyp.xcode_emulation.MergeGlobalXcodeSettingsToSpec(data[build_file], spec)

        # If build_file is a symlink, we must not follow it because there's a chance
        # it could point to a path above toplevel_dir, and we cannot correctly deal
        # with that case at the moment.
        build_file = gyp.common.RelativePath(build_file, options.toplevel_dir, False)

        qualified_target_for_hash = gyp.common.QualifiedTarget(
            build_file, name, toolset
        )
        qualified_target_for_hash = qualified_target_for_hash.encode("utf-8")
        hash_for_rules = hashlib.md5(qualified_target_for_hash).hexdigest()

        base_path = os.path.dirname(build_file)
        obj = "obj"
        if toolset != "target":
            obj += "." + toolset
        output_file = os.path.join(obj, base_path, name + ".ninja")

        ninja_output = StringIO()
        writer = NinjaWriter(
            hash_for_rules,
            target_outputs,
            base_path,
            build_dir,
            ninja_output,
            toplevel_build,
            output_file,
            flavor,
            toplevel_dir=options.toplevel_dir,
        )

        target = writer.WriteSpec(spec, config_name, generator_flags)

        if ninja_output.tell() > 0:
            # Only create files for ninja files that actually have contents.
            with OpenOutput(os.path.join(toplevel_build, output_file)) as ninja_file:
                ninja_file.write(ninja_output.getvalue())
            ninja_output.close()
            master_ninja.subninja(output_file)

        if target:
            if name != target.FinalOutput() and spec["toolset"] == "target":
                target_short_names.setdefault(name, []).append(target)
            target_outputs[qualified_target] = target
            if qualified_target in all_targets:
                all_outputs.add(target.FinalOutput())
            non_empty_target_names.add(name)
        else:
            empty_target_names.add(name)

    if target_short_names:
        # Write a short name to build this target.  This benefits both the
        # "build chrome" case as well as the gyp tests, which expect to be
        # able to run actions and build libraries by their short name.
        master_ninja.newline()
        master_ninja.comment("Short names for targets.")
        for short_name in sorted(target_short_names):
            master_ninja.build(
                short_name,
                "phony",
                [x.FinalOutput() for x in target_short_names[short_name]],
            )

    # Write phony targets for any empty targets that weren't written yet. As
    # short names are  not necessarily unique only do this for short names that
    # haven't already been output for another target.
    empty_target_names = empty_target_names - non_empty_target_names
    if empty_target_names:
        master_ninja.newline()
        master_ninja.comment("Empty targets (output for completeness).")
        for name in sorted(empty_target_names):
            master_ninja.build(name, "phony")

    if all_outputs:
        master_ninja.newline()
        master_ninja.build("all", "phony", sorted(all_outputs))
        master_ninja.default(generator_flags.get("default_target", "all"))

    master_ninja_file.close()


def PerformBuild(data, configurations, params):
    options = params["options"]
    for config in configurations:
        builddir = os.path.join(options.toplevel_dir, "out", config)
        arguments = ["ninja", "-C", builddir]
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def CallGenerateOutputForConfig(arglist):
    # Ignore the interrupt signal so that the parent process catches it and
    # kills all multiprocessing children.
    signal.signal(signal.SIGINT, signal.SIG_IGN)

    (target_list, target_dicts, data, params, config_name) = arglist
    GenerateOutputForConfig(target_list, target_dicts, data, params, config_name)


def GenerateOutput(target_list, target_dicts, data, params):
    # Update target_dicts for iOS device builds.
    target_dicts = gyp.xcode_emulation.CloneConfigurationForDeviceAndEmulator(
        target_dicts
    )

    user_config = params.get("generator_flags", {}).get("config", None)
    if gyp.common.GetFlavor(params) == "win":
        target_list, target_dicts = MSVSUtil.ShardTargets(target_list, target_dicts)
        target_list, target_dicts = MSVSUtil.InsertLargePdbShims(
            target_list, target_dicts, generator_default_variables
        )

    if user_config:
        GenerateOutputForConfig(target_list, target_dicts, data, params, user_config)
    else:
        config_names = target_dicts[target_list[0]]["configurations"]
        if params["parallel"]:
            try:
                pool = multiprocessing.Pool(len(config_names))
                arglists = []
                for config_name in config_names:
                    arglists.append(
                        (target_list, target_dicts, data, params, config_name)
                    )
                pool.map(CallGenerateOutputForConfig, arglists)
            except KeyboardInterrupt as e:
                pool.terminate()
                raise e
        else:
            for config_name in config_names:
                GenerateOutputForConfig(
                    target_list, target_dicts, data, params, config_name
                )
                                                                                                                                                                                                                                                                                                                                                                                                                                                     # Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Xcode project file generator.

This module is both an Xcode project file generator and a documentation of the
Xcode project file format.  Knowledge of the project file format was gained
based on extensive experience with Xcode, and by making changes to projects in
Xcode.app and observing the resultant changes in the associated project files.

XCODE PROJECT FILES

The generator targets the file format as written by Xcode 3.2 (specifically,
3.2.6), but past experience has taught that the format has not changed
significantly in the past several years, and future versions of Xcode are able
to read older project files.

Xcode project files are "bundled": the project "file" from an end-user's
perspective is actually a directory with an ".xcodeproj" extension.  The
project file from this module's perspective is actually a file inside this
directory, always named "project.pbxproj".  This file contains a complete
description of the project and is all that is needed to use the xcodeproj.
Other files contained in the xcodeproj directory are simply used to store
per-user settings, such as the state of various UI elements in the Xcode
application.

The project.pbxproj file is a property list, stored in a format almost
identical to the NeXTstep property list format.  The file is able to carry
Unicode data, and is encoded in UTF-8.  The root element in the property list
is a dictionary that contains several properties of minimal interest, and two
properties of immense interest.  The most important property is a dictionary
named "objects".  The entire structure of the project is represented by the
children of this property.  The objects dictionary is keyed by unique 96-bit
values represented by 24 uppercase hexadecimal characters.  Each value in the
objects dictionary is itself a dictionary, describing an individual object.

Each object in the dictionary is a member of a class, which is identified by
the "isa" property of each object.  A variety of classes are represented in a
project file.  Objects can refer to other objects by ID, using the 24-character
hexadecimal object key.  A project's objects form a tree, with a root object
of class PBXProject at the root.  As an example, the PBXProject object serves
as parent to an XCConfigurationList object defining the build configurations
used in the project, a PBXGroup object serving as a container for all files
referenced in the project, and a list of target objects, each of which defines
a target in the project.  There are several different types of target object,
such as PBXNativeTarget and PBXAggregateTarget.  In this module, this
relationship is expressed by having each target type derive from an abstract
base named XCTarget.

The project.pbxproj file's root dictionary also contains a property, sibling to
the "objects" dictionary, named "rootObject".  The value of rootObject is a
24-character object key referring to the root PBXProject object in the
objects dictionary.

In Xcode, every file used as input to a target or produced as a final product
of a target must appear somewhere in the hierarchy rooted at the PBXGroup
object referenced by the PBXProject's mainGroup property.  A PBXGroup is
generally represented as a folder in the Xcode application.  PBXGroups can
contain other PBXGroups as well as PBXFileReferences, which are pointers to
actual files.

Each XCTarget contains a list of build phases, represented in this module by
the abstract base XCBuildPhase.  Examples of concrete XCBuildPhase derivations
are PBXSourcesBuildPhase and PBXFrameworksBuildPhase, which correspond to the
"Compile Sources" and "Link Binary With Libraries" phases displayed in the
Xcode application.  Files used as input to these phases (for example, source
files in the former case and libraries and frameworks in the latter) are
represented by PBXBuildFile objects, referenced by elements of "files" lists
in XCTarget objects.  Each PBXBuildFile object refers to a PBXBuildFile
object as a "weak" reference: it does not "own" the PBXBuildFile, which is
owned by the root object's mainGroup or a descendant group.  In most cases, the
layer of indirection between an XCBuildPhase and a PBXFileReference via a
PBXBuildFile appears extraneous, but there's actually one reason for this:
file-specific compiler flags are added to the PBXBuildFile object so as to
allow a single file to be a member of multiple targets while having distinct
compiler flags for each.  These flags can be modified in the Xcode applciation
in the "Build" tab of a File Info window.

When a project is open in the Xcode application, Xcode will rewrite it.  As
such, this module is careful to adhere to the formatting used by Xcode, to
avoid insignificant changes appearing in the file when it is used in the
Xcode application.  This will keep version control repositories happy, and
makes it possible to compare a project file used in Xcode to one generated by
this module to determine if any significant changes were made in the
application.

Xcode has its own way of assigning 24-character identifiers to each object,
which is not duplicated here.  Because the identifier only is only generated
once, when an object is created, and is then left unchanged, there is no need
to attempt to duplicate Xcode's behavior in this area.  The generator is free
to select any identifier, even at random, to refer to the objects it creates,
and Xcode will retain those identifiers and use them when subsequently
rewriting the project file.  However, the generator would choose new random
identifiers each time the project files are generated, leading to difficulties
comparing "used" project files to "pristine" ones produced by this module,
and causing the appearance of changes as every object identifier is changed
when updated projects are checked in to a version control repository.  To
mitigate this problem, this module chooses identifiers in a more deterministic
way, by hashing a description of each object as well as its parent and ancestor
objects.  This strategy should result in minimal "shift" in IDs as successive
generations of project files are produced.

THIS MODULE

This module introduces several classes, all derived from the XCObject class.
Nearly all of the "brains" are built into the XCObject class, which understands
how to create and modify objects, maintain the proper tree structure, compute
identifiers, and print objects.  For the most part, classes derived from
XCObject need only provide a _schema class object, a dictionary that
expresses what properties objects of the class may contain.

Given this structure, it's possible to build a minimal project file by creating
objects of the appropriate types and making the proper connections:

  config_list = XCConfigurationList()
  group = PBXGroup()
  project = PBXProject({'buildConfigurationList': config_list,
                        'mainGroup': group})

With the project object set up, it can be added to an XCProjectFile object.
XCProjectFile is a pseudo-class in the sense that it is a concrete XCObject
subclass that does not actually correspond to a class type found in a project
file.  Rather, it is used to represent the project file's root dictionary.
Printing an XCProjectFile will print the entire project file, including the
full "objects" dictionary.

  project_file = XCProjectFile({'rootObject': project})
  project_file.ComputeIDs()
  project_file.Print()

Xcode project files are always encoded in UTF-8.  This module will accept
strings of either the str class or the unicode class.  Strings of class str
are assumed to already be encoded in UTF-8.  Obviously, if you're just using
ASCII, you won't encounter difficulties because ASCII is a UTF-8 subset.
Strings of class unicode are handled properly and encoded in UTF-8 when
a project file is output.
"""

import gyp.common
from functools import cmp_to_key
import hashlib
from operator import attrgetter
import posixpath
import re
import struct
import sys


def cmp(x, y):
    return (x > y) - (x < y)


# See XCObject._EncodeString.  This pattern is used to determine when a string
# can be printed unquoted.  Strings that match this pattern may be printed
# unquoted.  Strings that do not match must be quoted and may be further
# transformed to be properly encoded.  Note that this expression matches the
# characters listed with "+", for 1 or more occurrences: if a string is empty,
# it must not match this pattern, because it needs to be encoded as "".
_unquoted = re.compile("^[A-Za-z0-9$./_]+$")

# Strings that match this pattern are quoted regardless of what _unquoted says.
# Oddly, Xcode will quote any string with a run of three or more underscores.
_quoted = re.compile("___")

# This pattern should match any character that needs to be escaped by
# XCObject._EncodeString.  See that function.
_escaped = re.compile('[\\\\"]|[\x00-\x1f]')


# Used by SourceTreeAndPathFromPath
_path_leading_variable = re.compile(r"^\$\((.*?)\)(/(.*))?$")


def SourceTreeAndPathFromPath(input_path):
    """Given input_path, returns a tuple with sourceTree and path values.

  Examples:
    input_path     (source_tree, output_path)
    '$(VAR)/path'  ('VAR', 'path')
    '$(VAR)'       ('VAR', None)
    'path'         (None, 'path')
  """

    source_group_match = _path_leading_variable.match(input_path)
    if source_group_match:
        source_tree = source_group_match.group(1)
        output_path = source_group_match.group(3)  # This may be None.
    else:
        source_tree = None
        output_path = input_path

    return (source_tree, output_path)


def ConvertVariablesToShellSyntax(input_string):
    return re.sub(r"\$\((.*?)\)", "${\\1}", input_string)


class XCObject:
    """The abstract base of all class types used in Xcode project files.

  Class variables:
    _schema: A dictionary defining the properties of this class.  The keys to
             _schema are string property keys as used in project files.  Values
             are a list of four or five elements:
             [ is_list, property_type, is_strong, is_required, default ]
             is_list: True if the property described is a list, as opposed
                      to a single element.
             property_type: The type to use as the value of the property,
                            or if is_list is True, the type to use for each
                            element of the value's list.  property_type must
                            be an XCObject subclass, or one of the built-in
                            types str, int, or dict.
             is_strong: If property_type is an XCObject subclass, is_strong
                        is True to assert that this class "owns," or serves
                        as parent, to the property value (or, if is_list is
                        True, values).  is_strong must be False if
                        property_type is not an XCObject subclass.
             is_required: True if the property is required for the class.
                          Note that is_required being True does not preclude
                          an empty string ("", in the case of property_type
                          str) or list ([], in the case of is_list True) from
                          being set for the property.
             default: Optional.  If is_required is True, default may be set
                      to provide a default value for objects that do not supply
                      their own value.  If is_required is True and default
                      is not provided, users of the class must supply their own
                      value for the property.
             Note that although the values of the array are expressed in
             boolean terms, subclasses provide values as integers to conserve
             horizontal space.
    _should_print_single_line: False in XCObject.  Subclasses whose objects
                               should be written to the project file in the
                               alternate single-line format, such as
                               PBXFileReference and PBXBuildFile, should
                               set this to True.
    _encode_transforms: Used by _EncodeString to encode unprintable characters.
                        The index into this list is the ordinal of the
                        character to transform; each value is a string
                        used to represent the character in the output.  XCObject
                        provides an _encode_transforms list suitable for most
                        XCObject subclasses.
    _alternate_encode_transforms: Provided for subclasses that wish to use
                                  the alternate encoding rules.  Xcode seems
                                  to use these rules when printing objects in
                                  single-line format.  Subclasses that desire
                                  this behavior should set _encode_transforms
                                  to _alternate_encode_transforms.
    _hashables: A list of XCObject subclasses that can be hashed by ComputeIDs
                to construct this object's ID.  Most classes that need custom
                hashing behavior should do it by overriding Hashables,
                but in some cases an object's parent may wish to push a
                hashable value into its child, and it can do so by appending
                to _hashables.
  Attributes:
    id: The object's identifier, a 24-character uppercase hexadecimal string.
        Usually, objects being created should not set id until the entire
        project file structure is built.  At that point, UpdateIDs() should
        be called on the root object to assign deterministic values for id to
        each object in the tree.
    parent: The object's parent.  This is set by a parent XCObject when a child
            object is added to it.
    _properties: The object's property dictionary.  An object's properties are
                 described by its class' _schema variable.
  """

    _schema = {}
    _should_print_single_line = False

    # See _EncodeString.
    _encode_transforms = []
    i = 0
    while i < ord(" "):
        _encode_transforms.append("\\U%04x" % i)
        i = i + 1
    _encode_transforms[7] = "\\a"
    _encode_transforms[8] = "\\b"
    _encode_transforms[9] = "\\t"
    _encode_transforms[10] = "\\n"
    _encode_transforms[11] = "\\v"
    _encode_transforms[12] = "\\f"
    _encode_transforms[13] = "\\n"

    _alternate_encode_transforms = list(_encode_transforms)
    _alternate_encode_transforms[9] = chr(9)
    _alternate_encode_transforms[10] = chr(10)
    _alternate_encode_transforms[11] = chr(11)

    def __init__(self, properties=None, id=None, parent=None):
        self.id = id
        self.parent = parent
        self._properties = {}
        self._hashables = []
        self._SetDefaultsFromSchema()
        self.UpdateProperties(properties)

    def __repr__(self):
        try:
            name = self.Name()
        except NotImplementedError:
            return f"<{self.__class__.__name__} at 0x{id(self):x}>"
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Copy(self):
        """Make a copy of this object.

    The new object will have its own copy of lists and dicts.  Any XCObject
    objects owned by this object (marked "strong") will be copied in the
    new object, even those found in lists.  If this object has any weak
    references to other XCObjects, the same references are added to the new
    object without making a copy.
    """

        that = self.__class__(id=self.id, parent=self.parent)
        for key, value in self._properties.items():
            is_strong = self._schema[key][2]

            if isinstance(value, XCObject):
                if is_strong:
                    new_value = value.Copy()
                    new_value.parent = that
                    that._properties[key] = new_value
                else:
                    that._properties[key] = value
            elif isinstance(value, (str, int)):
                that._properties[key] = value
            elif isinstance(value, list):
                if is_strong:
                    # If is_strong is True, each element is an XCObject, so it's safe to
                    # call Copy.
                    that._properties[key] = []
                    for item in value:
                        new_item = item.Copy()
                        new_item.parent = that
                        that._properties[key].append(new_item)
                else:
                    that._properties[key] = value[:]
            elif isinstance(value, dict):
                # dicts are never strong.
                if is_strong:
                    raise TypeError(
                        "Strong dict for key " + key + " in " + self.__class__.__name__
                    )
                else:
                    that._properties[key] = value.copy()
            else:
                raise TypeError(
                    "Unexpected type "
                    + value.__class__.__name__
                    + " for key "
                    + key
                    + " in "
                    + self.__class__.__name__
                )

        return that

    def Name(self):
        """Return the name corresponding to an object.

    Not all objects necessarily need to be nameable, and not all that do have
    a "name" property.  Override as needed.
    """

        # If the schema indicates that "name" is required, try to access the
        # property even if it doesn't exist.  This will result in a KeyError
        # being raised for the property that should be present, which seems more
        # appropriate than NotImplementedError in this case.
        if "name" in self._properties or (
            "name" in self._schema and self._schema["name"][3]
        ):
            return self._properties["name"]

        raise NotImplementedError(self.__class__.__name__ + " must implement Name")

    def Comment(self):
        """Return a comment string for the object.

    Most objects just use their name as the comment, but PBXProject uses
    different values.

    The returned comment is not escaped and does not have any comment marker
    strings applied to it.
    """

        return self.Name()

    def Hashables(self):
        hashables = [self.__class__.__name__]

        name = self.Name()
        if name is not None:
            hashables.append(name)

        hashables.extend(self._hashables)

        return hashables

    def HashablesForChild(self):
        return None

    def ComputeIDs(self, recursive=True, overwrite=True, seed_hash=None):
        """Set "id" properties deterministically.

    An object's "id" property is set based on a hash of its class type and
    name, as well as the class type and name of all ancestor objects.  As
    such, it is only advisable to call ComputeIDs once an entire project file
    tree is built.

    If recursive is True, recurse into all descendant objects and update their
    hashes.

    If overwrite is True, any existing value set in the "id" property will be
    replaced.
    """

        def _HashUpdate(hash, data):
            """Update hash with data's length and contents.

      If the hash were updated only with the value of data, it would be
      possible for clowns to induce collisions by manipulating the names of
      their objects.  By adding the length, it's exceedingly less likely that
      ID collisions will be encountered, intentionally or not.
      """

            hash.update(struct.pack(">i", len(data)))
            if isinstance(data, str):
                data = data.encode("utf-8")
            hash.update(data)

        if seed_hash is None:
            seed_hash = hashlib.sha1()

        hash = seed_hash.copy()

        hashables = self.Hashables()
        assert len(hashables) > 0
        for hashable in hashables:
            _HashUpdate(hash, hashable)

        if recursive:
            hashables_for_child = self.HashablesForChild()
            if hashables_for_child is None:
                child_hash = hash
            else:
                assert len(hashables_for_child) > 0
                child_hash = seed_hash.copy()
                for hashable in hashables_for_child:
                    _HashUpdate(child_hash, hashable)

            for child in self.Children():
                child.ComputeIDs(recursive, overwrite, child_hash)

        if overwrite or self.id is None:
            # Xcode IDs are only 96 bits (24 hex characters), but a SHA-1 digest is
            # is 160 bits.  Instead of throwing out 64 bits of the digest, xor them
            # into the portion that gets used.
            assert hash.digest_size % 4 == 0
            digest_int_count = hash.digest_size // 4
            digest_ints = struct.unpack(">" + "I" * digest_int_count, hash.digest())
            id_ints = [0, 0, 0]
            for index in range(0, digest_int_count):
                id_ints[index % 3] ^= digest_ints[index]
            self.id = "%08X%08X%08X" % tuple(id_ints)

    def EnsureNoIDCollisions(self):
        """Verifies that no two objects have the same ID.  Checks all descendants.
    """

        ids = {}
        descendants = self.Descendants()
        for descendant in descendants:
            if descendant.id in ids:
                other = ids[descendant.id]
                raise KeyError(
                    'Duplicate ID %s, objects "%s" and "%s" in "%s"'
                    % (
                        descendant.id,
                        str(descendant._properties),
                        str(other._properties),
                        self._properties["rootObject"].Name(),
                    )
                )
            ids[descendant.id] = descendant

    def Children(self):
        """Returns a list of all of this object's owned (strong) children."""

        children = []
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong) = attributes[0:3]
            if is_strong and property in self._properties:
                if not is_list:
                    children.append(self._properties[property])
                else:
                    children.extend(self._properties[property])
        return children

    def Descendants(self):
        """Returns a list of all of this object's descendants, including this
    object.
    """

        children = self.Children()
        descendants = [self]
        for child in children:
            descendants.extend(child.Descendants())
        return descendants

    def PBXProjectAncestor(self):
        # The base case for recursion is defined at PBXProject.PBXProjectAncestor.
        if self.parent:
            return self.parent.PBXProjectAncestor()
        return None

    def _EncodeComment(self, comment):
        """Encodes a comment to be placed in the project file output, mimicking
    Xcode behavior.
    """

        # This mimics Xcode behavior by wrapping the comment in "/*" and "*/".  If
        # the string already contains a "*/", it is turned into "(*)/".  This keeps
        # the file writer from outputting something that would be treated as the
        # end of a comment in the middle of something intended to be entirely a
        # comment.

        return "/* " + comment.replace("*/", "(*)/") + " */"

    def _EncodeTransform(self, match):
        # This function works closely with _EncodeString.  It will only be called
        # by re.sub with match.group(0) containing a character matched by the
        # the _escaped expression.
        char = match.group(0)

        # Backslashes (\) and quotation marks (") are always replaced with a
        # backslash-escaped version of the same.  Everything else gets its
        # replacement from the class' _encode_transforms array.
        if char == "\\":
            return "\\\\"
        if char == '"':
            return '\\"'
        return self._encode_transforms[ord(char)]

    def _EncodeString(self, value):
        """Encodes a string to be placed in the project file output, mimicking
    Xcode behavior.
    """

        # Use quotation marks when any character outside of the range A-Z, a-z, 0-9,
        # $ (dollar sign), . (period), and _ (underscore) is present.  Also use
        # quotation marks to represent empty strings.
        #
        # Escape " (double-quote) and \ (backslash) by preceding them with a
        # backslash.
        #
        # Some characters below the printable ASCII range are encoded specially:
        #     7 ^G BEL is encoded as "\a"
        #     8 ^H BS  is encoded as "\b"
        #    11 ^K VT  is encoded as "\v"
        #    12 ^L NP  is encoded as "\f"
        #   127 ^? DEL is passed through as-is without escaping
        #  - In PBXFileReference and PBXBuildFile objects:
        #     9 ^I HT  is passed through as-is without escaping
        #    10 ^J NL  is passed through as-is without escaping
        #    13 ^M CR  is passed through as-is without escaping
        #  - In other objects:
        #     9 ^I HT  is encoded as "\t"
        #    10 ^J NL  is encoded as "\n"
        #    13 ^M CR  is encoded as "\n" rendering it indistinguishable from
        #              10 ^J NL
        # All other characters within the ASCII control character range (0 through
        # 31 inclusive) are encoded as "\U001f" referring to the Unicode code point
        # in hexadecimal.  For example, character 14 (^N SO) is encoded as "\U000e".
        # Characters above the ASCII range are passed through to the output encoded
        # as UTF-8 without any escaping.  These mappings are contained in the
        # class' _encode_transforms list.

        if _unquoted.search(value) and not _quoted.search(value):
            return value

        return '"' + _escaped.sub(self._EncodeTransform, value) + '"'

    def _XCPrint(self, file, tabs, line):
        file.write("\t" * tabs + line)

    def _XCPrintableValue(self, tabs, value, flatten_list=False):
        """Returns a representation of value that may be printed in a project file,
    mimicking Xcode's behavior.

    _XCPrintableValue can handle str and int values, XCObjects (which are
    made printable by returning their id property), and list and dict objects
    composed of any of the above types.  When printing a list or dict, and
    _should_print_single_line is False, the tabs parameter is used to determine
    how much to indent the lines corresponding to the items in the list or
    dict.

    If flatten_list is True, single-element lists will be transformed into
    strings.
    """

        printable = ""
        comment = None

        if self._should_print_single_line:
            sep = " "
            element_tabs = ""
            end_tabs = ""
        else:
            sep = "\n"
            element_tabs = "\t" * (tabs + 1)
            end_tabs = "\t" * tabs

        if isinstance(value, XCObject):
            printable += value.id
            comment = value.Comment()
        elif isinstance(value, str):
            printable += self._EncodeString(value)
        elif isinstance(value, str):
            printable += self._EncodeString(value.encode("utf-8"))
        elif isinstance(value, int):
            printable += str(value)
        elif isinstance(value, list):
            if flatten_list and len(value) <= 1:
                if len(value) == 0:
                    printable += self._EncodeString("")
                else:
                    printable += self._EncodeString(value[0])
            else:
                printable = "(" + sep
                for item in value:
                    printable += (
                        element_tabs
                        + self._XCPrintableValue(tabs + 1, item, flatten_list)
                        + ","
                        + sep
                    )
                printable += end_tabs + ")"
        elif isinstance(value, dict):
            printable = "{" + sep
            for item_key, item_value in sorted(value.items()):
                printable += (
                    element_tabs
                    + self._XCPrintableValue(tabs + 1, item_key, flatten_list)
                    + " = "
                    + self._XCPrintableValue(tabs + 1, item_value, flatten_list)
                    + ";"
                    + sep
                )
            printable += end_tabs + "}"
        else:
            raise TypeError("Can't make " + value.__class__.__name__ + " printable")

        if comment:
            printable += " " + self._EncodeComment(comment)

        return printable

    def _XCKVPrint(self, file, tabs, key, value):
        """Prints a key and value, members of an XCObject's _properties dictionary,
    to file.

    tabs is an int identifying the indentation level.  If the class'
    _should_print_single_line variable is True, tabs is ignored and the
    key-value pair will be followed by a space insead of a newline.
    """

        if self._should_print_single_line:
            printable = ""
            after_kv = " "
        else:
            printable = "\t" * tabs
            after_kv = "\n"

        # Xcode usually prints remoteGlobalIDString values in PBXContainerItemProxy
        # objects without comments.  Sometimes it prints them with comments, but
        # the majority of the time, it doesn't.  To avoid unnecessary changes to
        # the project file after Xcode opens it, don't write comments for
        # remoteGlobalIDString.  This is a sucky hack and it would certainly be
        # cleaner to extend the schema to indicate whether or not a comment should
        # be printed, but since this is the only case where the problem occurs and
        # Xcode itself can't seem to make up its mind, the hack will suffice.
        #
        # Also see PBXContainerItemProxy._schema['remoteGlobalIDString'].
        if key == "remoteGlobalIDString" and isinstance(self, PBXContainerItemProxy):
            value_to_print = value.id
        else:
            value_to_print = value

        # PBXBuildFile's settings property is represented in the output as a dict,
        # but a hack here has it represented as a string. Arrange to strip off the
        # quotes so that it shows up in the output as expected.
        if key == "settings" and isinstance(self, PBXBuildFile):
            strip_value_quotes = True
        else:
            strip_value_quotes = False

        # In another one-off, let's set flatten_list on buildSettings properties
        # of XCBuildConfiguration objects, because that's how Xcode treats them.
        if key == "buildSettings" and isinstance(self, XCBuildConfiguration):
            flatten_list = True
        else:
            flatten_list = False

        try:
            printable_key = self._XCPrintableValue(tabs, key, flatten_list)
            printable_value = self._XCPrintableValue(tabs, value_to_print, flatten_list)
            if (
                strip_value_quotes
                and len(printable_value) > 1
                and printable_value[0] == '"'
                and printable_value[-1] == '"'
            ):
                printable_value = printable_value[1:-1]
            printable += printable_key + " = " + printable_value + ";" + after_kv
        except TypeError as e:
            gyp.common.ExceptionAppend(e, 'while printing key "%s"' % key)
            raise

        self._XCPrint(file, 0, printable)

    def Print(self, file=sys.stdout):
        """Prints a reprentation of this object to file, adhering to Xcode output
    formatting.
    """

        self.VerifyHasRequiredProperties()

        if self._should_print_single_line:
            # When printing an object in a single line, Xcode doesn't put any space
            # between the beginning of a dictionary (or presumably a list) and the
            # first contained item, so you wind up with snippets like
            #   ...CDEF = {isa = PBXFileReference; fileRef = 0123...
            # If it were me, I would have put a space in there after the opening
            # curly, but I guess this is just another one of those inconsistencies
            # between how Xcode prints PBXFileReference and PBXBuildFile objects as
            # compared to other objects.  Mimic Xcode's behavior here by using an
            # empty string for sep.
            sep = ""
            end_tabs = 0
        else:
            sep = "\n"
            end_tabs = 2

        # Start the object.  For example, '\t\tPBXProject = {\n'.
        self._XCPrint(file, 2, self._XCPrintableValue(2, self) + " = {" + sep)

        # "isa" isn't in the _properties dictionary, it's an intrinsic property
        # of the class which the object belongs to.  Xcode always outputs "isa"
        # as the first element of an object dictionary.
        self._XCKVPrint(file, 3, "isa", self.__class__.__name__)

        # The remaining elements of an object dictionary are sorted alphabetically.
        for property, value in sorted(self._properties.items()):
            self._XCKVPrint(file, 3, property, value)

        # End the object.
        self._XCPrint(file, end_tabs, "};\n")

    def UpdateProperties(self, properties, do_copy=False):
        """Merge the supplied properties into the _properties dictionary.

    The input properties must adhere to the class schema or a KeyError or
    TypeError exception will be raised.  If adding an object of an XCObject
    subclass and the schema indicates a strong relationship, the object's
    parent will be set to this object.

    If do_copy is True, then lists, dicts, strong-owned XCObjects, and
    strong-owned XCObjects in lists will be copied instead of having their
    references added.
    """

        if properties is None:
            return

        for property, value in properties.items():
            # Make sure the property is in the schema.
            if property not in self._schema:
                raise KeyError(property + " not in " + self.__class__.__name__)

            # Make sure the property conforms to the schema.
            (is_list, property_type, is_strong) = self._schema[property][0:3]
            if is_list:
                if value.__class__ != list:
                    raise TypeError(
                        property
                        + " of "
                        + self.__class__.__name__
                        + " must be list, not "
                        + value.__class__.__name__
                    )
                for item in value:
                    if not isinstance(item, property_type) and not (
                        isinstance(item, str) and property_type == str
                    ):
                        # Accept unicode where str is specified.  str is treated as
                        # UTF-8-encoded.
                        raise TypeError(
                            "item of "
                            + property
                            + " of "
                            + self.__class__.__name__
                            + " must be "
                            + property_type.__name__
                            + ", not "
                            + item.__class__.__name__
                        )
            elif not isinstance(value, property_type) and not (
                isinstance(value, str) and property_type == str
            ):
                # Accept unicode where str is specified.  str is treated as
                # UTF-8-encoded.
                raise TypeError(
                    property
                    + " of "
                    + self.__class__.__name__
                    + " must be "
                    + property_type.__name__
                    + ", not "
                    + value.__class__.__name__
                )

            # Checks passed, perform the assignment.
            if do_copy:
                if isinstance(value, XCObject):
                    if is_strong:
                        self._properties[property] = value.Copy()
                    else:
                        self._properties[property] = value
                elif isinstance(value, (str, int)):
                    self._properties[property] = value
                elif isinstance(value, list):
                    if is_strong:
                        # If is_strong is True, each element is an XCObject,
                        # so it's safe to call Copy.
                        self._properties[property] = []
                        for item in value:
                            self._properties[property].append(item.Copy())
                    else:
                        self._properties[property] = value[:]
                elif isinstance(value, dict):
                    self._properties[property] = value.copy()
                else:
                    raise TypeError(
                        "Don't know how to copy a "
                        + value.__class__.__name__
                        + " object for "
                        + property
                        + " in "
                        + self.__class__.__name__
                    )
            else:
                self._properties[property] = value

            # Set up the child's back-reference to this object.  Don't use |value|
            # any more because it may not be right if do_copy is true.
            if is_strong:
                if not is_list:
                    self._properties[property].parent = self
                else:
                    for item in self._properties[property]:
                        item.parent = self

    def HasProperty(self, key):
        return key in self._properties

    def GetProperty(self, key):
        return self._properties[key]

    def SetProperty(self, key, value):
        self.UpdateProperties({key: value})

    def DelProperty(self, key):
        if key in self._properties:
            del self._properties[key]

    def AppendProperty(self, key, value):
        # TODO(mark): Support ExtendProperty too (and make this call that)?

        # Schema validation.
        if key not in self._schema:
            raise KeyError(key + " not in " + self.__class__.__name__)

        (is_list, property_type, is_strong) = self._schema[key][0:3]
        if not is_list:
            raise TypeError(key + " of " + self.__class__.__name__ + " must be list")
        if not isinstance(value, property_type):
            raise TypeError(
                "item of "
                + key
                + " of "
                + self.__class__.__name__
                + " must be "
                + property_type.__name__
                + ", not "
                + value.__class__.__name__
            )

        # If the property doesn't exist yet, create a new empty list to receive the
        # item.
        self._properties[key] = self._properties.get(key, [])

        # Set up the ownership link.
        if is_strong:
            value.parent = self

        # Store the item.
        self._properties[key].append(value)

    def VerifyHasRequiredProperties(self):
        """Ensure that all properties identified as required by the schema are
    set.
    """

        # TODO(mark): A stronger verification mechanism is needed.  Some
        # subclasses need to perform validation beyond what the schema can enforce.
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong, is_required) = attributes[0:4]
            if is_required and property not in self._properties:
                raise KeyError(self.__class__.__name__ + " requires " + property)

    def _SetDefaultsFromSchema(self):
        """Assign object default values according to the schema.  This will not
    overwrite properties that have already been set."""

        defaults = {}
        for property, attributes in self._schema.items():
            (is_list, property_type, is_strong, is_required) = attributes[0:4]
            if (
                is_required
                and len(attributes) >= 5
                and property not in self._properties
            ):
                default = attributes[4]

                defaults[property] = default

        if len(defaults) > 0:
            # Use do_copy=True so that each new object gets its own copy of strong
            # objects, lists, and dicts.
            self.UpdateProperties(defaults, do_copy=True)


class XCHierarchicalElement(XCObject):
    """Abstract base for PBXGroup and PBXFileReference.  Not represented in a
  project file."""

    # TODO(mark): Do name and path belong here?  Probably so.
    # If path is set and name is not, name may have a default value.  Name will
    # be set to the basename of path, if the basename of path is different from
    # the full value of path.  If path is already just a leaf name, name will
    # not be set.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "comments": [0, str, 0, 0],
            "fileEncoding": [0, str, 0, 0],
            "includeInIndex": [0, int, 0, 0],
            "indentWidth": [0, int, 0, 0],
            "lineEnding": [0, int, 0, 0],
            "sourceTree": [0, str, 0, 1, "<group>"],
            "tabWidth": [0, int, 0, 0],
            "usesTabs": [0, int, 0, 0],
            "wrapsLines": [0, int, 0, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCObject.__init__(self, properties, id, parent)
        if "path" in self._properties and "name" not in self._properties:
            path = self._properties["path"]
            name = posixpath.basename(path)
            if name not in ("", path):
                self.SetProperty("name", name)

        if "path" in self._properties and (
            "sourceTree" not in self._properties
            or self._properties["sourceTree"] == "<group>"
        ):
            # If the pathname begins with an Xcode variable like "$(SDKROOT)/", take
            # the variable out and make the path be relative to that variable by
            # assigning the variable name as the sourceTree.
            (source_tree, path) = SourceTreeAndPathFromPath(self._properties["path"])
            if source_tree is not None:
                self._properties["sourceTree"] = source_tree
            if path is not None:
                self._properties["path"] = path
            if (
                source_tree is not None
                and path is None
                and "name" not in self._properties
            ):
                # The path was of the form "$(SDKROOT)" with no path following it.
                # This object is now relative to that variable, so it has no path
                # attribute of its own.  It does, however, keep a name.
                del self._properties["path"]
                self._properties["name"] = source_tree

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]
        elif "path" in self._properties:
            return self._properties["path"]
        else:
            # This happens in the case of the root PBXGroup.
            return None

    def Hashables(self):
        """Custom hashables for XCHierarchicalElements.

    XCHierarchicalElements are special.  Generally, their hashes shouldn't
    change if the paths don't change.  The normal XCObject implementation of
    Hashables adds a hashable for each object, which means that if
    the hierarchical structure changes (possibly due to changes caused when
    TakeOverOnlyChild runs and encounters slight changes in the hierarchy),
    the hashes will change.  For example, if a project file initially contains
    a/b/f1 and a/b becomes collapsed into a/b, f1 will have a single parent
    a/b.  If someone later adds a/f2 to the project file, a/b can no longer be
    collapsed, and f1 winds up with parent b and grandparent a.  That would
    be sufficient to change f1's hash.

    To counteract this problem, hashables for all XCHierarchicalElements except
    for the main group (which has neither a name nor a path) are taken to be
    just the set of path components.  Because hashables are inherited from
    parents, this provides assurance that a/b/f1 has the same set of hashables
    whether its parent is b or a/b.

    The main group is a special case.  As it is permitted to have no name or
    path, it is permitted to use the standard XCObject hash mechanism.  This
    is not considered a problem because there can be only one main group.
    """

        if self == self.PBXProjectAncestor()._properties["mainGroup"]:
            # super
            return XCObject.Hashables(self)

        hashables = []

        # Put the name in first, ensuring that if TakeOverOnlyChild collapses
        # children into a top-level group like "Source", the name always goes
        # into the list of hashables without interfering with path components.
        if "name" in self._properties:
            # Make it less likely for people to manipulate hashes by following the
            # pattern of always pushing an object type value onto the list first.
            hashables.append(self.__class__.__name__ + ".name")
            hashables.append(self._properties["name"])

        # NOTE: This still has the problem that if an absolute path is encountered,
        # including paths with a sourceTree, they'll still inherit their parents'
        # hashables, even though the paths aren't relative to their parents.  This
        # is not expected to be much of a problem in practice.
        path = self.PathFromSourceTreeAndPath()
        if path is not None:
            components = path.split(posixpath.sep)
            for component in components:
                hashables.append(self.__class__.__name__ + ".path")
                hashables.append(component)

        hashables.extend(self._hashables)

        return hashables

    def Compare(self, other):
        # Allow comparison of these types.  PBXGroup has the highest sort rank;
        # PBXVariantGroup is treated as equal to PBXFileReference.
        valid_class_types = {
            PBXFileReference: "file",
            PBXGroup: "group",
            PBXVariantGroup: "file",
        }
        self_type = valid_class_types[self.__class__]
        other_type = valid_class_types[other.__class__]

        if self_type == other_type:
            # If the two objects are of the same sort rank, compare their names.
            return cmp(self.Name(), other.Name())

        # Otherwise, sort groups before everything else.
        if self_type == "group":
            return -1
        return 1

    def CompareRootGroup(self, other):
        # This function should be used only to compare direct children of the
        # containing PBXProject's mainGroup.  These groups should appear in the
        # listed order.
        # TODO(mark): "Build" is used by gyp.generator.xcode, perhaps the
        # generator should have a way of influencing this list rather than having
        # to hardcode for the generator here.
        order = [
            "Source",
            "Intermediates",
            "Projects",
            "Frameworks",
            "Products",
            "Build",
        ]

        # If the groups aren't in the listed order, do a name comparison.
        # Otherwise, groups in the listed order should come before those that
        # aren't.
        self_name = self.Name()
        other_name = other.Name()
        self_in = isinstance(self, PBXGroup) and self_name in order
        other_in = isinstance(self, PBXGroup) and other_name in order
        if not self_in and not other_in:
            return self.Compare(other)
        if self_name in order and other_name not in order:
            return -1
        if other_name in order and self_name not in order:
            return 1

        # If both groups are in the listed order, go by the defined order.
        self_index = order.index(self_name)
        other_index = order.index(other_name)
        if self_index < other_index:
            return -1
        if self_index > other_index:
            return 1
        return 0

    def PathFromSourceTreeAndPath(self):
        # Turn the object's sourceTree and path properties into a single flat
        # string of a form comparable to the path parameter.  If there's a
        # sourceTree property other than "<group>", wrap it in $(...) for the
        # comparison.
        components = []
        if self._properties["sourceTree"] != "<group>":
            components.append("$(" + self._properties["sourceTree"] + ")")
        if "path" in self._properties:
            components.append(self._properties["path"])

        if len(components) > 0:
            return posixpath.join(*components)

        return None

    def FullPath(self):
        # Returns a full path to self relative to the project file, or relative
        # to some other source tree.  Start with self, and walk up the chain of
        # parents prepending their paths, if any, until no more parents are
        # available (project-relative path) or until a path relative to some
        # source tree is found.
        xche = self
        path = None
        while isinstance(xche, XCHierarchicalElement) and (
            path is None or (not path.startswith("/") and not path.startswith("$"))
        ):
            this_path = xche.PathFromSourceTreeAndPath()
            if this_path is not None and path is not None:
                path = posixpath.join(this_path, path)
            elif this_path is not None:
                path = this_path
            xche = xche.parent

        return path


class PBXGroup(XCHierarchicalElement):
    """
  Attributes:
    _children_by_path: Maps pathnames of children of this PBXGroup to the
      actual child XCHierarchicalElement objects.
    _variant_children_by_name_and_path: Maps (name, path) tuples of
      PBXVariantGroup children to the actual child PBXVariantGroup objects.
  """

    _schema = XCHierarchicalElement._schema.copy()
    _schema.update(
        {
            "children": [1, XCHierarchicalElement, 1, 1, []],
            "name": [0, str, 0, 0],
            "path": [0, str, 0, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCHierarchicalElement.__init__(self, properties, id, parent)
        self._children_by_path = {}
        self._variant_children_by_name_and_path = {}
        for child in self._properties.get("children", []):
            self._AddChildToDicts(child)

    def Hashables(self):
        # super
        hashables = XCHierarchicalElement.Hashables(self)

        # It is not sufficient to just rely on name and parent to build a unique
        # hashable : a node could have two child PBXGroup sharing a common name.
        # To add entropy the hashable is enhanced with the names of all its
        # children.
        for child in self._properties.get("children", []):
            child_name = child.Name()
            if child_name is not None:
                hashables.append(child_name)

        return hashables

    def HashablesForChild(self):
        # To avoid a circular reference the hashables used to compute a child id do
        # not include the child names.
        return XCHierarchicalElement.Hashables(self)

    def _AddChildToDicts(self, child):
        # Sets up this PBXGroup object's dicts to reference the child properly.
        child_path = child.PathFromSourceTreeAndPath()
        if child_path:
            if child_path in self._children_by_path:
                raise ValueError("Found multiple children with path " + child_path)
            self._children_by_path[child_path] = child

        if isinstance(child, PBXVariantGroup):
            child_name = child._properties.get("name", None)
            key = (child_name, child_path)
            if key in self._variant_children_by_name_and_path:
                raise ValueError(
                    "Found multiple PBXVariantGroup children with "
                    + "name "
                    + str(child_name)
                    + " and path "
                    + str(child_path)
                )
            self._variant_children_by_name_and_path[key] = child

    def AppendChild(self, child):
        # Callers should use this instead of calling
        # AppendProperty('children', child) directly because this function
        # maintains the group's dicts.
        self.AppendProperty("children", child)
        self._AddChildToDicts(child)

    def GetChildByName(self, name):
        # This is not currently optimized with a dict as GetChildByPath is because
        # it has few callers.  Most callers probably want GetChildByPath.  This
        # function is only useful to get children that have names but no paths,
        # which is rare.  The children of the main group ("Source", "Products",
        # etc.) is pretty much the only case where this likely to come up.
        #
        # TODO(mark): Maybe this should raise an error if more than one child is
        # present with the same name.
        if "children" not in self._properties:
            return None

        for child in self._properties["children"]:
            if child.Name() == name:
                return child

        return None

    def GetChildByPath(self, path):
        if not path:
            return None

        if path in self._children_by_path:
            return self._children_by_path[path]

        return None

    def GetChildByRemoteObject(self, remote_object):
        # This method is a little bit esoteric.  Given a remote_object, which
        # should be a PBXFileReference in another project file, this method will
        # return this group's PBXReferenceProxy object serving as a local proxy
        # for the remote PBXFileReference.
        #
        # This function might benefit from a dict optimization as GetChildByPath
        # for some workloads, but profiling shows that it's not currently a
        # problem.
        if "children" not in self._properties:
            return None

        for child in self._properties["children"]:
            if not isinstance(child, PBXReferenceProxy):
                continue

            container_proxy = child._properties["remoteRef"]
            if container_proxy._properties["remoteGlobalIDString"] == remote_object:
                return child

        return None

    def AddOrGetFileByPath(self, path, hierarchical):
        """Returns an existing or new file reference corresponding to path.

    If hierarchical is True, this method will create or use the necessary
    hierarchical group structure corresponding to path.  Otherwise, it will
    look in and create an item in the current group only.

    If an existing matching reference is found, it is returned, otherwise, a
    new one will be created, added to the correct group, and returned.

    If path identifies a directory by virtue of carrying a trailing slash,
    this method returns a PBXFileReference of "folder" type.  If path
    identifies a variant, by virtue of it identifying a file inside a directory
    with an ".lproj" extension, this method returns a PBXVariantGroup
    containing the variant named by path, and possibly other variants.  For
    all other paths, a "normal" PBXFileReference will be returned.
    """

        # Adding or getting a directory?  Directories end with a trailing slash.
        is_dir = False
        if path.endswith("/"):
            is_dir = True
        path = posixpath.normpath(path)
        if is_dir:
            path = path + "/"

        # Adding or getting a variant?  Variants are files inside directories
        # with an ".lproj" extension.  Xcode uses variants for localization.  For
        # a variant path/to/Language.lproj/MainMenu.nib, put a variant group named
        # MainMenu.nib inside path/to, and give it a variant named Language.  In
        # this example, grandparent would be set to path/to and parent_root would
        # be set to Language.
        variant_name = None
        parent = posixpath.dirname(path)
        grandparent = posixpath.dirname(parent)
        parent_basename = posixpath.basename(parent)
        (parent_root, parent_ext) = posixpath.splitext(parent_basename)
        if parent_ext == ".lproj":
            variant_name = parent_root
        if grandparent == "":
            grandparent = None

        # Putting a directory inside a variant group is not currently supported.
        assert not is_dir or variant_name is None

        path_split = path.split(posixpath.sep)
        if (
            len(path_split) == 1
            or ((is_dir or variant_name is not None) and len(path_split) == 2)
            or not hierarchical
        ):
            # The PBXFileReference or PBXVariantGroup will be added to or gotten from
            # this PBXGroup, no recursion necessary.
            if variant_name is None:
                # Add or get a PBXFileReference.
                file_ref = self.GetChildByPath(path)
                if file_ref is not None:
                    assert file_ref.__class__ == PBXFileReference
                else:
                    file_ref = PBXFileReference({"path": path})
                    self.AppendChild(file_ref)
            else:
                # Add or get a PBXVariantGroup.  The variant group name is the same
                # as the basename (MainMenu.nib in the example above).  grandparent
                # specifies the path to the variant group itself, and path_split[-2:]
                # is the path of the specific variant relative to its group.
                variant_group_name = posixpath.basename(path)
                variant_group_ref = self.AddOrGetVariantGroupByNameAndPath(
                    variant_group_name, grandparent
                )
                variant_path = posixpath.sep.join(path_split[-2:])
                variant_ref = variant_group_ref.GetChildByPath(variant_path)
                if variant_ref is not None:
                    assert variant_ref.__class__ == PBXFileReference
                else:
                    variant_ref = PBXFileReference(
                        {"name": variant_name, "path": variant_path}
                    )
                    variant_group_ref.AppendChild(variant_ref)
                # The caller is interested in the variant group, not the specific
                # variant file.
                file_ref = variant_group_ref
            return file_ref
        else:
            # Hierarchical recursion.  Add or get a PBXGroup corresponding to the
            # outermost path component, and then recurse into it, chopping off that
            # path component.
            next_dir = path_split[0]
            group_ref = self.GetChildByPath(next_dir)
            if group_ref is not None:
                assert group_ref.__class__ == PBXGroup
            else:
                group_ref = PBXGroup({"path": next_dir})
                self.AppendChild(group_ref)
            return group_ref.AddOrGetFileByPath(
                posixpath.sep.join(path_split[1:]), hierarchical
            )

    def AddOrGetVariantGroupByNameAndPath(self, name, path):
        """Returns an existing or new PBXVariantGroup for name and path.

    If a PBXVariantGroup identified by the name and path arguments is already
    present as a child of this object, it is returned.  Otherwise, a new
    PBXVariantGroup with the correct properties is created, added as a child,
    and returned.

    This method will generally be called by AddOrGetFileByPath, which knows
    when to create a variant group based on the structure of the pathnames
    passed to it.
    """

        key = (name, path)
        if key in self._variant_children_by_name_and_path:
            variant_group_ref = self._variant_children_by_name_and_path[key]
            assert variant_group_ref.__class__ == PBXVariantGroup
            return variant_group_ref

        variant_group_properties = {"name": name}
        if path is not None:
            variant_group_properties["path"] = path
        variant_group_ref = PBXVariantGroup(variant_group_properties)
        self.AppendChild(variant_group_ref)

        return variant_group_ref

    def TakeOverOnlyChild(self, recurse=False):
        """If this PBXGroup has only one child and it's also a PBXGroup, take
    it over by making all of its children this object's children.

    This function will continue to take over only children when those children
    are groups.  If there are three PBXGroups representing a, b, and c, with
    c inside b and b inside a, and a and b have no other children, this will
    result in a taking over both b and c, forming a PBXGroup for a/b/c.

    If recurse is True, this function will recurse into children and ask them
    to collapse themselves by taking over only children as well.  Assuming
    an example hierarchy with files at a/b/c/d1, a/b/c/d2, and a/b/c/d3/e/f
    (d1, d2, and f are files, the rest are groups), recursion will result in
    a group for a/b/c containing a group for d3/e.
    """

        # At this stage, check that child class types are PBXGroup exactly,
        # instead of using isinstance.  The only subclass of PBXGroup,
        # PBXVariantGroup, should not participate in reparenting in the same way:
        # reparenting by merging different object types would be wrong.
        while (
            len(self._properties["children"]) == 1
            and self._properties["children"][0].__class__ == PBXGroup
        ):
            # Loop to take over the innermost only-child group possible.

            child = self._properties["children"][0]

            # Assume the child's properties, including its children.  Save a copy
            # of this object's old properties, because they'll still be needed.
            # This object retains its existing id and parent attributes.
            old_properties = self._properties
            self._properties = child._properties
            self._children_by_path = child._children_by_path

            if (
                "sourceTree" not in self._properties
                or self._properties["sourceTree"] == "<group>"
            ):
                # The child was relative to its parent.  Fix up the path.  Note that
                # children with a sourceTree other than "<group>" are not relative to
                # their parents, so no path fix-up is needed in that case.
                if "path" in old_properties:
                    if "path" in self._properties:
                        # Both the original parent and child have paths set.
                        self._properties["path"] = posixpath.join(
                            old_properties["path"], self._properties["path"]
                        )
                    else:
                        # Only the original parent has a path, use it.
                        self._properties["path"] = old_properties["path"]
                if "sourceTree" in old_properties:
                    # The original parent had a sourceTree set, use it.
                    self._properties["sourceTree"] = old_properties["sourceTree"]

            # If the original parent had a name set, keep using it.  If the original
            # parent didn't have a name but the child did, let the child's name
            # live on.  If the name attribute seems unnecessary now, get rid of it.
            if "name" in old_properties and old_properties["name"] not in (
                None,
                self.Name(),
            ):
                self._properties["name"] = old_properties["name"]
            if (
                "name" in self._properties
                and "path" in self._properties
                and self._properties["name"] == self._properties["path"]
            ):
                del self._properties["name"]

            # Notify all children of their new parent.
            for child in self._properties["children"]:
                child.parent = self

        # If asked to recurse, recurse.
        if recurse:
            for child in self._properties["children"]:
                if child.__class__ == PBXGroup:
                    child.TakeOverOnlyChild(recurse)

    def SortGroup(self):
        self._properties["children"] = sorted(
            self._properties["children"], key=cmp_to_key(lambda x, y: x.Compare(y))
        )

        # Recurse.
        for child in self._properties["children"]:
            if isinstance(child, PBXGroup):
                child.SortGroup()


class XCFileLikeElement(XCHierarchicalElement):
    # Abstract base for objects that can be used as the fileRef property of
    # PBXBuildFile.

    def PathHashables(self):
        # A PBXBuildFile that refers to this object will call this method to
        # obtain additional hashables specific to this XCFileLikeElement.  Don't
        # just use this object's hashables, they're not specific and unique enough
        # on their own (without access to the parent hashables.)  Instead, provide
        # hashables that identify this object by path by getting its hashables as
        # well as the hashables of ancestor XCHierarchicalElement objects.

        hashables = []
        xche = self
        while isinstance(xche, XCHierarchicalElement):
            xche_hashables = xche.Hashables()
            for index, xche_hashable in enumerate(xche_hashables):
                hashables.insert(index, xche_hashable)
            xche = xche.parent
        return hashables


class XCContainerPortal(XCObject):
    # Abstract base for objects that can be used as the containerPortal property
    # of PBXContainerItemProxy.
    pass


class XCRemoteObject(XCObject):
    # Abstract base for objects that can be used as the remoteGlobalIDString
    # property of PBXContainerItemProxy.
    pass


class PBXFileReference(XCFileLikeElement, XCContainerPortal, XCRemoteObject):
    _schema = XCFileLikeElement._schema.copy()
    _schema.update(
        {
            "explicitFileType": [0, str, 0, 0],
            "lastKnownFileType": [0, str, 0, 0],
            "name": [0, str, 0, 0],
            "path": [0, str, 0, 1],
        }
    )

    # Weird output rules for PBXFileReference.
    _should_print_single_line = True
    # super
    _encode_transforms = XCFileLikeElement._alternate_encode_transforms

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCFileLikeElement.__init__(self, properties, id, parent)
        if "path" in self._properties and self._properties["path"].endswith("/"):
            self._properties["path"] = self._properties["path"][:-1]
            is_dir = True
        else:
            is_dir = False

        if (
            "path" in self._properties
            and "lastKnownFileType" not in self._properties
            and "explicitFileType" not in self._properties
        ):
            # TODO(mark): This is the replacement for a replacement for a quick hack.
            # It is no longer incredibly sucky, but this list needs to be extended.
            extension_map = {
                "a": "archive.ar",
                "app": "wrapper.application",
                "bdic": "file",
                "bundle": "wrapper.cfbundle",
                "c": "sourcecode.c.c",
                "cc": "sourcecode.cpp.cpp",
                "cpp": "sourcecode.cpp.cpp",
                "css": "text.css",
                "cxx": "sourcecode.cpp.cpp",
                "dart": "sourcecode",
                "dylib": "compiled.mach-o.dylib",
                "framework": "wrapper.framework",
                "gyp": "sourcecode",
                "gypi": "sourcecode",
                "h": "sourcecode.c.h",
                "hxx": "sourcecode.cpp.h",
                "icns": "image.icns",
                "java": "sourcecode.java",
                "js": "sourcecode.javascript",
                "kext": "wrapper.kext",
                "m": "sourcecode.c.objc",
                "mm": "sourcecode.cpp.objcpp",
                "nib": "wrapper.nib",
                "o": "compiled.mach-o.objfile",
                "pdf": "image.pdf",
                "pl": "text.script.perl",
                "plist": "text.plist.xml",
                "pm": "text.script.perl",
                "png": "image.png",
                "py": "text.script.python",
                "r": "sourcecode.rez",
                "rez": "sourcecode.rez",
                "s": "sourcecode.asm",
                "storyboard": "file.storyboard",
                "strings": "text.plist.strings",
                "swift": "sourcecode.swift",
                "ttf": "file",
                "xcassets": "folder.assetcatalog",
                "xcconfig": "text.xcconfig",
                "xcdatamodel": "wrapper.xcdatamodel",
                "xcdatamodeld": "wrapper.xcdatamodeld",
                "xib": "file.xib",
                "y": "sourcecode.yacc",
            }

            prop_map = {
                "dart": "explicitFileType",
                "gyp": "explicitFileType",
                "gypi": "explicitFileType",
            }

            if is_dir:
                file_type = "folder"
                prop_name = "lastKnownFileType"
            else:
                basename = posixpath.basename(self._properties["path"])
                (root, ext) = posixpath.splitext(basename)
                # Check the map using a lowercase extension.
                # TODO(mark): Maybe it should try with the original case first and fall
                # back to lowercase, in case there are any instances where case
                # matters.  There currently aren't.
                if ext != "":
                    ext = ext[1:].lower()

                # TODO(mark): "text" is the default value, but "file" is appropriate
                # for unrecognized files not containing text.  Xcode seems to choose
                # based on content.
                file_type = extension_map.get(ext, "text")
                prop_name = prop_map.get(ext, "lastKnownFileType")

            self._properties[prop_name] = file_type


class PBXVariantGroup(PBXGroup, XCFileLikeElement):
    """PBXVariantGroup is used by Xcode to represent localizations."""

    # No additions to the schema relative to PBXGroup.
    pass


# PBXReferenceProxy is also an XCFileLikeElement subclass.  It is defined below
# because it uses PBXContainerItemProxy, defined below.


class XCBuildConfiguration(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "baseConfigurationReference": [0, PBXFileReference, 0, 0],
            "buildSettings": [0, dict, 0, 1, {}],
            "name": [0, str, 0, 1],
        }
    )

    def HasBuildSetting(self, key):
        return key in self._properties["buildSettings"]

    def GetBuildSetting(self, key):
        return self._properties["buildSettings"][key]

    def SetBuildSetting(self, key, value):
        # TODO(mark): If a list, copy?
        self._properties["buildSettings"][key] = value

    def AppendBuildSetting(self, key, value):
        if key not in self._properties["buildSettings"]:
            self._properties["buildSettings"][key] = []
        self._properties["buildSettings"][key].append(value)

    def DelBuildSetting(self, key):
        if key in self._properties["buildSettings"]:
            del self._properties["buildSettings"][key]

    def SetBaseConfiguration(self, value):
        self._properties["baseConfigurationReference"] = value


class XCConfigurationList(XCObject):
    # _configs is the default list of configurations.
    _configs = [
        XCBuildConfiguration({"name": "Debug"}),
        XCBuildConfiguration({"name": "Release"}),
    ]

    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "buildConfigurations": [1, XCBuildConfiguration, 1, 1, _configs],
            "defaultConfigurationIsVisible": [0, int, 0, 1, 1],
            "defaultConfigurationName": [0, str, 0, 1, "Release"],
        }
    )

    def Name(self):
        return (
            "Build configuration list for "
            + self.parent.__class__.__name__
            + ' "'
            + self.parent.Name()
            + '"'
        )

    def ConfigurationNamed(self, name):
        """Convenience accessor to obtain an XCBuildConfiguration by name."""
        for configuration in self._properties["buildConfigurations"]:
            if configuration._properties["name"] == name:
                return configuration

        raise KeyError(name)

    def DefaultConfiguration(self):
        """Convenience accessor to obtain the default XCBuildConfiguration."""
        return self.ConfigurationNamed(self._properties["defaultConfigurationName"])

    def HasBuildSetting(self, key):
        """Determines the state of a build setting in all XCBuildConfiguration
    child objects.

    If all child objects have key in their build settings, and the value is the
    same in all child objects, returns 1.

    If no child objects have the key in their build settings, returns 0.

    If some, but not all, child objects have the key in their build settings,
    or if any children have different values for the key, returns -1.
    """

        has = None
        value = None
        for configuration in self._properties["buildConfigurations"]:
            configuration_has = configuration.HasBuildSetting(key)
            if has is None:
                has = configuration_has
            elif has != configuration_has:
                return -1

            if configuration_has:
                configuration_value = configuration.GetBuildSetting(key)
                if value is None:
                    value = configuration_value
                elif value != configuration_value:
                    return -1

        if not has:
            return 0

        return 1

    def GetBuildSetting(self, key):
        """Gets the build setting for key.

    All child XCConfiguration objects must have the same value set for the
    setting, or a ValueError will be raised.
    """

        # TODO(mark): This is wrong for build settings that are lists.  The list
        # contents should be compared (and a list copy returned?)

        value = None
        for configuration in self._properties["buildConfigurations"]:
            configuration_value = configuration.GetBuildSetting(key)
            if value is None:
                value = configuration_value
            else:
                if value != configuration_value:
                    raise ValueError("Variant values for " + key)

        return value

    def SetBuildSetting(self, key, value):
        """Sets the build setting for key to value in all child
    XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.SetBuildSetting(key, value)

    def AppendBuildSetting(self, key, value):
        """Appends value to the build setting for key, which is treated as a list,
    in all child XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.AppendBuildSetting(key, value)

    def DelBuildSetting(self, key):
        """Deletes the build setting key from all child XCBuildConfiguration
    objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.DelBuildSetting(key)

    def SetBaseConfiguration(self, value):
        """Sets the build configuration in all child XCBuildConfiguration objects.
    """

        for configuration in self._properties["buildConfigurations"]:
            configuration.SetBaseConfiguration(value)


class PBXBuildFile(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "fileRef": [0, XCFileLikeElement, 0, 1],
            "settings": [0, str, 0, 0],  # hack, it's a dict
        }
    )

    # Weird output rules for PBXBuildFile.
    _should_print_single_line = True
    _encode_transforms = XCObject._alternate_encode_transforms

    def Name(self):
        # Example: "main.cc in Sources"
        return self._properties["fileRef"].Name() + " in " + self.parent.Name()

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # It is not sufficient to just rely on Name() to get the
        # XCFileLikeElement's name, because that is not a complete pathname.
        # PathHashables returns hashables unique enough that no two
        # PBXBuildFiles should wind up with the same set of hashables, unless
        # someone adds the same file multiple times to the same target.  That
        # would be considered invalid anyway.
        hashables.extend(self._properties["fileRef"].PathHashables())

        return hashables


class XCBuildPhase(XCObject):
    """Abstract base for build phase classes.  Not represented in a project
  file.

  Attributes:
    _files_by_path: A dict mapping each path of a child in the files list by
      path (keys) to the corresponding PBXBuildFile children (values).
    _files_by_xcfilelikeelement: A dict mapping each XCFileLikeElement (keys)
      to the corresponding PBXBuildFile children (values).
  """

    # TODO(mark): Some build phase types, like PBXShellScriptBuildPhase, don't
    # actually have a "files" list.  XCBuildPhase should not have "files" but
    # another abstract subclass of it should provide this, and concrete build
    # phase types that do have "files" lists should be derived from that new
    # abstract subclass.  XCBuildPhase should only provide buildActionMask and
    # runOnlyForDeploymentPostprocessing, and not files or the various
    # file-related methods and attributes.

    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "buildActionMask": [0, int, 0, 1, 0x7FFFFFFF],
            "files": [1, PBXBuildFile, 1, 1, []],
            "runOnlyForDeploymentPostprocessing": [0, int, 0, 1, 0],
        }
    )

    def __init__(self, properties=None, id=None, parent=None):
        # super
        XCObject.__init__(self, properties, id, parent)

        self._files_by_path = {}
        self._files_by_xcfilelikeelement = {}
        for pbxbuildfile in self._properties.get("files", []):
            self._AddBuildFileToDicts(pbxbuildfile)

    def FileGroup(self, path):
        # Subclasses must override this by returning a two-element tuple.  The
        # first item in the tuple should be the PBXGroup to which "path" should be
        # added, either as a child or deeper descendant.  The second item should
        # be a boolean indicating whether files should be added into hierarchical
        # groups or one single flat group.
        raise NotImplementedError(self.__class__.__name__ + " must implement FileGroup")

    def _AddPathToDict(self, pbxbuildfile, path):
        """Adds path to the dict tracking paths belonging to this build phase.

    If the path is already a member of this build phase, raises an exception.
    """

        if path in self._files_by_path:
            raise ValueError("Found multiple build files with path " + path)
        self._files_by_path[path] = pbxbuildfile

    def _AddBuildFileToDicts(self, pbxbuildfile, path=None):
        """Maintains the _files_by_path and _files_by_xcfilelikeelement dicts.

    If path is specified, then it is the path that is being added to the
    phase, and pbxbuildfile must contain either a PBXFileReference directly
    referencing that path, or it must contain a PBXVariantGroup that itself
    contains a PBXFileReference referencing the path.

    If path is not specified, either the PBXFileReference's path or the paths
    of all children of the PBXVariantGroup are taken as being added to the
    phase.

    If the path is already present in the phase, raises an exception.

    If the PBXFileReference or PBXVariantGroup referenced by pbxbuildfile
    are already present in the phase, referenced by a different PBXBuildFile
    object, raises an exception.  This does not raise an exception when
    a PBXFileReference or PBXVariantGroup reappear and are referenced by the
    same PBXBuildFile that has already introduced them, because in the case
    of PBXVariantGroup objects, they may correspond to multiple paths that are
    not all added simultaneously.  When this situation occurs, the path needs
    to be added to _files_by_path, but nothing needs to change in
    _files_by_xcfilelikeelement, and the caller should have avoided adding
    the PBXBuildFile if it is already present in the list of children.
    """

        xcfilelikeelement = pbxbuildfile._properties["fileRef"]

        paths = []
        if path is not None:
            # It's best when the caller provides the path.
            if isinstance(xcfilelikeelement, PBXVariantGroup):
                paths.append(path)
        else:
            # If the caller didn't provide a path, there can be either multiple
            # paths (PBXVariantGroup) or one.
            if isinstance(xcfilelikeelement, PBXVariantGroup):
                for variant in xcfilelikeelement._properties["children"]:
                    paths.append(variant.FullPath())
            else:
                paths.append(xcfilelikeelement.FullPath())

        # Add the paths first, because if something's going to raise, the
        # messages provided by _AddPathToDict are more useful owing to its
        # having access to a real pathname and not just an object's Name().
        for a_path in paths:
            self._AddPathToDict(pbxbuildfile, a_path)

        # If another PBXBuildFile references this XCFileLikeElement, there's a
        # problem.
        if (
            xcfilelikeelement in self._files_by_xcfilelikeelement
            and self._files_by_xcfilelikeelement[xcfilelikeelement] != pbxbuildfile
        ):
            raise ValueError(
                "Found multiple build files for " + xcfilelikeelement.Name()
            )
        self._files_by_xcfilelikeelement[xcfilelikeelement] = pbxbuildfile

    def AppendBuildFile(self, pbxbuildfile, path=None):
        # Callers should use this instead of calling
        # AppendProperty('files', pbxbuildfile) directly because this function
        # maintains the object's dicts.  Better yet, callers can just call AddFile
        # with a pathname and not worry about building their own PBXBuildFile
        # objects.
        self.AppendProperty("files", pbxbuildfile)
        self._AddBuildFileToDicts(pbxbuildfile, path)

    def AddFile(self, path, settings=None):
        (file_group, hierarchical) = self.FileGroup(path)
        file_ref = file_group.AddOrGetFileByPath(path, hierarchical)

        if file_ref in self._files_by_xcfilelikeelement and isinstance(
            file_ref, PBXVariantGroup
        ):
            # There's already a PBXBuildFile in this phase corresponding to the
            # PBXVariantGroup.  path just provides a new variant that belongs to
            # the group.  Add the path to the dict.
            pbxbuildfile = self._files_by_xcfilelikeelement[file_ref]
            self._AddBuildFileToDicts(pbxbuildfile, path)
        else:
            # Add a new PBXBuildFile to get file_ref into the phase.
            if settings is None:
                pbxbuildfile = PBXBuildFile({"fileRef": file_ref})
            else:
                pbxbuildfile = PBXBuildFile({"fileRef": file_ref, "settings": settings})
            self.AppendBuildFile(pbxbuildfile, path)


class PBXHeadersBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Headers"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXResourcesBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Resources"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXSourcesBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Sources"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)


class PBXFrameworksBuildPhase(XCBuildPhase):
    # No additions to the schema relative to XCBuildPhase.

    def Name(self):
        return "Frameworks"

    def FileGroup(self, path):
        (root, ext) = posixpath.splitext(path)
        if ext != "":
            ext = ext[1:].lower()
        if ext == "o":
            # .o files are added to Xcode Frameworks phases, but conceptually aren't
            # frameworks, they're more like sources or intermediates. Redirect them
            # to show up in one of those other groups.
            return self.PBXProjectAncestor().RootGroupForPath(path)
        else:
            return (self.PBXProjectAncestor().FrameworksGroup(), False)


class PBXShellScriptBuildPhase(XCBuildPhase):
    _schema = XCBuildPhase._schema.copy()
    _schema.update(
        {
            "inputPaths": [1, str, 0, 1, []],
            "name": [0, str, 0, 0],
            "outputPaths": [1, str, 0, 1, []],
            "shellPath": [0, str, 0, 1, "/bin/sh"],
            "shellScript": [0, str, 0, 1],
            "showEnvVarsInLog": [0, int, 0, 0],
        }
    )

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]

        return "ShellScript"


class PBXCopyFilesBuildPhase(XCBuildPhase):
    _schema = XCBuildPhase._schema.copy()
    _schema.update(
        {
            "dstPath": [0, str, 0, 1],
            "dstSubfolderSpec": [0, int, 0, 1],
            "name": [0, str, 0, 0],
        }
    )

    # path_tree_re matches "$(DIR)/path", "$(DIR)/$(DIR2)/path" or just "$(DIR)".
    # Match group 1 is "DIR", group 3 is "path" or "$(DIR2") or "$(DIR2)/path"
    # or None. If group 3 is "path", group 4 will be None otherwise group 4 is
    # "DIR2" and group 6 is "path".
    path_tree_re = re.compile(r"^\$\((.*?)\)(/(\$\((.*?)\)(/(.*)|)|(.*)|)|)$")

    # path_tree_{first,second}_to_subfolder map names of Xcode variables to the
    # associated dstSubfolderSpec property value used in a PBXCopyFilesBuildPhase
    # object.
    path_tree_first_to_subfolder = {
        # Types that can be chosen via the Xcode UI.
        "BUILT_PRODUCTS_DIR": 16,  # Products Directory
        "BUILT_FRAMEWORKS_DIR": 10,  # Not an official Xcode macro.
        # Existed before support for the
        # names below was added. Maps to
        # "Frameworks".
    }

    path_tree_second_to_subfolder = {
        "WRAPPER_NAME": 1,  # Wrapper
        # Although Xcode's friendly name is "Executables", the destination
        # is demonstrably the value of the build setting
        # EXECUTABLE_FOLDER_PATH not EXECUTABLES_FOLDER_PATH.
        "EXECUTABLE_FOLDER_PATH": 6,  # Executables.
        "UNLOCALIZED_RESOURCES_FOLDER_PATH": 7,  # Resources
        "JAVA_FOLDER_PATH": 15,  # Java Resources
        "FRAMEWORKS_FOLDER_PATH": 10,  # Frameworks
        "SHARED_FRAMEWORKS_FOLDER_PATH": 11,  # Shared Frameworks
        "SHARED_SUPPORT_FOLDER_PATH": 12,  # Shared Support
        "PLUGINS_FOLDER_PATH": 13,  # PlugIns
        # For XPC Services, Xcode sets both dstPath and dstSubfolderSpec.
        # Note that it re-uses the BUILT_PRODUCTS_DIR value for
        # dstSubfolderSpec. dstPath is set below.
        "XPCSERVICES_FOLDER_PATH": 16,  # XPC Services.
    }

    def Name(self):
        if "name" in self._properties:
            return self._properties["name"]

        return "CopyFiles"

    def FileGroup(self, path):
        return self.PBXProjectAncestor().RootGroupForPath(path)

    def SetDestination(self, path):
        """Set the dstSubfolderSpec and dstPath properties from path.

    path may be specified in the same notation used for XCHierarchicalElements,
    specifically, "$(DIR)/path".
    """

        path_tree_match = self.path_tree_re.search(path)
        if path_tree_match:
            path_tree = path_tree_match.group(1)
            if path_tree in self.path_tree_first_to_subfolder:
                subfolder = self.path_tree_first_to_subfolder[path_tree]
                relative_path = path_tree_match.group(3)
                if relative_path is None:
                    relative_path = ""

                if subfolder == 16 and path_tree_match.group(4) is not None:
                    # BUILT_PRODUCTS_DIR (16) is the first element in a path whose
                    # second element is possibly one of the variable names in
                    # path_tree_second_to_subfolder. Xcode sets the values of all these
                    # variables to relative paths so .gyp files must prefix them with
                    # BUILT_PRODUCTS_DIR, e.g.
                    # $(BUILT_PRODUCTS_DIR)/$(PLUGINS_FOLDER_PATH). Then
                    # xcode_emulation.py can export these variables with the same values
                    # as Xcode yet make & ninja files can determine the absolute path
                    # to the target. Xcode uses the dstSubfolderSpec value set here
                    # to determine the full path.
                    #
                    # An alternative of xcode_emulation.py setting the values to
                    # absolute paths when exporting these variables has been
                    # ruled out because then the values would be different
                    # depending on the build tool.
                    #
                    # Another alternative is to invent new names for the variables used
                    # to match to the subfolder indices in the second table. .gyp files
                    # then will not need to prepend $(BUILT_PRODUCTS_DIR) because
                    # xcode_emulation.py can set the values of those variables to
                    # the absolute paths when exporting. This is possibly the thinking
                    # behind BUILT_FRAMEWORKS_DIR which is used in exactly this manner.
                    #
                    # Requiring prepending BUILT_PRODUCTS_DIR has been chosen because
                    # this same way could be used to specify destinations in .gyp files
                    # that pre-date this addition to GYP. However they would only work
                    # with the Xcode generator.
                    # The previous version of xcode_emulation.py
                    # does not export these variables. Such files will get the benefit
                    # of the Xcode UI showing the proper destination name simply by
                    # regenerating the projects with this version of GYP.
                    path_tree = path_tree_match.group(4)
                    relative_path = path_tree_match.group(6)
                    separator = "/"

                    if path_tree in self.path_tree_second_to_subfolder:
                        subfolder = self.path_tree_second_to_subfolder[path_tree]
                        if relative_path is None:
                            relative_path = ""
                            separator = ""
                        if path_tree == "XPCSERVICES_FOLDER_PATH":
                            relative_path = (
                                "$(CONTENTS_FOLDER_PATH)/XPCServices"
                                + separator
                                + relative_path
                            )
                    else:
                        # subfolder = 16 from above
                        # The second element of the path is an unrecognized variable.
                        # Include it and any remaining elements in relative_path.
                        relative_path = path_tree_match.group(3)

            else:
                # The path starts with an unrecognized Xcode variable
                # name like $(SRCROOT).  Xcode will still handle this
                # as an "absolute path" that starts with the variable.
                subfolder = 0
                relative_path = path
        elif path.startswith("/"):
            # Special case.  Absolute paths are in dstSubfolderSpec 0.
            subfolder = 0
            relative_path = path[1:]
        else:
            raise ValueError(
                f"Can't use path {path} in a {self.__class__.__name__}"
            )

        self._properties["dstPath"] = relative_path
        self._properties["dstSubfolderSpec"] = subfolder


class PBXBuildRule(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "compilerSpec": [0, str, 0, 1],
            "filePatterns": [0, str, 0, 0],
            "fileType": [0, str, 0, 1],
            "isEditable": [0, int, 0, 1, 1],
            "outputFiles": [1, str, 0, 1, []],
            "script": [0, str, 0, 0],
        }
    )

    def Name(self):
        # Not very inspired, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.append(self._properties["fileType"])
        if "filePatterns" in self._properties:
            hashables.append(self._properties["filePatterns"])
        return hashables


class PBXContainerItemProxy(XCObject):
    # When referencing an item in this project file, containerPortal is the
    # PBXProject root object of this project file.  When referencing an item in
    # another project file, containerPortal is a PBXFileReference identifying
    # the other project file.
    #
    # When serving as a proxy to an XCTarget (in this project file or another),
    # proxyType is 1.  When serving as a proxy to a PBXFileReference (in another
    # project file), proxyType is 2.  Type 2 is used for references to the
    # producs of the other project file's targets.
    #
    # Xcode is weird about remoteGlobalIDString.  Usually, it's printed without
    # a comment, indicating that it's tracked internally simply as a string, but
    # sometimes it's printed with a comment (usually when the object is initially
    # created), indicating that it's tracked as a project file object at least
    # sometimes.  This module always tracks it as an object, but contains a hack
    # to prevent it from printing the comment in the project file output.  See
    # _XCKVPrint.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "containerPortal": [0, XCContainerPortal, 0, 1],
            "proxyType": [0, int, 0, 1],
            "remoteGlobalIDString": [0, XCRemoteObject, 0, 1],
            "remoteInfo": [0, str, 0, 1],
        }
    )

    def __repr__(self):
        props = self._properties
        name = "{}.gyp:{}".format(props["containerPortal"].Name(), props["remoteInfo"])
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Name(self):
        # Admittedly not the best name, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.extend(self._properties["containerPortal"].Hashables())
        hashables.extend(self._properties["remoteGlobalIDString"].Hashables())
        return hashables


class PBXTargetDependency(XCObject):
    # The "target" property accepts an XCTarget object, and obviously not
    # NoneType.  But XCTarget is defined below, so it can't be put into the
    # schema yet.  The definition of PBXTargetDependency can't be moved below
    # XCTarget because XCTarget's own schema references PBXTargetDependency.
    # Python doesn't deal well with this circular relationship, and doesn't have
    # a real way to do forward declarations.  To work around, the type of
    # the "target" property is reset below, after XCTarget is defined.
    #
    # At least one of "name" and "target" is required.
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "name": [0, str, 0, 0],
            "target": [0, None.__class__, 0, 0],
            "targetProxy": [0, PBXContainerItemProxy, 1, 1],
        }
    )

    def __repr__(self):
        name = self._properties.get("name") or self._properties["target"].Name()
        return f"<{self.__class__.__name__} {name!r} at 0x{id(self):x}>"

    def Name(self):
        # Admittedly not the best name, but it's what Xcode uses.
        return self.__class__.__name__

    def Hashables(self):
        # super
        hashables = XCObject.Hashables(self)

        # Use the hashables of the weak objects that this object refers to.
        hashables.extend(self._properties["targetProxy"].Hashables())
        return hashables


class PBXReferenceProxy(XCFileLikeElement):
    _schema = XCFileLikeElement._schema.copy()
    _schema.update(
        {
            "fileType": [0, str, 0, 1],
            "path": [0, str, 0, 1],
            "remoteRef": [0, PBXContainerItemProxy, 1, 1],
        }
    )


class XCTarget(XCRemoteObject):
    # An XCTarget is really just an XCObject, the XCRemoteObject thing is just
    # to allow PBXProject to be used in the remoteGlobalIDString property of
    # PBXContainerItemProxy.
    #
    # Setting a "name" property at instantiation may also affect "productName",
    # which may in turn affect the "PRODUCT_NAME" build setting in children of
    # "buildConfigurationList".  See __init__ below.
    _schema = XCRemoteObject._schema.copy()
    _schema.update(
        {
            "buildConfigurationList": [
                0,
                XCConfigurationList,
                1,
                1,
                XCConfigurationList(),
            ],
            "buildPhases": [1, XCBuildPhase, 1, 1, []],
            "dependencies": [1, PBXTargetDependency, 1, 1, []],
            "name": [0, str, 0, 1],
            "productName": [0, str, 0, 1],
        }
    )

    def __init__(
        self,
        properties=None,
        id=None,
        parent=None,
        force_outdir=None,
        force_prefix=None,
        force_extension=None,
    ):
        # super
        XCRemoteObject.__init__(self, properties, id, parent)

        # Set up additional defaults not expressed in the schema.  If a "name"
        # property was supplied, set "productName" if it is not present.  Also set
        # the "PRODUCT_NAME" build setting in each configuration, but only if
        # the setting is not present in any build configuration.
        if "name" in self._properties and "productName" not in self._properties:
            self.SetProperty("productName", self._properties["name"])

        if "productName" in self._properties:
            if "buildConfigurationList" in self._properties:
                configs = self._properties["buildConfigurationList"]
                if configs.HasBuildSetting("PRODUCT_NAME") == 0:
                    configs.SetBuildSetting(
                        "PRODUCT_NAME", self._properties["productName"]
                    )

    def AddDependency(self, other):
        pbxproject = self.PBXProjectAncestor()
        other_pbxproject = other.PBXProjectAncestor()
        if pbxproject == other_pbxproject:
            # Add a dependency to another target in the same project file.
            container = PBXContainerItemProxy(
                {
                    "containerPortal": pbxproject,
                    "proxyType": 1,
                    "remoteGlobalIDString": other,
                    "remoteInfo": other.Name(),
                }
            )
            dependency = PBXTargetDependency(
                {"target": other, "targetProxy": container}
            )
            self.AppendProperty("dependencies", dependency)
        else:
            # Add a dependency to a target in a different project file.
            other_project_ref = pbxproject.AddOrGetProjectReference(other_pbxproject)[1]
            container = PBXContainerItemProxy(
                {
                    "containerPortal": other_project_ref,
                    "proxyType": 1,
                    "remoteGlobalIDString": other,
                    "remoteInfo": other.Name(),
                }
            )
            dependency = PBXTargetDependency(
                {"name": other.Name(), "targetProxy": container}
            )
            self.AppendProperty("dependencies", dependency)

    # Proxy all of these through to the build configuration list.

    def ConfigurationNamed(self, name):
        return self._properties["buildConfigurationList"].ConfigurationNamed(name)

    def DefaultConfiguration(self):
        return self._properties["buildConfigurationList"].DefaultConfiguration()

    def HasBuildSetting(self, key):
        return self._properties["buildConfigurationList"].HasBuildSetting(key)

    def GetBuildSetting(self, key):
        return self._properties["buildConfigurationList"].GetBuildSetting(key)

    def SetBuildSetting(self, key, value):
        return self._properties["buildConfigurationList"].SetBuildSetting(key, value)

    def AppendBuildSetting(self, key, value):
        return self._properties["buildConfigurationList"].AppendBuildSetting(key, value)

    def DelBuildSetting(self, key):
        return self._properties["buildConfigurationList"].DelBuildSetting(key)


# Redefine the type of the "target" property.  See PBXTargetDependency._schema
# above.
PBXTargetDependency._schema["target"][1] = XCTarget


class PBXNativeTarget(XCTarget):
    # buildPhases is overridden in the schema to be able to set defaults.
    #
    # NOTE: Contrary to most objects, it is advisable to set parent when
    # constructing PBXNativeTarget.  A parent of an XCTarget must be a PBXProject
    # object.  A parent reference is required for a PBXNativeTarget during
    # construction to be able to set up the target defaults for productReference,
    # because a PBXBuildFile object must be created for the target and it must
    # be added to the PBXProject's mainGroup hierarchy.
    _schema = XCTarget._schema.copy()
    _schema.update(
        {
            "buildPhases": [
                1,
                XCBuildPhase,
                1,
                1,
                [PBXSourcesBuildPhase(), PBXFrameworksBuildPhase()],
            ],
            "buildRules": [1, PBXBuildRule, 1, 1, []],
            "productReference": [0, PBXFileReference, 0, 1],
            "productType": [0, str, 0, 1],
        }
    )

    # Mapping from Xcode product-types to settings.  The settings are:
    #  filetype : used for explicitFileType in the project file
    #  prefix : the prefix for the file name
    #  suffix : the suffix for the file name
    _product_filetypes = {
        "com.apple.product-type.application": ["wrapper.application", "", ".app"],
        "com.apple.product-type.application.watchapp": [
            "wrapper.application",
            "",
            ".app",
        ],
        "com.apple.product-type.watchkit-extension": [
            "wrapper.app-extension",
            "",
            ".appex",
        ],
        "com.apple.product-type.app-extension": ["wrapper.app-extension", "", ".appex"],
        "com.apple.product-type.bundle": ["wrapper.cfbundle", "", ".bundle"],
        "com.apple.product-type.framework": ["wrapper.framework", "", ".framework"],
        "com.apple.product-type.library.dynamic": [
            "compiled.mach-o.dylib",
            "lib",
            ".dylib",
        ],
        "com.apple.product-type.library.static": ["archive.ar", "lib", ".a"],
        "com.apple.product-type.tool": ["compiled.mach-o.executable", "", ""],
        "com.apple.product-type.bundle.unit-test": ["wrapper.cfbundle", "", ".xctest"],
        "com.apple.product-type.bundle.ui-testing": ["wrapper.cfbundle", "", ".xctest"],
        "com.googlecode.gyp.xcode.bundle": ["compiled.mach-o.dylib", "", ".so"],
        "com.apple.product-type.kernel-extension": ["wrapper.kext", "", ".kext"],
    }

    def __init__(
        self,
        properties=None,
        id=None,
        parent=None,
        force_outdir=None,
        force_prefix=None,
        force_extension=None,
    ):
        # super
        XCTarget.__init__(self, properties, id, parent)

        if (
            "productName" in self._properties
            and "productType" in self._properties
            and "productReference" not in self._properties
            and self._properties["productType"] in self._product_filetypes
        ):
            products_group = None
            pbxproject = self.PBXProjectAncestor()
            if pbxproject is not None:
                products_group = pbxproject.ProductsGroup()

            if products_group is not None:
                (filetype, prefix, suffix) = self._product_filetypes[
                    self._properties["productType"]
                ]
                # Xcode does not have a distinct type for loadable modules that are
                # pure BSD targets (not in a bundle wrapper). GYP allows such modules
                # to be specified by setting a target type to loadable_module without
                # having mac_bundle set. These are mapped to the pseudo-product type
                # com.googlecode.gyp.xcode.bundle.
                #
                # By picking up this special type and converting it to a dynamic
                # library (com.apple.product-type.library.dynamic) with fix-ups,
                # single-file loadable modules can be produced.
                #
                # MACH_O_TYPE is changed to mh_bundle to produce the proper file type
                # (as opposed to mh_dylib). In order for linking to succeed,
                # DYLIB_CURRENT_VERSION and DYLIB_COMPATIBILITY_VERSION must be
                # cleared. They are meaningless for type mh_bundle.
                #
                # Finally, the .so extension is forcibly applied over the default
                # (.dylib), unless another forced extension is already selected.
                # .dylib is plainly wrong, and .bundle is used by loadable_modules in
                # bundle wrappers (com.apple.product-type.bundle). .so seems an odd
                # choice because it's used as the extension on many other systems that
                # don't distinguish between linkable shared libraries and non-linkable
                # loadable modules, but there's precedent: Python loadable modules on
                # Mac OS X use an .so extension.
                if self._properties["productType"] == "com.googlecode.gyp.xcode.bundle":
                    self._properties[
                        "productType"
                    ] = "com.apple.product-type.library.dynamic"
                    self.SetBuildSetting("MACH_O_TYPE", "mh_bundle")
                    self.SetBuildSetting("DYLIB_CURRENT_VERSION", "")
                    self.SetBuildSetting("DYLIB_COMPATIBILITY_VERSION", "")
                    if force_extension is None:
                        force_extension = suffix[1:]

                if (
                    self._properties["productType"] in {
                        "com.apple.product-type-bundle.unit.test",
                        "com.apple.product-type-bundle.ui-testing"
                    }
                ) and force_extension is None:
                    force_extension = suffix[1:]

                if force_extension is not None:
                    # If it's a wrapper (bundle), set WRAPPER_EXTENSION.
                    # Extension override.
                    suffix = "." + force_extension
                    if filetype.startswith("wrapper."):
                        self.SetBuildSetting("WRAPPER_EXTENSION", force_extension)
                    else:
                        self.SetBuildSetting("EXECUTABLE_EXTENSION", force_extension)

                    if filetype.startswith("compiled.mach-o.executable"):
                        product_name = self._properties["productName"]
                        product_name += suffix
                        suffix = ""
                        self.SetProperty("productName", product_name)
                        self.SetBuildSetting("PRODUCT_NAME", product_name)

                # Xcode handles most prefixes based on the target type, however there
                # are exceptions.  If a "BSD Dynamic Library" target is added in the
                # Xcode UI, Xcode sets EXECUTABLE_PREFIX.  This check duplicates that
                # behavior.
                if force_prefix is not None:
                    prefix = force_prefix
                if filetype.startswith("wrapper."):
                    self.SetBuildSetting("WRAPPER_PREFIX", prefix)
                else:
                    self.SetBuildSetting("EXECUTABLE_PREFIX", prefix)

                if force_outdir is not None:
                    self.SetBuildSetting("TARGET_BUILD_DIR", force_outdir)

                # TODO(tvl): Remove the below hack.
                #    http://code.google.com/p/gyp/issues/detail?id=122

                # Some targets include the prefix in the target_name.  These targets
                # really should just add a product_name setting that doesn't include
                # the prefix.  For example:
                #  target_name = 'libevent', product_name = 'event'
                # This check cleans up for them.
                product_name = self._properties["productName"]
                prefix_len = len(prefix)
                if prefix_len and (product_name[:prefix_len] == prefix):
                    product_name = product_name[prefix_len:]
                    self.SetProperty("productName", product_name)
                    self.SetBuildSetting("PRODUCT_NAME", product_name)

                ref_props = {
                    "explicitFileType": filetype,
                    "includeInIndex": 0,
                    "path": prefix + product_name + suffix,
                    "sourceTree": "BUILT_PRODUCTS_DIR",
                }
                file_ref = PBXFileReference(ref_props)
                products_group.AppendChild(file_ref)
                self.SetProperty("productReference", file_ref)

    def GetBuildPhaseByType(self, type):
        if "buildPhases" not in self._properties:
            return None

        the_phase = None
        for phase in self._properties["buildPhases"]:
            if isinstance(phase, type):
                # Some phases may be present in multiples in a well-formed project file,
                # but phases like PBXSourcesBuildPhase may only be present singly, and
                # this function is intended as an aid to GetBuildPhaseByType.  Loop
                # over the entire list of phases and assert if more than one of the
                # desired type is found.
                assert the_phase is None
                the_phase = phase

        return the_phase

    def HeadersPhase(self):
        headers_phase = self.GetBuildPhaseByType(PBXHeadersBuildPhase)
        if headers_phase is None:
            headers_phase = PBXHeadersBuildPhase()

            # The headers phase should come before the resources, sources, and
            # frameworks phases, if any.
            insert_at = len(self._properties["buildPhases"])
            for index, phase in enumerate(self._properties["buildPhases"]):
                if isinstance(
                    phase,
                    (
                        PBXResourcesBuildPhase,
                        PBXSourcesBuildPhase,
                        PBXFrameworksBuildPhase,
                    ),
                ):
                    insert_at = index
                    break

            self._properties["buildPhases"].insert(insert_at, headers_phase)
            headers_phase.parent = self

        return headers_phase

    def ResourcesPhase(self):
        resources_phase = self.GetBuildPhaseByType(PBXResourcesBuildPhase)
        if resources_phase is None:
            resources_phase = PBXResourcesBuildPhase()

            # The resources phase should come before the sources and frameworks
            # phases, if any.
            insert_at = len(self._properties["buildPhases"])
            for index, phase in enumerate(self._properties["buildPhases"]):
                if isinstance(phase, (PBXSourcesBuildPhase, PBXFrameworksBuildPhase)):
                    insert_at = index
                    break

            self._properties["buildPhases"].insert(insert_at, resources_phase)
            resources_phase.parent = self

        return resources_phase

    def SourcesPhase(self):
        sources_phase = self.GetBuildPhaseByType(PBXSourcesBuildPhase)
        if sources_phase is None:
            sources_phase = PBXSourcesBuildPhase()
            self.AppendProperty("buildPhases", sources_phase)

        return sources_phase

    def FrameworksPhase(self):
        frameworks_phase = self.GetBuildPhaseByType(PBXFrameworksBuildPhase)
        if frameworks_phase is None:
            frameworks_phase = PBXFrameworksBuildPhase()
            self.AppendProperty("buildPhases", frameworks_phase)

        return frameworks_phase

    def AddDependency(self, other):
        # super
        XCTarget.AddDependency(self, other)

        static_library_type = "com.apple.product-type.library.static"
        shared_library_type = "com.apple.product-type.library.dynamic"
        framework_type = "com.apple.product-type.framework"
        if (
            isinstance(other, PBXNativeTarget)
            and "productType" in self._properties
            and self._properties["productType"] != static_library_type
            and "productType" in other._properties
            and (
                other._properties["productType"] == static_library_type
                or (
                    (
                        other._properties["productType"] in {
                            shared_library_type,
                            framework_type
                        }
                    )
                    and (
                        (not other.HasBuildSetting("MACH_O_TYPE"))
                        or other.GetBuildSetting("MACH_O_TYPE") != "mh_bundle"
                    )
                )
            )
        ):

            file_ref = other.GetProperty("productReference")

            pbxproject = self.PBXProjectAncestor()
            other_pbxproject = other.PBXProjectAncestor()
            if pbxproject != other_pbxproject:
                other_project_product_group = pbxproject.AddOrGetProjectReference(
                    other_pbxproject
                )[0]
                file_ref = other_project_product_group.GetChildByRemoteObject(file_ref)

            self.FrameworksPhase().AppendProperty(
                "files", PBXBuildFile({"fileRef": file_ref})
            )


class PBXAggregateTarget(XCTarget):
    pass


class PBXProject(XCContainerPortal):
    # A PBXProject is really just an XCObject, the XCContainerPortal thing is
    # just to allow PBXProject to be used in the containerPortal property of
    # PBXContainerItemProxy.
    """

  Attributes:
    path: "sample.xcodeproj".  TODO(mark) Document me!
    _other_pbxprojects: A dictionary, keyed by other PBXProject objects.  Each
                        value is a reference to the dict in the
                        projectReferences list associated with the keyed
                        PBXProject.
  """

    _schema = XCContainerPortal._schema.copy()
    _schema.update(
        {
            "attributes": [0, dict, 0, 0],
            "buildConfigurationList": [
                0,
                XCConfigurationList,
                1,
                1,
                XCConfigurationList(),
            ],
            "compatibilityVersion": [0, str, 0, 1, "Xcode 3.2"],
            "hasScannedForEncodings": [0, int, 0, 1, 1],
            "mainGroup": [0, PBXGroup, 1, 1, PBXGroup()],
            "projectDirPath": [0, str, 0, 1, ""],
            "projectReferences": [1, dict, 0, 0],
            "projectRoot": [0, str, 0, 1, ""],
            "targets": [1, XCTarget, 1, 1, []],
        }
    )

    def __init__(self, properties=None, id=None, parent=None, path=None):
        self.path = path
        self._other_pbxprojects = {}
        # super
        XCContainerPortal.__init__(self, properties, id, parent)

    def Name(self):
        name = self.path
        if name[-10:] == ".xcodeproj":
            name = name[:-10]
        return posixpath.basename(name)

    def Path(self):
        return self.path

    def Comment(self):
        return "Project object"

    def Children(self):
        # super
        children = XCContainerPortal.Children(self)

        # Add children that the schema doesn't know about.  Maybe there's a more
        # elegant way around this, but this is the only case where we need to own
        # objects in a dictionary (that is itself in a list), and three lines for
        # a one-off isn't that big a deal.
        if "projectReferences" in self._properties:
            for reference in self._properties["projectReferences"]:
                children.append(reference["ProductGroup"])

        return children

    def PBXProjectAncestor(self):
        return self

    def _GroupByName(self, name):
        if "mainGroup" not in self._properties:
            self.SetProperty("mainGroup", PBXGroup())

        main_group = self._properties["mainGroup"]
        group = main_group.GetChildByName(name)
        if group is None:
            group = PBXGroup({"name": name})
            main_group.AppendChild(group)

        return group

    # SourceGroup and ProductsGroup are created by default in Xcode's own
    # templates.
    def SourceGroup(self):
        return self._GroupByName("Source")

    def ProductsGroup(self):
        return self._GroupByName("Products")

    # IntermediatesGroup is used to collect source-like files that are generated
    # by rules or script phases and are placed in intermediate directories such
    # as DerivedSources.
    def IntermediatesGroup(self):
        return self._GroupByName("Intermediates")

    # FrameworksGroup and ProjectsGroup are top-level groups used to collect
    # frameworks and projects.
    def FrameworksGroup(self):
        return self._GroupByName("Frameworks")

    def ProjectsGroup(self):
        return self._GroupByName("Projects")

    def RootGroupForPath(self, path):
        """Returns a PBXGroup child of this object to which path should be added.

    This method is intended to choose between SourceGroup and
    IntermediatesGroup on the basis of whether path is present in a source
    directory or an intermediates directory.  For the purposes of this
    determination, any path located within a derived file directory such as
    PROJECT_DERIVED_FILE_DIR is treated as being in an intermediates
    directory.

    The returned value is a two-element tuple.  The first element is the
    PBXGroup, and the second element specifies whether that group should be
    organized hierarchically (True) or as a single flat list (False).
    """

        # TODO(mark): make this a class variable and bind to self on call?
        # Also, this list is nowhere near exhaustive.
        # INTERMEDIATE_DIR and SHARED_INTERMEDIATE_DIR are used by
        # gyp.generator.xcode.  There should probably be some way for that module
        # to push the names in, rather than having to hard-code them here.
        source_tree_groups = {
            "DERIVED_FILE_DIR": (self.IntermediatesGroup, True),
            "INTERMEDIATE_DIR": (self.IntermediatesGroup, True),
            "PROJECT_DERIVED_FILE_DIR": (self.IntermediatesGroup, True),
            "SHARED_INTERMEDIATE_DIR": (self.IntermediatesGroup, True),
        }

        (source_tree, path) = SourceTreeAndPathFromPath(path)
        if source_tree is not None and source_tree in source_tree_groups:
            (group_func, hierarchical) = source_tree_groups[source_tree]
            group = group_func()
            return (group, hierarchical)

        # TODO(mark): make additional choices based on file extension.

        return (self.SourceGroup(), True)

    def AddOrGetFileInRootGroup(self, path):
        """Returns a PBXFileReference corresponding to path in the correct group
    according to RootGroupForPath's heuristics.

    If an existing PBXFileReference for path exists, it will be returned.
    Otherwise, one will be created and returned.
    """

        (group, hierarchical) = self.RootGroupForPath(path)
        return group.AddOrGetFileByPath(path, hierarchical)

    def RootGroupsTakeOverOnlyChildren(self, recurse=False):
        """Calls TakeOverOnlyChild for all groups in the main group."""

        for group in self._properties["mainGroup"]._properties["children"]:
            if isinstance(group, PBXGroup):
                group.TakeOverOnlyChild(recurse)

    def SortGroups(self):
        # Sort the children of the mainGroup (like "Source" and "Products")
        # according to their defined order.
        self._properties["mainGroup"]._properties["children"] = sorted(
            self._properties["mainGroup"]._properties["children"],
            key=cmp_to_key(lambda x, y: x.CompareRootGroup(y)),
        )

        # Sort everything else by putting group before files, and going
        # alphabetically by name within sections of groups and files.  SortGroup
        # is recursive.
        for group in self._properties["mainGroup"]._properties["children"]:
            if not isinstance(group, PBXGroup):
                continue

            if group.Name() == "Products":
                # The Products group is a special case.  Instead of sorting
                # alphabetically, sort things in the order of the targets that
                # produce the products.  To do this, just build up a new list of
                # products based on the targets.
                products = []
                for target in self._properties["targets"]:
                    if not isinstance(target, PBXNativeTarget):
                        continue
                    product = target._properties["productReference"]
                    # Make sure that the product is already in the products group.
                    assert product in group._properties["children"]
                    products.append(product)

                # Make sure that this process doesn't miss anything that was already
                # in the products group.
                assert len(products) == len(group._properties["children"])
                group._properties["children"] = products
            else:
                group.SortGroup()

    def AddOrGetProjectReference(self, other_pbxproject):
        """Add a reference to another project file (via PBXProject object) to this
    one.

    Returns [ProductGroup, ProjectRef].  ProductGroup is a PBXGroup object in
    this project file that contains a PBXReferenceProxy object for each
    product of each PBXNativeTarget in the other project file.  ProjectRef is
    a PBXFileReference to the other project file.

    If this project file already references the other project file, the
    existing ProductGroup and ProjectRef are returned.  The ProductGroup will
    still be updated if necessary.
    """

        if "projectReferences" not in self._properties:
            self._properties["projectReferences"] = []

        product_group = None
        project_ref = None

        if other_pbxproject not in self._other_pbxprojects:
            # This project file isn't yet linked to the other one.  Establish the
            # link.
            product_group = PBXGroup({"name": "Products"})

            # ProductGroup is strong.
            product_group.parent = self

            # There's nothing unique about this PBXGroup, and if left alone, it will
            # wind up with the same set of hashables as all other PBXGroup objects
            # owned by the projectReferences list.  Add the hashables of the
            # remote PBXProject that it's related to.
            product_group._hashables.extend(other_pbxproject.Hashables())

            # The other project reports its path as relative to the same directory
            # that this project's path is relative to.  The other project's path
            # is not necessarily already relative to this project.  Figure out the
            # pathname that this project needs to use to refer to the other one.
            this_path = posixpath.dirname(self.Path())
            projectDirPath = self.GetProperty("projectDirPath")
            if projectDirPath:
                if posixpath.isabs(projectDirPath[0]):
                    this_path = projectDirPath
                else:
                    this_path = posixpath.join(this_path, projectDirPath)
            other_path = gyp.common.RelativePath(other_pbxproject.Path(), this_path)

            # ProjectRef is weak (it's owned by the mainGroup hierarchy).
            project_ref = PBXFileReference(
                {
                    "lastKnownFileType": "wrapper.pb-project",
                    "path": other_path,
                    "sourceTree": "SOURCE_ROOT",
                }
            )
            self.ProjectsGroup().AppendChild(project_ref)

            ref_dict = {"ProductGroup": product_group, "ProjectRef": project_ref}
            self._other_pbxprojects[other_pbxproject] = ref_dict
            self.AppendProperty("projectReferences", ref_dict)

            # Xcode seems to sort this list case-insensitively
            self._properties["projectReferences"] = sorted(
                self._properties["projectReferences"],
                key=lambda x: x["ProjectRef"].Name().lower()
            )
        else:
            # The link already exists.  Pull out the relevnt data.
            project_ref_dict = self._other_pbxprojects[other_pbxproject]
            product_group = project_ref_dict["ProductGroup"]
            project_ref = project_ref_dict["ProjectRef"]

        self._SetUpProductReferences(other_pbxproject, product_group, project_ref)

        inherit_unique_symroot = self._AllSymrootsUnique(other_pbxproject, False)
        targets = other_pbxproject.GetProperty("targets")
        if all(self._AllSymrootsUnique(t, inherit_unique_symroot) for t in targets):
            dir_path = project_ref._properties["path"]
            product_group._hashables.extend(dir_path)

        return [product_group, project_ref]

    def _AllSymrootsUnique(self, target, inherit_unique_symroot):
        # Returns True if all configurations have a unique 'SYMROOT' attribute.
        # The value of inherit_unique_symroot decides, if a configuration is assumed
        # to inherit a unique 'SYMROOT' attribute from its parent, if it doesn't
        # define an explicit value for 'SYMROOT'.
        symroots = self._DefinedSymroots(target)
        for s in self._DefinedSymroots(target):
            if (
                s is not None
                and not self._IsUniqueSymrootForTarget(s)
                or s is None
                and not inherit_unique_symroot
            ):
                return False
        return True if symroots else inherit_unique_symroot

    def _DefinedSymroots(self, target):
        # Returns all values for the 'SYMROOT' attribute defined in all
        # configurations for this target. If any configuration doesn't define the
        # 'SYMROOT' attribute, None is added to the returned set. If all
        # configurations don't define the 'SYMROOT' attribute, an empty set is
        # returned.
        config_list = target.GetProperty("buildConfigurationList")
        symroots = set()
        for config in config_list.GetProperty("buildConfigurations"):
            setting = config.GetProperty("buildSettings")
            if "SYMROOT" in setting:
                symroots.add(setting["SYMROOT"])
            else:
                symroots.add(None)
        if len(symroots) == 1 and None in symroots:
            return set()
        return symroots

    def _IsUniqueSymrootForTarget(self, symroot):
        # This method returns True if all configurations in target contain a
        # 'SYMROOT' attribute that is unique for the given target. A value is
        # unique, if the Xcode macro '$SRCROOT' appears in it in any form.
        uniquifier = ["$SRCROOT", "$(SRCROOT)"]
        if any(x in symroot for x in uniquifier):
            return True
        return False

    def _SetUpProductReferences(self, other_pbxproject, product_group, project_ref):
        # TODO(mark): This only adds references to products in other_pbxproject
        # when they don't exist in this pbxproject.  Perhaps it should also
        # remove references from this pbxproject that are no longer present in
        # other_pbxproject.  Perhaps it should update various properties if they
        # change.
        for target in other_pbxproject._properties["targets"]:
            if not isinstance(target, PBXNativeTarget):
                continue

            other_fileref = target._properties["productReference"]
            if product_group.GetChildByRemoteObject(other_fileref) is None:
                # Xcode sets remoteInfo to the name of the target and not the name
                # of its product, despite this proxy being a reference to the product.
                container_item = PBXContainerItemProxy(
                    {
                        "containerPortal": project_ref,
                        "proxyType": 2,
                        "remoteGlobalIDString": other_fileref,
                        "remoteInfo": target.Name(),
                    }
                )
                # TODO(mark): Does sourceTree get copied straight over from the other
                # project?  Can the other project ever have lastKnownFileType here
                # instead of explicitFileType?  (Use it if so?)  Can path ever be
                # unset?  (I don't think so.)  Can other_fileref have name set, and
                # does it impact the PBXReferenceProxy if so?  These are the questions
                # that perhaps will be answered one day.
                reference_proxy = PBXReferenceProxy(
                    {
                        "fileType": other_fileref._properties["explicitFileType"],
                        "path": other_fileref._properties["path"],
                        "sourceTree": other_fileref._properties["sourceTree"],
                        "remoteRef": container_item,
                    }
                )

                product_group.AppendChild(reference_proxy)

    def SortRemoteProductReferences(self):
        # For each remote project file, sort the associated ProductGroup in the
        # same order that the targets are sorted in the remote project file.  This
        # is the sort order used by Xcode.

        def CompareProducts(x, y, remote_products):
            # x and y are PBXReferenceProxy objects.  Go through their associated
            # PBXContainerItem to get the remote PBXFileReference, which will be
            # present in the remote_products list.
            x_remote = x._properties["remoteRef"]._properties["remoteGlobalIDString"]
            y_remote = y._properties["remoteRef"]._properties["remoteGlobalIDString"]
            x_index = remote_products.index(x_remote)
            y_index = remote_products.index(y_remote)

            # Use the order of each remote PBXFileReference in remote_products to
            # determine the sort order.
            return cmp(x_index, y_index)

        for other_pbxproject, ref_dict in self._other_pbxprojects.items():
            # Build up a list of products in the remote project file, ordered the
            # same as the targets that produce them.
            remote_products = []
            for target in other_pbxproject._properties["targets"]:
                if not isinstance(target, PBXNativeTarget):
                    continue
                remote_products.append(target._properties["productReference"])

            # Sort the PBXReferenceProxy children according to the list of remote
            # products.
            product_group = ref_dict["ProductGroup"]
            product_group._properties["children"] = sorted(
                product_group._properties["children"],
                key=cmp_to_key(
                    lambda x, y, rp=remote_products: CompareProducts(x, y, rp)),
            )


class XCProjectFile(XCObject):
    _schema = XCObject._schema.copy()
    _schema.update(
        {
            "archiveVersion": [0, int, 0, 1, 1],
            "classes": [0, dict, 0, 1, {}],
            "objectVersion": [0, int, 0, 1, 46],
            "rootObject": [0, PBXProject, 1, 1],
        }
    )

    def ComputeIDs(self, recursive=True, overwrite=True, hash=None):
        # Although XCProjectFile is implemented here as an XCObject, it's not a
        # proper object in the Xcode sense, and it certainly doesn't have its own
        # ID.  Pass through an attempt to update IDs to the real root object.
        if recursive:
            self._properties["rootObject"].ComputeIDs(recursive, overwrite, hash)

    def Print(self, file=sys.stdout):
        self.VerifyHasRequiredProperties()

        # Add the special "objects" property, which will be caught and handled
        # separately during printing.  This structure allows a fairly standard
        # loop do the normal printing.
        self._properties["objects"] = {}
        self._XCPrint(file, 0, "// !$*UTF8*$!\n")
        if self._should_print_single_line:
            self._XCPrint(file, 0, "{ ")
        else:
            self._XCPrint(file, 0, "{\n")
        for property, value in sorted(
            self._properties.items()
        ):
            if property == "objects":
                self._PrintObjects(file)
            else:
                self._XCKVPrint(file, 1, property, value)
        self._XCPrint(file, 0, "}\n")
        del self._properties["objects"]

    def _PrintObjects(self, file):
        if self._should_print_single_line:
            self._XCPrint(file, 0, "objects = {")
        else:
            self._XCPrint(file, 1, "objects = {\n")

        objects_by_class = {}
        for object in self.Descendants():
            if object == self:
                continue
            class_name = object.__class__.__name__
            if class_name not in objects_by_class:
                objects_by_class[class_name] = []
            objects_by_class[class_name].append(object)

        for class_name in sorted(objects_by_class):
            self._XCPrint(file, 0, "\n")
            self._XCPrint(file, 0, "/* Begin " + class_name + " section */\n")
            for object in sorted(
                objects_by_class[class_name], key=attrgetter("id")
            ):
                object.Print(file)
            self._XCPrint(file, 0, "/* End " + class_name + " section */\n")

        if self._should_print_single_line:
            self._XCPrint(file, 0, "}; ")
        else:
            self._XCPrint(file, 1, "};\n")
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       ,CAAgBA,EAChBlU,EAAAwyB,MAAA,CA1+IAA,QAAc,CAAC/mB,CAAD,CAAY,CACtB,MAAOA,EAAA,CAAYD,EAAA,CAAeC,CAAf,CAAZ,CAAwC+L,CADzB,CA2+I1BxX,EAAAosC,SAAA,CA7nHAA,QAAiB,EAAG,CAEhB,IADA,IAAIvgC,EAAO,EAAX,CACSxD,EAAK,CAAd,CAAiBA,CAAjB,CAAsB1D,SAAAjD,OAAtB,CAAwC2G,CAAA,EAAxC,CACIwD,CAAA,CAAKxD,CAAL,CAAA;AAAW1D,SAAA,CAAU0D,CAAV,CAEX6I,KAAAA,EAAiBtF,EAAA,CAAkBC,CAAlB,CAAjBqF,CACAvJ,EAAKgK,EAAA,CAAqB9F,CAArB,CADLqF,CACiCqF,EAAU5O,CAAAkE,KAD3CqF,CACoDY,EAAOnK,CAAAmK,KAD3DZ,CAEAxO,EAAS,IAAI+H,CAAJ,CAAe,QAAS,CAAC1C,CAAD,CAAa,CAC9C,IAAIrG,EAAS6U,CAAA7U,OACb,IAAKA,CAAL,CAwBA,IApBA,IAAI0Q,EAAavN,KAAJ,CAAUnD,CAAV,CAAb,CACI2qC,EAAuB3qC,CAD3B,CAEI4qC,EAAqB5qC,CAFzB,CAGIkR,EAAUA,QAAS,CAAC6D,CAAD,CAAc,CACjC,IAAIkB,EAAW,CAAA,CACfhL,EAAA,CAAU4J,CAAA,CAAQE,CAAR,CAAV,CAAArM,UAAA,CAA0Cf,CAAA,CAAyBtB,CAAzB,CAAqC,QAAS,CAAC7F,CAAD,CAAQ,CACvFyV,CAAL,GACIA,CACA,CADW,CAAA,CACX,CAAA20B,CAAA,EAFJ,CAIAl6B,EAAA,CAAOqE,CAAP,CAAA,CAAsBvU,CALsE,CAAtD,CAMvC,QAAS,EAAG,CAAE,MAAOmqC,EAAA,EAAT,CAN2B,CAMSriC,IAAAA,EANT,CAMoB,QAAS,EAAG,CACjEqiC,CAAL,EAA8B10B,CAA9B,GACS20B,CAGL,EAFIvkC,CAAAvF,KAAA,CAAgBsP,CAAA,CAAOK,EAAA,CAAaL,CAAb,CAAmBM,CAAnB,CAAP,CAAoCA,CAApD,CAEJ,CAAArK,CAAAgB,SAAA,EAJJ,CADsE,CANhC,CAA1C,CAFiC,CAHrC,CAoBS0N,EAAc,CAAvB,CAA0BA,CAA1B,CAAwC/U,CAAxC,CAAgD+U,CAAA,EAAhD,CACI7D,CAAA,CAAQ6D,CAAR,CAzBJ,KACI1O,EAAAgB,SAAA,EAH0C,CAArC,CA8Bb,OAAOmI,EAAA,CAAiBxO,CAAAyF,KAAA,CAAY0I,CAAA,CAAiBK,CAAjB,CAAZ,CAAjB,CAAiExO,CArCxD,CA8nHpB1C,EAAAyE,KAAA,CAAeA,CACfzE,EAAAoU,UAAA,CAAoBA,EACpBpU,EAAAwV,iBAAA,CAA2BA,EAC3BxV,EAAAusC,SAAA,CAphHAA,QAAiB,CAACC,CAAD,CAAwBC,CAAxB,CAAmCC,CAAnC,CAA4CC,CAA5C,CAAuElhC,CAAvE,CAAkF,CAiB/FmhC,QAASA,EAAG,EAAG,CACX,IAAIxxB,CACJ,OAAOtY,GAAA,CAAY,IAAZ,CAAkB,QAAS,CAAC6E,CAAD,CAAK,CACnC,OAAQA,CAAApE,MAAR,EACI,KAAK,CAAL,CACI6X,CACA,CADQyxB,CACR,CAAAllC,CAAApE,MAAA;AAAW,CACf,MAAK,CAAL,CACI,MAAOkpC,EAAP,EAAoB,CAAAA,CAAA,CAAUrxB,CAAV,CAApB,CAA8C,CAAC,CAAD,CAAI,CAAJ,CAA9C,CACO,CAAC,CAAD,CAAIlK,CAAA,CAAekK,CAAf,CAAJ,CACX,MAAK,CAAL,CACIzT,CAAA/D,KAAA,EACA,CAAA+D,CAAApE,MAAA,CAAW,CACf,MAAK,CAAL,CAEI,MADA6X,EACO,CADCsxB,CAAA,CAAQtxB,CAAR,CACD,CAAA,CAAC,CAAD,CAAI,CAAJ,CACX,MAAK,CAAL,CAAQ,MAAO,CAAC,CAAD,CAbnB,CADmC,CAAhC,CAFI,CAhBf,IAAQ7O,CAAR,CACI2E,CADJ,CAEI27B,CACqB,EAAzB,GAAIloC,SAAAjD,OAAJ,EACiCmrC,CAAwJ,CAA/KL,CAAsCK,aAAyI,CAAxHJ,CAAwH,CAA/KD,CAAmEC,UAA4G,CAA9FC,CAA8F,CAA/KF,CAA2FE,QAAoF,CAAxEngC,CAAwE,CAA/KigC,CAA4Gt7B,eAAmE,CAAhDA,CAAgD,CAAxB,IAAK,EAAZ,GAAA3E,CAAA,CAAgBtE,CAAhB,CAA2BsE,CAAI,CAAAd,CAAA,CAA/K+gC,CAA2L/gC,UADrM,GAIIohC,CACA,CADeL,CACf,CAAKG,CAAAA,CAAL,EAAkChhC,EAAA,CAAYghC,CAAZ,CAAlC,EACIz7B,CACA,CADiBjJ,CACjB,CAAAwD,CAAA,CAAYkhC,CAFhB,EAKIz7B,CALJ,CAKqBy7B,CAVzB,CAiCA,OAAOz4B,GAAA,CAAOzI,CAAA,CAEN,QAAS,EAAG,CAAE,MAAOmD,GAAA,CAAiBg+B,CAAA,EAAjB,CAAwBnhC,CAAxB,CAAT,CAFN,CAINmhC,CAJD,CArCwF,CAqhHnG5sC,EAAA8sC,IAAA,CAz+GAA,QAAY,CAACL,CAAD,CAAYM,CAAZ,CAAwBC,CAAxB,CAAqC,CAC7C,MAAO94B,GAAA,CAAM,QAAS,EAAG,CAAE,MAAQu4B,EAAA,EAAA,CAAcM,CAAd,CAA2BC,CAArC,CAAlB,CADsC,CA0+GjDhtC,EAAAkW,SAAA,CAAmBA,EACnBlW,EAAA4/B,MAAA,CA97GAA,QAAc,EAAG,CAEb,IADA,IAAI/zB,EAAO,EAAX,CACSxD,EAAK,CAAd,CAAiBA,CAAjB,CAAsB1D,SAAAjD,OAAtB,CAAwC2G,CAAA,EAAxC,CACIwD,CAAA,CAAKxD,CAAL,CAAA,CAAW1D,SAAA,CAAU0D,CAAV,CAEXoD,KAAAA,EAAYK,CAAA,CAAaD,CAAb,CAAZJ,CACAwH,EAriCyB,QAAtB,GAAA,MAqiCoBpH,EA9iCpB,CA8iCoBA,CA9iChBnK,OAAJ;AAAiB,CAAjB,CASA,CAqiCoBmK,CAriCapI,IAAA,EAAjC,CAqiC0BqQ,QAEjC,OADcjI,EACNnK,OAAD,CAGkB,CAAnB,GAJQmK,CAIRnK,OAAA,CAEMiL,CAAA,CANEd,CAMQ,CAAQ,CAAR,CAAV,CAFN,CAIMmI,EAAA,CAASf,CAAT,CAAA,CAAqBxO,CAAA,CARnBoH,CAQmB,CAAcJ,CAAd,CAArB,CAPL,CAEC+L,CAVK,CA+7GjBxX,EAAAitC,MAAA,CA56GAA,QAAc,EAAG,CACb,MAAO1N,GADM,CA66GjBv/B,EAAAgP,GAAA,CAAaA,EACbhP,EAAAsW,kBAAA,CAA4BA,EAC5BtW,EAAAktC,MAAA,CAx4GAA,QAAc,CAAClhC,CAAD,CAAMP,CAAN,CAAiB,CAC3B,MAAOhH,EAAA,CAAK3D,MAAAqsC,QAAA,CAAenhC,CAAf,CAAL,CAA0BP,CAA1B,CADoB,CAy4G/BzL,EAAA8/B,UAAA,CA13GAA,QAAkB,CAAC52B,CAAD,CAAS8N,CAAT,CAAoBnV,CAApB,CAA6B,CAC3C,MAAO,CAACkV,CAAA,CAAOC,CAAP,CAAkBnV,CAAlB,CAAA,CAA2B8K,CAAA,CAAUzD,CAAV,CAA3B,CAAD,CAAgD6N,CAAA,CAAOF,EAAA,CAAIG,CAAJ,CAAenV,CAAf,CAAP,CAAA,CAAgC8K,CAAA,CAAUzD,CAAV,CAAhC,CAAhD,CADoC,CA23G/ClJ,EAAAggC,KAAA,CAv3GAA,QAAa,EAAG,CAEZ,IADA,IAAIzpB,EAAU,EAAd,CACSlO,EAAK,CAAd,CAAiBA,CAAjB,CAAsB1D,SAAAjD,OAAtB,CAAwC2G,CAAA,EAAxC,CACIkO,CAAA,CAAQlO,CAAR,CAAA,CAAc1D,SAAA,CAAU0D,CAAV,CAElBkO,EAAA,CAAUH,CAAA,CAAeG,CAAf,CACV,OAA0B,EAAnB,GAAAA,CAAA7U,OAAA,CAAuBiL,CAAA,CAAU4J,CAAA,CAAQ,CAAR,CAAV,CAAvB,CAA+C,IAAI9L,CAAJ,CAAewM,EAAA,CAASV,CAAT,CAAf,CAN1C,CAw3GhBvW,EAAAotC,MAAA,CA51GAA,QAAc,CAACxiC,CAAD,CAAQ0N,CAAR,CAAe7M,CAAf,CAA0B,CACvB,IAAb,EAAI6M,CAAJ,GACIA,CACA,CADQ1N,CACR,CAAAA,CAAA,CAAQ,CAFZ,CAIA,IAAa,CAAb,EAAI0N,CAAJ,CACI,MAAOd,EAEX,KAAI61B,EAAM/0B,CAAN+0B,CAAcziC,CAClB,OAAO,KAAIH,CAAJ,CAAegB,CAAA,CAEd,QAAS,CAAC1D,CAAD,CAAa,CAClB,IAAI9E,EAAI2H,CACR,OAAOa,EAAAC,SAAA,CAAmB,QAAS,EAAG,CAC9BzI,CAAJ;AAAQoqC,CAAR,EACItlC,CAAAvF,KAAA,CAAgBS,CAAA,EAAhB,CACA,CAAA,IAAAyI,SAAA,EAFJ,EAKI3D,CAAAgB,SAAA,EAN8B,CAA/B,CAFW,CAFR,CAed,QAAS,CAAChB,CAAD,CAAa,CAElB,IADA,IAAI9E,EAAI2H,CACR,CAAO3H,CAAP,CAAWoqC,CAAX,EAAmBhjC,CAAAtC,CAAAsC,OAAnB,CAAA,CACItC,CAAAvF,KAAA,CAAgBS,CAAA,EAAhB,CAEJ8E,EAAAgB,SAAA,EALkB,CAfvB,CAT6B,CA61GxC/I,EAAAiP,WAAA,CAAqBA,EACrBjP,EAAA4V,MAAA,CAAgBA,CAChB5V,EAAAstC,MAAA,CA9zGAA,QAAc,CAACC,CAAD,CAAkBp5B,CAAlB,CAAqC,CAC/C,MAAO,KAAI1J,CAAJ,CAAe,QAAS,CAAC1C,CAAD,CAAa,CACxC,IAAIylC,EAAWD,CAAA,EAAf,CACI7qC,EAASyR,CAAA,CAAkBq5B,CAAlB,CAEbpjC,EADa1H,CAAAwG,CAASyD,CAAA,CAAUjK,CAAV,CAATwG,CAA6BsO,CAC1CpN,WAAA,CAAiBrC,CAAjB,CACA,OAAO,SAAS,EAAG,CACXylC,CAAJ,EACIA,CAAA7mC,YAAA,EAFW,CALqB,CAArC,CADwC,CA+zGnD3G,EAAAmX,IAAA,CAAcA,EACdnX,EAAA+O,UAAA,CAAoBA,EACpB/O,EAAAwX,MAAA,CAAgBA,CAChBxX,EAAAu/B,MAAA,CAAgBA,EAChBv/B,EAAAiH,OAAA,CAAiBA,CACjBjH,EAAAyX,MAAA,CAAgBA,EAChBzX,EAAA+X,UAAA,CAAoBA,EACpB/X,EAAAsT,OAAA,CAAiBA,EACjBtT,EAAAmY,YAAA,CAAsBA,EACtBnY,EAAAgZ,WAAA,CAAqBA,EACrBhZ,EAAA+Z,aAAA,CAAuBA,EACvB/Z,EAAAqa,WAAA,CAAqBA,EACrBra,EAAAwa,WAAA,CAAqBA,EACrBxa,EAAA0/B,WAAA,CA79FiBjkB,EA89FjBzb,EAAAyb,iBAAA,CAA2BA,EAC3Bzb,EAAA2b,kBAAA;AAA4BA,EAC5B3b,EAAAiU,UAAA,CAAoBA,EACpBjU,EAAA6b,UAAA,CAAoBA,EACpB7b,EAAA8b,YAAA,CAAsBA,EACtB9b,EAAAic,WAAA,CAAqBA,EACrBjc,EAAAsK,QAAA,CAAkBA,EAClBtK,EAAAsY,MAAA,CAAgBA,EAChBtY,EAAAuc,SAAA,CAAmBA,EACnBvc,EAAAwc,aAAA,CAAuBA,EACvBxc,EAAA6c,eAAA,CAAyBA,EACzB7c,EAAAsO,MAAA,CAAgBA,EAChBtO,EAAAkd,UAAA,CAAoBA,EACpBld,EAAAqd,cAAA,CAAwBA,EACxBrd,EAAAsd,SAAA,CAAmBA,EACnBtd,EAAA6d,qBAAA,CAA+BA,EAC/B7d,EAAAke,wBAAA,CAAkCA,EAClCle,EAAAue,UAAA,CAAoBA,EACpBve,EAAA0e,QAAA,CAAkBA,EAClB1e,EAAAsX,MAAA,CAAgBA,EAChBtX,EAAA2/B,QAAA,CAnrFc9gB,EAorFd7e,EAAA6e,WAAA,CAAqBA,EACrB7e,EAAA2e,WAAA,CAAqBA,EACrB3e,EAAAmT,OAAA,CAAiBA,EACjBnT,EAAA+W,OAAA,CAAiBA,CACjB/W,EAAA8e,SAAA,CAAmBA,EACnB9e,EAAAgf,KAAA,CAAeA,EACfhf,EAAAkf,UAAA,CAAoBA,EACpBlf,EAAA4P,MAAA,CAAgBA,EAChB5P,EAAAmf,QAAA,CAAkBA,EAClBnf,EAAAgd,eAAA,CAAyBA,EACzBhd,EAAA0gB,QAAA,CAAkBA,EAClB1gB,EAAA0oB,KAAA,CAAe5H,EACf9gB,EAAA2Q,IAAA,CAAcA,CACd3Q,EAAAid,MAAA,CAAgBA,EAChBjd,EAAA+gB,YAAA;AAAsBA,EACtB/gB,EAAAohB,IAAA,CAAcA,EACdphB,EAAAgU,SAAA,CAAmBA,EACnBhU,EAAA6/B,QAAA,CAphFchsB,CAqhFd7T,EAAA6T,SAAA,CAAmBA,CACnB7T,EAAAshB,WAAA,CAAqBA,EACrBthB,EAAAuhB,UAAA,CAAoBA,EACpBvhB,EAAAyhB,UAAA,CAAoBA,EACpBzhB,EAAA0hB,IAAA,CAAcA,EACd1hB,EAAA2hB,UAAA,CAAoBA,EACpB3hB,EAAAyO,UAAA,CAAoBA,EACpBzO,EAAA+hB,sBAAA,CAAgCA,EAChC/hB,EAAAgiB,SAAA,CAAmBA,EACnBhiB,EAAAkiB,MAAA,CAAgBA,EAChBliB,EAAAqiB,QAAA,CAAkBA,EAClBriB,EAAAsiB,gBAAA,CAA0BA,EAC1BtiB,EAAAyiB,YAAA,CAAsBA,EACtBziB,EAAA0iB,cAAA,CAAwBA,EACxB1iB,EAAA8iB,SAAA,CAAmBA,EACnB9iB,EAAAyI,OAAA,CAAiBA,EACjBzI,EAAAuO,OAAA,CAAiBA,EACjBvO,EAAAsjB,WAAA,CAAqBA,EACrBtjB,EAAA6jB,MAAA,CAAgBA,EAChB7jB,EAAAkkB,UAAA,CAAoBA,EACpBlkB,EAAA4J,SAAA,CAAmBA,EACnB5J,EAAAqkB,OAAA,CAAiBA,EACjBrkB,EAAAskB,WAAA,CAAqBA,EACrBtkB,EAAAukB,KAAA,CAAeA,EACfvkB,EAAAwkB,cAAA,CAAwBA,EACxBxkB,EAAAilB,MAAA,CAAgBA,EAChBjlB,EAAAgmB,YAAA,CAAsBA,EACtBhmB,EAAAkmB,OAAA,CAAiBA,EACjBlmB,EAAAumB,KAAA,CAAeA,EACfvmB,EAAAwmB,SAAA,CAAmBA,EACnBxmB,EAAA6mB,UAAA,CAAoBA,EACpB7mB,EAAAgnB,UAAA,CAAoBA,EACpBhnB;CAAAinB,UAAA,CAAoBA,EACpBjnB,EAAA0O,YAAA,CAAsBA,EACtB1O,EAAAqnB,UAAA,CAAoBA,EACpBrnB,EAAAknB,UAAA,CAAoBA,EACpBlnB,EAAAsnB,YAAA,CAAsBA,EACtBtnB,EAAAunB,WAAA,CAAqBA,EACrBvnB,EAAA+c,KAAA,CAAeA,EACf/c,EAAA2gB,SAAA,CAAmBA,EACnB3gB,EAAAwnB,UAAA,CAAoBA,EACpBxnB,EAAAynB,UAAA,CAAoBA,EACpBznB,EAAA2nB,IAAA,CAAcA,EACd3nB,EAAA+nB,SAAA,CAAmBA,EACnB/nB,EAAAuoB,aAAA,CAAuBA,EACvBvoB,EAAAoe,aAAA,CAAuBA,EACvBpe,EAAAyoB,aAAA,CAAuBA,EACvBzoB,EAAA0P,QAAA,CAAkBA,EAClB1P,EAAA4oB,YAAA,CAAsBA,EACtB5oB,EAAAkL,UAAA,CAAoBA,EACpBlL,EAAAqb,QAAA,CAAkBA,EAClBrb,EAAA+oB,OAAA,CAAiBA,EACjB/oB,EAAAopB,YAAA,CAAsBA,EACtBppB,EAAA2iB,WAAA,CAAqBA,EACrB3iB,EAAAsqB,aAAA,CAAuBA,EACvBtqB,EAAA0qB,WAAA,CAAqBA,EACrB1qB,EAAA4qB,eAAA,CAAyBA,EACzB5qB,EAAAirB,OAAA,CAAiBA,EACjBjrB,EAAAmrB,QAAA,CAAkBA,EAElBrqB,OAAAs2B,eAAA,CAAsBp3B,CAAtB,CAA+B,YAA/B,CAA6C,CAAEkC,MAAO,CAAA,CAAT,CAA7C,CApxMwB,CAJ3B;","sources":["../cjs/Input_0"],"names":["global","factory","exports","module","define","amd","rxjs","__extends","d","b","__","constructor","TypeError","String","extendStatics","prototype","Object","create","__rest","s","e","t","p","hasOwnProperty","call","indexOf","getOwnPropertySymbols","i","length","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","Promise","reject","fulfilled","step","next","rejected","result","done","then","apply","__generator","body","verb","n","v","op","f","_","y","label","ops","pop","trys","push","sent","g","Symbol","iterator","__values","o","m","__read","r","ar","error","__spreadArray","to","from","pack","arguments","l","Array","slice","concat","__await","__asyncGenerator","a","q","resume","fulfill","settle","shift","asyncIterator","__asyncValues","isFunction","createErrorClass","createImpl","ctorFunc","_super","instance","Error","stack","arrRemove","arr","item","index","splice","isSubscription","Subscription","remove","add","unsubscribe","reportUnhandledError","err","timeoutProvider","setTimeout","onUnhandledError","config","noop","createNotification","kind","errorContext","cb","useDeprecatedSynchronousErrorHandling","isRoot","context","errorThrown","_a","handleUnhandledError","handleStoppedNotification","notification","subscriber","onStoppedNotification","identity","x","pipe","fns","_i","pipeFromArray","piped","input","reduce","prev","fn","getPromiseCtor","promiseCtor","isSubscriber","complete","operate","init","source","lift","liftedSource","createOperatorSubscriber","destination","onNext","onComplete","onError","onFinalize","OperatorSubscriber","refCount","connection","_refCount","refCounter","undefined","sharedConnection","_connection","conn","subscribe","closed","connect","animationFramesFactory","timestampProvider","Observable","provider","performanceTimestampProvider","start","now","id","run","animationFrameProvider","requestAnimationFrame","timestamp","elapsed","cancelAnimationFrame","findAndClearHandle","handle","activeHandles","emptyScheduled","scheduler","schedule","isScheduler","popResultSelector","args","popScheduler","isAsyncIterable","obj","createInvalidObservableTypeError","isIterable","readableStreamLikeToAsyncGenerator","readableStream","readableStreamLikeToAsyncGenerator_1","reader","_b","getReader","read","releaseLock","innerFrom","observable","fromInteropObservable","isArrayLike","fromArrayLike","fromPromise","fromAsyncIterable","fromIterable","obs","array","promise","iterable","e_1","iterable_1","iterable_1_1","e_1_1","return","asyncIterable","process","catch","asyncIterable_1","asyncIterable_1_1","e_2","e_2_1","executeSchedule","parentSubscription","work","delay","repeat","scheduleSubscription","observeOn","subscribeOn","scheduleArray","scheduleIterable","iterator$$1","scheduleAsyncIterable","scheduled","of","throwError","errorOrErrorFactory","errorFactory","observeNotification","observer","_c","isValidDate","Date","isNaN","timeout","schedulerArg","first","each","with","_with","timeoutErrorFactory","asyncScheduler","_d","meta","originalSourceSubscription","timerSubscription","lastValue","seen","startTimer","info","TimeoutError","map","project","mapOneOrManyArgs","isArray","bindCallbackInternals","isNodeStyle","callbackFunc","resultSelector","_this","subject","AsyncSubject","uninitialized","subs","isAsync_1","isComplete_1","results","argsArgArrayOrObject","first_1","isArray$1","keys","getPrototypeOf","objectProto","getKeys","key","createObject","values","combineLatest","observables","combineLatestInit","valueTransform","maybeSchedule","active","remainingFirstValues","_loop_1","hasFirstValue","execute","subscription","mergeInternals","concurrent","onBeforeNext","expand","innerSubScheduler","additionalFinalizer","buffer","isComplete","outerNext","doInnerSub","innerComplete","innerValue","bufferedValue","mergeMap","Infinity","ii","mergeAll","concatAll","defer","observableFactory","fromEvent","target","eventName","options","isEventTarget","eventTargetMethods","methodName","handler","isNodeStyleEventEmitter","nodeEventEmitterMethods","toCommonHandlerRegistry","isJQueryStyleEventEmitter","jqueryMethods","subTarget","addListener","removeListener","on","off","addEventListener","removeEventListener","fromEventPattern","addHandler","removeHandler","retValue","timer","dueTime","intervalOrScheduler","async","intervalDuration","due","interval","period","argsOrArgArray","isArray$2","onErrorResumeNext","sources","nextSources","sourceIndex","subscribeNext","nextSource","innerSubscriber","not","pred","filter","predicate","raceInit","subscriptions","zip","buffers","completed","every","some","EMPTY","audit","durationSelector","hasValue","durationSubscriber","endDuration","cleanupDuration","auditTime","duration","closingNotifier","currentBuffer","bufferCount","bufferSize","startBufferEvery","count","toEmit","buffers_1","buffers_1_1","toEmit_1","toEmit_1_1","e_3","buffers_2","buffers_2_1","e_3_1","bufferTime","bufferTimeSpan","otherArgs","bufferCreationInterval","maxBufferSize","bufferRecords","restartOnEmit","emit","record","startBuffer","record_1","bufferTimeSubscriber","recordsCopy","recordsCopy_1","recordsCopy_1_1","bufferToggle","openings","closingSelector","openValue","closingSubscription","emitBuffer","bufferWhen","closingSubscriber","openBuffer","catchError","selector","innerSub","syncUnsub","handledResult","scanInternals","accumulator","seed","hasSeed","emitOnNext","emitBeforeComplete","hasState","state","toArray","arrReducer","joinAllInternals","joinFn","combineLatestAll","combineLatest$1","combineLatestWith","otherSources","concatMap","concatMapTo","innerObservable","concat$1","concatWith","fromSubscribable","subscribable","DEFAULT_CONFIG$1","connector","total","debounce","debounceTime","emitWhenIdle","targetTime","lastTime","activeTask","defaultIfEmpty","defaultValue","take","ignoreElements","mapTo","delayWhen","delayDurationSelector","subscriptionDelay","dematerialize","distinct","keySelector","flushes","distinctKeys","Set","has","clear","distinctUntilChanged","comparator","defaultCompare","previousKey","currentKey","distinctUntilKeyChanged","compare","throwIfEmpty","defaultErrorFactory","EmptyError","elementAt","ArgumentOutOfRangeError","hasDefaultValue","endWith","exhaustMap","outerValue","exhaustAll","finalize","callback","find","createFind","findIndex","groupBy","elementOrOptions","createGroupedObservable","groupSubject","groupSubscriber","activeGroups","teardownAttempted","groupBySourceSubscriber","element","groups","Map","notify","forEach","handleError","consumer","key_1","group_1","get","set","Subject","grouped","durationSubscriber_1","delete","isEmpty","takeLast","buffer_1","buffer_1_1","last$1","materialize","Notification","createNext","createComplete","createError","max","comparer","mergeMapTo","mergeScan","merge$1","mergeWith","min","multicast","subjectOrSubjectFactory","subjectFactory","ConnectableObservable","onErrorResumeNextWith","pairwise","hasPrev","pluck","properties","currentProp","publish","publishBehavior","initialValue","BehaviorSubject","publishLast","publishReplay","windowTime","selectorOrScheduler","ReplaySubject","raceWith","countOrConfig","soFar","sourceSub","resubscribe","notifier","notifierSubscriber_1","subscribeToSource","repeatWhen","syncResub","completions$","isNotifierComplete","isMainComplete","getCompletionSubject","subscribeForRepeatWhen","retry","configOrCount","resetOnSuccess","subscribeForRetry","resub_1","retryWhen","errors$","subscribeForRetryWhen","sample","sampleTime","scan","sequenceEqual","compareTo","aState","bState","createSubscriber","selfState","otherState","sequenceEqualSubscriber","isEqual","share","resetOnError","resetOnComplete","resetOnRefCountZero","wrapperSource","resetConnection","hasCompleted","hasErrored","cancelReset","reset","resetAndUnsubscribe","dest","handleReset","SafeSubscriber","onSubscriber","shareReplay","configOrBufferSize","single","singleValue","seenValue","SequenceError","NotFoundError","skip","skipLast","skipCount","ring","valueIndex","oldValue","skipUntil","taking","skipSubscriber","skipWhile","startWith","switchMap","innerIndex","outerIndex","switchAll","switchMapTo","switchScan","takeUntil","takeWhile","inclusive","tap","observerOrNext","tapObserver","isUnsub","throttle","leading","trailing","sendValue","throttled","endThrottling","send","cleanupThrottling","throttleTime","duration$","timeInterval","last","TimeInterval","timeoutWith","withObservable","dateTimestampProvider","window","windowBoundaries","windowSubject","asObservable","errorHandler","windowCount","windowSize","startWindowEvery","startEvery","windows","windows_1","windows_1_1","c","window_2","windowTimeSpan","windowCreationInterval","maxWindowSize","windowRecords","restartOnClose","closeWindow","startWindow","window_1","terminate","windowToggle","windowsCopy","windowsCopy_1","windowsCopy_1_1","windowWhen","openWindow","withLatestFrom","inputs","len","otherValues","ready","zipAll","zip$1","zipWith","otherInputs","applyMixins","derivedCtor","baseCtors","baseCtor","propertyKeys","getOwnPropertyNames","j","len2","name_1","getXHRResponse","xhr","responseType","response","JSON","parse","responseText","responseXML","ajaxGet","url","headers","ajax","method","ajaxPost","ajaxDelete","ajaxPut","ajaxPatch","ajaxGetJSON","mapResponse","fromAjax","__assign","crossDomain","withCredentials","queryParams","configuredBody","configuredHeaders","searchParams_1","includes","parts","split","URLSearchParams","toLowerCase","xsrfCookieName","xsrfHeaderName","xsrfCookie","document","cookie","match","RegExp","extractContentTypeAndMaybeSerializeBody","_request","createXHR","XMLHttpRequest","progressSubscriber_1","progressSubscriber","includeDownloadProgress","includeUploadProgress","addErrorEvent","type","AjaxTimeoutError","AjaxError","addProgressEvent_1","direction","event","AjaxResponse","LOADSTART","PROGRESS","LOAD","upload","UPLOAD","DOWNLOAD","emitError_1","status","user","open","password","setRequestHeader","readyState","abort","FormData","toStringCheck","ReadableStream","ArrayBuffer","isView","stringify","name","_toString","setPrototypeOf","__proto__","assign","UnsubscriptionError","UnsubscriptionErrorImpl","errors","message","toString","join","initialTeardown","_finalizers","_parentage","Subscription.prototype.unsubscribe","_parentage_1","_parentage_1_1","initialFinalizer","_finalizers_1","_finalizers_1_1","finalizer","Subscription.prototype.add","teardown","_hasParent","_addParent","Subscription.prototype._hasParent","parent","Subscription.prototype._addParent","_removeParent","Subscription.prototype._removeParent","Subscription.prototype.remove","empty","EMPTY_SUBSCRIPTION","useDeprecatedNextContext","delegate","clearTimeout","COMPLETE_NOTIFICATION","Subscriber","isStopped","EMPTY_OBSERVER","Subscriber.create","Subscriber.prototype.next","_next","Subscriber.prototype.error","_error","Subscriber.prototype.complete","_complete","Subscriber.prototype.unsubscribe","Subscriber.prototype._next","Subscriber.prototype._error","Subscriber.prototype._complete","_bind","Function","bind","ConsumerObserver","partialObserver","ConsumerObserver.prototype.next","ConsumerObserver.prototype.error","ConsumerObserver.prototype.complete","context_1","context_1.unsubscribe","defaultErrorHandler","_subscribe","Observable.prototype.lift","operator","observable$$1","Observable.prototype.subscribe","_trySubscribe","Observable.prototype._trySubscribe","sink","Observable.prototype.forEach","Observable.prototype._subscribe","Observable.prototype.pipe","operations","toPromise","Observable.prototype.toPromise","Observable.create","shouldUnsubscribe","OperatorSubscriber.prototype.unsubscribe","closed_1","_subject","ConnectableObservable.prototype._subscribe","getSubject","ConnectableObservable.prototype.getSubject","_teardown","ConnectableObservable.prototype._teardown","ConnectableObservable.prototype.connect","subject_1","ConnectableObservable.prototype.refCount","performance","request","cancel","DEFAULT_ANIMATION_FRAMES","ObjectUnsubscribedError","ObjectUnsubscribedErrorImpl","currentObservers","observers","hasError","thrownError","Subject.prototype.lift","AnonymousSubject","_throwIfClosed","Subject.prototype._throwIfClosed","Subject.prototype.next","Subject.prototype.error","Subject.prototype.complete","Subject.prototype.unsubscribe","defineProperty","enumerable","configurable","Subject.prototype._trySubscribe","Subject.prototype._subscribe","_checkFinalizedStatuses","_innerSubscribe","Subject.prototype._innerSubscribe","Subject.prototype._checkFinalizedStatuses","Subject.prototype.asObservable","Subject.create","AnonymousSubject.prototype.next","AnonymousSubject.prototype.error","AnonymousSubject.prototype.complete","AnonymousSubject.prototype._subscribe","_value","getValue","BehaviorSubject.prototype._subscribe","BehaviorSubject.prototype.getValue","BehaviorSubject.prototype.next","_bufferSize","_windowTime","_timestampProvider","_buffer","_infiniteTimeWindow","Math","ReplaySubject.prototype.next","_trimBuffer","ReplaySubject.prototype._subscribe","copy","ReplaySubject.prototype._trimBuffer","adjustedBufferSize","_hasValue","_isComplete","AsyncSubject.prototype._checkFinalizedStatuses","AsyncSubject.prototype.next","AsyncSubject.prototype.complete","intervalProvider","setInterval","clearInterval","AsyncAction","pending","AsyncAction.prototype.schedule","recycleAsyncId","requestAsyncId","AsyncAction.prototype.requestAsyncId","_id","flush","AsyncAction.prototype.recycleAsyncId","_scheduler","AsyncAction.prototype.execute","_execute","AsyncAction.prototype._execute","_delay","errored","errorValue","AsyncAction.prototype.unsubscribe","actions","Action","Action.prototype.schedule","nextHandle","resolved","setImmediate","clearImmediate","immediateProvider","AsapAction","AsapAction.prototype.requestAsyncId","_scheduled","AsapAction.prototype.recycleAsyncId","Scheduler","schedulerActionCtor","Scheduler.prototype.schedule","AsyncScheduler","SchedulerAction","_active","AsyncScheduler.prototype.flush","action","asapScheduler","AsapScheduler","AsapScheduler.prototype.flush","flushId","QueueAction","QueueAction.prototype.schedule","QueueAction.prototype.execute","QueueAction.prototype.requestAsyncId","queueScheduler","QueueScheduler","AnimationFrameAction","AnimationFrameAction.prototype.requestAsyncId","AnimationFrameAction.prototype.recycleAsyncId","animationFrameScheduler","AnimationFrameScheduler","AnimationFrameScheduler.prototype.flush","VirtualTimeScheduler","maxFrames","VirtualAction","frame","VirtualTimeScheduler.prototype.flush","frameTimeFactor","VirtualAction.prototype.schedule","Number","isFinite","VirtualAction.prototype.requestAsyncId","sort","sortActions","VirtualAction.prototype.recycleAsyncId","VirtualAction.prototype._execute","VirtualAction.sortActions","NotificationKind","observe","Notification.prototype.observe","do","Notification.prototype.do","nextHandler","completeHandler","accept","Notification.prototype.accept","nextOrObserver","toObservable","Notification.prototype.toObservable","Notification.createNext","Notification.createError","Notification.createComplete","completeNotification","EmptyErrorImpl","ArgumentOutOfRangeErrorImpl","NotFoundErrorImpl","SequenceErrorImpl","TimeoutErrorImpl","DEFAULT_CONFIG","resetOnDisconnect","NEVER","_operators","freeze","combineAll","exhaust","merge","flatMap","partition","partition$1","race","race$1","SubscriptionLog","subscribedFrame","unsubscribedFrame","SubscriptionLoggable","logSubscribedFrame","SubscriptionLoggable.prototype.logSubscribedFrame","logUnsubscribedFrame","SubscriptionLoggable.prototype.logUnsubscribedFrame","subscriptionLogs","oldSubscriptionLog","ColdObservable","messages","scheduleMessages","ColdObservable.prototype.scheduleMessages","messagesLength","HotObservable","HotObservable.prototype._subscribe","setup","HotObservable.prototype.setup","TestScheduler","assertDeepEqual","defaultMaxFrame","hotObservables","coldObservables","flushTests","runMode","createTime","TestScheduler.prototype.createTime","marbles","trim","createColdObservable","TestScheduler.prototype.createColdObservable","parseMarbles","cold","createHotObservable","TestScheduler.prototype.createHotObservable","materializeInnerObservable","TestScheduler.prototype.materializeInnerObservable","outerFrame","expectObservable","TestScheduler.prototype.expectObservable","subscriptionMarbles","actual","flushTest","subscriptionParsed","parseMarblesAsSubscriptions","subscriptionFrame","unsubscriptionFrame","toBe","expected","toEqual","other","expectSubscriptions","TestScheduler.prototype.expectSubscriptions","actualSubscriptionLogs","marblesOrMarblesArray","marblesArray","TestScheduler.prototype.flush","test","TestScheduler.parseMarblesAsSubscriptions","characters","groupStart","nextFrame","advanceFrameBy","parseFloat","durationInMs","unit","this_1","out_i_1","TestScheduler.parseMarbles","materializeInnerObservables","testMessages","subIndex","replace","_loop_2","this_2","out_i_2","createAnimator","TestScheduler.prototype.createAnimator","lastHandle","animate","messages_1","messages_1_1","callbacks","callbacks_1","callbacks_1_1","createDelegates","TestScheduler.prototype.createDelegates","scheduleLookup","scheduledRecordsDue","scheduledRecords","dueImmediates","dueIntervals","firstDueInterval","dueTimeouts","immediate","TestScheduler.prototype.run","prevFrameTimeFactor","prevMaxFrames","animator","delegates","helpers","hot","time","ret","_testing","originalEvent","responseHeaders","allHeaders","getAllResponseHeaders","line","loaded","AjaxErrorImpl","AjaxTimeoutErrorImpl","urlOrConfig","post","put","patch","getJSON","_ajax","DEFAULT_WEBSOCKET_CONFIG","deserializer","data","serializer","WebSocketSubject","urlConfigOrSource","_socket","_config","_output","WebSocketCtor","WebSocket","WebSocketSubject.prototype.lift","sock","_resetState","WebSocketSubject.prototype._resetState","multiplex","WebSocketSubject.prototype.multiplex","subMsg","unsubMsg","messageFilter","self","_connectSocket","WebSocketSubject.prototype._connectSocket","protocol","binaryType","socket","close","onopen","socket.onopen","evt","openObserver","queue","closingObserver","code","reason","WEBSOCKETSUBJECT_INVALID_ERROR_OBJECT","onerror","socket.onerror","onclose","socket.onclose","closeObserver","wasClean","onmessage","socket.onmessage","WebSocketSubject.prototype._subscribe","WebSocketSubject.prototype.unsubscribe","_webSocket","webSocket","fetch$1","_fetch","fromFetch","initWithSelector","controller","AbortController","signal","abortable","outerSignal","aborted","outerSignalHandler_1","perSubscriberInit","fetch","operators","testing","animationFrames","asap","animationFrame","isObservable","lastValueFrom","hasConfig","firstValueFrom","bindCallback","bindNodeCallback","connectable","result.connect","forkJoin","remainingCompletions","remainingEmissions","generate","initialStateOrOptions","condition","iterate","resultSelectorOrScheduler","gen","initialState","iif","trueResult","falseResult","never","pairs","entries","range","end","using","resourceFactory","resource"]}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            /**
 * @license
 * Lodash (Custom Build) <https://lodash.com/>
 * Build: `lodash core -o ./dist/lodash.core.js`
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '4.17.21';

  /** Error message constants. */
  var FUNC_ERROR_TEXT = 'Expected a function';

  /** Used to compose bitmasks for value comparisons. */
  var COMPARE_PARTIAL_FLAG = 1,
      COMPARE_UNORDERED_FLAG = 2;

  /** Used to compose bitmasks for function metadata. */
  var WRAP_BIND_FLAG = 1,
      WRAP_PARTIAL_FLAG = 32;

  /** Used as references for various `Number` constants. */
  var INFINITY = 1 / 0,
      MAX_SAFE_INTEGER = 9007199254740991;

  /** `Object#toString` result references. */
  var argsTag = '[object Arguments]',
      arrayTag = '[object Array]',
      asyncTag = '[object AsyncFunction]',
      boolTag = '[object Boolean]',
      dateTag = '[object Date]',
      errorTag = '[object Error]',
      funcTag = '[object Function]',
      genTag = '[object GeneratorFunction]',
      numberTag = '[object Number]',
      objectTag = '[object Object]',
      proxyTag = '[object Proxy]',
      regexpTag = '[object RegExp]',
      stringTag = '[object String]';

  /** Used to match HTML entities and HTML characters. */
  var reUnescapedHtml = /[&<>"']/g,
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);

  /** Used to detect unsigned integer values. */
  var reIsUint = /^(?:0|[1-9]\d*)$/;

  /** Used to map characters to HTML entities. */
  var htmlEscapes = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  };

  /** Detect free variable `global` from Node.js. */
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;

  /** Detect free variable `self`. */
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;

  /** Used as a reference to the global object. */
  var root = freeGlobal || freeSelf || Function('return this')();

  /** Detect free variable `exports`. */
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;

  /** Detect free variable `module`. */
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;

  /*--------------------------------------------------------------------------*/

  /**
   * Appends the elements of `values` to `array`.
   *
   * @private
   * @param {Array} array The array to modify.
   * @param {Array} values The values to append.
   * @returns {Array} Returns `array`.
   */
  function arrayPush(array, values) {
    array.push.apply(array, values);
    return array;
  }

  /**
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
   * support for iteratee shorthands.
   *
   * @private
   * @param {Array} array The array to inspect.
   * @param {Function} predicate The function invoked per iteration.
   * @param {number} fromIndex The index to search from.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {number} Returns the index of the matched value, else `-1`.
   */
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
    var length = array.length,
        index = fromIndex + (fromRight ? 1 : -1);

    while ((fromRight ? index-- : ++index < length)) {
      if (predicate(array[index], index, array)) {
        return index;
      }
    }
    return -1;
  }

  /**
   * The base implementation of `_.property` without support for deep paths.
   *
   * @private
   * @param {string} key The key of the property to get.
   * @returns {Function} Returns the new accessor function.
   */
  function baseProperty(key) {
    return function(object) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.propertyOf` without support for deep paths.
   *
   * @private
   * @param {Object} object The object to query.
   * @returns {Function} Returns the new accessor function.
   */
  function basePropertyOf(object) {
    return function(key) {
      return object == null ? undefined : object[key];
    };
  }

  /**
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {*} accumulator The initial value.
   * @param {boolean} initAccum Specify using the first or last element of
   *  `collection` as the initial value.
   * @param {Function} eachFunc The function to iterate over `collection`.
   * @returns {*} Returns the accumulated value.
   */
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
    eachFunc(collection, function(value, index, collection) {
      accumulator = initAccum
        ? (initAccum = false, value)
        : iteratee(accumulator, value, index, collection);
    });
    return accumulator;
  }

  /**
   * The base implementation of `_.values` and `_.valuesIn` which creates an
   * array of `object` property values corresponding to the property names
   * of `props`.
   *
   * @private
   * @param {Object} object The object to query.
   * @param {Array} props The property names to get values for.
   * @returns {Object} Returns the array of property values.
   */
  function baseValues(object, props) {
    return baseMap(props, function(key) {
      return object[key];
    });
  }

  /**
   * Used by `_.escape` to convert characters to HTML entities.
   *
   * @private
   * @param {string} chr The matched character to escape.
   * @returns {string} Returns the escaped character.
   */
  var escapeHtmlChar = basePropertyOf(htmlEscapes);

  /**
   * Creates a unary function that invokes `func` with its argument transformed.
   *
   * @private
   * @param {Function} func The function to wrap.
   * @param {Function} transform The argument transform.
   * @returns {Function} Returns the new function.
   */
  function overArg(func, transform) {
    return function(arg) {
      return func(transform(arg));
    };
  }

  /*--------------------------------------------------------------------------*/

  /** Used for built-in method references. */
  var arrayProto = Array.prototype,
      objectProto = Object.prototype;

  /** Used to check objects for own properties. */
  var hasOwnProperty = objectProto.hasOwnProperty;

  /** Used to generate unique IDs. */
  var idCounter = 0;

  /**
   * Used to resolve the
   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
   * of values.
   */
  var nativeObjectToString = objectProto.toString;

  /** Used to restore the original `_` reference in `_.noConflict`. */
  var oldDash = root._;

  /** Built-in value references. */
  var objectCreate = Object.create,
      propertyIsEnumerable = objectProto.propertyIsEnumerable;

  /* Built-in method references for those with the same name as other `lodash` methods. */
  var nativeIsFinite = root.isFinite,
      nativeKeys = overArg(Object.keys, Object),
      nativeMax = Math.max;

  /*------------------------------------------------------------------------*/

  /**
   * Creates a `lodash` object which wraps `value` to enable implicit method
   * chain sequences. Methods that operate on and return arrays, collections,
   * and functions can be chained together. Methods that retrieve a single value
   * or may return a primitive value will automatically end the chain sequence
   * and return the unwrapped value. Otherwise, the value must be unwrapped
   * with `_#value`.
   *
   * Explicit chain sequences, which must be unwrapped with `_#value`, may be
   * enabled using `_.chain`.
   *
   * The execution of chained methods is lazy, that is, it's deferred until
   * `_#value` is implicitly or explicitly called.
   *
   * Lazy evaluation allows several methods to support shortcut fusion.
   * Shortcut fusion is an optimization to merge iteratee calls; this avoids
   * the creation of intermediate arrays and can greatly reduce the number of
   * iteratee executions. Sections of a chain sequence qualify for shortcut
   * fusion if the section is applied to an array and iteratees accept only
   * one argument. The heuristic for whether a section qualifies for shortcut
   * fusion is subject to change.
   *
   * Chaining is supported in custom builds as long as the `_#value` method is
   * directly or indirectly included in the build.
   *
   * In addition to lodash methods, wrappers have `Array` and `String` methods.
   *
   * The wrapper `Array` methods are:
   * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
   *
   * The wrapper `String` methods are:
   * `replace` and `split`
   *
   * The wrapper methods that support shortcut fusion are:
   * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
   * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
   * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
   *
   * The chainable wrapper methods are:
   * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
   * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
   * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
   * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
   * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
   * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
   * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
   * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
   * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
   * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
   * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
   * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
   * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
   * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
   * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
   * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
   * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
   * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
   * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
   * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
   * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
   * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
   * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
   * `zipObject`, `zipObjectDeep`, and `zipWith`
   *
   * The wrapper methods that are **not** chainable by default are:
   * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
   * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
   * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
   * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
   * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
   * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
   * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
   * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
   * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
   * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
   * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
   * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
   * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
   * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
   * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
   * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
   * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
   * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
   * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
   * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
   * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
   * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
   * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
   * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
   * `upperFirst`, `value`, and `words`
   *
   * @name _
   * @constructor
   * @category Seq
   * @param {*} value The value to wrap in a `lodash` instance.
   * @returns {Object} Returns the new `lodash` wrapper instance.
   * @example
   *
   * function square(n) {
   *   return n * n;
   * }
   *
   * var wrapped = _([1, 2, 3]);
   *
   * // Returns an unwrapped value.
   * wrapped.reduce(_.add);
   * // => 6
   *
   * // Returns a wrapped value.
   * var squares = wrapped.map(square);
   *
   * _.isArray(squares);
   * // => false
   *
   * _.isArray(squares.value());
   * // => true
   */
  function lodash(value) {
    return value instanceof LodashWrapper
      ? value
      : new LodashWrapper(value);
  }

  /**
   * The base implementation of `_.create` without support for assigning
   * properties to the created object.
   *
   * @private
   * @param {Object} proto The object to inherit from.
   * @returns {Object} Returns the new object.
   */
  var baseCreate = (function() {
    function object() {}
    return function(proto) {
      if (!isObject(proto)) {
        return {};
      }
      if (objectCreate) {
        return objectCreate(proto);
      }
      object.prototype = proto;
      var result = new object;
      object.prototype = undefined;
      return result;
    };
  }());

  /**
   * The base constructor for creating `lodash` wrapper objects.
   *
   * @private
   * @param {*} value The value to wrap.
   * @param {boolean} [chainAll] Enable explicit method chain sequences.
   */
  function LodashWrapper(value, chainAll) {
    this.__wrapped__ = value;
    this.__actions__ = [];
    this.__chain__ = !!chainAll;
  }

  LodashWrapper.prototype = baseCreate(lodash.prototype);
  LodashWrapper.prototype.constructor = LodashWrapper;

  /*------------------------------------------------------------------------*/

  /**
   * Assigns `value` to `key` of `object` if the existing value is not equivalent
   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
   * for equality comparisons.
   *
   * @private
   * @param {Object} object The object to modify.
   * @param {string} key The key of the property to assign.
   * @param {*} value The value to assign.
   */
  function assignValue(object, key, value) {
    var objValue = object[key];
    if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
        (value === undefined && !(key in object))) {
      baseAssignValue(object, key, value);
    }
  }

  /**
   * The base implementation of `assignValue` and `assignMergeValue` without
   * value checks.
   *
   * @private
   * @param {Object} object The object to modify.
   * @param {string} key The key of the property to assign.
   * @param {*} value The value to assign.
   */
  function baseAssignValue(object, key, value) {
    object[key] = value;
  }

  /**
   * The base implementation of `_.delay` and `_.defer` which accepts `args`
   * to provide to `func`.
   *
   * @private
   * @param {Function} func The function to delay.
   * @param {number} wait The number of milliseconds to delay invocation.
   * @param {Array} args The arguments to provide to `func`.
   * @returns {number|Object} Returns the timer id or timeout object.
   */
  function baseDelay(func, wait, args) {
    if (typeof func != 'function') {
      throw new TypeError(FUNC_ERROR_TEXT);
    }
    return setTimeout(function() { func.apply(undefined, args); }, wait);
  }

  /**
   * The base implementation of `_.forEach` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array|Object} Returns `collection`.
   */
  var baseEach = createBaseEach(baseForOwn);

  /**
   * The base implementation of `_.every` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
   *  else `false`
   */
  function baseEvery(collection, predicate) {
    var result = true;
    baseEach(collection, function(value, index, collection) {
      result = !!predicate(value, index, collection);
      return result;
    });
    return result;
  }

  /**
   * The base implementation of methods like `_.max` and `_.min` which accepts a
   * `comparator` to determine the extremum value.
   *
   * @private
   * @param {Array} array The array to iterate over.
   * @param {Function} iteratee The iteratee invoked per iteration.
   * @param {Function} comparator The comparator used to compare values.
   * @returns {*} Returns the extremum value.
   */
  function baseExtremum(array, iteratee, comparator) {
    var index = -1,
        length = array.length;

    while (++index < length) {
      var value = array[index],
          current = iteratee(value);

      if (current != null && (computed === undefined
            ? (current === current && !false)
            : comparator(current, computed)
          )) {
        var computed = current,
            result = value;
      }
    }
    return result;
  }

  /**
   * The base implementation of `_.filter` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {Array} Returns the new filtered array.
   */
  function baseFilter(collection, predicate) {
    var result = [];
    baseEach(collection, function(value, index, collection) {
      if (predicate(value, index, collection)) {
        result.push(value);
      }
    });
    return result;
  }

  /**
   * The base implementation of `_.flatten` with support for restricting flattening.
   *
   * @private
   * @param {Array} array The array to flatten.
   * @param {number} depth The maximum recursion depth.
   * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
   * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
   * @param {Array} [result=[]] The initial result value.
   * @returns {Array} Returns the new flattened array.
   */
  function baseFlatten(array, depth, predicate, isStrict, result) {
    var index = -1,
        length = array.length;

    predicate || (predicate = isFlattenable);
    result || (result = []);

    while (++index < length) {
      var value = array[index];
      if (depth > 0 && predicate(value)) {
        if (depth > 1) {
          // Recursively flatten arrays (susceptible to call stack limits).
          baseFlatten(value, depth - 1, predicate, isStrict, result);
        } else {
          arrayPush(result, value);
        }
      } else if (!isStrict) {
        result[result.length] = value;
      }
    }
    return result;
  }

  /**
   * The base implementation of `baseForOwn` which iterates over `object`
   * properties returned by `keysFunc` and invokes `iteratee` for each property.
   * Iteratee functions may exit iteration early by explicitly returning `false`.
   *
   * @private
   * @param {Object} object The object to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @param {Function} keysFunc The function to get the keys of `object`.
   * @returns {Object} Returns `object`.
   */
  var baseFor = createBaseFor();

  /**
   * The base implementation of `_.forOwn` without support for iteratee shorthands.
   *
   * @private
   * @param {Object} object The object to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Object} Returns `object`.
   */
  function baseForOwn(object, iteratee) {
    return object && baseFor(object, iteratee, keys);
  }

  /**
   * The base implementation of `_.functions` which creates an array of
   * `object` function property names filtered from `props`.
   *
   * @private
   * @param {Object} object The object to inspect.
   * @param {Array} props The property names to filter.
   * @returns {Array} Returns the function names.
   */
  function baseFunctions(object, props) {
    return baseFilter(props, function(key) {
      return isFunction(object[key]);
    });
  }

  /**
   * The base implementation of `getTag` without fallbacks for buggy environments.
   *
   * @private
   * @param {*} value The value to query.
   * @returns {string} Returns the `toStringTag`.
   */
  function baseGetTag(value) {
    return objectToString(value);
  }

  /**
   * The base implementation of `_.gt` which doesn't coerce arguments.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if `value` is greater than `other`,
   *  else `false`.
   */
  function baseGt(value, other) {
    return value > other;
  }

  /**
   * The base implementation of `_.isArguments`.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is an `arguments` object,
   */
  var baseIsArguments = noop;

  /**
   * The base implementation of `_.isDate` without Node.js optimizations.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
   */
  function baseIsDate(value) {
    return isObjectLike(value) && baseGetTag(value) == dateTag;
  }

  /**
   * The base implementation of `_.isEqual` which supports partial comparisons
   * and tracks traversed objects.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @param {boolean} bitmask The bitmask flags.
   *  1 - Unordered comparison
   *  2 - Partial comparison
   * @param {Function} [customizer] The function to customize comparisons.
   * @param {Object} [stack] Tracks traversed `value` and `other` objects.
   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
   */
  function baseIsEqual(value, other, bitmask, customizer, stack) {
    if (value === other) {
      return true;
    }
    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
      return value !== value && other !== other;
    }
    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
  }

  /**
   * A specialized version of `baseIsEqual` for arrays and objects which performs
   * deep comparisons and tracks traversed objects enabling objects with circular
   * references to be compared.
   *
   * @private
   * @param {Object} object The object to compare.
   * @param {Object} other The other object to compare.
   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
   * @param {Function} customizer The function to customize comparisons.
   * @param {Function} equalFunc The function to determine equivalents of values.
   * @param {Object} [stack] Tracks traversed `object` and `other` objects.
   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
   */
  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
    var objIsArr = isArray(object),
        othIsArr = isArray(other),
        objTag = objIsArr ? arrayTag : baseGetTag(object),
        othTag = othIsArr ? arrayTag : baseGetTag(other);

    objTag = objTag == argsTag ? objectTag : objTag;
    othTag = othTag == argsTag ? objectTag : othTag;

    var objIsObj = objTag == objectTag,
        othIsObj = othTag == objectTag,
        isSameTag = objTag == othTag;

    stack || (stack = []);
    var objStack = find(stack, function(entry) {
      return entry[0] == object;
    });
    var othStack = find(stack, function(entry) {
      return entry[0] == other;
    });
    if (objStack && othStack) {
      return objStack[1] == other;
    }
    stack.push([object, other]);
    stack.push([other, object]);
    if (isSameTag && !objIsObj) {
      var result = (objIsArr)
        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
      stack.pop();
      return result;
    }
    if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
      var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
          othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');

      if (objIsWrapped || othIsWrapped) {
        var objUnwrapped = objIsWrapped ? object.value() : object,
            othUnwrapped = othIsWrapped ? other.value() : other;

        var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
        stack.pop();
        return result;
      }
    }
    if (!isSameTag) {
      return false;
    }
    var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
    stack.pop();
    return result;
  }

  /**
   * The base implementation of `_.isRegExp` without Node.js optimizations.
   *
   * @private
   * @param {*} value The value to check.
   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
   */
  function baseIsRegExp(value) {
    return isObjectLike(value) && baseGetTag(value) == regexpTag;
  }

  /**
   * The base implementation of `_.iteratee`.
   *
   * @private
   * @param {*} [value=_.identity] The value to convert to an iteratee.
   * @returns {Function} Returns the iteratee.
   */
  function baseIteratee(func) {
    if (typeof func == 'function') {
      return func;
    }
    if (func == null) {
      return identity;
    }
    return (typeof func == 'object' ? baseMatches : baseProperty)(func);
  }

  /**
   * The base implementation of `_.lt` which doesn't coerce arguments.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {boolean} Returns `true` if `value` is less than `other`,
   *  else `false`.
   */
  function baseLt(value, other) {
    return value < other;
  }

  /**
   * The base implementation of `_.map` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} iteratee The function invoked per iteration.
   * @returns {Array} Returns the new mapped array.
   */
  function baseMap(collection, iteratee) {
    var index = -1,
        result = isArrayLike(collection) ? Array(collection.length) : [];

    baseEach(collection, function(value, key, collection) {
      result[++index] = iteratee(value, key, collection);
    });
    return result;
  }

  /**
   * The base implementation of `_.matches` which doesn't clone `source`.
   *
   * @private
   * @param {Object} source The object of property values to match.
   * @returns {Function} Returns the new spec function.
   */
  function baseMatches(source) {
    var props = nativeKeys(source);
    return function(object) {
      var length = props.length;
      if (object == null) {
        return !length;
      }
      object = Object(object);
      while (length--) {
        var key = props[length];
        if (!(key in object &&
              baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
            )) {
          return false;
        }
      }
      return true;
    };
  }

  /**
   * The base implementation of `_.pick` without support for individual
   * property identifiers.
   *
   * @private
   * @param {Object} object The source object.
   * @param {string[]} paths The property paths to pick.
   * @returns {Object} Returns the new object.
   */
  function basePick(object, props) {
    object = Object(object);
    return reduce(props, function(result, key) {
      if (key in object) {
        result[key] = object[key];
      }
      return result;
    }, {});
  }

  /**
   * The base implementation of `_.rest` which doesn't validate or coerce arguments.
   *
   * @private
   * @param {Function} func The function to apply a rest parameter to.
   * @param {number} [start=func.length-1] The start position of the rest parameter.
   * @returns {Function} Returns the new function.
   */
  function baseRest(func, start) {
    return setToString(overRest(func, start, identity), func + '');
  }

  /**
   * The base implementation of `_.slice` without an iteratee call guard.
   *
   * @private
   * @param {Array} array The array to slice.
   * @param {number} [start=0] The start position.
   * @param {number} [end=array.length] The end position.
   * @returns {Array} Returns the slice of `array`.
   */
  function baseSlice(array, start, end) {
    var index = -1,
        length = array.length;

    if (start < 0) {
      start = -start > length ? 0 : (length + start);
    }
    end = end > length ? length : end;
    if (end < 0) {
      end += length;
    }
    length = start > end ? 0 : ((end - start) >>> 0);
    start >>>= 0;

    var result = Array(length);
    while (++index < length) {
      result[index] = array[index + start];
    }
    return result;
  }

  /**
   * Copies the values of `source` to `array`.
   *
   * @private
   * @param {Array} source The array to copy values from.
   * @param {Array} [array=[]] The array to copy values to.
   * @returns {Array} Returns `array`.
   */
  function copyArray(source) {
    return baseSlice(source, 0, source.length);
  }

  /**
   * The base implementation of `_.some` without support for iteratee shorthands.
   *
   * @private
   * @param {Array|Object} collection The collection to iterate over.
   * @param {Function} predicate The function invoked per iteration.
   * @returns {boolean} Returns `true` if any element passes the predicate check,
   *  else `false`.
   */
  function baseSome(collection, predicate) {
    var result;

    baseEach(collection, function(value, index, collection) {
      result = predicate(value, index, collection);
      return !result;
    });
    return !!result;
  }

  /**
   * The base implementation of `wrapperValue` which returns the result of
   * performing a sequence of actions on the unwrapped `value`, where each
   * successive action is supplied the return value of the previous.
   *
   * @private
   * @param {*} value The unwrapped value.
   * @param {Array} actions Actions to perform to resolve the unwrapped value.
   * @returns {*} Returns the resolved value.
   */
  function baseWrapperValue(value, actions) {
    var result = value;
    return reduce(actions, function(result, action) {
      return action.func.apply(action.thisArg, arrayPush([result], action.args));
    }, result);
  }

  /**
   * Compares values to sort them in ascending order.
   *
   * @private
   * @param {*} value The value to compare.
   * @param {*} other The other value to compare.
   * @returns {number} Returns the sort order indicator for `value`.
   */
  function compareAscending(value, other) {
    if (value !== other) {
      var valIsDefined = value !== undefined,
          valIsNull = value === null,
          valIsReflexive = value === value,
          valIsSymbol = false;

      var othIsDefined = other !== undefined,
          othIsNull = other === null,
          othIsReflexive = other === other,
          othIsSymbol = false;

      if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
          (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
          (valIsNull && othIsDefined && othIsReflexive) ||
          (!valIsDefined && othIsReflexive) ||
          !valIsReflexive) {
        return 1;
      }
      if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
          (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
          (othIsNull && valIsDefined && valIsReflexive) ||
          (!othIsDefined && valIsReflexive) ||
          !othIsReflexive) {
        return -1;
      }
    }
    return 0;
  }

  /**
   * Copies properties of `source` to `object`.
   *
   * @private
   * @param {Object} source The object to copy properties from.
   * @param {Array} props The property identifiers to copy.
   * @param {Object} [object={}] The object to copy properties to.
   * @param {Function} [customizer] The function to customize copied values.
   * @returns {Object} Returns `object`.
   */
  function copyObject(source, props, object, customizer) {
    var isNew = !object;
    object || (object = {});

    var index = -1,
        length = props.length;

    while (++index < length) {
      var key = props[index];

      var newValue = customizer
        ? customizer(object[key], source[key], key, object, source)
        : undefined;

      if (newValue === undefined) {
        newValue = source[key];
      }
      if (isNew) {
        baseAssignValue(object, key, newValue);
      } else {
        assignValue(object, key, newValue);
      }
    }
    return object;
  }

  /**
   * Creates a function like `_.assign`.
   *
   * @private
   * @param {Function} assigner The function to assign values.
   * @returns {Function} Returns the new assigner function.
   */
  function createAssigner(assigner) {
    return baseRest(function(object, sources) {
      var index = -1,
          length = sources.length,
          customizer = length > 1 ? sources[length - 1] : undefined;

      customizer = (assigner.length > 3 && typeof customizer == 'function')
        ? (length--, customizer)
        : undefined;

      object = Object(object);
      while (++index < length) {
        var source = sources[index];
        if (source) {
          assigner(object, source, index, customizer);
        }
      }
      return object;
    });
  }

  /**
   * Creates a `baseEach` or `baseEachRight` function.
   *
   * @private
   * @param {Function} eachFunc The function to iterate over a collection.
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {Function} Returns the new base function.
   */
  function createBaseEach(eachFunc, fromRight) {
    return function(collection, iteratee) {
      if (collection == null) {
        return collection;
      }
      if (!isArrayLike(collection)) {
        return eachFunc(collection, iteratee);
      }
      var length = collection.length,
          index = fromRight ? length : -1,
          iterable = Object(collection);

      while ((fromRight ? index-- : ++index < length)) {
        if (iteratee(iterable[index], index, iterable) === false) {
          break;
        }
      }
      return collection;
    };
  }

  /**
   * Creates a base function for methods like `_.forIn` and `_.forOwn`.
   *
   * @private
   * @param {boolean} [fromRight] Specify iterating from right to left.
   * @returns {Function} Returns the new base function.
   */
  function createBaseFor(fromRight) {
    return function(object, iteratee, keysFunc) {
      var index = -1,
          iterable = Object(object),
          props = keysFunc(object),
          length = props.length;

      while (length--) {
        var key = props[fromRight ? length : ++index];
        if (iteratee(iterable[key], key, iterable) === false) {
          break;
        }
      }
      return object;
    };
  }

  /**
   * Creates a function that produces an instance of `Ctor` regardless of
   * whether it was invoked as part of a `new` expression or by `call` or `apply`.
   *
   * @private
   * @param {Function} Ctor The constructor to wrap.
   * @returns {F# Copyright (c) 2012 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import ntpath
import os
import posixpath
import re
import subprocess
import sys

from collections import OrderedDict

import gyp.common
import gyp.easy_xml as easy_xml
import gyp.generator.ninja as ninja_generator
import gyp.MSVSNew as MSVSNew
import gyp.MSVSProject as MSVSProject
import gyp.MSVSSettings as MSVSSettings
import gyp.MSVSToolFile as MSVSToolFile
import gyp.MSVSUserFile as MSVSUserFile
import gyp.MSVSUtil as MSVSUtil
import gyp.MSVSVersion as MSVSVersion
from gyp.common import GypError
from gyp.common import OrderedSet


# Regular expression for validating Visual Studio GUIDs.  If the GUID
# contains lowercase hex letters, MSVS will be fine. However,
# IncrediBuild BuildConsole will parse the solution file, but then
# silently skip building the target causing hard to track down errors.
# Note that this only happens with the BuildConsole, and does not occur
# if IncrediBuild is executed from inside Visual Studio.  This regex
# validates that the string looks like a GUID with all uppercase hex
# letters.
VALID_MSVS_GUID_CHARS = re.compile(r"^[A-F0-9\-]+$")

generator_supports_multiple_toolsets = gyp.common.CrossCompileRequested()

generator_default_variables = {
    "DRIVER_PREFIX": "",
    "DRIVER_SUFFIX": ".sys",
    "EXECUTABLE_PREFIX": "",
    "EXECUTABLE_SUFFIX": ".exe",
    "STATIC_LIB_PREFIX": "",
    "SHARED_LIB_PREFIX": "",
    "STATIC_LIB_SUFFIX": ".lib",
    "SHARED_LIB_SUFFIX": ".dll",
    "INTERMEDIATE_DIR": "$(IntDir)",
    "SHARED_INTERMEDIATE_DIR": "$(OutDir)/obj/global_intermediate",
    "OS": "win",
    "PRODUCT_DIR": "$(OutDir)",
    "LIB_DIR": "$(OutDir)lib",
    "RULE_INPUT_ROOT": "$(InputName)",
    "RULE_INPUT_DIRNAME": "$(InputDir)",
    "RULE_INPUT_EXT": "$(InputExt)",
    "RULE_INPUT_NAME": "$(InputFileName)",
    "RULE_INPUT_PATH": "$(InputPath)",
    "CONFIGURATION_NAME": "$(ConfigurationName)",
}


# The msvs specific sections that hold paths
generator_additional_path_sections = [
    "msvs_cygwin_dirs",
    "msvs_props",
]


generator_additional_non_configuration_keys = [
    "msvs_cygwin_dirs",
    "msvs_cygwin_shell",
    "msvs_large_pdb",
    "msvs_shard",
    "msvs_external_builder",
    "msvs_external_builder_out_dir",
    "msvs_external_builder_build_cmd",
    "msvs_external_builder_clean_cmd",
    "msvs_external_builder_clcompile_cmd",
    "msvs_enable_winrt",
    "msvs_requires_importlibrary",
    "msvs_enable_winphone",
    "msvs_application_type_revision",
    "msvs_target_platform_version",
    "msvs_target_platform_minversion",
]

generator_filelist_paths = None

# List of precompiled header related keys.
precomp_keys = [
    "msvs_precompiled_header",
    "msvs_precompiled_source",
]


cached_username = None


cached_domain = None


# TODO(gspencer): Switch the os.environ calls to be
# win32api.GetDomainName() and win32api.GetUserName() once the
# python version in depot_tools has been updated to work on Vista
# 64-bit.
def _GetDomainAndUserName():
    if sys.platform not in ("win32", "cygwin"):
        return ("DOMAIN", "USERNAME")
    global cached_username
    global cached_domain
    if not cached_domain or not cached_username:
        domain = os.environ.get("USERDOMAIN")
        username = os.environ.get("USERNAME")
        if not domain or not username:
            call = subprocess.Popen(
                ["net", "config", "Workstation"], stdout=subprocess.PIPE
            )
            config = call.communicate()[0].decode("utf-8")
            username_re = re.compile(r"^User name\s+(\S+)", re.MULTILINE)
            username_match = username_re.search(config)
            if username_match:
                username = username_match.group(1)
            domain_re = re.compile(r"^Logon domain\s+(\S+)", re.MULTILINE)
            domain_match = domain_re.search(config)
            if domain_match:
                domain = domain_match.group(1)
        cached_domain = domain
        cached_username = username
    return (cached_domain, cached_username)


fixpath_prefix = None


def _NormalizedSource(source):
    """Normalize the path.

  But not if that gets rid of a variable, as this may expand to something
  larger than one directory.

  Arguments:
      source: The path to be normalize.d

  Returns:
      The normalized path.
  """
    normalized = os.path.normpath(source)
    if source.count("$") == normalized.count("$"):
        source = normalized
    return source


def _FixPath(path, separator="\\"):
    """Convert paths to a form that will make sense in a vcproj file.

  Arguments:
    path: The path to convert, may contain / etc.
  Returns:
    The path with all slashes made into backslashes.
  """
    if (
        fixpath_prefix
        and path
        and not os.path.isabs(path)
        and path[0] != "$"
        and not _IsWindowsAbsPath(path)
    ):
        path = os.path.join(fixpath_prefix, path)
    if separator == "\\":
        path = path.replace("/", "\\")
    path = _NormalizedSource(path)
    if separator == "/":
        path = path.replace("\\", "/")
    if path and path[-1] == separator:
        path = path[:-1]
    return path


def _IsWindowsAbsPath(path):
    """
  On Cygwin systems Python needs a little help determining if a path
  is an absolute Windows path or not, so that
  it does not treat those as relative, which results in bad paths like:
  '..\\C:\\<some path>\\some_source_code_file.cc'
  """
    return path.startswith("c:") or path.startswith("C:")


def _FixPaths(paths, separator="\\"):
    """Fix each of the paths of the list."""
    return [_FixPath(i, separator) for i in paths]


def _ConvertSourcesToFilterHierarchy(
    sources, prefix=None, excluded=None, list_excluded=True, msvs_version=None
):
    """Converts a list split source file paths into a vcproj folder hierarchy.

  Arguments:
    sources: A list of source file paths split.
    prefix: A list of source file path layers meant to apply to each of sources.
    excluded: A set of excluded files.
    msvs_version: A MSVSVersion object.

  Returns:
    A hierarchy of filenames and MSVSProject.Filter objects that matches the
    layout of the source tree.
    For example:
    _ConvertSourcesToFilterHierarchy([['a', 'bob1.c'], ['b', 'bob2.c']],
                                     prefix=['joe'])
    -->
    [MSVSProject.Filter('a', contents=['joe\\a\\bob1.c']),
     MSVSProject.Filter('b', contents=['joe\\b\\bob2.c'])]
  """
    if not prefix:
        prefix = []
    result = []
    excluded_result = []
    folders = OrderedDict()
    # Gather files into the final result, excluded, or folders.
    for s in sources:
        if len(s) == 1:
            filename = _NormalizedSource("\\".join(prefix + s))
            if filename in excluded:
                excluded_result.append(filename)
            else:
                result.append(filename)
        elif msvs_version and not msvs_version.UsesVcxproj():
            # For MSVS 2008 and earlier, we need to process all files before walking
            # the sub folders.
            if not folders.get(s[0]):
                folders[s[0]] = []
            folders[s[0]].append(s[1:])
        else:
            contents = _ConvertSourcesToFilterHierarchy(
                [s[1:]],
                prefix + [s[0]],
                excluded=excluded,
                list_excluded=list_excluded,
                msvs_version=msvs_version,
            )
            contents = MSVSProject.Filter(s[0], contents=contents)
            result.append(contents)
    # Add a folder for excluded files.
    if excluded_result and list_excluded:
        excluded_folder = MSVSProject.Filter(
            "_excluded_files", contents=excluded_result
        )
        result.append(excluded_folder)

    if msvs_version and msvs_version.UsesVcxproj():
        return result

    # Populate all the folders.
    for f in folders:
        contents = _ConvertSourcesToFilterHierarchy(
            folders[f],
            prefix=prefix + [f],
            excluded=excluded,
            list_excluded=list_excluded,
            msvs_version=msvs_version,
        )
        contents = MSVSProject.Filter(f, contents=contents)
        result.append(contents)
    return result


def _ToolAppend(tools, tool_name, setting, value, only_if_unset=False):
    if not value:
        return
    _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset)


def _ToolSetOrAppend(tools, tool_name, setting, value, only_if_unset=False):
    # TODO(bradnelson): ugly hack, fix this more generally!!!
    if "Directories" in setting or "Dependencies" in setting:
        if type(value) == str:
            value = value.replace("/", "\\")
        else:
            value = [i.replace("/", "\\") for i in value]
    if not tools.get(tool_name):
        tools[tool_name] = {}
    tool = tools[tool_name]
    if setting == "CompileAsWinRT":
        return
    if tool.get(setting):
        if only_if_unset:
            return
        if type(tool[setting]) == list and type(value) == list:
            tool[setting] += value
        else:
            raise TypeError(
                'Appending "%s" to a non-list setting "%s" for tool "%s" is '
                "not allowed, previous value: %s"
                % (value, setting, tool_name, str(tool[setting]))
            )
    else:
        tool[setting] = value


def _ConfigTargetVersion(config_data):
    return config_data.get("msvs_target_version", "Windows7")


def _ConfigPlatform(config_data):
    return config_data.get("msvs_configuration_platform", "Win32")


def _ConfigBaseName(config_name, platform_name):
    if config_name.endswith("_" + platform_name):
        return config_name[0 : -len(platform_name) - 1]
    else:
        return config_name


def _ConfigFullName(config_name, config_data):
    platform_name = _ConfigPlatform(config_data)
    return f"{_ConfigBaseName(config_name, platform_name)}|{platform_name}"


def _ConfigWindowsTargetPlatformVersion(config_data, version):
    target_ver = config_data.get("msvs_windows_target_platform_version")
    if target_ver and re.match(r"^\d+", target_ver):
        return target_ver
    config_ver = config_data.get("msvs_windows_sdk_version")
    vers = [config_ver] if config_ver else version.compatible_sdks
    for ver in vers:
        for key in [
            r"HKLM\Software\Microsoft\Microsoft SDKs\Windows\%s",
            r"HKLM\Software\Wow6432Node\Microsoft\Microsoft SDKs\Windows\%s",
        ]:
            sdk_dir = MSVSVersion._RegistryGetValue(key % ver, "InstallationFolder")
            if not sdk_dir:
                continue
            version = MSVSVersion._RegistryGetValue(key % ver, "ProductVersion") or ""
            # Find a matching entry in sdk_dir\include.
            expected_sdk_dir = r"%s\include" % sdk_dir
            names = sorted(
                (
                    x
                    for x in (
                        os.listdir(expected_sdk_dir)
                        if os.path.isdir(expected_sdk_dir)
                        else []
                    )
                    if x.startswith(version)
                ),
                reverse=True,
            )
            if names:
                return names[0]
            else:
                print(
                    "Warning: No include files found for detected "
                    "Windows SDK version %s" % (version),
                    file=sys.stdout,
                )


def _BuildCommandLineForRuleRaw(
    spec, cmd, cygwin_shell, has_input_path, quote_cmd, do_setup_env
):

    if [x for x in cmd if "$(InputDir)" in x]:
        input_dir_preamble = (
            "set INPUTDIR=$(InputDir)\n"
            "if NOT DEFINED INPUTDIR set INPUTDIR=.\\\n"
            "set INPUTDIR=%INPUTDIR:~0,-1%\n"
        )
    else:
        input_dir_preamble = ""

    if cygwin_shell:
        # Find path to cygwin.
        cygwin_dir = _FixPath(spec.get("msvs_cygwin_dirs", ["."])[0])
        # Prepare command.
        direct_cmd = cmd
        direct_cmd = [
            i.replace("$(IntDir)", '`cygpath -m "${INTDIR}"`') for i in direct_cmd
        ]
        direct_cmd = [
            i.replace("$(OutDir)", '`cygpath -m "${OUTDIR}"`') for i in direct_cmd
        ]
        direct_cmd = [
            i.replace("$(InputDir)", '`cygpath -m "${INPUTDIR}"`') for i in direct_cmd
        ]
        if has_input_path:
            direct_cmd = [
                i.replace("$(InputPath)", '`cygpath -m "${INPUTPATH}"`')
                for i in direct_cmd
            ]
        direct_cmd = ['\\"%s\\"' % i.replace('"', '\\\\\\"') for i in direct_cmd]
        # direct_cmd = gyp.common.EncodePOSIXShellList(direct_cmd)
        direct_cmd = " ".join(direct_cmd)
        # TODO(quote):  regularize quoting path names throughout the module
        cmd = ""
        if do_setup_env:
            cmd += 'call "$(ProjectDir)%(cygwin_dir)s\\setup_env.bat" && '
        cmd += "set CYGWIN=nontsec&& "
        if direct_cmd.find("NUMBER_OF_PROCESSORS") >= 0:
            cmd += "set /a NUMBER_OF_PROCESSORS_PLUS_1=%%NUMBER_OF_PROCESSORS%%+1&& "
        if direct_cmd.find("INTDIR") >= 0:
            cmd += "set INTDIR=$(IntDir)&& "
        if direct_cmd.find("OUTDIR") >= 0:
            cmd += "set OUTDIR=$(OutDir)&& "
        if has_input_path and direct_cmd.find("INPUTPATH") >= 0:
            cmd += "set INPUTPATH=$(InputPath) && "
        cmd += 'bash -c "%(cmd)s"'
        cmd = cmd % {"cygwin_dir": cygwin_dir, "cmd": direct_cmd}
        return input_dir_preamble + cmd
    else:
        # Convert cat --> type to mimic unix.
        command = ["type"] if cmd[0] == "cat" else [cmd[0].replace("/", "\\")]
        # Add call before command to ensure that commands can be tied together one
        # after the other without aborting in Incredibuild, since IB makes a bat
        # file out of the raw command string, and some commands (like python) are
        # actually batch files themselves.
        command.insert(0, "call")
        # Fix the paths
        # TODO(quote): This is a really ugly heuristic, and will miss path fixing
        #              for arguments like "--arg=path", arg=path, or "/opt:path".
        # If the argument starts with a slash or dash, or contains an equal sign,
        # it's probably a command line switch.
        # Return the path with forward slashes because the command using it might
        # not support backslashes.
        arguments = [
            i if (i[:1] in "/-" or "=" in i) else _FixPath(i, "/")
            for i in cmd[1:]
        ]
        arguments = [i.replace("$(InputDir)", "%INPUTDIR%") for i in arguments]
        arguments = [MSVSSettings.FixVCMacroSlashes(i) for i in arguments]
        if quote_cmd:
            # Support a mode for using cmd directly.
            # Convert any paths to native form (first element is used directly).
            # TODO(quote):  regularize quoting path names throughout the module
            command[1] = '"%s"' % command[1]
            arguments = ['"%s"' % i for i in arguments]
        # Collapse into a single command.
        return input_dir_preamble + " ".join(command + arguments)


def _BuildCommandLineForRule(spec, rule, has_input_path, do_setup_env):
    # Currently this weird argument munging is used to duplicate the way a
    # python script would need to be run as part of the chrome tree.
    # Eventually we should add some sort of rule_default option to set this
    # per project. For now the behavior chrome needs is the default.
    mcs = rule.get("msvs_cygwin_shell")
    if mcs is None:
        mcs = int(spec.get("msvs_cygwin_shell", 1))
    elif isinstance(mcs, str):
        mcs = int(mcs)
    quote_cmd = int(rule.get("msvs_quote_cmd", 1))
    return _BuildCommandLineForRuleRaw(
        spec, rule["action"], mcs, has_input_path, quote_cmd, do_setup_env=do_setup_env
    )


def _AddActionStep(actions_dict, inputs, outputs, description, command):
    """Merge action into an existing list of actions.

  Care must be taken so that actions which have overlapping inputs either don't
  get assigned to the same input, or get collapsed into one.

  Arguments:
    actions_dict: dictionary keyed on input name, which maps to a list of
      dicts describing the actions attached to that input file.
    inputs: list of inputs
    outputs: list of outputs
    description: description of the action
    command: command line to execute
  """
    # Require there to be at least one input (call sites will ensure this).
    assert inputs

    action = {
        "inputs": inputs,
        "outputs": outputs,
        "description": description,
        "command": command,
    }

    # Pick where to stick this action.
    # While less than optimal in terms of build time, attach them to the first
    # input for now.
    chosen_input = inputs[0]

    # Add it there.
    if chosen_input not in actions_dict:
        actions_dict[chosen_input] = []
    actions_dict[chosen_input].append(action)


def _AddCustomBuildToolForMSVS(
    p, spec, primary_input, inputs, outputs, description, cmd
):
    """Add a custom build tool to execute something.

  Arguments:
    p: the target project
    spec: the target project dict
    primary_input: input file to attach the build tool to
    inputs: list of inputs
    outputs: list of outputs
    description: description of the action
    cmd: command line to execute
  """
    inputs = _FixPaths(inputs)
    outputs = _FixPaths(outputs)
    tool = MSVSProject.Tool(
        "VCCustomBuildTool",
        {
            "Description": description,
            "AdditionalDependencies": ";".join(inputs),
            "Outputs": ";".join(outputs),
            "CommandLine": cmd,
        },
    )
    # Add to the properties of primary input for each config.
    for config_name, c_data in spec["configurations"].items():
        p.AddFileConfig(
            _FixPath(primary_input), _ConfigFullName(config_name, c_data), tools=[tool]
        )


def _AddAccumulatedActionsToMSVS(p, spec, actions_dict):
    """Add actions accumulated into an actions_dict, merging as needed.

  Arguments:
    p: the target project
    spec: the target project dict
    actions_dict: dictionary keyed on input name, which maps to a list of
        dicts describing the actions attached to that input file.
  """
    for primary_input in actions_dict:
        inputs = OrderedSet()
        outputs = OrderedSet()
        descriptions = []
        commands = []
        for action in actions_dict[primary_input]:
            inputs.update(OrderedSet(action["inputs"]))
            outputs.update(OrderedSet(action["outputs"]))
            descriptions.append(action["description"])
            commands.append(action["command"])
        # Add the custom build step for one input file.
        description = ", and also ".join(descriptions)
        command = "\r\n".join(commands)
        _AddCustomBuildToolForMSVS(
            p,
            spec,
            primary_input=primary_input,
            inputs=inputs,
            outputs=outputs,
            description=description,
            cmd=command,
        )


def _RuleExpandPath(path, input_file):
    """Given the input file to which a rule applied, string substitute a path.

  Arguments:
    path: a path to string expand
    input_file: the file to which the rule applied.
  Returns:
    The string substituted path.
  """
    path = path.replace(
        "$(InputName)", os.path.splitext(os.path.split(input_file)[1])[0]
    )
    path = path.replace("$(InputDir)", os.path.dirname(input_file))
    path = path.replace(
        "$(InputExt)", os.path.splitext(os.path.split(input_file)[1])[1]
    )
    path = path.replace("$(InputFileName)", os.path.split(input_file)[1])
    path = path.replace("$(InputPath)", input_file)
    return path


def _FindRuleTriggerFiles(rule, sources):
    """Find the list of files which a particular rule applies to.

  Arguments:
    rule: the rule in question
    sources: the set of all known source files for this project
  Returns:
    The list of sources that trigger a particular rule.
  """
    return rule.get("rule_sources", [])


def _RuleInputsAndOutputs(rule, trigger_file):
    """Find the inputs and outputs generated by a rule.

  Arguments:
    rule: the rule in question.
    trigger_file: the main trigger for this rule.
  Returns:
    The pair of (inputs, outputs) involved in this rule.
  """
    raw_inputs = _FixPaths(rule.get("inputs", []))
    raw_outputs = _FixPaths(rule.get("outputs", []))
    inputs = OrderedSet()
    outputs = OrderedSet()
    inputs.add(trigger_file)
    for i in raw_inputs:
        inputs.add(_RuleExpandPath(i, trigger_file))
    for o in raw_outputs:
        outputs.add(_RuleExpandPath(o, trigger_file))
    return (inputs, outputs)


def _GenerateNativeRulesForMSVS(p, rules, output_dir, spec, options):
    """Generate a native rules file.

  Arguments:
    p: the target project
    rules: the set of rules to include
    output_dir: the directory in which the project/gyp resides
    spec: the project dict
    options: global generator options
  """
    rules_filename = "{}{}.rules".format(spec["target_name"], options.suffix)
    rules_file = MSVSToolFile.Writer(
        os.path.join(output_dir, rules_filename), spec["target_name"]
    )
    # Add each rule.
    for r in rules:
        rule_name = r["rule_name"]
        rule_ext = r["extension"]
        inputs = _FixPaths(r.get("inputs", []))
        outputs = _FixPaths(r.get("outputs", []))
        # Skip a rule with no action and no inputs.
        if "action" not in r and not r.get("rule_sources", []):
            continue
        cmd = _BuildCommandLineForRule(spec, r, has_input_path=True, do_setup_env=True)
        rules_file.AddCustomBuildRule(
            name=rule_name,
            description=r.get("message", rule_name),
            extensions=[rule_ext],
            additional_dependencies=inputs,
            outputs=outputs,
            cmd=cmd,
        )
    # Write out rules file.
    rules_file.WriteIfChanged()

    # Add rules file to project.
    p.AddToolFile(rules_filename)


def _Cygwinify(path):
    path = path.replace("$(OutDir)", "$(OutDirCygwin)")
    path = path.replace("$(IntDir)", "$(IntDirCygwin)")
    return path


def _GenerateExternalRules(rules, output_dir, spec, sources, options, actions_to_add):
    """Generate an external makefile to do a set of rules.

  Arguments:
    rules: the list of rules to include
    output_dir: path containing project and gyp files
    spec: project specification data
    sources: set of sources known
    options: global generator options
    actions_to_add: The list of actions we will add to.
  """
    filename = "{}_rules{}.mk".format(spec["target_name"], options.suffix)
    mk_file = gyp.common.WriteOnDiff(os.path.join(output_dir, filename))
    # Find cygwin style versions of some paths.
    mk_file.write('OutDirCygwin:=$(shell cygpath -u "$(OutDir)")\n')
    mk_file.write('IntDirCygwin:=$(shell cygpath -u "$(IntDir)")\n')
    # Gather stuff needed to emit all: target.
    all_inputs = OrderedSet()
    all_outputs = OrderedSet()
    all_output_dirs = OrderedSet()
    first_outputs = []
    for rule in rules:
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for tf in trigger_files:
            inputs, outputs = _RuleInputsAndOutputs(rule, tf)
            all_inputs.update(OrderedSet(inputs))
            all_outputs.update(OrderedSet(outputs))
            # Only use one target from each rule as the dependency for
            # 'all' so we don't try to build each rule multiple times.
            first_outputs.append(next(iter(outputs)))
            # Get the unique output directories for this rule.
            output_dirs = [os.path.split(i)[0] for i in outputs]
            for od in output_dirs:
                all_output_dirs.add(od)
    first_outputs_cyg = [_Cygwinify(i) for i in first_outputs]
    # Write out all: target, including mkdir for each output directory.
    mk_file.write("all: %s\n" % " ".join(first_outputs_cyg))
    for od in all_output_dirs:
        if od:
            mk_file.write('\tmkdir -p `cygpath -u "%s"`\n' % od)
    mk_file.write("\n")
    # Define how each output is generated.
    for rule in rules:
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for tf in trigger_files:
            # Get all the inputs and outputs for this rule for this trigger file.
            inputs, outputs = _RuleInputsAndOutputs(rule, tf)
            inputs = [_Cygwinify(i) for i in inputs]
            outputs = [_Cygwinify(i) for i in outputs]
            # Prepare the command line for this rule.
            cmd = [_RuleExpandPath(c, tf) for c in rule["action"]]
            cmd = ['"%s"' % i for i in cmd]
            cmd = " ".join(cmd)
            # Add it to the makefile.
            mk_file.write("{}: {}\n".format(" ".join(outputs), " ".join(inputs)))
            mk_file.write("\t%s\n\n" % cmd)
    # Close up the file.
    mk_file.close()

    # Add makefile to list of sources.
    sources.add(filename)
    # Add a build action to call makefile.
    cmd = [
        "make",
        "OutDir=$(OutDir)",
        "IntDir=$(IntDir)",
        "-j",
        "${NUMBER_OF_PROCESSORS_PLUS_1}",
        "-f",
        filename,
    ]
    cmd = _BuildCommandLineForRuleRaw(spec, cmd, True, False, True, True)
    # Insert makefile as 0'th input, so it gets the action attached there,
    # as this is easier to understand from in the IDE.
    all_inputs = list(all_inputs)
    all_inputs.insert(0, filename)
    _AddActionStep(
        actions_to_add,
        inputs=_FixPaths(all_inputs),
        outputs=_FixPaths(all_outputs),
        description="Running external rules for %s" % spec["target_name"],
        command=cmd,
    )


def _EscapeEnvironmentVariableExpansion(s):
    """Escapes % characters.

  Escapes any % characters so that Windows-style environment variable
  expansions will leave them alone.
  See http://connect.microsoft.com/VisualStudio/feedback/details/106127/cl-d-name-text-containing-percentage-characters-doesnt-compile
  to understand why we have to do this.

  Args:
      s: The string to be escaped.

  Returns:
      The escaped string.
  """
    s = s.replace("%", "%%")
    return s


quote_replacer_regex = re.compile(r'(\\*)"')


def _EscapeCommandLineArgumentForMSVS(s):
    """Escapes a Windows command-line argument.

  So that the Win32 CommandLineToArgv function will turn the escaped result back
  into the original string.
  See http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
  ("Parsing C++ Command-Line Arguments") to understand why we have to do
  this.

  Args:
      s: the string to be escaped.
  Returns:
      the escaped string.
  """

    def _Replace(match):
        # For a literal quote, CommandLineToArgv requires an odd number of
        # backslashes preceding it, and it produces half as many literal backslashes
        # (rounded down). So we need to produce 2n+1 backslashes.
        return 2 * match.group(1) + '\\"'

    # Escape all quotes so that they are interpreted literally.
    s = quote_replacer_regex.sub(_Replace, s)
    # Now add unescaped quotes so that any whitespace is interpreted literally.
    s = '"' + s + '"'
    return s


delimiters_replacer_regex = re.compile(r"(\\*)([,;]+)")


def _EscapeVCProjCommandLineArgListItem(s):
    """Escapes command line arguments for MSVS.

  The VCProj format stores string lists in a single string using commas and
  semi-colons as separators, which must be quoted if they are to be
  interpreted literally. However, command-line arguments may already have
  quotes, and the VCProj parser is ignorant of the backslash escaping
  convention used by CommandLineToArgv, so the command-line quotes and the
  VCProj quotes may not be the same quotes. So to store a general
  command-line argument in a VCProj list, we need to parse the existing
  quoting according to VCProj's convention and quote any delimiters that are
  not already quoted by that convention. The quotes that we add will also be
  seen by CommandLineToArgv, so if backslashes precede them then we also have
  to escape those backslashes according to the CommandLineToArgv
  convention.

  Args:
      s: the string to be escaped.
  Returns:
      the escaped string.
  """

    def _Replace(match):
        # For a non-literal quote, CommandLineToArgv requires an even number of
        # backslashes preceding it, and it produces half as many literal
        # backslashes. So we need to produce 2n backslashes.
        return 2 * match.group(1) + '"' + match.group(2) + '"'

    segments = s.split('"')
    # The unquoted segments are at the even-numbered indices.
    for i in range(0, len(segments), 2):
        segments[i] = delimiters_replacer_regex.sub(_Replace, segments[i])
    # Concatenate back into a single string
    s = '"'.join(segments)
    if len(segments) % 2 == 0:
        # String ends while still quoted according to VCProj's convention. This
        # means the delimiter and the next list item that follow this one in the
        # .vcproj file will be misinterpreted as part of this item. There is nothing
        # we can do about this. Adding an extra quote would correct the problem in
        # the VCProj but cause the same problem on the final command-line. Moving
        # the item to the end of the list does works, but that's only possible if
        # there's only one such item. Let's just warn the user.
        print(
            "Warning: MSVS may misinterpret the odd number of " + "quotes in " + s,
            file=sys.stderr,
        )
    return s


def _EscapeCppDefineForMSVS(s):
    """Escapes a CPP define so that it will reach the compiler unaltered."""
    s = _EscapeEnvironmentVariableExpansion(s)
    s = _EscapeCommandLineArgumentForMSVS(s)
    s = _EscapeVCProjCommandLineArgListItem(s)
    # cl.exe replaces literal # characters with = in preprocessor definitions for
    # some reason. Octal-encode to work around that.
    s = s.replace("#", "\\%03o" % ord("#"))
    return s


quote_replacer_regex2 = re.compile(r'(\\+)"')


def _EscapeCommandLineArgumentForMSBuild(s):
    """Escapes a Windows command-line argument for use by MSBuild."""

    def _Replace(match):
        return (len(match.group(1)) / 2 * 4) * "\\" + '\\"'

    # Escape all quotes so that they are interpreted literally.
    s = quote_replacer_regex2.sub(_Replace, s)
    return s


def _EscapeMSBuildSpecialCharacters(s):
    escape_dictionary = {
        "%": "%25",
        "$": "%24",
        "@": "%40",
        "'": "%27",
        ";": "%3B",
        "?": "%3F",
        "*": "%2A",
    }
    result = "".join([escape_dictionary.get(c, c) for c in s])
    return result


def _EscapeCppDefineForMSBuild(s):
    """Escapes a CPP define so that it will reach the compiler unaltered."""
    s = _EscapeEnvironmentVariableExpansion(s)
    s = _EscapeCommandLineArgumentForMSBuild(s)
    s = _EscapeMSBuildSpecialCharacters(s)
    # cl.exe replaces literal # characters with = in preprocessor definitions for
    # some reason. Octal-encode to work around that.
    s = s.replace("#", "\\%03o" % ord("#"))
    return s


def _GenerateRulesForMSVS(
    p, output_dir, options, spec, sources, excluded_sources, actions_to_add
):
    """Generate all the rules for a particular project.

  Arguments:
    p: the project
    output_dir: directory to emit rules to
    options: global options passed to the generator
    spec: the specification for this project
    sources: the set of all known source files in this project
    excluded_sources: the set of sources excluded from normal processing
    actions_to_add: deferred list of actions to add in
  """
    rules = spec.get("rules", [])
    rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))]
    rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))]

    # Handle rules that use a native rules file.
    if rules_native:
        _GenerateNativeRulesForMSVS(p, rules_native, output_dir, spec, options)

    # Handle external rules (non-native rules).
    if rules_external:
        _GenerateExternalRules(
            rules_external, output_dir, spec, sources, options, actions_to_add
        )
    _AdjustSourcesForRules(rules, sources, excluded_sources, False)


def _AdjustSourcesForRules(rules, sources, excluded_sources, is_msbuild):
    # Add outputs generated by each rule (if applicable).
    for rule in rules:
        # Add in the outputs from this rule.
        trigger_files = _FindRuleTriggerFiles(rule, sources)
        for trigger_file in trigger_files:
            # Remove trigger_file from excluded_sources to let the rule be triggered
            # (e.g. rule trigger ax_enums.idl is added to excluded_sources
            # because it's also in an action's inputs in the same project)
            excluded_sources.discard(_FixPath(trigger_file))
            # Done if not processing outputs as sources.
            if int(rule.get("process_outputs_as_sources", False)):
                inputs, outputs = _RuleInputsAndOutputs(rule, trigger_file)
                inputs = OrderedSet(_FixPaths(inputs))
                outputs = OrderedSet(_FixPaths(outputs))
                inputs.remove(_FixPath(trigger_file))
                sources.update(inputs)
                if not is_msbuild:
                    excluded_sources.update(inputs)
                sources.update(outputs)


def _FilterActionsFromExcluded(excluded_sources, actions_to_add):
    """Take inputs with actions attached out of the list of exclusions.

  Arguments:
    excluded_sources: list of source files not to be built.
    actions_to_add: dict of actions keyed on source file they're attached to.
  Returns:
    excluded_sources with files that have actions attached removed.
  """
    must_keep = OrderedSet(_FixPaths(actions_to_add.keys()))
    return [s for s in excluded_sources if s not in must_keep]


def _GetDefaultConfiguration(spec):
    return spec["configurations"][spec["default_configuration"]]


def _GetGuidOfProject(proj_path, spec):
    """Get the guid for the project.

  Arguments:
    proj_path: Path of the vcproj or vcxproj file to generate.
    spec: The target dictionary containing the properties of the target.
  Returns:
    the guid.
  Raises:
    ValueError: if the specified GUID is invalid.
  """
    # Pluck out the default configuration.
    default_config = _GetDefaultConfiguration(spec)
    # Decide the guid of the project.
    guid = default_config.get("msvs_guid")
    if guid:
        if VALID_MSVS_GUID_CHARS.match(guid) is None:
            raise ValueError(
                'Invalid MSVS guid: "%s".  Must match regex: "%s".'
                % (guid, VALID_MSVS_GUID_CHARS.pattern)
            )
        guid = "{%s}" % guid
    guid = guid or MSVSNew.MakeGuid(proj_path)
    return guid


def _GetMsbuildToolsetOfProject(proj_path, spec, version):
    """Get the platform toolset for the project.

  Arguments:
    proj_path: Path of the vcproj or vcxproj file to generate.
    spec: The target dictionary containing the properties of the target.
    version: The MSVSVersion object.
  Returns:
    the platform toolset string or None.
  """
    # Pluck out the default configuration.
    default_config = _GetDefaultConfiguration(spec)
    toolset = default_config.get("msbuild_toolset")
    if not toolset and version.DefaultToolset():
        toolset = version.DefaultToolset()
    if spec["type"] == "windows_driver":
        toolset = "WindowsKernelModeDriver10.0"
    return toolset


def _GenerateProject(project, options, version, generator_flags, spec):
    """Generates a vcproj file.

  Arguments:
    project: the MSVSProject object.
    options: global generator options.
    version: the MSVSVersion object.
    generator_flags: dict of generator-specific flags.
  Returns:
    A list of source files that cannot be found on disk.
  """
    default_config = _GetDefaultConfiguration(project.spec)

    # Skip emitting anything if told to with msvs_existing_vcproj option.
    if default_config.get("msvs_existing_vcproj"):
        return []

    if version.UsesVcxproj():
        return _GenerateMSBuildProject(project, options, version, generator_flags, spec)
    else:
        return _GenerateMSVSProject(project, options, version, generator_flags)


def _GenerateMSVSProject(project, options, version, generator_flags):
    """Generates a .vcproj file.  It may create .rules and .user files too.

  Arguments:
    project: The project object we will generate the file for.
    options: Global options passed to the generator.
    version: The VisualStudioVersion object.
    generator_flags: dict of generator-specific flags.
  """
    spec = project.spec
    gyp.common.EnsureDirExists(project.path)

    platforms = _GetUniquePlatforms(spec)
    p = MSVSProject.Writer(
        project.path, version, spec["target_name"], project.guid, platforms
    )

    # Get directory project file is in.
    project_dir = os.path.split(project.path)[0]
    gyp_path = _NormalizedSource(project.build_file)
    relative_path_of_gyp_file = gyp.common.RelativePath(gyp_path, project_dir)

    config_type = _GetMSVSConfigurationType(spec, project.build_file)
    for config_name, config in spec["configurations"].items():
        _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config)

    # Prepare list of sources and excluded sources.
    gyp_file = os.path.split(project.build_file)[1]
    sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file)

    # Add rules.
    actions_to_add = {}
    _GenerateRulesForMSVS(
        p, project_dir, options, spec, sources, excluded_sources, actions_to_add
    )
    list_excluded = generator_flags.get("msvs_list_excluded_files", True)
    sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy(
        spec, options, project_dir, sources, excluded_sources, list_excluded, version
    )

    # Add in files.
    missing_sources = _VerifySourcesExist(sources, project_dir)
    p.AddFiles(sources)

    _AddToolFilesToMSVS(p, spec)
    _HandlePreCompiledHeaders(p, sources, spec)
    _AddActions(actions_to_add, spec, relative_path_of_gyp_file)
    _AddCopies(actions_to_add, spec)
    _WriteMSVSUserFile(project.path, version, spec)

    # NOTE: this stanza must appear after all actions have been decided.
    # Don't excluded sources with actions attached, or they won't run.
    excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add)
    _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded)
    _AddAccumulatedActionsToMSVS(p, spec, actions_to_add)

    # Write it out.
    p.WriteIfChanged()

    return missing_sources


def _GetUniquePlatforms(spec):
    """Returns the list of unique platforms for this spec, e.g ['win32', ...].

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    The MSVSUserFile object created.
  """
    # Gather list of unique platforms.
    platforms = OrderedSet()
    for configuration in spec["configurations"]:
        platforms.add(_ConfigPlatform(spec["configurations"][configuration]))
    platforms = list(platforms)
    return platforms


def _CreateMSVSUserFile(proj_path, version, spec):
    """Generates a .user file for the user running this Gyp program.

  Arguments:
    proj_path: The path of the project file being created.  The .user file
               shares the same path (with an appropriate suffix).
    version: The VisualStudioVersion object.
    spec: The target dictionary containing the properties of the target.
  Returns:
    The MSVSUserFile object created.
  """
    (domain, username) = _GetDomainAndUserName()
    vcuser_filename = ".".join([proj_path, domain, username, "user"])
    user_file = MSVSUserFile.Writer(vcuser_filename, version, spec["target_name"])
    return user_file


def _GetMSVSConfigurationType(spec, build_file):
    """Returns the configuration type for this project.

  It's a number defined by Microsoft.  May raise an exception.

  Args:
      spec: The target dictionary containing the properties of the target.
      build_file: The path of the gyp file.
  Returns:
      An integer, the configuration type.
  """
    try:
        config_type = {
            "executable": "1",  # .exe
            "shared_library": "2",  # .dll
            "loadable_module": "2",  # .dll
            "static_library": "4",  # .lib
            "windows_driver": "5",  # .sys
            "none": "10",  # Utility type
        }[spec["type"]]
    except KeyError:
        if spec.get("type"):
            raise GypError(
                "Target type %s is not a valid target type for "
                "target %s in %s." % (spec["type"], spec["target_name"], build_file)
            )
        else:
            raise GypError(
                "Missing type field for target %s in %s."
                % (spec["target_name"], build_file)
            )
    return config_type


def _AddConfigurationToMSVSProject(p, spec, config_type, config_name, config):
    """Adds a configuration to the MSVS project.

  Many settings in a vcproj file are specific to a configuration.  This
  function the main part of the vcproj file that's configuration specific.

  Arguments:
    p: The target project being generated.
    spec: The target dictionary containing the properties of the target.
    config_type: The configuration type, a number as defined by Microsoft.
    config_name: The name of the configuration.
    config: The dictionary that defines the special processing to be done
            for this configuration.
  """
    # Get the information for this configuration
    include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs(config)
    libraries = _GetLibraries(spec)
    library_dirs = _GetLibraryDirs(config)
    out_file, vc_tool, _ = _GetOutputFilePathAndTool(spec, msbuild=False)
    defines = _GetDefines(config)
    defines = [_EscapeCppDefineForMSVS(d) for d in defines]
    disabled_warnings = _GetDisabledWarnings(config)
    prebuild = config.get("msvs_prebuild")
    postbuild = config.get("msvs_postbuild")
    def_file = _GetModuleDefinition(spec)
    precompiled_header = config.get("msvs_precompiled_header")

    # Prepare the list of tools as a dictionary.
    tools = {}
    # Add in user specified msvs_settings.
    msvs_settings = config.get("msvs_settings", {})
    MSVSSettings.ValidateMSVSSettings(msvs_settings)

    # Prevent default library inheritance from the environment.
    _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", ["$(NOINHERIT)"])

    for tool in msvs_settings:
        settings = config["msvs_settings"][tool]
        for setting in settings:
            _ToolAppend(tools, tool, setting, settings[setting])
    # Add the information to the appropriate tool
    _ToolAppend(tools, "VCCLCompilerTool", "AdditionalIncludeDirectories", include_dirs)
    _ToolAppend(tools, "VCMIDLTool", "AdditionalIncludeDirectories", midl_include_dirs)
    _ToolAppend(
        tools,
        "VCResourceCompilerTool",
        "AdditionalIncludeDirectories",
        resource_include_dirs,
    )
    # Add in libraries.
    _ToolAppend(tools, "VCLinkerTool", "AdditionalDependencies", libraries)
    _ToolAppend(tools, "VCLinkerTool", "AdditionalLibraryDirectories", library_dirs)
    if out_file:
        _ToolAppend(tools, vc_tool, "OutputFile", out_file, only_if_unset=True)
    # Add defines.
    _ToolAppend(tools, "VCCLCompilerTool", "PreprocessorDefinitions", defines)
    _ToolAppend(tools, "VCResourceCompilerTool", "PreprocessorDefinitions", defines)
    # Change program database directory to prevent collisions.
    _ToolAppend(
        tools,
        "VCCLCompilerTool",
        "ProgramDataBaseFileName",
        "$(IntDir)$(ProjectName)\\vc80.pdb",
        only_if_unset=True,
    )
    # Add disabled warnings.
    _ToolAppend(tools, "VCCLCompilerTool", "DisableSpecificWarnings", disabled_warnings)
    # Add Pre-build.
    _ToolAppend(tools, "VCPreBuildEventTool", "CommandLine", prebuild)
    # Add Post-build.
    _ToolAppend(tools, "VCPostBuildEventTool", "CommandLine", postbuild)
    # Turn on precompiled headers if appropriate.
    if precompiled_header:
        precompiled_header = os.path.split(precompiled_header)[1]
        _ToolAppend(tools, "VCCLCompilerTool", "UsePrecompiledHeader", "2")
        _ToolAppend(
            tools, "VCCLCompilerTool", "PrecompiledHeaderThrough", precompiled_header
        )
        _ToolAppend(tools, "VCCLCompilerTool", "ForcedIncludeFiles", precompiled_header)
    # Loadable modules don't generate import libraries;
    # tell dependent projects to not expect one.
    if spec["type"] == "loadable_module":
        _ToolAppend(tools, "VCLinkerTool", "IgnoreImportLibrary", "true")
    # Set the module definition file if any.
    if def_file:
        _ToolAppend(tools, "VCLinkerTool", "ModuleDefinitionFile", def_file)

    _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name)


def _GetIncludeDirs(config):
    """Returns the list of directories to be used for #include directives.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of directory paths.
  """
    # TODO(bradnelson): include_dirs should really be flexible enough not to
    #                   require this sort of thing.
    include_dirs = config.get("include_dirs", []) + config.get(
        "msvs_system_include_dirs", []
    )
    midl_include_dirs = config.get("midl_include_dirs", []) + config.get(
        "msvs_system_include_dirs", []
    )
    resource_include_dirs = config.get("resource_include_dirs", include_dirs)
    include_dirs = _FixPaths(include_dirs)
    midl_include_dirs = _FixPaths(midl_include_dirs)
    resource_include_dirs = _FixPaths(resource_include_dirs)
    return include_dirs, midl_include_dirs, resource_include_dirs


def _GetLibraryDirs(config):
    """Returns the list of directories to be used for library search paths.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of directory paths.
  """

    library_dirs = config.get("library_dirs", [])
    library_dirs = _FixPaths(library_dirs)
    return library_dirs


def _GetLibraries(spec):
    """Returns the list of libraries for this configuration.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    The list of directory paths.
  """
    libraries = spec.get("libraries", [])
    # Strip out -l, as it is not used on windows (but is needed so we can pass
    # in libraries that are assumed to be in the default library path).
    # Also remove duplicate entries, leaving only the last duplicate, while
    # preserving order.
    found = OrderedSet()
    unique_libraries_list = []
    for entry in reversed(libraries):
        library = re.sub(r"^\-l", "", entry)
        if not os.path.splitext(library)[1]:
            library += ".lib"
        if library not in found:
            found.add(library)
            unique_libraries_list.append(library)
    unique_libraries_list.reverse()
    return unique_libraries_list


def _GetOutputFilePathAndTool(spec, msbuild):
    """Returns the path and tool to use for this target.

  Figures out the path of the file this spec will create and the name of
  the VC tool that will create it.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    A triple of (file path, name of the vc tool, name of the msbuild tool)
  """
    # Select a name for the output file.
    out_file = ""
    vc_tool = ""
    msbuild_tool = ""
    output_file_map = {
        "executable": ("VCLinkerTool", "Link", "$(OutDir)", ".exe"),
        "shared_library": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"),
        "loadable_module": ("VCLinkerTool", "Link", "$(OutDir)", ".dll"),
        "windows_driver": ("VCLinkerTool", "Link", "$(OutDir)", ".sys"),
        "static_library": ("VCLibrarianTool", "Lib", "$(OutDir)lib\\", ".lib"),
    }
    output_file_props = output_file_map.get(spec["type"])
    if output_file_props and int(spec.get("msvs_auto_output_file", 1)):
        vc_tool, msbuild_tool, out_dir, suffix = output_file_props
        if spec.get("standalone_static_library", 0):
            out_dir = "$(OutDir)"
        out_dir = spec.get("product_dir", out_dir)
        product_extension = spec.get("product_extension")
        if product_extension:
            suffix = "." + product_extension
        elif msbuild:
            suffix = "$(TargetExt)"
        prefix = spec.get("product_prefix", "")
        product_name = spec.get("product_name", "$(ProjectName)")
        out_file = ntpath.join(out_dir, prefix + product_name + suffix)
    return out_file, vc_tool, msbuild_tool


def _GetOutputTargetExt(spec):
    """Returns the extension for this target, including the dot

  If product_extension is specified, set target_extension to this to avoid
  MSB8012, returns None otherwise. Ignores any target_extension settings in
  the input files.

  Arguments:
    spec: The target dictionary containing the properties of the target.
  Returns:
    A string with the extension, or None
  """
    target_extension = spec.get("product_extension")
    if target_extension:
        return "." + target_extension
    return None


def _GetDefines(config):
    """Returns the list of preprocessor definitions for this configuration.

  Arguments:
    config: The dictionary that defines the special processing to be done
            for this configuration.
  Returns:
    The list of preprocessor definitions.
  """
    defines = []
    for d in config.get("defines", []):
        fd = "=".join([str(dpart) for dpart in d]) if isinstance(d, list) else str(d)
        defines.append(fd)
    return defines


def _GetDisabledWarnings(config):
    return [str(i) for i in config.get("msvs_disabled_warnings", [])]


def _GetModuleDefinition(spec):
    def_file = ""
    if spec["type"] in [
        "shared_library",
        "loadable_module",
        "executable",
        "windows_driver",
    ]:
        def_files = [s for s in spec.get("sources", []) if s.endswith(".def")]
        if len(def_files) == 1:
            def_file = _FixPath(def_files[0])
        elif def_files:
            raise ValueError(
                "Multiple module definition files in one target, target %s lists "
                "multiple .def files: %s" % (spec["target_name"], " ".join(def_files))
            )
    return def_file


def _ConvertToolsToExpectedForm(tools):
    """Convert tools to a form expected by Visual Studio.

  Arguments:
    tools: A dictionary of settings; the tool name is the key.
  Returns:
    A list of Tool objects.
  """
    tool_list = []
    for tool, settings in tools.items():
        # Collapse settings with lists.
        settings_fixed = {}
        for setting, value in settings.items():
            if type(value) == list:
                if (
                    tool == "VCLinkerTool" and setting == "AdditionalDependencies"
                ) or setting == "AdditionalOptions":
                    settings_fixed[setting] = " ".join(value)
                else:
                    settings_fixed[setting] = ";".join(value)
            else:
                settings_fixed[setting] = value
        # Add in this tool.
        tool_list.append(MSVSProject.Tool(tool, settings_fixed))
    return tool_list


def _AddConfigurationToMSVS(p, spec, tools, config, config_type, config_name):
    """Add to the project file the configuration specified by config.

  Arguments:
    p: The target project being generated.
    spec: the target project dict.
    tools: A dictionary of settings; the tool name is the key.
    config: The dictionary that defines the special processing to be done
            for this configuration.
    config_type: The configuration type, a number as defined by Microsoft.
    config_name: The name of the configuration.
  """
    attributes = _GetMSVSAttributes(spec, config, config_type)
    # Add in this configuration.
    tool_list = _ConvertToolsToExpectedForm(tools)
    p.AddConfig(_ConfigFullName(config_name, config), attrs=attributes, tools=tool_list)


def _GetMSVSAttributes(spec, config, config_type):
    # Prepare configuration attributes.
    prepared_attrs = {}
    source_attrs = config.get("msvs_configuration_attributes", {})
    for a in source_attrs:
        prepared_attrs[a] = source_attrs[a]
    # Add props files.
    vsprops_dirs = config.get("msvs_props", [])
    vsprops_dirs = _FixPaths(vsprops_dirs)
    if vsprops_dirs:
        prepared_attrs["InheritedPropertySheets"] = ";".join(vsprops_dirs)
    # Set configuration type.
    prepared_attrs["ConfigurationType"] = config_type
    output_dir = prepared_attrs.get(
        "OutputDirectory", "$(SolutionDir)$(ConfigurationName)"
    )
    prepared_attrs["OutputDirectory"] = _FixPath(output_dir) + "\\"
    if "IntermediateDirectory" not in prepared_attrs:
        intermediate = "$(ConfigurationName)\\obj\\$(ProjectName)"
        prepared_attrs["IntermediateDirectory"] = _FixPath(intermediate) + "\\"
    else:
        intermediate = _FixPath(prepared_attrs["IntermediateDirectory"]) + "\\"
        intermediate = MSVSSettings.FixVCMacroSlashes(intermediate)
        prepared_attrs["IntermediateDirectory"] = intermediate
    return prepared_attrs


def _AddNormalizedSources(sources_set, sources_array):
    sources_set.update(_NormalizedSource(s) for s in sources_array)


def _PrepareListOfSources(spec, generator_flags, gyp_file):
    """Prepare list of sources and excluded sources.

  Besides the sources specified directly in the spec, adds the gyp file so
  that a change to it will cause a re-compile. Also adds appropriate sources
  for actions and copies. Assumes later stage will un-exclude files which
  have custom build steps attached.

  Arguments:
    spec: The target dictionary containing the properties of the target.
    gyp_file: The name of the gyp file.
  Returns:
    A pair of (list of sources, list of excluded sources).
    The sources will be relative to the gyp file.
  """
    sources = OrderedSet()
    _AddNormalizedSources(sources, spec.get("sources", []))
    excluded_sources = OrderedSet()
    # Add in the gyp file.
    if not generator_flags.get("standalone"):
        sources.add(gyp_file)

    # Add in 'action' inputs and outputs.
    for a in spec.get("actions", []):
        inputs = a["inputs"]
        inputs = [_NormalizedSource(i) for i in inputs]
        # Add all inputs to sources and excluded sources.
        inputs = OrderedSet(inputs)
        sources.update(inputs)
        if not spec.get("msvs_external_builder"):
            excluded_sources.update(inputs)
        if int(a.get("process_outputs_as_sources", False)):
            _AddNormalizedSources(sources, a.get("outputs", []))
    # Add in 'copies' inputs and outputs.
    for cpy in spec.get("copies", []):
        _AddNormalizedSources(sources, cpy.get("files", []))
    return (sources, excluded_sources)


def _AdjustSourcesAndConvertToFilterHierarchy(
    spec, options, gyp_dir, sources, excluded_sources, list_excluded, version
):
    """Adjusts the list of sources and excluded sources.

  Also converts the sets to lists.

  Arguments:
    spec: The target dictionary containing the properties of the target.
    options: Global generator options.
    gyp_dir: The path to the gyp file being processed.
    sources: A set of sources to be included for this project.
    excluded_sources: A set of sources to be excluded for this project.
    version: A MSVSVersion object.
  Returns:
    A trio of (list of sources, list of excluded sources,
               path of excluded IDL file)
  """
    # Exclude excluded sources coming into the generator.
    excluded_sources.update(OrderedSet(spec.get("sources_excluded", [])))
    # Add excluded sources into sources for good measure.
    sources.update(excluded_sources)
    # Convert to proper windows form.
    # NOTE: sources goes from being a set to a list here.
    # NOTE: excluded_sources goes from being a set to a list here.
    sources = _FixPaths(sources)
    # Convert to proper windows form.
    excluded_sources = _FixPaths(excluded_sources)

    excluded_idl = _IdlFilesHandledNonNatively(spec, sources)

    precompiled_related = _GetPrecompileRelatedFiles(spec)
    # Find the excluded ones, minus the precompiled header related ones.
    fully_excluded = [i for i in excluded_sources if i not in precompiled_related]

    # Convert to folders and the right slashes.
    sources = [i.split("\\") for i in sources]
    sources = _ConvertSourcesToFilterHierarchy(
        sources,
        excluded=fully_excluded,
        list_excluded=list_excluded,
        msvs_version=version,
    )

    # Prune filters with a single child to flatten ugly directory structures
    # such as ../../src/modules/module1 etc.
    if version.UsesVcxproj():
        while (
            all(isinstance(s, MSVSProject.Filter) for s in sources)
            and len({s.name for s in sources}) == 1
        ):
            assert all(len(s.contents) == 1 for s in sources)
            sources = [s.contents[0] for s in sources]
    else:
        while len(sources) == 1 and isinstance(sources[0], MSVSProject.Filter):
            sources = sources[0].contents

    return sources, excluded_sources, excluded_idl


def _IdlFilesHandledNonNatively(spec, sources):
    # If any non-native rules use 'idl' as an extension exclude idl files.
    # Gather a list here to use later.
    using_idl = False
    for rule in spec.get("rules", []):
        if rule["extension"] == "idl" and int(rule.get("msvs_external_rule", 0)):
            using_idl = True
            break
    excluded_idl = [i for i in sources if i.endswith(".idl")] if using_idl else []
    return excluded_idl


def _GetPrecompileRelatedFiles(spec):
    # Gather a list of precompiled header related sources.
    precompiled_related = []
    for _, config in spec["configurations"].items():
        for k in precomp_keys:
            f = config.get(k)
            if f:
                precompiled_related.append(_FixPath(f))
    return precompiled_related


def _ExcludeFilesFromBeingBuilt(p, spec, excluded_sources, excluded_idl, list_excluded):
    exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
    for file_name, excluded_configs in exclusions.items():
        if not list_excluded and len(excluded_configs) == len(spec["configurations"]):
            # If we're not listing excluded files, then they won't appear in the
            # project, so don't try to configure them to be excluded.
            pass
        else:
            for config_name, config in excluded_configs:
                p.AddFileConfig(
                    file_name,
                    _ConfigFullName(config_name, config),
                    {"ExcludedFromBuild": "true"},
                )


def _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl):
    exclusions = {}
    # Exclude excluded sources from being built.
    for f in excluded_sources:
        excluded_configs = []
        for config_name, config in spec["configurations"].items():
            precomped = [_FixPath(config.get(i, "")) for i in precomp_keys]
            # Don't do this for ones that are precompiled header related.
            if f not in precomped:
                excluded_configs.append((config_name, config))
        exclusions[f] = excluded_configs
    # If any non-native rules use 'idl' as an extension exclude idl files.
    # Exclude them now.
    for f in excluded_idl:
        excluded_configs = []
        for config_name, config in spec["configurations"].items():
            excluded_configs.append((config_name, config))
        exclusions[f] = excluded_configs
    return exclusions


def _AddToolFilesToMSVS(p, spec):
    # Add in tool files (rules).
    tool_files = OrderedSet()
    for _, config in spec["configurations"].items():
        for f in config.get("msvs_tool_files", []):
            tool_files.add(f)
    for f in tool_files:
        p.AddToolFile(f)


def _HandlePreCompiledHeaders(p, sources, spec):
    # Pre-compiled header source stubs need a different compiler flag
    # (generate precompiled header) and any source file not of the same
    # kind (i.e. C vs. C++) as the precompiled header source stub needs
    # to have use of precompiled headers disabled.
    extensions_excluded_from_precompile = []
    for config_name, config in spec["configurations"].items():
        source = config.get("msvs_precompiled_source")
        if source:
            source = _FixPath(source)
            # UsePrecompiledHeader=1 for if using precompiled headers.
            tool = MSVSProject.Tool("VCCLCompilerTool", {"UsePrecompiledHeader": "1"})
            p.AddFileConfig(
                source, _ConfigFullName(config_name, config), {}, tools=[tool]
            )
            basename, extension = os.path.splitext(source)
            if extension == ".c":
                extensions_excluded_from_precompile = [".cc", ".cpp", ".cxx"]
            else:
                extensions_excluded_from_precompile = [".c"]

    def DisableForSourceTree(source_tree):
        for source in source_tree:
            if isinstance(source, MSVSProject.Filter):
                DisableForSourceTree(source.contents)
            else:
                basename, extension = os.path.splitext(source)
                if extension in extensions_excluded_from_precompile:
                    for config_name, config in spec["configurations"].items():
                        tool = MSVSProject.Tool(
                            "VCCLCompilerTool",
                            {
                                "UsePrecompiledHeader": "0",
                                "ForcedIncludeFiles": "$(NOINHERIT)",
                            },
                        )
                        p.AddFileConfig(
                            _FixPath(source),
                            _ConfigFullName(config_name, config),
                            {},
                            tools=[tool],
                        )

    # Do nothing if there was no precompiled source.
    if extensions_excluded_from_precompile:
        DisableForSourceTree(sources)


def _AddActions(actions_to_add, spec, relative_path_of_gyp_file):
    # Add actions.
    actions = spec.get("actions", [])
    # Don't setup_env every time. When all the actions are run together in one
    # batch file in VS, the PATH will grow too long.
    # Membership in this set means that the cygwin environment has been set up,
    # and does not need to be set up again.
    have_setup_env = set()
    for a in actions:
        # Attach actions to the gyp file if nothing else is there.
        inputs = a.get("inputs") or [relative_path_of_gyp_file]
        attached_to = inputs[0]
        need_setup_env = attached_to not in have_setup_env
        cmd = _BuildCommandLineForRule(
            spec, a, has_input_path=False, do_setup_env=need_setup_env
        )
        have_setup_env.add(attached_to)
        # Add the action.
        _AddActionStep(
            actions_to_add,
            inputs=inputs,
            outputs=a.get("outputs", []),
            description=a.get("message", a["action_name"]),
            command=cmd,
        )


def _WriteMSVSUserFile(project_path, version, spec):
    # Add run_as and test targets.
    if "run_as" in spec:
        run_as = spec["run_as"]
        action = run_as.get("action", [])
        environment = run_as.get("environment", [])
        working_directory = run_as.get("working_directory", ".")
    elif int(spec.get("test", 0)):
        action = ["$(TargetPath)", "--gtest_print_time"]
        environment = []
        working_directory = "."
    else:
        return  # Nothing to add
    # Write out the user file.
    user_file = _CreateMSVSUserFile(project_path, version, spec)
    for config_name, c_data in spec["configurations"].items():
        user_file.AddDebugSettings(
            _ConfigFullName(config_name, c_data), action, environment, working_directory
        )
    user_file.WriteIfChanged()


def _AddCopies(actions_to_add, spec):
    copies = _GetCopies(spec)
    for inputs, outputs, cmd, description in copies:
        _AddActionStep(
            actions_to_add,
            inputs=inputs,
            outputs=outputs,
            description=description,
            command=cmd,
        )


def _GetCopies(spec):
    copies = []
    # Add copies.
    for cpy in spec.get("copies", []):
        for src in cpy.get("files", []):
            dst = os.path.join(cpy["destination"], os.path.basename(src))
            # _AddCustomBuildToolForMSVS() will call _FixPath() on the inputs and
            # outputs, so do the same for our generated command line.
            if src.endswith("/"):
                src_bare = src[:-1]
                base_dir = posixpath.split(src_bare)[0]
                outer_dir = posixpath.split(src_bare)[1]
                fixed_dst = _FixPath(dst)
                full_dst = f'"{fixed_dst}\\{outer_dir}\\"'
                cmd = (
                    f'mkdir {full_dst} 2>nul & cd "{_FixPath(base_dir)}" && '
                    f'xcopy /e /f /y "{outer_dir}" {full_dst}'
                )
                copies.append(
                    (
                        [src],
                        ["dummy_copies", dst],
                        cmd,
                        f"Copying {src} to {fixed_dst}",
                    )
                )
            else:
                fix_dst = _FixPath(cpy["destination"])
                cmd = (
                    f'mkdir "{fix_dst}" 2>nul & set ERRORLEVEL=0 & '
                    f'copy /Y "{_FixPath(src)}" "{_FixPath(dst)}"'
                )
                copies.append(([src], [dst], cmd, f"Copying {src} to {fix_dst}"))
    return copies


def _GetPathDict(root, path):
    # |path| will eventually be empty (in the recursive calls) if it was initially
    # relative; otherwise it will eventually end up as '\', 'D:\', etc.
    if not path or path.endswith(os.sep):
        return root
    parent, folder = os.path.split(path)
    parent_dict = _GetPathDict(root, parent)
    if folder not in parent_dict:
        parent_dict[folder] = {}
    return parent_dict[folder]


def _DictsToFolders(base_path, bucket, flat):
    # Convert to folders recursively.
    children = []
    for folder, contents in bucket.items():
        if type(contents) == dict:
            folder_children = _DictsToFolders(
                os.path.join(base_path, folder), contents, flat
            )
            if flat:
                children += folder_children
            else:
                folder_children = MSVSNew.MSVSFolder(
                    os.path.join(base_path, folder),
                    name="(" + folder + ")",
                    entries=folder_children,
                )
                children.append(folder_children)
        else:
            children.append(contents)
    return children


def _CollapseSingles(parent, node):
    # Recursively explorer the tree of dicts looking for projects which are
    # the sole item in a folder which has the same name as the project. Bring
    # such projects up one level.
    if type(node) == dict and len(node) == 1 and next(iter(node)) == parent + ".vcproj":
        return node[next(iter(node))]
    if type(node) != dict:
        return node
    for child in node:
        node[child] = _CollapseSingles(child, node[child])
    return node


def _GatherSolutionFolders(sln_projects, project_objects, flat):
    root = {}
    # Convert into a tree of dicts on path.
    for p in sln_projects:
        gyp_file, target = gyp.common.ParseQualifiedTarget(p)[0:2]
        if p.endswith("#host"):
            target += "_host"
        gyp_dir = os.path.dirname(gyp_file)
        path_dict = _GetPathDict(root, gyp_dir)
        path_dict[target + ".vcproj"] = project_objects[p]
    # Walk down from the top until we hit a folder that has more than one entry.
    # In practice, this strips the top-level "src/" dir from the hierarchy in
    # the solution.
    while len(root) == 1 and type(root[next(iter(root))]) == dict:
        root = root[next(iter(root))]
    # Collapse singles.
    root = _CollapseSingles("", root)
    # Merge buckets until everything is a root entry.
    return _DictsToFolders("", root, flat)


def _GetPathOfProject(qualified_target, spec, options, msvs_version):
    default_config = _GetDefaultConfiguration(spec)
    proj_filename = default_config.get("msvs_existing_vcproj")
    if not proj_filename:
        proj_filename = spec["target_name"]
        if spec["toolset"] == "host":
            proj_filename += "_host"
        proj_filename = proj_filename + options.suffix + msvs_version.ProjectExtension()

    build_file = gyp.common.BuildFile(qualified_target)
    proj_path = os.path.join(os.path.dirname(build_file), proj_filename)
    fix_prefix = None
    if options.generator_output:
        project_dir_path = os.path.dirname(os.path.abspath(proj_path))
        proj_path = os.path.join(options.generator_output, proj_path)
        fix_prefix = gyp.common.RelativePath(
            project_dir_path, os.path.dirname(proj_path)
        )
    return proj_path, fix_prefix


def _GetPlatformOverridesOfProject(spec):
    # Prepare a dict indicating which project configurations are used for which
    # solution configurations for this target.
    config_platform_overrides = {}
    for config_name, c in spec["configurations"].items():
        config_fullname = _ConfigFullName(config_name, c)
        platform = c.get("msvs_target_platform", _ConfigPlatform(c))
        fixed_config_fullname = (
            f"{_ConfigBaseName(config_name, _ConfigPlatform(c))}|{platform}"
        )
        if spec["toolset"] == "host" and generator_supports_multiple_toolsets:
            fixed_config_fullname = f"{config_name}|x64"
        config_platform_overrides[config_fullname] = fixed_config_fullname
    return config_platform_overrides


def _CreateProjectObjects(target_list, target_dicts, options, msvs_version):
    """Create a MSVSProject object for the targets found in target list.

  Arguments:
    target_list: the list of targets to generate project objects for.
    target_dicts: the dictionary of specifications.
    options: global generator options.
    msvs_version: the MSVSVersion object.
  Returns:
    A set of created projects, keyed by target.
  """
    global fixpath_prefix
    # Generate each project.
    projects = {}
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        proj_path, fixpath_prefix = _GetPathOfProject(
            qualified_target, spec, options, msvs_version
        )
        guid = _GetGuidOfProject(proj_path, spec)
        overrides = _GetPlatformOverridesOfProject(spec)
        build_file = gyp.common.BuildFile(qualified_target)
        # Create object for this project.
        target_name = spec["target_name"]
        if spec["toolset"] == "host":
            target_name += "_host"
        obj = MSVSNew.MSVSProject(
            proj_path,
            name=target_name,
            guid=guid,
            spec=spec,
            build_file=build_file,
            config_platform_overrides=overrides,
            fixpath_prefix=fixpath_prefix,
        )
        # Set project toolset if any (MS build only)
        if msvs_version.UsesVcxproj():
            obj.set_msbuild_toolset(
                _GetMsbuildToolsetOfProject(proj_path, spec, msvs_version)
            )
        projects[qualified_target] = obj
    # Set all the dependencies, but not if we are using an external builder like
    # ninja
    for project in projects.values():
        if not project.spec.get("msvs_external_builder"):
            deps = project.spec.get("dependencies", [])
            deps = [projects[d] for d in deps]
            project.set_dependencies(deps)
    return projects


def _InitNinjaFlavor(params, target_list, target_dicts):
    """Initialize targets for the ninja flavor.

  This sets up the necessary variables in the targets to generate msvs projects
  that use ninja as an external builder. The variables in the spec are only set
  if they have not been set. This allows individual specs to override the
  default values initialized here.
  Arguments:
    params: Params provided to the generator.
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
  """
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        if spec.get("msvs_external_builder"):
            # The spec explicitly defined an external builder, so don't change it.
            continue

        path_to_ninja = spec.get("msvs_path_to_ninja", "ninja.exe")

        spec["msvs_external_builder"] = "ninja"
        if not spec.get("msvs_external_builder_out_dir"):
            gyp_file, _, _ = gyp.common.ParseQualifiedTarget(qualified_target)
            gyp_dir = os.path.dirname(gyp_file)
            configuration = "$(Configuration)"
            if params.get("target_arch") == "x64":
                configuration += "_x64"
            if params.get("target_arch") == "arm64":
                configuration += "_arm64"
            spec["msvs_external_builder_out_dir"] = os.path.join(
                gyp.common.RelativePath(params["options"].toplevel_dir, gyp_dir),
                ninja_generator.ComputeOutputDir(params),
                configuration,
            )
        if not spec.get("msvs_external_builder_build_cmd"):
            spec["msvs_external_builder_build_cmd"] = [
                path_to_ninja,
                "-C",
                "$(OutDir)",
                "$(ProjectName)",
            ]
        if not spec.get("msvs_external_builder_clean_cmd"):
            spec["msvs_external_builder_clean_cmd"] = [
                path_to_ninja,
                "-C",
                "$(OutDir)",
                "-tclean",
                "$(ProjectName)",
            ]


def CalculateVariables(default_variables, params):
    """Generated variables that require params to be known."""

    generator_flags = params.get("generator_flags", {})

    # Select project file format version (if unset, default to auto detecting).
    msvs_version = MSVSVersion.SelectVisualStudioVersion(
        generator_flags.get("msvs_version", "auto")
    )
    # Stash msvs_version for later (so we don't have to probe the system twice).
    params["msvs_version"] = msvs_version

    # Set a variable so conditions can be based on msvs_version.
    default_variables["MSVS_VERSION"] = msvs_version.ShortName()

    # To determine processor word size on Windows, in addition to checking
    # PROCESSOR_ARCHITECTURE (which reflects the word size of the current
    # process), it is also necessary to check PROCESSOR_ARCITEW6432 (which
    # contains the actual word size of the system when running thru WOW64).
    if (
        os.environ.get("PROCESSOR_ARCHITECTURE", "").find("64") >= 0
        or os.environ.get("PROCESSOR_ARCHITEW6432", "").find("64") >= 0
    ):
        default_variables["MSVS_OS_BITS"] = 64
    else:
        default_variables["MSVS_OS_BITS"] = 32

    if gyp.common.GetFlavor(params) == "ninja":
        default_variables["SHARED_INTERMEDIATE_DIR"] = "$(OutDir)gen"


def PerformBuild(data, configurations, params):
    options = params["options"]
    msvs_version = params["msvs_version"]
    devenv = os.path.join(msvs_version.path, "Common7", "IDE", "devenv.com")

    for build_file, build_file_dict in data.items():
        (build_file_root, build_file_ext) = os.path.splitext(build_file)
        if build_file_ext != ".gyp":
            continue
        sln_path = build_file_root + options.suffix + ".sln"
        if options.generator_output:
            sln_path = os.path.join(options.generator_output, sln_path)

    for config in configurations:
        arguments = [devenv, sln_path, "/Build", config]
        print(f"Building [{config}]: {arguments}")
        subprocess.check_call(arguments)


def CalculateGeneratorInputInfo(params):
    if params.get("flavor") == "ninja":
        toplevel = params["options"].toplevel_dir
        qualified_out_dir = os.path.normpath(
            os.path.join(
                toplevel,
                ninja_generator.ComputeOutputDir(params),
                "gypfiles-msvs-ninja",
            )
        )

        global generator_filelist_paths
        generator_filelist_paths = {
            "toplevel": toplevel,
            "qualified_out_dir": qualified_out_dir,
        }


def GenerateOutput(target_list, target_dicts, data, params):
    """Generate .sln and .vcproj files.

  This is the entry point for this generator.
  Arguments:
    target_list: List of target pairs: 'base/base.gyp:base'.
    target_dicts: Dict of target properties keyed on target pair.
    data: Dictionary containing per .gyp data.
  """
    global fixpath_prefix

    options = params["options"]

    # Get the project file format version back out of where we stashed it in
    # GeneratorCalculatedVariables.
    msvs_version = params["msvs_version"]

    generator_flags = params.get("generator_flags", {})

    # Optionally shard targets marked with 'msvs_shard': SHARD_COUNT.
    (target_list, target_dicts) = MSVSUtil.ShardTargets(target_list, target_dicts)

    # Optionally use the large PDB workaround for targets marked with
    # 'msvs_large_pdb': 1.
    (target_list, target_dicts) = MSVSUtil.InsertLargePdbShims(
        target_list, target_dicts, generator_default_variables
    )

    # Optionally configure each spec to use ninja as the external builder.
    if params.get("flavor") == "ninja":
        _InitNinjaFlavor(params, target_list, target_dicts)

    # Prepare the set of configurations.
    configs = set()
    for qualified_target in target_list:
        spec = target_dicts[qualified_target]
        for config_name, config in spec["configurations"].items():
            config_name = _ConfigFullName(config_name, config)
            configs.add(config_name)
            if config_name == "Release|arm64":
                configs.add("Release|x64")
    configs = list(configs)

    # Figure out all the projects that will be generated and their guids
    project_objects = _CreateProjectObjects(
        target_list, target_dicts, options, msvs_version
    )

    # Generate each project.
    missing_sources = []
    for project in project_objects.values():
        fixpath_prefix = project.fixpath_prefix
        missing_sources.extend(
            _GenerateProject(project, options, msvs_version, generator_flags, spec)
        )
    fixpath_prefix = None

    for build_file in data:
        # Validate build_file extension
        target_only_configs = configs
        if generator_supports_multiple_toolsets:
            target_only_configs = [i for i in configs if i.endswith("arm64")]
        if not build_file.endswith(".gyp"):
            continue
        sln_path = os.path.splitext(build_file)[0] + options.suffix + ".sln"
        if options.generator_output:
            sln_path = os.path.join(options.generator_output, sln_path)
        # Get projects in the solution, and their dependents.
        sln_projects = gyp.common.BuildFileTargets(target_list, build_file)
        sln_projects += gyp.common.DeepDependencyTargets(target_dicts, sln_projects)
        # Create folder hierarchy.
        root_entries = _GatherSolutionFolders(
            sln_projects, project_objects, flat=msvs_version.FlatSolution()
        )
        # Create solution.
        sln = MSVSNew.MSVSSolution(
            sln_path,
            entries=root_entries,
            variants=target_only_configs,
            websiteProperties=False,
            version=msvs_version,
        )
        sln.Write()

    if missing_sources:
        error_message = "Missing input files:\n" + "\n".join(set(missing_sources))
        if generator_flags.get("msvs_error_on_missing_sources", False):
            raise GypError(error_message)
        else:
            print("Warning: " + error_message, file=sys.stdout)


def _GenerateMSBuildFiltersFile(
    filters_path,
    source_files,
    rule_dependencies,
    extension_to_rule_name,
    platforms,
    toolset,
):
    """Generate the filters file.

  This file is used by Visual Studio to organize the presentation of source
  files into folders.

  Arguments:
      filters_path: The path of the file to be created.
      source_files: The hierarchical structure of all the sources.
      extension_to_rule_name: A dictionary mapping file extensions to rules.
  """
    filter_group = []
    source_group = []
    _AppendFiltersForMSBuild(
        "",
        source_files,
        rule_dependencies,
        extension_to_rule_name,
        platforms,
        toolset,
        filter_group,
        source_group,
    )
    if filter_group:
        content = [
            "Project",
            {
                "ToolsVersion": "4.0",
                "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003",
            },
            ["ItemGroup"] + filter_group,
            ["ItemGroup"] + source_group,
        ]
        easy_xml.WriteXmlIfChanged(content, filters_path, pretty=True, win32=True)
    elif os.path.exists(filters_path):
        # We don't need this filter anymore.  Delete the old filter file.
        os.unlink(filters_path)


def _AppendFiltersForMSBuild(
    parent_filter_name,
    sources,
    rule_dependencies,
    extension_to_rule_name,
    platforms,
    toolset,
    filter_group,
    source_group,
):
    """Creates the list of filters and sources to be added in the filter file.

  Args:
      parent_filter_name: The name of the filter under which the sources are
          found.
      sources: The hierarchy of filters and sources to process.
      extension_to_rule_name: A dictionary mapping file extensions to rules.
      filter_group: The list to which filter entries will be appended.
      source_group: The list to which source entries will be appended.
  """
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            # We have a sub-filter.  Create the name of that sub-filter.
            if not parent_filter_name:
                filter_name = source.name
            else:
                filter_name = f"{parent_filter_name}\\{source.name}"
            # Add the filter to the group.
            filter_group.append(
                [
                    "Filter",
                    {"Include": filter_name},
                    ["UniqueIdentifier", MSVSNew.MakeGuid(source.name)],
                ]
            )
            # Recurse and add its dependents.
            _AppendFiltersForMSBuild(
                filter_name,
                source.contents,
                rule_dependencies,
                extension_to_rule_name,
                platforms,
                toolset,
                filter_group,
                source_group,
            )
        else:
            # It's a source.  Create a source entry.
            _, element = _MapFileToMsBuildSourceType(
                source, rule_dependencies, extension_to_rule_name, platforms, toolset
            )
            source_entry = [element, {"Include": source}]
            # Specify the filter it is part of, if any.
            if parent_filter_name:
                source_entry.append(["Filter", parent_filter_name])
            source_group.append(source_entry)


def _MapFileToMsBuildSourceType(
    source, rule_dependencies, extension_to_rule_name, platforms, toolset
):
    """Returns the group and element type of the source file.

  Arguments:
      source: The source file name.
      extension_to_rule_name: A dictionary mapping file extensions to rules.

  Returns:
      A pair of (group this file should be part of, the label of element)
  """
    _, ext = os.path.splitext(source)
    ext = ext.lower()
    if ext in extension_to_rule_name:
        group = "rule"
        element = extension_to_rule_name[ext]
    elif ext in [".cc", ".cpp", ".c", ".cxx", ".mm"]:
        group = "compile"
        element = "ClCompile"
    elif ext in [".h", ".hxx"]:
        group = "include"
        element = "ClInclude"
    elif ext == ".rc":
        group = "resource"
        element = "ResourceCompile"
    elif ext in [".s", ".asm"]:
        group = "masm"
        element = "MASM"
        if "arm64" in platforms and toolset == "target":
            element = "MARMASM"
    elif ext == ".idl":
        group = "midl"
        element = "Midl"
    elif source in rule_dependencies:
        group = "rule_dependency"
        element = "CustomBuild"
    else:
        group = "none"
        element = "None"
    return (group, element)


def _GenerateRulesForMSBuild(
    output_dir,
    options,
    spec,
    sources,
    excluded_sources,
    props_files_of_rules,
    targets_files_of_rules,
    actions_to_add,
    rule_dependencies,
    extension_to_rule_name,
):
    # MSBuild rules are implemented using three files: an XML file, a .targets
    # file and a .props file.
    # For more details see:
    # https://devblogs.microsoft.com/cppblog/quick-help-on-vs2010-custom-build-rule/
    rules = spec.get("rules", [])
    rules_native = [r for r in rules if not int(r.get("msvs_external_rule", 0))]
    rules_external = [r for r in rules if int(r.get("msvs_external_rule", 0))]

    msbuild_rules = []
    for rule in rules_native:
        # Skip a rule with no action and no inputs.
        if "action" not in rule and not rule.get("rule_sources", []):
            continue
        msbuild_rule = MSBuildRule(rule, spec)
        msbuild_rules.append(msbuild_rule)
        rule_dependencies.update(msbuild_rule.additional_dependencies.split(";"))
        extension_to_rule_name[msbuild_rule.extension] = msbuild_rule.rule_name
    if msbuild_rules:
        base = spec["target_name"] + options.suffix
        props_name = base + ".props"
        targets_name = base + ".targets"
        xml_name = base + ".xml"

        props_files_of_rules.add(props_name)
        targets_files_of_rules.add(targets_name)

        props_path = os.path.join(output_dir, props_name)
        targets_path = os.path.join(output_dir, targets_name)
        xml_path = os.path.join(output_dir, xml_name)

        _GenerateMSBuildRulePropsFile(props_path, msbuild_rules)
        _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules)
        _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules)

    if rules_external:
        _GenerateExternalRules(
            rules_external, output_dir, spec, sources, options, actions_to_add
        )
    _AdjustSourcesForRules(rules, sources, excluded_sources, True)


class MSBuildRule:
    """Used to store information used to generate an MSBuild rule.

  Attributes:
    rule_name: The rule name, sanitized to use in XML.
    target_name: The name of the target.
    after_targets: The name of the AfterTargets element.
    before_targets: The name of the BeforeTargets element.
    depends_on: The name of the DependsOn element.
    compute_output: The name of the ComputeOutput element.
    dirs_to_make: The name of the DirsToMake element.
    inputs: The name of the _inputs element.
    tlog: The name of the _tlog element.
    extension: The extension this rule applies to.
    description: The message displayed when this rule is invoked.
    additional_dependencies: A string listing additional dependencies.
    outputs: The outputs of this rule.
    command: The command used to run the rule.
  """

    def __init__(self, rule, spec):
        self.display_name = rule["rule_name"]
        # Assure that the rule name is only characters and numbers
        self.rule_name = re.sub(r"\W", "_", self.display_name)
        # Create the various element names, following the example set by the
        # Visual Studio 2008 to 2010 conversion.  I don't know if VS2010
        # is sensitive to the exact names.
        self.target_name = "_" + self.rule_name
        self.after_targets = self.rule_name + "AfterTargets"
        self.before_targets = self.rule_name + "BeforeTargets"
        self.depends_on = self.rule_name + "DependsOn"
        self.compute_output = "Compute%sOutput" % self.rule_name
        self.dirs_to_make = self.rule_name + "DirsToMake"
        self.inputs = self.rule_name + "_inputs"
        self.tlog = self.rule_name + "_tlog"
        self.extension = rule["extension"]
        if not self.extension.startswith("."):
            self.extension = "." + self.extension

        self.description = MSVSSettings.ConvertVCMacrosToMSBuild(
            rule.get("message", self.rule_name)
        )
        old_additional_dependencies = _FixPaths(rule.get("inputs", []))
        self.additional_dependencies = ";".join(
            [
                MSVSSettings.ConvertVCMacrosToMSBuild(i)
                for i in old_additional_dependencies
            ]
        )
        old_outputs = _FixPaths(rule.get("outputs", []))
        self.outputs = ";".join(
            [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in old_outputs]
        )
        old_command = _BuildCommandLineForRule(
            spec, rule, has_input_path=True, do_setup_env=True
        )
        self.command = MSVSSettings.ConvertVCMacrosToMSBuild(old_command)


def _GenerateMSBuildRulePropsFile(props_path, msbuild_rules):
    """Generate the .props file."""
    content = [
        "Project",
        {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"},
    ]
    for rule in msbuild_rules:
        content.extend(
            [
                [
                    "PropertyGroup",
                    {
                        "Condition": "'$(%s)' == '' and '$(%s)' == '' and "
                        "'$(ConfigurationType)' != 'Makefile'"
                        % (rule.before_targets, rule.after_targets)
                    },
                    [rule.before_targets, "Midl"],
                    [rule.after_targets, "CustomBuild"],
                ],
                [
                    "PropertyGroup",
                    [
                        rule.depends_on,
                        {"Condition": "'$(ConfigurationType)' != 'Makefile'"},
                        "_SelectedFiles;$(%s)" % rule.depends_on,
                    ],
                ],
                [
                    "ItemDefinitionGroup",
                    [
                        rule.rule_name,
                        ["CommandLineTemplate", rule.command],
                        ["Outputs", rule.outputs],
                        ["ExecutionDescription", rule.description],
                        ["AdditionalDependencies", rule.additional_dependencies],
                    ],
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, props_path, pretty=True, win32=True)


def _GenerateMSBuildRuleTargetsFile(targets_path, msbuild_rules):
    """Generate the .targets file."""
    content = [
        "Project",
        {"xmlns": "http://schemas.microsoft.com/developer/msbuild/2003"},
    ]
    item_group = [
        "ItemGroup",
        [
            "PropertyPageSchema",
            {"Include": "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"},
        ],
    ]
    for rule in msbuild_rules:
        item_group.append(
            [
                "AvailableItemName",
                {"Include": rule.rule_name},
                ["Targets", rule.target_name],
            ]
        )
    content.append(item_group)

    for rule in msbuild_rules:
        content.append(
            [
                "UsingTask",
                {
                    "TaskName": rule.rule_name,
                    "TaskFactory": "XamlTaskFactory",
                    "AssemblyName": "Microsoft.Build.Tasks.v4.0",
                },
                ["Task", "$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml"],
            ]
        )
    for rule in msbuild_rules:
        rule_name = rule.rule_name
        target_outputs = "%%(%s.Outputs)" % rule_name
        target_inputs = (
            "%%(%s.Identity);%%(%s.AdditionalDependencies);" "$(MSBuildProjectFile)"
        ) % (rule_name, rule_name)
        rule_inputs = "%%(%s.Identity)" % rule_name
        extension_condition = (
            "'%(Extension)'=='.obj' or "
            "'%(Extension)'=='.res' or "
            "'%(Extension)'=='.rsc' or "
            "'%(Extension)'=='.lib'"
        )
        remove_section = [
            "ItemGroup",
            {"Condition": "'@(SelectedFiles)' != ''"},
            [
                rule_name,
                {
                    "Remove": "@(%s)" % rule_name,
                    "Condition": "'%(Identity)' != '@(SelectedFiles)'",
                },
            ],
        ]
        inputs_section = [
            "ItemGroup",
            [rule.inputs, {"Include": "%%(%s.AdditionalDependencies)" % rule_name}],
        ]
        logging_section = [
            "ItemGroup",
            [
                rule.tlog,
                {
                    "Include": "%%(%s.Outputs)" % rule_name,
                    "Condition": (
                        "'%%(%s.Outputs)' != '' and "
                        "'%%(%s.ExcludedFromBuild)' != 'true'" % (rule_name, rule_name)
                    ),
                },
                ["Source", "@(%s, '|')" % rule_name],
                ["Inputs", "@(%s -> '%%(Fullpath)', ';')" % rule.inputs],
            ],
        ]
        message_section = [
            "Message",
            {"Importance": "High", "Text": "%%(%s.ExecutionDescription)" % rule_name},
        ]
        write_tlog_section = [
            "WriteLinesToFile",
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule.tlog, rule.tlog),
                "File": "$(IntDir)$(ProjectName).write.1.tlog",
                "Lines": "^%%(%s.Source);@(%s->'%%(Fullpath)')"
                % (rule.tlog, rule.tlog),
            },
        ]
        read_tlog_section = [
            "WriteLinesToFile",
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule.tlog, rule.tlog),
                "File": "$(IntDir)$(ProjectName).read.1.tlog",
                "Lines": f"^%({rule.tlog}.Source);%({rule.tlog}.Inputs)",
            },
        ]
        command_and_input_section = [
            rule_name,
            {
                "Condition": "'@(%s)' != '' and '%%(%s.ExcludedFromBuild)' != "
                "'true'" % (rule_name, rule_name),
                "EchoOff": "true",
                "StandardOutputImportance": "High",
                "StandardErrorImportance": "High",
                "CommandLineTemplate": "%%(%s.CommandLineTemplate)" % rule_name,
                "AdditionalOptions": "%%(%s.AdditionalOptions)" % rule_name,
                "Inputs": rule_inputs,
            },
        ]
        content.extend(
            [
                [
                    "Target",
                    {
                        "Name": rule.target_name,
                        "BeforeTargets": "$(%s)" % rule.before_targets,
                        "AfterTargets": "$(%s)" % rule.after_targets,
                        "Condition": "'@(%s)' != ''" % rule_name,
                        "DependsOnTargets": "$(%s);%s"
                        % (rule.depends_on, rule.compute_output),
                        "Outputs": target_outputs,
                        "Inputs": target_inputs,
                    },
                    remove_section,
                    inputs_section,
                    logging_section,
                    message_section,
                    write_tlog_section,
                    read_tlog_section,
                    command_and_input_section,
                ],
                [
                    "PropertyGroup",
                    [
                        "ComputeLinkInputsTargets",
                        "$(ComputeLinkInputsTargets);",
                        "%s;" % rule.compute_output,
                    ],
                    [
                        "ComputeLibInputsTargets",
                        "$(ComputeLibInputsTargets);",
                        "%s;" % rule.compute_output,
                    ],
                ],
                [
                    "Target",
                    {
                        "Name": rule.compute_output,
                        "Condition": "'@(%s)' != ''" % rule_name,
                    },
                    [
                        "ItemGroup",
                        [
                            rule.dirs_to_make,
                            {
                                "Condition": "'@(%s)' != '' and "
                                "'%%(%s.ExcludedFromBuild)' != 'true'"
                                % (rule_name, rule_name),
                                "Include": "%%(%s.Outputs)" % rule_name,
                            },
                        ],
                        [
                            "Link",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                        [
                            "Lib",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                        [
                            "ImpLib",
                            {
                                "Include": "%%(%s.Identity)" % rule.dirs_to_make,
                                "Condition": extension_condition,
                            },
                        ],
                    ],
                    [
                        "MakeDir",
                        {
                            "Directories": (
                                "@(%s->'%%(RootDir)%%(Directory)')" % rule.dirs_to_make
                            )
                        },
                    ],
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, targets_path, pretty=True, win32=True)


def _GenerateMSBuildRuleXmlFile(xml_path, msbuild_rules):
    # Generate the .xml file
    content = [
        "ProjectSchemaDefinitions",
        {
            "xmlns": (
                "clr-namespace:Microsoft.Build.Framework.XamlTypes;"
                "assembly=Microsoft.Build.Framework"
            ),
            "xmlns:x": "http://schemas.microsoft.com/winfx/2006/xaml",
            "xmlns:sys": "clr-namespace:System;assembly=mscorlib",
            "xmlns:transformCallback": "Microsoft.Cpp.Dev10.ConvertPropertyCallback",
        },
    ]
    for rule in msbuild_rules:
        content.extend(
            [
                [
                    "Rule",
                    {
                        "Name": rule.rule_name,
                        "PageTemplate": "tool",
                        "DisplayName": rule.display_name,
                        "Order": "200",
                    },
                    [
                        "Rule.DataSource",
                        [
                            "DataSource",
                            {"Persistence": "ProjectFile", "ItemType": rule.rule_name},
                        ],
                    ],
                    [
                        "Rule.Categories",
                        [
                            "Category",
                            {"Name": "General"},
                            ["Category.DisplayName", ["sys:String", "General"]],
                        ],
                        [
                            "Category",
                            {"Name": "Command Line", "Subtype": "CommandLine"},
                            ["Category.DisplayName", ["sys:String", "Command Line"]],
                        ],
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "Inputs",
                            "Category": "Command Line",
                            "IsRequired": "true",
                            "Switch": " ",
                        },
                        [
                            "StringListProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "ItemType": rule.rule_name,
                                    "SourceType": "Item",
                                },
                            ],
                        ],
                    ],
                    [
                        "StringProperty",
                        {
                            "Name": "CommandLineTemplate",
                            "DisplayName": "Command Line",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "DynamicEnumProperty",
                        {
                            "Name": rule.before_targets,
                            "Category": "General",
                            "EnumProvider": "Targets",
                            "IncludeInCommandLine": "False",
                        },
                        [
                            "DynamicEnumProperty.DisplayName",
                            ["sys:String", "Execute Before"],
                        ],
                        [
                            "DynamicEnumProperty.Description",
                            [
                                "sys:String",
                                "Specifies the targets for the build customization"
                                " to run before.",
                            ],
                        ],
                        [
                            "DynamicEnumProperty.ProviderSettings",
                            [
                                "NameValuePair",
                                {
                                    "Name": "Exclude",
                                    "Value": "^%s|^Compute" % rule.before_targets,
                                },
                            ],
                        ],
                        [
                            "DynamicEnumProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "HasConfigurationCondition": "true",
                                },
                            ],
                        ],
                    ],
                    [
                        "DynamicEnumProperty",
                        {
                            "Name": rule.after_targets,
                            "Category": "General",
                            "EnumProvider": "Targets",
                            "IncludeInCommandLine": "False",
                        },
                        [
                            "DynamicEnumProperty.DisplayName",
                            ["sys:String", "Execute After"],
                        ],
                        [
                            "DynamicEnumProperty.Description",
                            [
                                "sys:String",
                                (
                                    "Specifies the targets for the build customization"
                                    " to run after."
                                ),
                            ],
                        ],
                        [
                            "DynamicEnumProperty.ProviderSettings",
                            [
                                "NameValuePair",
                                {
                                    "Name": "Exclude",
                                    "Value": "^%s|^Compute" % rule.after_targets,
                                },
                            ],
                        ],
                        [
                            "DynamicEnumProperty.DataSource",
                            [
                                "DataSource",
                                {
                                    "Persistence": "ProjectFile",
                                    "ItemType": "",
                                    "HasConfigurationCondition": "true",
                                },
                            ],
                        ],
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "Outputs",
                            "DisplayName": "Outputs",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "StringProperty",
                        {
                            "Name": "ExecutionDescription",
                            "DisplayName": "Execution Description",
                            "Visible": "False",
                            "IncludeInCommandLine": "False",
                        },
                    ],
                    [
                        "StringListProperty",
                        {
                            "Name": "AdditionalDependencies",
                            "DisplayName": "Additional Dependencies",
                            "IncludeInCommandLine": "False",
                            "Visible": "false",
                        },
                    ],
                    [
                        "StringProperty",
                        {
                            "Subtype": "AdditionalOptions",
                            "Name": "AdditionalOptions",
                            "Category": "Command Line",
                        },
                        [
                            "StringProperty.DisplayName",
                            ["sys:String", "Additional Options"],
                        ],
                        [
                            "StringProperty.Description",
                            ["sys:String", "Additional Options"],
                        ],
                    ],
                ],
                [
                    "ItemType",
                    {"Name": rule.rule_name, "DisplayName": rule.display_name},
                ],
                [
                    "FileExtension",
                    {"Name": "*" + rule.extension, "ContentType": rule.rule_name},
                ],
                [
                    "ContentType",
                    {
                        "Name": rule.rule_name,
                        "DisplayName": "",
                        "ItemType": rule.rule_name,
                    },
                ],
            ]
        )
    easy_xml.WriteXmlIfChanged(content, xml_path, pretty=True, win32=True)


def _GetConfigurationAndPlatform(name, settings, spec):
    configuration = name.rsplit("_", 1)[0]
    platform = settings.get("msvs_configuration_platform", "Win32")
    if spec["toolset"] == "host" and platform == "arm64":
        platform = "x64"  # Host-only tools are always built for x64
    return (configuration, platform)


def _GetConfigurationCondition(name, settings, spec):
    return r"'$(Configuration)|$(Platform)'=='%s|%s'" % _GetConfigurationAndPlatform(
        name, settings, spec
    )


def _GetMSBuildProjectConfigurations(configurations, spec):
    group = ["ItemGroup", {"Label": "ProjectConfigurations"}]
    for (name, settings) in sorted(configurations.items()):
        configuration, platform = _GetConfigurationAndPlatform(name, settings, spec)
        designation = f"{configuration}|{platform}"
        group.append(
            [
                "ProjectConfiguration",
                {"Include": designation},
                ["Configuration", configuration],
                ["Platform", platform],
            ]
        )
    return [group]


def _GetMSBuildGlobalProperties(spec, version, guid, gyp_file_name):
    namespace = os.path.splitext(gyp_file_name)[0]
    properties = [
        [
            "PropertyGroup",
            {"Label": "Globals"},
            ["ProjectGuid", guid],
            ["Keyword", "Win32Proj"],
            ["RootNamespace", namespace],
            ["IgnoreWarnCompileDuplicatedFilename", "true"],
        ]
    ]

    if (
        os.environ.get("PROCESSOR_ARCHITECTURE") == "AMD64"
        or os.environ.get("PROCESSOR_ARCHITEW6432") == "AMD64"
    ):
        properties[0].append(["PreferredToolArchitecture", "x64"])

    if spec.get("msvs_target_platform_version"):
        target_platform_version = spec.get("msvs_target_platform_version")
        properties[0].append(["WindowsTargetPlatformVersion", target_platform_version])
        if spec.get("msvs_target_platform_minversion"):
            target_platform_minversion = spec.get("msvs_target_platform_minversion")
            properties[0].append(
                ["WindowsTargetPlatformMinVersion", target_platform_minversion]
            )
        else:
            properties[0].append(
                ["WindowsTargetPlatformMinVersion", target_platform_version]
            )

    if spec.get("msvs_enable_winrt"):
        properties[0].append(["DefaultLanguage", "en-US"])
        properties[0].append(["AppContainerApplication", "true"])
        if spec.get("msvs_application_type_revision"):
            app_type_revision = spec.get("msvs_application_type_revision")
            properties[0].append(["ApplicationTypeRevision", app_type_revision])
        else:
            properties[0].append(["ApplicationTypeRevision", "8.1"])
        if spec.get("msvs_enable_winphone"):
            properties[0].append(["ApplicationType", "Windows Phone"])
        else:
            properties[0].append(["ApplicationType", "Windows Store"])

    platform_name = None
    msvs_windows_sdk_version = None
    for configuration in spec["configurations"].values():
        platform_name = platform_name or _ConfigPlatform(configuration)
        msvs_windows_sdk_version = (
            msvs_windows_sdk_version
            or _ConfigWindowsTargetPlatformVersion(configuration, version)
        )
        if platform_name and msvs_windows_sdk_version:
            break
    if msvs_windows_sdk_version:
        properties[0].append(
            ["WindowsTargetPlatformVersion", str(msvs_windows_sdk_version)]
        )
    elif version.compatible_sdks:
        raise GypError(
            "%s requires any SDK of %s version, but none were found"
            % (version.description, version.compatible_sdks)
        )

    if platform_name == "ARM":
        properties[0].append(["WindowsSDKDesktopARMSupport", "true"])

    return properties


def _GetMSBuildConfigurationDetails(spec, build_file):
    properties = {}
    for name, settings in spec["configurations"].items():
        msbuild_attributes = _GetMSBuildAttributes(spec, settings, build_file)
        condition = _GetConfigurationCondition(name, settings, spec)
        character_set = msbuild_attributes.get("CharacterSet")
        vctools_version = msbuild_attributes.get("VCToolsVersion")
        config_type = msbuild_attributes.get("ConfigurationType")
        _AddConditionalProperty(properties, condition, "ConfigurationType", config_type)
        spectre_mitigation = msbuild_attributes.get('SpectreMitigation')
        if spectre_mitigation:
            _AddConditionalProperty(properties, condition, "SpectreMitigation",
                                    spectre_mitigation)
        if config_type == "Driver":
            _AddConditionalProperty(properties, condition, "DriverType", "WDM")
            _AddConditionalProperty(
                properties, condition, "TargetVersion", _ConfigTargetVersion(settings)
            )
        if character_set and "msvs_enable_winrt" not in spec:
            _AddConditionalProperty(
                properties, condition, "CharacterSet", character_set
            )
        if vctools_version and "msvs_enable_winrt" not in spec:
            _AddConditionalProperty(
                properties, condition, "VCToolsVersion", vctools_version
            )
    return _GetMSBuildPropertyGroup(spec, "Configuration", properties)


def _GetMSBuildLocalProperties(msbuild_toolset):
    # Currently the only local property we support is PlatformToolset
    properties = {}
    if msbuild_toolset:
        properties = [
            [
                "PropertyGroup",
                {"Label": "Locals"},
                ["PlatformToolset", msbuild_toolset],
            ]
        ]
    return properties


def _GetMSBuildPropertySheets(configurations, spec):
    user_props = r"$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props"
    additional_props = {}
    props_specified = False
    for name, settings in sorted(configurations.items()):
        configuration = _GetConfigurationCondition(name, settings, spec)
        if "msbuild_props" in settings:
            additional_props[configuration] = _FixPaths(settings["msbuild_props"])
            props_specified = True
        else:
            additional_props[configuration] = ""

    if not props_specified:
        return [
            [
                "ImportGroup",
                {"Label": "PropertySheets"},
                [
                    "Import",
                    {
                        "Project": user_props,
                        "Condition": "exists('%s')" % user_props,
                        "Label": "LocalAppDataPlatform",
                    },
                ],
            ]
        ]
    else:
        sheets = []
        for condition, props in additional_props.items():
            import_group = [
                "ImportGroup",
                {"Label": "PropertySheets", "Condition": condition},
                [
                    "Import",
                    {
                        "Project": user_props,
                        "Condition": "exists('%s')" % user_props,
                        "Label": "LocalAppDataPlatform",
                    },
                ],
            ]
            for props_file in props:
                import_group.append(["Import", {"Project": props_file}])
            sheets.append(import_group)
        return sheets


def _ConvertMSVSBuildAttributes(spec, config, build_file):
    config_type = _GetMSVSConfigurationType(spec, build_file)
    msvs_attributes = _GetMSVSAttributes(spec, config, config_type)
    msbuild_attributes = {}
    for a in msvs_attributes:
        if a in ["IntermediateDirectory", "OutputDirectory"]:
            directory = MSVSSettings.ConvertVCMacrosToMSBuild(msvs_attributes[a])
            if not directory.endswith("\\"):
                directory += "\\"
            msbuild_attributes[a] = directory
        elif a == "CharacterSet":
            msbuild_attributes[a] = _ConvertMSVSCharacterSet(msvs_attributes[a])
        elif a == "ConfigurationType":
            msbuild_attributes[a] = _ConvertMSVSConfigurationType(msvs_attributes[a])
        elif a == "SpectreMitigation":
            msbuild_attributes[a] = msvs_attributes[a]
        elif a == "VCToolsVersion":
            msbuild_attributes[a] = msvs_attributes[a]
        else:
            print("Warning: Do not know how to convert MSVS attribute " + a)
    return msbuild_attributes


def _ConvertMSVSCharacterSet(char_set):
    if char_set.isdigit():
        char_set = {"0": "MultiByte", "1": "Unicode", "2": "MultiByte"}[char_set]
    return char_set


def _ConvertMSVSConfigurationType(config_type):
    if config_type.isdigit():
        config_type = {
            "1": "Application",
            "2": "DynamicLibrary",
            "4": "StaticLibrary",
            "5": "Driver",
            "10": "Utility",
        }[config_type]
    return config_type


def _GetMSBuildAttributes(spec, config, build_file):
    if "msbuild_configuration_attributes" not in config:
        msbuild_attributes = _ConvertMSVSBuildAttributes(spec, config, build_file)

    else:
        config_type = _GetMSVSConfigurationType(spec, build_file)
        config_type = _ConvertMSVSConfigurationType(config_type)
        msbuild_attributes = config.get("msbuild_configuration_attributes", {})
        msbuild_attributes.setdefault("ConfigurationType", config_type)
        output_dir = msbuild_attributes.get(
            "OutputDirectory", "$(SolutionDir)$(Configuration)"
        )
        msbuild_attributes["OutputDirectory"] = _FixPath(output_dir) + "\\"
        if "IntermediateDirectory" not in msbuild_attributes:
            intermediate = _FixPath("$(Configuration)") + "\\"
            msbuild_attributes["IntermediateDirectory"] = intermediate
        if "CharacterSet" in msbuild_attributes:
            msbuild_attributes["CharacterSet"] = _ConvertMSVSCharacterSet(
                msbuild_attributes["CharacterSet"]
            )
    if "TargetName" not in msbuild_attributes:
        prefix = spec.get("product_prefix", "")
        product_name = spec.get("product_name", "$(ProjectName)")
        target_name = prefix + product_name
        msbuild_attributes["TargetName"] = target_name
    if "TargetExt" not in msbuild_attributes and "product_extension" in spec:
        ext = spec.get("product_extension")
        msbuild_attributes["TargetExt"] = "." + ext

    if spec.get("msvs_external_builder"):
        external_out_dir = spec.get("msvs_external_builder_out_dir", ".")
        msbuild_attributes["OutputDirectory"] = _FixPath(external_out_dir) + "\\"

    # Make sure that 'TargetPath' matches 'Lib.OutputFile' or 'Link.OutputFile'
    # (depending on the tool used) to avoid MSB8012 warning.
    msbuild_tool_map = {
        "executable": "Link",
        "shared_library": "Link",
        "loadable_module": "Link",
        "windows_driver": "Link",
        "static_library": "Lib",
    }
    msbuild_tool = msbuild_tool_map.get(spec["type"])
    if msbuild_tool:
        msbuild_settings = config["finalized_msbuild_settings"]
        out_file = msbuild_settings[msbuild_tool].get("OutputFile")
        if out_file:
            msbuild_attributes["TargetPath"] = _FixPath(out_file)
        target_ext = msbuild_settings[msbuild_tool].get("TargetExt")
        if target_ext:
            msbuild_attributes["TargetExt"] = target_ext

    return msbuild_attributes


def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file):
    # TODO(jeanluc) We could optimize out the following and do it only if
    # there are actions.
    # TODO(jeanluc) Handle the equivalent of setting 'CYGWIN=nontsec'.
    new_paths = []
    cygwin_dirs = spec.get("msvs_cygwin_dirs", ["."])[0]
    if cygwin_dirs:
        cyg_path = "$(MSBuildProjectDirectory)\\%s\\bin\\" % _FixPath(cygwin_dirs)
        new_paths.append(cyg_path)
        # TODO(jeanluc) Change the convention to have both a cygwin_dir and a
        # python_dir.
        python_path = cyg_path.replace("cygwin\\bin", "python_26")
        new_paths.append(python_path)
        if new_paths:
            new_paths = "$(ExecutablePath);" + ";".join(new_paths)

    properties = {}
    for (name, configuration) in sorted(configurations.items()):
        condition = _GetConfigurationCondition(name, configuration, spec)
        attributes = _GetMSBuildAttributes(spec, configuration, build_file)
        msbuild_settings = configuration["finalized_msbuild_settings"]
        _AddConditionalProperty(
            properties, condition, "IntDir", attributes["IntermediateDirectory"]
        )
        _AddConditionalProperty(
            properties, condition, "OutDir", attributes["OutputDirectory"]
        )
        _AddConditionalProperty(
            properties, condition, "TargetName", attributes["TargetName"]
        )
        if "TargetExt" in attributes:
            _AddConditionalProperty(
                properties, condition, "TargetExt", attributes["TargetExt"]
            )

        if attributes.get("TargetPath"):
            _AddConditionalProperty(
                properties, condition, "TargetPath", attributes["TargetPath"]
            )
        if attributes.get("TargetExt"):
            _AddConditionalProperty(
                properties, condition, "TargetExt", attributes["TargetExt"]
            )

        if new_paths:
            _AddConditionalProperty(properties, condition, "ExecutablePath", new_paths)
        tool_settings = msbuild_settings.get("", {})
        for name, value in sorted(tool_settings.items()):
            formatted_value = _GetValueFormattedForMSBuild("", name, value)
            _AddConditionalProperty(properties, condition, name, formatted_value)
    return _GetMSBuildPropertyGroup(spec, None, properties)


def _AddConditionalProperty(properties, condition, name, value):
    """Adds a property / conditional value pair to a dictionary.

  Arguments:
    properties: The dictionary to be modified.  The key is the name of the
        property.  The value is itself a dictionary; its key is the value and
        the value a list of condition for which this value is true.
    condition: The condition under which the named property has the value.
    name: The name of the property.
    value: The value of the property.
  """
    if name not in properties:
        properties[name] = {}
    values = properties[name]
    if value not in values:
        values[value] = []
    conditions = values[value]
    conditions.append(condition)


# Regex for msvs variable references ( i.e. $(FOO) ).
MSVS_VARIABLE_REFERENCE = re.compile(r"\$\(([a-zA-Z_][a-zA-Z0-9_]*)\)")


def _GetMSBuildPropertyGroup(spec, label, properties):
    """Returns a PropertyGroup definition for the specified properties.

  Arguments:
    spec: The target project dict.
    label: An optional label for the PropertyGroup.
    properties: The dictionary to be converted.  The key is the name of the
        property.  The value is itself a dictionary; its key is the value and
        the value a list of condition for which this value is true.
  """
    group = ["PropertyGroup"]
    if label:
        group.append({"Label": label})
    num_configurations = len(spec["configurations"])

    def GetEdges(node):
        # Use a definition of edges such that user_of_variable -> used_varible.
        # This happens to be easier in this case, since a variable's
        # definition contains all variables it references in a single string.
        edges = set()
        for value in sorted(properties[node].keys()):
            # Add to edges all $(...) references to variables.
            #
            # Variable references that refer to names not in properties are excluded
            # These can exist for instance to refer built in definitions like
            # $(SolutionDir).
            #
            # Self references are ignored. Self reference is used in a few places to
            # append to the default value. I.e. PATH=$(PATH);other_path
            edges.update(
                {
                    v
                    for v in MSVS_VARIABLE_REFERENCE.findall(value)
                    if v in properties and v != node
                }
            )
        return edges

    properties_ordered = gyp.common.TopologicallySorted(properties.keys(), GetEdges)
    # Walk properties in the reverse of a topological sort on
    # user_of_variable -> used_variable as this ensures variables are
    # defined before they are used.
    # NOTE: reverse(topsort(DAG)) = topsort(reverse_edges(DAG))
    for name in reversed(properties_ordered):
        values = properties[name]
        for value, conditions in sorted(values.items()):
            if len(conditions) == num_configurations:
                # If the value is the same all configurations,
                # just add one unconditional entry.
                group.append([name, value])
            else:
                for condition in conditions:
                    group.append([name, {"Condition": condition}, value])
    return [group]


def _GetMSBuildToolSettingsSections(spec, configurations):
    groups = []
    for (name, configuration) in sorted(configurations.items()):
        msbuild_settings = configuration["finalized_msbuild_settings"]
        group = [
            "ItemDefinitionGroup",
            {"Condition": _GetConfigurationCondition(name, configuration, spec)},
        ]
        for tool_name, tool_settings in sorted(msbuild_settings.items()):
            # Skip the tool named '' which is a holder of global settings handled
            # by _GetMSBuildConfigurationGlobalProperties.
            if tool_name and tool_settings:
                tool = [tool_name]
                for name, value in sorted(tool_settings.items()):
                    formatted_value = _GetValueFormattedForMSBuild(
                        tool_name, name, value
                    )
                    tool.append([name, formatted_value])
                group.append(tool)
        groups.append(group)
    return groups


def _FinalizeMSBuildSettings(spec, configuration):
    if "msbuild_settings" in configuration:
        converted = False
        msbuild_settings = configuration["msbuild_settings"]
        MSVSSettings.ValidateMSBuildSettings(msbuild_settings)
    else:
        converted = True
        msvs_settings = configuration.get("msvs_settings", {})
        msbuild_settings = MSVSSettings.ConvertToMSBuildSettings(msvs_settings)
    include_dirs, midl_include_dirs, resource_include_dirs = _GetIncludeDirs(
        configuration
    )
    libraries = _GetLibraries(spec)
    library_dirs = _GetLibraryDirs(configuration)
    out_file, _, msbuild_tool = _GetOutputFilePathAndTool(spec, msbuild=True)
    target_ext = _GetOutputTargetExt(spec)
    defines = _GetDefines(configuration)
    if converted:
        # Visual Studio 2010 has TR1
        defines = [d for d in defines if d != "_HAS_TR1=0"]
        # Warn of ignored settings
        ignored_settings = ["msvs_tool_files"]
        for ignored_setting in ignored_settings:
            value = configuration.get(ignored_setting)
            if value:
                print(
                    "Warning: The automatic conversion to MSBuild does not handle "
                    "%s.  Ignoring setting of %s" % (ignored_setting, str(value))
                )

    defines = [_EscapeCppDefineForMSBuild(d) for d in defines]
    disabled_warnings = _GetDisabledWarnings(configuration)
    prebuild = configuration.get("msvs_prebuild")
    postbuild = configuration.get("msvs_postbuild")
    def_file = _GetModuleDefinition(spec)
    precompiled_header = configuration.get("msvs_precompiled_header")

    # Add the information to the appropriate tool
    # TODO(jeanluc) We could optimize and generate these settings only if
    # the corresponding files are found, e.g. don't generate ResourceCompile
    # if you don't have any resources.
    _ToolAppend(
        msbuild_settings, "ClCompile", "AdditionalIncludeDirectories", include_dirs
    )
    _ToolAppend(
        msbuild_settings, "Midl", "AdditionalIncludeDirectories", midl_include_dirs
    )
    _ToolAppend(
        msbuild_settings,
        "ResourceCompile",
        "AdditionalIncludeDirectories",
        resource_include_dirs,
    )
    # Add in libraries, note that even for empty libraries, we want this
    # set, to prevent inheriting default libraries from the environment.
    _ToolSetOrAppend(msbuild_settings, "Link", "AdditionalDependencies", libraries)
    _ToolAppend(msbuild_settings, "Link", "AdditionalLibraryDirectories", library_dirs)
    if out_file:
        _ToolAppend(
            msbuild_settings, msbuild_tool, "OutputFile", out_file, only_if_unset=True
        )
    if target_ext:
        _ToolAppend(
            msbuild_settings, msbuild_tool, "TargetExt", target_ext, only_if_unset=True
        )
    # Add defines.
    _ToolAppend(msbuild_settings, "ClCompile", "PreprocessorDefinitions", defines)
    _ToolAppend(msbuild_settings, "ResourceCompile", "PreprocessorDefinitions", defines)
    # Add disabled warnings.
    _ToolAppend(
        msbuild_settings, "ClCompile", "DisableSpecificWarnings", disabled_warnings
    )
    # Turn on precompiled headers if appropriate.
    if precompiled_header:
        precompiled_header = os.path.split(precompiled_header)[1]
        _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "Use")
        _ToolAppend(
            msbuild_settings, "ClCompile", "PrecompiledHeaderFile", precompiled_header
        )
        _ToolAppend(
            msbuild_settings, "ClCompile", "ForcedIncludeFiles", [precompiled_header]
        )
    else:
        _ToolAppend(msbuild_settings, "ClCompile", "PrecompiledHeader", "NotUsing")
    # Turn off WinRT compilation
    _ToolAppend(msbuild_settings, "ClCompile", "CompileAsWinRT", "false")
    # Turn on import libraries if appropriate
    if spec.get("msvs_requires_importlibrary"):
        _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "false")
    # Loadable modules don't generate import libraries;
    # tell dependent projects to not expect one.
    if spec["type"] == "loadable_module":
        _ToolAppend(msbuild_settings, "", "IgnoreImportLibrary", "true")
    # Set the module definition file if any.
    if def_file:
        _ToolAppend(msbuild_settings, "Link", "ModuleDefinitionFile", def_file)
    configuration["finalized_msbuild_settings"] = msbuild_settings
    if prebuild:
        _ToolAppend(msbuild_settings, "PreBuildEvent", "Command", prebuild)
    if postbuild:
        _ToolAppend(msbuild_settings, "PostBuildEvent", "Command", postbuild)


def _GetValueFormattedForMSBuild(tool_name, name, value):
    if type(value) == list:
        # For some settings, VS2010 does not automatically extends the settings
        # TODO(jeanluc) Is this what we want?
        if name in [
            "AdditionalIncludeDirectories",
            "AdditionalLibraryDirectories",
            "AdditionalOptions",
            "DelayLoadDLLs",
            "DisableSpecificWarnings",
            "PreprocessorDefinitions",
        ]:
            value.append("%%(%s)" % name)
        # For most tools, entries in a list should be separated with ';' but some
        # settings use a space.  Check for those first.
        exceptions = {
            "ClCompile": ["AdditionalOptions"],
            "Link": ["AdditionalOptions"],
            "Lib": ["AdditionalOptions"],
        }
        char = " " if name in exceptions.get(tool_name, []) else ";"
        formatted_value = char.join(
            [MSVSSettings.ConvertVCMacrosToMSBuild(i) for i in value]
        )
    else:
        formatted_value = MSVSSettings.ConvertVCMacrosToMSBuild(value)
    return formatted_value


def _VerifySourcesExist(sources, root_dir):
    """Verifies that all source files exist on disk.

  Checks that all regular source files, i.e. not created at run time,
  exist on disk.  Missing files cause needless recompilation but no otherwise
  visible errors.

  Arguments:
    sources: A recursive list of Filter/file names.
    root_dir: The root directory for the relative path names.
  Returns:
    A list of source files that cannot be found on disk.
  """
    missing_sources = []
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            missing_sources.extend(_VerifySourcesExist(source.contents, root_dir))
        else:
            if "$" not in source:
                full_path = os.path.join(root_dir, source)
                if not os.path.exists(full_path):
                    missing_sources.append(full_path)
    return missing_sources


def _GetMSBuildSources(
    spec,
    sources,
    exclusions,
    rule_dependencies,
    extension_to_rule_name,
    actions_spec,
    sources_handled_by_action,
    list_excluded,
):
    groups = [
        "none",
        "masm",
        "midl",
        "include",
        "compile",
        "resource",
        "rule",
        "rule_dependency",
    ]
    grouped_sources = {}
    for g in groups:
        grouped_sources[g] = []

    _AddSources2(
        spec,
        sources,
        exclusions,
        grouped_sources,
        rule_dependencies,
        extension_to_rule_name,
        sources_handled_by_action,
        list_excluded,
    )
    sources = []
    for g in groups:
        if grouped_sources[g]:
            sources.append(["ItemGroup"] + grouped_sources[g])
    if actions_spec:
        sources.append(["ItemGroup"] + actions_spec)
    return sources


def _AddSources2(
    spec,
    sources,
    exclusions,
    grouped_sources,
    rule_dependencies,
    extension_to_rule_name,
    sources_handled_by_action,
    list_excluded,
):
    extensions_excluded_from_precompile = []
    for source in sources:
        if isinstance(source, MSVSProject.Filter):
            _AddSources2(
                spec,
                source.contents,
                exclusions,
                grouped_sources,
                rule_dependencies,
                extension_to_rule_name,
                sources_handled_by_action,
                list_excluded,
            )
        else:
            if source not in sources_handled_by_action:
                detail = []
                excluded_configurations = exclusions.get(source, [])
                if len(excluded_configurations) == len(spec["configurations"]):
                    detail.append(["ExcludedFromBuild", "true"])
                else:
                    for config_name, configuration in sorted(excluded_configurations):
                        condition = _GetConfigurationCondition(
                            config_name, configuration
                        )
                        detail.append(
                            ["ExcludedFromBuild", {"Condition": condition}, "true"]
                        )
                # Add precompile if needed
                for config_name, configuration in spec["configurations"].items():
                    precompiled_source = configuration.get(
                        "msvs_precompiled_source", ""
                    )
                    if precompiled_source != "":
                        precompiled_source = _FixPath(precompiled_source)
                        if not extensions_excluded_from_precompile:
                            # If the precompiled header is generated by a C source,
                            # we must not try to use it for C++ sources,
                            # and vice versa.
                            basename, extension = os.path.splitext(precompiled_source)
                            if extension == ".c":
                                extensions_excluded_from_precompile = [
                                    ".cc",
                                    ".cpp",
                                    ".cxx",
                                ]
                            else:
                                extensions_excluded_from_precompile = [".c"]

                    if precompiled_source == source:
                        condition = _GetConfigurationCondition(
                            config_name, configuration, spec
                        )
                        detail.append(
                            ["PrecompiledHeader", {"Condition": condition}, "Create"]
                        )
                    else:
                        # Turn off precompiled header usage for source files of a
                        # different type than the file that generated the
                        # precompiled header.
                        for extension in extensions_excluded_from_precompile:
                            if source.endswith(extension):
                                detail.append(["PrecompiledHeader", ""])
                                detail.append(["ForcedIncludeFiles", ""])

                group, element = _MapFileToMsBuildSourceType(
                    source,
                    rule_dependencies,
                    extension_to_rule_name,
                    _GetUniquePlatforms(spec),
                    spec["toolset"],
                )
                if group == "compile" and not os.path.isabs(source):
                    # Add an <ObjectFileName> value to support duplicate source
                    # file basenames, except for absolute paths to avoid paths
                    # with more than 260 characters.
                    file_name = os.path.splitext(source)[0] + ".obj"
                    if file_name.startswith("..\\"):
                        file_name = re.sub(r"^(\.\.\\)+", "", file_name)
                    elif file_name.startswith("$("):
                        file_name = re.sub(r"^\$\([^)]+\)\\", "", file_name)
                    detail.append(["ObjectFileName", "$(IntDir)\\" + file_name])
                grouped_sources[group].append([element, {"Include": source}] + detail)


def _GetMSBuildProjectReferences(project):
    references = []
    if project.dependencies:
        group = ["ItemGroup"]
        added_dependency_set = set()
        for dependency in project.dependencies:
            dependency_spec = dependency.spec
            should_skip_dep = False
            if project.spec["toolset"] == "target":
                if dependency_spec["toolset"] == "host":
                    if dependency_spec["type"] == "static_library":
                        should_skip_dep = True
            if dependency.name.startswith("run_"):
                should_skip_dep = False
            if should_skip_dep:
                continue

            canonical_name = dependency.name.replace("_host", "")
            added_dependency_set.add(canonical_name)
            guid = dependency.guid
            project_dir = os.path.split(project.path)[0]
            relative_path = gyp.common.RelativePath(dependency.path, project_dir)
            project_ref = [
                "ProjectReference",
                {"Include": relative_path},
                ["Project", guid],
                ["ReferenceOutputAssembly", "false"],
            ]
            for config in dependency.spec.get("configurations", {}).values():
                if config.get("msvs_use_library_dependency_inputs", 0):
                    project_ref.append(["UseLibraryDependencyInputs", "true"])
                    break
                # If it's disabled in any config, turn it off in the reference.
                if config.get("msvs_2010_disable_uldi_when_referenced", 0):
                    project_ref.append(["UseLibraryDependencyInputs", "false"])
                    break
            group.append(project_ref)
        references.append(group)
    return references


def _GenerateMSBuildProject(project, options, version, generator_flags, spec):
    spec = project.spec
    configurations = spec["configurations"]
    toolset = spec["toolset"]
    project_dir, project_file_name = os.path.split(project.path)
    gyp.common.EnsureDirExists(project.path)
    # Prepare list of sources and excluded sources.

    gyp_file = os.path.split(project.build_file)[1]
    sources, excluded_sources = _PrepareListOfSources(spec, generator_flags, gyp_file)
    # Add rules.
    actions_to_add = {}
    props_files_of_rules = set()
    targets_files_of_rules = set()
    rule_dependencies = set()
    extension_to_rule_name = {}
    list_excluded = generator_flags.get("msvs_list_excluded_files", True)
    platforms = _GetUniquePlatforms(spec)

    # Don't generate rules if we are using an external builder like ninja.
    if not spec.get("msvs_external_builder"):
        _GenerateRulesForMSBuild(
            project_dir,
            options,
            spec,
            sources,
            excluded_sources,
            props_files_of_rules,
            targets_files_of_rules,
            actions_to_add,
            rule_dependencies,
            extension_to_rule_name,
        )
    else:
        rules = spec.get("rules", [])
        _AdjustSourcesForRules(rules, sources, excluded_sources, True)

    sources, excluded_sources, excluded_idl = _AdjustSourcesAndConvertToFilterHierarchy(
        spec, options, project_dir, sources, excluded_sources, list_excluded, version
    )

    # Don't add actions if we are using an external builder like ninja.
    if not spec.get("msvs_external_builder"):
        _AddActions(actions_to_add, spec, project.build_file)
        _AddCopies(actions_to_add, spec)

        # NOTE: this stanza must appear after all actions have been decided.
        # Don't excluded sources with actions attached, or they won't run.
        excluded_sources = _FilterActionsFromExcluded(excluded_sources, actions_to_add)

    exclusions = _GetExcludedFilesFromBuild(spec, excluded_sources, excluded_idl)
    actions_spec, sources_handled_by_action = _GenerateActionsForMSBuild(
        spec, actions_to_add
    )

    _GenerateMSBuildFiltersFile(
        project.path + ".filters",
        sources,
        rule_dependencies,
        extension_to_rule_name,
        platforms,
        toolset,
    )
    missing_sources = _VerifySourcesExist(sources, project_dir)

    for configuration in configurations.values():
        _FinalizeMSBuildSettings(spec, configuration)

    # Add attributes to root element

    import_default_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.Default.props"}]
    ]
    import_cpp_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.props"}]
    ]
    import_cpp_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\Microsoft.Cpp.targets"}]
    ]
    import_masm_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.props"}]
    ]
    import_masm_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\masm.targets"}]
    ]
    import_marmasm_props_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.props"}]
    ]
    import_marmasm_targets_section = [
        ["Import", {"Project": r"$(VCTargetsPath)\BuildCustomizations\marmasm.targets"}]
    ]
    macro_section = [["PropertyGroup", {"Label": "UserMacros"}]]

    content = [
        "Project",
        {
            "xmlns": "http://schemas.microsoft.com/developer/msbuild/2003",
            "ToolsVersion": version.ProjectVersion(),
            "DefaultTargets": "Build",
        },
    ]

    content += _GetMSBuildProjectConfigurations(configurations, spec)
    content += _GetMSBuildGlobalProperties(
        spec, version, project.guid, project_file_name
    )
    content += import_default_section
    content += _GetMSBuildConfigurationDetails(spec, project.build_file)
    if spec.get("msvs_enable_winphone"):
        content += _GetMSBuildLocalProperties("v120_wp81")
    else:
        content += _GetMSBuildLocalProperties(project.msbuild_toolset)
    content += import_cpp_props_section
    content += import_masm_props_section
    if "arm64" in platforms and toolset == "target":
        content += import_marmasm_props_section
    content += _GetMSBuildExtensions(props_files_of_rules)
    content += _GetMSBuildPropertySheets(configurations, spec)
    content += macro_section
    content += _GetMSBuildConfigurationGlobalProperties(
        spec, configurations, project.build_file
    )
    content += _GetMSBuildToolSettingsSections(spec, configurations)
    content += _GetMSBuildSources(
        spec,
        sources,
        exclusions,
        rule_dependencies,
        extension_to_rule_name,
        actions_spec,
        sources_handled_by_action,
        list_excluded,
    )
    content += _GetMSBuildProjectReferences(project)
    content += import_cpp_targets_section
    content += import_masm_targets_section
    if "arm64" in platforms and toolset == "target":
        content += import_marmasm_targets_section
    content += _GetMSBuildExtensionTargets(targets_files_of_rules)

    if spec.get("msvs_external_builder"):
        content += _GetMSBuildExternalBuilderTargets(spec)

    # TODO(jeanluc) File a bug to get rid of runas.  We had in MSVS:
    # has_run_as = _WriteMSVSUserFile(project.path, version, spec)

    easy_xml.WriteXmlIfChanged(content, project.path, pretty=True, win32=True)

    return missing_sources


def _GetMSBuildExternalBuilderTargets(spec):
    """Return a list of MSBuild targets for external builders.

  The "Build" and "Clean" targets are always generated.  If the spec contains
  'msvs_external_builder_clcompile_cmd', then the "ClCompile" target will also
  be generated, to support building selected C/C++ files.

  Arguments:
    spec: The gyp target spec.
  Returns:
    List of MSBuild 'Target' specs.
  """
    build_cmd = _BuildCommandLineForRuleRaw(
        spec, spec["msvs_external_builder_build_cmd"], False, False, False, False
    )
    build_target = ["Target", {"Name": "Build"}]
    build_target.append(["Exec", {"Command": build_cmd}])

    clean_cmd = _BuildCommandLineForRuleRaw(
        spec, spec["msvs_external_builder_clean_cmd"], False, False, False, False
    )
    clean_target = ["Target", {"Name": "Clean"}]
    clean_target.append(["Exec", {"Command": clean_cmd}])

    targets = [build_target, clean_target]

    if spec.get("msvs_external_builder_clcompile_cmd"):
        clcompile_cmd = _BuildCommandLineForRuleRaw(
            spec,
            spec["msvs_external_builder_clcompile_cmd"],
            False,
            False,
            False,
            False,
        )
        clcompile_target = ["Target", {"Name": "ClCompile"}]
        clcompile_target.append(["Exec", {"Command": clcompile_cmd}])
        targets.append(clcompile_target)

    return targets


def _GetMSBuildExtensions(props_files_of_rules):
    extensions = ["ImportGroup", {"Label": "ExtensionSettings"}]
    for props_file in props_files_of_rules:
        extensions.append(["Import", {"Project": props_file}])
    return [extensions]


def _GetMSBuildExtensionTargets(targets_files_of_rules):
    targets_node = ["ImportGroup", {"Label": "ExtensionTargets"}]
    for targets_file in sorted(targets_files_of_rules):
        targets_node.append(["Import", {"Project": targets_file}])
    return [targets_node]


def _GenerateActionsForMSBuild(spec, actions_to_add):
    """Add actions accumulated into an actions_to_add, merging as needed.

  Arguments:
    spec: the target project dict
    actions_to_add: dictionary keyed on input name, which maps to a list of
        dicts describing the actions attached to that input file.

  Returns:
    A pair of (action specification, the sources handled by this action).
  """
    sources_handled_by_action = OrderedSet()
    actions_spec = []
    for primary_input, actions in actions_to_add.items():
        if generator_supports_multiple_toolsets:
            primary_input = primary_input.replace(".exe", "_host.exe")
        inputs = OrderedSet()
        outputs = OrderedSet()
        descriptions = []
        commands = []
        for action in actions:

            def fixup_host_exe(i):
                if "$(OutDir)" in i:
                    i = i.replace(".exe", "_host.exe")
                return i

            if generator_supports_multiple_toolsets:
                action["inputs"] = [fixup_host_exe(i) for i in action["inputs"]]
            inputs.update(OrderedSet(action["inputs"]))
            outputs.update(OrderedSet(action["outputs"]))
            descriptions.append(action["description"])
            cmd = action["command"]
            if generator_supports_multiple_toolsets:
                cmd = cmd.replace(".exe", "_host.exe")
            # For most actions, add 'call' so that actions that invoke batch files
            # return and continue executing.  msbuild_use_call provides a way to
            # disable this but I have not seen any adverse effect from doing that
            # for everything.
            if action.get("msbuild_use_call", True):
                cmd = "call " + cmd
            commands.append(cmd)
        # Add the custom build action for one input file.
        description = ", and also ".join(descriptions)

        # We can't join the commands simply with && because the command line will
        # get too long. See also _AddActions: cygwin's setup_env mustn't be called
        # for every invocation or the command that sets the PATH will grow too
        # long.
        command = "\r\n".join(
            [c + "\r\nif %errorlevel% neq 0 exit /b %errorlevel%" for c in commands]
        )
        _AddMSBuildAction(
            spec,
            primary_input,
            inputs,
            outputs,
            command,
            description,
            sources_handled_by_action,
            actions_spec,
        )
    return actions_spec, sources_handled_by_action


def _AddMSBuildAction(
    spec,
    primary_input,
    inputs,
    outputs,
    cmd,
    description,
    sources_handled_by_action,
    actions_spec,
):
    command = MSVSSettings.ConvertVCMacrosToMSBuild(cmd)
    primary_input = _FixPath(primary_input)
    inputs_array = _FixPaths(inputs)
    outputs_array = _FixPaths(outputs)
    additional_inputs = ";".join([i for i in inputs_array if i != primary_input])
    outputs = ";".join(outputs_array)
    sources_handled_by_action.add(primary_input)
    action_spec = ["CustomBuild", {"Include": primary_input}]
    action_spec.extend(
        # TODO(jeanluc) 'Document' for all or just if as_sources?
        [
            ["FileType", "Document"],
            ["Command", command],
            ["Message", description],
            ["Outputs", outputs],
        ]
    )
    if additional_inputs:
        action_spec.append(["AdditionalInputs", additional_inputs])
    actions_spec.append(action_spec)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    s" | "minus" | null;
    }): namedTypes.ClassPrivateProperty;
}
export interface ClassMethodBuilder {
    (kind: "get" | "set" | "method" | "constructor" | undefined, key: K.LiteralKind | K.IdentifierKind | K.ExpressionKind, params: K.PatternKind[], body: K.BlockStatementKind, computed?: boolean, staticParam?: boolean | null): namedTypes.ClassMethod;
    from(params: {
        abstract?: boolean | null;
        access?: "public" | "private" | "protected" | null;
        accessibility?: "public" | "private" | "protected" | null;
        async?: boolean;
        body: K.BlockStatementKind;
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        decorators?: K.DecoratorKind[] | null;
        defaults?: (K.ExpressionKind | null)[];
        expression?: boolean;
        generator?: boolean;
        id?: K.IdentifierKind | null;
        key: K.LiteralKind | K.IdentifierKind | K.ExpressionKind;
        kind?: "get" | "set" | "method" | "constructor";
        loc?: K.SourceLocationKind | null;
        optional?: boolean | null;
        params: K.PatternKind[];
        rest?: K.IdentifierKind | null;
        returnType?: K.TypeAnnotationKind | K.TSTypeAnnotationKind | null;
        static?: boolean | null;
        typeParameters?: K.TypeParameterDeclarationKind | K.TSTypeParameterDeclarationKind | null;
    }): namedTypes.ClassMethod;
}
export interface ClassPrivateMethodBuilder {
    (key: K.PrivateNameKind, params: K.PatternKind[], body: K.BlockStatementKind, kind?: "get" | "set" | "method" | "constructor", computed?: boolean, staticParam?: boolean | null): namedTypes.ClassPrivateMethod;
    from(params: {
        abstract?: boolean | null;
        access?: "public" | "private" | "protected" | null;
        accessibility?: "public" | "private" | "protected" | null;
        async?: boolean;
        body: K.BlockStatementKind;
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        decorators?: K.DecoratorKind[] | null;
        defaults?: (K.ExpressionKind | null)[];
        expression?: boolean;
        generator?: boolean;
        id?: K.IdentifierKind | null;
        key: K.PrivateNameKind;
        kind?: "get" | "set" | "method" | "constructor";
        loc?: K.SourceLocationKind | null;
        optional?: boolean | null;
        params: K.PatternKind[];
        rest?: K.IdentifierKind | null;
        returnType?: K.TypeAnnotationKind | K.TSTypeAnnotationKind | null;
        static?: boolean | null;
        typeParameters?: K.TypeParameterDeclarationKind | K.TSTypeParameterDeclarationKind | null;
    }): namedTypes.ClassPrivateMethod;
}
export interface PrivateNameBuilder {
    (id: K.IdentifierKind): namedTypes.PrivateName;
    from(params: {
        comments?: K.CommentKind[] | null;
        id: K.IdentifierKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.PrivateName;
}
export interface RestPropertyBuilder {
    (argument: K.ExpressionKind): namedTypes.RestProperty;
    from(params: {
        argument: K.ExpressionKind;
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.RestProperty;
}
export interface ForAwaitStatementBuilder {
    (left: K.VariableDeclarationKind | K.ExpressionKind, right: K.ExpressionKind, body: K.StatementKind): namedTypes.ForAwaitStatement;
    from(params: {
        body: K.StatementKind;
        comments?: K.CommentKind[] | null;
        left: K.VariableDeclarationKind | K.ExpressionKind;
        loc?: K.SourceLocationKind | null;
        right: K.ExpressionKind;
    }): namedTypes.ForAwaitStatement;
}
export interface ImportBuilder {
    (): namedTypes.Import;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.Import;
}
export interface TSQualifiedNameBuilder {
    (left: K.IdentifierKind | K.TSQualifiedNameKind, right: K.IdentifierKind | K.TSQualifiedNameKind): namedTypes.TSQualifiedName;
    from(params: {
        comments?: K.CommentKind[] | null;
        left: K.IdentifierKind | K.TSQualifiedNameKind;
        loc?: K.SourceLocationKind | null;
        right: K.IdentifierKind | K.TSQualifiedNameKind;
    }): namedTypes.TSQualifiedName;
}
export interface TSTypeReferenceBuilder {
    (typeName: K.IdentifierKind | K.TSQualifiedNameKind, typeParameters?: K.TSTypeParameterInstantiationKind | null): namedTypes.TSTypeReference;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        typeName: K.IdentifierKind | K.TSQualifiedNameKind;
        typeParameters?: K.TSTypeParameterInstantiationKind | null;
    }): namedTypes.TSTypeReference;
}
export interface TSAsExpressionBuilder {
    (expression: K.ExpressionKind, typeAnnotation: K.TSTypeKind): namedTypes.TSAsExpression;
    from(params: {
        comments?: K.CommentKind[] | null;
        expression: K.ExpressionKind;
        extra?: {
            parenthesized: boolean;
        } | null;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSAsExpression;
}
export interface TSNonNullExpressionBuilder {
    (expression: K.ExpressionKind): namedTypes.TSNonNullExpression;
    from(params: {
        comments?: K.CommentKind[] | null;
        expression: K.ExpressionKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSNonNullExpression;
}
export interface TSAnyKeywordBuilder {
    (): namedTypes.TSAnyKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSAnyKeyword;
}
export interface TSBigIntKeywordBuilder {
    (): namedTypes.TSBigIntKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSBigIntKeyword;
}
export interface TSBooleanKeywordBuilder {
    (): namedTypes.TSBooleanKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSBooleanKeyword;
}
export interface TSNeverKeywordBuilder {
    (): namedTypes.TSNeverKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSNeverKeyword;
}
export interface TSNullKeywordBuilder {
    (): namedTypes.TSNullKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSNullKeyword;
}
export interface TSNumberKeywordBuilder {
    (): namedTypes.TSNumberKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSNumberKeyword;
}
export interface TSObjectKeywordBuilder {
    (): namedTypes.TSObjectKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSObjectKeyword;
}
export interface TSStringKeywordBuilder {
    (): namedTypes.TSStringKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSStringKeyword;
}
export interface TSSymbolKeywordBuilder {
    (): namedTypes.TSSymbolKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSSymbolKeyword;
}
export interface TSUndefinedKeywordBuilder {
    (): namedTypes.TSUndefinedKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSUndefinedKeyword;
}
export interface TSUnknownKeywordBuilder {
    (): namedTypes.TSUnknownKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSUnknownKeyword;
}
export interface TSVoidKeywordBuilder {
    (): namedTypes.TSVoidKeyword;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSVoidKeyword;
}
export interface TSThisTypeBuilder {
    (): namedTypes.TSThisType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSThisType;
}
export interface TSArrayTypeBuilder {
    (elementType: K.TSTypeKind): namedTypes.TSArrayType;
    from(params: {
        comments?: K.CommentKind[] | null;
        elementType: K.TSTypeKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSArrayType;
}
export interface TSLiteralTypeBuilder {
    (literal: K.NumericLiteralKind | K.StringLiteralKind | K.BooleanLiteralKind | K.TemplateLiteralKind | K.UnaryExpressionKind): namedTypes.TSLiteralType;
    from(params: {
        comments?: K.CommentKind[] | null;
        literal: K.NumericLiteralKind | K.StringLiteralKind | K.BooleanLiteralKind | K.TemplateLiteralKind | K.UnaryExpressionKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSLiteralType;
}
export interface TSUnionTypeBuilder {
    (types: K.TSTypeKind[]): namedTypes.TSUnionType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        types: K.TSTypeKind[];
    }): namedTypes.TSUnionType;
}
export interface TSIntersectionTypeBuilder {
    (types: K.TSTypeKind[]): namedTypes.TSIntersectionType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        types: K.TSTypeKind[];
    }): namedTypes.TSIntersectionType;
}
export interface TSConditionalTypeBuilder {
    (checkType: K.TSTypeKind, extendsType: K.TSTypeKind, trueType: K.TSTypeKind, falseType: K.TSTypeKind): namedTypes.TSConditionalType;
    from(params: {
        checkType: K.TSTypeKind;
        comments?: K.CommentKind[] | null;
        extendsType: K.TSTypeKind;
        falseType: K.TSTypeKind;
        loc?: K.SourceLocationKind | null;
        trueType: K.TSTypeKind;
    }): namedTypes.TSConditionalType;
}
export interface TSInferTypeBuilder {
    (typeParameter: K.TSTypeParameterKind): namedTypes.TSInferType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        typeParameter: K.TSTypeParameterKind;
    }): namedTypes.TSInferType;
}
export interface TSTypeParameterBuilder {
    (name: string, constraint?: K.TSTypeKind | undefined, defaultParam?: K.TSTypeKind | undefined): namedTypes.TSTypeParameter;
    from(params: {
        comments?: K.CommentKind[] | null;
        constraint?: K.TSTypeKind | undefined;
        default?: K.TSTypeKind | undefined;
        loc?: K.SourceLocationKind | null;
        name: string;
        optional?: boolean;
        typeAnnotation?: K.TypeAnnotationKind | K.TSTypeAnnotationKind | null;
    }): namedTypes.TSTypeParameter;
}
export interface TSParenthesizedTypeBuilder {
    (typeAnnotation: K.TSTypeKind): namedTypes.TSParenthesizedType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSParenthesizedType;
}
export interface TSFunctionTypeBuilder {
    (parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[]): namedTypes.TSFunctionType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[];
        typeAnnotation?: K.TSTypeAnnotationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSFunctionType;
}
export interface TSConstructorTypeBuilder {
    (parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[]): namedTypes.TSConstructorType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[];
        typeAnnotation?: K.TSTypeAnnotationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSConstructorType;
}
export interface TSDeclareFunctionBuilder {
    (id: K.IdentifierKind | null | undefined, params: K.PatternKind[], returnType?: K.TSTypeAnnotationKind | K.NoopKind | null): namedTypes.TSDeclareFunction;
    from(params: {
        async?: boolean;
        comments?: K.CommentKind[] | null;
        declare?: boolean;
        generator?: boolean;
        id?: K.IdentifierKind | null;
        loc?: K.SourceLocationKind | null;
        params: K.PatternKind[];
        returnType?: K.TSTypeAnnotationKind | K.NoopKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSDeclareFunction;
}
export interface TSDeclareMethodBuilder {
    (key: K.IdentifierKind | K.StringLiteralKind | K.NumericLiteralKind | K.ExpressionKind, params: K.PatternKind[], returnType?: K.TSTypeAnnotationKind | K.NoopKind | null): namedTypes.TSDeclareMethod;
    from(params: {
        abstract?: boolean;
        access?: "public" | "private" | "protected" | undefined;
        accessibility?: "public" | "private" | "protected" | undefined;
        async?: boolean;
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        decorators?: K.DecoratorKind[] | null;
        generator?: boolean;
        key: K.IdentifierKind | K.StringLiteralKind | K.NumericLiteralKind | K.ExpressionKind;
        kind?: "get" | "set" | "method" | "constructor";
        loc?: K.SourceLocationKind | null;
        optional?: boolean;
        params: K.PatternKind[];
        returnType?: K.TSTypeAnnotationKind | K.NoopKind | null;
        static?: boolean;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSDeclareMethod;
}
export interface TSMappedTypeBuilder {
    (typeParameter: K.TSTypeParameterKind, typeAnnotation?: K.TSTypeKind | null): namedTypes.TSMappedType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        optional?: boolean | "+" | "-";
        readonly?: boolean | "+" | "-";
        typeAnnotation?: K.TSTypeKind | null;
        typeParameter: K.TSTypeParameterKind;
    }): namedTypes.TSMappedType;
}
export interface TSTupleTypeBuilder {
    (elementTypes: (K.TSTypeKind | K.TSNamedTupleMemberKind)[]): namedTypes.TSTupleType;
    from(params: {
        comments?: K.CommentKind[] | null;
        elementTypes: (K.TSTypeKind | K.TSNamedTupleMemberKind)[];
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSTupleType;
}
export interface TSNamedTupleMemberBuilder {
    (label: K.IdentifierKind, elementType: K.TSTypeKind, optional?: boolean): namedTypes.TSNamedTupleMember;
    from(params: {
        comments?: K.CommentKind[] | null;
        elementType: K.TSTypeKind;
        label: K.IdentifierKind;
        loc?: K.SourceLocationKind | null;
        optional?: boolean;
    }): namedTypes.TSNamedTupleMember;
}
export interface TSRestTypeBuilder {
    (typeAnnotation: K.TSTypeKind): namedTypes.TSRestType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSRestType;
}
export interface TSOptionalTypeBuilder {
    (typeAnnotation: K.TSTypeKind): namedTypes.TSOptionalType;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSOptionalType;
}
export interface TSIndexedAccessTypeBuilder {
    (objectType: K.TSTypeKind, indexType: K.TSTypeKind): namedTypes.TSIndexedAccessType;
    from(params: {
        comments?: K.CommentKind[] | null;
        indexType: K.TSTypeKind;
        loc?: K.SourceLocationKind | null;
        objectType: K.TSTypeKind;
    }): namedTypes.TSIndexedAccessType;
}
export interface TSTypeOperatorBuilder {
    (operator: string): namedTypes.TSTypeOperator;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        operator: string;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSTypeOperator;
}
export interface TSIndexSignatureBuilder {
    (parameters: K.IdentifierKind[], typeAnnotation?: K.TSTypeAnnotationKind | null): namedTypes.TSIndexSignature;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameters: K.IdentifierKind[];
        readonly?: boolean;
        typeAnnotation?: K.TSTypeAnnotationKind | null;
    }): namedTypes.TSIndexSignature;
}
export interface TSPropertySignatureBuilder {
    (key: K.ExpressionKind, typeAnnotation?: K.TSTypeAnnotationKind | null, optional?: boolean): namedTypes.TSPropertySignature;
    from(params: {
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        initializer?: K.ExpressionKind | null;
        key: K.ExpressionKind;
        loc?: K.SourceLocationKind | null;
        optional?: boolean;
        readonly?: boolean;
        typeAnnotation?: K.TSTypeAnnotationKind | null;
    }): namedTypes.TSPropertySignature;
}
export interface TSMethodSignatureBuilder {
    (key: K.ExpressionKind, parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[], typeAnnotation?: K.TSTypeAnnotationKind | null): namedTypes.TSMethodSignature;
    from(params: {
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        key: K.ExpressionKind;
        loc?: K.SourceLocationKind | null;
        optional?: boolean;
        parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[];
        typeAnnotation?: K.TSTypeAnnotationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSMethodSignature;
}
export interface TSTypePredicateBuilder {
    (parameterName: K.IdentifierKind | K.TSThisTypeKind, typeAnnotation?: K.TSTypeAnnotationKind | null, asserts?: boolean): namedTypes.TSTypePredicate;
    from(params: {
        asserts?: boolean;
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameterName: K.IdentifierKind | K.TSThisTypeKind;
        typeAnnotation?: K.TSTypeAnnotationKind | null;
    }): namedTypes.TSTypePredicate;
}
export interface TSCallSignatureDeclarationBuilder {
    (parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[], typeAnnotation?: K.TSTypeAnnotationKind | null): namedTypes.TSCallSignatureDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[];
        typeAnnotation?: K.TSTypeAnnotationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSCallSignatureDeclaration;
}
export interface TSConstructSignatureDeclarationBuilder {
    (parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[], typeAnnotation?: K.TSTypeAnnotationKind | null): namedTypes.TSConstructSignatureDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameters: (K.IdentifierKind | K.RestElementKind | K.ArrayPatternKind | K.ObjectPatternKind)[];
        typeAnnotation?: K.TSTypeAnnotationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSConstructSignatureDeclaration;
}
export interface TSEnumMemberBuilder {
    (id: K.IdentifierKind | K.StringLiteralKind, initializer?: K.ExpressionKind | null): namedTypes.TSEnumMember;
    from(params: {
        comments?: K.CommentKind[] | null;
        id: K.IdentifierKind | K.StringLiteralKind;
        initializer?: K.ExpressionKind | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSEnumMember;
}
export interface TSTypeQueryBuilder {
    (exprName: K.IdentifierKind | K.TSQualifiedNameKind | K.TSImportTypeKind): namedTypes.TSTypeQuery;
    from(params: {
        comments?: K.CommentKind[] | null;
        exprName: K.IdentifierKind | K.TSQualifiedNameKind | K.TSImportTypeKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSTypeQuery;
}
export interface TSImportTypeBuilder {
    (argument: K.StringLiteralKind, qualifier?: K.IdentifierKind | K.TSQualifiedNameKind | undefined, typeParameters?: K.TSTypeParameterInstantiationKind | null): namedTypes.TSImportType;
    from(params: {
        argument: K.StringLiteralKind;
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        qualifier?: K.IdentifierKind | K.TSQualifiedNameKind | undefined;
        typeParameters?: K.TSTypeParameterInstantiationKind | null;
    }): namedTypes.TSImportType;
}
export interface TSTypeLiteralBuilder {
    (members: (K.TSCallSignatureDeclarationKind | K.TSConstructSignatureDeclarationKind | K.TSIndexSignatureKind | K.TSMethodSignatureKind | K.TSPropertySignatureKind)[]): namedTypes.TSTypeLiteral;
    from(params: {
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        members: (K.TSCallSignatureDeclarationKind | K.TSConstructSignatureDeclarationKind | K.TSIndexSignatureKind | K.TSMethodSignatureKind | K.TSPropertySignatureKind)[];
    }): namedTypes.TSTypeLiteral;
}
export interface TSTypeAssertionBuilder {
    (typeAnnotation: K.TSTypeKind, expression: K.ExpressionKind): namedTypes.TSTypeAssertion;
    from(params: {
        comments?: K.CommentKind[] | null;
        expression: K.ExpressionKind;
        extra?: {
            parenthesized: boolean;
        } | null;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
    }): namedTypes.TSTypeAssertion;
}
export interface TSEnumDeclarationBuilder {
    (id: K.IdentifierKind, members: K.TSEnumMemberKind[]): namedTypes.TSEnumDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        const?: boolean;
        declare?: boolean;
        id: K.IdentifierKind;
        initializer?: K.ExpressionKind | null;
        loc?: K.SourceLocationKind | null;
        members: K.TSEnumMemberKind[];
    }): namedTypes.TSEnumDeclaration;
}
export interface TSTypeAliasDeclarationBuilder {
    (id: K.IdentifierKind, typeAnnotation: K.TSTypeKind): namedTypes.TSTypeAliasDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        declare?: boolean;
        id: K.IdentifierKind;
        loc?: K.SourceLocationKind | null;
        typeAnnotation: K.TSTypeKind;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSTypeAliasDeclaration;
}
export interface TSModuleBlockBuilder {
    (body: K.StatementKind[]): namedTypes.TSModuleBlock;
    from(params: {
        body: K.StatementKind[];
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSModuleBlock;
}
export interface TSModuleDeclarationBuilder {
    (id: K.StringLiteralKind | K.IdentifierKind | K.TSQualifiedNameKind, body?: K.TSModuleBlockKind | K.TSModuleDeclarationKind | null): namedTypes.TSModuleDeclaration;
    from(params: {
        body?: K.TSModuleBlockKind | K.TSModuleDeclarationKind | null;
        comments?: K.CommentKind[] | null;
        declare?: boolean;
        global?: boolean;
        id: K.StringLiteralKind | K.IdentifierKind | K.TSQualifiedNameKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSModuleDeclaration;
}
export interface TSImportEqualsDeclarationBuilder {
    (id: K.IdentifierKind, moduleReference: K.IdentifierKind | K.TSQualifiedNameKind | K.TSExternalModuleReferenceKind): namedTypes.TSImportEqualsDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        id: K.IdentifierKind;
        isExport?: boolean;
        loc?: K.SourceLocationKind | null;
        moduleReference: K.IdentifierKind | K.TSQualifiedNameKind | K.TSExternalModuleReferenceKind;
    }): namedTypes.TSImportEqualsDeclaration;
}
export interface TSExternalModuleReferenceBuilder {
    (expression: K.StringLiteralKind): namedTypes.TSExternalModuleReference;
    from(params: {
        comments?: K.CommentKind[] | null;
        expression: K.StringLiteralKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSExternalModuleReference;
}
export interface TSExportAssignmentBuilder {
    (expression: K.ExpressionKind): namedTypes.TSExportAssignment;
    from(params: {
        comments?: K.CommentKind[] | null;
        expression: K.ExpressionKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSExportAssignment;
}
export interface TSNamespaceExportDeclarationBuilder {
    (id: K.IdentifierKind): namedTypes.TSNamespaceExportDeclaration;
    from(params: {
        comments?: K.CommentKind[] | null;
        id: K.IdentifierKind;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSNamespaceExportDeclaration;
}
export interface TSInterfaceBodyBuilder {
    (body: (K.TSCallSignatureDeclarationKind | K.TSConstructSignatureDeclarationKind | K.TSIndexSignatureKind | K.TSMethodSignatureKind | K.TSPropertySignatureKind)[]): namedTypes.TSInterfaceBody;
    from(params: {
        body: (K.TSCallSignatureDeclarationKind | K.TSConstructSignatureDeclarationKind | K.TSIndexSignatureKind | K.TSMethodSignatureKind | K.TSPropertySignatureKind)[];
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
    }): namedTypes.TSInterfaceBody;
}
export interface TSInterfaceDeclarationBuilder {
    (id: K.IdentifierKind | K.TSQualifiedNameKind, body: K.TSInterfaceBodyKind): namedTypes.TSInterfaceDeclaration;
    from(params: {
        body: K.TSInterfaceBodyKind;
        comments?: K.CommentKind[] | null;
        declare?: boolean;
        extends?: K.TSExpressionWithTypeArgumentsKind[] | null;
        id: K.IdentifierKind | K.TSQualifiedNameKind;
        loc?: K.SourceLocationKind | null;
        typeParameters?: K.TSTypeParameterDeclarationKind | null | undefined;
    }): namedTypes.TSInterfaceDeclaration;
}
export interface TSParameterPropertyBuilder {
    (parameter: K.IdentifierKind | K.AssignmentPatternKind): namedTypes.TSParameterProperty;
    from(params: {
        accessibility?: "public" | "private" | "protected" | undefined;
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        parameter: K.IdentifierKind | K.AssignmentPatternKind;
        readonly?: boolean;
    }): namedTypes.TSParameterProperty;
}
export interface OptionalMemberExpressionBuilder {
    (object: K.ExpressionKind, property: K.IdentifierKind | K.ExpressionKind, computed?: boolean, optional?: boolean): namedTypes.OptionalMemberExpression;
    from(params: {
        comments?: K.CommentKind[] | null;
        computed?: boolean;
        loc?: K.SourceLocationKind | null;
        object: K.ExpressionKind;
        optional?: boolean;
        property: K.IdentifierKind | K.ExpressionKind;
    }): namedTypes.OptionalMemberExpression;
}
export interface OptionalCallExpressionBuilder {
    (callee: K.ExpressionKind, argumentsParam: (K.ExpressionKind | K.SpreadElementKind)[], optional?: boolean): namedTypes.OptionalCallExpression;
    from(params: {
        arguments: (K.ExpressionKind | K.SpreadElementKind)[];
        callee: K.ExpressionKind;
        comments?: K.CommentKind[] | null;
        loc?: K.SourceLocationKind | null;
        optional?: boolean;
        typeArguments?: null | K.TypeParameterInstantiationKind;
    }): namedTypes.OptionalCallExpression;
}
export interface builders {
    file: FileBuilder;
    program: ProgramBuilder;
    identifier: IdentifierBuilder;
    blockStatement: BlockStatementBuilder;
    emptyStatement: EmptyStatementBuilder;
    expressionStatement: ExpressionStatementBuilder;
    ifStatement: IfStatementBuilder;
    labeledStatement: LabeledStatementBuilder;
    breakStatement: BreakStatementBuilder;
    continueStatement: ContinueStatementBuilder;
    withStatement: WithStatementBuilder;
    switchStatement: SwitchStatementBuilder;
    switchCase: SwitchCaseBuilder;
    returnStatement: ReturnStatementBuilder;
    throwStatement: ThrowStatementBuilder;
    tryStatement: TryStatementBuilder;
    catchClause: CatchClauseBuilder;
    whileStatement: WhileStatementBuilder;
    doWhileStatement: DoWhileStatementBuilder;
    forStatement: ForStatementBuilder;
    variableDeclaration: VariableDeclarationBuilder;
    forInStatement: ForInStatementBuilder;
    debuggerStatement: DebuggerStatementBuilder;
    functionDeclaration: FunctionDeclarationBuilder;
    functionExpression: FunctionExpressionBuilder;
    variableDeclarator: VariableDeclaratorBuilder;
    thisExpression: ThisExpressionBuilder;
    arrayExpression: ArrayExpressionBuilder;
    objectExpression: ObjectExpressionBuilder;
    property: PropertyBuilder;
    literal: LiteralBuilder;
    sequenceExpression: SequenceExpressionBuilder;
    unaryExpression: UnaryExpressionBuilder;
    binaryExpression: BinaryExpressionBuilder;
    assignmentExpression: AssignmentExpressionBuilder;
    memberExpression: MemberExpressionBuilder;
    updateExpression: UpdateExpressionBuilder;
    logicalExpression: LogicalExpressionBuilder;
    conditionalExpression: ConditionalExpressionBuilder;
    newExpression: NewExpressionBuilder;
    callExpression: CallExpressionBuilder;
    restElement: RestElementBuilder;
    typeAnnotation: TypeAnnotationBuilder;
    tsTypeAnnotation: TSTypeAnnotationBuilder;
    spreadElementPattern: SpreadElementPatternBuilder;
    arrowFunctionExpression: ArrowFunctionExpressionBuilder;
    forOfStatement: ForOfStatementBuilder;
    yieldExpression: YieldExpressionBuilder;
    generatorExpression: GeneratorExpressionBuilder;
    comprehensionBlock: ComprehensionBlockBuilder;
    comprehensionExpression: ComprehensionExpressionBuilder;
    objectProperty: ObjectPropertyBuilder;
    propertyPattern: PropertyPatternBuilder;
    objectPattern: ObjectPatternBuilder;
    arrayPattern: ArrayPatternBuilder;
    methodDefinition: MethodDefinitionBuilder;
    spreadElement: SpreadElementBuilder;
    assignmentPattern: AssignmentPatternBuilder;
    classPropertyDefinition: ClassPropertyDefinitionBuilder;
    classProperty: ClassPropertyBuilder;
    classBody: ClassBodyBuilder;
    classDeclaration: ClassDeclarationBuilder;
    classExpression: ClassExpressionBuilder;
    importSpecifier: ImportSpecifierBuilder;
    importNamespaceSpecifier: ImportNamespaceSpecifierBuilder;
    importDefaultSpecifier: ImportDefaultSpecifierBuilder;
    importDeclaration: ImportDeclarationBuilder;
    taggedTemplateExpression: TaggedTemplateExpressionBuilder;
    templateLiteral: TemplateLiteralBuilder;
    templateElement: TemplateElementBuilder;
    spreadProperty: SpreadPropertyBuilder;
    spreadPropertyPattern: SpreadPropertyPatternBuilder;
    awaitExpression: AwaitExpressionBuilder;
    importExpression: ImportExpressionBuilder;
    jsxAttribute: JSXAttributeBuilder;
    jsxIdentifier: JSXIdentifierBuilder;
    jsxNamespacedName: JSXNamespacedNameBuilder;
    jsxExpressionContainer: JSXExpressionContainerBuilder;
    jsxMemberExpression: JSXMemberExpressionBuilder;
    jsxSpreadAttribute: JSXSpreadAttributeBuilder;
    jsxElement: JSXElementBuilder;
    jsxOpeningElement: JSXOpeningElementBuilder;
    jsxClosingElement: JSXClosingElementBuilder;
    jsxFragment: JSXFragmentBuilder;
    jsxText: JSXTextBuilder;
    jsxOpeningFragment: JSXOpeningFragmentBuilder;
    jsxClosingFragment: JSXClosingFragmentBuilder;
    jsxEmptyExpression: JSXEmptyExpressionBuilder;
    jsxSpreadChild: JSXSpreadChildBuilder;
    typeParameterDeclaration: TypeParameterDeclarationBuilder;
    tsTypeParameterDeclaration: TSTypeParameterDeclarationBuilder;
    typeParameterInstantiation: TypeParameterInstantiationBuilder;
    tsTypeParameterInstantiation: TSTypeParameterInstantiationBuilder;
    classImplements: ClassImplementsBuilder;
    tsExpressionWithTypeArguments: TSExpressionWithTypeArgumentsBuilder;
    anyTypeAnnotation: AnyTypeAnnotationBuilder;
    emptyTypeAnnotation: EmptyTypeAnnotationBuilder;
    mixedTypeAnnotation: MixedTypeAnnotationBuilder;
    voidTypeAnnotation: VoidTypeAnnotationBuilder;
    numberTypeAnnotation: NumberTypeAnnotationBuilder;
    numberLiteralTypeAnnotation: NumberLiteralTypeAnnotationBuilder;
    numericLiteralTypeAnnotation: NumericLiteralTypeAnnotationBuilder;
    stringTypeAnnotation: StringTypeAnnotationBuilder;
    stringLiteralTypeAnnotation: StringLiteralTypeAnnotationBuilder;
    booleanTypeAnnotation: BooleanTypeAnnotationBuilder;
    booleanLiteralTypeAnnotation: BooleanLiteralTypeAnnotationBuilder;
    nullableTypeAnnotation: NullableTypeAnnotationBuilder;
    nullLiteralTypeAnnotation: NullLiteralTypeAnnotationBuilder;
    nullTypeAnnotation: NullTypeAnnotationBuilder;
    thisTypeAnnotation: ThisTypeAnnotationBuilder;
    existsTypeAnnotation: ExistsTypeAnnotationBuilder;
    existentialTypeParam: ExistentialTypeParamBuilder;
    functionTypeAnnotation: FunctionTypeAnnotationBuilder;
    functionTypeParam: FunctionTypeParamBuilder;
    arrayTypeAnnotation: ArrayTypeAnnotationBuilder;
    objectTypeAnnotation: ObjectTypeAnnotationBuilder;
    objectTypeProperty: ObjectTypePropertyBuilder;
    objectTypeSpreadProperty: ObjectTypeSpreadPropertyBuilder;
    objectTypeIndexer: ObjectTypeIndexerBuilder;
    objectTypeCallProperty: ObjectTypeCallPropertyBuilder;
    objectTypeInternalSlot: ObjectTypeInternalSlotBuilder;
    variance: VarianceBuilder;
    qualifiedTypeIdentifier: QualifiedTypeIdentifierBuilder;
    genericTypeAnnotation: GenericTypeAnnotationBuilder;
    memberTypeAnnotation: MemberTypeAnnotationBuilder;
    unionTypeAnnotation: UnionTypeAnnotationBuilder;
    intersectionTypeAnnotation: IntersectionTypeAnnotationBuilder;
    typeofTypeAnnotation: TypeofTypeAnnotationBuilder;
    typeParameter: TypeParameterBuilder;
    interfaceTypeAnnotation: InterfaceTypeAnnotationBuilder;
    interfaceExtends: InterfaceExtendsBuilder;
    interfaceDeclaration: InterfaceDeclarationBuilder;
    declareInterface: DeclareInterfaceBuilder;
    typeAlias: TypeAliasBuilder;
    opaqueType: OpaqueTypeBuilder;
    declareTypeAlias: DeclareTypeAliasBuilder;
    declareOpaqueType: DeclareOpaqueTypeBuilder;
    typeCastExpression: TypeCastExpressionBuilder;
    tupleTypeAnnotation: TupleTypeAnnotationBuilder;
    declareVariable: DeclareVariableBuilder;
    declareFunction: DeclareFunctionBuilder;
    declareClass: DeclareClassBuilder;
    declareModule: DeclareModuleBuilder;
    declareModuleExports: DeclareModuleExportsBuilder;
    declareExportDeclaration: DeclareExportDeclarationBuilder;
    exportSpecifier: ExportSpecifierBuilder;
    exportBatchSpecifier: ExportBatchSpecifierBuilder;
    declareExportAllDeclaration: DeclareExportAllDeclarationBuilder;
    inferredPredicate: InferredPredicateBuilder;
    declaredPredicate: DeclaredPredicateBuilder;
    exportDeclaration: ExportDeclarationBuilder;
    block: BlockBuilder;
    line: LineBuilder;
    noop: NoopBuilder;
    doExpression: DoExpressionBuilder;
    super: SuperBuilder;
    bindExpression: BindExpressionBuilder;
    decorator: DecoratorBuilder;
    metaProperty: MetaPropertyBuilder;
    parenthesizedExpression: ParenthesizedExpressionBuilder;
    exportDefaultDeclaration: ExportDefaultDeclarationBuilder;
    exportNamedDeclaration: ExportNamedDeclarationBuilder;
    exportNamespaceSpecifier: ExportNamespaceSpecifierBuilder;
    exportDefaultSpecifier: ExportDefaultSpecifierBuilder;
    exportAllDeclaration: ExportAllDeclarationBuilder;
    commentBlock: CommentBlockBuilder;
    commentLine: CommentLineBuilder;
    directive: DirectiveBuilder;
    directiveLiteral: DirectiveLiteralBuilder;
    interpreterDirective: InterpreterDirectiveBuilder;
    stringLiteral: StringLiteralBuilder;
    numericLiteral: NumericLiteralBuilder;
    bigIntLiteral: BigIntLiteralBuilder;
    nullLiteral: NullLiteralBuilder;
    booleanLiteral: BooleanLiteralBuilder;
    regExpLiteral: RegExpLiteralBuilder;
    objectMethod: ObjectMethodBuilder;
    classPrivateProperty: ClassPrivatePropertyBuilder;
    classMethod: ClassMethodBuilder;
    classPrivateMethod: ClassPrivateMethodBuilder;
    privateName: PrivateNameBuilder;
    restProperty: RestPropertyBuilder;
    forAwaitStatement: ForAwaitStatementBuilder;
    import: ImportBuilder;
    tsQualifiedName: TSQualifiedNameBuilder;
    tsTypeReference: TSTypeReferenceBuilder;
    tsAsExpression: TSAsExpressionBuilder;
    tsNonNullExpression: TSNonNullExpressionBuilder;
    tsAnyKeyword: TSAnyKeywordBuilder;
    tsBigIntKeyword: TSBigIntKeywordBuilder;
    tsBooleanKeyword: TSBooleanKeywordBuilder;
    tsNeverKeyword: TSNeverKeywordBuilder;
    tsNullKeyword: TSNullKeywordBuilder;
    tsNumberKeyword: TSNumberKeywordBuilder;
    tsObjectKeyword: TSObjectKeywordBuilder;
    tsStringKeyword: TSStringKeywordBuilder;
    tsSymbolKeyword: TSSymbolKeywordBuilder;
    tsUndefinedKeyword: TSUndefinedKeywordBuilder;
    tsUnknownKeyword: TSUnknownKeywordBuilder;
    tsVoidKeyword: TSVoidKeywordBuilder;
    tsThisType: TSThisTypeBuilder;
    tsArrayType: TSArrayTypeBuilder;
    tsLiteralType: TSLiteralTypeBuilder;
    tsUnionType: TSUnionTypeBuilder;
    tsIntersectionType: TSIntersectionTypeBuilder;
    tsConditionalType: TSConditionalTypeBuilder;
    tsInferType: TSInferTypeBuilder;
    tsTypeParameter: TSTypeParameterBuilder;
    tsParenthesizedType: TSParenthesizedTypeBuilder;
    tsFunctionType: TSFunctionTypeBuilder;
    tsConstructorType: TSConstructorTypeBuilder;
    tsDeclareFunction: TSDeclareFunctionBuilder;
    tsDeclareMethod: TSDeclareMethodBuilder;
    tsMappedType: TSMappedTypeBuilder;
    tsTupleType: TSTupleTypeBuilder;
    tsNamedTupleMember: TSNamedTupleMemberBuilder;
    tsRestType: TSRestTypeBuilder;
    tsOptionalType: TSOptionalTypeBuilder;
    tsIndexedAccessType: TSIndexedAccessTypeBuilder;
    tsTypeOperator: TSTypeOperatorBuilder;
    tsIndexSignature: TSIndexSignatureBuilder;
    tsPropertySignature: TSPropertySignatureBuilder;
    tsMethodSignature: TSMethodSignatureBuilder;
    tsTypePredicate: TSTypePredicateBuilder;
    tsCallSignatureDeclaration: TSCallSignatureDeclarationBuilder;
    tsConstructSignatureDeclaration: TSConstructSignatureDeclarationBuilder;
    tsEnumMember: TSEnumMemberBuilder;
    tsTypeQuery: TSTypeQueryBuilder;
    tsImportType: TSImportTypeBuilder;
    tsTypeLiteral: TSTypeLiteralBuilder;
    tsTypeAssertion: TSTypeAssertionBuilder;
    tsEnumDeclaration: TSEnumDeclarationBuilder;
    tsTypeAliasDeclaration: TSTypeAliasDeclarationBuilder;
    tsModuleBlock: TSModuleBlockBuilder;
    tsModuleDeclaration: TSModuleDeclarationBuilder;
    tsImportEqualsDeclaration: TSImportEqualsDeclarationBuilder;
    tsExternalModuleReference: TSExternalModuleReferenceBuilder;
    tsExportAssignment: TSExportAssignmentBuilder;
    tsNamespaceExportDeclaration: TSNamespaceExportDeclarationBuilder;
    tsInterfaceBody: TSInterfaceBodyBuilder;
    tsInterfaceDeclaration: TSInterfaceDeclarationBuilder;
    tsParameterProperty: TSParameterPropertyBuilder;
    optionalMemberExpression: OptionalMemberExpressionBuilder;
    optionalCallExpression: OptionalCallExpressionBuilder;
    [builderName: string]: any;
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              setreuid32 -	2	2	1682851326	0	B	-	-	gz	set real and/or effective user or group ID rt_sigaction -	2	2	1682851326	0	B	-	-	gz	examine and change a signal action sysfs	5 -	5	5	1682851326	0	A	-	-	gz	a filesystem for exporting kernel objects                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   M     	                        (       Ի                                Z   \Dpkgȍ        ;    R\swapm        4   i]hd	121        [   acos        0   acce,        <   cach--        L   clnt        *   C\evp_
        a   ]tailS     
   T   u{\argz     
   =   \__fp        ?   initM         ?   pam_F      
   H   Im\pkey5        <   S	]trun        :   P8\ul  ш        +   ]asse        D   rpc_        M   F{\tc-nD        H   VX]unmkR        D   fileh           ioprA.        F   abs <        E   gets        l   }\see          M   9\bzer        /   (]git-$     
   N   core"      	   G   3[]pthr        ;   ]e2un         Q   /etc=0         (   ]D]os-rE1        <   \mq_t     
      c=\iso-        `   6\irusn     	   P   D)]wait        =   ]xdr_ȇ     	      #\pcre        N   []asn1nE      
   <   \pthr        U   os\sepo        ^   $]devl         -   :+]asseI        2   =
\dbop        4   \ldiv        N   rpcbA     
   $   evp_w         N   nfs4S        ,   irus#        P   glob           ]open        J   pcre        N   seli۫        ~   feup         K   getn"        :   utmp"     
   5   ®\pthr        ^   N\exp2        8   d]putc1        7   Yq]fgre        <   ^=w\kbdi        M   5n]exit     
   I   ;\PA_C։        R   "]lzfgc        M   ]crypG     	   /   [o]geta         0   qM]tipc7        E   7h]idmaM        5   N]avc_        H   o\msgg
        D   remon        =   ucfqi        3   clnt$        ,   FILE)        4   cloce         B   Iv]prov8        X   3z]tail        R   getcc!        8   strp$        F   lrinʼ        5   䨵\time     	   /   strpZ$     	   [   tunn        )   Busy(2      
   #   pyge        =   9\pcre5        N   clnt        +   resi        C   secu>        6   ]csqr[        0   xv]iso_Z        a   nfs4        ,   8 :\simpǰ        [   netc      
   <   cacol        :   putu\"     
   5   DǪ\mq_s        >   ?\pcreR     
   N   cfge%        a   {\]lfin        6   "]secu
           fdis|         <   rand        ;   ]simp6        V   dpkg        U   listŻ        M   \clnt        H   xdr_J        H   fw           !   task        E   ]niceU        L   wcsn%        Y   PA_Fb        4   stri#        .   wcst&        D   6]getlO        )   _g\rena      
   B   Wg]conf"         H   syst'        A   pcre     &   N   z \ip6t"     
   W   ]RANDP3      
   <   -`\zdumԋ        ,   +]pthrٌ        C   bcop        /   ΋]ntoh        O   Z\rtaco<        6   lu\mounȴ        O   posi7     
   ,   ip6tP'        V   dpkg{        7   #6K]bio J         5   ]near/        5   opend         +   b0\unic        E   f\svc_        +   lzle         D   j1 t        ?   L	]ip-r;        ?   git-)        M   u\dpkg        ?   versα        <   f\erro        <   c;\sets        ;   ]gett}        6   '\sys_     	   9   T\vimd}        h   +\acos        ?   ?]fmtm        ;   |Y]cfge        a   #\ipta        V   seliL        c   ip6t'        V   srch*     
   ?   vipwY        [   moun
)     
   8   ld\getu        I   asym;+        *   pam_      
   C   set_ɭ           \ustp      
   *   4]execc        +   deb-+        C   \arc4!        S   nfs. ,     	   L   fileU,        /                                                                                                           N                       u)J^list     
   K   ^getp        <   ݪ^authL        *                                                               6_dpkg        =   0_remq        ?   | ^ddp *         D                       _vgcf,        A                       =_evp_        f   XP^cmp	           ;                                           '@^getg     	   1                       9pO^floc                                                                                                                                                       5G_xtab        R                       SyC___pp/        >   2_xprt        $   k%m_epol?     
   :                       q^lzcm        5   ʶ_strs        =   y;o^clnt;        ,   A_uint;     	   @                                                                                   5^algo        F                                                                                   Ҥ_open        .                                                                                                                                                                   \V^slab     	   =   aM^pthrي        \                                                               n_bzleS         Y                       ~!_cach        K   _putc         =                                           {^int3        @   u_inte     
   F   bd^arp	        5                                           e_unloy     	   F   ^_ExiL        :   [_lsme        Y   D|_time~     	   /                       `a^auth        *                       ^aio_        K   r^dpkg]        9                       _list1        S                                                                                   ޠ^elfe        P                                           /x}_le16        Z   m^pcap        1                                           ]_cryp         C   0_seli        c                       `G^link̺        7                       j\_evp_        x                       r^ufw         F                                           9_ldexB        R   
^stpn_     
   *   $.m_nfs4Վ        ,   ^res_        .   cK^sinf        *                       }i_prov8        I   5_logiF     	   >                                                               I^date$        M                                                                                   k^pcre        N   T^ntfsy     
   P                                                                                   +b_vpri(        8                                                               7^evp_        F   Q_git-|     
   B   avS^dpkg        e                                           ؿ_syst        H                       };^cpu_F     
   E   #A_git-˸     	   :                                                                                                                           x*^xzgr        M   !p^outb        %   _gid_T        >   1r^fips8        9   F
_dateN        a   L_callo     
   H   ϲ
_setsL     	   L   g^pthrR        X   d'_lzdi'        5   '\^pa_c        6   B"_ntfsӷ        J   y,^dlad"        F                                                                                   Β
^ed44}         F   &^opte        7   a_clog        A                                           I_ecvtp        H                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   tee	1 -	1	1	1663687647	0	A	-	-	gz	read from standard input and write to standard output and files getpmsg -	2	2	1682851326	0	C	unimplemented	-	gz	 break -	2	2	1682851326	0	B	-	-	gz	unimplemented system calls getpmsg -	2	2	1682851326	0	B	-	-	gz	unimplemented system calls                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  PA_FLOAT	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_FLOAT	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_FLOAT	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_INT	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_INT	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_INT	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_INT	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_LAST	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_LAST	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_LAST	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_LAST	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_POINTER	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_POINTER	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_POINTER	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_POINTER	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_STRING	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_STRING	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_STRING	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_STRING	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_WCHAR	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_WCHAR	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_WCHAR	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_WCHAR	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PA_WSTRING	3 -	3	3	1682851326	0	C	register_printf_modifier	-	gz	 PA_WSTRING	3const -	3const	3	1682851326	0	B	-	-	gz	define custom behavior for printf-like functions PA_WSTRING	3head -	3head	3	1682851326	0	C	printf.h	-	gz	 PA_WSTRING	3type -	3type	3	1682851326	0	C	printf_arginfo_size_function	-	gz	 PCRE2	3 -	3	3	1672587846	0	C	pcre2	-	gz	 PZSTD	1 -	1	1	1679173110	0	C	pzstd	-	gz	 RAND	7ssl -	7ssl	7	1752410348	0	A	-	-	gz	the OpenSSL random generator RPCSEC_GSS	3t -	3t	3	1660229452	0	C	rpcsec_gss	-	gz	 RSA	7ssl -	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY RSA keytype and algorithm support UTF-8	7 -	7	7	1682851326	0	C	utf-8	-	gz	 Wget	1 -	1	1	1741008752	0	C	wget	-	gz	 [ -	1	1	1663687647	0	B	-	-	gz	check file types and compare values _Exit	2 -	2	2	1682851326	0	B	-	-	gz	terminate the calling process __after_morecore_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __clone2 -	2	2	1682851326	0	B	-	t	gz	create a child process __fbufsize -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __flbf -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __fpending -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __fpurge -	3	3	1682851326	0	B	-	t	gz	purge a stream __freadable -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __freading -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __free_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __fsetlocking -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __fwritable -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __fwriting -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure __malloc_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __malloc_initialize_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __memalign_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __ppc_get_timebase -	3	3	1682851326	0	A	-	-	gz	get the current value of the Time Base Register on Power architecture and its frequency. __ppc_get_timebase_freq -	3	3	1682851326	0	B	-	-	gz	get the current value of the Time Base Register on Power architecture and its frequency. __ppc_mdoio -	3	3	1682851326	0	B	-	t	gz	Hint the processor to release shared resources __ppc_mdoom -	3	3	1682851326	0	B	-	t	gz	Hint the processor to release shared resources _exit 	_Exit	2	_exit	2       __ppc_set_ppr_low -	3	3	1682851326	0	B	-	t	gz	Set the Program Priority Register __ppc_set_ppr_med -	3	3	1682851326	0	A	-	t	gz	Set the Program Priority Register __ppc_set_ppr_med_high -	3	3	1682851326	0	B	-	t	gz	Set the Program Priority Register __ppc_set_ppr_med_low -	3	3	1682851326	0	B	-	t	gz	Set the Program Priority Register __ppc_set_ppr_very_low -	3	3	1682851326	0	B	-	t	gz	Set the Program Priority Register __ppc_yield -	3	3	1682851326	0	A	-	t	gz	Hint the processor to release shared resources __realloc_hook -	3	3	1682851326	0	B	-	-	gz	malloc debugging variables (DEPRECATED) __setfpucw -	3	3	1682851326	0	A	-	-	gz	set FPU control word on i386 architecture (obsolete) _exit	2 -	2	2	1682851326	0	A	-	-	gz	terminate the calling process _flushlbf -	3	3	1682851326	0	B	-	t	gz	interfaces to stdio FILE structure _generic _Generic	3	3	1682851326	0	A	-	-	gz	type-generic selection _llseek -	2	2	1682851326	0	B	-	-	gz	reposition read/write file offset _newselect -	2	2	1682851326	0	B	-	-	gz	synchronous I/O multiplexing _static_assert _Static_assert	3	3	1682851326	0	B	-	-	gz	fail compilation if assertion is false _syscall -	2	2	1682851326	0	A	-	-	gz	invoking a system call without library support (OBSOLETE) _sysctl -	2	2	1682851326	0	B	-	-	gz	read/write system parameters a64l -	3	3	1682851326	0	A	-	t	gz	convert between long and base-64 aa-enabled -	1	1	1676375355	0	A	-	-	gz	test whether AppArmor is enabled aa-exec -	1	1	1676375355	0	A	-	-	gz	confine a program with the specified AppArmor profile aa-features-abi -	1	1	1676375355	0	A	-	-	gz	Extract, validate and manipulate AppArmor feature abis aa-remove-unknown -	8	8	1676375355	0	A	-	-	gz	remove unknown AppArmor profiles aa-status -	8	8	1676375355	0	A	-	-	gz	display various information about the current AppArmor policy. aa-teardown -	8	8	1676375355	0	A	-	-	gz	unload all AppArmor profiles abort -	3	3	1682851326	0	A	-	t	gz	cause abnormal process termination abs -	3	3	1682851326	0	A	-	t	gz	compute the absolute value of an integer accept -	2	2	1682851326	0	A	-	-	gz	accept a connection on a socket accept4 -	2	2	1682851326	0	B	-	-	gz	accept a connection on a socket access -	2	2	1682851326	0	A	-	-	gz	check user's permissions for a file access.conf -	5	5	1695329712	0	A	-	-	gz	the login access control table file accessdb -	8	8	1678659839	0	A	-	-	gz	dumps the content of a man-db database in a human readable format acct	2 -	2	2	1682851326	0	A	-	-	gz	switch process accounting on or off acct	5 -	5	5	1682851326	0	A	-	-	gz	process accounting file acos -	3	3	1682851326	0	A	-	t	gz	arc cosine function acosf -	3	3	1682851326	0	B	-	t	gz	arc cosine function acosh -	3	3	1682851326	0	A	-	t	gz	inverse hyperbolic cosine function acoshf -	3	3	1682851326	0	B	-	t	gz	inverse hyperbolic cosine function acoshl -	3	3	1682851326	0	B	-	t	gz	inverse hyperbolic cosine function acosl -	3	3	1682851326	0	B	-	t	gz	arc cosine function actions -	8	8	1684761592	0	C	tc-actions	-	gz	 add-shell -	8	8	1690587995	0	A	-	-	gz	add shells to the list of valid login shells add_key -	2	2	1682851326	0	A	-	-	gz	add a key to the kernel's key management facility addgnupghome -	8	8	1679835785	0	A	-	-	gz	Create .gnupg home directories addgroup -	8	8	1685030075	0	B	-	-	gz	add or manipulate users or groups addmntent -	3	3	1682851326	0	B	-	t	gz	get filesystem descriptor file entry addpart -	8	8	1732219314	0	A	-	-	gz	tell the kernel about the existence of a partition addr2line -	1	1	1673717062	0	A	-	-	gz	convert addresses or symbol+offset into file names and line numbers address_families -	7	7	1682851326	0	A	-	-	gz	socket address families (domains) addseverity -	3	3	1682851326	0	A	-	t	gz	introduce new severity classes adduser -	8	8	1685030075	0	A	-	-	gz	add or manipulate users or groups adduser.local -	8	8	1685030075	0	A	-	-	gz	hook for local actions in adduser and deluser adjtime -	3	3	1682851326	0	A	-	t	gz	correct the time to synchronize the system clock adjtime_config -	5	5	1732219314	0	A	-	-	gz	information about hardware clock setting and drift factor aio -	7	7	1682851326	0	A	-	-	gz	POSIX asynchronous I/O overview apparmor 	AppArmor	7	apparmor	7   bind -	2	2	1682851326	0	A	-	-	gz	bind a name to a socket bindresvport	3t -	3t	3	1660229452	0	A	-	-	gz	bind a socket to a privileged IP port biosdecode -	8	8	1656614228	0	A	-	-	gz	BIOS information decoder blkcat -	1	1	1663567231	0	A	-	-	gz	Display the contents of file system data unit in a disk image. blkdiscard -	8	8	1732219314	0	A	-	-	gz	discard sectors on a device blkzone -	8	8	1732219314	0	A	-	t	gz	run zone command on a device blockdev -	8	8	1732219314	0	A	-	-	gz	call block device ioctls from the command line bpf	2 -	2	2	1682851326	0	A	-	-	gz	perform a command on an extended BPF map or program bridge -	8	8	1684761592	0	A	-	-	gz	show / manipulate bridge addresses and devices bsd_signal -	3	3	1682851326	0	A	-	t	gz	signal handling with BSD semantics bsearch -	3	3	1682851326	0	A	-	t	gz	binary search of a sorted array bswap_64 -	3	3	1682851326	0	B	-	-	gz	reverse order of bytes bzegrep -	1	1	1663556049	0	B	-	-	gz	search possibly bzip2 compressed files for a regular expression bzgrep -	1	1	1663556049	0	A	-	-	gz	search possibly bzip2 compressed files for a regular expression c99 -	1	1	1673168759	0	B	-	-	gz	ANSI (1999) C compiler ca.pl CA.pl	1ssl	1	1752410348	0	A	-	-	gz	friendlier interface for OpenSSL certificate programs cabsl -	3	3	1682851326	0	B	-	t	gz	absolute value of a complex number cacosl -	3	3	1682851326	0	B	-	t	gz	complex arc cosine capget -	2	2	1682851326	0	A	-	-	gz	set/get capabilities of thread(s) casin -	3	3	1682851326	0	A	-	t	gz	complex arc sine casinf -	3	3	1682851326	0	B	-	t	gz	complex arc sine casinh -	3	3	1682851326	0	A	-	t	gz	complex arc sine hyperbolic catanhl -	3	3	1682851326	0	B	-	t	gz	complex arc tangents hyperbolic catanl -	3	3	1682851326	0	B	-	t	gz	complex arc tangents catgets -	3	3	1682851326	0	A	-	t	gz	get message from a message catalog cbc_crypt 	cbc_crypt	3	cbc_crypt	3t cbrt -	3	3	1682851326	0	A	-	t	gz	cube root function cbrtl -	3	3	1682851326	0	B	-	t	gz	cube root function cciss -	4	4	1682851326	0	A	-	t	gz	HP Smart Array block driver ceill -	3	3	1682851326	0	B	-	t	gz	ceiling function: smallest integral value not less than argument cexp2l -	3	3	1682851326	0	B	-	-	gz	base-2 exponent of a complex number cfsetospeed -	3	3	1682851326	0	B	-	t	gz	get and set terminal attributes, line control, get and set baud rate charmap -	5	5	1682851326	0	A	-	-	gz	character set description file charsets -	7	7	1682851326	0	A	-	-	gz	character set standards and internationalization chattr -	1	1	1677986168	0	A	-	-	gz	change file attributes on a Linux file system chgrp -	1	1	1663687647	0	A	-	-	gz	change group ownership chmod	1 -	1	1	1663687647	0	A	-	-	gz	change file mode bits chpasswd -	8	8	1744022326	0	A	-	-	gz	update passwords in batch mode chroot 	chroot	2	chroot	8 chroot	2 -	2	2	1682851326	0	A	-	-	gz	change root directory ciphers -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands circleq_first CIRCLEQ_FIRST	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_foreach_reverse CIRCLEQ_FOREACH_REVERSE	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_head_initializer CIRCLEQ_HEAD_INITIALIZER	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_insert_after CIRCLEQ_INSERT_AFTER	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_last CIRCLEQ_LAST	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_loop_next CIRCLEQ_LOOP_NEXT	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_next CIRCLEQ_NEXT	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue ckbcomp -	1	1	1684704642	0	A	-	-	gz	compile a XKB keyboard description to a keymap suitable for loadkeys or kbdcontrol clnt_broadcast	3t -	3t	3	1660229452	0	C	rpc_soc	-	gz	 clnt_create	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls clnt_create_vers_timed -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_destroy	3t -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_freeres 	clnt_freeres	3	clnt_freeres	3t clnt_geterr 	clnt_geterr	3	clnt_geterr	3t avc_open -	3	3	1685210301	0	A	-	-	gz	userspace SELinux AVC setup and teardown avc_sid_stats -	3	3	1685210301	0	B	-	-	gz	obtain userspace SELinux AVC statistics b2sum -	1	1	1663687647	0	A	-	-	gz	compute and check BLAKE2 message digest backtrace_symbols -	3	3	1682851326	0	B	-	t	gz	support for application self-debugging base32 -	1	1	1663687647	0	A	-	-	gz	base32 encode/decode data and print to standard output bashbug -	1	1	1745016454	0	A	-	-	gz	report a bug in bash bcopy -	3	3	1682851326	0	A	-	t	gz	copy byte sequence be32toh -	3	3	1682851326	0	B	-	-	gz	convert values between host and big-/little-endian byte order be64toh -	3	3	1682851326	0	B	-	-	gz	convert values between host and big-/little-endian byte order bfifo -	8	8	1684761592	0	C	tc-bfifo	-	gz	 bindresvport 	bindresvport	3	bindresvport	3t bindresvport	3 -	3	3	1682851326	0	A	-	t	gz	bind a socket to a privileged IP port bindtextdomain -	3	3	1677424800	0	A	-	-	gz	set directory containing message catalogs binfmt.d -	5	5	1748538242	0	A	-	-	gz	Configure additional binary formats for executables at boot blkdeactivate -	8	8	1666208251	0	A	-	-	gz	utility to deactivate block devices bootparam -	7	7	1682851326	0	A	-	-	gz	introduction to boot time parameters of the Linux kernel bpf-helpers	7 -	7	7	1682851326	0	A	-	-	gz	list of eBPF helper functions break -	2	2	1682851326	0	B	-	-	gz	unimplemented system calls brk -	2	2	1682851326	0	A	-	-	gz	change data segment size bswap -	3	3	1682851326	0	A	-	-	gz	reverse order of bytes bswap_16 -	3	3	1682851326	0	B	-	-	gz	reverse order of bytes btowc -	3	3	1682851326	0	A	-	t	gz	convert single byte to wide character builtins -	7	7	1745016454	0	B	-	-	gz	bash built-in commands, see bash(1) bunzip2 -	1	1	1663556049	0	B	-	-	gz	a block-sorting file compressor, v1.0.8 busctl -	1	1	1748538242	0	A	-	-	gz	Introspect the bus busybox 	BusyBox	1	busybox	1 bzip2 -	1	1	1663556049	0	A	-	-	gz	a block-sorting file compressor, v1.0.8 bzmore -	1	1	1663556049	0	A	-	-	gz	file perusal filter for crt viewing of bzip2 compressed text c89 -	1	1	1605639187	0	B	-	-	gz	ANSI (1989) C compiler c89-gcc -	1	1	1605639187	0	A	-	-	gz	ANSI (1989) C compiler cache_dump -	8	8	1645203069	0	A	-	-	gz	dump cache metadata from device or file to standard output. cache_metadata_size -	8	8	1645203069	0	A	-	-	gz	Estimate the size of the metadata device needed for a given configuration. cacheflush -	2	2	1682851326	0	A	-	-	gz	flush contents of instruction and/or data cache cacoshf -	3	3	1682851326	0	B	-	t	gz	complex arc hyperbolic cosine canonicalize_file_name -	3	3	1682851326	0	A	-	t	gz	return the canonicalized absolute pathname cargl -	3	3	1682851326	0	B	-	t	gz	calculate the complex argument catanhf -	3	3	1682851326	0	B	-	t	gz	complex arc tangents hyperbolic catopen -	3	3	1682851326	0	A	-	t	gz	open/close a message catalog cbs CBS	8	8	1684761592	0	C	tc-cbs	-	gz	 ccoshf -	3	3	1682851326	0	B	-	-	gz	complex hyperbolic cosine ccoshl -	3	3	1682851326	0	B	-	-	gz	complex hyperbolic cosine ccosl -	3	3	1682851326	0	B	-	t	gz	complex cosine function cexp -	3	3	1682851326	0	A	-	t	gz	complex exponential function cexpf -	3	3	1682851326	0	B	-	t	gz	complex exponential function cfdisk -	8	8	1732219314	0	A	-	-	gz	display or manipulate a disk partition table cfgetospeed -	3	3	1682851326	0	B	-	t	gz	get and set terminal attributes, line control, get and set baud rate cfree -	3	3	1682851326	0	A	-	t	gz	free allocated memory cfsetspeed -	3	3	1682851326	0	B	-	t	gz	get and set terminal attributes, line control, get and set baud rate cgroup_namespaces -	7	7	1682851326	0	A	-	-	gz	overview of Linux cgroup namespaces cgroups -	7	7	1682851326	0	A	-	-	gz	Linux control groups chardet -	1	1	1672065725	0	A	-	-	gz	universal character encoding detector chfn -	1	1	1744022326	0	A	-	-	gz	change real user name and information chown 	chown	1	chown	2 chroot	8 -	8	8	1663687647	0	A	-	-	gz	run command or interactive shell with special root directory chvt -	1	1	1679564061	0	A	-	-	gz	change foreground virtual terminal cifs.idmap -	8	8	1661522805	0	A	-	-	gz	Userspace helper for mapping ids for Common Internet File System (CIFS)       	   .   adduser.conf -	5	5	1685030075	0	A	-	-	gz	configuration file for adduser (8) and addgroup (8) adjtimex -	2	2	1682851326	0	A	-	t	gz	tune kernel clock afs_syscall -	2	2	1682851326	0	B	-	-	gz	unimplemented system calls agetty -	8	8	1732219314	0	A	-	-	gz	alternative Linux getty aio_cancel -	3	3	1682851326	0	A	-	t	gz	cancel an outstanding asynchronous I/O request aio_error -	3	3	1682851326	0	A	-	t	gz	get error status of asynchronous I/O operation aio_init -	3	3	1682851326	0	A	-	-	gz	asynchronous I/O initialization aio_return -	3	3	1682851326	0	A	-	t	gz	get return status of asynchronous I/O operation aio_suspend -	3	3	1682851326	0	A	-	t	gz	wait for asynchronous I/O operation or timeout aiocb -	3type	3	1682851326	0	A	-	-	gz	asynchronous I/O control block alarm -	2	2	1682851326	0	A	-	-	gz	set an alarm clock for delivery of a signal algorithm::diff Algorithm::Diff	3pm	3	1608233130	0	A	-	-	gz	Compute `intelligent' differences between two files / lists algorithm::diff::xs Algorithm::Diff::XS	3pm	3	1666163884	0	A	-	-	gz	Algorithm::Diff with XS core loop algorithm::diffold Algorithm::DiffOld	3pm	3	1608233130	0	A	-	-	gz	Compute `intelligent' differences between two files / lists but use the old (<=0.59) interface. algorithm::merge Algorithm::Merge	3pm	3	1665735433	0	A	-	-	gz	Three-way merge and diff alloc_hugepages -	2	2	1682851326	0	A	-	-	gz	allocate or free huge pages alloca -	3	3	1682851326	0	A	-	t	gz	allocate memory that is automatically freed apparmor.vim -	5	5	1676375355	0	A	-	-	gz	vim syntax highlighting file for AppArmor profiles apparmor_parser -	8	8	1676375355	0	A	-	-	gz	loads AppArmor profiles into the kernel apparmor_status -	8	8	1676375355	0	A	-	-	gz	display various information about the current AppArmor policy. apropos -	1	1	1678659839	0	A	-	-	gz	search the manual page names and descriptions apt-config -	8	8	1685023897	0	A	-	-	gz	APT Configuration Query program apt-ftparchive -	1	1	1685023897	0	A	-	-	gz	Utility to generate index files apt-mark -	8	8	1685023897	0	A	-	-	gz	show, set and unset various settings for a package apt-secure -	8	8	1685023897	0	A	-	-	gz	Archive authentication support for APT apt.conf -	5	5	1685023897	0	A	-	-	gz	Configuration file for APT arc4random_buf -	3	3	1682851326	0	B	-	t	gz	cryptographically-secure pseudorandom number generator arc4random_uniform -	3	3	1682851326	0	B	-	t	gz	cryptographically-secure pseudorandom number generator arch -	1	1	1663687647	0	A	-	-	gz	print machine hardware name (same as uname -m) argz_count -	3	3	1682851326	0	B	-	t	gz	functions to handle an argz list argz_create -	3	3	1682851326	0	B	-	t	gz	functions to handle an argz list argz_delete -	3	3	1682851326	0	B	-	t	gz	functions to handle an argz list argz_next -	3	3	1682851326	0	B	-	t	gz	functions to handle an argz list argz_replace -	3	3	1682851326	0	B	-	t	gz	functions to handle an argz list arm_fadvise -	2	2	1682851326	0	B	-	-	gz	predeclare an access pattern for file data armscii-8 -	7	7	1682851326	0	A	-	t	gz	Armenian character set encoded in octal, decimal, and hexadecimal arp	7 -	7	7	1682851326	0	A	-	t	gz	Linux ARP kernel module. arp	8 -	8	8	1748287643	0	A	-	-	gz	manipulate the system ARP cache arptables -	8	8	1673876677	0	C	arptables-nft	-	gz	 arptables-nft -	8	8	1673876677	0	A	-	-	gz	ARP table administration (nft-based) arptables-nft-restore -	8	8	1673876677	0	A	-	-	gz	Restore ARP Tables (nft-based) arptables-nft-save -	8	8	1673876677	0	A	-	-	gz	dump arptables rules to stdout (nft-based) arptables-restore -	8	8	1673876677	0	C	arptables-nft-restore	-	gz	 arptables-save -	8	8	1673876677	0	C	arptables-nft-save	-	gz	 as 	AS	1	as	1 as	1 -	1	1	1673717062	0	A	-	-	gz	the portable GNU assembler. asctime -	3	3	1682851326	0	B	-	t	gz	transform date and time to broken-down time or ASCII asn1parse -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands assert -	3	3	1682851326	0	A	-	t	gz	abort the program if assertion is false assert_perror -	3	3	1682851326	0	A	-	t	gz	test errnum and abort asymmetric -	7	7	1671398158	0	C	asymmetric-key	-	gz	 atan2 -	3	3	1682851326	0	A	-	t	gz	arc tangent function of two variables                 atan2f -	3	3	1682851326	0	B	-	t	gz	arc tangent function of two variables atan2l -	3	3	1682851326	0	B	-	t	gz	arc tangent function of two variables atanh -	3	3	1682851326	0	A	-	t	gz	inverse hyperbolic tangent function atanhf -	3	3	1682851326	0	B	-	t	gz	inverse hyperbolic tangent function atof -	3	3	1682851326	0	A	-	t	gz	convert a string to a double atoq -	3	3	1682851326	0	B	-	t	gz	convert a string to an integer auth_destroy	3t -	3t	3	1660229452	0	C	rpc_clnt_auth	-	gz	 authnone_create	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls authnone_create	3t -	3t	3	1660229452	0	C	rpc_clnt_auth	-	gz	 authorized_keys -	5	5	1753703980	0	B	-	-	gz	OpenSSH daemon authsys_create_default -	3t	3	1660229452	0	C	rpc_clnt_auth	-	gz	 authunix_create 	authunix_create	3	authunix_create	3t authunix_create_default	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls authunix_create_default	3t -	3t	3	1660229452	0	C	rpc_soc	-	gz	 avc_av_stats -	3	3	1685210301	0	B	-	-	gz	obtain userspace SELinux AVC statistics avc_cache_stats -	3	3	1685210301	0	A	-	-	gz	obtain userspace SELinux AVC statistics avc_context_to_sid -	3	3	1685210301	0	A	-	-	gz	obtain and manipulate SELinux security ID's avc_destroy -	3	3	1685210301	0	B	-	-	gz	userspace SELinux AVC setup and teardown avc_entry_ref_init -	3	3	1685210301	0	B	-	-	gz	obtain and audit SELinux access decisions avc_get_initial_context -	3	3	1685210301	0	B	-	-	gz	obtain and manipulate SELinux security ID's avc_has_perm -	3	3	1685210301	0	A	-	-	gz	obtain and audit SELinux access decisions avc_has_perm_noaudit -	3	3	1685210301	0	B	-	-	gz	obtain and audit SELinux access decisions avc_netlink_close -	3	3	1685210301	0	B	-	-	gz	SELinux netlink processing avc_netlink_open -	3	3	1685210301	0	B	-	-	gz	SELinux netlink processing avc_netlink_release_fd -	3	3	1685210301	0	B	-	-	gz	SELinux netlink processing awk -	1	1	1655480126	0	B	-	-	gz	pattern scanning and text processing language badblocks -	8	8	1677986168	0	A	-	-	gz	search a device for bad blocks basename 	basename	1	basename	3 basenc -	1	1	1663687647	0	A	-	-	gz	Encode/decode data and print to standard output be16toh -	3	3	1682851326	0	B	-	-	gz	convert values between host and big-/little-endian byte order bind_textdomain_codeset -	3	3	1677424800	0	A	-	-	gz	set encoding of message translations bindresvport_sa -	3t	3	1660229452	0	C	bindresvport	-	gz	 bio -	7ssl	7	1752410348	0	A	-	-	gz	Basic I/O abstraction blksize_t -	3type	3	1682851326	0	A	-	-	gz	file block sizes bootup -	7	7	1748538242	0	A	-	-	gz	System bootup process bstring -	3	3	1682851326	0	A	-	-	gz	byte string operations btree -	3	3	1682851326	0	A	-	-	gz	btree database access method buildhash -	1	1	1648577943	0	B	-	-	gz	Interactive spelling checking byteorder -	3	3	1682851326	0	A	-	t	gz	convert values between host and network byte order bzcmp -	1	1	1663556049	0	B	-	-	gz	compare bzip2 compressed files bzdiff -	1	1	1663556049	0	A	-	-	gz	compare bzip2 compressed files bzero -	3	3	1682851326	0	A	-	t	gz	zero a byte string bzexe -	1	1	1663556049	0	A	-	-	gz	compress executable files in place bzfgrep -	1	1	1663556049	0	B	-	-	gz	search possibly bzip2 compressed files for a regular expression bzip2recover -	1	1	1663556049	0	B	-	-	gz	recovers data from damaged bzip2 files bzless -	1	1	1663556049	0	B	-	-	gz	file perusal filter for crt viewing of bzip2 compressed text c++filt -	1	1	1673717062	0	A	-	-	gz	demangle C++ and Java symbols c_rehash -	1ssl	1	1752410348	0	B	-	-	gz	Create symbolic links to files named by the hash values ca -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands cabs -	3	3	1682851326	0	A	-	t	gz	absolute value of a complex number cabsf -	3	3	1682851326	0	B	-	t	gz	absolute value of a complex number cache_restore -	8	8	1645203069	0	A	-	-	gz	restore cache metadata file to device or file. calloc -	3	3	1682851326	0	B	-	t	gz	allocate and free dynamic memory callrpc 	callrpc	3	callrpc	3t callrpc	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls capabilities -	7	7	1682851326	0	A	-	-	gz	overview of Linux capabilities exit 	exit	2	exit	3       atexit -	3	3	1682851326	0	A	-	t	gz	register a function to be called at normal process termination atoi -	3	3	1682851326	0	A	-	t	gz	convert a string to an integer atol -	3	3	1682851326	0	B	-	t	gz	convert a string to an integer atoll -	3	3	1682851326	0	B	-	t	gz	convert a string to an integer attributes -	7	7	1682851326	0	A	-	-	gz	POSIX safety concepts auth_destroy 	auth_destroy	3	auth_destroy	3t auth_destroy	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls authnone_create 	authnone_create	3	authnone_create	3t authsys_create -	3t	3	1660229452	0	C	rpc_clnt_auth	-	gz	 authunix_create	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls authunix_create	3t -	3t	3	1660229452	0	C	rpc_soc	-	gz	 authunix_create_default 	authunix_create_default	3	authunix_create_default	3t avc_add_callback -	3	3	1685210301	0	A	-	-	gz	additional event notification for SELinux userspace object managers avc_audit -	3	3	1685210301	0	B	-	-	gz	obtain and audit SELinux access decisions avc_cleanup -	3	3	1685210301	0	B	-	-	gz	userspace SELinux AVC setup and teardown avc_compute_create -	3	3	1685210301	0	A	-	-	gz	obtain SELinux label for new object avc_compute_member -	3	3	1685210301	0	B	-	-	gz	obtain SELinux label for new object avc_get_initial_sid -	3	3	1685210301	0	B	-	-	gz	obtain and manipulate SELinux security ID's avc_init -	3	3	1685210301	0	A	-	-	gz	legacy userspace SELinux AVC setup avc_netlink_acquire_fd -	3	3	1685210301	0	B	-	-	gz	SELinux netlink processing avc_netlink_check_nb -	3	3	1685210301	0	B	-	-	gz	SELinux netlink processing avc_netlink_loop -	3	3	1685210301	0	A	-	-	gz	SELinux netlink processing avc_reset -	3	3	1685210301	0	B	-	-	gz	userspace SELinux AVC setup and teardown avc_sid_to_context -	3	3	1685210301	0	B	-	-	gz	obtain and manipulate SELinux security ID's backtrace -	3	3	1682851326	0	A	-	t	gz	support for application self-debugging backtrace_symbols_fd -	3	3	1682851326	0	B	-	t	gz	support for application self-debugging base64 -	1	1	1663687647	0	A	-	-	gz	base64 encode/decode data and print to standard output basename	1 -	1	1	1663687647	0	A	-	-	gz	strip directory and suffix from filenames basename	3 -	3	3	1682851326	0	A	-	t	gz	parse pathname components bash -	1	1	1745016454	0	A	-	-	gz	GNU Bourne-Again SHell bash-builtins -	7	7	1745016454	0	A	-	-	gz	bash built-in commands, see bash(1) basic -	8	8	1684761592	0	C	tc-basic	-	gz	 bcmp -	3	3	1682851326	0	A	-	-	gz	compare byte sequences bdflush -	2	2	1682851326	0	A	-	-	gz	start, flush, or tune buffer-dirty-flush daemon blkcalc -	1	1	1663567231	0	A	-	-	gz	Converts between unallocated disk unit numbers and regular disk unit numbers. blkcnt_t -	3type	3	1682851326	0	A	-	-	gz	file block counts blkid -	8	8	1732219314	0	A	-	-	gz	locate/print block device attributes blkls -	1	1	1663567231	0	A	-	-	gz	List or output file system data units. blkmapd -	8	8	1733925617	0	A	-	-	gz	pNFS block layout mapping daemon blkstat -	1	1	1663567231	0	A	-	-	gz	Display details of a file system data unit (i.e. block or sector) boot -	7	7	1682851326	0	A	-	-	gz	System bootup process based on UNIX System V Release 4 bpf-helpers 	BPF-HELPERS	7	bpf-helpers	7 bswap_32 -	3	3	1682851326	0	B	-	-	gz	reverse order of bytes busybox	1 -	1	1	1745239638	0	A	-	-	gz	The Swiss Army Knife of Embedded Linux bzcat -	1	1	1663556049	0	B	-	-	gz	decompresses files to stdout c99-gcc -	1	1	1673168759	0	A	-	-	gz	ANSI (1999) C compiler cache_check -	8	8	1645203069	0	A	-	-	gz	validates cache metadata on a device or file. cache_repair -	8	8	1645203069	0	A	-	-	gz	repair cache binary metadata from device/file to device/file. cache_writeback -	8	8	1645203069	0	A	-	-	gz	writeback dirty blocks to the origin device. cacos -	3	3	1682851326	0	A	-	t	gz	complex arc cosine cacosf -	3	3	1682851326	0	B	-	t	gz	complex arc cosine cacosh -	3	3	1682851326	0	A	-	t	gz	complex arc hyperbolic cosine cacoshl -	3	3	1682851326	0	B	-	t	gz	complex arc hyperbolic cosine cake CAKE	8	8	1684761592	0	C	tc-cake	-	gz	 callrpc	3t -	3t	3	1660229452	0	C	rpc_soc	-	gz	 capset -	2	2	1682851326	0	B	-	-	gz	set/get capabilities of thread(s)           crontab 	crontab	1	crontab	5 crontab	1 -	1	1	1677742435	0	A	-	-	gz	maintain crontab files for individual users (Vixie Cron) crypt_checksalt -	3	3	1673045857	0	A	-	t	gz	validate a crypt setting string csqrt -	3	3	1682851326	0	A	-	t	gz	complex square root csqrtf -	3	3	1682851326	0	B	-	t	gz	complex square root cut -	1	1	1663687647	0	A	-	-	gz	remove sections from each line of files daemon	7 -	7	7	1748538242	0	A	-	-	gz	Writing and packaging system daemons date::manip::delta Date::Manip::Delta	3pm	3	1678039562	0	A	-	-	gz	Methods for working with deltas date::manip::history Date::Manip::History	3pm	3	1678039562	0	A	-	-	gz	Twenty years and still going strong date::manip::lang Date::Manip::Lang	3pm	3	1678039562	0	A	-	-	gz	language support for Date::Manip date::manip::lang::finnish Date::Manip::Lang::finnish	3pm	3	1678039562	0	A	-	-	gz	Finnish language support. db -	3	3	1682851326	0	B	-	-	gz	database access methods dbus-daemon -	1	1	1694858638	0	A	-	-	gz	Message bus daemon dcb -	8	8	1684761592	0	A	-	-	gz	show / manipulate DCB (Data Center Bridging) settings dcb-app -	8	8	1684761592	0	A	-	-	gz	show / manipulate application priority table of the DCB (Data Center Bridging) subsystem dcb-ets -	8	8	1684761592	0	A	-	-	gz	show / manipulate ETS (Enhanced Transmission Selection) settings of the DCB (Data Center Bridging) subsystem deb-changelog -	5	5	1683770641	0	A	-	-	gz	dpkg source packages' changelog file format deb-md5sums -	5	5	1683770641	0	A	-	-	gz	package MD5 file digests deb-origin -	5	5	1683770641	0	A	-	-	gz	Vendor-specific information files debconf-communicate -	1	1	1673214651	0	A	-	-	gz	communicate with debconf debian::dictionariescommon.pm Debian::DictionariesCommon.pm	3pm	3	1678828651	0	C	Debian::DictionariesCommon	-	gz	 delgroup -	8	8	1685030075	0	B	-	-	gz	remove a user or group from the system delpart -	8	8	1732219314	0	A	-	-	gz	tell the kernel to forget about a partition devlink -	8	8	1684761592	0	A	-	-	gz	Devlink tool devlink-health -	8	8	1684761592	0	A	-	-	gz	devlink health reporting and recovery devlink-rate -	8	8	1684761592	0	A	-	-	gz	devlink rate management devlink-trap -	8	8	1684761592	0	A	-	-	gz	devlink trap configuration dhclient -	8	8	1681734002	0	A	-	-	gz	Dynamic Host Configuration Protocol Client dhcp-eval -	5	5	1681734002	0	A	-	-	gz	ISC DHCP conditional evaluation diff3 -	1	1	1675450800	0	A	-	-	gz	compare three files line by line discover-modprobe -	8	8	1641714488	0	A	-	-	gz	kernel module loading using discover(1) dl_iterate_phdr -	3	3	1682851326	0	A	-	t	gz	walk through list of shared objects dlclose -	3	3	1682851326	0	B	-	t	gz	open and close a shared object dn_comp -	3	3	1682851326	0	B	-	t	gz	resolver routines dnsdomainname -	1	1	1671456791	0	B	-	-	gz	show the system's DNS domain name dpkg-checkbuilddeps -	1	1	1683770641	0	A	-	-	gz	check build dependencies and conflicts dpkg-reconfigure -	8	8	1673214651	0	A	-	-	gz	reconfigure an already installed package dpkg.cfg -	5	5	1683770641	0	A	-	-	gz	dpkg configuration file dpkg::buildprofiles Dpkg::BuildProfiles	3perl	3	1683770641	0	A	-	-	gz	handle build profiles dpkg::control Dpkg::Control	3perl	3	1683770641	0	A	-	-	gz	parse and manipulate official control-like information dsp56k -	4	4	1682851326	0	A	-	-	gz	DSP56001 interface device e2freefrag -	8	8	1677986168	0	A	-	-	gz	report free space fragmentation information e2fsck.conf -	5	5	1677986168	0	A	-	-	gz	Configuration file for e2fsck e2scrub -	8	8	1677986168	0	A	-	-	gz	check the contents of a mounted ext[234] file system e2scrub_all -	8	8	1677986168	0	A	-	-	gz	check all mounted ext[234] file systems for errors. ebtables -	8	8	1673876677	0	C	ebtables-nft	-	gz	 ec -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands ecvt_r -	3	3	1682851326	0	A	-	t	gz	convert a floating-point number to a string editline -	7edit	7	1669024317	0	A	-	-	gz	line editing user interface eject -	1	1	1732219314	0	A	-	-	gz	eject removable media enc2xs -	1	1	1744470991	0	A	-	-	gz	- Perl Encode Module Generator endaliasent -	3	3	1682851326	0	B	-	t	gz	read an alias entry endgrent -	3	3	1682851326	0	B	-	t	gz	get group file entry ilU"        ]   colcrt -	1	1	1732219314	0	A	-	-	gz	filter nroff output for CRT previewing context_range_get -	3	3	1685210301	0	B	-	-	gz	Routines to manipulate SELinux security contexts copysignf -	3	3	1682851326	0	B	-	t	gz	copy sign of a number corelist -	1	1	1744470991	0	A	-	-	gz	a commandline frontend to Module::CoreList cpan5.36-x86_64-linux-gnu -	1	1	1744470991	0	A	-	-	gz	easily interact with CPAN from the command line cpgr -	8	8	1744022326	0	B	-	-	gz	copy with locking the given file to the password or group file cpowl -	3	3	1682851326	0	B	-	t	gz	complex power function cpu_count_s CPU_COUNT_S	3	3	1682851326	0	B	-	-	gz	macros for manipulating CPU sets cpu_set_s CPU_SET_S	3	3	1682851326	0	B	-	-	gz	macros for manipulating CPU sets crypt	3 -	3	3	1673045857	0	A	-	t	gz	passphrase hashing ctanh -	3	3	1682851326	0	A	-	t	gz	complex hyperbolic tangent daemon	3 -	3	3	1682851326	0	A	-	t	gz	run in the background date::manip::changes5 Date::Manip::Changes5	3pm	3	1678039562	0	A	-	-	gz	changes in Date::Manip 5.xx date::manip::dm5abbrevs Date::Manip::DM5abbrevs	3pm	3	1678039562	0	A	-	-	gz	A list of all timezone abbreviations date::manip::lang::norwegian Date::Manip::Lang::norwegian	3pm	3	1678039562	0	A	-	-	gz	Norwegian language support. date::manip::lang::portugue Date::Manip::Lang::portugue	3pm	3	1678039562	0	A	-	-	gz	Portuguese language support. date::manip::lang::russian Date::Manip::Lang::russian	3pm	3	1678039562	0	A	-	-	gz	Russian language support. date::manip::migration5to6 Date::Manip::Migration5to6	3pm	3	1678039562	0	A	-	-	gz	how to upgrade from 5.xx to 6.00 date::manip::objects Date::Manip::Objects	3pm	3	1678039562	0	A	-	-	gz	A description of the various Date::Manip objects dbus-monitor -	1	1	1694858638	0	A	-	-	gz	debug probe to print message bus messages dbus-run-session -	1	1	1694858638	0	A	-	-	gz	start a process as a new D-Bus session dbus-send -	1	1	1694858638	0	A	-	-	gz	Send a message to a message bus dbus-uuidgen -	1	1	1694858638	0	A	-	-	gz	Utility to generate UUIDs deb-extra-override -	5	5	1683770641	0	A	-	-	gz	Debian archive extra override file deb-old -	5	5	1683770641	0	A	-	-	gz	old style Debian binary package format deb-prerm -	5	5	1683770641	0	A	-	-	gz	package pre-removal maintainer script deb-src-rules -	5	5	1683770641	0	A	-	-	gz	Debian source package rules file delete_module -	2	2	1682851326	0	A	-	-	gz	unload a kernel module deluser.local -	8	8	1685030075	0	B	-	-	gz	hook for local actions in adduser and deluser des_setparity	3t -	3t	3	1660229452	0	C	des_crypt	-	gz	 dev_t -	3type	3	1682851326	0	A	-	-	gz	device ID dhparam -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands dircolors -	1	1	1663687647	0	A	-	-	gz	color setup for ls dirmngr -	8	8	1679835785	0	A	-	-	gz	GnuPG's network access daemon discover -	1	1	1641714488	0	A	-	-	gz	hardware detection utility dmidecode -	8	8	1656614228	0	A	-	t	gz	DMI table decoder dngettext -	3	3	1677424800	0	B	-	-	gz	translate message and choose plural form dnstap-read -	1	1	1737800098	0	A	-	-	gz	print dnstap data in human-readable form dpkg	1 -	1	1	1683770641	0	A	-	-	gz	package manager for Debian dpkg-deb -	1	1	1683770641	0	A	-	-	gz	Debian package archive (.deb) manipulation tool dpkg-split -	1	1	1683770641	0	A	-	-	gz	Debian package archive split/join tool dpkg::arch Dpkg::Arch	3perl	3	1683770641	0	A	-	-	gz	handle architectures dpkg::buildinfo Dpkg::BuildInfo	3perl	3	1683770641	0	A	-	-	gz	handle build information dpkg::checksums Dpkg::Checksums	3perl	3	1683770641	0	A	-	-	gz	generate and manipulate file checksums dpkg::interface::storable Dpkg::Interface::Storable	3perl	3	1683770641	0	A	-	-	gz	common methods related to object serialization dpkg::path Dpkg::Path	3perl	3	1683770641	0	A	-	-	gz	some common path handling functions drand48 -	3	3	1682851326	0	A	-	t	gz	generate uniformly distributed pseudo-random numbers dsaparam -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands du -	1	1	1663687647	0	A	-	-	gz	estimate file space usage ebtables-translate -	8	8	1673876677	0	B	-	-	gz	translation tool to migrate from ebtables to nftables endrpcent	3 -	3	3	1682851326	0	B	-	t	gz	get RPC entry  cifs.upcall -	8	8	1661522805	0	A	-	-	gz	Userspace upcall helper for Common Internet File System (CIFS) cimagl -	3	3	1682851326	0	B	-	t	gz	get imaginary part of a complex number circleq -	3	3	1682851326	0	A	-	-	gz	implementation of a doubly linked circular queue circleq_empty CIRCLEQ_EMPTY	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_head CIRCLEQ_HEAD	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_init CIRCLEQ_INIT	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_insert_before CIRCLEQ_INSERT_BEFORE	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue circleq_prev CIRCLEQ_PREV	3	3	1682851326	0	B	-	-	gz	implementation of a doubly linked circular queue clearenv -	3	3	1682851326	0	A	-	t	gz	clear the environment clearerr -	3	3	1682851326	0	B	-	t	gz	check and reset stream status clearerr_unlocked -	3	3	1682851326	0	B	-	t	gz	nonlocking stdio functions clnt_call	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls clnt_call	3t -	3t	3	1660229452	0	C	rpc_clnt_calls	-	gz	 clnt_create 	clnt_create	3	clnt_create	3t clnt_create	3t -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_create_timed -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_create_vers -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_destroy 	clnt_destroy	3	clnt_destroy	3t clnt_destroy	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls clnt_freeres	3t -	3t	3	1660229452	0	C	rpc_clnt_calls	-	gz	 clnt_geterr	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls clnt_pcreateerror	3t -	3t	3	1660229452	0	C	rpc_clnt_create	-	gz	 clnt_perror 	clnt_perror	3	clnt_perror	3t clnt_perror	3t -	3t	3	1660229452	0	C	rpc_clnt_calls	-	gz	 clnt_spcreateerror 	clnt_spcreateerror	3	clnt_spcreateerror	3t clnt_sperrno	3t -	3t	3	1660229452	0	C	rpc_clnt_calls	-	gz	 clnt_sperror 	clnt_sperror	3	clnt_sperror	3t clnt_sperror	3 -	3	3	1682851326	0	B	-	t	gz	library routines for remote procedure calls clntudp_bufcreate 	clntudp_bufcreate	3	clntudp_bufcreate	3t clock_getcpuclockid -	3	3	1682851326	0	A	-	t	gz	obtain ID of a process CPU-time clock clock_gettime -	2	2	1682851326	0	B	-	t	gz	clock and time functions clog2l -	3	3	1682851326	0	B	-	-	gz	base-2 logarithm of a complex number clone -	2	2	1682851326	0	A	-	t	gz	create a child process close_range -	2	2	1682851326	0	A	-	-	gz	close all file descriptors in a given range closedir -	3	3	1682851326	0	A	-	t	gz	close a directory cms -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands cmsg_data CMSG_DATA	3	3	1682851326	0	B	-	-	gz	access ancillary data codel CoDel	8	8	1684761592	0	C	tc-codel	-	gz	 context_new -	3	3	1685210301	0	A	-	-	gz	Routines to manipulate SELinux security contexts context_role_set -	3	3	1685210301	0	B	-	-	gz	Routines to manipulate SELinux security contexts context_user_set -	3	3	1685210301	0	B	-	-	gz	Routines to manipulate SELinux security contexts cosh -	3	3	1682851326	0	A	-	t	gz	hyperbolic cosine function coshf -	3	3	1682851326	0	B	-	t	gz	hyperbolic cosine function crypt	5 -	5	5	1673045857	0	A	-	-	gz	storage format for hashed passphrases and available hashing methods crypt_rn -	3	3	1673045857	0	B	-	t	gz	passphrase hashing ctime -	3	3	1682851326	0	A	-	t	gz	transform date and time to broken-down time or ASCII date::manip::holidays Date::Manip::Holidays	3pm	3	1678039562	0	A	-	-	gz	describes holidays and events date::manip::misc Date::Manip::Misc	3pm	3	1678039562	0	A	-	-	gz	Miscellaneous information about Date::Manip date::manip::tz_base Date::Manip::TZ_Base	3pm	3	1678039562	0	A	-	-	gz	Methods common to the TZ and Base classes dbus-update-activation-environment -	1	1	1694858638	0	A	-	-	gz	update environment used for D-Bus session services dcb-maxrate -	8	8	1684761592	0	A	-	-	gz	show / manipulate port maxrate settings of the DCB (Data Center Bridging) subsystem dcb-pfc -	8	8	1684761592	0	A	-	-	gz	show / manipulate PFC (Priority-based Flow Control) settings of the DCB (Data Center Bridging) subsystem dpkg 	Dpkg	3perl	dpkg	1                      cpu_clr CPU_CLR	3	3	1682851326	0	B	-	-	gz	macros for manipulating CPU sets cpu_xor CPU_XOR	3	3	1682851326	0	B	-	-	gz	macros for manipulating CPU sets creal -	3	3	1682851326	0	A	-	t	gz	get real part of a complex number crl2pkcs7 -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands crontab	5 -	5	5	1677742435	0	A	-	-	gz	tables for driving cron crypt 	crypt	3	crypt	5 crypt_gensalt -	3	3	1673045857	0	A	-	t	gz	encode settings for passphrase hashing csinh -	3	3	1682851326	0	A	-	t	gz	complex hyperbolic sine csplit -	1	1	1663687647	0	A	-	-	gz	split a file into sections determined by context lines ct 	ct	7ssl	ct	8 ct	7ssl -	7ssl	7	1752410348	0	A	-	-	gz	Certificate Transparency ctanhf -	3	3	1682851326	0	B	-	t	gz	complex hyperbolic tangent ctermid -	3	3	1682851326	0	A	-	t	gz	get controlling terminal name ctime_r -	3	3	1682851326	0	B	-	t	gz	transform date and time to broken-down time or ASCII cvtsudoers -	1	1	1750750190	0	A	-	-	gz	convert between sudoers file formats dash -	1	1	1672924848	0	A	-	-	gz	command interpreter (shell) date::manip Date::Manip	3pm	3	1678039562	0	A	-	-	gz	Date manipulation routines date::manip::calc Date::Manip::Calc	3pm	3	1678039562	0	A	-	-	gz	describes date calculations date::manip::dm5 Date::Manip::DM5	3pm	3	1678039562	0	A	-	-	gz	Date manipulation routines date::manip::lang::italian Date::Manip::Lang::italian	3pm	3	1678039562	0	A	-	-	gz	Italian language support. date::manip::lang::romanian Date::Manip::Lang::romanian	3pm	3	1678039562	0	A	-	-	gz	Romanian language support. date::manip::lang::turkish Date::Manip::Lang::turkish	3pm	3	1678039562	0	A	-	-	gz	Turkish language support. date::manip::problems Date::Manip::Problems	3pm	3	1678039562	0	A	-	-	gz	problems and bugs date::manip::recur Date::Manip::Recur	3pm	3	1678039562	0	A	-	-	gz	methods for working with recurring events date::manip::zones Date::Manip::Zones	3pm	3	1678039562	0	A	-	-	gz	Time zone information dcgettext -	3	3	1677424800	0	B	-	-	gz	translate message deb-postinst -	5	5	1683770641	0	A	-	-	gz	package post-installation maintainer script deb-src-control -	5	5	1683770641	0	A	-	-	gz	Debian source packages' master control file format deb-substvars -	5	5	1683770641	0	A	-	-	gz	Debian source substitution variables deb-systemd-helper -	1p	1	1663465999	0	A	-	-	gz	subset of systemctl for machines not running systemd debconf-set-selections -	1	1	1673214651	0	A	-	-	gz	insert new values into the debconf database debian::dictionariescommon Debian::DictionariesCommon	3pm	3	1678828651	0	A	-	-	gz	dictionaries-common library defmt-sh -	1	1	1648577943	0	B	-	-	gz	a sample ispell deformatter for C, C++, and shell sources depmod -	8	8	1670630544	0	A	-	-	gz	Generate modules.dep and map files. des_crypt	3 -	3	3	1682851326	0	A	-	t	gz	fast DES encryption des_failed DES_FAILED	3	3	1682851326	0	B	-	t	gz	fast DES encryption devlink-dev -	8	8	1684761592	0	A	-	-	gz	devlink device configuration devlink-lc -	8	8	1684761592	0	A	-	-	gz	devlink line card configuration diagnostics -	1	1	1744470991	0	C	splain	-	gz	 dirmngr-client -	1	1	1679835785	0	A	-	-	gz	Tool to access the Dirmngr services discover-pkginstall -	8	8	1641714488	0	A	-	-	gz	intsall packages for available hardware using discover(1) dladdr -	3	3	1682851326	0	A	-	t	gz	translate address to symbolic information dpkg-buildflags -	1	1	1683770641	0	A	-	-	gz	returns build flags to use during package build dpkg-buildpackage -	1	1	1683770641	0	A	-	-	gz	build binary or source packages from sources dpkg-fsys-usrunmess -	8	8	1683770641	0	A	-	-	gz	undoes the merged-/usr-via-aliased-dirs mess dpkg-name -	1	1	1683770641	0	A	-	-	gz	rename Debian packages to full package names dpkg-query -	1	1	1683770641	0	A	-	-	gz	a tool to query the dpkg database dpkg-realpath -	1	1	1683770641	0	A	-	-	gz	print the resolved pathname with DPKG_ROOT support dpkg::buildenv Dpkg::BuildEnv	3perl	3	1683770641	0	A	-	-	gz	track build environment dpkg::conf Dpkg::Conf	3perl	3	1683770641	0	A	-	-	gz	parse dpkg configuration files dpkg::control::fieldscore Dpkg::Control::FieldsCore	3perl	3	1683770641	0	A	-	-	gz	manage (list of official) control fields 
   9   dcb-buffer -	8	8	1684761592	0	A	-	-	gz	show / manipulate port buffer settings of the DCB (Data Center Bridging) subsystem deb-src-files -	5	5	1683770641	0	A	-	-	gz	Debian distribute files format deb-src-symbols -	5	5	1683770641	0	A	-	-	gz	Debian's extended shared library template file debconf -	1	1	1673214651	0	A	-	-	gz	run a debconf-using program deluser -	8	8	1685030075	0	A	-	-	gz	remove a user or group from the system devlink-port -	8	8	1684761592	0	A	-	-	gz	devlink port configuration df -	1	1	1663687647	0	A	-	-	gz	report file system space usage dh_bash-completion -	1	1	1648988074	0	A	-	-	gz	install bash completions for package dhclient-script -	8	8	1681734002	0	A	-	-	gz	DHCP client network configuration script dir -	1	1	1663687647	0	A	-	-	gz	list directory contents dirfd -	3	3	1682851326	0	A	-	t	gz	get directory stream file descriptor dmeventd -	8	8	1666208251	0	A	-	-	gz	Device-mapper event daemon domainname -	1	1	1671456791	0	B	-	-	gz	show or set the system's NIS/YP domain name dosfsck -	8	8	1612746810	0	B	-	-	gz	check and repair MS-DOS FAT filesystems dpkg-statoverride -	1	1	1683770641	0	A	-	-	gz	override ownership and mode of files dpkg::buildtypes Dpkg::BuildTypes	3perl	3	1683770641	0	A	-	-	gz	track build types dpkg::compression::filehandle Dpkg::Compression::FileHandle	3perl	3	1683770641	0	A	-	-	gz	class dealing transparently with file compression dpkg::control::tests Dpkg::Control::Tests	3perl	3	1683770641	0	A	-	-	gz	parse files like debian/tests/control dpkg::deps::multiple Dpkg::Deps::Multiple	3perl	3	1683770641	0	A	-	-	gz	base module to represent multiple dependencies dpkg::deps::or Dpkg::Deps::OR	3perl	3	1683770641	0	A	-	-	gz	list of OR dependencies dpkg::vendor::devuan Dpkg::Vendor::Devuan	3perl	3	1683770641	0	A	-	-	gz	Devuan vendor class dreml -	3	3	1682851326	0	B	-	t	gz	floating-point remainder function dup -	2	2	1682851326	0	A	-	-	gz	duplicate a file descriptor e2image -	8	8	1677986168	0	A	-	-	gz	Save critical ext2/ext3/ext4 file system metadata to a file e4crypt -	8	8	1677986168	0	A	-	-	gz	ext4 file system encryption utility e4defrag -	8	8	1677986168	0	A	-	-	gz	online defragmenter for ext4 file system ecparam -	1ssl	1	1752410348	0	B	-	-	gz	OpenSSL application commands editor -	1	1	1714975801	0	B	-	-	gz	Nano's ANOther editor, inspired by Pico editrc -	5edit	5	1669024317	0	A	-	-	gz	configuration file for editline library end -	3	3	1682851326	0	A	-	-	gz	end of program segments endhostent -	3	3	1682851326	0	B	-	t	gz	get network host entry endpwent -	3	3	1682851326	0	B	-	t	gz	get password file entry endservent -	3	3	1682851326	0	B	-	t	gz	get service entry ether_ntoa -	3	3	1682851326	0	B	-	t	gz	Ethernet address manipulation routines eventfd -	2	2	1682851326	0	A	-	t	gz	create a file descriptor for event notification evp_cipher-camellia EVP_CIPHER-CAMELLIA	7ssl	7	1752410348	0	A	-	-	gz	The CAMELLIA EVP_CIPHER implementations evp_cipher-cast EVP_CIPHER-CAST	7ssl	7	1752410348	0	A	-	-	gz	The CAST EVP_CIPHER implementations evp_keymgmt-dh EVP_KEYMGMT-DH	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY DH and DHX keytype and algorithm support evp_keymgmt-dsa EVP_KEYMGMT-DSA	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY DSA keytype and algorithm support evp_keymgmt-ed448 EVP_KEYMGMT-ED448	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY X25519, X448, ED25519 and ED448 keytype and algorithm support evp_keymgmt-hmac EVP_KEYMGMT-HMAC	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY legacy MAC keytypes and algorithm support evp_keymgmt-rsa EVP_KEYMGMT-RSA	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY RSA keytype and algorithm support evp_md-md5 EVP_MD-MD5	7ssl	7	1752410348	0	A	-	-	gz	The MD5 EVP_MD implementation evp_pkey-dhx EVP_PKEY-DHX	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY DH and DHX keytype and algorithm support evp_pkey-poly1305 EVP_PKEY-Poly1305	7ssl	7	1752410348	0	B	-	-	gz	EVP_PKEY legacy MAC keytypes and algorithm support exit_failure EXIT_FAILURE	3const	3	1682851326	0	B	-	-	gz	termination status constants exp10l -	3	3	1682851326	0	B	-	t	gz	base-10 exponential function expm1 -	3	3	1682851326	0	A	-	t	gz	exponential minus 1 getopt 	getopt	1	getopt	3         8   