dissect.target 3.20.dev8__py3-none-any.whl → 3.20.dev10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dissect/target/filesystems/overlay.py +14 -4
 - dissect/target/helpers/record.py +2 -1
 - dissect/target/plugins/os/unix/bsd/osx/_os.py +2 -18
 - dissect/target/plugins/os/unix/bsd/osx/network.py +90 -0
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/METADATA +1 -1
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/RECORD +11 -10
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/COPYRIGHT +0 -0
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/LICENSE +0 -0
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/WHEEL +0 -0
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/entry_points.txt +0 -0
 - {dissect.target-3.20.dev8.dist-info → dissect.target-3.20.dev10.dist-info}/top_level.txt +0 -0
 
| 
         @@ -89,15 +89,25 @@ class Overlay2Filesystem(LayerFilesystem): 
     | 
|
| 
       89 
89 
     | 
    
         | 
| 
       90 
90 
     | 
    
         
             
                    # append and mount every layer
         
     | 
| 
       91 
91 
     | 
    
         
             
                    for dest, layer in layers:
         
     | 
| 
       92 
     | 
    
         
            -
                         
     | 
| 
      
 92 
     | 
    
         
            +
                        # we could have collected a layer reference that actually does not exist on the host
         
     | 
| 
      
 93 
     | 
    
         
            +
                        if not layer.exists():
         
     | 
| 
      
 94 
     | 
    
         
            +
                            log.warning(
         
     | 
| 
      
 95 
     | 
    
         
            +
                                "Can not mount layer %s for container %s as it does not exist on the host", layer, path.name
         
     | 
| 
      
 96 
     | 
    
         
            +
                            )
         
     | 
| 
      
 97 
     | 
    
         
            +
                            continue
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                        # mount points can be files
         
     | 
| 
      
 100 
     | 
    
         
            +
                        if layer.is_file():
         
     | 
| 
       93 
101 
     | 
    
         
             
                            layer_fs = VirtualFilesystem()
         
     | 
