diff --git a/meraki/__init__.py b/meraki/__init__.py
index 1e218ff0..1c0355dd 100644
--- a/meraki/__init__.py
+++ b/meraki/__init__.py
@@ -43,7 +43,7 @@
)
from meraki.rest_session import *
-__version__ = '1.54.0'
+__version__ = '1.56.0'
class DashboardAPI(object):
diff --git a/meraki/aio/api/appliance.py b/meraki/aio/api/appliance.py
index 8ccf189c..e3e12909 100644
--- a/meraki/aio/api/appliance.py
+++ b/meraki/aio/api/appliance.py
@@ -667,6 +667,31 @@ def getNetworkApplianceFirewallL7FirewallRulesApplicationCategories(self, networ
+ def updateNetworkApplianceFirewallMulticastForwarding(self, networkId: str, rules: list):
+ """
+ **Update static multicast forward rules for a network**
+ https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-firewall-multicast-forwarding
+
+ - networkId (string): Network ID
+ - rules (array): Static multicast forwarding rules. Pass an empty array to clear all rules.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'firewall', 'multicastForwarding'],
+ 'operation': 'updateNetworkApplianceFirewallMulticastForwarding'
+ }
+ networkId = urllib.parse.quote(str(networkId), safe='')
+ resource = f'/networks/{networkId}/appliance/firewall/multicastForwarding'
+
+ body_params = ['rules', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
def getNetworkApplianceFirewallOneToManyNatRules(self, networkId: str):
"""
**Return the 1:Many NAT mapping rules for an MX network**
@@ -2271,6 +2296,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
- mode (string): The site-to-site VPN mode. Can be one of 'none', 'spoke' or 'hub'
- hubs (array): The list of VPN hubs, in order of preference. In spoke mode, at least 1 hub is required.
- subnets (array): The list of subnets and their VPN presence.
+ - subnet (object): Configuration of subnet features
"""
kwargs.update(locals())
@@ -2286,7 +2312,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/appliance/vpn/siteToSiteVpn'
- body_params = ['mode', 'hubs', 'subnets', ]
+ body_params = ['mode', 'hubs', 'subnets', 'subnet', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -2360,6 +2386,526 @@ def swapNetworkApplianceWarmSpare(self, networkId: str):
+ def getOrganizationApplianceDnsLocalProfiles(self, organizationId: str, **kwargs):
+ """
+ **Fetch the local DNS profiles used in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-profiles
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'getOrganizationApplianceDnsLocalProfiles'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalProfile(self, organizationId: str, name: str):
+ """
+ **Create a new local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def getOrganizationApplianceDnsLocalProfilesAssignments(self, organizationId: str, **kwargs):
+ """
+ **Fetch the local DNS profile assignments in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-profiles-assignments
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments'],
+ 'operation': 'getOrganizationApplianceDnsLocalProfilesAssignments'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments'
+
+ query_params = ['profileIds', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', 'networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str, name: str):
+ """
+ **Update a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceDnsLocalRecords(self, organizationId: str, **kwargs):
+ """
+ **Fetch the DNS records used in local DNS profiles**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-records
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'getOrganizationApplianceDnsLocalRecords'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalRecord(self, organizationId: str, hostname: str, address: str, profile: dict):
+ """
+ **Create a new local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'createOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str, **kwargs):
+ """
+ **Updates a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'updateOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ recordId = urllib.parse.quote(str(recordId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str):
+ """
+ **Deletes a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ recordId = urllib.parse.quote(str(recordId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceDnsSplitProfiles(self, organizationId: str, **kwargs):
+ """
+ **Fetch the split DNS profiles used in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-split-profiles
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'getOrganizationApplianceDnsSplitProfiles'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsSplitProfile(self, organizationId: str, name: str, hostnames: list, nameservers: dict):
+ """
+ **Create a new split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def getOrganizationApplianceDnsSplitProfilesAssignments(self, organizationId: str, **kwargs):
+ """
+ **Fetch the split DNS profile assignments in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-split-profiles-assignments
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments'],
+ 'operation': 'getOrganizationApplianceDnsSplitProfilesAssignments'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments'
+
+ query_params = ['profileIds', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', 'networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str, **kwargs):
+ """
+ **Update a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceFirewallMulticastForwardingByNetwork(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **List Static Multicasting forwarding settings for MX networks**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-firewall-multicast-forwarding-by-network
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'firewall', 'multicastForwarding', 'byNetwork'],
+ 'operation': 'getOrganizationApplianceFirewallMulticastForwardingByNetwork'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/firewall/multicastForwarding/byNetwork'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationApplianceSecurityEvents(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List the security events for an organization**
diff --git a/meraki/aio/api/camera.py b/meraki/aio/api/camera.py
index 67d956b9..b99563c9 100644
--- a/meraki/aio/api/camera.py
+++ b/meraki/aio/api/camera.py
@@ -243,7 +243,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
- motionBasedRetentionEnabled (boolean): Boolean indicating if motion-based retention is enabled(true) or disabled(false) on the camera.
- audioRecordingEnabled (boolean): Boolean indicating if audio recording is enabled(true) or disabled(false) on the camera
- restrictedBandwidthModeEnabled (boolean): Boolean indicating if restricted bandwidth is enabled(true) or disabled(false) on the camera. This setting does not apply to MV2 cameras.
- - quality (string): Quality of the camera. Can be one of 'Standard', 'High' or 'Enhanced'. Not all qualities are supported by every camera model.
+ - quality (string): Quality of the camera. Can be one of 'Standard', 'High', 'Enhanced' or 'Ultra'. Not all qualities are supported by every camera model.
- resolution (string): Resolution of the camera. Can be one of '1280x720', '1920x1080', '1080x1080', '2112x2112', '2880x2880', '2688x1512' or '3840x2160'.Not all resolutions are supported by every camera model.
- motionDetectorVersion (integer): The version of the motion detector that will be used by the camera. Only applies to Gen 2 cameras. Defaults to v2.
"""
@@ -251,7 +251,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
kwargs.update(locals())
if 'quality' in kwargs:
- options = ['Enhanced', 'High', 'Standard']
+ options = ['Enhanced', 'High', 'Standard', 'Ultra']
assert kwargs['quality'] in options, f'''"quality" cannot be "{kwargs['quality']}", & must be set to one of: {options}'''
if 'resolution' in kwargs:
options = ['1080x1080', '1280x720', '1920x1080', '2112x2112', '2688x1512', '2880x2880', '3840x2160']
diff --git a/meraki/aio/api/licensing.py b/meraki/aio/api/licensing.py
index 4e1d1c2f..dc253820 100644
--- a/meraki/aio/api/licensing.py
+++ b/meraki/aio/api/licensing.py
@@ -37,18 +37,18 @@ def getAdministeredLicensingSubscriptionEntitlements(self, **kwargs):
- def getAdministeredLicensingSubscriptionSubscriptions(self, total_pages=1, direction='next', **kwargs):
+ def getAdministeredLicensingSubscriptionSubscriptions(self, organizationIds: list, total_pages=1, direction='next', **kwargs):
"""
**List available subscriptions**
https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-subscriptions
+ - organizationIds (array): Organizations to get associated subscriptions for
- total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
- direction (string): direction to paginate, either "next" (default) or "prev" page
- perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
- startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- subscriptionIds (array): List of subscription ids to fetch
- - organizationIds (array): Organizations to get associated subscriptions for
- startDate (string): Filter subscriptions by start date, ISO 8601 format. To filter with a range of dates, use 'startDate[]=?' in the request. Accepted options include lt, gt, lte, gte.
- endDate (string): Filter subscriptions by end date, ISO 8601 format. To filter with a range of dates, use 'endDate[ ]=?' in the request. Accepted options include lt, gt, lte, gte.
- statuses (array): List of statuses that returned subscriptions can have
diff --git a/meraki/aio/api/networks.py b/meraki/aio/api/networks.py
index b30d21f4..26eb918f 100644
--- a/meraki/aio/api/networks.py
+++ b/meraki/aio/api/networks.py
@@ -1183,6 +1183,7 @@ def createNetworkFloorPlan(self, networkId: str, name: str, imageContents: str,
- bottomRightCorner (object): The longitude and latitude of the bottom right corner of your floor plan.
- topLeftCorner (object): The longitude and latitude of the top left corner of your floor plan.
- topRightCorner (object): The longitude and latitude of the top right corner of your floor plan.
+ - floorNumber (integer): The floor number of the floors within the building
"""
kwargs.update(locals())
@@ -1194,7 +1195,7 @@ def createNetworkFloorPlan(self, networkId: str, name: str, imageContents: str,
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/floorPlans'
- body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'imageContents', ]
+ body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'floorNumber', 'imageContents', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.post(metadata, resource, payload)
@@ -1360,6 +1361,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
- bottomRightCorner (object): The longitude and latitude of the bottom right corner of your floor plan.
- topLeftCorner (object): The longitude and latitude of the top left corner of your floor plan.
- topRightCorner (object): The longitude and latitude of the top right corner of your floor plan.
+ - floorNumber (integer): The floor number of the floors within the building
- imageContents (string): The file contents (a base 64 encoded string) of your new image. Supported formats are PNG, GIF, and JPG. Note that all images are saved as PNG files, regardless of the format they are uploaded in. If you upload a new image, and you do NOT specify any new geolocation fields ('center, 'topLeftCorner', etc), the floor plan will be recentered with no rotation in order to maintain the aspect ratio of your new image.
"""
@@ -1373,7 +1375,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
floorPlanId = urllib.parse.quote(str(floorPlanId), safe='')
resource = f'/networks/{networkId}/floorPlans/{floorPlanId}'
- body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'imageContents', ]
+ body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'floorNumber', 'imageContents', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -1541,7 +1543,10 @@ def deleteNetworkGroupPolicy(self, networkId: str, groupPolicyId: str, **kwargs)
groupPolicyId = urllib.parse.quote(str(groupPolicyId), safe='')
resource = f'/networks/{networkId}/groupPolicies/{groupPolicyId}'
- return self._session.delete(metadata, resource)
+ query_params = ['force', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.delete(metadata, resource, params)
@@ -1659,7 +1664,10 @@ def deleteNetworkMerakiAuthUser(self, networkId: str, merakiAuthUserId: str, **k
merakiAuthUserId = urllib.parse.quote(str(merakiAuthUserId), safe='')
resource = f'/networks/{networkId}/merakiAuthUsers/{merakiAuthUserId}'
- return self._session.delete(metadata, resource)
+ query_params = ['delete', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.delete(metadata, resource, params)
diff --git a/meraki/aio/api/organizations.py b/meraki/aio/api/organizations.py
index bddfe62f..6f046d2b 100644
--- a/meraki/aio/api/organizations.py
+++ b/meraki/aio/api/organizations.py
@@ -2284,6 +2284,48 @@ def getOrganizationDevicesStatusesOverview(self, organizationId: str, **kwargs):
+ def getOrganizationDevicesSystemMemoryUsageHistoryByInterval(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return the memory utilization history in kB for devices in the organization.**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-devices-system-memory-usage-history-by-interval
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 31 days after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The default is 2 hours. If interval is provided, the timespan will be autocalculated.
+ - interval (integer): The time interval in seconds for returned data. The valid intervals are: 300, 1200, 3600, 14400. The default is 300. Interval is calculated if time params are provided.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ - productTypes (array): Optional parameter to filter device statuses by product type. Valid types are wireless, appliance, switch, systemsManager, camera, cellularGateway, sensor, wirelessController, and secureConnect.
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['organizations', 'monitor', 'devices', 'system', 'memory', 'usage', 'history', 'byInterval'],
+ 'operation': 'getOrganizationDevicesSystemMemoryUsageHistoryByInterval'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/devices/system/memory/usage/history/byInterval'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 't0', 't1', 'timespan', 'interval', 'networkIds', 'serials', 'productTypes', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', 'productTypes', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationDevicesUplinksAddressesByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List the current uplink addresses for devices in an organization.**
diff --git a/meraki/aio/api/sensor.py b/meraki/aio/api/sensor.py
index ef783498..d1f44ff3 100644
--- a/meraki/aio/api/sensor.py
+++ b/meraki/aio/api/sensor.py
@@ -219,6 +219,8 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
- schedule (object): The sensor schedule to use with the alert profile.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -230,7 +232,7 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/sensor/alerts/profiles'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.post(metadata, resource, payload)
@@ -270,6 +272,8 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
- conditions (array): List of conditions that will cause the profile to send an alert.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -282,7 +286,7 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
id = urllib.parse.quote(str(id), safe='')
resource = f'/networks/{networkId}/sensor/alerts/profiles/{id}'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -412,7 +416,7 @@ def getOrganizationSensorReadingsHistory(self, organizationId: str, total_pages=
- timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 7 days. The default is 2 hours.
- networkIds (array): Optional parameter to filter readings by network.
- serials (array): Optional parameter to filter readings by sensor.
- - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door, downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower, remoteLockoutSwitch, temperature, tvoc, voltage, and water.
+ - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved.
"""
kwargs.update(locals())
@@ -450,7 +454,7 @@ def getOrganizationSensorReadingsLatest(self, organizationId: str, total_pages=1
- endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- networkIds (array): Optional parameter to filter readings by network.
- serials (array): Optional parameter to filter readings by sensor.
- - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door, downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower, remoteLockoutSwitch, temperature, tvoc, voltage, and water.
+ - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved.
"""
kwargs.update(locals())
diff --git a/meraki/aio/api/switch.py b/meraki/aio/api/switch.py
index 9079b24f..31afb100 100644
--- a/meraki/aio/api/switch.py
+++ b/meraki/aio/api/switch.py
@@ -136,7 +136,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- tags (array): The list of tags of the switch port.
- enabled (boolean): The status of the switch port.
- poeEnabled (boolean): The PoE status of the switch port.
- - type (string): The type of the switch port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch port. Only applicable to trunk ports.
@@ -163,7 +163,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
@@ -190,14 +190,25 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- def getDeviceSwitchRoutingInterfaces(self, serial: str):
+ def getDeviceSwitchRoutingInterfaces(self, serial: str, **kwargs):
"""
**List layer 3 interfaces for a switch**
https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-interfaces
- serial (string): Serial
+ - mode (string): Optional parameter to filter L3 interfaces by mode.
+ - protocol (string): Optional parameter to filter L3 interfaces by protocol.
"""
+ kwargs.update(locals())
+
+ if 'mode' in kwargs:
+ options = ['loopback', 'routed', 'vlan']
+ assert kwargs['mode'] in options, f'''"mode" cannot be "{kwargs['mode']}", & must be set to one of: {options}'''
+ if 'protocol' in kwargs:
+ options = ['ipv4', 'ipv6']
+ assert kwargs['protocol'] in options, f'''"protocol" cannot be "{kwargs['protocol']}", & must be set to one of: {options}'''
+
metadata = {
'tags': ['switch', 'configure', 'routing', 'interfaces'],
'operation': 'getDeviceSwitchRoutingInterfaces'
@@ -205,7 +216,10 @@ def getDeviceSwitchRoutingInterfaces(self, serial: str):
serial = urllib.parse.quote(str(serial), safe='')
resource = f'/devices/{serial}/switch/routing/interfaces'
- return self._session.get(metadata, resource)
+ query_params = ['mode', 'protocol', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.get(metadata, resource, params)
@@ -2421,7 +2435,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
- tags (array): The list of tags of the switch template port.
- enabled (boolean): The status of the switch template port.
- poeEnabled (boolean): The PoE status of the switch template port.
- - type (string): The type of the switch template port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch template port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch template port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch template port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch template port. Only applicable to trunk ports.
@@ -2446,7 +2460,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
diff --git a/meraki/aio/api/wireless.py b/meraki/aio/api/wireless.py
index c9dfac01..fc284ca2 100644
--- a/meraki/aio/api/wireless.py
+++ b/meraki/aio/api/wireless.py
@@ -1021,10 +1021,15 @@ def updateNetworkWirelessElectronicShelfLabel(self, networkId: str, **kwargs):
- networkId (string): Network ID
- hostname (string): Desired ESL hostname of the network
- enabled (boolean): Turn ESL features on and off for this network
+ - mode (string): Electronic shelf label mode of the network. Valid options are 'Bluetooth', 'high frequency'
"""
kwargs.update(locals())
+ if 'mode' in kwargs:
+ options = ['Bluetooth', 'high frequency']
+ assert kwargs['mode'] in options, f'''"mode" cannot be "{kwargs['mode']}", & must be set to one of: {options}'''
+
metadata = {
'tags': ['wireless', 'configure', 'electronicShelfLabel'],
'operation': 'updateNetworkWirelessElectronicShelfLabel'
@@ -1032,7 +1037,7 @@ def updateNetworkWirelessElectronicShelfLabel(self, networkId: str, **kwargs):
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/wireless/electronicShelfLabel'
- body_params = ['hostname', 'enabled', ]
+ body_params = ['hostname', 'enabled', 'mode', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -1666,7 +1671,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
- name (string): The name of the SSID
- enabled (boolean): Whether or not the SSID is enabled
- localAuth (boolean): Extended local auth flag for Enterprise NAC
- - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius' or 'ipsk-with-nac')
+ - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk')
- enterpriseAdminAccess (string): Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled')
- encryptionMode (string): The psk encryption mode for the SSID ('wep' or 'wpa'). This param is only valid if the authMode is 'psk'
- psk (string): The passkey for the SSID. This param is only valid if the authMode is 'psk'
@@ -1729,7 +1734,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
kwargs.update(locals())
if 'authMode' in kwargs:
- options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
+ options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-with-radius-easy-psk', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
assert kwargs['authMode'] in options, f'''"authMode" cannot be "{kwargs['authMode']}", & must be set to one of: {options}'''
if 'enterpriseAdminAccess' in kwargs:
options = ['access disabled', 'access enabled']
@@ -2297,6 +2302,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
- guestSponsorship (object): Details associated with guest sponsored splash.
- billing (object): Details associated with billing splash.
- sentryEnrollment (object): Systems Manager sentry enrollment splash settings.
+ - selfRegistration (object): Self-registration settings for splash with Meraki authentication.
"""
kwargs.update(locals())
@@ -2316,7 +2322,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
number = urllib.parse.quote(str(number), safe='')
resource = f'/networks/{networkId}/wireless/ssids/{number}/splash/settings'
- body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', ]
+ body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', 'selfRegistration', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -2900,6 +2906,86 @@ def getOrganizationWirelessDevicesPacketLossByNetwork(self, organizationId: str,
+ def getOrganizationWirelessDevicesPowerModeHistory(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return a record of power mode changes for wireless devices in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-power-mode-history
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 1 day from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 1 day after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 1 day. The default is 1 day.
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'monitor', 'devices', 'power', 'mode', 'history'],
+ 'operation': 'getOrganizationWirelessDevicesPowerModeHistory'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/devices/power/mode/history'
+
+ query_params = ['t0', 't1', 'timespan', 'perPage', 'startingAfter', 'endingBefore', 'networkIds', 'serials', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
+ def getOrganizationWirelessDevicesSystemCpuLoadHistory(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return the CPU Load history for a list of wireless devices in the organization.**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-system-cpu-load-history
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 1 day from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 1 day after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 1 day. The default is 1 day.
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'monitor', 'devices', 'system', 'cpu', 'load', 'history'],
+ 'operation': 'getOrganizationWirelessDevicesSystemCpuLoadHistory'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/devices/system/cpu/load/history'
+
+ query_params = ['t0', 't1', 'timespan', 'perPage', 'startingAfter', 'endingBefore', 'networkIds', 'serials', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationWirelessDevicesWirelessControllersByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List of Catalyst access points information**
@@ -3007,6 +3093,120 @@ def getOrganizationWirelessRfProfilesAssignmentsByDevice(self, organizationId: s
+ def getOrganizationWirelessSsidsFirewallIsolationAllowlistEntries(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **List the L2 isolation allow list MAC entry in an organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-ssids-firewall-isolation-allowlist-entries
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): networkIds array to filter out results
+ - ssids (array): ssids number array to filter out results
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'getOrganizationWirelessSsidsFirewallIsolationAllowlistEntries'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 'networkIds', 'ssids', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'ssids', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
+ def createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, client: dict, ssid: dict, network: dict, **kwargs):
+ """
+ **Create isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - client (object): The client of allowlist
+ - ssid (object): The SSID that allowlist belongs to
+ - network (object): The Network that allowlist belongs to
+ - description (string): The description of mac address
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries'
+
+ body_params = ['description', 'client', 'ssid', 'network', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str):
+ """
+ **Destroy isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ """
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ entryId = urllib.parse.quote(str(entryId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str, **kwargs):
+ """
+ **Update isolation allow list MAC entry info**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ - description (string): The description of mac address
+ - client (object): The client of allowlist
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ entryId = urllib.parse.quote(str(entryId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ body_params = ['description', 'client', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
def getOrganizationWirelessSsidsStatusesByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List status information of all BSSIDs in your organization**
diff --git a/meraki/api/appliance.py b/meraki/api/appliance.py
index 0c2fe7dc..ba1c3ae6 100644
--- a/meraki/api/appliance.py
+++ b/meraki/api/appliance.py
@@ -667,6 +667,31 @@ def getNetworkApplianceFirewallL7FirewallRulesApplicationCategories(self, networ
+ def updateNetworkApplianceFirewallMulticastForwarding(self, networkId: str, rules: list):
+ """
+ **Update static multicast forward rules for a network**
+ https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-firewall-multicast-forwarding
+
+ - networkId (string): Network ID
+ - rules (array): Static multicast forwarding rules. Pass an empty array to clear all rules.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'firewall', 'multicastForwarding'],
+ 'operation': 'updateNetworkApplianceFirewallMulticastForwarding'
+ }
+ networkId = urllib.parse.quote(str(networkId), safe='')
+ resource = f'/networks/{networkId}/appliance/firewall/multicastForwarding'
+
+ body_params = ['rules', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
def getNetworkApplianceFirewallOneToManyNatRules(self, networkId: str):
"""
**Return the 1:Many NAT mapping rules for an MX network**
@@ -2271,6 +2296,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
- mode (string): The site-to-site VPN mode. Can be one of 'none', 'spoke' or 'hub'
- hubs (array): The list of VPN hubs, in order of preference. In spoke mode, at least 1 hub is required.
- subnets (array): The list of subnets and their VPN presence.
+ - subnet (object): Configuration of subnet features
"""
kwargs.update(locals())
@@ -2286,7 +2312,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/appliance/vpn/siteToSiteVpn'
- body_params = ['mode', 'hubs', 'subnets', ]
+ body_params = ['mode', 'hubs', 'subnets', 'subnet', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -2360,6 +2386,526 @@ def swapNetworkApplianceWarmSpare(self, networkId: str):
+ def getOrganizationApplianceDnsLocalProfiles(self, organizationId: str, **kwargs):
+ """
+ **Fetch the local DNS profiles used in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-profiles
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'getOrganizationApplianceDnsLocalProfiles'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalProfile(self, organizationId: str, name: str):
+ """
+ **Create a new local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def getOrganizationApplianceDnsLocalProfilesAssignments(self, organizationId: str, **kwargs):
+ """
+ **Fetch the local DNS profile assignments in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-profiles-assignments
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments'],
+ 'operation': 'getOrganizationApplianceDnsLocalProfilesAssignments'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments'
+
+ query_params = ['profileIds', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', 'networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str, name: str):
+ """
+ **Update a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceDnsLocalRecords(self, organizationId: str, **kwargs):
+ """
+ **Fetch the DNS records used in local DNS profiles**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-local-records
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'getOrganizationApplianceDnsLocalRecords'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsLocalRecord(self, organizationId: str, hostname: str, address: str, profile: dict):
+ """
+ **Create a new local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'createOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str, **kwargs):
+ """
+ **Updates a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'updateOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ recordId = urllib.parse.quote(str(recordId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str):
+ """
+ **Deletes a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalRecord'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ recordId = urllib.parse.quote(str(recordId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceDnsSplitProfiles(self, organizationId: str, **kwargs):
+ """
+ **Fetch the split DNS profiles used in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-split-profiles
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'getOrganizationApplianceDnsSplitProfiles'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles'
+
+ query_params = ['profileIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsSplitProfile(self, organizationId: str, name: str, hostnames: list, nameservers: dict):
+ """
+ **Create a new split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def getOrganizationApplianceDnsSplitProfilesAssignments(self, organizationId: str, **kwargs):
+ """
+ **Fetch the split DNS profile assignments in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-dns-split-profiles-assignments
+
+ - organizationId (string): Organization ID
+ - profileIds (array): Optional parameter to filter the results by profile IDs
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments'],
+ 'operation': 'getOrganizationApplianceDnsSplitProfilesAssignments'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments'
+
+ query_params = ['profileIds', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['profileIds', 'networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get(metadata, resource, params)
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def updateOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str, **kwargs):
+ """
+ **Update a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
+ def deleteOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsSplitProfile'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ profileId = urllib.parse.quote(str(profileId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def getOrganizationApplianceFirewallMulticastForwardingByNetwork(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **List Static Multicasting forwarding settings for MX networks**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-appliance-firewall-multicast-forwarding-by-network
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the results by network IDs
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'firewall', 'multicastForwarding', 'byNetwork'],
+ 'operation': 'getOrganizationApplianceFirewallMulticastForwardingByNetwork'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/appliance/firewall/multicastForwarding/byNetwork'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 'networkIds', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationApplianceSecurityEvents(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List the security events for an organization**
diff --git a/meraki/api/batch/appliance.py b/meraki/api/batch/appliance.py
index 9a7ffae6..1c48f464 100644
--- a/meraki/api/batch/appliance.py
+++ b/meraki/api/batch/appliance.py
@@ -158,6 +158,37 @@ def updateNetworkApplianceFirewallL7FirewallRules(self, networkId: str, **kwargs
+ def updateNetworkApplianceFirewallMulticastForwarding(self, networkId: str, rules: list):
+ """
+ **Update static multicast forward rules for a network**
+ https://developer.cisco.com/meraki/api-v1/#!update-network-appliance-firewall-multicast-forwarding
+
+ - networkId (string): Network ID
+ - rules (array): Static multicast forwarding rules. Pass an empty array to clear all rules.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'firewall', 'multicastForwarding'],
+ 'operation': 'updateNetworkApplianceFirewallMulticastForwarding'
+ }
+ resource = f'/networks/{networkId}/appliance/firewall/multicastForwarding'
+
+ body_params = ['rules', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "update",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
def updateNetworkAppliancePort(self, networkId: str, portId: str, **kwargs):
"""
**Update the per-port VLAN settings for a single MX port.**
@@ -988,6 +1019,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
- mode (string): The site-to-site VPN mode. Can be one of 'none', 'spoke' or 'hub'
- hubs (array): The list of VPN hubs, in order of preference. In spoke mode, at least 1 hub is required.
- subnets (array): The list of subnets and their VPN presence.
+ - subnet (object): Configuration of subnet features
"""
kwargs.update(locals())
@@ -1002,7 +1034,7 @@ def updateNetworkApplianceVpnSiteToSiteVpn(self, networkId: str, mode: str, **kw
}
resource = f'/networks/{networkId}/appliance/vpn/siteToSiteVpn'
- body_params = ['mode', 'hubs', 'subnets', ]
+ body_params = ['mode', 'hubs', 'subnets', 'subnet', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
@@ -1076,6 +1108,405 @@ def swapNetworkApplianceWarmSpare(self, networkId: str):
+ def createOrganizationApplianceDnsLocalProfile(self, organizationId: str, name: str):
+ """
+ **Create a new local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkCreate'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "bulk_create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the local DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsLocalProfilesAssignmentsBulkDelete'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "bulk_delete",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def updateOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str, name: str):
+ """
+ **Update a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsLocalProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ body_params = ['name', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "update",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def deleteOrganizationApplianceDnsLocalProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a local DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/profiles/{profileId}'
+
+ action = {
+ "resource": resource,
+ "operation": "destroy",
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsLocalRecord(self, organizationId: str, hostname: str, address: str, profile: dict):
+ """
+ **Create a new local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'createOrganizationApplianceDnsLocalRecord'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def updateOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str, **kwargs):
+ """
+ **Updates a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ - hostname (string): Hostname for the DNS record
+ - address (string): IP for the DNS record
+ - profile (object): The profile the DNS record is associated with
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'updateOrganizationApplianceDnsLocalRecord'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ body_params = ['hostname', 'address', 'profile', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "update",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def deleteOrganizationApplianceDnsLocalRecord(self, organizationId: str, recordId: str):
+ """
+ **Deletes a local DNS record**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-local-record
+
+ - organizationId (string): Organization ID
+ - recordId (string): Record ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'local', 'records'],
+ 'operation': 'deleteOrganizationApplianceDnsLocalRecord'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/local/records/{recordId}'
+
+ action = {
+ "resource": resource,
+ "operation": "destroy",
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsSplitProfile(self, organizationId: str, name: str, hostnames: list, nameservers: dict):
+ """
+ **Create a new split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate(self, organizationId: str, items: list):
+ """
+ **Assign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-create
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the network ID and Profile ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkCreate'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkCreate'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkCreate'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "bulk_create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete(self, organizationId: str, items: list):
+ """
+ **Unassign the split DNS profile to networks in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-appliance-dns-split-profiles-assignments-bulk-delete
+
+ - organizationId (string): Organization ID
+ - items (array): List containing the assignment ID
+ """
+
+ kwargs = locals()
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles', 'assignments', 'bulkDelete'],
+ 'operation': 'createOrganizationApplianceDnsSplitProfilesAssignmentsBulkDelete'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/assignments/bulkDelete'
+
+ body_params = ['items', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "bulk_delete",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def updateOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str, **kwargs):
+ """
+ **Update a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ - name (string): Name of profile
+ - hostnames (array): The hostname patterns to match for redirection. For more information on Split DNS hostname pattern formatting, please consult the Split DNS KB.
+ - nameservers (object): Contains the nameserver information for redirection.
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'updateOrganizationApplianceDnsSplitProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ body_params = ['name', 'hostnames', 'nameservers', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "update",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def deleteOrganizationApplianceDnsSplitProfile(self, organizationId: str, profileId: str):
+ """
+ **Deletes a split DNS profile**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-appliance-dns-split-profile
+
+ - organizationId (string): Organization ID
+ - profileId (string): Profile ID
+ """
+
+ metadata = {
+ 'tags': ['appliance', 'configure', 'dns', 'split', 'profiles'],
+ 'operation': 'deleteOrganizationApplianceDnsSplitProfile'
+ }
+ resource = f'/organizations/{organizationId}/appliance/dns/split/profiles/{profileId}'
+
+ action = {
+ "resource": resource,
+ "operation": "destroy",
+ }
+ return action
+
+
+
+
+
+
def updateOrganizationApplianceVpnThirdPartyVPNPeers(self, organizationId: str, peers: list):
"""
**Update the third party VPN peers for an organization**
diff --git a/meraki/api/batch/camera.py b/meraki/api/batch/camera.py
index 640a629a..42a34b2e 100644
--- a/meraki/api/batch/camera.py
+++ b/meraki/api/batch/camera.py
@@ -50,7 +50,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
- motionBasedRetentionEnabled (boolean): Boolean indicating if motion-based retention is enabled(true) or disabled(false) on the camera.
- audioRecordingEnabled (boolean): Boolean indicating if audio recording is enabled(true) or disabled(false) on the camera
- restrictedBandwidthModeEnabled (boolean): Boolean indicating if restricted bandwidth is enabled(true) or disabled(false) on the camera. This setting does not apply to MV2 cameras.
- - quality (string): Quality of the camera. Can be one of 'Standard', 'High' or 'Enhanced'. Not all qualities are supported by every camera model.
+ - quality (string): Quality of the camera. Can be one of 'Standard', 'High', 'Enhanced' or 'Ultra'. Not all qualities are supported by every camera model.
- resolution (string): Resolution of the camera. Can be one of '1280x720', '1920x1080', '1080x1080', '2112x2112', '2880x2880', '2688x1512' or '3840x2160'.Not all resolutions are supported by every camera model.
- motionDetectorVersion (integer): The version of the motion detector that will be used by the camera. Only applies to Gen 2 cameras. Defaults to v2.
"""
@@ -58,7 +58,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
kwargs.update(locals())
if 'quality' in kwargs:
- options = ['Enhanced', 'High', 'Standard']
+ options = ['Enhanced', 'High', 'Standard', 'Ultra']
assert kwargs['quality'] in options, f'''"quality" cannot be "{kwargs['quality']}", & must be set to one of: {options}'''
if 'resolution' in kwargs:
options = ['1080x1080', '1280x720', '1920x1080', '2112x2112', '2688x1512', '2880x2880', '3840x2160']
diff --git a/meraki/api/batch/networks.py b/meraki/api/batch/networks.py
index 6b73c032..233cbdca 100644
--- a/meraki/api/batch/networks.py
+++ b/meraki/api/batch/networks.py
@@ -532,6 +532,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
- bottomRightCorner (object): The longitude and latitude of the bottom right corner of your floor plan.
- topLeftCorner (object): The longitude and latitude of the top left corner of your floor plan.
- topRightCorner (object): The longitude and latitude of the top right corner of your floor plan.
+ - floorNumber (integer): The floor number of the floors within the building
- imageContents (string): The file contents (a base 64 encoded string) of your new image. Supported formats are PNG, GIF, and JPG. Note that all images are saved as PNG files, regardless of the format they are uploaded in. If you upload a new image, and you do NOT specify any new geolocation fields ('center, 'topLeftCorner', etc), the floor plan will be recentered with no rotation in order to maintain the aspect ratio of your new image.
"""
@@ -543,7 +544,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
}
resource = f'/networks/{networkId}/floorPlans/{floorPlanId}'
- body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'imageContents', ]
+ body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'floorNumber', 'imageContents', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
diff --git a/meraki/api/batch/sensor.py b/meraki/api/batch/sensor.py
index f8f534f4..ce0b90bb 100644
--- a/meraki/api/batch/sensor.py
+++ b/meraki/api/batch/sensor.py
@@ -80,6 +80,8 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
- schedule (object): The sensor schedule to use with the alert profile.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -90,7 +92,7 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
}
resource = f'/networks/{networkId}/sensor/alerts/profiles'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
@@ -116,6 +118,8 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
- conditions (array): List of conditions that will cause the profile to send an alert.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -126,7 +130,7 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
}
resource = f'/networks/{networkId}/sensor/alerts/profiles/{id}'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
diff --git a/meraki/api/batch/switch.py b/meraki/api/batch/switch.py
index d82ae03f..f749644d 100644
--- a/meraki/api/batch/switch.py
+++ b/meraki/api/batch/switch.py
@@ -49,7 +49,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- tags (array): The list of tags of the switch port.
- enabled (boolean): The status of the switch port.
- poeEnabled (boolean): The PoE status of the switch port.
- - type (string): The type of the switch port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch port. Only applicable to trunk ports.
@@ -76,7 +76,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
@@ -1585,7 +1585,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
- tags (array): The list of tags of the switch template port.
- enabled (boolean): The status of the switch template port.
- poeEnabled (boolean): The PoE status of the switch template port.
- - type (string): The type of the switch template port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch template port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch template port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch template port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch template port. Only applicable to trunk ports.
@@ -1610,7 +1610,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
diff --git a/meraki/api/batch/wireless.py b/meraki/api/batch/wireless.py
index 764d8b6f..a21c2d73 100644
--- a/meraki/api/batch/wireless.py
+++ b/meraki/api/batch/wireless.py
@@ -344,17 +344,22 @@ def updateNetworkWirelessElectronicShelfLabel(self, networkId: str, **kwargs):
- networkId (string): Network ID
- hostname (string): Desired ESL hostname of the network
- enabled (boolean): Turn ESL features on and off for this network
+ - mode (string): Electronic shelf label mode of the network. Valid options are 'Bluetooth', 'high frequency'
"""
kwargs.update(locals())
+ if 'mode' in kwargs:
+ options = ['Bluetooth', 'high frequency']
+ assert kwargs['mode'] in options, f'''"mode" cannot be "{kwargs['mode']}", & must be set to one of: {options}'''
+
metadata = {
'tags': ['wireless', 'configure', 'electronicShelfLabel'],
'operation': 'updateNetworkWirelessElectronicShelfLabel'
}
resource = f'/networks/{networkId}/wireless/electronicShelfLabel'
- body_params = ['hostname', 'enabled', ]
+ body_params = ['hostname', 'enabled', 'mode', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
@@ -699,7 +704,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
- name (string): The name of the SSID
- enabled (boolean): Whether or not the SSID is enabled
- localAuth (boolean): Extended local auth flag for Enterprise NAC
- - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius' or 'ipsk-with-nac')
+ - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk')
- enterpriseAdminAccess (string): Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled')
- encryptionMode (string): The psk encryption mode for the SSID ('wep' or 'wpa'). This param is only valid if the authMode is 'psk'
- psk (string): The passkey for the SSID. This param is only valid if the authMode is 'psk'
@@ -762,7 +767,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
kwargs.update(locals())
if 'authMode' in kwargs:
- options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
+ options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-with-radius-easy-psk', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
assert kwargs['authMode'] in options, f'''"authMode" cannot be "{kwargs['authMode']}", & must be set to one of: {options}'''
if 'enterpriseAdminAccess' in kwargs:
options = ['access disabled', 'access enabled']
@@ -1171,6 +1176,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
- guestSponsorship (object): Details associated with guest sponsored splash.
- billing (object): Details associated with billing splash.
- sentryEnrollment (object): Systems Manager sentry enrollment splash settings.
+ - selfRegistration (object): Self-registration settings for splash with Meraki authentication.
"""
kwargs.update(locals())
@@ -1188,7 +1194,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
}
resource = f'/networks/{networkId}/wireless/ssids/{number}/splash/settings'
- body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', ]
+ body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', 'selfRegistration', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
action = {
"resource": resource,
@@ -1302,3 +1308,96 @@ def recalculateOrganizationWirelessRadioAutoRfChannels(self, organizationId: str
+
+
+ def createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, client: dict, ssid: dict, network: dict, **kwargs):
+ """
+ **Create isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - client (object): The client of allowlist
+ - ssid (object): The SSID that allowlist belongs to
+ - network (object): The Network that allowlist belongs to
+ - description (string): The description of mac address
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries'
+
+ body_params = ['description', 'client', 'ssid', 'network', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "create",
+ "body": payload
+ }
+ return action
+
+
+
+
+
+
+ def deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str):
+ """
+ **Destroy isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ """
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ action = {
+ "resource": resource,
+ "operation": "destroy",
+ }
+ return action
+
+
+
+
+
+
+ def updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str, **kwargs):
+ """
+ **Update isolation allow list MAC entry info**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ - description (string): The description of mac address
+ - client (object): The client of allowlist
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ body_params = ['description', 'client', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+ action = {
+ "resource": resource,
+ "operation": "update",
+ "body": payload
+ }
+ return action
+
+
+
+
diff --git a/meraki/api/camera.py b/meraki/api/camera.py
index ed2e3803..f05a3d4c 100644
--- a/meraki/api/camera.py
+++ b/meraki/api/camera.py
@@ -243,7 +243,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
- motionBasedRetentionEnabled (boolean): Boolean indicating if motion-based retention is enabled(true) or disabled(false) on the camera.
- audioRecordingEnabled (boolean): Boolean indicating if audio recording is enabled(true) or disabled(false) on the camera
- restrictedBandwidthModeEnabled (boolean): Boolean indicating if restricted bandwidth is enabled(true) or disabled(false) on the camera. This setting does not apply to MV2 cameras.
- - quality (string): Quality of the camera. Can be one of 'Standard', 'High' or 'Enhanced'. Not all qualities are supported by every camera model.
+ - quality (string): Quality of the camera. Can be one of 'Standard', 'High', 'Enhanced' or 'Ultra'. Not all qualities are supported by every camera model.
- resolution (string): Resolution of the camera. Can be one of '1280x720', '1920x1080', '1080x1080', '2112x2112', '2880x2880', '2688x1512' or '3840x2160'.Not all resolutions are supported by every camera model.
- motionDetectorVersion (integer): The version of the motion detector that will be used by the camera. Only applies to Gen 2 cameras. Defaults to v2.
"""
@@ -251,7 +251,7 @@ def updateDeviceCameraQualityAndRetention(self, serial: str, **kwargs):
kwargs.update(locals())
if 'quality' in kwargs:
- options = ['Enhanced', 'High', 'Standard']
+ options = ['Enhanced', 'High', 'Standard', 'Ultra']
assert kwargs['quality'] in options, f'''"quality" cannot be "{kwargs['quality']}", & must be set to one of: {options}'''
if 'resolution' in kwargs:
options = ['1080x1080', '1280x720', '1920x1080', '2112x2112', '2688x1512', '2880x2880', '3840x2160']
diff --git a/meraki/api/licensing.py b/meraki/api/licensing.py
index 7e9ba3ff..045796d8 100644
--- a/meraki/api/licensing.py
+++ b/meraki/api/licensing.py
@@ -37,18 +37,18 @@ def getAdministeredLicensingSubscriptionEntitlements(self, **kwargs):
- def getAdministeredLicensingSubscriptionSubscriptions(self, total_pages=1, direction='next', **kwargs):
+ def getAdministeredLicensingSubscriptionSubscriptions(self, organizationIds: list, total_pages=1, direction='next', **kwargs):
"""
**List available subscriptions**
https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-subscriptions
+ - organizationIds (array): Organizations to get associated subscriptions for
- total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
- direction (string): direction to paginate, either "next" (default) or "prev" page
- perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
- startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- subscriptionIds (array): List of subscription ids to fetch
- - organizationIds (array): Organizations to get associated subscriptions for
- startDate (string): Filter subscriptions by start date, ISO 8601 format. To filter with a range of dates, use 'startDate[ ]=?' in the request. Accepted options include lt, gt, lte, gte.
- endDate (string): Filter subscriptions by end date, ISO 8601 format. To filter with a range of dates, use 'endDate[ ]=?' in the request. Accepted options include lt, gt, lte, gte.
- statuses (array): List of statuses that returned subscriptions can have
diff --git a/meraki/api/networks.py b/meraki/api/networks.py
index 820e04e4..7ab80865 100644
--- a/meraki/api/networks.py
+++ b/meraki/api/networks.py
@@ -1183,6 +1183,7 @@ def createNetworkFloorPlan(self, networkId: str, name: str, imageContents: str,
- bottomRightCorner (object): The longitude and latitude of the bottom right corner of your floor plan.
- topLeftCorner (object): The longitude and latitude of the top left corner of your floor plan.
- topRightCorner (object): The longitude and latitude of the top right corner of your floor plan.
+ - floorNumber (integer): The floor number of the floors within the building
"""
kwargs.update(locals())
@@ -1194,7 +1195,7 @@ def createNetworkFloorPlan(self, networkId: str, name: str, imageContents: str,
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/floorPlans'
- body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'imageContents', ]
+ body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'floorNumber', 'imageContents', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.post(metadata, resource, payload)
@@ -1360,6 +1361,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
- bottomRightCorner (object): The longitude and latitude of the bottom right corner of your floor plan.
- topLeftCorner (object): The longitude and latitude of the top left corner of your floor plan.
- topRightCorner (object): The longitude and latitude of the top right corner of your floor plan.
+ - floorNumber (integer): The floor number of the floors within the building
- imageContents (string): The file contents (a base 64 encoded string) of your new image. Supported formats are PNG, GIF, and JPG. Note that all images are saved as PNG files, regardless of the format they are uploaded in. If you upload a new image, and you do NOT specify any new geolocation fields ('center, 'topLeftCorner', etc), the floor plan will be recentered with no rotation in order to maintain the aspect ratio of your new image.
"""
@@ -1373,7 +1375,7 @@ def updateNetworkFloorPlan(self, networkId: str, floorPlanId: str, **kwargs):
floorPlanId = urllib.parse.quote(str(floorPlanId), safe='')
resource = f'/networks/{networkId}/floorPlans/{floorPlanId}'
- body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'imageContents', ]
+ body_params = ['name', 'center', 'bottomLeftCorner', 'bottomRightCorner', 'topLeftCorner', 'topRightCorner', 'floorNumber', 'imageContents', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -1541,7 +1543,10 @@ def deleteNetworkGroupPolicy(self, networkId: str, groupPolicyId: str, **kwargs)
groupPolicyId = urllib.parse.quote(str(groupPolicyId), safe='')
resource = f'/networks/{networkId}/groupPolicies/{groupPolicyId}'
- return self._session.delete(metadata, resource)
+ query_params = ['force', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.delete(metadata, resource, params)
@@ -1659,7 +1664,10 @@ def deleteNetworkMerakiAuthUser(self, networkId: str, merakiAuthUserId: str, **k
merakiAuthUserId = urllib.parse.quote(str(merakiAuthUserId), safe='')
resource = f'/networks/{networkId}/merakiAuthUsers/{merakiAuthUserId}'
- return self._session.delete(metadata, resource)
+ query_params = ['delete', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.delete(metadata, resource, params)
diff --git a/meraki/api/organizations.py b/meraki/api/organizations.py
index 3e8c2955..c5708154 100644
--- a/meraki/api/organizations.py
+++ b/meraki/api/organizations.py
@@ -2284,6 +2284,48 @@ def getOrganizationDevicesStatusesOverview(self, organizationId: str, **kwargs):
+ def getOrganizationDevicesSystemMemoryUsageHistoryByInterval(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return the memory utilization history in kB for devices in the organization.**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-devices-system-memory-usage-history-by-interval
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 31 days from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 31 days after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 31 days. The default is 2 hours. If interval is provided, the timespan will be autocalculated.
+ - interval (integer): The time interval in seconds for returned data. The valid intervals are: 300, 1200, 3600, 14400. The default is 300. Interval is calculated if time params are provided.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ - productTypes (array): Optional parameter to filter device statuses by product type. Valid types are wireless, appliance, switch, systemsManager, camera, cellularGateway, sensor, wirelessController, and secureConnect.
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['organizations', 'monitor', 'devices', 'system', 'memory', 'usage', 'history', 'byInterval'],
+ 'operation': 'getOrganizationDevicesSystemMemoryUsageHistoryByInterval'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/devices/system/memory/usage/history/byInterval'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 't0', 't1', 'timespan', 'interval', 'networkIds', 'serials', 'productTypes', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', 'productTypes', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationDevicesUplinksAddressesByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List the current uplink addresses for devices in an organization.**
diff --git a/meraki/api/sensor.py b/meraki/api/sensor.py
index 4a7995b8..cf79e05f 100644
--- a/meraki/api/sensor.py
+++ b/meraki/api/sensor.py
@@ -219,6 +219,8 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
- schedule (object): The sensor schedule to use with the alert profile.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -230,7 +232,7 @@ def createNetworkSensorAlertsProfile(self, networkId: str, name: str, conditions
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/sensor/alerts/profiles'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.post(metadata, resource, payload)
@@ -270,6 +272,8 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
- conditions (array): List of conditions that will cause the profile to send an alert.
- recipients (object): List of recipients that will receive the alert.
- serials (array): List of device serials assigned to this sensor alert profile.
+ - includeSensorUrl (boolean): Include dashboard link to sensor in messages (default: true).
+ - message (string): A custom message that will appear in email and text message alerts.
"""
kwargs.update(locals())
@@ -282,7 +286,7 @@ def updateNetworkSensorAlertsProfile(self, networkId: str, id: str, **kwargs):
id = urllib.parse.quote(str(id), safe='')
resource = f'/networks/{networkId}/sensor/alerts/profiles/{id}'
- body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', ]
+ body_params = ['name', 'schedule', 'conditions', 'recipients', 'serials', 'includeSensorUrl', 'message', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -412,7 +416,7 @@ def getOrganizationSensorReadingsHistory(self, organizationId: str, total_pages=
- timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 7 days. The default is 2 hours.
- networkIds (array): Optional parameter to filter readings by network.
- serials (array): Optional parameter to filter readings by sensor.
- - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door, downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower, remoteLockoutSwitch, temperature, tvoc, voltage, and water.
+ - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved.
"""
kwargs.update(locals())
@@ -450,7 +454,7 @@ def getOrganizationSensorReadingsLatest(self, organizationId: str, total_pages=1
- endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- networkIds (array): Optional parameter to filter readings by network.
- serials (array): Optional parameter to filter readings by sensor.
- - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved. Allowed values are apparentPower, battery, button, co2, current, door, downstreamPower, frequency, humidity, indoorAirQuality, noise, pm25, powerFactor, realPower, remoteLockoutSwitch, temperature, tvoc, voltage, and water.
+ - metrics (array): Types of sensor readings to retrieve. If no metrics are supplied, all available types of readings will be retrieved.
"""
kwargs.update(locals())
diff --git a/meraki/api/switch.py b/meraki/api/switch.py
index cbbdb585..2d8161d6 100644
--- a/meraki/api/switch.py
+++ b/meraki/api/switch.py
@@ -136,7 +136,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- tags (array): The list of tags of the switch port.
- enabled (boolean): The status of the switch port.
- poeEnabled (boolean): The PoE status of the switch port.
- - type (string): The type of the switch port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch port. Only applicable to trunk ports.
@@ -163,7 +163,7 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
@@ -190,14 +190,25 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- def getDeviceSwitchRoutingInterfaces(self, serial: str):
+ def getDeviceSwitchRoutingInterfaces(self, serial: str, **kwargs):
"""
**List layer 3 interfaces for a switch**
https://developer.cisco.com/meraki/api-v1/#!get-device-switch-routing-interfaces
- serial (string): Serial
+ - mode (string): Optional parameter to filter L3 interfaces by mode.
+ - protocol (string): Optional parameter to filter L3 interfaces by protocol.
"""
+ kwargs.update(locals())
+
+ if 'mode' in kwargs:
+ options = ['loopback', 'routed', 'vlan']
+ assert kwargs['mode'] in options, f'''"mode" cannot be "{kwargs['mode']}", & must be set to one of: {options}'''
+ if 'protocol' in kwargs:
+ options = ['ipv4', 'ipv6']
+ assert kwargs['protocol'] in options, f'''"protocol" cannot be "{kwargs['protocol']}", & must be set to one of: {options}'''
+
metadata = {
'tags': ['switch', 'configure', 'routing', 'interfaces'],
'operation': 'getDeviceSwitchRoutingInterfaces'
@@ -205,7 +216,10 @@ def getDeviceSwitchRoutingInterfaces(self, serial: str):
serial = urllib.parse.quote(str(serial), safe='')
resource = f'/devices/{serial}/switch/routing/interfaces'
- return self._session.get(metadata, resource)
+ query_params = ['mode', 'protocol', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ return self._session.get(metadata, resource, params)
@@ -2421,7 +2435,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
- tags (array): The list of tags of the switch template port.
- enabled (boolean): The status of the switch template port.
- poeEnabled (boolean): The PoE status of the switch template port.
- - type (string): The type of the switch template port ('trunk', 'access' or 'stack').
+ - type (string): The type of the switch template port ('trunk', 'access', 'stack' or 'routed').
- vlan (integer): The VLAN of the switch template port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch template port. Only applicable to access ports.
- allowedVlans (string): The VLANs allowed on the switch template port. Only applicable to trunk ports.
@@ -2446,7 +2460,7 @@ def updateOrganizationConfigTemplateSwitchProfilePort(self, organizationId: str,
kwargs.update(locals())
if 'type' in kwargs:
- options = ['access', 'stack', 'trunk']
+ options = ['access', 'routed', 'stack', 'trunk']
assert kwargs['type'] in options, f'''"type" cannot be "{kwargs['type']}", & must be set to one of: {options}'''
if 'stpGuard' in kwargs:
options = ['bpdu guard', 'disabled', 'loop guard', 'root guard']
diff --git a/meraki/api/wireless.py b/meraki/api/wireless.py
index 0e2c52d8..67c4b1e8 100644
--- a/meraki/api/wireless.py
+++ b/meraki/api/wireless.py
@@ -1021,10 +1021,15 @@ def updateNetworkWirelessElectronicShelfLabel(self, networkId: str, **kwargs):
- networkId (string): Network ID
- hostname (string): Desired ESL hostname of the network
- enabled (boolean): Turn ESL features on and off for this network
+ - mode (string): Electronic shelf label mode of the network. Valid options are 'Bluetooth', 'high frequency'
"""
kwargs.update(locals())
+ if 'mode' in kwargs:
+ options = ['Bluetooth', 'high frequency']
+ assert kwargs['mode'] in options, f'''"mode" cannot be "{kwargs['mode']}", & must be set to one of: {options}'''
+
metadata = {
'tags': ['wireless', 'configure', 'electronicShelfLabel'],
'operation': 'updateNetworkWirelessElectronicShelfLabel'
@@ -1032,7 +1037,7 @@ def updateNetworkWirelessElectronicShelfLabel(self, networkId: str, **kwargs):
networkId = urllib.parse.quote(str(networkId), safe='')
resource = f'/networks/{networkId}/wireless/electronicShelfLabel'
- body_params = ['hostname', 'enabled', ]
+ body_params = ['hostname', 'enabled', 'mode', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -1666,7 +1671,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
- name (string): The name of the SSID
- enabled (boolean): Whether or not the SSID is enabled
- localAuth (boolean): Extended local auth flag for Enterprise NAC
- - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius' or 'ipsk-with-nac')
+ - authMode (string): The association control method for the SSID ('open', 'open-enhanced', 'psk', 'open-with-radius', 'open-with-nac', '8021x-meraki', '8021x-nac', '8021x-radius', '8021x-google', '8021x-entra', '8021x-localradius', 'ipsk-with-radius', 'ipsk-without-radius', 'ipsk-with-nac' or 'ipsk-with-radius-easy-psk')
- enterpriseAdminAccess (string): Whether or not an SSID is accessible by 'enterprise' administrators ('access disabled' or 'access enabled')
- encryptionMode (string): The psk encryption mode for the SSID ('wep' or 'wpa'). This param is only valid if the authMode is 'psk'
- psk (string): The passkey for the SSID. This param is only valid if the authMode is 'psk'
@@ -1729,7 +1734,7 @@ def updateNetworkWirelessSsid(self, networkId: str, number: str, **kwargs):
kwargs.update(locals())
if 'authMode' in kwargs:
- options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
+ options = ['8021x-entra', '8021x-google', '8021x-localradius', '8021x-meraki', '8021x-nac', '8021x-radius', 'ipsk-with-nac', 'ipsk-with-radius', 'ipsk-with-radius-easy-psk', 'ipsk-without-radius', 'open', 'open-enhanced', 'open-with-nac', 'open-with-radius', 'psk']
assert kwargs['authMode'] in options, f'''"authMode" cannot be "{kwargs['authMode']}", & must be set to one of: {options}'''
if 'enterpriseAdminAccess' in kwargs:
options = ['access disabled', 'access enabled']
@@ -2297,6 +2302,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
- guestSponsorship (object): Details associated with guest sponsored splash.
- billing (object): Details associated with billing splash.
- sentryEnrollment (object): Systems Manager sentry enrollment splash settings.
+ - selfRegistration (object): Self-registration settings for splash with Meraki authentication.
"""
kwargs.update(locals())
@@ -2316,7 +2322,7 @@ def updateNetworkWirelessSsidSplashSettings(self, networkId: str, number: str, *
number = urllib.parse.quote(str(number), safe='')
resource = f'/networks/{networkId}/wireless/ssids/{number}/splash/settings'
- body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', ]
+ body_params = ['splashUrl', 'useSplashUrl', 'splashTimeout', 'redirectUrl', 'useRedirectUrl', 'welcomeMessage', 'themeId', 'splashLogo', 'splashImage', 'splashPrepaidFront', 'blockAllTrafficBeforeSignOn', 'controllerDisconnectionBehavior', 'allowSimultaneousLogins', 'guestSponsorship', 'billing', 'sentryEnrollment', 'selfRegistration', ]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
return self._session.put(metadata, resource, payload)
@@ -2900,6 +2906,86 @@ def getOrganizationWirelessDevicesPacketLossByNetwork(self, organizationId: str,
+ def getOrganizationWirelessDevicesPowerModeHistory(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return a record of power mode changes for wireless devices in the organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-power-mode-history
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 1 day from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 1 day after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 1 day. The default is 1 day.
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'monitor', 'devices', 'power', 'mode', 'history'],
+ 'operation': 'getOrganizationWirelessDevicesPowerModeHistory'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/devices/power/mode/history'
+
+ query_params = ['t0', 't1', 'timespan', 'perPage', 'startingAfter', 'endingBefore', 'networkIds', 'serials', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
+ def getOrganizationWirelessDevicesSystemCpuLoadHistory(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **Return the CPU Load history for a list of wireless devices in the organization.**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-devices-system-cpu-load-history
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - t0 (string): The beginning of the timespan for the data. The maximum lookback period is 1 day from today.
+ - t1 (string): The end of the timespan for the data. t1 can be a maximum of 1 day after t0.
+ - timespan (number): The timespan for which the information will be fetched. If specifying timespan, do not specify parameters t0 and t1. The value must be in seconds and be less than or equal to 1 day. The default is 1 day.
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 20. Default is 10.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): Optional parameter to filter the result set by the included set of network IDs
+ - serials (array): Optional parameter to filter device availabilities history by device serial numbers
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'monitor', 'devices', 'system', 'cpu', 'load', 'history'],
+ 'operation': 'getOrganizationWirelessDevicesSystemCpuLoadHistory'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/devices/system/cpu/load/history'
+
+ query_params = ['t0', 't1', 'timespan', 'perPage', 'startingAfter', 'endingBefore', 'networkIds', 'serials', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'serials', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
def getOrganizationWirelessDevicesWirelessControllersByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List of Catalyst access points information**
@@ -3007,6 +3093,120 @@ def getOrganizationWirelessRfProfilesAssignmentsByDevice(self, organizationId: s
+ def getOrganizationWirelessSsidsFirewallIsolationAllowlistEntries(self, organizationId: str, total_pages=1, direction='next', **kwargs):
+ """
+ **List the L2 isolation allow list MAC entry in an organization**
+ https://developer.cisco.com/meraki/api-v1/#!get-organization-wireless-ssids-firewall-isolation-allowlist-entries
+
+ - organizationId (string): Organization ID
+ - total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
+ - direction (string): direction to paginate, either "next" (default) or "prev" page
+ - perPage (integer): The number of entries per page returned. Acceptable range is 3 - 1000. Default is 1000.
+ - startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
+ - networkIds (array): networkIds array to filter out results
+ - ssids (array): ssids number array to filter out results
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'getOrganizationWirelessSsidsFirewallIsolationAllowlistEntries'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries'
+
+ query_params = ['perPage', 'startingAfter', 'endingBefore', 'networkIds', 'ssids', ]
+ params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}
+
+ array_params = ['networkIds', 'ssids', ]
+ for k, v in kwargs.items():
+ if k.strip() in array_params:
+ params[f'{k.strip()}[]'] = kwargs[f'{k}']
+ params.pop(k.strip())
+
+ return self._session.get_pages(metadata, resource, params, total_pages, direction)
+
+
+
+ def createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, client: dict, ssid: dict, network: dict, **kwargs):
+ """
+ **Create isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!create-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - client (object): The client of allowlist
+ - ssid (object): The SSID that allowlist belongs to
+ - network (object): The Network that allowlist belongs to
+ - description (string): The description of mac address
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'createOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries'
+
+ body_params = ['description', 'client', 'ssid', 'network', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.post(metadata, resource, payload)
+
+
+
+ def deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str):
+ """
+ **Destroy isolation allow list MAC entry for this organization**
+ https://developer.cisco.com/meraki/api-v1/#!delete-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ """
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'deleteOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ entryId = urllib.parse.quote(str(entryId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ return self._session.delete(metadata, resource)
+
+
+
+ def updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry(self, organizationId: str, entryId: str, **kwargs):
+ """
+ **Update isolation allow list MAC entry info**
+ https://developer.cisco.com/meraki/api-v1/#!update-organization-wireless-ssids-firewall-isolation-allowlist-entry
+
+ - organizationId (string): Organization ID
+ - entryId (string): Entry ID
+ - description (string): The description of mac address
+ - client (object): The client of allowlist
+ """
+
+ kwargs.update(locals())
+
+ metadata = {
+ 'tags': ['wireless', 'configure', 'ssids', 'firewall', 'isolation', 'allowlist', 'entries'],
+ 'operation': 'updateOrganizationWirelessSsidsFirewallIsolationAllowlistEntry'
+ }
+ organizationId = urllib.parse.quote(str(organizationId), safe='')
+ entryId = urllib.parse.quote(str(entryId), safe='')
+ resource = f'/organizations/{organizationId}/wireless/ssids/firewall/isolation/allowlist/entries/{entryId}'
+
+ body_params = ['description', 'client', ]
+ payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
+
+ return self._session.put(metadata, resource, payload)
+
+
+
def getOrganizationWirelessSsidsStatusesByDevice(self, organizationId: str, total_pages=1, direction='next', **kwargs):
"""
**List status information of all BSSIDs in your organization**
diff --git a/poetry.lock b/poetry.lock
new file mode 100644
index 00000000..6e0451cc
--- /dev/null
+++ b/poetry.lock
@@ -0,0 +1,1004 @@
+# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+
+[[package]]
+name = "aiohappyeyeballs"
+version = "2.6.1"
+description = "Happy Eyeballs for asyncio"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"},
+ {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"},
+]
+
+[[package]]
+name = "aiohttp"
+version = "3.11.14"
+description = "Async http client/server framework (asyncio)"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e2bc827c01f75803de77b134afdbf74fa74b62970eafdf190f3244931d7a5c0d"},
+ {file = "aiohttp-3.11.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e365034c5cf6cf74f57420b57682ea79e19eb29033399dd3f40de4d0171998fa"},
+ {file = "aiohttp-3.11.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c32593ead1a8c6aabd58f9d7ee706e48beac796bb0cb71d6b60f2c1056f0a65f"},
+ {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4e7c7ec4146a94a307ca4f112802a8e26d969018fabed526efc340d21d3e7d0"},
+ {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8b2df9feac55043759aa89f722a967d977d80f8b5865a4153fc41c93b957efc"},
+ {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7571f99525c76a6280f5fe8e194eeb8cb4da55586c3c61c59c33a33f10cfce7"},
+ {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b59d096b5537ec7c85954cb97d821aae35cfccce3357a2cafe85660cc6295628"},
+ {file = "aiohttp-3.11.14-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b42dbd097abb44b3f1156b4bf978ec5853840802d6eee2784857be11ee82c6a0"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b05774864c87210c531b48dfeb2f7659407c2dda8643104fb4ae5e2c311d12d9"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4e2e8ef37d4bc110917d038807ee3af82700a93ab2ba5687afae5271b8bc50ff"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e9faafa74dbb906b2b6f3eb9942352e9e9db8d583ffed4be618a89bd71a4e914"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:7e7abe865504f41b10777ac162c727af14e9f4db9262e3ed8254179053f63e6d"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:4848ae31ad44330b30f16c71e4f586cd5402a846b11264c412de99fa768f00f3"},
+ {file = "aiohttp-3.11.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d0b46abee5b5737cb479cc9139b29f010a37b1875ee56d142aefc10686a390b"},
+ {file = "aiohttp-3.11.14-cp310-cp310-win32.whl", hash = "sha256:a0d2c04a623ab83963576548ce098baf711a18e2c32c542b62322a0b4584b990"},
+ {file = "aiohttp-3.11.14-cp310-cp310-win_amd64.whl", hash = "sha256:5409a59d5057f2386bb8b8f8bbcfb6e15505cedd8b2445db510563b5d7ea1186"},
+ {file = "aiohttp-3.11.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f296d637a50bb15fb6a229fbb0eb053080e703b53dbfe55b1e4bb1c5ed25d325"},
+ {file = "aiohttp-3.11.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ec6cd1954ca2bbf0970f531a628da1b1338f594bf5da7e361e19ba163ecc4f3b"},
+ {file = "aiohttp-3.11.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:572def4aad0a4775af66d5a2b5923c7de0820ecaeeb7987dcbccda2a735a993f"},
+ {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c68e41c4d576cd6aa6c6d2eddfb32b2acfb07ebfbb4f9da991da26633a3db1a"},
+ {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b8bbfc8111826aa8363442c0fc1f5751456b008737ff053570f06a151650b3"},
+ {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b0a200e85da5c966277a402736a96457b882360aa15416bf104ca81e6f5807b"},
+ {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d173c0ac508a2175f7c9a115a50db5fd3e35190d96fdd1a17f9cb10a6ab09aa1"},
+ {file = "aiohttp-3.11.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:413fe39fd929329f697f41ad67936f379cba06fcd4c462b62e5b0f8061ee4a77"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65c75b14ee74e8eeff2886321e76188cbe938d18c85cff349d948430179ad02c"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:321238a42ed463848f06e291c4bbfb3d15ba5a79221a82c502da3e23d7525d06"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59a05cdc636431f7ce843c7c2f04772437dd816a5289f16440b19441be6511f1"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:daf20d9c3b12ae0fdf15ed92235e190f8284945563c4b8ad95b2d7a31f331cd3"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:05582cb2d156ac7506e68b5eac83179faedad74522ed88f88e5861b78740dc0e"},
+ {file = "aiohttp-3.11.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12c5869e7ddf6b4b1f2109702b3cd7515667b437da90a5a4a50ba1354fe41881"},
+ {file = "aiohttp-3.11.14-cp311-cp311-win32.whl", hash = "sha256:92868f6512714efd4a6d6cb2bfc4903b997b36b97baea85f744229f18d12755e"},
+ {file = "aiohttp-3.11.14-cp311-cp311-win_amd64.whl", hash = "sha256:bccd2cb7aa5a3bfada72681bdb91637094d81639e116eac368f8b3874620a654"},
+ {file = "aiohttp-3.11.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:70ab0f61c1a73d3e0342cedd9a7321425c27a7067bebeeacd509f96695b875fc"},
+ {file = "aiohttp-3.11.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:602d4db80daf4497de93cb1ce00b8fc79969c0a7cf5b67bec96fa939268d806a"},
+ {file = "aiohttp-3.11.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a8a0d127c10b8d89e69bbd3430da0f73946d839e65fec00ae48ca7916a31948"},
+ {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9f835cdfedcb3f5947304e85b8ca3ace31eef6346d8027a97f4de5fb687534"},
+ {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8aa5c68e1e68fff7cd3142288101deb4316b51f03d50c92de6ea5ce646e6c71f"},
+ {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b512f1de1c688f88dbe1b8bb1283f7fbeb7a2b2b26e743bb2193cbadfa6f307"},
+ {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc9253069158d57e27d47a8453d8a2c5a370dc461374111b5184cf2f147a3cc3"},
+ {file = "aiohttp-3.11.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2501f1b981e70932b4a552fc9b3c942991c7ae429ea117e8fba57718cdeed0"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:28a3d083819741592685762d51d789e6155411277050d08066537c5edc4066e6"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0df3788187559c262922846087e36228b75987f3ae31dd0a1e5ee1034090d42f"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e73fa341d8b308bb799cf0ab6f55fc0461d27a9fa3e4582755a3d81a6af8c09"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51ba80d473eb780a329d73ac8afa44aa71dfb521693ccea1dea8b9b5c4df45ce"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8d1dd75aa4d855c7debaf1ef830ff2dfcc33f893c7db0af2423ee761ebffd22b"},
+ {file = "aiohttp-3.11.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41cf0cefd9e7b5c646c2ef529c8335e7eafd326f444cc1cdb0c47b6bc836f9be"},
+ {file = "aiohttp-3.11.14-cp312-cp312-win32.whl", hash = "sha256:948abc8952aff63de7b2c83bfe3f211c727da3a33c3a5866a0e2cf1ee1aa950f"},
+ {file = "aiohttp-3.11.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b420d076a46f41ea48e5fcccb996f517af0d406267e31e6716f480a3d50d65c"},
+ {file = "aiohttp-3.11.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d14e274828561db91e4178f0057a915f3af1757b94c2ca283cb34cbb6e00b50"},
+ {file = "aiohttp-3.11.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f30fc72daf85486cdcdfc3f5e0aea9255493ef499e31582b34abadbfaafb0965"},
+ {file = "aiohttp-3.11.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4edcbe34e6dba0136e4cabf7568f5a434d89cc9de5d5155371acda275353d228"},
+ {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7169ded15505f55a87f8f0812c94c9412623c744227b9e51083a72a48b68a5"},
+ {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad1f2fb9fe9b585ea4b436d6e998e71b50d2b087b694ab277b30e060c434e5db"},
+ {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20412c7cc3720e47a47e63c0005f78c0c2370020f9f4770d7fc0075f397a9fb0"},
+ {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd9766da617855f7e85f27d2bf9a565ace04ba7c387323cd3e651ac4329db91"},
+ {file = "aiohttp-3.11.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:599b66582f7276ebefbaa38adf37585e636b6a7a73382eb412f7bc0fc55fb73d"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b41693b7388324b80f9acfabd479bd1c84f0bc7e8f17bab4ecd9675e9ff9c734"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:86135c32d06927339c8c5e64f96e4eee8825d928374b9b71a3c42379d7437058"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04eb541ce1e03edc1e3be1917a0f45ac703e913c21a940111df73a2c2db11d73"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dc311634f6f28661a76cbc1c28ecf3b3a70a8edd67b69288ab7ca91058eb5a33"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69bb252bfdca385ccabfd55f4cd740d421dd8c8ad438ded9637d81c228d0da49"},
+ {file = "aiohttp-3.11.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b86efe23684b58a88e530c4ab5b20145f102916bbb2d82942cafec7bd36a647"},
+ {file = "aiohttp-3.11.14-cp313-cp313-win32.whl", hash = "sha256:b9c60d1de973ca94af02053d9b5111c4fbf97158e139b14f1be68337be267be6"},
+ {file = "aiohttp-3.11.14-cp313-cp313-win_amd64.whl", hash = "sha256:0a29be28e60e5610d2437b5b2fed61d6f3dcde898b57fb048aa5079271e7f6f3"},
+ {file = "aiohttp-3.11.14-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:14fc03508359334edc76d35b2821832f092c8f092e4b356e74e38419dfe7b6de"},
+ {file = "aiohttp-3.11.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92007c89a8cb7be35befa2732b0b32bf3a394c1b22ef2dff0ef12537d98a7bda"},
+ {file = "aiohttp-3.11.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6d3986112e34eaa36e280dc8286b9dd4cc1a5bcf328a7f147453e188f6fe148f"},
+ {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:749f1eb10e51dbbcdba9df2ef457ec060554842eea4d23874a3e26495f9e87b1"},
+ {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:781c8bd423dcc4641298c8c5a2a125c8b1c31e11f828e8d35c1d3a722af4c15a"},
+ {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:997b57e38aa7dc6caab843c5e042ab557bc83a2f91b7bd302e3c3aebbb9042a1"},
+ {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a8b0321e40a833e381d127be993b7349d1564b756910b28b5f6588a159afef3"},
+ {file = "aiohttp-3.11.14-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8778620396e554b758b59773ab29c03b55047841d8894c5e335f12bfc45ebd28"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e906da0f2bcbf9b26cc2b144929e88cb3bf943dd1942b4e5af066056875c7618"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:87f0e003fb4dd5810c7fbf47a1239eaa34cd929ef160e0a54c570883125c4831"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7f2dadece8b85596ac3ab1ec04b00694bdd62abc31e5618f524648d18d9dd7fa"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:fe846f0a98aa9913c2852b630cd39b4098f296e0907dd05f6c7b30d911afa4c3"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ced66c5c6ad5bcaf9be54560398654779ec1c3695f1a9cf0ae5e3606694a000a"},
+ {file = "aiohttp-3.11.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a40087b82f83bd671cbeb5f582c233d196e9653220404a798798bfc0ee189fff"},
+ {file = "aiohttp-3.11.14-cp39-cp39-win32.whl", hash = "sha256:95d7787f2bcbf7cb46823036a8d64ccfbc2ffc7d52016b4044d901abceeba3db"},
+ {file = "aiohttp-3.11.14-cp39-cp39-win_amd64.whl", hash = "sha256:22a8107896877212130c58f74e64b77f7007cb03cea8698be317272643602d45"},
+ {file = "aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c"},
+]
+
+[package.dependencies]
+aiohappyeyeballs = ">=2.3.0"
+aiosignal = ">=1.1.2"
+async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""}
+attrs = ">=17.3.0"
+frozenlist = ">=1.1.1"
+multidict = ">=4.5,<7.0"
+propcache = ">=0.2.0"
+yarl = ">=1.17.0,<2.0"
+
+[package.extras]
+speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
+
+[[package]]
+name = "aiosignal"
+version = "1.3.2"
+description = "aiosignal: a list of registered asynchronous callbacks"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"},
+ {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"},
+]
+
+[package.dependencies]
+frozenlist = ">=1.1.0"
+
+[[package]]
+name = "async-timeout"
+version = "5.0.1"
+description = "Timeout context manager for asyncio programs"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version < \"3.11\""
+files = [
+ {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"},
+ {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"},
+]
+
+[[package]]
+name = "attrs"
+version = "25.3.0"
+description = "Classes Without Boilerplate"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"},
+ {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"},
+]
+
+[package.extras]
+benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
+cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
+dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
+docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"]
+tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
+tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""]
+
+[[package]]
+name = "certifi"
+version = "2025.1.31"
+description = "Python package for providing Mozilla's CA Bundle."
+optional = false
+python-versions = ">=3.6"
+groups = ["main"]
+files = [
+ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
+ {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+optional = false
+python-versions = ">=3.7"
+groups = ["main"]
+files = [
+ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
+ {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+description = "Cross-platform colored terminal text."
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+groups = ["main"]
+markers = "sys_platform == \"win32\""
+files = [
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+
+[[package]]
+name = "exceptiongroup"
+version = "1.2.2"
+description = "Backport of PEP 654 (exception groups)"
+optional = false
+python-versions = ">=3.7"
+groups = ["main"]
+markers = "python_version < \"3.11\""
+files = [
+ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
+ {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
+]
+
+[package.extras]
+test = ["pytest (>=6)"]
+
+[[package]]
+name = "frozenlist"
+version = "1.5.0"
+description = "A list-like structure which implements collections.abc.MutableSequence"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"},
+ {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"},
+ {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"},
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+description = "Internationalized Domain Names in Applications (IDNA)"
+optional = false
+python-versions = ">=3.6"
+groups = ["main"]
+files = [
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
+]
+
+[package.extras]
+all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+
+[[package]]
+name = "iniconfig"
+version = "2.1.0"
+description = "brain-dead simple config-ini parsing"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"},
+ {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.4"
+description = "A very fast and expressive template engine."
+optional = false
+python-versions = ">=3.7"
+groups = ["main"]
+files = [
+ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
+ {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
+]
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+description = "Safely add untrusted strings to HTML/XML markup."
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+ {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+ {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+ {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
+]
+
+[[package]]
+name = "multidict"
+version = "6.2.0"
+description = "multidict implementation"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b9f6392d98c0bd70676ae41474e2eecf4c7150cb419237a41f8f96043fcb81d1"},
+ {file = "multidict-6.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3501621d5e86f1a88521ea65d5cad0a0834c77b26f193747615b7c911e5422d2"},
+ {file = "multidict-6.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32ed748ff9ac682eae7859790d3044b50e3076c7d80e17a44239683769ff485e"},
+ {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc826b9a8176e686b67aa60fd6c6a7047b0461cae5591ea1dc73d28f72332a8a"},
+ {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:214207dcc7a6221d9942f23797fe89144128a71c03632bf713d918db99bd36de"},
+ {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05fefbc3cddc4e36da209a5e49f1094bbece9a581faa7f3589201fd95df40e5d"},
+ {file = "multidict-6.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e851e6363d0dbe515d8de81fd544a2c956fdec6f8a049739562286727d4a00c3"},
+ {file = "multidict-6.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32c9b4878f48be3e75808ea7e499d6223b1eea6d54c487a66bc10a1871e3dc6a"},
+ {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7243c5a6523c5cfeca76e063efa5f6a656d1d74c8b1fc64b2cd1e84e507f7e2a"},
+ {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0e5a644e50ef9fb87878d4d57907f03a12410d2aa3b93b3acdf90a741df52c49"},
+ {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0dc25a3293c50744796e87048de5e68996104d86d940bb24bc3ec31df281b191"},
+ {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a49994481b99cd7dedde07f2e7e93b1d86c01c0fca1c32aded18f10695ae17eb"},
+ {file = "multidict-6.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641cf2e3447c9ecff2f7aa6e9eee9eaa286ea65d57b014543a4911ff2799d08a"},
+ {file = "multidict-6.2.0-cp310-cp310-win32.whl", hash = "sha256:0c383d28857f66f5aebe3e91d6cf498da73af75fbd51cedbe1adfb85e90c0460"},
+ {file = "multidict-6.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a33273a541f1e1a8219b2a4ed2de355848ecc0254264915b9290c8d2de1c74e1"},
+ {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e87a7d75fa36839a3a432286d719975362d230c70ebfa0948549cc38bd5b46"},
+ {file = "multidict-6.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8de4d42dffd5ced9117af2ce66ba8722402541a3aa98ffdf78dde92badb68932"},
+ {file = "multidict-6.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d91a230c7f8af86c904a5a992b8c064b66330544693fd6759c3d6162382ecf"},
+ {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f6cad071960ba1914fa231677d21b1b4a3acdcce463cee41ea30bc82e6040cf"},
+ {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f74f2fc51555f4b037ef278efc29a870d327053aba5cb7d86ae572426c7cccc"},
+ {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14ed9ed1bfedd72a877807c71113deac292bf485159a29025dfdc524c326f3e1"},
+ {file = "multidict-6.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac3fcf9a2d369bd075b2c2965544036a27ccd277fc3c04f708338cc57533081"},
+ {file = "multidict-6.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fc6af8e39f7496047c7876314f4317736eac82bf85b54c7c76cf1a6f8e35d98"},
+ {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f8cb1329f42fadfb40d6211e5ff568d71ab49be36e759345f91c69d1033d633"},
+ {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5389445f0173c197f4a3613713b5fb3f3879df1ded2a1a2e4bc4b5b9c5441b7e"},
+ {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94a7bb972178a8bfc4055db80c51efd24baefaced5e51c59b0d598a004e8305d"},
+ {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da51d8928ad8b4244926fe862ba1795f0b6e68ed8c42cd2f822d435db9c2a8f4"},
+ {file = "multidict-6.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:063be88bd684782a0715641de853e1e58a2f25b76388538bd62d974777ce9bc2"},
+ {file = "multidict-6.2.0-cp311-cp311-win32.whl", hash = "sha256:52b05e21ff05729fbea9bc20b3a791c3c11da61649ff64cce8257c82a020466d"},
+ {file = "multidict-6.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1e2a2193d3aa5cbf5758f6d5680a52aa848e0cf611da324f71e5e48a9695cc86"},
+ {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:437c33561edb6eb504b5a30203daf81d4a9b727e167e78b0854d9a4e18e8950b"},
+ {file = "multidict-6.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9f49585f4abadd2283034fc605961f40c638635bc60f5162276fec075f2e37a4"},
+ {file = "multidict-6.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5dd7106d064d05896ce28c97da3f46caa442fe5a43bc26dfb258e90853b39b44"},
+ {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e25b11a0417475f093d0f0809a149aff3943c2c56da50fdf2c3c88d57fe3dfbd"},
+ {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac380cacdd3b183338ba63a144a34e9044520a6fb30c58aa14077157a033c13e"},
+ {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61d5541f27533f803a941d3a3f8a3d10ed48c12cf918f557efcbf3cd04ef265c"},
+ {file = "multidict-6.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facaf11f21f3a4c51b62931feb13310e6fe3475f85e20d9c9fdce0d2ea561b87"},
+ {file = "multidict-6.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:095a2eabe8c43041d3e6c2cb8287a257b5f1801c2d6ebd1dd877424f1e89cf29"},
+ {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0cc398350ef31167e03f3ca7c19313d4e40a662adcb98a88755e4e861170bdd"},
+ {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7c611345bbe7cb44aabb877cb94b63e86f2d0db03e382667dbd037866d44b4f8"},
+ {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8cd1a0644ccaf27e9d2f6d9c9474faabee21f0578fe85225cc5af9a61e1653df"},
+ {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:89b3857652183b8206a891168af47bac10b970d275bba1f6ee46565a758c078d"},
+ {file = "multidict-6.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:125dd82b40f8c06d08d87b3510beaccb88afac94e9ed4a6f6c71362dc7dbb04b"},
+ {file = "multidict-6.2.0-cp312-cp312-win32.whl", hash = "sha256:76b34c12b013d813e6cb325e6bd4f9c984db27758b16085926bbe7ceeaace626"},
+ {file = "multidict-6.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:0b183a959fb88ad1be201de2c4bdf52fa8e46e6c185d76201286a97b6f5ee65c"},
+ {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c5e7d2e300d5cb3b2693b6d60d3e8c8e7dd4ebe27cd17c9cb57020cac0acb80"},
+ {file = "multidict-6.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:256d431fe4583c5f1e0f2e9c4d9c22f3a04ae96009b8cfa096da3a8723db0a16"},
+ {file = "multidict-6.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a3c0ff89fe40a152e77b191b83282c9664357dce3004032d42e68c514ceff27e"},
+ {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef7d48207926edbf8b16b336f779c557dd8f5a33035a85db9c4b0febb0706817"},
+ {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c099d3899b14e1ce52262eb82a5f5cb92157bb5106bf627b618c090a0eadc"},
+ {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e16e7297f29a544f49340012d6fc08cf14de0ab361c9eb7529f6a57a30cbfda1"},
+ {file = "multidict-6.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042028348dc5a1f2be6c666437042a98a5d24cee50380f4c0902215e5ec41844"},
+ {file = "multidict-6.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08549895e6a799bd551cf276f6e59820aa084f0f90665c0f03dd3a50db5d3c48"},
+ {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ccfd74957ef53fa7380aaa1c961f523d582cd5e85a620880ffabd407f8202c0"},
+ {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83b78c680d4b15d33042d330c2fa31813ca3974197bddb3836a5c635a5fd013f"},
+ {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b4c153863dd6569f6511845922c53e39c8d61f6e81f228ad5443e690fca403de"},
+ {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:98aa8325c7f47183b45588af9c434533196e241be0a4e4ae2190b06d17675c02"},
+ {file = "multidict-6.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e658d1373c424457ddf6d55ec1db93c280b8579276bebd1f72f113072df8a5d"},
+ {file = "multidict-6.2.0-cp313-cp313-win32.whl", hash = "sha256:3157126b028c074951839233647bd0e30df77ef1fedd801b48bdcad242a60f4e"},
+ {file = "multidict-6.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2e87f1926e91855ae61769ba3e3f7315120788c099677e0842e697b0bfb659f2"},
+ {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2529ddbdaa424b2c6c2eb668ea684dd6b75b839d0ad4b21aad60c168269478d7"},
+ {file = "multidict-6.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:13551d0e2d7201f0959725a6a769b6f7b9019a168ed96006479c9ac33fe4096b"},
+ {file = "multidict-6.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d1996ee1330e245cd3aeda0887b4409e3930524c27642b046e4fae88ffa66c5e"},
+ {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c537da54ce4ff7c15e78ab1292e5799d0d43a2108e006578a57f531866f64025"},
+ {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f249badb360b0b4d694307ad40f811f83df4da8cef7b68e429e4eea939e49dd"},
+ {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48d39b1824b8d6ea7de878ef6226efbe0773f9c64333e1125e0efcfdd18a24c7"},
+ {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b99aac6bb2c37db336fa03a39b40ed4ef2818bf2dfb9441458165ebe88b793af"},
+ {file = "multidict-6.2.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07bfa8bc649783e703263f783f73e27fef8cd37baaad4389816cf6a133141331"},
+ {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2c00ad31fbc2cbac85d7d0fcf90853b2ca2e69d825a2d3f3edb842ef1544a2c"},
+ {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d57a01a2a9fa00234aace434d8c131f0ac6e0ac6ef131eda5962d7e79edfb5b"},
+ {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:abf5b17bc0cf626a8a497d89ac691308dbd825d2ac372aa990b1ca114e470151"},
+ {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:f7716f7e7138252d88607228ce40be22660d6608d20fd365d596e7ca0738e019"},
+ {file = "multidict-6.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d5a36953389f35f0a4e88dc796048829a2f467c9197265504593f0e420571547"},
+ {file = "multidict-6.2.0-cp313-cp313t-win32.whl", hash = "sha256:e653d36b1bf48fa78c7fcebb5fa679342e025121ace8c87ab05c1cefd33b34fc"},
+ {file = "multidict-6.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ca23db5fb195b5ef4fd1f77ce26cadefdf13dba71dab14dadd29b34d457d7c44"},
+ {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b4f3d66dd0354b79761481fc15bdafaba0b9d9076f1f42cc9ce10d7fcbda205a"},
+ {file = "multidict-6.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e2a2d6749e1ff2c9c76a72c6530d5baa601205b14e441e6d98011000f47a7ac"},
+ {file = "multidict-6.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cca83a629f77402cfadd58352e394d79a61c8015f1694b83ab72237ec3941f88"},
+ {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781b5dd1db18c9e9eacc419027b0acb5073bdec9de1675c0be25ceb10e2ad133"},
+ {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf8d370b2fea27fb300825ec3984334f7dd54a581bde6456799ba3776915a656"},
+ {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25bb96338512e2f46f615a2bb7c6012fe92a4a5ebd353e5020836a7e33120349"},
+ {file = "multidict-6.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e2819b0b468174de25c0ceed766606a07cedeab132383f1e83b9a4e96ccb4f"},
+ {file = "multidict-6.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aed763b6a1b28c46c055692836879328f0b334a6d61572ee4113a5d0c859872"},
+ {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a1133414b771619aa3c3000701c11b2e4624a7f492f12f256aedde97c28331a2"},
+ {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:639556758c36093b35e2e368ca485dada6afc2bd6a1b1207d85ea6dfc3deab27"},
+ {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:163f4604e76639f728d127293d24c3e208b445b463168af3d031b92b0998bb90"},
+ {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2325105e16d434749e1be8022f942876a936f9bece4ec41ae244e3d7fae42aaf"},
+ {file = "multidict-6.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e4371591e621579cb6da8401e4ea405b33ff25a755874a3567c4075ca63d56e2"},
+ {file = "multidict-6.2.0-cp39-cp39-win32.whl", hash = "sha256:d1175b0e0d6037fab207f05774a176d71210ebd40b1c51f480a04b65ec5c786d"},
+ {file = "multidict-6.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:ad81012b24b88aad4c70b2cbc2dad84018783221b7f923e926f4690ff8569da3"},
+ {file = "multidict-6.2.0-py3-none-any.whl", hash = "sha256:5d26547423e5e71dcc562c4acdc134b900640a39abd9066d7326a7cc2324c530"},
+ {file = "multidict-6.2.0.tar.gz", hash = "sha256:0085b0afb2446e57050140240a8595846ed64d1cbd26cef936bfab3192c673b8"},
+]
+
+[package.dependencies]
+typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""}
+
+[[package]]
+name = "packaging"
+version = "24.2"
+description = "Core utilities for Python packages"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+ {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+]
+
+[[package]]
+name = "pluggy"
+version = "1.5.0"
+description = "plugin and hook calling mechanisms for python"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
+ {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+]
+
+[package.extras]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
+
+[[package]]
+name = "propcache"
+version = "0.3.0"
+description = "Accelerated property cache"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"},
+ {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"},
+ {file = "propcache-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc"},
+ {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d"},
+ {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f"},
+ {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf"},
+ {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9"},
+ {file = "propcache-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25"},
+ {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f"},
+ {file = "propcache-0.3.0-cp310-cp310-win32.whl", hash = "sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c"},
+ {file = "propcache-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340"},
+ {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51"},
+ {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e"},
+ {file = "propcache-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa"},
+ {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf"},
+ {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b"},
+ {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9"},
+ {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6"},
+ {file = "propcache-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7"},
+ {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c"},
+ {file = "propcache-0.3.0-cp311-cp311-win32.whl", hash = "sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d"},
+ {file = "propcache-0.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32"},
+ {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e"},
+ {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af"},
+ {file = "propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5"},
+ {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b"},
+ {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667"},
+ {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7"},
+ {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7"},
+ {file = "propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64"},
+ {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c"},
+ {file = "propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d"},
+ {file = "propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57"},
+ {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568"},
+ {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9"},
+ {file = "propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767"},
+ {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8"},
+ {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0"},
+ {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d"},
+ {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05"},
+ {file = "propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e"},
+ {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626"},
+ {file = "propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374"},
+ {file = "propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a"},
+ {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf"},
+ {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0"},
+ {file = "propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829"},
+ {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa"},
+ {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6"},
+ {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db"},
+ {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54"},
+ {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e"},
+ {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf"},
+ {file = "propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863"},
+ {file = "propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46"},
+ {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03c091bb752349402f23ee43bb2bff6bd80ccab7c9df6b88ad4322258d6960fc"},
+ {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46ed02532cb66612d42ae5c3929b5e98ae330ea0f3900bc66ec5f4862069519b"},
+ {file = "propcache-0.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11ae6a8a01b8a4dc79093b5d3ca2c8a4436f5ee251a9840d7790dccbd96cb649"},
+ {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df03cd88f95b1b99052b52b1bb92173229d7a674df0ab06d2b25765ee8404bce"},
+ {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03acd9ff19021bd0567582ac88f821b66883e158274183b9e5586f678984f8fe"},
+ {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd54895e4ae7d32f1e3dd91261df46ee7483a735017dc6f987904f194aa5fd14"},
+ {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a67e5c04e3119594d8cfae517f4b9330c395df07ea65eab16f3d559b7068fe"},
+ {file = "propcache-0.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee25f1ac091def37c4b59d192bbe3a206298feeb89132a470325bf76ad122a1e"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58e6d2a5a7cb3e5f166fd58e71e9a4ff504be9dc61b88167e75f835da5764d07"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:be90c94570840939fecedf99fa72839aed70b0ced449b415c85e01ae67422c90"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49ea05212a529c2caffe411e25a59308b07d6e10bf2505d77da72891f9a05641"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:119e244ab40f70a98c91906d4c1f4c5f2e68bd0b14e7ab0a06922038fae8a20f"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:507c5357a8d8b4593b97fb669c50598f4e6cccbbf77e22fa9598aba78292b4d7"},
+ {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8526b0941ec5a40220fc4dfde76aed58808e2b309c03e9fa8e2260083ef7157f"},
+ {file = "propcache-0.3.0-cp39-cp39-win32.whl", hash = "sha256:7cedd25e5f678f7738da38037435b340694ab34d424938041aa630d8bac42663"},
+ {file = "propcache-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf4298f366ca7e1ad1d21bbb58300a6985015909964077afd37559084590c929"},
+ {file = "propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043"},
+ {file = "propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5"},
+]
+
+[[package]]
+name = "pytest"
+version = "7.4.4"
+description = "pytest: simple powerful testing with Python"
+optional = false
+python-versions = ">=3.7"
+groups = ["main"]
+files = [
+ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
+ {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
+iniconfig = "*"
+packaging = "*"
+pluggy = ">=0.12,<2.0"
+tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
+
+[package.extras]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+description = "Python HTTP for Humans."
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+ {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
+]
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<4"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<3"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
+[[package]]
+name = "setuptools"
+version = "70.3.0"
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "setuptools-70.3.0-py3-none-any.whl", hash = "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc"},
+ {file = "setuptools-70.3.0.tar.gz", hash = "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5"},
+]
+
+[package.extras]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.3.2) ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+
+[[package]]
+name = "tomli"
+version = "2.2.1"
+description = "A lil' TOML parser"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version < \"3.11\""
+files = [
+ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"},
+ {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"},
+ {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"},
+ {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"},
+ {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"},
+ {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"},
+ {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"},
+ {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"},
+ {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"},
+ {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"},
+ {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"},
+ {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"},
+ {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"},
+ {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"},
+ {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"},
+ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"},
+ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"},
+ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.12.2"
+description = "Backported and Experimental Type Hints for Python 3.8+"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+markers = "python_version < \"3.11\""
+files = [
+ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
+ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
+]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
+ {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
+h2 = ["h2 (>=4,<5)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "yarl"
+version = "1.18.3"
+description = "Yet another URL library"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
+ {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
+ {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"},
+ {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"},
+ {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"},
+ {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"},
+ {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"},
+ {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"},
+ {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"},
+ {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"},
+ {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"},
+ {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"},
+ {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"},
+ {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"},
+ {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"},
+ {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"},
+ {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"},
+ {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"},
+ {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"},
+ {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"},
+ {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"},
+ {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"},
+ {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"},
+ {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"},
+ {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"},
+ {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"},
+ {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"},
+ {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"},
+ {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"},
+]
+
+[package.dependencies]
+idna = ">=2.0"
+multidict = ">=4.0"
+propcache = ">=0.2.0"
+
+[metadata]
+lock-version = "2.1"
+python-versions = ">=3.10"
+content-hash = "f9e22dd5e1a76b0611269c0d070e7941d7eb4a3f57503edaadc8350e5389238d"
diff --git a/pyproject.toml b/pyproject.toml
index ebba4513..e13e2fa2 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "meraki"
-version = "1.54.0"
+version = "1.56.0"
description = "Meraki library for Python"
authors = [
{name = "Cisco Meraki",email = "api-feedback@meraki.net"}