| 
       94 
     | 
    
         
            -
                            layer_fs.map_file_fh( 
     | 
| 
       95 
     | 
    
         
            -
                            dest = dest.split("/")[0]
         
     | 
| 
      
 102 
     | 
    
         
            +
                            layer_fs.map_file_fh(dest, layer.open("rb"))
         
     | 
| 
       96 
103 
     | 
    
         | 
| 
      
 104 
     | 
    
         
            +
                        # regular overlay2 layers are directories
         
     | 
| 
      
 105 
     | 
    
         
            +
                        # mount points can be directories too
         
     | 
| 
       97 
106 
     | 
    
         
             
                        else:
         
     | 
| 
       98 
107 
     | 
    
         
             
                            layer_fs = DirectoryFilesystem(layer)
         
     | 
| 
       99 
108 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
                         
     | 
| 
      
 109 
     | 
    
         
            +
                        log.info("Adding layer %s to destination %s", layer, dest)
         
     | 
| 
      
 110 
     | 
    
         
            +
                        self.append_layer().mount("/" if layer.is_file() else dest, layer_fs)
         
     | 
| 
       101 
111 
     | 
    
         | 
| 
       102 
112 
     | 
    
         
             
                def __repr__(self) -> str:
         
     | 
| 
       103 
113 
     | 
    
         
             
                    return f"<{self.__class__.__name__} {self.base_path}>"
         
     | 
    
        dissect/target/helpers/record.py
    CHANGED
    
    
| 
         @@ -40,24 +40,8 @@ class MacPlugin(BsdPlugin): 
     | 
|
| 
       40 
40 
     | 
    
         
             
                @export(property=True)
         
     | 
| 
       41 
41 
     | 
    
         
             
                def ips(self) -> Optional[list[str]]:
         
     | 
| 
       42 
42 
     | 
    
         
             
                    ips = set()
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
                    if (preferences := self.target.fs.path(self.SYSTEM)).exists():
         
     | 
| 
       46 
     | 
    
         
            -
                        network = plistlib.load(preferences.open()).get("NetworkServices")
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
                        for interface in network.values():
         
     | 
| 
       49 
     | 
    
         
            -
                            for addresses in [interface.get("IPv4"), interface.get("IPv6")]:
         
     | 
| 
       50 
     | 
    
         
            -
                                ips.update(addresses.get("Addresses", []))
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    # IP-addresses configured by DHCP
         
     | 
| 
       53 
     | 
    
         
            -
                    if (dhcp := self.target.fs.path("/private/var/db/dhcpclient/leases")).exists():
         
     | 
| 
       54 
     | 
    
         
            -
                        for lease in dhcp.iterdir():
         
     | 
| 
       55 
     | 
    
         
            -
                            if lease.is_file():
         
     | 
| 
       56 
     | 
    
         
            -
                                lease = plistlib.load(lease.open())
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                                if ip := lease.get("IPAddress"):
         
     | 
| 
       59 
     | 
    
         
            -
                                    ips.add(ip)
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
                    for ip in self.target.network.ips():
         
     | 
| 
      
 44 
     | 
    
         
            +
                        ips.add(str(ip))
         
     | 
| 
       61 
45 
     | 
    
         
             
                    return list(ips)
         
     | 
| 
       62 
46 
     | 
    
         | 
| 
       63 
47 
     | 
    
         
             
                @export(property=True)
         
     | 
| 
         @@ -0,0 +1,90 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            from __future__ import annotations
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            import plistlib
         
     | 
| 
      
 4 
     | 
    
         
            +
            from functools import cache, lru_cache
         
     | 
| 
      
 5 
     | 
    
         
            +
            from typing import Iterator
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            from dissect.target.helpers.record import MacInterfaceRecord
         
     | 
| 
      
 8 
     | 
    
         
            +
            from dissect.target.plugins.general.network import NetworkPlugin
         
     | 
| 
      
 9 
     | 
    
         
            +
            from dissect.target.target import Target
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            class MacNetworkPlugin(NetworkPlugin):
         
     | 
| 
      
 13 
     | 
    
         
            +
                def __init__(self, target: Target):
         
     | 
| 
      
 14 
     | 
    
         
            +
                    super().__init__(target)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    self._plistnetwork = cache(self._plistnetwork)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    self._plistlease = lru_cache(32)(self._plistlease)
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def _plistlease(self, devname: str) -> dict:
         
     | 
| 
      
 19 
     | 
    
         
            +
                    for lease in self.target.fs.glob_ext(f"/private/var/db/dhcpclient/leases/{devname}*"):
         
     | 
| 
      
 20 
     | 
    
         
            +
                        return plistlib.load(lease.open())
         
     | 
| 
      
 21 
     | 
    
         
            +
                    return {}
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def _plistnetwork(self) -> dict:
         
     | 
| 
      
 24 
     | 
    
         
            +
                    if (preferences := self.target.fs.path("/Library/Preferences/SystemConfiguration/preferences.plist")).exists():
         
     | 
| 
      
 25 
     | 
    
         
            +
                        return plistlib.load(preferences.open())
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def _interfaces(self) -> Iterator[MacInterfaceRecord]:
         
     | 
| 
      
 28 
     | 
    
         
            +
                    plistnetwork = self._plistnetwork()
         
     | 
| 
      
 29 
     | 
    
         
            +
                    current_set = plistnetwork.get("CurrentSet")
         
     | 
| 
      
 30 
     | 
    
         
            +
                    sets = plistnetwork.get("Sets", {})
         
     | 
| 
      
 31 
     | 
    
         
            +
                    for name, _set in sets.items():
         
     | 
| 
      
 32 
     | 
    
         
            +
                        if f"/Sets/{name}" == current_set:
         
     | 
| 
      
 33 
     | 
    
         
            +
                            item = _set
         
     | 
| 
      
 34 
     | 
    
         
            +
                            for key in ["Network", "Global", "IPv4", "ServiceOrder"]:
         
     | 
| 
      
 35 
     | 
    
         
            +
                                item = item.get(key, {})
         
     | 
| 
      
 36 
     | 
    
         
            +
                            service_order = item
         
     | 
| 
      
 37 
     | 
    
         
            +
                            break
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    network = plistnetwork.get("NetworkServices", {})
         
     | 
| 
      
 40 
     | 
    
         
            +
                    vlans = plistnetwork.get("VirtualNetworkInterfaces", {}).get("VLAN", {})
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    vlan_lookup = {key: vlan.get("Tag") for key, vlan in vlans.items()}
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    for _id, interface in network.items():
         
     | 
| 
      
 45 
     | 
    
         
            +
                        dns = set()
         
     | 
| 
      
 46 
     | 
    
         
            +
                        gateways = set()
         
     | 
| 
      
 47 
     | 
    
         
            +
                        ips = set()
         
     | 
| 
      
 48 
     | 
    
         
            +
                        device = interface.get("Interface", {})
         
     | 
| 
      
 49 
     | 
    
         
            +
                        name = device.get("DeviceName")
         
     | 
| 
      
 50 
     | 
    
         
            +
                        _type = device.get("Type")
         
     | 
| 
      
 51 
     | 
    
         
            +
                        vlan = vlan_lookup.get(name)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        dhcp = False
         
     | 
| 
      
 53 
     | 
    
         
            +
                        subnetmask = []
         
     | 
| 
      
 54 
     | 
    
         
            +
                        network = []
         
     | 
| 
      
 55 
     | 
    
         
            +
                        interface_service_order = service_order.index(_id) if _id in service_order else None
         
     | 
| 
      
 56 
     | 
    
         
            +
                        try:
         
     | 
| 
      
 57 
     | 
    
         
            +
                            for addr in interface.get("DNS", {}).get("ServerAddresses", {}):
         
     | 
| 
      
 58 
     | 
    
         
            +
                                dns.add(addr)
         
     | 
| 
      
 59 
     | 
    
         
            +
                            for addresses in [interface.get("IPv4", {}), interface.get("IPv6", {})]:
         
     | 
| 
      
 60 
     | 
    
         
            +
                                subnetmask += filter(lambda mask: mask != "", addresses.get("SubnetMasks", []))
         
     | 
| 
      
 61 
     | 
    
         
            +
                                if router := addresses.get("Router"):
         
     | 
| 
      
 62 
     | 
    
         
            +
                                    gateways.add(router)
         
     | 
| 
      
 63 
     | 
    
         
            +
                                if addresses.get("ConfigMethod", "") == "DHCP":
         
     | 
| 
      
 64 
     | 
    
         
            +
                                    ips.add(self._plistlease(name).get("IPAddress"))
         
     | 
| 
      
 65 
     | 
    
         
            +
                                    dhcp = True
         
     | 
| 
      
 66 
     | 
    
         
            +
                                else:
         
     | 
| 
      
 67 
     | 
    
         
            +
                                    for addr in addresses.get("Addresses", []):
         
     | 
| 
      
 68 
     | 
    
         
            +
                                        ips.add(addr)
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                            if subnetmask:
         
     | 
| 
      
 71 
     | 
    
         
            +
                                network = self.calculate_network(ips, subnetmask)
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                            yield MacInterfaceRecord(
         
     | 
| 
      
 74 
     | 
    
         
            +
                                name=name,
         
     | 
| 
      
 75 
     | 
    
         
            +
                                type=_type,
         
     | 
| 
      
 76 
     | 
    
         
            +
                                enabled=not interface.get("__INACTIVE__", False),
         
     | 
| 
      
 77 
     | 
    
         
            +
                                dns=list(dns),
         
     | 
| 
      
 78 
     | 
    
         
            +
                                ip=list(ips),
         
     | 
| 
      
 79 
     | 
    
         
            +
                                gateway=list(gateways),
         
     | 
| 
      
 80 
     | 
    
         
            +
                                source="NetworkServices",
         
     | 
| 
      
 81 
     | 
    
         
            +
                                vlan=vlan,
         
     | 
| 
      
 82 
     | 
    
         
            +
                                network=network,
         
     | 
| 
      
 83 
     | 
    
         
            +
                                interface_service_order=interface_service_order,
         
     | 
| 
      
 84 
     | 
    
         
            +
                                dhcp=dhcp,
         
     | 
| 
      
 85 
     | 
    
         
            +
                                _target=self.target,
         
     | 
| 
      
 86 
     | 
    
         
            +
                            )
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
                        except Exception as e:
         
     | 
| 
      
 89 
     | 
    
         
            +
                            self.target.log.warning("Error reading configuration for network device %s: %s", name, e)
         
     | 
| 
      
 90 
     | 
    
         
            +
                            continue
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Metadata-Version: 2.1
         
     | 
| 
       2 
2 
     | 
    
         
             
            Name: dissect.target
         
     | 
| 
       3 
     | 
    
         
            -
            Version: 3.20. 
     | 
| 
      
 3 
     | 
    
         
            +
            Version: 3.20.dev10
         
     | 
| 
       4 
4 
     | 
    
         
             
            Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
         
     | 
| 
       5 
5 
     | 
    
         
             
            Author-email: Dissect Team <dissect@fox-it.com>
         
     | 
| 
       6 
6 
     | 
    
         
             
            License: Affero General Public License v3
         
     | 
| 
         @@ -35,7 +35,7 @@ dissect/target/filesystems/ffs.py,sha256=Wu8sS1jjmD0QXXcAaD2h_zzfvinjco8qvj0hEru 
     | 
|
| 
       35 
35 
     | 
    
         
             
            dissect/target/filesystems/itunes.py,sha256=w2lcWv6jlBPm84tsGZehxKBMXXyuW3KlmwVTF4ssQec,6395
         
     | 
| 
       36 
36 
     | 
    
         
             
            dissect/target/filesystems/jffs.py,sha256=Ceqa5Em2pepnXMH_XZFmSNjQyWPo1uWTthBFSMWfKRo,3926
         
     | 
| 
       37 
37 
     | 
    
         
             
            dissect/target/filesystems/ntfs.py,sha256=fGgCKjdO5GrPC21DDr0SwIxmwR7KruNIqGUzysboirA,7068
         
     | 
| 
       38 
     | 
    
         
            -
            dissect/target/filesystems/overlay.py,sha256 
     | 
| 
      
 38 
     | 
    
         
            +
            dissect/target/filesystems/overlay.py,sha256=d0BNZcVd3SzBcM1SZO5nX2FrEYcdtVH34BPJQ6Oh4x8,4753
         
     | 
| 
       39 
39 
     | 
    
         
             
            dissect/target/filesystems/smb.py,sha256=uxfcOWwEoDCw8Qpsa94T5Pn-SKd4WXs4OOrzVVI55d8,6406
         
     | 
| 
       40 
40 
     | 
    
         
             
            dissect/target/filesystems/squashfs.py,sha256=ehzlThXB7n96XUvQnsK5tWLsA9HIxYN-Zxl7aO9D7ts,3921
         
     | 
| 
       41 
41 
     | 
    
         
             
            dissect/target/filesystems/tar.py,sha256=EJyvRCU6H7eu0exC0tQggyAZKZ3JFFaihYyx9SIQNqk,5742
         
     | 
| 
         @@ -61,7 +61,7 @@ dissect/target/helpers/mui.py,sha256=i-7XoHbu4WO2fYapK9yGAMW04rFlgRispknc1KQIS5Q 
     | 
|
| 
       61 
61 
     | 
    
         
             
            dissect/target/helpers/network_managers.py,sha256=ByBSe2K3c8hgQC6dokcf-hHdmPcD8PmrOj0xs1C3yhs,25743
         
     | 
| 
       62 
62 
     | 
    
         
             
            dissect/target/helpers/polypath.py,sha256=h8p7m_OCNiQljGwoZh5Aflr9H2ot6CZr6WKq1OSw58o,2175
         
     | 
| 
       63 
63 
     | 
    
         
             
            dissect/target/helpers/protobuf.py,sha256=b4DsnqrRLrefcDjx7rQno-_LBcwtJXxuKf5RdOegzfE,1537
         
     | 
| 
       64 
     | 
    
         
            -
            dissect/target/helpers/record.py,sha256= 
     | 
| 
      
 64 
     | 
    
         
            +
            dissect/target/helpers/record.py,sha256=7Se6ZV8cvwEaGSjRd9bKhVnUAn4W4KR2eqP6AbQhTH4,5892
         
     | 
| 
       65 
65 
     | 
    
         
             
            dissect/target/helpers/record_modifier.py,sha256=O_Jj7zOi891HIyAYjxxe6LFPYETHdMa5lNjo4NA_T_w,3969
         
     | 
| 
       66 
66 
     | 
    
         
             
            dissect/target/helpers/regutil.py,sha256=kX-sSZbW8Qkg29Dn_9zYbaQrwLumrr4Y8zJ1EhHXIAM,27337
         
     | 
| 
       67 
67 
     | 
    
         
             
            dissect/target/helpers/shell_application_ids.py,sha256=hYxrP-YtHK7ZM0ectJFHfoMB8QUXLbYNKmKXMWLZRlA,38132
         
     | 
| 
         @@ -210,7 +210,8 @@ dissect/target/plugins/os/unix/bsd/ios/_os.py,sha256=VlJXGxkQZ4RbGbSC-FlbR2YWOJp 
     | 
|
| 
       210 
210 
     | 
    
         
             
            dissect/target/plugins/os/unix/bsd/openbsd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       211 
211 
     | 
    
         
             
            dissect/target/plugins/os/unix/bsd/openbsd/_os.py,sha256=9npz-osM-wHmjOACUqof5N5HJeps7J8KuyenUS5MZDs,923
         
     | 
| 
       212 
212 
     | 
    
         
             
            dissect/target/plugins/os/unix/bsd/osx/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       213 
     | 
    
         
            -
            dissect/target/plugins/os/unix/bsd/osx/_os.py,sha256= 
     | 
| 
      
 213 
     | 
    
         
            +
            dissect/target/plugins/os/unix/bsd/osx/_os.py,sha256=PKh8VM_O0FmmYy7UMPth6uhusCJzekla20sUPK6esRg,3416
         
     | 
| 
      
 214 
     | 
    
         
            +
            dissect/target/plugins/os/unix/bsd/osx/network.py,sha256=j2yq2QTAmAuZBu3j0vHnHHxkUyeB4b-6WdUSWCE_QsE,3691
         
     | 
| 
       214 
215 
     | 
    
         
             
            dissect/target/plugins/os/unix/bsd/osx/user.py,sha256=qopB0s3n7e6Q7NjWzn8Z-dKtDtU7e6In4Vm7hIvvedo,2322
         
     | 
| 
       215 
216 
     | 
    
         
             
            dissect/target/plugins/os/unix/esxi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         
     | 
| 
       216 
217 
     | 
    
         
             
            dissect/target/plugins/os/unix/esxi/_os.py,sha256=s6pAgUyfHh3QcY6sgvk5uVMmLvqK1tIHWR7MSbrFn8w,17789
         
     | 
| 
         @@ -363,10 +364,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z 
     | 
|
| 
       363 
364 
     | 
    
         
             
            dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
         
     | 
| 
       364 
365 
     | 
    
         
             
            dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
         
     | 
| 
       365 
366 
     | 
    
         
             
            dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
         
     | 
| 
       366 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       367 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       368 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       369 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       370 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       371 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
       372 
     | 
    
         
            -
            dissect.target-3.20. 
     | 
| 
      
 367 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
         
     | 
| 
      
 368 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
         
     | 
| 
      
 369 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/METADATA,sha256=5OxnXAwEsto5SeG-Tz-CR8M_5sqbSNn3Z41qo9bgFYY,12897
         
     | 
| 
      
 370 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
         
     | 
| 
      
 371 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
         
     | 
| 
      
 372 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
         
     | 
| 
      
 373 
     | 
    
         
            +
            dissect.target-3.20.dev10.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     |