From 176d6f86377bc9ff5fcb95d2d246035c891bb524 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Tue, 16 Mar 2021 17:24:19 -0700 Subject: [PATCH 01/22] reverted share lease --- .../azure/storage/fileshare/_share_client.py | 78 +++++++++++++++++-- .../fileshare/aio/_share_client_async.py | 78 +++++++++++++++++-- .../samples/file_samples_share.py | 16 ++++ .../tests/test_share.py | 15 ---- .../tests/test_share_async.py | 15 ---- 5 files changed, 162 insertions(+), 40 deletions(-) diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py index db0d1c9cb0d9..13ebc80d31e3 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py @@ -31,7 +31,7 @@ DeleteSnapshotsOptionType, SharePermission) from ._deserialize import deserialize_share_properties, deserialize_permission_key, deserialize_permission -from ._serialize import get_api_version +from ._serialize import get_api_version, get_access_conditions from ._directory_client import ShareDirectoryClient from ._file_client import ShareFileClient from ._lease import ShareLeaseClient @@ -265,14 +265,14 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode) @distributed_trace - def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): + def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): # type: (int, Optional[str], **Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share Service creates a lease on the share and returns a new lease. - .. versionadded:: 12.6.0 + .. versionadded:: 12.5.0 :param int lease_duration: Specifies the duration of the lease, in seconds, or negative one @@ -317,7 +317,7 @@ def create_share(self, **kwargs): Possible values: 'TransactionOptimized', 'Hot', 'Cool' :paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword int timeout: The timeout parameter is expressed in seconds. @@ -423,6 +423,13 @@ def delete_share( :param bool delete_snapshots: Indicates if snapshots are to be deleted. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :keyword int timeout: The timeout parameter is expressed in seconds. @@ -435,6 +442,7 @@ def delete_share( :dedent: 12 :caption: Deletes the share and any snapshots. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) delete_include = None if delete_snapshots: @@ -443,6 +451,7 @@ def delete_share( self._client.share.delete( timeout=timeout, sharesnapshot=self.snapshot, + lease_access_conditions=access_conditions, delete_snapshots=delete_include, **kwargs) except HttpResponseError as error: @@ -457,6 +466,13 @@ def get_share_properties(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: The share properties. :rtype: ~azure.storage.fileshare.ShareProperties @@ -469,12 +485,14 @@ def get_share_properties(self, **kwargs): :dedent: 12 :caption: Gets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: props = self._client.share.get_properties( timeout=timeout, sharesnapshot=self.snapshot, cls=deserialize_share_properties, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -492,6 +510,13 @@ def set_share_quota(self, quota, **kwargs): Must be greater than 0, and less than or equal to 5TB. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -504,12 +529,14 @@ def set_share_quota(self, quota, **kwargs): :dedent: 12 :caption: Sets the share quota. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: return self._client.share.set_properties( # type: ignore timeout=timeout, quota=quota, access_tier=None, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -520,7 +547,7 @@ def set_share_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] """Sets the share properties. - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword access_tier: Specifies the access tier of the share. @@ -535,6 +562,9 @@ def set_share_properties(self, **kwargs): Root squash to set on the share. Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash'. :paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -547,6 +577,7 @@ def set_share_properties(self, **kwargs): :dedent: 12 :caption: Sets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) access_tier = kwargs.pop('access_tier', None) quota = kwargs.pop('quota', None) @@ -559,6 +590,7 @@ def set_share_properties(self, **kwargs): quota=quota, access_tier=access_tier, root_squash=root_squash, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -578,6 +610,13 @@ def set_share_metadata(self, metadata, **kwargs): :type metadata: dict(str, str) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -590,6 +629,7 @@ def set_share_metadata(self, metadata, **kwargs): :dedent: 12 :caption: Sets the share metadata. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) headers = kwargs.pop('headers', {}) headers.update(add_metadata_headers(metadata)) @@ -598,6 +638,7 @@ def set_share_metadata(self, metadata, **kwargs): timeout=timeout, cls=return_response_headers, headers=headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -610,14 +651,23 @@ def get_share_access_policy(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Access policy information in a dict. :rtype: dict[str, Any] """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: response, identifiers = self._client.share.get_access_policy( timeout=timeout, cls=return_headers_and_deserialized, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -640,9 +690,17 @@ def set_share_access_policy(self, signed_identifiers, **kwargs): :type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) if len(signed_identifiers) > 5: raise ValueError( @@ -660,6 +718,7 @@ def set_share_access_policy(self, signed_identifiers, **kwargs): share_acl=signed_identifiers or None, timeout=timeout, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -674,13 +733,22 @@ def get_share_stats(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :return: The approximate size of the data (in bytes) stored on the share. :rtype: int """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: stats = self._client.share.get_statistics( timeout=timeout, + lease_access_conditions=access_conditions, **kwargs) return stats.share_usage_bytes # type: ignore except HttpResponseError as error: diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py index 5ceae138861e..c8eecd699083 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py @@ -24,7 +24,7 @@ SignedIdentifier, DeleteSnapshotsOptionType) from .._deserialize import deserialize_share_properties, deserialize_permission -from .._serialize import get_api_version +from .._serialize import get_api_version, get_access_conditions from .._share_client import ShareClient as ShareClientBase from ._directory_client_async import ShareDirectoryClient from ._file_client_async import ShareFileClient @@ -130,14 +130,14 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode, loop=self._loop) @distributed_trace_async() - async def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): + async def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): # type: (int, Optional[str], **Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share Service creates a lease on the share and returns a new lease. - .. versionadded:: 12.6.0 + .. versionadded:: 12.5.0 :param int lease_duration: Specifies the duration of the lease, in seconds, or negative one @@ -182,7 +182,7 @@ async def create_share(self, **kwargs): Possible values: 'TransactionOptimized', 'Hot', 'Cool' :paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier - .. versionadded:: 12.6.0 + .. versionadded:: 12.4.0 :keyword int timeout: The timeout parameter is expressed in seconds. @@ -290,6 +290,13 @@ async def delete_share( Indicates if snapshots are to be deleted. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + .. admonition:: Example: .. literalinclude:: ../samples/file_samples_share_async.py @@ -299,6 +306,7 @@ async def delete_share( :dedent: 16 :caption: Deletes the share and any snapshots. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) delete_include = None if delete_snapshots: @@ -308,6 +316,7 @@ async def delete_share( timeout=timeout, sharesnapshot=self.snapshot, delete_snapshots=delete_include, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -321,6 +330,13 @@ async def get_share_properties(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: The share properties. :rtype: ~azure.storage.fileshare.ShareProperties @@ -333,12 +349,14 @@ async def get_share_properties(self, **kwargs): :dedent: 16 :caption: Gets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: props = await self._client.share.get_properties( timeout=timeout, sharesnapshot=self.snapshot, cls=deserialize_share_properties, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -356,6 +374,13 @@ async def set_share_quota(self, quota, **kwargs): Must be greater than 0, and less than or equal to 5TB. :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -368,6 +393,7 @@ async def set_share_quota(self, quota, **kwargs): :dedent: 16 :caption: Sets the share quota. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: return await self._client.share.set_properties( # type: ignore @@ -375,6 +401,7 @@ async def set_share_quota(self, quota, **kwargs): quota=quota, access_tier=None, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -383,7 +410,7 @@ async def set_share_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] """Sets the share properties. - .. versionadded:: 12.6.0 + .. versionadded:: 12.3.0 :keyword access_tier: Specifies the access tier of the share. @@ -398,6 +425,9 @@ async def set_share_properties(self, **kwargs): Root squash to set on the share. Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash' :paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -410,6 +440,7 @@ async def set_share_properties(self, **kwargs): :dedent: 16 :caption: Sets the share properties. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) access_tier = kwargs.pop('access_tier', None) quota = kwargs.pop('quota', None) @@ -422,6 +453,7 @@ async def set_share_properties(self, **kwargs): quota=quota, access_tier=access_tier, root_squash=root_squash, + lease_access_conditions=access_conditions, cls=return_response_headers, **kwargs) except HttpResponseError as error: @@ -441,6 +473,13 @@ async def set_share_metadata(self, metadata, **kwargs): :type metadata: dict(str, str) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) @@ -453,6 +492,7 @@ async def set_share_metadata(self, metadata, **kwargs): :dedent: 16 :caption: Sets the share metadata. """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) headers = kwargs.pop('headers', {}) headers.update(add_metadata_headers(metadata)) @@ -461,6 +501,7 @@ async def set_share_metadata(self, metadata, **kwargs): timeout=timeout, cls=return_response_headers, headers=headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -473,14 +514,23 @@ async def get_share_access_policy(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Access policy information in a dict. :rtype: dict[str, Any] """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: response, identifiers = await self._client.share.get_access_policy( timeout=timeout, cls=return_headers_and_deserialized, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -503,9 +553,17 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs): :type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`) :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :returns: Share-updated property dict (Etag and last modified). :rtype: dict(str, Any) """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) if len(signed_identifiers) > 5: raise ValueError( @@ -524,6 +582,7 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs): share_acl=signed_identifiers or None, timeout=timeout, cls=return_response_headers, + lease_access_conditions=access_conditions, **kwargs) except HttpResponseError as error: process_storage_error(error) @@ -538,13 +597,22 @@ async def get_share_stats(self, **kwargs): :keyword int timeout: The timeout parameter is expressed in seconds. + :keyword lease: + Required if the share has an active lease. Value can be a ShareLeaseClient object + or the lease ID as a string. + + .. versionadded:: 12.5.0 + This keyword argument was introduced in API version '2020-08-04'. + :return: The approximate size of the data (in bytes) stored on the share. :rtype: int """ + access_conditions = get_access_conditions(kwargs.pop('lease', None)) timeout = kwargs.pop('timeout', None) try: stats = await self._client.share.get_statistics( timeout=timeout, + lease_access_conditions=access_conditions, **kwargs) return stats.share_usage_bytes # type: ignore except HttpResponseError as error: diff --git a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py index 5693e8613090..866e70daa2a5 100644 --- a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py +++ b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py @@ -143,6 +143,21 @@ def get_directory_or_file_client(self): # Get the file client to interact with a specific file my_file = share.get_file_client("dir1/myfile") + def acquire_share_lease(self): + # Instantiate the ShareClient from a connection string + from azure.storage.fileshare import ShareClient + share = ShareClient.from_connection_string(self.connection_string, "sharesamples") + + # Create the share + share.create_share() + + # [START acquire_and_release_lease_on_share] + share.create_directory("mydir") + lease = share.acquire_lease() + share.get_share_properties(lease=lease) + share.delete_share(lease=lease) + # [END acquire_and_release_lease_on_share] + if __name__ == '__main__': sample = ShareSamples() @@ -151,3 +166,4 @@ def get_directory_or_file_client(self): sample.set_share_properties() sample.list_directories_and_files() sample.get_directory_or_file_client() + sample.acquire_share_lease() diff --git a/sdk/storage/azure-storage-file-share/tests/test_share.py b/sdk/storage/azure-storage-file-share/tests/test_share.py index 2587ff91b893..93450b6a59ee 100644 --- a/sdk/storage/azure-storage-file-share/tests/test_share.py +++ b/sdk/storage/azure-storage-file-share/tests/test_share.py @@ -186,7 +186,6 @@ def test_undelete_share(self, resource_group, location, storage_account, storage props = restored_share_client.get_share_properties() self.assertIsNotNone(props) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -196,7 +195,6 @@ def test_lease_share_acquire_and_release(self, resource_group, location, storage lease.release() # Assert - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -234,7 +232,6 @@ def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_ share_lease.release() self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -254,7 +251,6 @@ def test_lease_share_renew(self, resource_group, location, storage_account, stor self.sleep(10) share_client.delete_share() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -269,7 +265,6 @@ def test_lease_share_with_duration(self, resource_group, location, storage_accou self.sleep(15) share_client.acquire_lease() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -282,7 +277,6 @@ def test_lease_share_twice(self, resource_group, location, storage_account, stor lease2 = share_client.acquire_lease(lease_id=lease.id) self.assertEqual(lease.id, lease2.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -295,7 +289,6 @@ def test_lease_share_with_proposed_lease_id(self, resource_group, location, stor # Assert self.assertEqual(proposed_lease_id, lease.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -315,7 +308,6 @@ def test_lease_share_change_lease_id(self, resource_group, location, storage_acc self.assertNotEqual(lease_id1, lease_id) self.assertEqual(lease_id2, lease_id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -330,7 +322,6 @@ def test_set_share_metadata_with_lease_id(self, resource_group, location, storag md = share_client.get_share_properties().metadata self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -345,7 +336,6 @@ def test_get_share_metadata_with_lease_id(self, resource_group, location, storag # Assert self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -365,7 +355,6 @@ def test_get_share_properties_with_lease_id(self, resource_group, location, stor self.assertEqual(props.lease.state, 'leased') self.assertEqual(props.lease.status, 'locked') - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -379,7 +368,6 @@ def test_get_share_acl_with_lease_id(self, resource_group, location, storage_acc self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -399,7 +387,6 @@ def test_set_share_acl_with_lease_id(self, resource_group, location, storage_acc self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -414,7 +401,6 @@ def test_lease_share_break_period(self, resource_group, location, storage_accoun with self.assertRaises(HttpResponseError): share_client.delete_share(lease=lease) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) @@ -649,7 +635,6 @@ def test_list_shares_no_options_for_premium_account(self, resource_group, locati self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time) self._delete_shares() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key): self._setup(storage_account, storage_account_key) diff --git a/sdk/storage/azure-storage-file-share/tests/test_share_async.py b/sdk/storage/azure-storage-file-share/tests/test_share_async.py index d9ff6b973d7d..e6f9ec6ba6b3 100644 --- a/sdk/storage/azure-storage-file-share/tests/test_share_async.py +++ b/sdk/storage/azure-storage-file-share/tests/test_share_async.py @@ -203,7 +203,6 @@ async def test_undelete_share(self, resource_group, location, storage_account, s self.assertIsNotNone(props) break - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key): @@ -214,7 +213,6 @@ async def test_lease_share_acquire_and_release(self, resource_group, location, s await lease.release() # Assert - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key): @@ -253,7 +251,6 @@ async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, st await share_lease.release() await self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key): @@ -274,7 +271,6 @@ async def test_lease_share_renew(self, resource_group, location, storage_account self.sleep(10) await share_client.delete_share() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key): @@ -290,7 +286,6 @@ async def test_lease_share_with_duration(self, resource_group, location, storage self.sleep(15) await share_client.acquire_lease() - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key): @@ -304,7 +299,6 @@ async def test_lease_share_twice(self, resource_group, location, storage_account lease2 = await share_client.acquire_lease(lease_id=lease.id) self.assertEqual(lease.id, lease2.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -318,7 +312,6 @@ async def test_lease_share_with_proposed_lease_id(self, resource_group, location # Assert self.assertEqual(proposed_lease_id, lease.id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -339,7 +332,6 @@ async def test_lease_share_change_lease_id(self, resource_group, location, stora self.assertNotEqual(lease_id1, lease_id) self.assertEqual(lease_id2, lease_id) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -356,7 +348,6 @@ async def test_set_share_metadata_with_lease_id(self, resource_group, location, md = props.metadata self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -373,7 +364,6 @@ async def test_get_share_metadata_with_lease_id(self, resource_group, location, # Assert self.assertDictEqual(md, metadata) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -394,7 +384,6 @@ async def test_get_share_properties_with_lease_id(self, resource_group, location self.assertEqual(props.lease.state, 'leased') self.assertEqual(props.lease.status, 'locked') - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -409,7 +398,6 @@ async def test_get_share_acl_with_lease_id(self, resource_group, location, stora self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -430,7 +418,6 @@ async def test_set_share_acl_with_lease_id(self, resource_group, location, stora self.assertIsNotNone(acl) self.assertIsNone(acl.get('public_access')) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key): @@ -446,7 +433,6 @@ async def test_lease_share_break_period(self, resource_group, location, storage_ with self.assertRaises(HttpResponseError): await share_client.delete_share(lease=lease) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key): @@ -705,7 +691,6 @@ async def test_list_shares_no_options_for_premium_account_async(self, resource_g self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time) await self._delete_shares(share.share_name) - @pytest.mark.skip("Share leases are currently unavailable.") @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key): From c707efd986b4a8c9872b9e8a23739bb91a583f77 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Tue, 16 Mar 2021 17:24:56 -0700 Subject: [PATCH 02/22] Added share lease docstrings This reverts commit 8094c4e738f7ae4961b48d25fa5a3e23f21b0949. --- .../azure/storage/fileshare/_lease.py | 46 +++++++++++++------ .../storage/fileshare/aio/_lease_async.py | 44 +++++++++++++----- 2 files changed, 65 insertions(+), 25 deletions(-) diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py index 61b1d9061978..7c38145c68c4 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py @@ -7,7 +7,7 @@ import uuid from typing import ( # pylint: disable=unused-import - Optional, Any, TypeVar, TYPE_CHECKING + Union, Optional, Any, TypeVar, TYPE_CHECKING ) from azure.core.tracing.decorator import distributed_trace @@ -25,7 +25,7 @@ class ShareLeaseClient(object): """Creates a new ShareLeaseClient. - This client provides lease operations on a ShareFileClient. + This client provides lease operations on a ShareClient or ShareFileClient. :ivar str id: The ID of the lease currently being maintained. This will be `None` if no @@ -38,8 +38,9 @@ class ShareLeaseClient(object): This will be `None` if no lease has yet been acquired or modified. :param client: - The client of the file to lease. - :type client: ~azure.storage.fileshare.ShareFileClient + The client of the file or share to lease. + :type client: ~azure.storage.fileshare.ShareFileClient or + ~azure.storage.fileshare.ShareClient :param str lease_id: A string representing the lease ID of an existing lease. This value does not need to be specified in order to acquire a new lease, or break one. @@ -47,7 +48,7 @@ class ShareLeaseClient(object): def __init__( self, client, lease_id=None ): # pylint: disable=missing-client-constructor-parameter-credential,missing-client-constructor-parameter-kwargs - # type: (ShareFileClient, Optional[str]) -> None + # type: (Union[ShareFileClient, ShareClient], Optional[str]) -> None self.id = lease_id or str(uuid.uuid4()) self.last_modified = None self.etag = None @@ -70,14 +71,20 @@ def __exit__(self, *args): def acquire(self, **kwargs): # type: (**Any) -> None """Requests a new lease. This operation establishes and manages a lock on a - file for write and delete operations. If the file does not have an active lease, - the File service creates a lease on the file. If the file has an active lease, + file or share for write and delete operations. If the file or share does not have an active lease, + the File or Share service creates a lease on the file or share. If the file has an active lease, you can only request a new lease using the active lease ID. - If the file does not have an active lease, the File service creates a + If the file or share does not have an active lease, the File or Share service creates a lease on the file and returns a new lease ID. + :keyword int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be + between 15 and 60 seconds. A share lease duration cannot be changed + using renew or change. Default is -1 (infinite share lease). + :keyword int timeout: The timeout parameter is expressed in seconds. :rtype: None @@ -99,7 +106,7 @@ def acquire(self, **kwargs): self.etag = response.get('etag') # type: str @distributed_trace - def _renew(self, **kwargs): + def renew(self, **kwargs): # type: (Any) -> None """Renews the share lease. @@ -134,8 +141,8 @@ def _renew(self, **kwargs): def release(self, **kwargs): # type: (Any) -> None """Releases the lease. The lease may be released if the lease ID specified on the request matches - that associated with the file. Releasing the lease allows another client to immediately acquire - the lease for the or file as soon as the release is complete. + that associated with the share or file. Releasing the lease allows another client to immediately acquire + the lease for the share or file as soon as the release is complete. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -162,7 +169,7 @@ def change(self, proposed_lease_id, **kwargs): a new lease ID in x-ms-proposed-lease-id. :param str proposed_lease_id: - Proposed lease ID, in a GUID string format. The File service will raise an error + Proposed lease ID, in a GUID string format. The File or Share service will raise an error (Invalid request) if the proposed lease ID is not in the correct format. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -186,7 +193,7 @@ def change(self, proposed_lease_id, **kwargs): @distributed_trace def break_lease(self, **kwargs): # type: (Any) -> int - """Force breaks the lease if the file has an active lease. Any authorized request can break the lease; + """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease; the request is not required to specify a matching lease ID. An infinite lease breaks immediately. Once a lease is broken, it cannot be changed. Any authorized request can break the lease; @@ -194,6 +201,19 @@ def break_lease(self, **kwargs): When a lease is successfully broken, the response indicates the interval in seconds until a new lease can be acquired. + :keyword int lease_break_period: + This is the proposed duration of seconds that the share lease + should continue before it is broken, between 0 and 60 seconds. This + break period is only used if it is shorter than the time remaining + on the share lease. If longer, the time remaining on the share lease is used. + A new share lease will not be available before the break period has + expired, but the share lease may be held for longer than the break + period. If this header does not appear with a break + operation, a fixed-duration share lease breaks after the remaining share lease + period elapses, and an infinite share lease breaks immediately. + + .. versionadded:: 12.6.0 + :keyword int timeout: The timeout parameter is expressed in seconds. :return: Approximate time remaining in the lease period, in seconds. diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py index 82c1550ac2df..027dd2f85863 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py @@ -5,7 +5,7 @@ # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method from typing import ( # pylint: disable=unused-import - Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple, + Union, Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple, TypeVar, TYPE_CHECKING ) @@ -25,7 +25,7 @@ class ShareLeaseClient(LeaseClientBase): """Creates a new ShareLeaseClient. - This client provides lease operations on a ShareFileClient. + This client provides lease operations on a ShareClient or ShareFileClient. :ivar str id: The ID of the lease currently being maintained. This will be `None` if no @@ -38,8 +38,9 @@ class ShareLeaseClient(LeaseClientBase): This will be `None` if no lease has yet been acquired or modified. :param client: - The client of the file to lease. - :type client: ~azure.storage.fileshare.ShareFileClient + The client of the file or share to lease. + :type client: ~azure.storage.fileshare.ShareFileClient or + ~azure.storage.fileshare.ShareClient :param str lease_id: A string representing the lease ID of an existing lease. This value does not need to be specified in order to acquire a new lease, or break one. @@ -61,14 +62,20 @@ async def __aexit__(self, *args): async def acquire(self, **kwargs): # type: (**Any) -> None """Requests a new lease. This operation establishes and manages a lock on a - file for write and delete operations. If the file does not have an active lease, - the File service creates a lease on the file. If the file has an active lease, + file or share for write and delete operations. If the file or share does not have an active lease, + the File or Share service creates a lease on the file or share. If the file has an active lease, you can only request a new lease using the active lease ID. - If the file does not have an active lease, the File service creates a + If the file or share does not have an active lease, the File or Share service creates a lease on the file and returns a new lease ID. + :keyword int lease_duration: + Specifies the duration of the lease, in seconds, or negative one + (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be + between 15 and 60 seconds. A share lease duration cannot be changed + using renew or change. Default is -1 (infinite share lease). + :keyword int timeout: The timeout parameter is expressed in seconds. :rtype: None @@ -90,7 +97,7 @@ async def acquire(self, **kwargs): self.etag = response.get('etag') # type: str @distributed_trace_async - async def _renew(self, **kwargs): + async def renew(self, **kwargs): # type: (Any) -> None """Renews the share lease. @@ -125,8 +132,8 @@ async def _renew(self, **kwargs): async def release(self, **kwargs): # type: (Any) -> None """Releases the lease. The lease may be released if the lease ID specified on the request matches - that associated with the file. Releasing the lease allows another client to immediately acquire - the lease for the file as soon as the release is complete. + that associated with the share or file. Releasing the lease allows another client to immediately acquire + the lease for the share or file as soon as the release is complete. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -153,7 +160,7 @@ async def change(self, proposed_lease_id, **kwargs): a new lease ID in x-ms-proposed-lease-id. :param str proposed_lease_id: - Proposed lease ID, in a GUID string format. The File service raises an error + Proposed lease ID, in a GUID string format. The File or Share service raises an error (Invalid request) if the proposed lease ID is not in the correct format. :keyword int timeout: The timeout parameter is expressed in seconds. @@ -177,7 +184,7 @@ async def change(self, proposed_lease_id, **kwargs): @distributed_trace_async async def break_lease(self, **kwargs): # type: (Any) -> int - """Force breaks the lease if the file has an active lease. Any authorized request can break the lease; + """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease; the request is not required to specify a matching lease ID. An infinite lease breaks immediately. Once a lease is broken, it cannot be changed. Any authorized request can break the lease; @@ -185,6 +192,19 @@ async def break_lease(self, **kwargs): When a lease is successfully broken, the response indicates the interval in seconds until a new lease can be acquired. + :keyword int lease_break_period: + This is the proposed duration of seconds that the share lease + should continue before it is broken, between 0 and 60 seconds. This + break period is only used if it is shorter than the time remaining + on the share lease. If longer, the time remaining on the share lease is used. + A new share lease will not be available before the break period has + expired, but the share lease may be held for longer than the break + period. If this header does not appear with a break + operation, a fixed-duration share lease breaks after the remaining share lease + period elapses, and an infinite share lease breaks immediately. + + .. versionadded:: 12.6.0 + :keyword int timeout: The timeout parameter is expressed in seconds. :return: Approximate time remaining in the lease period, in seconds. From 07ef48eecbc5ac46539f00f299075e0798941d9e Mon Sep 17 00:00:00 2001 From: tasherif-msft <69483382+tasherif-msft@users.noreply.github.com> Date: Tue, 6 Apr 2021 11:47:33 -0700 Subject: [PATCH 03/22] [Datalake] HNS Soft Delete (#17614) * generated HNS soft delete * undelete_path * deleted list_paths and config_async * lint * linter * Added get/set props * recorded tests and added models * added async prefix * recorded async tests for get and set props * removed preprod from yaml files * removed preprod from yaml files * cleaned up model name * cleaned up model name * added path helpers * fixed preprod * added the deserialize method for deleted paths * added get deleted Paths * renamed models * fixed delete directory failing tests * fixed recording for get_deleted_paths * fixed tests * fixed tests * rename * linter * linter * typing * cleaned up * renamed and cleaned up * linter and rename * linter * added test * rename deleted_path_version to deletion_id * Fixed dir prefix issue * Fixed directory prefix issue * renamed deser * reset testcase * removed whl * fixed pos arg * fixed retention * fixed docstrings * fixed test failures * added new header to detect file or dir * cleanup * fixed tests Co-authored-by: xiafu Co-authored-by: Xiaoxi Fu <49707495+xiafu-msft@users.noreply.github.com> --- ...website_props_dont_impact_other_props.yaml | 64 +- .../azure/storage/filedatalake/__init__.py | 12 +- .../filedatalake/_data_lake_service_client.py | 85 +- .../storage/filedatalake/_deserialize.py | 32 +- .../filedatalake/_file_system_client.py | 103 ++- .../_azure_data_lake_storage_restapi.py | 20 + .../filedatalake/_generated/_configuration.py | 2 +- .../aio/_azure_data_lake_storage_restapi.py | 18 + .../_generated/aio/_configuration.py | 2 +- .../aio/operations/_file_system_operations.py | 135 ++- .../aio/operations/_path_operations.py | 106 ++- .../aio/operations/_service_operations.py | 2 +- .../_generated/models/__init__.py | 23 +- .../_azure_data_lake_storage_restapi_enums.py | 10 + .../filedatalake/_generated/models/_models.py | 323 ++++++- .../_generated/models/_models_py3.py | 378 +++++++- .../operations/_file_system_operations.py | 141 ++- .../_generated/operations/_path_operations.py | 107 ++- .../operations/_service_operations.py | 2 +- .../filedatalake/_list_paths_helper.py | 108 +++ .../azure/storage/filedatalake/_models.py | 197 ++++ .../storage/filedatalake/_path_client.py | 1 + .../filedatalake/_shared/response_handlers.py | 2 +- .../aio/_data_lake_service_client_async.py | 83 +- .../aio/_file_system_client_async.py | 82 +- .../filedatalake/aio/_list_paths_helper.py | 111 +++ .../swagger/README.md | 12 +- ...ient.test_datalake_service_properties.yaml | 86 ++ ...st_disabled_static_website_properties.yaml | 83 ++ ...datalake_service_client.test_set_cors.yaml | 86 ++ ...ient.test_set_default_service_version.yaml | 83 ++ ...ient.test_set_delete_retention_policy.yaml | 83 ++ ...et_delete_retention_policy_edge_cases.yaml | 338 +++++++ ..._service_client.test_set_hour_metrics.yaml | 85 ++ ...alake_service_client.test_set_logging.yaml | 83 ++ ...ervice_client.test_set_minute_metrics.yaml | 85 ++ ...nt.test_set_static_website_properties.yaml | 83 ++ ...website_props_dont_impact_other_props.yaml | 165 ++++ ...sync.test_datalake_service_properties.yaml | 65 ++ ...st_disabled_static_website_properties.yaml | 64 ++ ...ke_service_client_async.test_set_cors.yaml | 66 ++ ...sync.test_set_default_service_version.yaml | 64 ++ ...sync.test_set_delete_retention_policy.yaml | 64 ++ ...et_delete_retention_policy_edge_cases.yaml | 266 ++++++ ...ce_client_async.test_set_hour_metrics.yaml | 65 ++ ...service_client_async.test_set_logging.yaml | 64 ++ ..._client_async.test_set_minute_metrics.yaml | 65 ++ ...nc.test_set_static_website_properties.yaml | 64 ++ ...website_props_dont_impact_other_props.yaml | 127 +++ ...st_file_system.test_get_deleted_paths.yaml | 844 ++++++++++++++++++ ...tem.test_undelete_dir_with_version_id.yaml | 288 ++++++ ...em.test_undelete_file_with_version_id.yaml | 286 ++++++ ...e_system_async.test_get_deleted_paths.yaml | 612 +++++++++++++ ...ync.test_undelete_dir_with_version_id.yaml | 205 +++++ ...nc.test_undelete_file_with_version_id.yaml | 204 +++++ .../tests/test_datalake_service_client.py | 309 +++++++ .../test_datalake_service_client_async.py | 359 ++++++++ .../tests/test_directory.py | 4 +- .../tests/test_directory_async.py | 4 +- .../tests/test_file_system.py | 69 ++ .../tests/test_file_system_async.py | 92 +- 61 files changed, 7543 insertions(+), 128 deletions(-) create mode 100644 sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py create mode 100644 sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py create mode 100644 sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml index bb28feabbf00..7d7ac1159c42 100644 --- a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml @@ -16,25 +16,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:15 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:19 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -48,30 +46,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:25 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsefalse" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:27 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK @@ -91,25 +87,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:46 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:49 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -123,30 +117,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:49 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsetrueindex.htmlerrors/error/404error.html" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:50 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py index 02a7559f5b27..c5e918819b78 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py @@ -36,6 +36,11 @@ AccessControlChangeCounters, AccessControlChangeFailure, AccessControlChanges, + AnalyticsLogging, + Metrics, + RetentionPolicy, + StaticWebsite, + CorsRule ) from ._shared_access_signature import generate_account_sas, generate_file_system_sas, generate_directory_sas, \ @@ -87,5 +92,10 @@ 'DataLakeFileQueryError', 'ArrowDialect', 'ArrowType', - 'DataLakeFileQueryError' + 'DataLakeFileQueryError', + 'AnalyticsLogging', + 'Metrics', + 'RetentionPolicy', + 'StaticWebsite', + 'CorsRule' ] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index f9e625c75119..b8cc3dc71121 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Any +from typing import Optional, List, Dict, Any try: from urllib.parse import urlparse @@ -15,10 +15,12 @@ from azure.storage.blob import BlobServiceClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str +from ._deserialize import get_datalake_service_properties from ._file_system_client import FileSystemClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_file_client import DataLakeFileClient -from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode +from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode, AnalyticsLogging, \ + CorsRule, RetentionPolicy, StaticWebsite, Metrics from ._serialize import convert_dfs_url_to_blob_url @@ -462,7 +464,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -492,3 +494,80 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def set_service_properties( + self, analytics_logging=None, # type: Optional[AnalyticsLogging] + hour_metrics=None, # type: Optional[Metrics] + minute_metrics=None, # type: Optional[Metrics] + cors=None, # type: Optional[List[CorsRule]] + target_version=None, # type: Optional[str] + delete_retention_policy=None, # type: Optional[RetentionPolicy] + static_website=None, # type: Optional[StaticWebsite] + **kwargs + ): + # type: (...) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + :param analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :param str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :param delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :param static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, + hour_metrics=hour_metrics, + minute_metrics=minute_metrics, + cors=cors, + target_version=target_version, + delete_retention_policy=delete_retention_policy, + static_website=static_website, + **kwargs) # pylint: disable=protected-access + + def get_service_properties(self, **kwargs): + # type: (Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py index dfcaf8ef5dde..18ec80fd44f7 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py @@ -12,7 +12,8 @@ from azure.core.pipeline.policies import ContentDecodePolicy from azure.core.exceptions import HttpResponseError, DecodeError, ResourceModifiedError, ClientAuthenticationError, \ ResourceNotFoundError, ResourceExistsError -from ._models import FileProperties, DirectoryProperties, LeaseProperties, PathProperties +from ._models import FileProperties, DirectoryProperties, LeaseProperties, DeletedPathProperties, StaticWebsite, \ + RetentionPolicy, Metrics, AnalyticsLogging, PathProperties # pylint: disable=protected-access from ._shared.models import StorageErrorCode if TYPE_CHECKING: @@ -48,6 +49,34 @@ def deserialize_path_properties(path_list): return [PathProperties._from_generated(path) for path in path_list] # pylint: disable=protected-access +def get_deleted_path_properties_from_generated_code(generated): + deleted_path = DeletedPathProperties() + deleted_path.name = generated.name + deleted_path.deleted_time = generated.properties.deleted_time + deleted_path.remaining_retention_days = generated.properties.remaining_retention_days + deleted_path.deletion_id = generated.deletion_id + return deleted_path + + +def is_file_path(_, __, headers): + if headers['x-ms-resource-type'] == "file": + return True + return False + + +def get_datalake_service_properties(datalake_properties): + datalake_properties["analytics_logging"] = AnalyticsLogging._from_generated( # pylint: disable=protected-access + datalake_properties["analytics_logging"]) + datalake_properties["hour_metrics"] = Metrics._from_generated(datalake_properties["hour_metrics"]) # pylint: disable=protected-access + datalake_properties["minute_metrics"] = Metrics._from_generated( # pylint: disable=protected-access + datalake_properties["minute_metrics"]) + datalake_properties["delete_retention_policy"] = RetentionPolicy._from_generated( # pylint: disable=protected-access + datalake_properties["delete_retention_policy"]) + datalake_properties["static_website"] = StaticWebsite._from_generated( # pylint: disable=protected-access + datalake_properties["static_website"]) + return datalake_properties + + def from_blob_properties(blob_properties): file_props = FileProperties() file_props.name = blob_properties.name @@ -64,6 +93,7 @@ def from_blob_properties(blob_properties): file_props.content_settings = blob_properties.content_settings return file_props + def normalize_headers(headers): normalized = {} for key, value in headers.items(): diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index 0c0fbc36673e..ece2986def6f 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -3,26 +3,32 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Optional, Any +import functools +from typing import Optional, Any, Union + try: - from urllib.parse import urlparse, quote + from urllib.parse import urlparse, quote, unquote except ImportError: from urlparse import urlparse # type: ignore - from urllib2 import quote # type: ignore - + from urllib2 import quote, unquote # type: ignore import six + from azure.core.pipeline import Pipeline +from azure.core.exceptions import HttpResponseError from azure.core.paging import ItemPaged from azure.storage.blob import ContainerClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str from ._serialize import convert_dfs_url_to_blob_url -from ._models import LocationMode, FileSystemProperties, PublicAccess, FileProperties, DirectoryProperties +from ._list_paths_helper import DeletedPathPropertiesPaged +from ._models import LocationMode, FileSystemProperties, PublicAccess, DeletedPathProperties, FileProperties, \ + DirectoryProperties from ._data_lake_file_client import DataLakeFileClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_lease import DataLakeLeaseClient from ._generated import AzureDataLakeStorageRESTAPI -from ._deserialize import deserialize_path_properties +from ._generated.models import ListBlobsIncludeItem +from ._deserialize import deserialize_path_properties, process_storage_error, is_file_path class FileSystemClient(StorageAccountHostsMixin): @@ -99,6 +105,9 @@ def __init__( # ADLS doesn't support secondary endpoint, make sure it's empty self._hosts[LocationMode.SECONDARY] = "" self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) def _format_url(self, hostname): file_system_name = self.file_system_name @@ -740,6 +749,53 @@ def delete_file(self, file, # type: Union[FileProperties, str] file_client.delete_file(**kwargs) return file_client + def _undelete_path(self, deleted_path_name, deletion_id): + quoted_path = quote(unquote(deleted_path_name.strip('/'))) + + url_and_token = self.url.replace('.dfs.', '.blob.').split('?') + try: + url = url_and_token[0] + '/' + quoted_path + url_and_token[1] + except IndexError: + url = url_and_token[0] + '/' + quoted_path + + undelete_source = quoted_path + '?deletionid={}'.format(deletion_id) if deletion_id else None + + return quoted_path, url, undelete_source + + def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the path (file or directory) to restore. + :param str deletion_id: + Specifies the version of the deleted path to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + + pipeline = Pipeline( + transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -801,7 +857,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -826,3 +882,36 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def get_deleted_paths(self, + name_starts_with=None, # type: Optional[str], + **kwargs): + # type: (...) -> ItemPaged[DeletedPathProperties] + """Returns a generator to list the paths(could be files or directories) under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str name_starts_with: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of PathProperties. + :rtype: + ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return ItemPaged( + command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py index efb21f39026f..fbd0a7916e69 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py @@ -15,6 +15,8 @@ # pylint: disable=unused-import,ungrouped-imports from typing import Any + from azure.core.pipeline.transport import HttpRequest, HttpResponse + from ._configuration import AzureDataLakeStorageRESTAPIConfiguration from .operations import ServiceOperations from .operations import FileSystemOperations @@ -57,6 +59,24 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + def _send_request(self, http_request, **kwargs): + # type: (HttpRequest, Any) -> HttpResponse + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.HttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + def close(self): # type: () -> None self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py index e3dd7f17f1fd..3bfff366da7c 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py @@ -39,7 +39,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py index 662a749523a6..efeeeb3b5361 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py @@ -9,6 +9,7 @@ from typing import Any from azure.core import AsyncPipelineClient +from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest from msrest import Deserializer, Serializer from ._configuration import AzureDataLakeStorageRESTAPIConfiguration @@ -52,6 +53,23 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + async def close(self) -> None: await self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py index e23526fd6f27..82234727a630 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py @@ -34,7 +34,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py index b6732e350f3b..d4e206a6d054 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- import datetime -from typing import Any, AsyncIterable, Callable, Dict, Generic, Optional, TypeVar +from typing import Any, AsyncIterable, Callable, Dict, Generic, List, Optional, TypeVar, Union import warnings from azure.core.async_paging import AsyncItemPaged, AsyncList @@ -108,7 +108,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -206,7 +206,7 @@ async def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -276,7 +276,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -370,7 +370,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -443,8 +443,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -456,7 +458,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -502,7 +505,7 @@ async def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -512,3 +515,117 @@ async def get_next(cont_token=None): get_next, extract_data ) list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + async def list_blob_hierarchy_segment( + self, + prefix: Optional[str] = None, + delimiter: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + include: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] = None, + showonly: Optional[str] = "deleted", + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> "_models.ListBlobsHierarchySegmentResponse": + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py index b090bc10952e..7cec5890e122 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py @@ -239,7 +239,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -284,10 +284,10 @@ async def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -499,7 +499,7 @@ async def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -654,7 +654,7 @@ async def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -787,7 +787,7 @@ async def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -947,7 +947,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1080,7 +1080,7 @@ async def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1088,6 +1088,7 @@ async def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1203,7 +1204,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1313,7 +1314,7 @@ async def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1481,7 +1482,7 @@ async def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1599,7 +1600,7 @@ async def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1680,7 +1681,7 @@ async def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,3 +1696,78 @@ async def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + async def undelete( + self, + timeout: Optional[int] = None, + undelete_source: Optional[str] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py index b229c1208668..f8ae878a37c3 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py @@ -136,7 +136,7 @@ async def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py index 769623c0eee9..fc4548f39b19 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py @@ -8,9 +8,14 @@ try: from ._models_py3 import AclFailedEntry + from ._models_py3 import BlobHierarchyListSegment + from ._models_py3 import BlobItemInternal + from ._models_py3 import BlobPrefix + from ._models_py3 import BlobPropertiesInternal from ._models_py3 import FileSystem from ._models_py3 import FileSystemList from ._models_py3 import LeaseAccessConditions + from ._models_py3 import ListBlobsHierarchySegmentResponse from ._models_py3 import ModifiedAccessConditions from ._models_py3 import Path from ._models_py3 import PathHTTPHeaders @@ -18,12 +23,17 @@ from ._models_py3 import SetAccessControlRecursiveResponse from ._models_py3 import SourceModifiedAccessConditions from ._models_py3 import StorageError - from ._models_py3 import StorageErrorAutoGenerated + from ._models_py3 import StorageErrorError except (SyntaxError, ImportError): from ._models import AclFailedEntry # type: ignore + from ._models import BlobHierarchyListSegment # type: ignore + from ._models import BlobItemInternal # type: ignore + from ._models import BlobPrefix # type: ignore + from ._models import BlobPropertiesInternal # type: ignore from ._models import FileSystem # type: ignore from ._models import FileSystemList # type: ignore from ._models import LeaseAccessConditions # type: ignore + from ._models import ListBlobsHierarchySegmentResponse # type: ignore from ._models import ModifiedAccessConditions # type: ignore from ._models import Path # type: ignore from ._models import PathHTTPHeaders # type: ignore @@ -31,9 +41,10 @@ from ._models import SetAccessControlRecursiveResponse # type: ignore from ._models import SourceModifiedAccessConditions # type: ignore from ._models import StorageError # type: ignore - from ._models import StorageErrorAutoGenerated # type: ignore + from ._models import StorageErrorError # type: ignore from ._azure_data_lake_storage_restapi_enums import ( + ListBlobsIncludeItem, PathExpiryOptions, PathGetPropertiesAction, PathLeaseAction, @@ -45,9 +56,14 @@ __all__ = [ 'AclFailedEntry', + 'BlobHierarchyListSegment', + 'BlobItemInternal', + 'BlobPrefix', + 'BlobPropertiesInternal', 'FileSystem', 'FileSystemList', 'LeaseAccessConditions', + 'ListBlobsHierarchySegmentResponse', 'ModifiedAccessConditions', 'Path', 'PathHTTPHeaders', @@ -55,7 +71,8 @@ 'SetAccessControlRecursiveResponse', 'SourceModifiedAccessConditions', 'StorageError', - 'StorageErrorAutoGenerated', + 'StorageErrorError', + 'ListBlobsIncludeItem', 'PathExpiryOptions', 'PathGetPropertiesAction', 'PathLeaseAction', diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py index e9fe9d71a62c..804050e9e0d0 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py @@ -26,6 +26,16 @@ def __getattr__(cls, name): raise AttributeError(name) +class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): + + COPY = "copy" + DELETED = "deleted" + METADATA = "metadata" + SNAPSHOTS = "snapshots" + UNCOMMITTEDBLOBS = "uncommittedblobs" + VERSIONS = "versions" + TAGS = "tags" + class PathExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): NEVER_EXPIRE = "NeverExpire" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py index 099e37c53bb2..237617a48a13 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py @@ -37,6 +37,263 @@ def __init__( self.error_message = kwargs.get('error_message', None) +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = kwargs.get('blob_prefixes', None) + self.blob_items = kwargs['blob_items'] + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = kwargs['name'] + self.deleted = kwargs['deleted'] + self.snapshot = kwargs['snapshot'] + self.version_id = kwargs.get('version_id', None) + self.is_current_version = kwargs.get('is_current_version', None) + self.properties = kwargs['properties'] + self.deletion_id = kwargs.get('deletion_id', None) + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = kwargs['name'] + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = kwargs.get('creation_time', None) + self.last_modified = kwargs['last_modified'] + self.etag = kwargs['etag'] + self.content_length = kwargs.get('content_length', None) + self.content_type = kwargs.get('content_type', None) + self.content_encoding = kwargs.get('content_encoding', None) + self.content_language = kwargs.get('content_language', None) + self.content_md5 = kwargs.get('content_md5', None) + self.content_disposition = kwargs.get('content_disposition', None) + self.cache_control = kwargs.get('cache_control', None) + self.blob_sequence_number = kwargs.get('blob_sequence_number', None) + self.copy_id = kwargs.get('copy_id', None) + self.copy_source = kwargs.get('copy_source', None) + self.copy_progress = kwargs.get('copy_progress', None) + self.copy_completion_time = kwargs.get('copy_completion_time', None) + self.copy_status_description = kwargs.get('copy_status_description', None) + self.server_encrypted = kwargs.get('server_encrypted', None) + self.incremental_copy = kwargs.get('incremental_copy', None) + self.destination_snapshot = kwargs.get('destination_snapshot', None) + self.deleted_time = kwargs.get('deleted_time', None) + self.remaining_retention_days = kwargs.get('remaining_retention_days', None) + self.access_tier_inferred = kwargs.get('access_tier_inferred', None) + self.customer_provided_key_sha256 = kwargs.get('customer_provided_key_sha256', None) + self.encryption_scope = kwargs.get('encryption_scope', None) + self.access_tier_change_time = kwargs.get('access_tier_change_time', None) + self.tag_count = kwargs.get('tag_count', None) + self.expires_on = kwargs.get('expires_on', None) + self.is_sealed = kwargs.get('is_sealed', None) + self.last_accessed_on = kwargs.get('last_accessed_on', None) + self.delete_time = kwargs.get('delete_time', None) + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -103,6 +360,64 @@ def __init__( self.lease_id = kwargs.get('lease_id', None) +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = kwargs['service_endpoint'] + self.container_name = kwargs['container_name'] + self.prefix = kwargs.get('prefix', None) + self.marker = kwargs.get('marker', None) + self.max_results = kwargs.get('max_results', None) + self.delimiter = kwargs.get('delimiter', None) + self.segment = kwargs['segment'] + self.next_marker = kwargs.get('next_marker', None) + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -319,11 +634,11 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( @@ -334,7 +649,7 @@ def __init__( self.error = kwargs.get('error', None) -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -352,6 +667,6 @@ def __init__( self, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = kwargs.get('code', None) self.message = kwargs.get('message', None) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py index 337388d8d2f6..bbe361c5b9bb 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py @@ -44,6 +44,307 @@ def __init__( self.error_message = error_message +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + *, + blob_items: List["BlobItemInternal"], + blob_prefixes: Optional[List["BlobPrefix"]] = None, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = blob_prefixes + self.blob_items = blob_items + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + *, + name: str, + deleted: bool, + snapshot: str, + properties: "BlobPropertiesInternal", + version_id: Optional[str] = None, + is_current_version: Optional[bool] = None, + deletion_id: Optional[str] = None, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = name + self.deleted = deleted + self.snapshot = snapshot + self.version_id = version_id + self.is_current_version = is_current_version + self.properties = properties + self.deletion_id = deletion_id + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + *, + name: str, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = name + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + *, + last_modified: datetime.datetime, + etag: str, + creation_time: Optional[datetime.datetime] = None, + content_length: Optional[int] = None, + content_type: Optional[str] = None, + content_encoding: Optional[str] = None, + content_language: Optional[str] = None, + content_md5: Optional[bytearray] = None, + content_disposition: Optional[str] = None, + cache_control: Optional[str] = None, + blob_sequence_number: Optional[int] = None, + copy_id: Optional[str] = None, + copy_source: Optional[str] = None, + copy_progress: Optional[str] = None, + copy_completion_time: Optional[datetime.datetime] = None, + copy_status_description: Optional[str] = None, + server_encrypted: Optional[bool] = None, + incremental_copy: Optional[bool] = None, + destination_snapshot: Optional[str] = None, + deleted_time: Optional[datetime.datetime] = None, + remaining_retention_days: Optional[int] = None, + access_tier_inferred: Optional[bool] = None, + customer_provided_key_sha256: Optional[str] = None, + encryption_scope: Optional[str] = None, + access_tier_change_time: Optional[datetime.datetime] = None, + tag_count: Optional[int] = None, + expires_on: Optional[datetime.datetime] = None, + is_sealed: Optional[bool] = None, + last_accessed_on: Optional[datetime.datetime] = None, + delete_time: Optional[datetime.datetime] = None, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = creation_time + self.last_modified = last_modified + self.etag = etag + self.content_length = content_length + self.content_type = content_type + self.content_encoding = content_encoding + self.content_language = content_language + self.content_md5 = content_md5 + self.content_disposition = content_disposition + self.cache_control = cache_control + self.blob_sequence_number = blob_sequence_number + self.copy_id = copy_id + self.copy_source = copy_source + self.copy_progress = copy_progress + self.copy_completion_time = copy_completion_time + self.copy_status_description = copy_status_description + self.server_encrypted = server_encrypted + self.incremental_copy = incremental_copy + self.destination_snapshot = destination_snapshot + self.deleted_time = deleted_time + self.remaining_retention_days = remaining_retention_days + self.access_tier_inferred = access_tier_inferred + self.customer_provided_key_sha256 = customer_provided_key_sha256 + self.encryption_scope = encryption_scope + self.access_tier_change_time = access_tier_change_time + self.tag_count = tag_count + self.expires_on = expires_on + self.is_sealed = is_sealed + self.last_accessed_on = last_accessed_on + self.delete_time = delete_time + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -118,6 +419,73 @@ def __init__( self.lease_id = lease_id +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + *, + service_endpoint: str, + container_name: str, + segment: "BlobHierarchyListSegment", + prefix: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + delimiter: Optional[str] = None, + next_marker: Optional[str] = None, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = service_endpoint + self.container_name = container_name + self.prefix = prefix + self.marker = marker + self.max_results = max_results + self.delimiter = delimiter + self.segment = segment + self.next_marker = next_marker + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -368,24 +736,24 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( self, *, - error: Optional["StorageErrorAutoGenerated"] = None, + error: Optional["StorageErrorError"] = None, **kwargs ): super(StorageError, self).__init__(**kwargs) self.error = error -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -406,6 +774,6 @@ def __init__( message: Optional[str] = None, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = code self.message = message diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py index 3726a2dd3cf1..991890ac4e2b 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py @@ -18,7 +18,7 @@ if TYPE_CHECKING: # pylint: disable=unused-import,ungrouped-imports - from typing import Any, Callable, Dict, Generic, Iterable, Optional, TypeVar + from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, TypeVar, Union T = TypeVar('T') ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] @@ -113,7 +113,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -172,7 +172,7 @@ def set_properties( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -212,7 +212,7 @@ def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -283,7 +283,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -340,7 +340,7 @@ def delete( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -378,7 +378,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -452,8 +452,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -465,7 +467,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -512,7 +515,7 @@ def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -521,4 +524,120 @@ def get_next(cont_token=None): return ItemPaged( get_next, extract_data ) + list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + def list_blob_hierarchy_segment( + self, + prefix=None, # type: Optional[str] + delimiter=None, # type: Optional[str] + marker=None, # type: Optional[str] + max_results=None, # type: Optional[int] + include=None, # type: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] + showonly="deleted", # type: Optional[str] + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> "_models.ListBlobsHierarchySegmentResponse" + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py index bd527947cf31..5517c96888bd 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py @@ -244,7 +244,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -290,10 +290,10 @@ def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -505,7 +505,7 @@ def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -661,7 +661,7 @@ def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -795,7 +795,7 @@ def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -956,7 +956,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1090,7 +1090,7 @@ def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1098,6 +1098,7 @@ def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1214,7 +1215,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1325,7 +1326,7 @@ def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1494,7 +1495,7 @@ def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1613,7 +1614,7 @@ def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,7 +1696,7 @@ def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1710,3 +1711,79 @@ def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + def undelete( + self, + timeout=None, # type: Optional[int] + undelete_source=None, # type: Optional[str] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py index c5a9555cf0d1..2db3801abff8 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py @@ -141,7 +141,7 @@ def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py new file mode 100644 index 000000000000..543e1e115780 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py @@ -0,0 +1,108 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.core.paging import PageIterator +from azure.core.exceptions import HttpResponseError +from ._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from ._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix +from ._shared.models import DictMixin +from ._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(PageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + def _get_next_cb(self, continuation_token): + try: + return self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index b99f9aa09d78..546fde0b44a8 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -18,6 +18,8 @@ from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON from azure.storage.blob import ArrowDialect as BlobArrowDialect from azure.storage.blob._models import ContainerPropertiesPaged +from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \ + RetentionPolicy as GenRetentionPolicy, StaticWebsite as GenStaticWebsite, CorsRule as GenCorsRule from ._shared.models import DictMixin @@ -827,3 +829,198 @@ def __init__(self, batch_counters, aggregate_counters, batch_failures, continuat self.aggregate_counters = aggregate_counters self.batch_failures = batch_failures self.continuation = continuation + + +class DeletedPathProperties(DictMixin): + """ + Properties populated for a deleted path. + + :ivar str name: + The name of the file in the path. + :ivar ~datetime.datetime deleted_time: + A datetime object representing the time at which the path was deleted. + :ivar int remaining_retention_days: + The number of days that the path will be retained before being permanently deleted by the service. + :ivar str deletion_id: + The id associated with the deleted path. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('name') + self.deleted_time = None + self.remaining_retention_days = None + self.deletion_id = None + + +class AnalyticsLogging(GenLogging): + """Azure Analytics Logging settings. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword bool delete: + Indicates whether all delete requests should be logged. The default value is `False`. + :keyword bool read: + Indicates whether all read requests should be logged. The default value is `False`. + :keyword bool write: + Indicates whether all write requests should be logged. The default value is `False`. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.delete = kwargs.get('delete', False) + self.read = kwargs.get('read', False) + self.write = kwargs.get('write', False) + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + delete=generated.delete, + read=generated.read, + write=generated.write, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class Metrics(GenMetrics): + """A summary of request statistics grouped by API in hour or minute aggregates. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.enabled = False + self.include_apis = None + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + enabled=generated.enabled, + include_apis=generated.include_apis, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class RetentionPolicy(GenRetentionPolicy): + """The retention policy which determines how long the associated data should + persist. + + :param bool enabled: + Indicates whether a retention policy is enabled for the storage service. + The default value is False. + :param int days: + Indicates the number of days that metrics or logging or + soft-deleted data should be retained. All data older than this value will + be deleted. If enabled=True, the number of days must be specified. + """ + + def __init__(self, enabled=False, days=None): + super(RetentionPolicy, self).__init__(enabled=enabled, days=days, allow_permanent_delete=None) + if self.enabled and (self.days is None): + raise ValueError("If policy is enabled, 'days' must be specified.") + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + days=generated.days, + ) + + +class StaticWebsite(GenStaticWebsite): + """The properties that enable an account to host a static website. + + :keyword bool enabled: + Indicates whether this account is hosting a static website. + The default value is `False`. + :keyword str index_document: + The default name of the index page under each directory. + :keyword str error_document404_path: + The absolute path of the custom 404 page. + :keyword str default_index_document_path: + Absolute path of the default index page. + """ + + def __init__(self, **kwargs): + self.enabled = kwargs.get('enabled', False) + if self.enabled: + self.index_document = kwargs.get('index_document') + self.error_document404_path = kwargs.get('error_document404_path') + self.default_index_document_path = kwargs.get('default_index_document_path') + else: + self.index_document = None + self.error_document404_path = None + self.default_index_document_path = None + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + index_document=generated.index_document, + error_document404_path=generated.error_document404_path, + default_index_document_path=generated.default_index_document_path + ) + + +class CorsRule(GenCorsRule): + """CORS is an HTTP feature that enables a web application running under one + domain to access resources in another domain. Web browsers implement a + security restriction known as same-origin policy that prevents a web page + from calling APIs in a different domain; CORS provides a secure way to + allow one domain (the origin domain) to call APIs in another domain. + + :param list(str) allowed_origins: + A list of origin domains that will be allowed via CORS, or "*" to allow + all domains. The list of must contain at least one entry. Limited to 64 + origin domains. Each allowed origin can have up to 256 characters. + :param list(str) allowed_methods: + A list of HTTP methods that are allowed to be executed by the origin. + The list of must contain at least one entry. For Azure Storage, + permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT. + :keyword list(str) allowed_headers: + Defaults to an empty list. A list of headers allowed to be part of + the cross-origin request. Limited to 64 defined headers and 2 prefixed + headers. Each header can be up to 256 characters. + :keyword list(str) exposed_headers: + Defaults to an empty list. A list of response headers to expose to CORS + clients. Limited to 64 defined headers and two prefixed headers. Each + header can be up to 256 characters. + :keyword int max_age_in_seconds: + The number of seconds that the client/browser should cache a + preflight response. + """ + + def __init__(self, allowed_origins, allowed_methods, **kwargs): + self.allowed_origins = ','.join(allowed_origins) + self.allowed_methods = ','.join(allowed_methods) + self.allowed_headers = ','.join(kwargs.get('allowed_headers', [])) + self.exposed_headers = ','.join(kwargs.get('exposed_headers', [])) + self.max_age_in_seconds = kwargs.get('max_age_in_seconds', 0) + + @classmethod + def _from_generated(cls, generated): + return cls( + [generated.allowed_origins], + [generated.allowed_methods], + allowed_headers=[generated.allowed_headers], + exposed_headers=[generated.exposed_headers], + max_age_in_seconds=generated.max_age_in_seconds, + ) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py index fcc7c715dfa2..5482fde25067 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py @@ -213,6 +213,7 @@ def _delete_path_options(**kwargs): 'recursive': True, 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions, + 'cls': return_response_headers, 'timeout': kwargs.pop('timeout', None)} options.update(kwargs) return options diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py index 5df2f5c9a625..be60b3878f66 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py @@ -80,7 +80,7 @@ def return_headers_and_deserialized(response, deserialized, response_headers): def return_context_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument - return response.location_mode, deserialized + return response.http_response.location_mode, deserialized def process_storage_error(storage_error): diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py index c545b0a464e6..f8bbc59eb8da 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py @@ -4,13 +4,14 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Any +from typing import Optional, List, Any from azure.core.paging import ItemPaged from azure.core.pipeline import AsyncPipeline from azure.storage.blob.aio import BlobServiceClient from .._generated.aio import AzureDataLakeStorageRESTAPI +from .._deserialize import get_datalake_service_properties from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from ._file_system_client_async import FileSystemClient from .._data_lake_service_client import DataLakeServiceClient as DataLakeServiceClientBase @@ -18,7 +19,8 @@ from ._data_lake_directory_client_async import DataLakeDirectoryClient from ._data_lake_file_client_async import DataLakeFileClient from ._models import FileSystemPropertiesPaged -from .._models import UserDelegationKey, LocationMode +from .._models import UserDelegationKey, LocationMode, AnalyticsLogging, Metrics, CorsRule, \ + RetentionPolicy, StaticWebsite class DataLakeServiceClient(AsyncStorageAccountHostsMixin, DataLakeServiceClientBase): @@ -441,3 +443,80 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + async def set_service_properties( + self, analytics_logging=None, # type: Optional[AnalyticsLogging] + hour_metrics=None, # type: Optional[Metrics] + minute_metrics=None, # type: Optional[Metrics] + cors=None, # type: Optional[List[CorsRule]] + target_version=None, # type: Optional[str] + delete_retention_policy=None, # type: Optional[RetentionPolicy] + static_website=None, # type: Optional[StaticWebsite] + **kwargs + ): + # type: (...) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :param str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :param delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :param static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return await self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, + hour_metrics=hour_metrics, + minute_metrics=minute_metrics, + cors=cors, + target_version=target_version, + delete_retention_policy=delete_retention_policy, + static_website=static_website, + **kwargs) # pylint: disable=protected-access + + async def get_service_properties(self, **kwargs): + # type: (Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = await self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index 108fc1817046..91c954b896f1 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -5,11 +5,12 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method - +import functools from typing import ( # pylint: disable=unused-import Union, Optional, Any, Dict, TYPE_CHECKING ) +from azure.core.exceptions import HttpResponseError from azure.core.tracing.decorator import distributed_trace from azure.core.pipeline import AsyncPipeline @@ -17,6 +18,8 @@ from azure.core.tracing.decorator_async import distributed_trace_async from azure.storage.blob.aio import ContainerClient +from .._deserialize import process_storage_error, is_file_path +from .._generated.models import ListBlobsIncludeItem from ._data_lake_file_client_async import DataLakeFileClient from ._data_lake_directory_client_async import DataLakeDirectoryClient @@ -26,7 +29,9 @@ from .._generated.aio import AzureDataLakeStorageRESTAPI from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from .._shared.policies_async import ExponentialRetry -from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties +from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties, DeletedPathProperties +from ._list_paths_helper import DeletedPathPropertiesPaged + if TYPE_CHECKING: from datetime import datetime @@ -90,6 +95,9 @@ def __init__( _hosts=self._container_client._hosts,# pylint: disable=protected-access **kwargs) # type: ignore # pylint: disable=protected-access self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) self._loop = kwargs.get('loop', None) async def __aexit__(self, *args): @@ -701,6 +709,42 @@ async def delete_file(self, file, # type: Union[FileProperties, str] await file_client.delete_file(**kwargs) return file_client + @distributed_trace_async + async def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the name of the deleted container to restore. + :param str deletion_id: + Specifies the version of the deleted container to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient + or azure.storage.file.datalake.aio.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + + pipeline = AsyncPipeline( + transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = await path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -788,3 +832,37 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function, loop=self._loop) + + @distributed_trace + def get_deleted_paths(self, + name_starts_with=None, # type: Optional[str], + **kwargs): + # type: (...) -> AsyncItemPaged[DeletedPathProperties] + """Returns a generator to list the paths(could be files or directories) under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str name_starts_with: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of PathProperties. + :rtype: + ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return AsyncItemPaged( + command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py new file mode 100644 index 000000000000..58b0cf799c83 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py @@ -0,0 +1,111 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=too-few-public-methods, too-many-instance-attributes +# pylint: disable=super-init-not-called, too-many-lines +from azure.core.exceptions import HttpResponseError +from azure.core.async_paging import AsyncPageIterator, AsyncItemPaged + +from .._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from .._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix + +from .._shared.models import DictMixin +from .._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(AsyncPageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + async def _get_next_cb(self, continuation_token): + try: + return await self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + async def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/swagger/README.md b/sdk/storage/azure-storage-file-datalake/swagger/README.md index 21473ab91013..47cf1a3b4c8c 100644 --- a/sdk/storage/azure-storage-file-datalake/swagger/README.md +++ b/sdk/storage/azure-storage-file-datalake/swagger/README.md @@ -16,7 +16,7 @@ autorest --v3 --python ### Settings ``` yaml -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-02-10/DataLakeStorage.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-06-12/DataLakeStorage.json output-folder: ../azure/storage/filedatalake/_generated namespace: azure.storage.filedatalake no-namespace-folders: true @@ -25,4 +25,14 @@ enable-xml: true vanilla: true clear-output-folder: true python: true +``` + +### Remove x-ms-pageable +Currently breaking the latest version of autorest.python +``` yaml +directive: +- from: swagger-document + where: $["x-ms-paths"]["/{filesystem}?restype=container&comp=list&hierarchy"].get + transform: > + delete $["x-ms-pageable"]; ``` \ No newline at end of file diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..1fb5e9cd683e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 729c5ec3-3b15-11eb-9ec2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:06 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc9118b-001e-0002-7e22-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7427eda6-3b15-11eb-a943-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:09 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc9119b-001e-0002-0422-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..35d7dfd52efe --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + false' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - effd0504-3b15-11eb-8192-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:37 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeaa9-301e-0019-5322-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f0fef9fb-3b15-11eb-ad49-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:38 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeab3-301e-0019-5422-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml new file mode 100644 index 000000000000..d08cfd54f5aa --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0efbba3d-3b16-11eb-91ab-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc91467-001e-0002-6622-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0fbe3818-3b16-11eb-98bd-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc91470-001e-0002-6722-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml new file mode 100644 index 000000000000..e1a232c8d7c0 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b4c21f7e-3b15-11eb-b652-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:29:57 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d48-f01e-0006-0522-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b759c331-3b15-11eb-83de-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:02 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d5c-f01e-0006-0622-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..03b761e3a8ac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + true2' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bb297712-3b15-11eb-904d-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:08 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6dffa-501e-0020-1722-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bd3db8fc-3b15-11eb-9090-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:12 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6e009-501e-0020-1922-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..9ef4605e7ce2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7bc7f418-90e4-11eb-92b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:16 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:20 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c3b37-b01e-004e-6ff1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7ecf48c9-90e4-11eb-aab6-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:21 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c835b-b01e-004e-80f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7eecfdbb-90e4-11eb-8a9c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c85fd-b01e-004e-68f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f078f9f-90e4-11eb-8aa7-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c88d8-b01e-004e-63f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f20830d-90e4-11eb-9a0e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8b63-b01e-004e-38f1-246328000000\nTime:2021-03-29T23:14:22.4739476Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8b63-b01e-004e-38f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f39264f-90e4-11eb-945f-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c8c4b-b01e-004e-37f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f52df63-90e4-11eb-ba7e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8e3f-b01e-004e-3df1-246328000000\nTime:2021-03-29T23:14:22.7931726Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8e3f-b01e-004e-3df1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f698642-90e4-11eb-8c0a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:22 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c9076-b01e-004e-61f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..24562d6fab45 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml @@ -0,0 +1,85 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '237' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0365c238-3b16-11eb-80ed-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:09 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:14 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2b0ba4e1-101e-0021-4922-cf58fa000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 05700bc2-3b16-11eb-bfa8-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:13 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:14 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2b0ba4ef-101e-0021-4a22-cf58fa000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml new file mode 100644 index 000000000000..4f69cca733c9 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - fd342ca3-3b15-11eb-be73-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:59 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fae-301e-0009-6622-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ff7f0ed3-3b15-11eb-ac57-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:03 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fc6-301e-0009-6b22-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..962f4e96e8b4 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml @@ -0,0 +1,85 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '241' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 09246b04-3b16-11eb-866f-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:19 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0975cd25-301e-0026-5622-cf3499000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0acacb9d-3b16-11eb-9417-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:22 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0975cd30-301e-0026-5722-cf3499000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f8112bd067cc --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - eb84d3a1-3b15-11eb-91d5-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5ec-601e-002b-2a22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ec154eb8-3b15-11eb-83fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5f6-601e-002b-2b22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..f02927dae495 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,165 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f83e45bf-3b15-11eb-a7b4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f42-301e-0044-6722-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8ce4139-3b15-11eb-8843-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4b-301e-0044-6822-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8f1cedf-3b15-11eb-800b-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4c-301e-0044-6922-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f919f048-3b15-11eb-a5be-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4e-301e-0044-6a22-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..17b6be66734e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2b702a60-3b29-11eb-8248-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:17 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f55-601e-0014-6a35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2e19cdd4-3b29-11eb-9267-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:21 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f62-601e-0014-6c35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..cdfc6d52c1b2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + false' + headers: + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c58a66e-3b29-11eb-87d4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:12 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56a1-801e-0033-0c36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4d32116c-3b29-11eb-9b17-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:13 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56ac-801e-0033-0d36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml new file mode 100644 index 000000000000..5a9e9e5d720e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65643618-3b29-11eb-93a7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:54 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 0cbd8b49-e01e-0047-6236-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65d59905-3b29-11eb-a3ec-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:55 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0cbd8b52-e01e-0047-6336-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml new file mode 100644 index 000000000000..34270046cbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 39a10d94-3b29-11eb-a3e0-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56a2-901e-0000-2c35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3a0a8d22-3b29-11eb-8570-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56ab-901e-0000-2d35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..bcc584167493 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + true2' + headers: + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3de166a3-3b29-11eb-8840-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:48 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e5f-101e-0031-0d35-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3e4f40cc-3b29-11eb-8857-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:49 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e6f-101e-0031-0e36-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..67249600dbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,266 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cb39e77a-90e4-11eb-be24-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:30 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74caa7ec-c01e-008f-1bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce837ad8-90e4-11eb-81b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0890-c01e-008f-0bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce930b3b-90e4-11eb-9c87-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74cb0b17-c01e-008f-61f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cea473bc-90e4-11eb-aeda-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0dd8-c01e-008f-4af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ceb5f122-90e4-11eb-947a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb106a-c01e-008f-20f1-24c4ca000000\nTime:2021-03-29T23:16:36.0596298Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb106a-c01e-008f-20f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ced91740-90e4-11eb-a356-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb15dd-c01e-008f-6ff1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cee74e3a-90e4-11eb-b89c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb1805-c01e-008f-0af1-24c4ca000000\nTime:2021-03-29T23:16:36.2485211Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb1805-c01e-008f-0af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cef4e47f-90e4-11eb-8aa2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb1a42-c01e-008f-33f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..60af7cbe262d --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Content-Length: + - '237' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5bf31ccc-3b29-11eb-92f1-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:38 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: db63c688-f01e-0029-6f36-cf42f5000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5c60002b-3b29-11eb-b37d-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:39 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: db63c692-f01e-0029-7036-cf42f5000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml new file mode 100644 index 000000000000..a314afd7f16a --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 56586676-3b29-11eb-aad2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:31 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f4860f9-b01e-0028-2436-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5859625e-3b29-11eb-bd70-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:32 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:32 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f486112-b01e-0028-2a36-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..191dc1a05f7c --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Content-Length: + - '241' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5fcc219d-3b29-11eb-af1a-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:45 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:47 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 89f3b107-101e-001e-0a36-cf9059000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 61bdbb7c-3b29-11eb-b710-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:48 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 89f3b115-101e-001e-0b36-cf9059000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f7b9352d25c8 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46cd3bc1-3b29-11eb-9562-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:03 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd4f-201e-0048-4136-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 48cf4185-3b29-11eb-a7fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:06 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd68-201e-0048-4736-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..a13ee293de3f --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,127 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 507611e3-3b29-11eb-babe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:19 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7b1-501e-000f-0836-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5294966f-3b29-11eb-83d6-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7ba-501e-000f-0936-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52b6143b-3b29-11eb-9fa2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bd-501e-000f-0a36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52d33ecf-3b29-11eb-90d7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bf-501e-000f-0b36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..4f726f5075ec --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -0,0 +1,844 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 406ea233-60f2-11eb-8547-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:54 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container + response: + body: + string: '' + headers: + Date: + - Wed, 27 Jan 2021 22:51:54 GMT + ETag: + - '"0x8D8C316254888AC"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c1845de-a01e-002b-01ff-f4e900000000 + x-ms-version: + - '2020-04-08' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 40c48a6e-60f2-11eb-bbf2-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:54 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:55 GMT + ETag: + - '"0x8D8C31625ADEA2E"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb57e-901f-001a-36ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41243fe2-60f2-11eb-b74c-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625BFD64A"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb581-901f-001a-37ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4135a62e-60f2-11eb-af30-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625D0A13E"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb582-901f-001a-38ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41469112-60f2-11eb-81f2-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625E1EE35"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb583-901f-001a-39ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4157e33c-60f2-11eb-a23f-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625F30512"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb584-901f-001a-3aff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4168fa4f-60f2-11eb-b786-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C3162604DE38"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb585-901f-001a-3bff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 417aad88-60f2-11eb-854b-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C3162618ADE2"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb586-901f-001a-3cff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 418e571a-60f2-11eb-86d8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615169967486' + x-ms-request-id: + - 884fb587-901f-001a-3dff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41a6af33-60f2-11eb-866d-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615171454866' + x-ms-request-id: + - 884fb588-901f-001a-3eff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41ba4a9f-60f2-11eb-a71d-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615172749559' + x-ms-request-id: + - 884fb589-901f-001a-3fff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41cdd2b4-60f2-11eb-aa31-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615174072130' + x-ms-request-id: + - 884fb58a-901f-001a-40ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41e1f6e4-60f2-11eb-9760-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615175400480' + x-ms-request-id: + - 884fb58b-901f-001a-41ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41f64313-60f2-11eb-b954-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615176756910' + x-ms-request-id: + - 884fb58c-901f-001a-42ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 420ab5ee-60f2-11eb-9f48-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir1132562615172749559trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184658-a01e-002b-67ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4227658e-60f2-11eb-836a-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?prefix=dir3%2F&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184660-a01e-002b-6fff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 423a7878-60f2-11eb-ba86-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?maxResults=2&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2dir1132562615172749559trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT32!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184663-a01e-002b-72ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4259e721-60f2-11eb-93da-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?marker=2%21252%21MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-4dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c18466a-a01e-002b-78ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..cde1fb719f4b --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,288 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0b4cc4a6-96fb-11eb-96f3-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:53 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:53 GMT + ETag: + - '"0x8D8F91EEFE08F2A"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0e483e20-e01e-0098-1107-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0bbbbba2-96fb-11eb-a4b1-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:54 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 352a134d-a01f-006d-2407-2bf9eb000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0c2cb5b8-96fb-11eb-8594-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132622026556759923' + x-ms-request-id: + - 352a134e-a01f-006d-2507-2bf9eb000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0ca24d8b-96fb-11eb-a718-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 0e48407d-e01e-0098-0307-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0cba7db5-96fb-11eb-a7cf-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-undelete-source: + - dir10?deletionid=132622026556759923 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-request-id: + - 0e4840aa-e01e-0098-2607-2b6dc1000000 + x-ms-resource-type: + - directory + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0d03eeec-96fb-11eb-aed8-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:56 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-meta-hdi_isfolder: + - 'true' + x-ms-owner: + - $superuser + x-ms-permissions: + - rwxr-x--- + x-ms-request-id: + - 0e48411c-e01e-0098-0707-2b6dc1000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..012e76897d30 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -0,0 +1,286 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c925c631-96fb-11eb-ad8c-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:12 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:12 GMT + ETag: + - '"0x8D8F91FADB2F1B4"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7b2cf78f-601e-0062-5508-2b8f87000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c98985b8-96fb-11eb-9ffe-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:12 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:12 GMT + ETag: + - '"0x8D8F91FAE28BFD9"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 036ccca5-d01f-0058-0608-2b95ff000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c9fbf927-96fb-11eb-a9fe-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132622029736513453' + x-ms-request-id: + - 036ccca7-d01f-0058-0708-2b95ff000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca2b7499-96fb-11eb-84c6-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 7b2cf83d-601e-0062-6408-2b8f87000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca451c7d-96fb-11eb-98f9-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132622029736513453 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-request-id: + - 7b2cf85e-601e-0062-0208-2b8f87000000 + x-ms-resource-type: + - file + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca7281ac-96fb-11eb-8757-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + ETag: + - '"0x8D8F91FAE28BFD9"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-owner: + - $superuser + x-ms-permissions: + - rw-r----- + x-ms-request-id: + - 7b2cf8a5-601e-0062-3f08-2b8f87000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..564e1899ad69 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -0,0 +1,612 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4b555935-60f2-11eb-bc47-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:12 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container + response: + body: + string: '' + headers: + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C316300AAB7E"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d23c-201e-0004-3bff-f46504000000 + x-ms-version: '2020-04-08' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4b86e88f-60f2-11eb-8bd8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C316303C8258"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7385-a01f-002b-39ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bb2a2d7-60f2-11eb-98f6-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C3163046B9F2"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7388-a01f-002b-3aff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bbcb4e0-60f2-11eb-becd-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C31630504E73"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7389-a01f-002b-3bff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bc637f5-60f2-11eb-b75c-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C3163059D058"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738a-a01f-002b-3cff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bcfac24-60f2-11eb-9c90-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C31630634D0A"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738b-a01f-002b-3dff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bd921f7-60f2-11eb-8cdf-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C316306D4F4E"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738c-a01f-002b-3eff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4be33413-60f2-11eb-8954-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C3163078186E"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738d-a01f-002b-3fff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bedbb55-60f2-11eb-977a-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615343457964' + x-ms-request-id: 0dcf738e-a01f-002b-40ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bfa6593-60f2-11eb-9336-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615344219694' + x-ms-request-id: 0dcf738f-a01f-002b-41ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c067444-60f2-11eb-81e5-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615345014937' + x-ms-request-id: 0dcf7390-a01f-002b-42ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c12339b-60f2-11eb-8927-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615345790096' + x-ms-request-id: 0dcf7391-a01f-002b-43ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c1e4147-60f2-11eb-9cea-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615346636843' + x-ms-request-id: 0dcf7392-a01f-002b-44ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c2aeb85-60f2-11eb-80e8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615347463522' + x-ms-request-id: 0dcf7393-a01f-002b-45ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c3780ef-60f2-11eb-b9b4-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir1132562615345014937trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d24f-201e-0004-4aff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c4a9e91-60f2-11eb-8d48-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d250-201e-0004-4bff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c548bd6-60f2-11eb-9fcd-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2dir1132562615345014937trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT32!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d254-201e-0004-4eff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c669132-60f2-11eb-88ef-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-4dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d255-201e-0004-4fff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..63537346b811 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,205 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 778aae3a-96fc-11eb-b381-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:04 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205BF6672C"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 2409aea0-f01e-0002-7309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.blob.core.windows.net/fs95ee172e?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 77d37713-96fc-11eb-bb22-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: bb03cba3-b01f-0071-0109-2bab8b000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 781d9f73-96fc-11eb-ad5d-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132622032658022074' + x-ms-request-id: bb03cba4-b01f-0071-0209-2bab8b000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 784f84d5-96fc-11eb-95d9-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 2409b039-f01e-0002-5309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 785cf27c-96fc-11eb-a11b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-undelete-source: + - dir10?deletionid=132622032658022074 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-request-id: b6ad0801-d01e-0015-3709-2b5a13000000 + x-ms-resource-type: directory + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 78b191b7-96fc-11eb-9a2b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Tue, 06 Apr 2021 17:21:06 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-meta-hdi_isfolder: 'true' + x-ms-owner: $superuser + x-ms-permissions: rwxr-x--- + x-ms-request-id: b6ad0824-d01e-0015-4f09-2b5a13000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..0b0a5d4d345b --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -0,0 +1,204 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a5e8fe97-96fc-11eb-b4c0-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:22 GMT + ETag: '"0x8D8F9208A5A7384"' + Last-Modified: Tue, 06 Apr 2021 17:22:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 6ef07b94-001e-004b-3d09-2bb1f3000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.blob.core.windows.net/fsace1178f?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6438765-96fc-11eb-bb73-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:23 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:23 GMT + ETag: '"0x8D8F9208ABC9A66"' + Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 67afbb3f-101f-0078-2c09-2bee58000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6906ac2-96fc-11eb-97b3-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:23 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132622033439312883' + x-ms-request-id: 67afbb40-101f-0078-2d09-2bee58000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6e27d5a-96fc-11eb-9984-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 6ef07bf9-001e-004b-0b09-2bb1f3000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6f0e3c0-96fc-11eb-ac2f-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132622033439312883 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:24 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT + x-ms-request-id: 3c8993bd-d01e-0083-5309-2b53c2000000 + x-ms-resource-type: file + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a7641616-96fc-11eb-937b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Tue, 06 Apr 2021 17:22:24 GMT + ETag: '"0x8D8F9208ABC9A66"' + Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-owner: $superuser + x-ms-permissions: rw-r----- + x-ms-request-id: 3c899409-d01e-0083-1009-2b53c2000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py new file mode 100644 index 000000000000..349132d475d8 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -0,0 +1,309 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest + +from msrest.exceptions import ValidationError + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake import DataLakeServiceClient +from testcase import ( + StorageTestCase, + record, +) + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def setUp(self): + super(DatalakeServiceTest, self).setUp() + url = self._get_account_url() + self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + self.config = self.dsc._config + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + @record + def test_datalake_service_properties(self): + # Act + resp = self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + self.assertIsNone(resp) + props = self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @record + def test_empty_set_service_properties_exception(self): + with self.assertRaises(ValueError): + self.dsc.set_service_properties() + + @record + def test_set_default_service_version(self): + # Act + self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @record + def test_set_delete_retention_policy(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy_edge_cases(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_static_website_properties(self): + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @record + def test_disabled_static_website_properties(self): + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @record + def test_set_static_website_props_dont_impact_other_props(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_logging(self): + logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @record + def test_set_hour_metrics(self): + hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @record + def test_set_minute_metrics(self): + minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @record + def test_set_cors(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py new file mode 100644 index 000000000000..c0c9163ad17d --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -0,0 +1,359 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import asyncio +import unittest + +from msrest.exceptions import ValidationError + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake.aio import DataLakeServiceClient +from testcase import ( + StorageTestCase, + record, +) + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def setUp(self): + super(DatalakeServiceTest, self).setUp() + url = self._get_account_url() + self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + self.config = self.dsc._config + loop = asyncio.get_event_loop() + loop.run_until_complete(self.dsc.__aenter__()) + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + async def _test_datalake_service_properties(self): + # Act + await self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + props = await self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @record + def test_datalake_service_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_datalake_service_properties()) + + async def _test_empty_set_service_properties_exception(self): + with self.assertRaises(ValueError): + await self.dsc.set_service_properties() + + @record + def test_empty_set_service_properties_exception(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_empty_set_service_properties_exception()) + + async def _test_set_default_service_version(self): + # Act + await self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = await self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @record + def test_set_default_service_version(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_default_service_version()) + + async def _test_set_delete_retention_policy(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_delete_retention_policy()) + + async def _test_set_delete_retention_policy_edge_cases(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy_edge_cases(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_delete_retention_policy_edge_cases()) + + async def _test_set_static_website_properties(self): + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @record + def test_set_static_website_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_static_website_properties()) + + async def _test_disabled_static_website_properties(self): + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @record + def test_disabled_static_website_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_disabled_static_website_properties()) + + async def _test_set_static_website_props_dont_impact_other_props(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + await self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + await self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_static_website_props_dont_impact_other_props(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_static_website_props_dont_impact_other_props()) + + async def _test_set_logging(self): + logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @record + def test_set_logging(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_logging()) + + async def _test_set_hour_metrics(self): + hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @record + def test_set_hour_metrics(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_hour_metrics()) + + async def _test_set_minute_metrics(self): + minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @record + def test_set_minute_metrics(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_minute_metrics()) + + async def _test_set_cors(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + await self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_cors(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_cors()) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py index 0c11ff283ae5..cb6af942a250 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py @@ -182,9 +182,7 @@ def test_delete_directory(self): directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) directory_client.create_directory(metadata=metadata) - response = directory_client.delete_directory() - # Assert - self.assertIsNone(response) + directory_client.delete_directory() @record def test_delete_directory_with_if_modified_since(self): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py index 146025b3da37..41eccf3aed16 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py @@ -232,9 +232,7 @@ async def _test_delete_directory(self): directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) await directory_client.create_directory(metadata=metadata) - response = await directory_client.delete_directory() - # Assert - self.assertIsNone(response) + await directory_client.delete_directory() @record def test_delete_directory_async(self): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index 93e79c1c9e97..b7f26dace2ab 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -23,6 +23,8 @@ # ------------------------------------------------------------------------------ from azure.storage.filedatalake import AccessPolicy, FileSystemSasPermissions +from azure.storage.filedatalake._list_paths_helper import DirectoryPrefix +from azure.storage.filedatalake._models import DeletedPathProperties TEST_FILE_SYSTEM_PREFIX = 'filesystem' # ------------------------------------------------------------------------------ @@ -396,6 +398,47 @@ def test_list_paths(self): self.assertEqual(len(paths), 6) self.assertTrue(isinstance(paths[0].last_modified, datetime)) + @record + def test_get_deleted_paths(self): + # Arrange + file_system = self._create_file_system() + file0 = file_system.create_file("file0") + file1 = file_system.create_file("file1") + + dir1 = file_system.create_directory("dir1") + dir2 = file_system.create_directory("dir2") + dir3 = file_system.create_directory("dir3") + file_in_dir3 = dir3.create_file("file_in_dir3") + file_in_subdir = dir3.create_file("subdir/file_in_subdir") + + file0.delete_file() + file1.delete_file() + dir1.delete_directory() + dir2.delete_directory() + file_in_dir3.delete_file() + file_in_subdir.delete_file() + deleted_paths = list(file_system.get_deleted_paths()) + dir3_paths = list(file_system.get_deleted_paths(name_starts_with="dir3/")) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths1 = list(next(paths_generator1)) + + paths_generator2 = file_system.get_deleted_paths(max_results=4).by_page( + continuation_token=paths_generator1.continuation_token) + paths2 = list(next(paths_generator2)) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + @record def test_list_paths_which_are_all_files(self): # Arrange @@ -530,7 +573,33 @@ def test_file_system_sessions_closes_properly(self): f_client.create_directory() with fs_client.get_directory_client("file2") as f_client: f_client.create_directory() + @record + def test_undelete_dir_with_version_id(self): + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs") + dir_path = 'dir10' + dir_client = file_system_client.create_directory(dir_path) + resp = dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = file_system_client.undelete_path(dir_path, resp['deletion_id']) + resp = restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + @record + def test_undelete_file_with_version_id(self): + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs1") + file_path = 'dir10/fileŇ' + dir_client = file_system_client.create_file(file_path) + resp = dir_client.delete_file() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = file_system_client.undelete_path(file_path, resp['deletion_id']) + resp = restored_file_client.get_file_properties() + self.assertIsNotNone(resp) # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index 42520ffd64a5..937e05e4c5ab 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -17,8 +17,8 @@ from azure.core.pipeline.transport import AioHttpTransport from multidict import CIMultiDict, CIMultiDictProxy -from azure.storage.filedatalake import AccessPolicy, generate_directory_sas, DirectorySasPermissions, \ - generate_file_system_sas, generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import AccessPolicy, DirectorySasPermissions, generate_file_system_sas from azure.storage.filedatalake.aio import DataLakeServiceClient, DataLakeDirectoryClient, FileSystemClient from azure.storage.filedatalake import PublicAccess from testcase import ( @@ -635,6 +635,59 @@ def test_list_paths_pages_correctly(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_list_paths_pages_correctly()) + async def _test_get_deleted_paths(self): + # Arrange + file_system = await self._create_file_system() + file0 = await file_system.create_file("file0") + file1 = await file_system.create_file("file1") + + dir1 = await file_system.create_directory("dir1") + dir2 = await file_system.create_directory("dir2") + dir3 = await file_system.create_directory("dir3") + file_in_dir3 = await dir3.create_file("file_in_dir3") + file_in_subdir = await dir3.create_file("subdir/file_in_subdir") + + await file0.delete_file() + await file1.delete_file() + await dir1.delete_directory() + await dir2.delete_directory() + await file_in_dir3.delete_file() + await file_in_subdir.delete_file() + deleted_paths = [] + async for path in file_system.get_deleted_paths(): + deleted_paths.append(path) + dir3_paths = [] + async for path in file_system.get_deleted_paths(name_starts_with="dir3/"): + dir3_paths.append(path) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths1 = [] + async for path in await paths_generator1.__anext__(): + paths1.append(path) + + paths_generator2 = file_system.get_deleted_paths(max_results=4) \ + .by_page(continuation_token=paths_generator1.continuation_token) + paths2 = [] + async for path in await paths_generator2.__anext__(): + paths2.append(path) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + + @record + def test_get_deleted_paths(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_get_deleted_paths()) + async def _test_create_directory_from_file_system_client_async(self): # Arrange file_system = await self._create_file_system() @@ -776,6 +829,41 @@ def test_file_system_sessions_closes_properly_async(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_file_system_sessions_closes_properly_async()) + async def _test_undelete_dir_with_version_id(self): + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + dir_path = 'dir10' + dir_client = await file_system_client.create_directory(dir_path) + resp = await dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = await file_system_client.undelete_path(dir_path, resp['deletion_id']) + resp = await restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + + @record + def test_undelete_dir_with_version_id(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_undelete_dir_with_version_id()) + + async def _test_undelete_file_with_version_id(self): + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + file_path = 'dir10/fileŇ' + dir_client = await file_system_client.create_file(file_path) + resp = await dir_client.delete_file() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = await file_system_client.undelete_path(file_path, resp['deletion_id']) + resp = await restored_file_client.get_file_properties() + self.assertIsNotNone(resp) + + @record + def test_undelete_file_with_version_id(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_undelete_file_with_version_id()) # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() From f63acf78a683229c4ce93740a3b51d96f71a2133 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Thu, 8 Apr 2021 22:05:11 -0700 Subject: [PATCH 04/22] reran tests --- ...st_file_system.test_get_deleted_paths.yaml | 844 ------------------ ...em.test_undelete_file_with_version_id.yaml | 286 ------ ...e_system_async.test_get_deleted_paths.yaml | 612 ------------- ...nc.test_undelete_file_with_version_id.yaml | 204 ----- 4 files changed, 1946 deletions(-) delete mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml delete mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml delete mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml delete mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml deleted file mode 100644 index 4f726f5075ec..000000000000 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml +++ /dev/null @@ -1,844 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 406ea233-60f2-11eb-8547-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:54 GMT - x-ms-version: - - '2020-04-08' - method: PUT - uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container - response: - body: - string: '' - headers: - Date: - - Wed, 27 Jan 2021 22:51:54 GMT - ETag: - - '"0x8D8C316254888AC"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:55 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - x-ms-request-id: - - 3c1845de-a01e-002b-01ff-f4e900000000 - x-ms-version: - - '2020-04-08' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 40c48a6e-60f2-11eb-bbf2-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:54 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:55 GMT - ETag: - - '"0x8D8C31625ADEA2E"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb57e-901f-001a-36ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41243fe2-60f2-11eb-b74c-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C31625BFD64A"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb581-901f-001a-37ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4135a62e-60f2-11eb-af30-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C31625D0A13E"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb582-901f-001a-38ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41469112-60f2-11eb-81f2-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C31625E1EE35"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb583-901f-001a-39ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4157e33c-60f2-11eb-a23f-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C31625F30512"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb584-901f-001a-3aff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4168fa4f-60f2-11eb-b786-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C3162604DE38"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb585-901f-001a-3bff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 417aad88-60f2-11eb-854b-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - ETag: - - '"0x8D8C3162618ADE2"' - Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 884fb586-901f-001a-3cff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 418e571a-60f2-11eb-86d8-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615169967486' - x-ms-request-id: - - 884fb587-901f-001a-3dff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41a6af33-60f2-11eb-866d-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:56 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615171454866' - x-ms-request-id: - - 884fb588-901f-001a-3eff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41ba4a9f-60f2-11eb-a71d-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615172749559' - x-ms-request-id: - - 884fb589-901f-001a-3fff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41cdd2b4-60f2-11eb-aa31-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615174072130' - x-ms-request-id: - - 884fb58a-901f-001a-40ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41e1f6e4-60f2-11eb-9760-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615175400480' - x-ms-request-id: - - 884fb58b-901f-001a-41ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - '*/*' - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 41f64313-60f2-11eb-b954-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132562615176756910' - x-ms-request-id: - - 884fb58c-901f-001a-42ff-f4c21d000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 420ab5ee-60f2-11eb-9f48-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFFdir1132562615172749559trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3" - headers: - Content-Type: - - application/xml - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - x-ms-request-id: - - 3c184658-a01e-002b-67ff-f4e900000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4227658e-60f2-11eb-836a-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?prefix=dir3%2F&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFFdir3/dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3" - headers: - Content-Type: - - application/xml - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - x-ms-request-id: - - 3c184660-a01e-002b-6fff-f4e900000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 423a7878-60f2-11eb-ba86-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?maxResults=2&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFF2dir1132562615172749559trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT32!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-" - headers: - Content-Type: - - application/xml - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - x-ms-request-id: - - 3c184663-a01e-002b-72ff-f4e900000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4259e721-60f2-11eb-93da-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?marker=2%21252%21MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-&maxResults=4&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFF2!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-4dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3" - headers: - Content-Type: - - application/xml - Date: - - Wed, 27 Jan 2021 22:51:57 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - x-ms-request-id: - - 3c18466a-a01e-002b-78ff-f4e900000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml deleted file mode 100644 index 012e76897d30..000000000000 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml +++ /dev/null @@ -1,286 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - application/xml - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - c925c631-96fb-11eb-ad8c-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:12 GMT - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Tue, 06 Apr 2021 17:16:12 GMT - ETag: - - '"0x8D8F91FADB2F1B4"' - Last-Modified: - - Tue, 06 Apr 2021 17:16:12 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 7b2cf78f-601e-0062-5508-2b8f87000000 - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - c98985b8-96fb-11eb-9ffe-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:12 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Tue, 06 Apr 2021 17:16:12 GMT - ETag: - - '"0x8D8F91FAE28BFD9"' - Last-Modified: - - Tue, 06 Apr 2021 17:16:13 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: - - 036ccca5-d01f-0058-0608-2b95ff000000 - x-ms-request-server-encrypted: - - 'true' - x-ms-version: - - '2020-06-12' - status: - code: 201 - message: Created -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - c9fbf927-96fb-11eb-a9fe-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?recursive=true - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Tue, 06 Apr 2021 17:16:13 GMT - Server: - - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: - - 'false' - x-ms-deletion-id: - - '132622029736513453' - x-ms-request-id: - - 036ccca7-d01f-0058-0708-2b95ff000000 - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/xml - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - ca2b7499-96fb-11eb-84c6-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT - x-ms-encryption-algorithm: - - AES256 - x-ms-version: - - '2020-06-12' - method: HEAD - uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 - response: - body: - string: '' - headers: - Date: - - Tue, 06 Apr 2021 17:16:13 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked - Vary: - - Origin - x-ms-error-code: - - BlobNotFound - x-ms-request-id: - - 7b2cf83d-601e-0062-6408-2b8f87000000 - x-ms-version: - - '2020-06-12' - status: - code: 404 - message: The specified blob does not exist. -- request: - body: null - headers: - Accept: - - application/json - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - Content-Length: - - '0' - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - ca451c7d-96fb-11eb-98f9-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT - x-ms-undelete-source: - - dir10/file%C5%87?deletionid=132622029736513453 - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete - response: - body: - string: '' - headers: - Content-Length: - - '0' - Date: - - Tue, 06 Apr 2021 17:16:13 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-creation-time: - - Tue, 06 Apr 2021 17:16:13 GMT - x-ms-request-id: - - 7b2cf85e-601e-0062-0208-2b8f87000000 - x-ms-resource-type: - - file - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -- request: - body: null - headers: - Accept: - - application/xml - Accept-Encoding: - - gzip, deflate - Connection: - - keep-alive - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - ca7281ac-96fb-11eb-8757-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:16:14 GMT - x-ms-encryption-algorithm: - - AES256 - x-ms-version: - - '2020-06-12' - method: HEAD - uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 - response: - body: - string: '' - headers: - Accept-Ranges: - - bytes - Content-Length: - - '0' - Content-Type: - - application/octet-stream - Date: - - Tue, 06 Apr 2021 17:16:13 GMT - ETag: - - '"0x8D8F91FAE28BFD9"' - Last-Modified: - - Tue, 06 Apr 2021 17:16:13 GMT - Server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Vary: - - Origin - x-ms-access-tier: - - Hot - x-ms-access-tier-inferred: - - 'true' - x-ms-blob-type: - - BlockBlob - x-ms-creation-time: - - Tue, 06 Apr 2021 17:16:13 GMT - x-ms-group: - - $superuser - x-ms-lease-state: - - available - x-ms-lease-status: - - unlocked - x-ms-owner: - - $superuser - x-ms-permissions: - - rw-r----- - x-ms-request-id: - - 7b2cf8a5-601e-0062-3f08-2b8f87000000 - x-ms-server-encrypted: - - 'true' - x-ms-version: - - '2020-06-12' - status: - code: 200 - message: OK -version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml deleted file mode 100644 index 564e1899ad69..000000000000 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml +++ /dev/null @@ -1,612 +0,0 @@ -interactions: -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4b555935-60f2-11eb-bc47-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:12 GMT - x-ms-version: - - '2020-04-08' - method: PUT - uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container - response: - body: - string: '' - headers: - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C316300AAB7E"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d23c-201e-0004-3bff-f46504000000 - x-ms-version: '2020-04-08' - status: - code: 201 - message: Created - url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4b86e88f-60f2-11eb-8bd8-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C316303C8258"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7385-a01f-002b-39ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bb2a2d7-60f2-11eb-98f6-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C3163046B9F2"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7388-a01f-002b-3aff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bbcb4e0-60f2-11eb-becd-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C31630504E73"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7389-a01f-002b-3bff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bc637f5-60f2-11eb-b75c-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C3163059D058"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738a-a01f-002b-3cff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bcfac24-60f2-11eb-9c90-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C31630634D0A"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738b-a01f-002b-3dff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bd921f7-60f2-11eb-8cdf-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C316306D4F4E"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738c-a01f-002b-3eff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4be33413-60f2-11eb-8954-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C3163078186E"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738d-a01f-002b-3fff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bedbb55-60f2-11eb-977a-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615343457964' - x-ms-request-id: 0dcf738e-a01f-002b-40ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4bfa6593-60f2-11eb-9336-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615344219694' - x-ms-request-id: 0dcf738f-a01f-002b-41ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c067444-60f2-11eb-81e5-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615345014937' - x-ms-request-id: 0dcf7390-a01f-002b-42ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c12339b-60f2-11eb-8927-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615345790096' - x-ms-request-id: 0dcf7391-a01f-002b-43ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c1e4147-60f2-11eb-9cea-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615346636843' - x-ms-request-id: 0dcf7392-a01f-002b-44ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true -- request: - body: null - headers: - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c2aeb85-60f2-11eb-80e8-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615347463522' - x-ms-request-id: 0dcf7393-a01f-002b-45ff-f4e900000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c3780ef-60f2-11eb-b9b4-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFFdir1132562615345014937trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3" - headers: - Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d24f-201e-0004-4aff-f46504000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c4a9e91-60f2-11eb-8d48-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFFdir3/dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3" - headers: - Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d250-201e-0004-4bff-f46504000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c548bd6-60f2-11eb-9fcd-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFF2dir1132562615345014937trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT32!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-" - headers: - Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d254-201e-0004-4eff-f46504000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - 4c669132-60f2-11eb-88ef-c8348e5fffbf - x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT - x-ms-version: - - '2020-06-12' - method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list - response: - body: - string: "\uFEFF2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-4dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3" - headers: - Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d255-201e-0004-4fff-f46504000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list -version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml deleted file mode 100644 index 0b0a5d4d345b..000000000000 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml +++ /dev/null @@ -1,204 +0,0 @@ -interactions: -- request: - body: null - headers: - Accept: - - application/xml - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a5e8fe97-96fc-11eb-b4c0-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:22 GMT - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:22 GMT - ETag: '"0x8D8F9208A5A7384"' - Last-Modified: Tue, 06 Apr 2021 17:22:22 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 6ef07b94-001e-004b-3d09-2bb1f3000000 - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://seannsecanary.blob.core.windows.net/fsace1178f?restype=container -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a6438765-96fc-11eb-bb73-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:23 GMT - x-ms-properties: - - '' - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:23 GMT - ETag: '"0x8D8F9208ABC9A66"' - Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 67afbb3f-101f-0078-2c09-2bee58000000 - x-ms-request-server-encrypted: 'true' - x-ms-version: '2020-06-12' - status: - code: 201 - message: Created - url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a6906ac2-96fc-11eb-97b3-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:23 GMT - x-ms-version: - - '2020-06-12' - method: DELETE - uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:23 GMT - Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132622033439312883' - x-ms-request-id: 67afbb40-101f-0078-2d09-2bee58000000 - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true -- request: - body: null - headers: - Accept: - - application/xml - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a6e27d5a-96fc-11eb-9984-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT - x-ms-encryption-algorithm: - - AES256 - x-ms-version: - - '2020-06-12' - method: HEAD - uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 - response: - body: - string: '' - headers: - Date: Tue, 06 Apr 2021 17:22:23 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - Vary: Origin - x-ms-error-code: BlobNotFound - x-ms-request-id: 6ef07bf9-001e-004b-0b09-2bb1f3000000 - x-ms-version: '2020-06-12' - status: - code: 404 - message: The specified blob does not exist. - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 -- request: - body: null - headers: - Accept: - - application/json - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a6f0e3c0-96fc-11eb-ac2f-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT - x-ms-undelete-source: - - dir10/file%C5%87?deletionid=132622033439312883 - x-ms-version: - - '2020-06-12' - method: PUT - uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete - response: - body: - string: '' - headers: - Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:24 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT - x-ms-request-id: 3c8993bd-d01e-0083-5309-2b53c2000000 - x-ms-resource-type: file - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete -- request: - body: null - headers: - Accept: - - application/xml - User-Agent: - - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) - x-ms-client-request-id: - - a7641616-96fc-11eb-937b-c8348e5fffbf - x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT - x-ms-encryption-algorithm: - - AES256 - x-ms-version: - - '2020-06-12' - method: HEAD - uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 - response: - body: - string: '' - headers: - Accept-Ranges: bytes - Content-Length: '0' - Content-Type: application/octet-stream - Date: Tue, 06 Apr 2021 17:22:24 GMT - ETag: '"0x8D8F9208ABC9A66"' - Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT - Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Vary: Origin - x-ms-access-tier: Hot - x-ms-access-tier-inferred: 'true' - x-ms-blob-type: BlockBlob - x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT - x-ms-group: $superuser - x-ms-lease-state: available - x-ms-lease-status: unlocked - x-ms-owner: $superuser - x-ms-permissions: rw-r----- - x-ms-request-id: 3c899409-d01e-0083-1009-2b53c2000000 - x-ms-server-encrypted: 'true' - x-ms-version: '2020-06-12' - status: - code: 200 - message: OK - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 -version: 1 From 212251d783080eb47058e48d066ac884566a5da7 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Thu, 8 Apr 2021 22:06:07 -0700 Subject: [PATCH 05/22] reran tests --- ...st_file_system.test_get_deleted_paths.yaml | 866 ++++++++++++++++++ ...em.test_undelete_file_with_version_id.yaml | 286 ++++++ ...e_system_async.test_get_deleted_paths.yaml | 651 +++++++++++++ ...nc.test_undelete_file_with_version_id.yaml | 204 +++++ 4 files changed, 2007 insertions(+) create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..22256e1ba770 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -0,0 +1,866 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 457ffd25-98f0-11eb-9fc4-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:49 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A02C1AD"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:49 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - b52dee7e-101e-009c-0afd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 45d4da20-98f0-11eb-afc7-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:49 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A5A5964"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b746f-101f-0078-37fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 462a2bb0-98f0-11eb-9d86-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:49 GMT + ETag: + - '"0x8D8FB142A72A2E9"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7472-101f-0078-39fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 464282da-98f0-11eb-9c07-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142A8C7CE5"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7473-101f-0078-3afd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 465c2557-98f0-11eb-92ef-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AA2FDB0"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7474-101f-0078-3bfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4672e1bc-98f0-11eb-b0af-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142ABAEC16"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7475-101f-0078-3cfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 468a6276-98f0-11eb-9b56-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AD2BBC1"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:50 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7476-101f-0078-3dfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46a2a43b-98f0-11eb-a4be-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:50 GMT + ETag: + - '"0x8D8FB142AED8B91"' + Last-Modified: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fe4b7477-101f-0078-3efd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46bce3aa-98f0-11eb-bf33-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179314769963' + x-ms-request-id: + - fe4b7478-101f-0078-3ffd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46fafd7d-98f0-11eb-bf7b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179316566740' + x-ms-request-id: + - fe4b7479-101f-0078-40fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47228501-98f0-11eb-b30e-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:51 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179319150091' + x-ms-request-id: + - fe4b747a-101f-0078-41fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 474350f0-98f0-11eb-a754-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:51 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179321356419' + x-ms-request-id: + - fe4b747b-101f-0078-42fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4766de88-98f0-11eb-8ce6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179324953375' + x-ms-request-id: + - fe4b747d-101f-0078-43fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4797b48c-98f0-11eb-b1e5-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624179328345615' + x-ms-request-id: + - fe4b747e-101f-0078-44fd-2cee58000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47ca0d47-98f0-11eb-9707-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:52 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&showonly=deleted + response: + body: + string: "\uFEFFdir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df022-101e-009c-72fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 47f11ece-98f0-11eb-8583-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&prefix=dir3%2F&showonly=deleted + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df043-101e-009c-0ffd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 480765c7-98f0-11eb-8bf6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&maxResults=2&showonly=deleted + response: + body: + string: "\uFEFF2dir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT42!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df058-101e-009c-22fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 482a7ccc-98f0-11eb-ba28-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:58:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&marker=2%21248%21MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--&maxResults=4&showonly=deleted + response: + body: + string: "\uFEFF2!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" + headers: + Content-Type: + - application/xml + Date: + - Fri, 09 Apr 2021 04:58:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - b52df06e-101e-009c-36fd-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..920144044b53 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -0,0 +1,286 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 22edf54b-98f0-11eb-b813-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:51 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:51 GMT + ETag: + - '"0x8D8FB140784D2B9"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:51 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5a438fc7-b01e-003c-6efc-2c6467000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 235ac06a-98f0-11eb-a682-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:51 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + ETag: + - '"0x8D8FB1407FD32D0"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - d806c18e-101f-009c-29fc-2ce0c6000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 23cc6ec8-98f0-11eb-acac-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132624178727549652' + x-ms-request-id: + - d806c18f-101f-009c-2afc-2ce0c6000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 23fa5cb0-98f0-11eb-b2c8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 5a43929f-b01e-003c-16fc-2c6467000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 241229e1-98f0-11eb-9ef6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132624178727549652 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-request-id: + - 5a439303-b01e-003c-51fc-2c6467000000 + x-ms-resource-type: + - file + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2438c4bb-98f0-11eb-80b5-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:57:53 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Fri, 09 Apr 2021 04:57:52 GMT + ETag: + - '"0x8D8FB1407FD32D0"' + Last-Modified: + - Fri, 09 Apr 2021 04:57:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:57:52 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-owner: + - $superuser + x-ms-permissions: + - rw-r----- + x-ms-request-id: + - 5a439389-b01e-003c-20fc-2c6467000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..20015d5895c7 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -0,0 +1,651 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65f0c226-98f0-11eb-aa01-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:43 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144A5B1290"' + Last-Modified: Fri, 09 Apr 2021 04:59:43 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0e6d5285-301e-0040-04fd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 662ce0fb-98f0-11eb-8215-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:43 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AAA44AB"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c881-a01f-000f-53fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 667a2c76-98f0-11eb-9627-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AB9BF70"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c884-a01f-000f-56fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66898e41-98f0-11eb-a713-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AC81FE4"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c885-a01f-000f-57fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6697d38e-98f0-11eb-b5cc-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AD659D9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c886-a01f-000f-58fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66a618df-98f0-11eb-a9fc-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AE4E3A9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c887-a01f-000f-59fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66b4b5fb-98f0-11eb-995e-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AF4B2F5"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c888-a01f-000f-5afd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66c49340-98f0-11eb-b1d8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144B0738B7"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: f659c889-a01f-000f-5bfd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66d77f1e-98f0-11eb-b8bb-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:44 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179854239734' + x-ms-request-id: f659c88a-a01f-000f-5cfd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67229b2e-98f0-11eb-90b2-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:44 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179855451954' + x-ms-request-id: f659c88c-a01f-000f-5dfd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67349e3d-98f0-11eb-b7db-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179856631159' + x-ms-request-id: f659c88d-a01f-000f-5efd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6746f037-98f0-11eb-8a74-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179857809934' + x-ms-request-id: f659c88e-a01f-000f-5ffd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6762b5d6-98f0-11eb-914b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:45 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179859739548' + x-ms-request-id: f659c890-a01f-000f-60fd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67768b7e-98f0-11eb-8eb6-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624179861674259' + x-ms-request-id: f659c891-a01f-000f-61fd-2c3bcc000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67958534-98f0-11eb-8045-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted + response: + body: + string: "\uFEFFdir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5e14-301e-0040-4cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67b4cd06-98f0-11eb-883c-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5f1f-301e-0040-5cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67c3ca83-98f0-11eb-a7d8-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted + response: + body: + string: "\uFEFF2dir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT42!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:45 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d5f7c-301e-0040-0cfd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 67df68ca-98f0-11eb-abf0-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 04:59:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted + response: + body: + string: "\uFEFF2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" + headers: + Content-Type: application/xml + Date: Fri, 09 Apr 2021 04:59:46 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0e6d6057-301e-0040-02fd-2c4a98000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..422bf04e7469 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -0,0 +1,204 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf00e1e8-98f0-11eb-825f-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:12 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3743269"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 5445d712-a01e-0089-70fd-2cf775000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/fsace1178f?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf46a2a3-98f0-11eb-b2be-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 5b30cf1e-501f-0056-59fd-2cbc4f000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bf932777-98f0-11eb-8522-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132624181341072359' + x-ms-request-id: 5b30cf1f-501f-0056-5afd-2cbc4f000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bfc19095-98f0-11eb-930b-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: Fri, 09 Apr 2021 05:02:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 5445d81a-a01e-0089-6ffd-2cf775000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bfcf9a42-98f0-11eb-87b3-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132624181341072359 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT + x-ms-request-id: 3d9dd391-401e-0065-3ffd-2ce3e4000000 + x-ms-resource-type: file + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c01723e1-98f0-11eb-a5e9-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 05:02:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Fri, 09 Apr 2021 05:02:14 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-owner: $superuser + x-ms-permissions: rw-r----- + x-ms-request-id: 3d9dd3a3-401e-0065-4bfd-2ce3e4000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +version: 1 From b819964a152525d3f9dc53dfa408d53d5d3feb26 Mon Sep 17 00:00:00 2001 From: tasherif-msft <69483382+tasherif-msft@users.noreply.github.com> Date: Thu, 8 Apr 2021 22:07:09 -0700 Subject: [PATCH 06/22] Rerecord tests (#17934) * reran tests * reran tests --- ...st_file_system.test_get_deleted_paths.yaml | 440 +++++++++--------- ...em.test_undelete_file_with_version_id.yaml | 68 +-- ...e_system_async.test_get_deleted_paths.yaml | 435 +++++++++-------- ...nc.test_undelete_file_with_version_id.yaml | 80 ++-- 4 files changed, 542 insertions(+), 481 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml index 4f726f5075ec..22256e1ba770 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -3,7 +3,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/xml Accept-Encoding: - gzip, deflate Connection: @@ -11,33 +11,33 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 406ea233-60f2-11eb-8547-c8348e5fffbf + - 457ffd25-98f0-11eb-9fc4-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:54 GMT + - Fri, 09 Apr 2021 04:58:49 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container response: body: string: '' headers: + Content-Length: + - '0' Date: - - Wed, 27 Jan 2021 22:51:54 GMT + - Fri, 09 Apr 2021 04:58:49 GMT ETag: - - '"0x8D8C316254888AC"' + - '"0x8D8FB142A02C1AD"' Last-Modified: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:49 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked x-ms-request-id: - - 3c1845de-a01e-002b-01ff-f4e900000000 + - b52dee7e-101e-009c-0afd-2ce0c6000000 x-ms-version: - - '2020-04-08' + - '2020-06-12' status: code: 201 message: Created @@ -45,7 +45,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -53,11 +53,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 40c48a6e-60f2-11eb-bbf2-c8348e5fffbf + - 45d4da20-98f0-11eb-afc7-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:54 GMT + - Fri, 09 Apr 2021 04:58:49 GMT x-ms-properties: - '' x-ms-version: @@ -71,15 +71,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:49 GMT ETag: - - '"0x8D8C31625ADEA2E"' + - '"0x8D8FB142A5A5964"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb57e-901f-001a-36ff-f4c21d000000 + - fe4b746f-101f-0078-37fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -89,7 +91,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -97,11 +99,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41243fe2-60f2-11eb-b74c-c8348e5fffbf + - 462a2bb0-98f0-11eb-9d86-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -115,15 +117,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:49 GMT ETag: - - '"0x8D8C31625BFD64A"' + - '"0x8D8FB142A72A2E9"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb581-901f-001a-37ff-f4c21d000000 + - fe4b7472-101f-0078-39fd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -133,7 +137,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -141,11 +145,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4135a62e-60f2-11eb-af30-c8348e5fffbf + - 464282da-98f0-11eb-9c07-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -159,15 +163,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT ETag: - - '"0x8D8C31625D0A13E"' + - '"0x8D8FB142A8C7CE5"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb582-901f-001a-38ff-f4c21d000000 + - fe4b7473-101f-0078-3afd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -177,7 +183,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -185,11 +191,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41469112-60f2-11eb-81f2-c8348e5fffbf + - 465c2557-98f0-11eb-92ef-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -203,15 +209,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT ETag: - - '"0x8D8C31625E1EE35"' + - '"0x8D8FB142AA2FDB0"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb583-901f-001a-39ff-f4c21d000000 + - fe4b7474-101f-0078-3bfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -221,7 +229,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -229,11 +237,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4157e33c-60f2-11eb-a23f-c8348e5fffbf + - 4672e1bc-98f0-11eb-b0af-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:55 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -247,15 +255,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT ETag: - - '"0x8D8C31625F30512"' + - '"0x8D8FB142ABAEC16"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb584-901f-001a-3aff-f4c21d000000 + - fe4b7475-101f-0078-3cfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -265,7 +275,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -273,11 +283,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4168fa4f-60f2-11eb-b786-c8348e5fffbf + - 468a6276-98f0-11eb-9b56-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -291,15 +301,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT ETag: - - '"0x8D8C3162604DE38"' + - '"0x8D8FB142AD2BBC1"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb585-901f-001a-3bff-f4c21d000000 + - fe4b7476-101f-0078-3dfd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -309,7 +321,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -317,11 +329,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 417aad88-60f2-11eb-854b-c8348e5fffbf + - 46a2a43b-98f0-11eb-a4be-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT x-ms-properties: - '' x-ms-version: @@ -335,15 +347,17 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:50 GMT ETag: - - '"0x8D8C3162618ADE2"' + - '"0x8D8FB142AED8B91"' Last-Modified: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 884fb586-901f-001a-3cff-f4c21d000000 + - fe4b7477-101f-0078-3efd-2cee58000000 + x-ms-request-server-encrypted: + - 'true' x-ms-version: - '2020-06-12' status: @@ -353,7 +367,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -361,11 +375,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 418e571a-60f2-11eb-86d8-c8348e5fffbf + - 46bce3aa-98f0-11eb-bf33-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -377,15 +391,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615169967486' + - '132624179314769963' x-ms-request-id: - - 884fb587-901f-001a-3dff-f4c21d000000 + - fe4b7478-101f-0078-3ffd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -395,7 +409,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -403,11 +417,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41a6af33-60f2-11eb-866d-c8348e5fffbf + - 46fafd7d-98f0-11eb-bf7b-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -419,15 +433,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615171454866' + - '132624179316566740' x-ms-request-id: - - 884fb588-901f-001a-3eff-f4c21d000000 + - fe4b7479-101f-0078-40fd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -437,7 +451,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -445,11 +459,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41ba4a9f-60f2-11eb-a71d-c8348e5fffbf + - 47228501-98f0-11eb-b30e-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:51 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -461,15 +475,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:51 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615172749559' + - '132624179319150091' x-ms-request-id: - - 884fb589-901f-001a-3fff-f4c21d000000 + - fe4b747a-101f-0078-41fd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -479,7 +493,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -487,11 +501,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41cdd2b4-60f2-11eb-aa31-c8348e5fffbf + - 474350f0-98f0-11eb-a754-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:52 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -503,15 +517,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:51 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615174072130' + - '132624179321356419' x-ms-request-id: - - 884fb58a-901f-001a-40ff-f4c21d000000 + - fe4b747b-101f-0078-42fd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -521,7 +535,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -529,11 +543,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41e1f6e4-60f2-11eb-9760-c8348e5fffbf + - 4766de88-98f0-11eb-8ce6-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:52 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -545,15 +559,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:52 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615175400480' + - '132624179324953375' x-ms-request-id: - - 884fb58b-901f-001a-41ff-f4c21d000000 + - fe4b747d-101f-0078-43fd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -563,7 +577,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -571,11 +585,11 @@ interactions: Content-Length: - '0' User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 41f64313-60f2-11eb-b954-c8348e5fffbf + - 4797b48c-98f0-11eb-b1e5-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:56 GMT + - Fri, 09 Apr 2021 04:58:52 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -587,15 +601,15 @@ interactions: Content-Length: - '0' Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:52 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132562615176756910' + - '132624179328345615' x-ms-request-id: - - 884fb58c-901f-001a-42ff-f4c21d000000 + - fe4b747e-101f-0078-44fd-2cee58000000 x-ms-version: - '2020-06-12' status: @@ -605,72 +619,74 @@ interactions: body: null headers: Accept: - - application/json + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 420ab5ee-60f2-11eb-9f48-c8348e5fffbf + - 47ca0d47-98f0-11eb-9707-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:52 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&showonly=deleted response: body: string: "\uFEFFdir1132562615172749559trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamdir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" headers: Content-Type: - application/xml Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:52 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked + Vary: + - Origin x-ms-request-id: - - 3c184658-a01e-002b-67ff-f4e900000000 + - b52df022-101e-009c-72fd-2ce0c6000000 x-ms-version: - '2020-06-12' status: @@ -680,48 +696,50 @@ interactions: body: null headers: Accept: - - application/json + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4227658e-60f2-11eb-836a-c8348e5fffbf + - 47f11ece-98f0-11eb-8583-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:53 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?prefix=dir3%2F&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&prefix=dir3%2F&showonly=deleted response: body: string: "\uFEFFdir3/dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamdir3/dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4" headers: Content-Type: - application/xml Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:52 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked + Vary: + - Origin x-ms-request-id: - - 3c184660-a01e-002b-6fff-f4e900000000 + - b52df043-101e-009c-0ffd-2ce0c6000000 x-ms-version: - '2020-06-12' status: @@ -731,48 +749,50 @@ interactions: body: null headers: Accept: - - application/json + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 423a7878-60f2-11eb-ba86-c8348e5fffbf + - 480765c7-98f0-11eb-8bf6-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:53 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?maxResults=2&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&maxResults=2&showonly=deleted response: body: string: "\uFEFF2dir1132562615172749559trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-stream2dir1132624179319150091trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT32!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-" + />BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT42!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--" headers: Content-Type: - application/xml Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:53 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked + Vary: + - Origin x-ms-request-id: - - 3c184663-a01e-002b-72ff-f4e900000000 + - b52df058-101e-009c-22fd-2ce0c6000000 x-ms-version: - '2020-06-12' status: @@ -782,60 +802,62 @@ interactions: body: null headers: Accept: - - application/json + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4259e721-60f2-11eb-93da-c8348e5fffbf + - 482a7ccc-98f0-11eb-ba28-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:53 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystem41b81006?marker=2%21252%21MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&marker=2%21248%21MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--&maxResults=4&showonly=deleted response: body: string: "\uFEFF2!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-4dir3/file_in_dir3132562615175400480trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-stream2!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--4dir3/file_in_dir3132624179324953375trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri, + 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51 + GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, - 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 - GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri, + 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50 + GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:51:57 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:58:51 GMT4" headers: Content-Type: - application/xml Date: - - Wed, 27 Jan 2021 22:51:57 GMT + - Fri, 09 Apr 2021 04:58:53 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked + Vary: + - Origin x-ms-request-id: - - 3c18466a-a01e-002b-78ff-f4e900000000 + - b52df06e-101e-009c-36fd-2ce0c6000000 x-ms-version: - '2020-06-12' status: diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml index 012e76897d30..920144044b53 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -13,9 +13,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - c925c631-96fb-11eb-ad8c-c8348e5fffbf + - 22edf54b-98f0-11eb-b813-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:12 GMT + - Fri, 09 Apr 2021 04:57:51 GMT x-ms-version: - '2020-06-12' method: PUT @@ -27,15 +27,15 @@ interactions: Content-Length: - '0' Date: - - Tue, 06 Apr 2021 17:16:12 GMT + - Fri, 09 Apr 2021 04:57:51 GMT ETag: - - '"0x8D8F91FADB2F1B4"' + - '"0x8D8FB140784D2B9"' Last-Modified: - - Tue, 06 Apr 2021 17:16:12 GMT + - Fri, 09 Apr 2021 04:57:51 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 7b2cf78f-601e-0062-5508-2b8f87000000 + - 5a438fc7-b01e-003c-6efc-2c6467000000 x-ms-version: - '2020-06-12' status: @@ -55,9 +55,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - c98985b8-96fb-11eb-9ffe-c8348e5fffbf + - 235ac06a-98f0-11eb-a682-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:12 GMT + - Fri, 09 Apr 2021 04:57:51 GMT x-ms-properties: - '' x-ms-version: @@ -71,15 +71,15 @@ interactions: Content-Length: - '0' Date: - - Tue, 06 Apr 2021 17:16:12 GMT + - Fri, 09 Apr 2021 04:57:52 GMT ETag: - - '"0x8D8F91FAE28BFD9"' + - '"0x8D8FB1407FD32D0"' Last-Modified: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - 036ccca5-d01f-0058-0608-2b95ff000000 + - d806c18e-101f-009c-29fc-2ce0c6000000 x-ms-request-server-encrypted: - 'true' x-ms-version: @@ -101,9 +101,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - c9fbf927-96fb-11eb-a9fe-c8348e5fffbf + - 23cc6ec8-98f0-11eb-acac-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -115,15 +115,15 @@ interactions: Content-Length: - '0' Date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT Server: - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: - 'false' x-ms-deletion-id: - - '132622029736513453' + - '132624178727549652' x-ms-request-id: - - 036ccca7-d01f-0058-0708-2b95ff000000 + - d806c18f-101f-009c-2afc-2ce0c6000000 x-ms-version: - '2020-06-12' status: @@ -141,9 +141,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - ca2b7499-96fb-11eb-84c6-c8348e5fffbf + - 23fa5cb0-98f0-11eb-b2c8-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT x-ms-encryption-algorithm: - AES256 x-ms-version: @@ -155,7 +155,7 @@ interactions: string: '' headers: Date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: @@ -165,7 +165,7 @@ interactions: x-ms-error-code: - BlobNotFound x-ms-request-id: - - 7b2cf83d-601e-0062-6408-2b8f87000000 + - 5a43929f-b01e-003c-16fc-2c6467000000 x-ms-version: - '2020-06-12' status: @@ -185,11 +185,11 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - ca451c7d-96fb-11eb-98f9-c8348e5fffbf + - 241229e1-98f0-11eb-9ef6-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT x-ms-undelete-source: - - dir10/file%C5%87?deletionid=132622029736513453 + - dir10/file%C5%87?deletionid=132624178727549652 x-ms-version: - '2020-06-12' method: PUT @@ -201,13 +201,13 @@ interactions: Content-Length: - '0' Date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 x-ms-creation-time: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT x-ms-request-id: - - 7b2cf85e-601e-0062-0208-2b8f87000000 + - 5a439303-b01e-003c-51fc-2c6467000000 x-ms-resource-type: - file x-ms-version: @@ -227,9 +227,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - ca7281ac-96fb-11eb-8757-c8348e5fffbf + - 2438c4bb-98f0-11eb-80b5-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:16:14 GMT + - Fri, 09 Apr 2021 04:57:53 GMT x-ms-encryption-algorithm: - AES256 x-ms-version: @@ -247,11 +247,11 @@ interactions: Content-Type: - application/octet-stream Date: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT ETag: - - '"0x8D8F91FAE28BFD9"' + - '"0x8D8FB1407FD32D0"' Last-Modified: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Vary: @@ -263,7 +263,7 @@ interactions: x-ms-blob-type: - BlockBlob x-ms-creation-time: - - Tue, 06 Apr 2021 17:16:13 GMT + - Fri, 09 Apr 2021 04:57:52 GMT x-ms-group: - $superuser x-ms-lease-state: @@ -275,7 +275,7 @@ interactions: x-ms-permissions: - rw-r----- x-ms-request-id: - - 7b2cf8a5-601e-0062-3f08-2b8f87000000 + - 5a439389-b01e-003c-20fc-2c6467000000 x-ms-server-encrypted: - 'true' x-ms-version: diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml index 564e1899ad69..20015d5895c7 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -2,27 +2,29 @@ interactions: - request: body: null headers: + Accept: + - application/xml User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4b555935-60f2-11eb-bc47-c8348e5fffbf + - 65f0c226-98f0-11eb-aa01-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:12 GMT + - Fri, 09 Apr 2021 04:59:43 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container response: body: string: '' headers: - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C316300AAB7E"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Content-Length: '0' + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144A5B1290"' + Last-Modified: Fri, 09 Apr 2021 04:59:43 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 8432d23c-201e-0004-3bff-f46504000000 - x-ms-version: '2020-04-08' + x-ms-request-id: 0e6d5285-301e-0040-04fd-2c4a98000000 + x-ms-version: '2020-06-12' status: code: 201 message: Created @@ -30,12 +32,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4b86e88f-60f2-11eb-8bd8-c8348e5fffbf + - 662ce0fb-98f0-11eb-8215-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:43 GMT x-ms-properties: - '' x-ms-version: @@ -47,11 +51,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C316303C8258"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AAA44AB"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7385-a01f-002b-39ff-f4e900000000 + x-ms-request-id: f659c881-a01f-000f-53fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -60,12 +65,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bb2a2d7-60f2-11eb-98f6-c8348e5fffbf + - 667a2c76-98f0-11eb-9627-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -77,11 +84,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:12 GMT - ETag: '"0x8D8C3163046B9F2"' - Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AB9BF70"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7388-a01f-002b-3aff-f4e900000000 + x-ms-request-id: f659c884-a01f-000f-56fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -90,12 +98,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bbcb4e0-60f2-11eb-becd-c8348e5fffbf + - 66898e41-98f0-11eb-a713-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -107,11 +117,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C31630504E73"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:43 GMT + ETag: '"0x8D8FB144AC81FE4"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf7389-a01f-002b-3bff-f4e900000000 + x-ms-request-id: f659c885-a01f-000f-57fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -120,12 +131,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bc637f5-60f2-11eb-b75c-c8348e5fffbf + - 6697d38e-98f0-11eb-b5cc-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -137,11 +150,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C3163059D058"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AD659D9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738a-a01f-002b-3cff-f4e900000000 + x-ms-request-id: f659c886-a01f-000f-58fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -150,12 +164,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bcfac24-60f2-11eb-9c90-c8348e5fffbf + - 66a618df-98f0-11eb-a9fc-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -167,11 +183,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C31630634D0A"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AE4E3A9"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738b-a01f-002b-3dff-f4e900000000 + x-ms-request-id: f659c887-a01f-000f-59fd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -180,12 +197,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bd921f7-60f2-11eb-8cdf-c8348e5fffbf + - 66b4b5fb-98f0-11eb-995e-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -197,11 +216,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C316306D4F4E"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144AF4B2F5"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738c-a01f-002b-3eff-f4e900000000 + x-ms-request-id: f659c888-a01f-000f-5afd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -210,12 +230,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4be33413-60f2-11eb-8954-c8348e5fffbf + - 66c49340-98f0-11eb-b1d8-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-properties: - '' x-ms-version: @@ -227,11 +249,12 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT - ETag: '"0x8D8C3163078186E"' - Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT + ETag: '"0x8D8FB144B0738B7"' + Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 0dcf738d-a01f-002b-3fff-f4e900000000 + x-ms-request-id: f659c889-a01f-000f-5bfd-2c3bcc000000 + x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 @@ -240,12 +263,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bedbb55-60f2-11eb-977a-c8348e5fffbf + - 66d77f1e-98f0-11eb-b8bb-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:44 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -255,11 +280,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615343457964' - x-ms-request-id: 0dcf738e-a01f-002b-40ff-f4e900000000 + x-ms-deletion-id: '132624179854239734' + x-ms-request-id: f659c88a-a01f-000f-5cfd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -268,12 +293,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4bfa6593-60f2-11eb-9336-c8348e5fffbf + - 67229b2e-98f0-11eb-90b2-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:45 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -283,11 +310,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:44 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615344219694' - x-ms-request-id: 0dcf738f-a01f-002b-41ff-f4e900000000 + x-ms-deletion-id: '132624179855451954' + x-ms-request-id: f659c88c-a01f-000f-5dfd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -296,12 +323,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c067444-60f2-11eb-81e5-c8348e5fffbf + - 67349e3d-98f0-11eb-b7db-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:45 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -311,11 +340,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615345014937' - x-ms-request-id: 0dcf7390-a01f-002b-42ff-f4e900000000 + x-ms-deletion-id: '132624179856631159' + x-ms-request-id: f659c88d-a01f-000f-5efd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -324,12 +353,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c12339b-60f2-11eb-8927-c8348e5fffbf + - 6746f037-98f0-11eb-8a74-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:13 GMT + - Fri, 09 Apr 2021 04:59:45 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -339,11 +370,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615345790096' - x-ms-request-id: 0dcf7391-a01f-002b-43ff-f4e900000000 + x-ms-deletion-id: '132624179857809934' + x-ms-request-id: f659c88e-a01f-000f-5ffd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -352,12 +383,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c1e4147-60f2-11eb-9cea-c8348e5fffbf + - 6762b5d6-98f0-11eb-914b-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:45 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -367,11 +400,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615346636843' - x-ms-request-id: 0dcf7392-a01f-002b-44ff-f4e900000000 + x-ms-deletion-id: '132624179859739548' + x-ms-request-id: f659c890-a01f-000f-60fd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -380,12 +413,14 @@ interactions: - request: body: null headers: + Accept: + - application/json User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c2aeb85-60f2-11eb-80e8-c8348e5fffbf + - 67768b7e-98f0-11eb-8eb6-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:46 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -395,11 +430,11 @@ interactions: string: '' headers: Content-Length: '0' - Date: Wed, 27 Jan 2021 22:52:13 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132562615347463522' - x-ms-request-id: 0dcf7393-a01f-002b-45ff-f4e900000000 + x-ms-deletion-id: '132624179861674259' + x-ms-request-id: f659c891-a01f-000f-61fd-2c3bcc000000 x-ms-version: '2020-06-12' status: code: 200 @@ -409,204 +444,208 @@ interactions: body: null headers: Accept: - - application/json + - application/xml User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c3780ef-60f2-11eb-b9b4-c8348e5fffbf + - 67958534-98f0-11eb-8045-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:46 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted response: body: string: "\uFEFFdir1132562615345014937trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamdir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" headers: Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - x-ms-request-id: 8432d24f-201e-0004-4aff-f46504000000 + Vary: Origin + x-ms-request-id: 0e6d5e14-301e-0040-4cfd-2c4a98000000 x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted - request: body: null headers: Accept: - - application/json + - application/xml User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c4a9e91-60f2-11eb-8d48-c8348e5fffbf + - 67b4cd06-98f0-11eb-883c-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:46 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted response: body: string: "\uFEFFdir3/dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamdir3/dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4" headers: Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - x-ms-request-id: 8432d250-201e-0004-4bff-f46504000000 + Vary: Origin + x-ms-request-id: 0e6d5f1f-301e-0040-5cfd-2c4a98000000 x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted - request: body: null headers: Accept: - - application/json + - application/xml User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c548bd6-60f2-11eb-9fcd-c8348e5fffbf + - 67c3ca83-98f0-11eb-a7d8-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:46 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted response: body: string: "\uFEFF2dir1132562615345014937trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-stream2dir1132624179856631159trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT32!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-" + />BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT42!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--" headers: Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:45 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - x-ms-request-id: 8432d254-201e-0004-4eff-f46504000000 + Vary: Origin + x-ms-request-id: 0e6d5f7c-301e-0040-0cfd-2c4a98000000 x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted - request: body: null headers: Accept: - - application/json + - application/xml User-Agent: - - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 4c669132-60f2-11eb-88ef-c8348e5fffbf + - 67df68ca-98f0-11eb-abf0-c8348e5fffbf x-ms-date: - - Wed, 27 Jan 2021 22:52:14 GMT + - Fri, 09 Apr 2021 04:59:46 GMT x-ms-version: - '2020-06-12' method: GET - uri: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted response: body: string: "\uFEFF2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-4dir3/file_in_dir3132562615346636843trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-stream2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--4dir3/file_in_dir3132624179859739548trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, - 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, - 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 - GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamBlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri, + 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44 + GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, - 27 Jan 2021 22:52:14 GMT3BlockBlobHottruetrueFri, + 09 Apr 2021 04:59:45 GMT4" headers: Content-Type: application/xml - Date: Wed, 27 Jan 2021 22:52:14 GMT + Date: Fri, 09 Apr 2021 04:59:46 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - x-ms-request-id: 8432d255-201e-0004-4fff-f46504000000 + Vary: Origin + x-ms-request-id: 0e6d6057-301e-0040-02fd-2c4a98000000 x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml index 0b0a5d4d345b..422bf04e7469 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -7,9 +7,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a5e8fe97-96fc-11eb-b4c0-c8348e5fffbf + - bf00e1e8-98f0-11eb-825f-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:22 GMT + - Fri, 09 Apr 2021 05:02:12 GMT x-ms-version: - '2020-06-12' method: PUT @@ -19,16 +19,16 @@ interactions: string: '' headers: Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:22 GMT - ETag: '"0x8D8F9208A5A7384"' - Last-Modified: Tue, 06 Apr 2021 17:22:22 GMT + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3743269"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 6ef07b94-001e-004b-3d09-2bb1f3000000 + x-ms-request-id: 5445d712-a01e-0089-70fd-2cf775000000 x-ms-version: '2020-06-12' status: code: 201 message: Created - url: https://seannsecanary.blob.core.windows.net/fsace1178f?restype=container + url: https://storagename.blob.core.windows.net/fsace1178f?restype=container - request: body: null headers: @@ -37,9 +37,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a6438765-96fc-11eb-bb73-c8348e5fffbf + - bf46a2a3-98f0-11eb-b2be-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:23 GMT + - Fri, 09 Apr 2021 05:02:13 GMT x-ms-properties: - '' x-ms-version: @@ -51,17 +51,17 @@ interactions: string: '' headers: Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:23 GMT - ETag: '"0x8D8F9208ABC9A66"' - Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Date: Fri, 09 Apr 2021 05:02:13 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 67afbb3f-101f-0078-2c09-2bee58000000 + x-ms-request-id: 5b30cf1e-501f-0056-59fd-2cbc4f000000 x-ms-request-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 201 message: Created - url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file - request: body: null headers: @@ -70,9 +70,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a6906ac2-96fc-11eb-97b3-c8348e5fffbf + - bf932777-98f0-11eb-8522-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:23 GMT + - Fri, 09 Apr 2021 05:02:13 GMT x-ms-version: - '2020-06-12' method: DELETE @@ -82,16 +82,16 @@ interactions: string: '' headers: Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:23 GMT + Date: Fri, 09 Apr 2021 05:02:13 GMT Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 x-ms-delete-type-permanent: 'false' - x-ms-deletion-id: '132622033439312883' - x-ms-request-id: 67afbb40-101f-0078-2d09-2bee58000000 + x-ms-deletion-id: '132624181341072359' + x-ms-request-id: 5b30cf1f-501f-0056-5afd-2cbc4f000000 x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true - request: body: null headers: @@ -100,9 +100,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a6e27d5a-96fc-11eb-9984-c8348e5fffbf + - bfc19095-98f0-11eb-930b-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT + - Fri, 09 Apr 2021 05:02:14 GMT x-ms-encryption-algorithm: - AES256 x-ms-version: @@ -113,17 +113,17 @@ interactions: body: string: '' headers: - Date: Tue, 06 Apr 2021 17:22:23 GMT + Date: Fri, 09 Apr 2021 05:02:14 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked Vary: Origin x-ms-error-code: BlobNotFound - x-ms-request-id: 6ef07bf9-001e-004b-0b09-2bb1f3000000 + x-ms-request-id: 5445d81a-a01e-0089-6ffd-2cf775000000 x-ms-version: '2020-06-12' status: code: 404 message: The specified blob does not exist. - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 - request: body: null headers: @@ -132,11 +132,11 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a6f0e3c0-96fc-11eb-ac2f-c8348e5fffbf + - bfcf9a42-98f0-11eb-87b3-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT + - Fri, 09 Apr 2021 05:02:14 GMT x-ms-undelete-source: - - dir10/file%C5%87?deletionid=132622033439312883 + - dir10/file%C5%87?deletionid=132624181341072359 x-ms-version: - '2020-06-12' method: PUT @@ -146,16 +146,16 @@ interactions: string: '' headers: Content-Length: '0' - Date: Tue, 06 Apr 2021 17:22:24 GMT + Date: Fri, 09 Apr 2021 05:02:13 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT - x-ms-request-id: 3c8993bd-d01e-0083-5309-2b53c2000000 + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT + x-ms-request-id: 3d9dd391-401e-0065-3ffd-2ce3e4000000 x-ms-resource-type: file x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete - request: body: null headers: @@ -164,9 +164,9 @@ interactions: User-Agent: - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - a7641616-96fc-11eb-937b-c8348e5fffbf + - c01723e1-98f0-11eb-a5e9-c8348e5fffbf x-ms-date: - - Tue, 06 Apr 2021 17:22:24 GMT + - Fri, 09 Apr 2021 05:02:14 GMT x-ms-encryption-algorithm: - AES256 x-ms-version: @@ -180,25 +180,25 @@ interactions: Accept-Ranges: bytes Content-Length: '0' Content-Type: application/octet-stream - Date: Tue, 06 Apr 2021 17:22:24 GMT - ETag: '"0x8D8F9208ABC9A66"' - Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Date: Fri, 09 Apr 2021 05:02:14 GMT + ETag: '"0x8D8FB14A3C3E5C6"' + Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Vary: Origin x-ms-access-tier: Hot x-ms-access-tier-inferred: 'true' x-ms-blob-type: BlockBlob - x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT + x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT x-ms-group: $superuser x-ms-lease-state: available x-ms-lease-status: unlocked x-ms-owner: $superuser x-ms-permissions: rw-r----- - x-ms-request-id: 3c899409-d01e-0083-1009-2b53c2000000 + x-ms-request-id: 3d9dd3a3-401e-0065-4bfd-2ce3e4000000 x-ms-server-encrypted: 'true' x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 version: 1 From 0879f8c56416588b88137bc567716452ca45f3f4 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Fri, 9 Apr 2021 10:48:18 -0700 Subject: [PATCH 07/22] changed version for datalake --- sdk/storage/azure-storage-file-datalake/CHANGELOG.md | 2 ++ .../azure/storage/filedatalake/_version.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md index a38105a97644..229b4ddf02df 100644 --- a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md @@ -1,5 +1,7 @@ # Release History +## 12.4.0b1 (unreleased) + ## 12.3.0 (2021-03-01) **Stable release of preview features** - Added support for `DatalakeServiceClient.undelete_filesystem()` diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py index caae3f7d9970..85a0126d5fa7 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.3.0" +VERSION = "12.4.0b1" From a361d92951442c3d3cb2b64fbf57dffe27216148 Mon Sep 17 00:00:00 2001 From: tasherif-msft <69483382+tasherif-msft@users.noreply.github.com> Date: Mon, 12 Apr 2021 17:03:59 -0700 Subject: [PATCH 08/22] Fix service properties Metrics class (#17992) --- .../azure/storage/filedatalake/_models.py | 9 +++- ..._service_client.test_set_hour_metrics.yaml | 46 +++++++++--------- ...ervice_client.test_set_minute_metrics.yaml | 46 +++++++++--------- ...ce_client_async.test_set_hour_metrics.yaml | 47 ++++++++++--------- ..._client_async.test_set_minute_metrics.yaml | 47 ++++++++++--------- .../tests/test_datalake_service_client.py | 5 +- .../test_datalake_service_client_async.py | 5 +- 7 files changed, 105 insertions(+), 100 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index 546fde0b44a8..f0204b02fc8d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -892,6 +892,11 @@ class Metrics(GenMetrics): :keyword str version: The version of Storage Analytics to configure. The default value is 1.0. + :keyword bool enabled: + Indicates whether metrics are enabled for the Datalake service. + The default value is `False`. + :keyword bool include_apis: + Indicates whether metrics should generate summary statistics for called API operations. :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: Determines how long the associated data should persist. If not specified the retention policy will be disabled by default. @@ -899,8 +904,8 @@ class Metrics(GenMetrics): def __init__(self, **kwargs): self.version = kwargs.get('version', u'1.0') - self.enabled = False - self.include_apis = None + self.enabled = kwargs.get('enabled', False) + self.include_apis = kwargs.get('include_apis') self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() @classmethod diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml index 24562d6fab45..8a3aaef8a699 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml @@ -2,42 +2,42 @@ interactions: - request: body: ' - 1.0falsetrue5' + 1.0truetruetrue5' headers: Accept: - - '*/*' + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive Content-Length: - - '237' + - '267' Content-Type: - - application/xml; charset=utf-8 + - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 0365c238-3b16-11eb-80ed-c8348e5fffbf + - 7675879d-9bea-11eb-9017-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 18:32:09 GMT + - Mon, 12 Apr 2021 23:54:47 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: + Content-Length: + - '0' Date: - - Thu, 10 Dec 2020 18:32:14 GMT + - Mon, 12 Apr 2021 23:54:47 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked x-ms-request-id: - - 2b0ba4e1-101e-0021-4922-cf58fa000000 + - e5c9e03f-801e-0055-5cf7-2f5d2b000000 x-ms-version: - - '2020-04-08' + - '2020-06-12' status: code: 202 message: Accepted @@ -51,34 +51,32 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 05700bc2-3b16-11eb-bfa8-c8348e5fffbf + - 76e307d5-9bea-11eb-9616-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 18:32:13 GMT + - Mon, 12 Apr 2021 23:54:48 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalsetrue5falsefalse2014-02-14" headers: Content-Type: - application/xml Date: - - Thu, 10 Dec 2020 18:32:14 GMT + - Mon, 12 Apr 2021 23:54:47 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked - Vary: - - Origin x-ms-request-id: - - 2b0ba4ef-101e-0021-4a22-cf58fa000000 + - e5c9e0ab-801e-0055-14f7-2f5d2b000000 x-ms-version: - - '2020-04-08' + - '2020-06-12' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml index 962f4e96e8b4..7d4ec434b6d4 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml @@ -2,42 +2,42 @@ interactions: - request: body: ' - 1.0falsetrue5' + 1.0truetruetrue5' headers: Accept: - - '*/*' + - application/xml Accept-Encoding: - gzip, deflate Connection: - keep-alive Content-Length: - - '241' + - '271' Content-Type: - - application/xml; charset=utf-8 + - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 09246b04-3b16-11eb-866f-c8348e5fffbf + - 9317b341-9bea-11eb-a813-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 18:32:19 GMT + - Mon, 12 Apr 2021 23:55:35 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: + Content-Length: + - '0' Date: - - Thu, 10 Dec 2020 18:32:23 GMT + - Mon, 12 Apr 2021 23:55:35 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: - - chunked x-ms-request-id: - - 0975cd25-301e-0026-5622-cf3499000000 + - 626fe6f9-301e-007f-0ef7-2f823b000000 x-ms-version: - - '2020-04-08' + - '2020-06-12' status: code: 202 message: Accepted @@ -51,34 +51,32 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 0acacb9d-3b16-11eb-9417-c8348e5fffbf + - 937a9045-9bea-11eb-8deb-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 18:32:22 GMT + - Mon, 12 Apr 2021 23:55:36 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" headers: Content-Type: - application/xml Date: - - Thu, 10 Dec 2020 18:32:23 GMT + - Mon, 12 Apr 2021 23:55:35 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked - Vary: - - Origin x-ms-request-id: - - 0975cd30-301e-0026-5722-cf3499000000 + - 626fe723-301e-007f-2ef7-2f823b000000 x-ms-version: - - '2020-04-08' + - '2020-06-12' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml index 60af7cbe262d..8dea1faa9409 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml @@ -2,64 +2,65 @@ interactions: - request: body: ' - 1.0falsetrue5' + 1.0truetruetrue5' headers: + Accept: + - application/xml Content-Length: - - '237' + - '267' Content-Type: - - application/xml; charset=utf-8 + - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 5bf31ccc-3b29-11eb-92f1-c8348e5fffbf + - d182be6d-9bea-11eb-8465-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 20:50:38 GMT + - Mon, 12 Apr 2021 23:57:20 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - Date: Thu, 10 Dec 2020 20:50:39 GMT + Content-Length: '0' + Date: Mon, 12 Apr 2021 23:57:19 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: db63c688-f01e-0029-6f36-cf42f5000000 - x-ms-version: '2020-04-08' + x-ms-request-id: 40d35052-701e-006e-50f7-2f188f000000 + x-ms-version: '2020-06-12' status: code: 202 message: Accepted - url: https://storagename.blob.core.windows.net/?restype=service&comp=properties + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties - request: body: null headers: Accept: - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 5c60002b-3b29-11eb-b37d-c8348e5fffbf + - d1c4844a-9bea-11eb-be81-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 20:50:39 GMT + - Mon, 12 Apr 2021 23:57:20 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" headers: Content-Type: application/xml - Date: Thu, 10 Dec 2020 20:50:39 GMT + Date: Mon, 12 Apr 2021 23:57:19 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - Vary: Origin - x-ms-request-id: db63c692-f01e-0029-7036-cf42f5000000 - x-ms-version: '2020-04-08' + x-ms-request-id: 40d350ad-701e-006e-03f7-2f188f000000 + x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/?restype=service&comp=properties + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml index 191dc1a05f7c..2a6875525392 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml @@ -2,64 +2,65 @@ interactions: - request: body: ' - 1.0falsetrue5' + 1.0truetruetrue5' headers: + Accept: + - application/xml Content-Length: - - '241' + - '271' Content-Type: - - application/xml; charset=utf-8 + - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 5fcc219d-3b29-11eb-af1a-c8348e5fffbf + - d49b9a00-9bea-11eb-a75f-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 20:50:45 GMT + - Mon, 12 Apr 2021 23:57:25 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - Date: Thu, 10 Dec 2020 20:50:47 GMT + Content-Length: '0' + Date: Mon, 12 Apr 2021 23:57:24 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - Transfer-Encoding: chunked - x-ms-request-id: 89f3b107-101e-001e-0a36-cf9059000000 - x-ms-version: '2020-04-08' + x-ms-request-id: e94c6acf-d01e-0083-73f7-2f53c2000000 + x-ms-version: '2020-06-12' status: code: 202 message: Accepted - url: https://storagename.blob.core.windows.net/?restype=service&comp=properties + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties - request: body: null headers: Accept: - application/xml User-Agent: - - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 61bdbb7c-3b29-11eb-b710-c8348e5fffbf + - d4d6805a-9bea-11eb-a347-c8348e5fffbf x-ms-date: - - Thu, 10 Dec 2020 20:50:48 GMT + - Mon, 12 Apr 2021 23:57:26 GMT x-ms-version: - - '2020-04-08' + - '2020-06-12' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" headers: Content-Type: application/xml - Date: Thu, 10 Dec 2020 20:50:48 GMT + Date: Mon, 12 Apr 2021 23:57:24 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - Vary: Origin - x-ms-request-id: 89f3b115-101e-001e-0b36-cf9059000000 - x-ms-version: '2020-04-08' + x-ms-request-id: e94c6af5-d01e-0083-10f7-2f53c2000000 + x-ms-version: '2020-06-12' status: code: 200 message: OK - url: https://storagename.blob.core.windows.net/?restype=service&comp=properties + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py index 349132d475d8..32e1f00ba6a8 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -263,7 +263,7 @@ def test_set_logging(self): @record def test_set_hour_metrics(self): - hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act self.dsc.set_service_properties(hour_metrics=hour_metrics) @@ -274,7 +274,8 @@ def test_set_hour_metrics(self): @record def test_set_minute_metrics(self): - minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + minute_metrics = Metrics(enabled=True, include_apis=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) # Act self.dsc.set_service_properties(minute_metrics=minute_metrics) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py index c0c9163ad17d..ed9b9c2c8e3b 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -300,7 +300,7 @@ def test_set_logging(self): loop.run_until_complete(self._test_set_logging()) async def _test_set_hour_metrics(self): - hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act await self.dsc.set_service_properties(hour_metrics=hour_metrics) @@ -315,7 +315,8 @@ def test_set_hour_metrics(self): loop.run_until_complete(self._test_set_hour_metrics()) async def _test_set_minute_metrics(self): - minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + minute_metrics = Metrics( + enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act await self.dsc.set_service_properties(minute_metrics=minute_metrics) From 4e3282a93e0a6463d124fa0324f2d5db8f5fa074 Mon Sep 17 00:00:00 2001 From: tasherif-msft <69483382+tasherif-msft@users.noreply.github.com> Date: Tue, 27 Apr 2021 19:25:55 -0700 Subject: [PATCH 09/22] [Blob] Added QQ Parquet Format (#17855) * Added QQ Parquet * cleanup * added parquet format * added version * added parquet tests * removed comment and fixed docstrings * abs path * changed version * added qq parquet to dl * changed msrest version * added tests * recorded tests * changed version for fileshares * fixed parquet type check * added missing comma * resolved archboard feedback * removed useless imports * added metrics for datalake * added extra test * updated datalake depedency * updated datalake depedency --- sdk/storage/azure-storage-blob/CHANGELOG.md | 3 +- .../azure/storage/blob/__init__.py | 4 + .../azure/storage/blob/_blob_client.py | 39 +- .../blob/_generated/_azure_blob_storage.py | 20 + .../storage/blob/_generated/_configuration.py | 2 +- .../_generated/aio/_azure_blob_storage.py | 18 + .../blob/_generated/aio/_configuration.py | 2 +- .../aio/operations/_append_blob_operations.py | 26 +- .../aio/operations/_blob_operations.py | 320 +++- .../aio/operations/_block_blob_operations.py | 44 +- .../aio/operations/_container_operations.py | 35 +- .../aio/operations/_directory_operations.py | 10 +- .../aio/operations/_page_blob_operations.py | 34 +- .../aio/operations/_service_operations.py | 16 +- .../blob/_generated/models/__init__.py | 8 +- .../models/_azure_blob_storage_enums.py | 9 + .../storage/blob/_generated/models/_models.py | 36 +- .../blob/_generated/models/_models_py3.py | 43 +- .../operations/_append_blob_operations.py | 26 +- .../_generated/operations/_blob_operations.py | 323 +++- .../operations/_block_blob_operations.py | 44 +- .../operations/_container_operations.py | 35 +- .../operations/_directory_operations.py | 10 +- .../operations/_page_blob_operations.py | 34 +- .../operations/_service_operations.py | 16 +- .../azure/storage/blob/_models.py | 13 + .../azure/storage/blob/_quick_query_helper.py | 1 - .../azure/storage/blob/_serialize.py | 14 +- .../azure/storage/blob/_version.py | 2 +- sdk/storage/azure-storage-blob/setup.py | 2 +- .../azure-storage-blob/swagger/README.md | 2 +- .../azure-storage-blob/tests/parquet.parquet | Bin 0 -> 80087 bytes ...t_quick_query_input_in_parquet_format.yaml | 1594 ++++++++++++++++ ..._quick_query_output_in_parquet_format.yaml | 1496 +++++++++++++++ .../tests/test_quick_query.py | 51 +- .../azure/storage/filedatalake/__init__.py | 10 +- .../filedatalake/_data_lake_file_client.py | 16 +- .../filedatalake/_data_lake_service_client.py | 39 +- .../filedatalake/_file_system_client.py | 13 +- .../azure/storage/filedatalake/_models.py | 14 + .../aio/_data_lake_service_client_async.py | 39 +- .../aio/_file_system_client_async.py | 13 +- .../azure-storage-file-datalake/setup.py | 4 +- .../tests/parquet.parquet | Bin 0 -> 80087 bytes ..._service_client.test_set_hour_metrics.yaml | 36 +- ...ce_client_async.test_set_hour_metrics.yaml | 40 +- ...t_quick_query_input_in_parquet_format.yaml | 1643 +++++++++++++++++ ..._quick_query_output_in_parquet_format.yaml | 1542 ++++++++++++++++ .../tests/test_datalake_service_client.py | 3 +- .../test_datalake_service_client_async.py | 3 +- .../tests/test_file_system.py | 8 +- .../tests/test_file_system_async.py | 8 +- .../tests/test_quick_query.py | 43 + .../azure-storage-file-share/CHANGELOG.md | 2 +- .../azure/storage/fileshare/_version.py | 2 +- shared_requirements.txt | 6 +- 56 files changed, 7493 insertions(+), 323 deletions(-) create mode 100644 sdk/storage/azure-storage-blob/tests/parquet.parquet create mode 100644 sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml create mode 100644 sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/parquet.parquet create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml create mode 100644 sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml diff --git a/sdk/storage/azure-storage-blob/CHANGELOG.md b/sdk/storage/azure-storage-blob/CHANGELOG.md index 68be0b607aee..957ce02f7e49 100644 --- a/sdk/storage/azure-storage-blob/CHANGELOG.md +++ b/sdk/storage/azure-storage-blob/CHANGELOG.md @@ -1,7 +1,6 @@ # Release History -## 12.8.1b1 (Unreleased) - +## 12.9.0b1 (Unreleased) ## 12.8.0 (2021-03-01) **Stable release of preview features** diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py b/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py index 9164961ea10a..99075baf1ea1 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py @@ -54,8 +54,10 @@ BlobQueryError, DelimitedJsonDialect, DelimitedTextDialect, + ParquetDialect, ArrowDialect, ArrowType, + QuickQueryDialect, ObjectReplicationPolicy, ObjectReplicationRule ) @@ -225,8 +227,10 @@ def download_blob_from_url( 'BlobQueryError', 'DelimitedJsonDialect', 'DelimitedTextDialect', + 'ParquetDialect', 'ArrowDialect', 'ArrowType', + 'QuickQueryDialect', 'BlobQueryReader', 'ObjectReplicationPolicy', 'ObjectReplicationRule' diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py index 1b3203c5170a..12912f50df4e 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py @@ -55,7 +55,8 @@ upload_block_blob, upload_append_blob, upload_page_blob, _any_conditions) -from ._models import BlobType, BlobBlock, BlobProperties, BlobQueryError +from ._models import BlobType, BlobBlock, BlobProperties, BlobQueryError, ParquetDialect, QuickQueryDialect, \ + DelimitedJsonDialect, DelimitedTextDialect from ._download import StorageStreamDownloader from ._lease import BlobLeaseClient @@ -832,16 +833,32 @@ def _quick_query_options(self, query_expression, # type: (str, **Any) -> Dict[str, Any] delimiter = '\n' input_format = kwargs.pop('blob_format', None) - if input_format: + if input_format == QuickQueryDialect.ParquetDialect: + input_format = ParquetDialect() + if input_format == QuickQueryDialect.DelimitedJsonDialect: + input_format = DelimitedJsonDialect() + if input_format == QuickQueryDialect.DelimitedTextDialect: + input_format = DelimitedTextDialect() + input_parquet_format = isinstance(input_format, ParquetDialect) + if input_format and not input_parquet_format: try: delimiter = input_format.lineterminator except AttributeError: try: delimiter = input_format.delimiter except AttributeError: - raise ValueError("The Type of blob_format can only be DelimitedTextDialect or DelimitedJsonDialect") + raise ValueError("The Type of blob_format can only be DelimitedTextDialect or " + "DelimitedJsonDialect or ParquetDialect") output_format = kwargs.pop('output_format', None) + if output_format == QuickQueryDialect.ParquetDialect: + output_format = ParquetDialect() + if output_format == QuickQueryDialect.DelimitedJsonDialect: + output_format = DelimitedJsonDialect() + if output_format == QuickQueryDialect.DelimitedTextDialect: + output_format = DelimitedTextDialect() if output_format: + if isinstance(output_format, ParquetDialect): + raise ValueError("ParquetDialect is invalid as an output format.") try: delimiter = output_format.lineterminator except AttributeError: @@ -850,7 +867,7 @@ def _quick_query_options(self, query_expression, except AttributeError: pass else: - output_format = input_format + output_format = input_format if not input_parquet_format else None query_request = QueryRequest( expression=query_expression, input_serialization=serialize_query_format(input_format), @@ -894,14 +911,18 @@ def query_blob(self, query_expression, **kwargs): :keyword blob_format: Optional. Defines the serialization of the data currently stored in the blob. The default is to treat the blob data as CSV data formatted in the default dialect. This can be overridden with - a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect. + a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect or ParquetDialect. + These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string :paramtype blob_format: ~azure.storage.blob.DelimitedTextDialect or ~azure.storage.blob.DelimitedJsonDialect + or ~azure.storage.blob.ParquetDialect or ~azure.storage.blob.QuickQueryDialect or str :keyword output_format: Optional. Defines the output serialization for the data stream. By default the data will be returned - as it is represented in the blob. By providing an output format, the blob data will be reformatted - according to that profile. This value can be a DelimitedTextDialect or a DelimitedJsonDialect. - :paramtype output_format: ~azure.storage.blob.DelimitedTextDialect, ~azure.storage.blob.DelimitedJsonDialect - or list[~azure.storage.blob.ArrowDialect] + as it is represented in the blob (Parquet formats default to DelimitedTextDialect). + By providing an output format, the blob data will be reformatted according to that profile. + This value can be a DelimitedTextDialect or a DelimitedJsonDialect or ArrowDialect. + These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string + :paramtype output_format: ~azure.storage.blob.DelimitedTextDialect or ~azure.storage.blob.DelimitedJsonDialect + or list[~azure.storage.blob.ArrowDialect] or ~azure.storage.blob.QuickQueryDialect or str :keyword lease: Required if the blob has an active lease. Value can be a BlobLeaseClient object or the lease ID as a string. diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py index dff7e12276c2..eed3bbde964c 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py @@ -15,6 +15,8 @@ # pylint: disable=unused-import,ungrouped-imports from typing import Any + from azure.core.pipeline.transport import HttpRequest, HttpResponse + from ._configuration import AzureBlobStorageConfiguration from .operations import ServiceOperations from .operations import ContainerOperations @@ -77,6 +79,24 @@ def __init__( self.block_blob = BlockBlobOperations( self._client, self._config, self._serialize, self._deserialize) + def _send_request(self, http_request, **kwargs): + # type: (HttpRequest, Any) -> HttpResponse + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.HttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + def close(self): # type: () -> None self._client.close() diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py index fb74f9ee4f8b..0e0d578e8aa6 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py @@ -38,7 +38,7 @@ def __init__( super(AzureBlobStorageConfiguration, self).__init__(**kwargs) self.url = url - self.version = "2020-06-12" + self.version = "2020-08-04" kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py index b53703478e99..77935aaf1e03 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py @@ -9,6 +9,7 @@ from typing import Any from azure.core import AsyncPipelineClient +from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest from msrest import Deserializer, Serializer from ._configuration import AzureBlobStorageConfiguration @@ -72,6 +73,23 @@ def __init__( self.block_blob = BlockBlobOperations( self._client, self._config, self._serialize, self._deserialize) + async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + async def close(self) -> None: await self._client.close() diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py index 1924efa17196..c230fe87c2d9 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py @@ -33,7 +33,7 @@ def __init__( super(AzureBlobStorageConfiguration, self).__init__(**kwargs) self.url = url - self.version = "2020-06-12" + self.version = "2020-08-04" kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py index 333cb9f0e5aa..ec776d1a475b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- import datetime -from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar +from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union import warnings from azure.core.exceptions import ClientAuthenticationError, HttpResponseError, ResourceExistsError, ResourceNotFoundError, map_error @@ -48,6 +48,9 @@ async def create( encryption_algorithm: Optional[str] = "AES256", request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -80,6 +83,13 @@ async def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -194,6 +204,12 @@ async def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -202,7 +218,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -374,7 +390,7 @@ async def append_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -577,7 +593,7 @@ async def append_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -691,7 +707,7 @@ async def seal( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py index af2d12e92779..0d2ff8349bb7 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py @@ -179,7 +179,7 @@ async def download( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -223,6 +223,9 @@ async def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if response.status_code == 206: @@ -266,6 +269,9 @@ async def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if cls: @@ -394,7 +400,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -444,6 +450,9 @@ async def get_properties( response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) if cls: return cls(pipeline_response, None, response_headers) @@ -574,7 +583,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -697,7 +706,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -804,7 +813,7 @@ async def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -995,7 +1004,7 @@ async def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1066,7 +1075,7 @@ async def undelete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1143,7 +1152,7 @@ async def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1274,7 +1283,7 @@ async def set_http_headers( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1291,6 +1300,237 @@ async def set_http_headers( set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + async def set_immutability_policy( + self, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, + **kwargs + ) -> None: + """The Set Immutability Policy operation sets the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param modified_access_conditions: Parameter group. + :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + + _if_unmodified_since = None + if modified_access_conditions is not None: + _if_unmodified_since = modified_access_conditions.if_unmodified_since + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.set_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + if _if_unmodified_since is not None: + header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + async def delete_immutability_policy( + self, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """The Delete Immutability Policy operation deletes the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.delete_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + async def set_legal_hold( + self, + legal_hold: bool, + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """The Set Legal Hold operation sets a legal hold on the blob. + + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "legalhold" + accept = "application/xml" + + # Construct URL + url = self.set_legal_hold.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + async def set_metadata( self, timeout: Optional[int] = None, @@ -1417,7 +1657,7 @@ async def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1533,7 +1773,7 @@ async def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1636,7 +1876,7 @@ async def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1738,7 +1978,7 @@ async def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1847,7 +2087,7 @@ async def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1957,7 +2197,7 @@ async def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2099,7 +2339,7 @@ async def create_snapshot( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2128,6 +2368,9 @@ async def start_copy_from_url( request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, seal_blob: Optional[bool] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None, modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, @@ -2165,6 +2408,13 @@ async def start_copy_from_url( :param seal_blob: Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. :type seal_blob: bool + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2259,6 +2509,12 @@ async def start_copy_from_url( header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') if seal_blob is not None: header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2267,7 +2523,7 @@ async def start_copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2295,6 +2551,9 @@ async def copy_from_url( request_id_parameter: Optional[str] = None, source_content_md5: Optional[bytearray] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None, modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, @@ -2330,6 +2589,13 @@ async def copy_from_url( :type source_content_md5: bytearray :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2420,6 +2686,12 @@ async def copy_from_url( header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2428,7 +2700,7 @@ async def copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2520,7 +2792,7 @@ async def abort_copy_from_url( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2634,7 +2906,7 @@ async def set_tier( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2696,7 +2968,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2839,7 +3111,7 @@ async def query( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3006,7 +3278,7 @@ async def get_tags( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3122,7 +3394,7 @@ async def set_tags( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py index 67c90b0bf9d4..0e0ddab5ba35 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py @@ -51,6 +51,9 @@ async def upload( tier: Optional[Union[str, "_models.AccessTierOptional"]] = None, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -94,6 +97,13 @@ async def upload( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -213,6 +223,12 @@ async def upload( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -224,7 +240,7 @@ async def upload( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -465,7 +481,7 @@ async def put_blob_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -605,7 +621,7 @@ async def stage_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -766,7 +782,7 @@ async def stage_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -796,6 +812,9 @@ async def commit_block_list( tier: Optional[Union[str, "_models.AccessTierOptional"]] = None, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -842,6 +861,13 @@ async def commit_block_list( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -962,6 +988,12 @@ async def commit_block_list( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -974,7 +1006,7 @@ async def commit_block_list( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1082,7 +1114,7 @@ async def get_block_list( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py index 904fea36f6a3..bec837429209 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py @@ -125,7 +125,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -205,7 +205,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -224,6 +224,7 @@ async def get_properties( response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold')) response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope')) response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override')) + response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled')) if cls: return cls(pipeline_response, None, response_headers) @@ -306,7 +307,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -404,7 +405,7 @@ async def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -486,7 +487,7 @@ async def get_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -601,7 +602,7 @@ async def set_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -685,7 +686,7 @@ async def restore( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -765,7 +766,7 @@ async def rename( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -852,7 +853,7 @@ async def submit_batch( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -953,7 +954,7 @@ async def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1046,7 +1047,7 @@ async def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1138,7 +1139,7 @@ async def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1238,7 +1239,7 @@ async def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1337,7 +1338,7 @@ async def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1442,7 +1443,7 @@ async def list_blob_flat_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1554,7 +1555,7 @@ async def list_blob_hierarchy_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1614,7 +1615,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py index 338ff69e3adc..bd18d797d8bd 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py @@ -177,7 +177,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -375,7 +375,7 @@ async def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -488,7 +488,7 @@ async def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -612,7 +612,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -719,7 +719,7 @@ async def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py index 100f730254ed..8a6e272594c0 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py @@ -51,6 +51,9 @@ async def create( blob_sequence_number: Optional[int] = 0, request_id_parameter: Optional[str] = None, blob_tags_string: Optional[str] = None, + immutability_policy_expiry: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None, lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None, cpk_info: Optional["_models.CpkInfo"] = None, @@ -92,6 +95,13 @@ async def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -211,6 +221,12 @@ async def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -219,7 +235,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -400,7 +416,7 @@ async def upload_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -563,7 +579,7 @@ async def clear_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -765,7 +781,7 @@ async def upload_pages_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -888,7 +904,7 @@ async def get_page_ranges( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1027,7 +1043,7 @@ async def get_page_ranges_diff( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1165,7 +1181,7 @@ async def resize( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1282,7 +1298,7 @@ async def update_sequence_number( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1389,7 +1405,7 @@ async def copy_incremental( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py index 91a064680562..f293d00b5b8b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py @@ -104,7 +104,7 @@ async def set_properties( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -174,7 +174,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -247,7 +247,7 @@ async def get_statistics( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -350,7 +350,7 @@ async def list_containers_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -430,7 +430,7 @@ async def get_user_delegation_key( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -489,7 +489,7 @@ async def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -577,7 +577,7 @@ async def submit_batch( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -674,7 +674,7 @@ async def filter_blobs( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py index 831bfa90ca91..a3a275e8ae25 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py @@ -31,7 +31,7 @@ from ._models_py3 import CpkInfo from ._models_py3 import CpkScopeInfo from ._models_py3 import DataLakeStorageError - from ._models_py3 import DataLakeStorageErrorAutoGenerated + from ._models_py3 import DataLakeStorageErrorError from ._models_py3 import DelimitedTextConfiguration from ._models_py3 import DirectoryHttpHeaders from ._models_py3 import FilterBlobItem @@ -85,7 +85,7 @@ from ._models import CpkInfo # type: ignore from ._models import CpkScopeInfo # type: ignore from ._models import DataLakeStorageError # type: ignore - from ._models import DataLakeStorageErrorAutoGenerated # type: ignore + from ._models import DataLakeStorageErrorError # type: ignore from ._models import DelimitedTextConfiguration # type: ignore from ._models import DirectoryHttpHeaders # type: ignore from ._models import FilterBlobItem # type: ignore @@ -122,6 +122,7 @@ AccountKind, ArchiveStatus, BlobExpiryOptions, + BlobImmutabilityPolicyMode, BlobType, BlockListType, CopyStatusType, @@ -167,7 +168,7 @@ 'CpkInfo', 'CpkScopeInfo', 'DataLakeStorageError', - 'DataLakeStorageErrorAutoGenerated', + 'DataLakeStorageErrorError', 'DelimitedTextConfiguration', 'DirectoryHttpHeaders', 'FilterBlobItem', @@ -202,6 +203,7 @@ 'AccountKind', 'ArchiveStatus', 'BlobExpiryOptions', + 'BlobImmutabilityPolicyMode', 'BlobType', 'BlockListType', 'CopyStatusType', diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py index 2df7b1ad6219..d41f32296e87 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py @@ -97,6 +97,12 @@ class BlobExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): RELATIVE_TO_NOW = "RelativeToNow" ABSOLUTE = "Absolute" +class BlobImmutabilityPolicyMode(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): + + UNLOCKED = "Unlocked" + LOCKED = "Locked" + MUTABLE = "Mutable" + class BlobType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): BLOCK_BLOB = "BlockBlob" @@ -156,6 +162,8 @@ class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): UNCOMMITTEDBLOBS = "uncommittedblobs" VERSIONS = "versions" TAGS = "tags" + IMMUTABILITYPOLICY = "immutabilitypolicy" + LEGALHOLD = "legalhold" class ListContainersIncludeType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): @@ -193,6 +201,7 @@ class QueryFormatType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): DELIMITED = "delimited" JSON = "json" ARROW = "arrow" + PARQUET = "parquet" class RehydratePriority(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): """If an object is in rehydrate pending state then this header is returned with priority of diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py index dd31ba1fbc92..de8a5f0a30de 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py @@ -437,6 +437,12 @@ class BlobPropertiesInternal(msrest.serialization.Model): :type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority :param last_accessed_on: :type last_accessed_on: ~datetime.datetime + :param immutability_policy_expires_on: + :type immutability_policy_expires_on: ~datetime.datetime + :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable". + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: + :type legal_hold: bool """ _validation = { @@ -482,6 +488,9 @@ class BlobPropertiesInternal(msrest.serialization.Model): 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, 'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'}, 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'}, + 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'}, + 'legal_hold': {'key': 'LegalHold', 'type': 'bool'}, } _xml_map = { 'name': 'Properties' @@ -529,6 +538,9 @@ def __init__( self.is_sealed = kwargs.get('is_sealed', None) self.rehydrate_priority = kwargs.get('rehydrate_priority', None) self.last_accessed_on = kwargs.get('last_accessed_on', None) + self.immutability_policy_expires_on = kwargs.get('immutability_policy_expires_on', None) + self.immutability_policy_mode = kwargs.get('immutability_policy_mode', None) + self.legal_hold = kwargs.get('legal_hold', None) class BlobTag(msrest.serialization.Model): @@ -600,7 +612,7 @@ class Block(msrest.serialization.Model): :param name: Required. The base64 encoded block ID. :type name: str :param size: Required. The block size in bytes. - :type size: int + :type size: long """ _validation = { @@ -610,7 +622,7 @@ class Block(msrest.serialization.Model): _attribute_map = { 'name': {'key': 'Name', 'type': 'str'}, - 'size': {'key': 'Size', 'type': 'int'}, + 'size': {'key': 'Size', 'type': 'long'}, } def __init__( @@ -809,6 +821,9 @@ class ContainerProperties(msrest.serialization.Model): :type deleted_time: ~datetime.datetime :param remaining_retention_days: :type remaining_retention_days: int + :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this + container. + :type is_version_level_worm_enabled: bool """ _validation = { @@ -829,6 +844,7 @@ class ContainerProperties(msrest.serialization.Model): 'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'}, 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'}, } def __init__( @@ -848,6 +864,7 @@ def __init__( self.prevent_encryption_scope_override = kwargs.get('prevent_encryption_scope_override', None) self.deleted_time = kwargs.get('deleted_time', None) self.remaining_retention_days = kwargs.get('remaining_retention_days', None) + self.is_version_level_worm_enabled = kwargs.get('is_version_level_worm_enabled', None) class CorsRule(msrest.serialization.Model): @@ -955,12 +972,11 @@ class DataLakeStorageError(msrest.serialization.Model): """DataLakeStorageError. :param data_lake_storage_error_details: The service error response object. - :type data_lake_storage_error_details: - ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated + :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError """ _attribute_map = { - 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'}, + 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'}, } def __init__( @@ -971,7 +987,7 @@ def __init__( self.data_lake_storage_error_details = kwargs.get('data_lake_storage_error_details', None) -class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model): +class DataLakeStorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -989,7 +1005,7 @@ def __init__( self, **kwargs ): - super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs) + super(DataLakeStorageErrorError, self).__init__(**kwargs) self.code = kwargs.get('code', None) self.message = kwargs.get('message', None) @@ -1611,7 +1627,7 @@ class QueryFormat(msrest.serialization.Model): """QueryFormat. :param type: The quick query format type. Possible values include: "delimited", "json", - "arrow". + "arrow", "parquet". :type type: str or ~azure.storage.blob.models.QueryFormatType :param delimited_text_configuration: delimited text configuration. :type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration @@ -1619,6 +1635,8 @@ class QueryFormat(msrest.serialization.Model): :type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration :param arrow_configuration: arrow configuration. :type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration + :param parquet_text_configuration: Any object. + :type parquet_text_configuration: object """ _attribute_map = { @@ -1626,6 +1644,7 @@ class QueryFormat(msrest.serialization.Model): 'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'}, 'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'}, 'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'}, + 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'}, } def __init__( @@ -1637,6 +1656,7 @@ def __init__( self.delimited_text_configuration = kwargs.get('delimited_text_configuration', None) self.json_text_configuration = kwargs.get('json_text_configuration', None) self.arrow_configuration = kwargs.get('arrow_configuration', None) + self.parquet_text_configuration = kwargs.get('parquet_text_configuration', None) class QueryRequest(msrest.serialization.Model): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py index 9bac63fee7d6..f7d5ccde44e2 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py @@ -483,6 +483,12 @@ class BlobPropertiesInternal(msrest.serialization.Model): :type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority :param last_accessed_on: :type last_accessed_on: ~datetime.datetime + :param immutability_policy_expires_on: + :type immutability_policy_expires_on: ~datetime.datetime + :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable". + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: + :type legal_hold: bool """ _validation = { @@ -528,6 +534,9 @@ class BlobPropertiesInternal(msrest.serialization.Model): 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, 'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'}, 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'}, + 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'}, + 'legal_hold': {'key': 'LegalHold', 'type': 'bool'}, } _xml_map = { 'name': 'Properties' @@ -573,6 +582,9 @@ def __init__( is_sealed: Optional[bool] = None, rehydrate_priority: Optional[Union[str, "RehydratePriority"]] = None, last_accessed_on: Optional[datetime.datetime] = None, + immutability_policy_expires_on: Optional[datetime.datetime] = None, + immutability_policy_mode: Optional[Union[str, "BlobImmutabilityPolicyMode"]] = None, + legal_hold: Optional[bool] = None, **kwargs ): super(BlobPropertiesInternal, self).__init__(**kwargs) @@ -613,6 +625,9 @@ def __init__( self.is_sealed = is_sealed self.rehydrate_priority = rehydrate_priority self.last_accessed_on = last_accessed_on + self.immutability_policy_expires_on = immutability_policy_expires_on + self.immutability_policy_mode = immutability_policy_mode + self.legal_hold = legal_hold class BlobTag(msrest.serialization.Model): @@ -689,7 +704,7 @@ class Block(msrest.serialization.Model): :param name: Required. The base64 encoded block ID. :type name: str :param size: Required. The block size in bytes. - :type size: int + :type size: long """ _validation = { @@ -699,7 +714,7 @@ class Block(msrest.serialization.Model): _attribute_map = { 'name': {'key': 'Name', 'type': 'str'}, - 'size': {'key': 'Size', 'type': 'int'}, + 'size': {'key': 'Size', 'type': 'long'}, } def __init__( @@ -920,6 +935,9 @@ class ContainerProperties(msrest.serialization.Model): :type deleted_time: ~datetime.datetime :param remaining_retention_days: :type remaining_retention_days: int + :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this + container. + :type is_version_level_worm_enabled: bool """ _validation = { @@ -940,6 +958,7 @@ class ContainerProperties(msrest.serialization.Model): 'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'}, 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'}, } def __init__( @@ -957,6 +976,7 @@ def __init__( prevent_encryption_scope_override: Optional[bool] = None, deleted_time: Optional[datetime.datetime] = None, remaining_retention_days: Optional[int] = None, + is_version_level_worm_enabled: Optional[bool] = None, **kwargs ): super(ContainerProperties, self).__init__(**kwargs) @@ -972,6 +992,7 @@ def __init__( self.prevent_encryption_scope_override = prevent_encryption_scope_override self.deleted_time = deleted_time self.remaining_retention_days = remaining_retention_days + self.is_version_level_worm_enabled = is_version_level_worm_enabled class CorsRule(msrest.serialization.Model): @@ -1090,25 +1111,24 @@ class DataLakeStorageError(msrest.serialization.Model): """DataLakeStorageError. :param data_lake_storage_error_details: The service error response object. - :type data_lake_storage_error_details: - ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated + :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError """ _attribute_map = { - 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'}, + 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'}, } def __init__( self, *, - data_lake_storage_error_details: Optional["DataLakeStorageErrorAutoGenerated"] = None, + data_lake_storage_error_details: Optional["DataLakeStorageErrorError"] = None, **kwargs ): super(DataLakeStorageError, self).__init__(**kwargs) self.data_lake_storage_error_details = data_lake_storage_error_details -class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model): +class DataLakeStorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -1129,7 +1149,7 @@ def __init__( message: Optional[str] = None, **kwargs ): - super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs) + super(DataLakeStorageErrorError, self).__init__(**kwargs) self.code = code self.message = message @@ -1829,7 +1849,7 @@ class QueryFormat(msrest.serialization.Model): """QueryFormat. :param type: The quick query format type. Possible values include: "delimited", "json", - "arrow". + "arrow", "parquet". :type type: str or ~azure.storage.blob.models.QueryFormatType :param delimited_text_configuration: delimited text configuration. :type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration @@ -1837,6 +1857,8 @@ class QueryFormat(msrest.serialization.Model): :type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration :param arrow_configuration: arrow configuration. :type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration + :param parquet_text_configuration: Any object. + :type parquet_text_configuration: object """ _attribute_map = { @@ -1844,6 +1866,7 @@ class QueryFormat(msrest.serialization.Model): 'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'}, 'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'}, 'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'}, + 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'}, } def __init__( @@ -1853,6 +1876,7 @@ def __init__( delimited_text_configuration: Optional["DelimitedTextConfiguration"] = None, json_text_configuration: Optional["JsonTextConfiguration"] = None, arrow_configuration: Optional["ArrowConfiguration"] = None, + parquet_text_configuration: Optional[object] = None, **kwargs ): super(QueryFormat, self).__init__(**kwargs) @@ -1860,6 +1884,7 @@ def __init__( self.delimited_text_configuration = delimited_text_configuration self.json_text_configuration = json_text_configuration self.arrow_configuration = arrow_configuration + self.parquet_text_configuration = parquet_text_configuration class QueryRequest(msrest.serialization.Model): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py index abbe40eac438..655b29cfeca4 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py @@ -17,7 +17,7 @@ if TYPE_CHECKING: # pylint: disable=unused-import,ungrouped-imports - from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar + from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union T = TypeVar('T') ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] @@ -52,6 +52,9 @@ def create( encryption_algorithm="AES256", # type: Optional[str] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -85,6 +88,13 @@ def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -199,6 +209,12 @@ def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -207,7 +223,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -380,7 +396,7 @@ def append_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -584,7 +600,7 @@ def append_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -699,7 +715,7 @@ def seal( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py index bfa782f98d6b..639911bfb307 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py @@ -184,7 +184,7 @@ def download( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -228,6 +228,9 @@ def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if response.status_code == 206: @@ -271,6 +274,9 @@ def download( response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count')) response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) deserialized = response.stream_download(self._client._pipeline) if cls: @@ -400,7 +406,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -450,6 +456,9 @@ def get_properties( response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed')) response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority')) response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) if cls: return cls(pipeline_response, None, response_headers) @@ -581,7 +590,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -705,7 +714,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -813,7 +822,7 @@ def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1005,7 +1014,7 @@ def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1077,7 +1086,7 @@ def undelete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1155,7 +1164,7 @@ def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1287,7 +1296,7 @@ def set_http_headers( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1304,6 +1313,240 @@ def set_http_headers( set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + def set_immutability_policy( + self, + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] + **kwargs # type: Any + ): + # type: (...) -> None + """The Set Immutability Policy operation sets the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param modified_access_conditions: Parameter group. + :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + + _if_unmodified_since = None + if modified_access_conditions is not None: + _if_unmodified_since = modified_access_conditions.if_unmodified_since + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.set_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + if _if_unmodified_since is not None: + header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date')) + response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + def delete_immutability_policy( + self, + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """The Delete Immutability Policy operation deletes the immutability policy on the blob. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "immutabilityPolicies" + accept = "application/xml" + + # Construct URL + url = self.delete_immutability_policy.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.delete(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + + def set_legal_hold( + self, + legal_hold, # type: bool + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """The Set Legal Hold operation sets a legal hold on the blob. + + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character + limit that is recorded in the analytics logs when storage analytics logging is enabled. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "legalhold" + accept = "application/xml" + + # Construct URL + url = self.set_legal_hold.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold')) + + if cls: + return cls(pipeline_response, None, response_headers) + + set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore + def set_metadata( self, timeout=None, # type: Optional[int] @@ -1431,7 +1674,7 @@ def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1548,7 +1791,7 @@ def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1652,7 +1895,7 @@ def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1755,7 +1998,7 @@ def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1865,7 +2108,7 @@ def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1976,7 +2219,7 @@ def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2119,7 +2362,7 @@ def create_snapshot( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2148,6 +2391,9 @@ def start_copy_from_url( request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] seal_blob=None, # type: Optional[bool] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"] modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] @@ -2186,6 +2432,13 @@ def start_copy_from_url( :param seal_blob: Overrides the sealed state of the destination blob. Service version 2019-12-12 and newer. :type seal_blob: bool + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2280,6 +2533,12 @@ def start_copy_from_url( header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') if seal_blob is not None: header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2288,7 +2547,7 @@ def start_copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2316,6 +2575,9 @@ def copy_from_url( request_id_parameter=None, # type: Optional[str] source_content_md5=None, # type: Optional[bytearray] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"] modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] @@ -2352,6 +2614,13 @@ def copy_from_url( :type source_content_md5: bytearray :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param source_modified_access_conditions: Parameter group. :type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions :param modified_access_conditions: Parameter group. @@ -2442,6 +2711,12 @@ def copy_from_url( header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -2450,7 +2725,7 @@ def copy_from_url( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2543,7 +2818,7 @@ def abort_copy_from_url( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2658,7 +2933,7 @@ def set_tier( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2721,7 +2996,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -2865,7 +3140,7 @@ def query( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3033,7 +3308,7 @@ def get_tags( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -3150,7 +3425,7 @@ def set_tags( if response.status_code not in [204]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py index 7bb13abc2b7f..c36c52ad95b0 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py @@ -55,6 +55,9 @@ def upload( tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -99,6 +102,13 @@ def upload( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -218,6 +228,12 @@ def upload( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -229,7 +245,7 @@ def upload( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -471,7 +487,7 @@ def put_blob_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -612,7 +628,7 @@ def stage_block( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -774,7 +790,7 @@ def stage_block_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -804,6 +820,9 @@ def commit_block_list( tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -851,6 +870,13 @@ def commit_block_list( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -971,6 +997,12 @@ def commit_block_list( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') @@ -983,7 +1015,7 @@ def commit_block_list( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1092,7 +1124,7 @@ def get_block_list( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py index 32197532ef36..f01bbc4393fe 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py @@ -130,7 +130,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -211,7 +211,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -230,6 +230,7 @@ def get_properties( response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold')) response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope')) response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override')) + response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled')) if cls: return cls(pipeline_response, None, response_headers) @@ -313,7 +314,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -412,7 +413,7 @@ def set_metadata( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -495,7 +496,7 @@ def get_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -611,7 +612,7 @@ def set_access_policy( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -696,7 +697,7 @@ def restore( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -777,7 +778,7 @@ def rename( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -865,7 +866,7 @@ def submit_batch( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -967,7 +968,7 @@ def acquire_lease( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1061,7 +1062,7 @@ def release_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1154,7 +1155,7 @@ def renew_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1255,7 +1256,7 @@ def break_lease( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1355,7 +1356,7 @@ def change_lease( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1461,7 +1462,7 @@ def list_blob_flat_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1574,7 +1575,7 @@ def list_blob_hierarchy_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1635,7 +1636,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py index f025757048df..5ecabc18b75b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py @@ -182,7 +182,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -381,7 +381,7 @@ def rename( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -495,7 +495,7 @@ def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -620,7 +620,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -728,7 +728,7 @@ def get_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.DataLakeStorageError, response) + error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py index e7f8a0223351..27e1afec657e 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py @@ -55,6 +55,9 @@ def create( blob_sequence_number=0, # type: Optional[int] request_id_parameter=None, # type: Optional[str] blob_tags_string=None, # type: Optional[str] + immutability_policy_expiry=None, # type: Optional[datetime.datetime] + immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] + legal_hold=None, # type: Optional[bool] blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"] lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"] cpk_info=None, # type: Optional["_models.CpkInfo"] @@ -97,6 +100,13 @@ def create( :type request_id_parameter: str :param blob_tags_string: Optional. Used to set blob tags in various blob operations. :type blob_tags_string: str + :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy + is set to expire. + :type immutability_policy_expiry: ~datetime.datetime + :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob. + :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode + :param legal_hold: Specified if a legal hold should be set on the blob. + :type legal_hold: bool :param blob_http_headers: Parameter group. :type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders :param lease_access_conditions: Parameter group. @@ -216,6 +226,12 @@ def create( header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') if blob_tags_string is not None: header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str') + if immutability_policy_expiry is not None: + header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123') + if immutability_policy_mode is not None: + header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str') + if legal_hold is not None: + header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') request = self._client.put(url, query_parameters, header_parameters) @@ -224,7 +240,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -406,7 +422,7 @@ def upload_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -570,7 +586,7 @@ def clear_pages( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -773,7 +789,7 @@ def upload_pages_from_url( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -897,7 +913,7 @@ def get_page_ranges( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1037,7 +1053,7 @@ def get_page_ranges_diff( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1176,7 +1192,7 @@ def resize( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1294,7 +1310,7 @@ def update_sequence_number( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1402,7 +1418,7 @@ def copy_incremental( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py index 72f7a73fdf50..4a0d8b3bb38a 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py @@ -109,7 +109,7 @@ def set_properties( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -180,7 +180,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -254,7 +254,7 @@ def get_statistics( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -358,7 +358,7 @@ def list_containers_segment( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -439,7 +439,7 @@ def get_user_delegation_key( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -499,7 +499,7 @@ def get_account_info( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -588,7 +588,7 @@ def submit_batch( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -686,7 +686,7 @@ def filter_blobs( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py index 00a53dc68bfb..d1ba86751695 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py @@ -67,6 +67,14 @@ class PremiumPageBlobTier(str, Enum): P60 = 'P60' #: P60 Tier +class QuickQueryDialect(str, Enum): + """Specifies the quick query input/output dialect.""" + + DelimitedTextDialect = 'DelimitedTextDialect' + DelimitedJsonDialect = 'DelimitedJsonDialect' + ParquetDialect = 'ParquetDialect' + + class SequenceNumberAction(str, Enum): """Sequence number actions.""" @@ -1037,6 +1045,11 @@ def __init__(self, **kwargs): self.has_header = kwargs.pop('has_header', False) +class ParquetDialect(object): + """Defines parquet input serialization for a blob query request.""" + pass + + class ArrowDialect(ArrowField): """field of an arrow schema. diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py index eb51d987b9ac..3164337308c3 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py @@ -123,7 +123,6 @@ def records(self): yield record - class QuickQueryStreamer(object): """ File-like streaming iterator. diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py index 57f748af1e20..c2e150dda40d 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py @@ -13,7 +13,7 @@ from ._models import ( ContainerEncryptionScope, - DelimitedJsonDialect) + DelimitedJsonDialect, ParquetDialect) from ._generated.models import ( ModifiedAccessConditions, SourceModifiedAccessConditions, @@ -37,7 +37,8 @@ '2019-12-12', '2020-02-10', '2020-04-08', - '2020-06-12' + '2020-06-12', + '2020-08-04' ] @@ -161,7 +162,12 @@ def serialize_blob_tags(tags=None): def serialize_query_format(formater): - if isinstance(formater, DelimitedJsonDialect): + if isinstance(formater, ParquetDialect): + qq_format = QueryFormat( + type=QueryFormatType.PARQUET, + parquet_text_configuration=' ' + ) + elif isinstance(formater, DelimitedJsonDialect): serialization_settings = JsonTextConfiguration( record_separator=formater.delimiter ) @@ -194,5 +200,5 @@ def serialize_query_format(formater): elif not formater: return None else: - raise TypeError("Format must be DelimitedTextDialect or DelimitedJsonDialect.") + raise TypeError("Format must be DelimitedTextDialect or DelimitedJsonDialect or ParquetDialect.") return QuerySerialization(format=qq_format) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py index b4b6e3dd3c20..b21fcd5488bb 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.8.1b1" +VERSION = "12.9.0b1" diff --git a/sdk/storage/azure-storage-blob/setup.py b/sdk/storage/azure-storage-blob/setup.py index bdeb5bf94b6d..ebd76c2903c8 100644 --- a/sdk/storage/azure-storage-blob/setup.py +++ b/sdk/storage/azure-storage-blob/setup.py @@ -94,7 +94,7 @@ ]), install_requires=[ "azure-core<2.0.0,>=1.10.0", - "msrest>=0.6.18", + "msrest>=0.6.21", "cryptography>=2.1.4" ], extras_require={ diff --git a/sdk/storage/azure-storage-blob/swagger/README.md b/sdk/storage/azure-storage-blob/swagger/README.md index e54914c0e21d..5364044aa8ee 100644 --- a/sdk/storage/azure-storage-blob/swagger/README.md +++ b/sdk/storage/azure-storage-blob/swagger/README.md @@ -16,7 +16,7 @@ autorest --v3 --python ### Settings ``` yaml -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-04-08/blob.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-08-04/blob.json output-folder: ../azure/storage/blob/_generated namespace: azure.storage.blob no-namespace-folders: true diff --git a/sdk/storage/azure-storage-blob/tests/parquet.parquet b/sdk/storage/azure-storage-blob/tests/parquet.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8eff6678085dbcdd3edbf6ef3199615c1b61ebe3 GIT binary patch literal 80087 zcmeFaNv<@(a%M-Wh#C>#hy@O`1i=yBMKjb61nnUDzV8F5E!5h$1}#G)eQ9QdI4KP@ zzQB9`efcuOGs5E>Z_GW?{*V9t|J48b5C8gq_4v>K_OJi`FZkd8^*!cV$9g)} z)3Kh8^>nPKV?7<~=~z$4dOFtAu^}BB(y<{O8`7~M9UIcIAsrjiu^}BB(y}o6xZd9h=ax2_2gxKd5vN@E^^84F9qG$MGM}e?tBf@t>Iga4DKg(Oin=QZ$#M zxfIQ%Xf8!_DVj^sT#DgR43}cK6vL$$F2!&uhD$MAis4cWmtwgT%cWQ@#d0Z@OR-#v z~wI4;F;DV|I5T#DyXJeT6R6wjr2F2!>x zo=fpuO30;zTuR8Lgj`CFBwR|ur6gQR!lf{~ zhS@a%m0|)a#ROD}38)kkP$?#$QcOUln1D(#0iBCsb`7&@m|er{8fMopyN1~{%&uW} z4YO;QUBm1eX4f#ghS@dDu3>f!vul`L!|WPn*D$+=*)`0rVRj9(YnWZb>>6g*FuR7? zHO#JIb`7&@m|er{8fMopyN1~{%&uW}4YO;QUBm1eX4f#ghS@dDu3>f!vul`L!|WPn z*D$+=*)`0rVRj9(YnWZb>>6g*FuR7?HO#JIb`7&@m|er{8fMopyN1~{%&uW}4YO;Q zUBm1eX4f#ghS@dDu3>f!vul`L!|WPn*D$+=*)`0rVRj9(Ynffk>{@2mGP{=9wal(% zb}h4OnO)25T4vWWyO!Ct%&uj2EwgKxUCZoRX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7 z*|p5BWp*vIYnffk>{@2mGP{=9wal(%b}h4OnO)25T4vWWyO!Ct%&uj2EwgKxUCZoR zX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7*|p5BWp*vIYnffk>{@2mGP{=9wal(%b}h4O znO)25T4vWWyO!Ct%&uj2EwgKxUCZoRX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7*|p5B zWp*vIYnffk>{@2mGP{o1b%jWV|E?0>zG}~>^f%GF}sf0b%jWV|E?0 z>zG}~>^f%GF}sf0b%jWV|E?0>zG}~>^f%GF}sf0bXLdca>zQ58 z?0RO`GrOMI^~|nkc0IG}nO)E9dS=%%yPnzg%&up4J+teXUC-=#X4f;jp4s)xu4i^V zv+J2%&+K|;*E74G+4an>XLdca>zQ58?0RO`GrOMI^~|nkc0IG}nO)E9dS=%%yPnzg z%&up4J+teXUC-=#X4f;jp4s)xu4i^Vv+J2%&+K|;*E74G+4an>XLdca>zQ58?0RO` zGrOMI^~|nkc0IG}nO)E9dS=%%yCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22g zvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1 zGP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wI zA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO z8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAY zyCJh1GP@zO8#22Qvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{P zvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+ zF}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH z5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o47 z8!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaH zyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8x zvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sH zGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJ zF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf z8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8Jvzsux3A39p zy9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcx zvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+K zFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux z3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt} zn=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A2keFsz6DkN^80fB*f@t7HHCeQVHH zuTxhx{o6kW`o7=N)oQ7BUNQUs_y86=ek&GOMf+#`8H={+4)0Z&+TUwmjMrLTwd(rd z_j<36daU>qMb#0U>3jRV?$-Ra+$JHZO-XPtMxU>|K5Wrss=Mg5|F&k& zzE0_f>bo<;SbaOrr=r(eP;QTI57i!gKeM3N&j8GuhO-$51sEezr{SAy~+&Le_7VG&DR~@_x#Eq-KFn&IFuWR zujPD#?=5mQT*L4EA}gwK-;8Q|_j`S=hu>4%s&wjquYH%dU4!rI>+$z`3#RFK-J;f# z>eD^BUUJ*1`J?(S>~q_uPE}gb`CVmjj@A3B-qZP|%bVBD*{F1&`pDm}?w7_X+fsdI zd1>A&UsaRR_s!3c9`$sq^q~4Wx_a*S(x}tzzw_x&Js_Y^sO6^bKl3uphTriQ@xBAN zD{o)5zV!Y)ym_#-mue=uKlhe@;~ETVtBL1*y<1=QsPFgtm48otx#v@_rh>k|>D)f} zPOIu9Uv~FQSz~f_G*lmO?V9WMR`*E!<|NqiscK(-<$aa8?ylWbdD8v#-E$QPy{PZ< zzxTU6zveg3)wz(OU9VONG zG-UNVw_a5RmDk%V)8jm=HKqG|Z52N|66;t_v!EZk8>XC7d{Nk+d5X~ z)`N#Fr}B1F)nyP^_(s>;+G)tA?^b~$zV=ePt$GKwjC8+_#@}rsMtS zT~*h!>bZX3Z`}PH?8;lZzro|(Q0%X&S315f+x@Fkt?r6_O?3_eZ{>4p|K{yD_v>BM zchdbZshOUA9lH4QNZ{6gzvX0uf-nhQ~hC&@JyVHftH2=-1>`UL@H6Fdq_o%1g_Up2Bn+D)9rSlo4Ezn<4s7Bh82@R{m{mU*o zK7Y^7=9^bpNxbyeG8NzasBtELO%)t_InAgKs=w9DLop6c6))A-+UcOnms~YHpRc~| zv7a;b_2k1@j4sXeuIx(X^=qB^>K@ejQTt!^Y0+O&`&kZXpC9Y_q@zu3v^V%Qt$Dh?4 zjDzpd-qHDHT~)X>pOqVFJW*U*RgPv+C-Zz{U)?tLQpZ8kF-uYAk_dnxhx2Y^=jF;(pH@AJ;+hTlo zQ~B$b4S`=j6>xiz-e$q2r)so({!RT}E&Rzd`u<{gem5vk^G5e`vRB}?2JLf6_pi|F zbyn@qZ)%_Bx7@n#Ix#h&@yB$gPoK?~S{L%OFWw?uF`l?{YESOey8P^|%DBHT{iNHc z!~NQ*Ju%zXI=ytNyy)}IvvqFUOZDW$=k0X2E?=%5P3Mz!qe)K-KVS0WeRcNO5xxxc zK3d~oJZG;?OZRVVZ;Wpar#i>&eZIA0+RQ4S=z7l@o!fhBbuPr$-tFde=%4D6>gV$n zhCp|wyeEE|p?Wk%C~9@oK8$v{rvT%>W}x=&+Hm9UUaMo__8{HT^(rb=1jNhur4A$7 zTAe3-f6z47(iL94BOQ;ib$947Q}wZvf9~3fFE#4n@roT=Oz6%@H7B)qeLf6zca*rF zDW8`071^pgH#whG znXU)p^?~Z!p5LIW_EcL%?af>j-8k)+I=Q_xZ&PE0^PxW=KlL4;XUr$H@O(@!<8WvF zrCOeUzFpV!>oBSImdzK=`Wd%a%u^5^H&)V4(bvvL1W zX5~_Mw?}(S?S-jcjqNNLAHKwUko)t%j6zwyU)7W!eV)}S4|x7CVRmrie&5_byf5a9 zfu7aU52T=A&9r}hTZn7f#VN39+8 zAKhLaUmld`PpJNy%)3luJYaczT5f*bmupj}rt`~Y*P6Y$)NQDKMhuoQyvBTi+sD2S z#^(wuwGY&v=3iD0WmjXqO!e!ZX6{$-R6bMvU_R08lS6;fli$~oj%|Ad3U~eI$MB^4 z;}JOdEY;t5UE8(mNfix!|NEJ>Z*Gil3p)R2Fz6zVOX;0>x@wni(+J*kDzEpx^8JGT zXXV#LIb?2Z)ynOWef&@!t;6_+-tTS<08jYZZsc227Q@>jo^r3mcXgD6j5;nt1;Dj?Jcj$Jgma<=sTVs~8z7?1YMW4RU>iRP(#E%9@u_RN3r z2E+5uwCq#u>lO1=YH#x8u(PXD_3->-(7UNI*Hjn3-)*yP_QfhwQG1{5b()?SKP@x$ zPaEPs7z#A%d&rNgDji02IpQ1Jul}dD)#H9ywd};3U;6?9iA}9N)mLBX{z40c`2^Mf zb58YrqJ2KO|Gl!|HaFsD{YLkrTZ?)gJ>p$C-M`m&XyPZt+ZO-(zHS}Yw=8ajS<&yc zp1aHhEk1vcFGtm0#bvZgAL39eK!te%ri9sDJDB_k7QE6yd~Ri%lK;o8%5$Tj+V zy50xZnU=m(Urz1AhPc8u=~8V4^{@Nr&G}5D$}C-xeZ^)_GgS%>z0`RIJoVB6bLZ>r_-T+p3cXLPGDuldziVC?O(?NN58?{gn! zUuaX6<^FqVXM?K7c(bGWSlYD9#&1)NrR(>F)$dfF>gnlqjc7(5oT=J4e%sB(rU#7Q zTer~t-}1h&X#d)g>tjgAXQ|P?as1MhL2q@oD0Jh$&!2i6dX0F-HPQV?7$R*-j0dlP z+vDKyo0)U9c`E<8$KdF%5&bodx6ZCx=N99yj^_u{aJ-0t;d*60TBVP9wo7e0)&Es* z*}I+?A0AYHy4&w3ZEo;F*KhlEobUTmSx?^&yVurVxyna6KaJ_mfEcW5csyBr+0eTU z=gapOv7jed(B2j;@stnkZ$60eH($?^P1kKu9s(7=>&Lz8YHT|I-|<~@RW96KjZe3wL8|;j^_eaRi1=nz*+Bm8XWqGBnGs(hUcW5w zm&IAk*XaJF10rCqM0|qd+i81u^)KF4j>KCZ%z7Aopz@WDciV{RN0}kMN%tdN+OeLG z3jGuF_|4mL7lA5x{QuhFC|djbJk^JL5Nxd$yw83%&0_qWqCZ=SPYko0A^W^)+wE6B z)7RbKhyM9uKA%nN%3-`|GHTy$1Q4EO`c(bU^_u4$Fryh%&*O9Sy@>eKTGh-)k8sQ6 zFkYE?K9A_yoPUTfHQe4~sM#Szu&d#v_IfS8#TVPG^h*6vU!_@V(O6!fy9~=34(y#jbi~btx8o%qahd=M)7ymh^J;&G(Q&z-Z>Vn>P z@3aJ0I;oGZ*MI9XUfrUwC;WFjx~F|T@G{jChgw-7z8 z5b?!$o7_MLhqSh?nx4zYHM)tS`{@A7^nk9r`Q8 zB!AyO6$_%l@VOu8ejE63_6O$M3$?FJ^$g%IS2efC*V1QNzqM)u8o#Zmj}8kos+RFi z3m=}|tEJ=qtu7{$zZfs4?0axGE!G6EzCb)K8iCU7+%aC@_IN(-b$&mUS5!Y1ajNUi zF<+^u{ciP=78m%OKPoRhnrYjjo)7bh_N421cRU7BO&6}8{N5Wg)hXuFWlrtOxK77p##MbcwWqT= z*4<+M6Y%_C+b|sHf7i?7&&99$wHMYOJhj)Q&Hae6v`Tq=Gw1udRN~dpxSJ z^m)JdbjGeif+730@~uBXfHZ^fE{dKTiV*?L5#F}`Uhx_@tg z#SKKb)S-!oyPe)X9kIS-==__$?RxF4D!IR{pW^HD5Al?pc(ZN4^!3n*r@l z&hhBGonH(PFh1e=Z=D~Od@~E3FT#VTxt37{2fd!hdYx{>H(riM8oQO{WSn|7Nm?UUl&L>9JtNcrXpd%lq$s2G#gs zDvb5ro!SEg2Xzx1h@bO%arvFya+NRE_lW~MGcp+DpH z;91A6|IKHfiv08Q^=`*EszOtJ4EfnK?p{>M@daqUG^xh=Nl)$lb?LI$Fn=F=I{s|e zpws<_@e|Lt*X^t?H>;HUi_i5>Hu*|rJpX%(63usx_Oqkx%ABf*#K?n28k@!OFC|~v)>&4RF_UmK&sY5)0_*#x_nx_0wp4WHx47<8t#B(jL zAFmqM)8%M?*#8B6TVG+k^IGz$XaQTkH|jaa*V&{xt9*m_EBUkpLArN{$MzqckA0Tx zsM1}{1+_o>Qekxj@gB##2>{xFs&0>DS^YMChn7OS7 z?hmy`&z?T#j`h#JBi`mV*RD5S-4neYE-bIR7VCeG+lSYV{q!JyVaTVU_M5NP8vPm7 zCsga|Y{2@$LickHwgc@^tu(LKjcxa4>D%M{`SX5WDq{}ywbY*lS=qR;$9hRgyqx*o z75$3wAoI0Mu0{y9Ks=Go@0+jAbs6T%C(Yk-JWKcG+n`z=-)0?lZxpG+{LTJ+!sM%8 z=ihqZMfI8W2u}7`FF8}X9|)shJ#)qW0z>>=%hO^(V^yZ0>+Rda)VId_mR{dw7c5PM z^^Bg*7Z=+!>ryH_w(|SFXMc{{H3s_|h+p(gW-EU2(~5Y=YJ_(V_}8(&?TUry4m>R! zA3c}JX3smSo9B~LT^zxN^{=O=>(4KXXp2F-QsNU;)xD`3l;?QZmZjrzxEAqfI=>su z-CSe+5wqOi`DM#(+>Us`!Q+YhtGeD{KDqPy<)znStTF#PIUa|}S-uwAg7r1Je?jTa zVnuvy;rP;2_Ws*(e!)TI`)=Ngsi{!k7VBXx=3C@v+f}{BcPV$%{m|oeJ{s-a zyHI;qeOa9~%P*cwug?~Pv2UHQ9>C)n9b|z8Zx7E8^!5bng!0~*d^bB5*mZiTkNZnE z=GwXk>lcp4J4e|f#_;{e`Z$K?ZBb6>4|)A;|AiO5f7J0%{dE|fnF9S!evuDZaQF3s z@$IzI`{+%}F0%#JXLISn1IDLj zqw8Cyp~-KYU(fvhMvLyzH{#XYemKnDW#l<$9S~nVMjG$- z9U>0foMOF!?vJV6yBsItRlHu_7~8(+(y*RJ{drRyw?#lvHN0PG+Vd^PmL7!*`SH`| z7;G8buP&hLGiD8d6!@#?{GX<*-y7@sH;->O^X#o3fBhS^PYc#Q{5v8({g5AiEs8$N zFyG?!MqBN!2r&QY`2BLO-g%<<8^zP^>vGFFYE?euH-kG)71YabEV#_Tz^B&z?0PgN#c9<#(fB02u>S=uteUw0eEOk9clPVw==}CuXNZ9#9>?t& zqQjf((gpD$x*h~y@hU~UaG?6%^-_NW=7aCC{H}i)9(%V9+WVKjZ^>JPr!app9B;od zFT)J9QgcB4)4rA0{h+_C9Pxp$V);%6^UIyeFIQCHP+`8Bk$(ZkuVeM>s^j^1JG{?% zJRkNaP-Nw#fa|HVPBl-}MFX(0pirEUzbEHvx9<{MP3zji2kP5B3cEc^2NEgQbjnIj|l! zun)y}uiN@zy`TG|w=DaiyHnMaT^!}qchm=Pn+xnW zBwm(UUv@|Q)N*`c+SBf=+=lor)knVeXTM{-Ww^huuB*ARS59e;uVHpOT^ZKr2X0^b zy|~83YW3~=?|!HEa@(TIR8UjIp3n_E%8*p!dv8?|}VZ{CHbW% z!%XeM`Y`V=K=^g>dz)iF5AoQSWwnfmCxen-eXL7RzWssrirc#{z;4SL@z;U(LlnNk zdR=*{sVCn?-#6W`VE$t1d=T5}I|NYG$@7=And+^@et>Tzewq>s4(D*9zo6@Rm*Tqh zf&HR9UcZXlAx4G$6AST;X$6`G>{n=ceF^bwtaoAmaQ!Ob8@G4ZK9V75rv{#H6zBWR{?}hmR9@%i+PwRT^*g%W zq951pE3rSoQTtg|h<!a}o_Gc{DYjHmfUEiKvx?2!`u6h3RA>iET0pr1f+N*S&-+nGyZ5L?JzDE`ctZp0jp0VBD~m7#`B9Uzy_+}#r{8PPwbNhYmL`3U+~y~ ziKX7({uVkuookF}G2g#A{$l64zgO%RX?T9uRzun9Nvn+8&ul2};s8%qOZ@!ywxvgh z`RvN|cb8c)1lX^((fvu?TFg(0{V>dDZxMaRhE#P7)Lxvyr-K*!E83Cn2bNd5uF$!1 zy#LL2cF@6!^-JE*n4asmb=ZGfa{TnGr(yWe{_HFHkIi+qT5&&um-@5)?S38NjQvA& zKXI$KDR^GY=V^R+7SE7h^{6`D|822PyS%dz`{C(&K3xRod<5#+sXaFKwfk?ri)}>Y zt3d!PxUj#L$5;K3y?3yC#Ix!8>@hZZvtmC5*H2!a-v0K3_q-mC)^sWHg~~s~E7qS8 z(Rn@MZFK*#~qWu<{N8CukZ54&b_Ko6VErRv777X zxBrXBXXSPpw5ix%e;&W{|FEyAe-MvD6!Q1F#J-u}#D4RPUa|j)_se?B1&$Bv zp|7Lwe@cXN3hd92{hM9(J=QBeXPyK5 zVJW^4tb@gf3i|`NKgE99VZwhD!d}1fw*Ba{^~8S6f?m&0;Czq$7WGIxA>NG@C#)A7 zyx%;pa^21y_H(r~9_Z|n`yI~%j65D}_re7o=AQ@0n|teu`?nwHv*hPhKK|U%-;Xu5 z4=?sI{BDrKI>PUK5c-*d6Z<_EUN6U7qYQ=*`+aNbFRpL3dVVsT5ApS^d(fvf=7XND zx7jlE?rn+vjMTp57+$$xZ`H=_V}RY2&w=^N`qBMdpW&)^ovAaY_N+EHK9BKG_fmbF zDP|NJ&vTq5^&jhg*3*mr@!5#iZ~Qby+?e0al-*l3t&fU1I+S=EJ2{>-7e2gFBxK<)dJ+M&aW4)#OP{ln^4bz_S&_8$^IUy$VkdT^C5 zGMHBONNY@F-v2J0Eyul)JMPdF_%_CNA|wWS%W5nHHmzn0(o>E7FO$Nc2Wh(GL3 z$aRh9Wlmm?!QR-m35F8$Bl5j`&ay45N)0>l)_2t}BAy}sPW~ZmGtO8ONBp1e_w8<5 zd4u)4hWeWh?Q=GwebSCzkL$N$J1xflJU+m-v3YJDi~S(!@0NMGAM^(~ z@#_24WFz)_T|Kq`*bTCelW#Fz=lB2`Pz<%PU;Ux)zmF0t(%Ap=NWA1Ku;mB)m;Pft z2eUPdpdO6JiO;S$bcQ*J^1T0aobJlhm>*jnA7ZGFr@Jinv+?-XVf(>RHy-^N`R4F+ z=2l~WC3Xo@{a^tF8@>@=;{5@x*TIDc3a~y*e#|?T!_AB9ZwmaAVzF{IX$w7r9UcS5%e+6W+k)z7 z(hBVp-Oov5h3!Clre*!U(piJP2=Pg3Z}VwzPirw>$Z0&e>!zFL9`TQx>Z_Yl|BcuW zo6g+db?Ju(O0gcs^JR~@1Qy62^=Z2Q{e&Hel4iWw_on1 z_5<-QJOZ?Xx0mKO=T^-oTYuv@y1zTTJ=(cMebf8ZhZTvX!+r%G5C5M3ISrn-z&g_J z{BFbs@c<~|-#niwJi=La|Lu>Z`Y{#4mFBoQvMZdbh{#@dH#B;-&{>5`9YA?U#o6uxEYU1&7hQ-2Qy0D%yk^koC z+U3Uc8;<99b-kcRpKmp@55 zzhnMD*FWNE;iD@bluzT860r>bVZY?S`;}gYg~9>x0kiUWGA*zh66ZUxpC8s0Fhs%n z&P4ai&PRzY`iM8qbUzC37dK;n!sF?B@OY?m73Oa_KhNnkX0Y{%{htBxR}XVh+qS}f z4eFopFwfQPX{qLuuCJK7dn&PiuBhnqu1PV!#(sw`AU>~t8_-;W_mAddSl!9iWkq>8 zmDev0k&_zn=#kpL^Tcc#4?ro?@O-Pp1H!-gLuaV`eY)`Y51wz9`~M+8&`)+z1M}pv zw|a^I`*-;HE{wL)7SBFmzcHWxQ>BN+^ColJ{yp3N_iX#$v+aM+w*Nib{`YMAZ|w2+ zZ2RA{?SId<|2^CO_iX#$v+ckB;P2V?zh~S3o^Ahow*Bwf_P=M_fBnJVv+aM+w*Nib z{`YMA-?Qz1&$j>igTH6n|DJ9Cd$#@W+4jF@+y9-jd0NWTQl6Ibw3KJ0JR{{9DbGlGM#?i%o{{p5 zlxL(oBjs5s&q{e#%Cl0QmGZ2VXQezVYu zl$S_(iIkT}d5M&lNO_5rmq>XDmj^+JYotb$zg(UUxI7(jdH8K}d7sPE0hgx(E>8zi zp7^1~5By99A18ij@dH0KEdRfhCw^%0LyI3;{J<{-^XJ76Eq-Y6LyI3;{Ltcu7C*H3 zfgF-tj`*R)4=sM+H{a!bIY043iyvD2(Bg*{KeYIv#SblhXz@dfA6op-;)fPLwD_UL z4=sLZ@dKGq_`JjqEq-Y6LyI3;{Ltcu7C*H3p~Vj^erWMSiyvD2(Bg*{KeYIv#Sblh zXz@dfA6op-;)fPLwD_UL4=sLZ@k5IrTKv%BhZaAy_@TuQEq-Y6LyI3;{Ltcu7C*H3 zp~Vj^erWMSiyvD2Ko3LpZNv}!c9Xnjo{jin#1A8Wn1FdU;)fAGjQC;152T9X^284# zei-q?h#yA!4%J-Ga*(KaBWc#1A8W81ci1A4dEz;s-L!ayjCM z5kK%-d-DIw^@<-x{4nB&5kHLhVZ;w3ei-q?h#yA$Fye<1KaBWc#1A8W81ci1A4dE@ z)-XOl@xzE8M*J}1hY>%F_+i8kBYqh1!-yY7{4nB&5kHLhVZ;w3ei-q?h#yA$Fye<1 zKaBWc#1A8W81ci1A4dEz;)fAGjQC;14%F_+i8kBYqh1!-yY7 z{4nB&6+f)_VFTs`sd}mYt@vTZ4=a9H@xzKAR{XHyhZR4p_+iBlob5_z^aF&HP#EKdks+ z#SbffSn&ftZpg=pA6ERZ;s<`)P2OkUtoUKY4=a9H@xzKAR{XHyhZR4p_+iBlD}Gq< z!-^kP{IKGO6+f)_VZ{$CepvCtiXT?|u;PamKdks+#SbffSns( zKajPQ?xzz!@KbN{n(wa@Kb-jC#1CW(;?Id6PW*7Ni62hs(Kb-jC#1AKaIPt?t|KY?BCw@5b!-*eG{BYuj6F;2z z;lvLoemLnrocQ6y4<~*&@xzH9_(^`QPw~TvA5Q#m;)fGIocQ6y4<~*&@xzH9PW*7< zhZ8@X_~FD4Cw@5b!-*eG{BYuj6F;2z;lvLoemL>Ni62hs(Kb-jC#1AKaIPt@Y zA5Q#m;)fGIocQ6y4<~*&@xzH9PW*7%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`o zBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OM zKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE z@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>% z6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#J zLh&OMKO*rX5< zKO*rX5i0=Ke%L?#w|_>?(0olNr`~Vp zwfKMjzW><={@=Cv->#rb_qA`3!KC7h2*tD?`GSlHWkJ87KaM?ec_Cxe;OOBhrHG!(VkE!xd-jt*i5KzYNYfXV|TquQqvC;urYo7yNB;Tu*=u0d-Fq63P=f z2s4L_d@E(>LHggqd=oO3Ir{wD7yIOpF)iba%*S;171ENal{4O6Ro@Q1L57TsGU}Z9 zVK$_xQxj+OF7o4UR%8IaIAd12H*dwGRko96z&cxWJnk|!{xQ^Z`vRuah7t%h&dg5q{UG^ zXEfR!QV|)4jN?6JMg~#3p1ZD|`>v3Yjx+ioy`*W8Qbi4Z z|6N}`uk+zfWKgN;dIx0Ys_Uvn258Dyv_0jtBMlxhSkwI|4f3V6g;P~P8CDA9b9Bq| z%Lql^cRHj3&XBE&kB(-?dSQ4Ms%_o||$( zg4GTgVhZxtWXO=4)}KmGdVe|dcT7uUh~o@E^IUIznZL-mOBrLXS}(b~@%e`81L-%5 z^+3kh#?$xZY4+U99H^NyG#kC9d3GRUYs(qrf_FSKWH50ZWi&CRMampI9k6^wL!3)0avXTSbO#^rBsa{bFlvvEd4-KF~7aevd5&iC*I67u2m zC)dxjO;wToGM-(WVd(n;vmoPTa8vueT)&L&sLypL{$6vX$B2w(NM-*!pL87C?wbO% zU&MERUuPMN1{t~82j{mOS&7tIQT-snYY?o+SmZ4EesAM9BgHB*rV$s)nkp^A^{Z$8l?7+g=)5&!*T#9`ytUca`nLQ-$>5 z+kuQ?NaOrF|L?+f|urydy}Q^)NSGIEU;8H-ZR5ZQg% z`tHGqjOA3n`e{eoB7=3>} zMMiU^9VeeqSHW|^M^F97ouj+@Dr6Yt4BNxD4&R9kXnLmW(Q}^G$a$ugl`|%0nQqLR z!#`>d#w9OVErLn5Hy+QhSR5vn`R~esA*?w5g?^GWU zf9HmTk{a#jchUJ9KhX z^S$>2GOiAEzo6r3o_fNsq7xrOxxM{~49Q4*`m3LLdUVj&$Y94A%X70T5 z7WKvLzt`*BXUK@S&vbvzb#WKkU}TJ=^Lvo}cJ;_8xgF$3{oIY+uLI)^`g~>k(X2Z% zWV6p2nI)Ia7x0PBUw^L+kX91?HPu%$@5MWJ78#|;9ym4HbUq&O#8O5?=ugVP>H62r=HojdL-0bpjXuA!#(XN{Ujaih z`)V5|t2)Ujynp3e7s&8eQF&u_*F%Q!P+1UPYp%25wG%Q@vwvM4wEc#RgeTSKUgp`f zq5smHLDZWw9gt;8wVYAU&E3AfTdxAn@cIrta@eB(-Z{fzo_mvC&8ZeHf48U=wp7QxUkU^a@^sYr$TBM{@n)xlB_eDl`^e0R3yMNW3m3J^81KCO6 zzgz`|3)~vHGerWgbqEuM*7_E)Ju6y#Bb}bVPDVkdd7H3rsMK zzYL5wXEe+UTaRPeBBL6OH=c4FZHbJO&qqGG^S1YMAjADa?S)0Y+aC8o0qWoPpYCWo z`yc~aPWA2U3=K^4DSK0Wqwhkl`P-<8dB4orjrTFBmNTSbd^bORg^cc;VK6&y?S=vw zyDPe$+ot_cuE=m+)A{H5(&!uC{}j}I1~oEduJG$x`27w2Q-zG@*~;U&rL4{d;{n^y z^|kqjJAsUn$OHa6|9W+4K4HGprquq8gC z4vf=wGzuymiRa~Xy}8;8K2v?7f7+3O9vM0ZY7a{EXAaq&(SOnXSc0al?n7g|$MX}U zi2U|-SHnfun}WT(zRWlN> zW@-!Q`p)yQ6|zfWzC_p4`VPL=$l!O-{g}VXZ??zylglfc4Yc?Ocie z(bDy0NayWWWDIni(e)e;jL$HCF%{jPwEX&S!~CJ*49~^ns%&+)>Nq1{fqK3sWDL$n zDi8BdQw|s}Yz>Wvs>&f{=+~-!r1QmC=(@T)P-{l*S)j}8?!f2$5?@Vrjzx#|E#vve zFkE@5(VwpeeO|xor}r~c!AyMh$1pxmiSZ6+WX_$-?N>jle#ocgelFyk9+1J4`Xi%} zuJoKHHEZUjwOO5&T1_c^{$4Q~Xzi;;Zhw~m{Z)aC#LGwHB>I<09Xu zA59H1VAq_1z5AAGv}1=~siyi^*5e%R1@W4c_{-X*ZRf8B&&2Dn<)(IfkMR{{h;$IT zc-9j0Rr2#*p0E04Bo^KgEJ6-n%m=fFcv+4rdxtz%BWGNEk;E6IzKcU z^|LHR|unxc|(Cvd^ne4F$DdWw4$Xk|e8s_>#@@m} zsu}D82C|LU4v-L{BzhfSn{+9Rz{o!!B~cQo4~n9w55WH=MT(RuU8YH&AK)f%fc$|i z0=UW1z3*f;b_@h?`v3#XXx`_MMDp@}oOA9&+F$lL)tn4N#&PaL zHtB~G%e|FF2hc_sL+epIa+Xbv`sJqau3_}&h!gMkn&Z12;!zh~8iZIMKHLI>8vn>yEj*#UW{ZwXE0jd@@cfrS%AX zfkU|KR^Sxc_xov-Rih+M?B@Lc(I(4LHJA_1PrBg*rkZi$D%Ep3gF=%H2u}KhpE&+z;*mp4#*ECGC($oOm4~jc2da-Pt|> zAL7riJl)$N-!)TJVQ5aIUeSEYt=>H9(Mgg0nL5M$JFL%1 z{!SitwGt=Jnv(2iMtPU~kbq~<{Nn)bZBf`yxgdMm^0qe3jd*cWyaY^j6>gN`boBmk zzEQpTYG~P?sR+Ee#q-%dkxFbP;RNkuXg%hst{)(%h`%&nOXY&fb`=Zfr`L4@G67x| zIG=4BuOuKm(Qthg+qIlF4*(fXZL209!Y)T^`} zgC3iq@>WDX;r(3OwqCKH&XMv1fFbL?tt0Av+MoMfn+ua7%uMSY7o1@&&qE9ojmLSl zMpNo)>@f4Zs>jAwMIC2~Hdrj+g+-b~v2mYa^^*l|#+Vj!C zE9idv){fymkRNQ6FVt&cTn2su?cr;my{<#M2aRibf5ck@caeo=eC)d7sEeUN{3ibn z*ydO};EA=T>-*Nzy(GkU-tTQGrvZZ>fPcU1cXu&X?z-y`x6{ z>%Z_~S!;wIvSwk$-f$^X>wufwt9d5qt!-lx3TgcHSSzNTWHpNtdK+n(MB z)x>2zP5{pX+hbXI0M5XlCYt~Ly4LwU(fj(stDfoXCWrVPIev%K6eaSlhU0tfjcw!u zyy=whcna-t*7@RbP4}Os-BcO=ykmUFxDzh5sgaM6f9jDdV>=8YZRB6eeaw0>BTh`G zYgfv?sk;jKH{H*G9U5EUn+xMjsP6kNTI7o-*>mHfd|5(2?b!fd<`dSpvnz@QC&Wuh&u_rSouLB0$nkNGCJ3E{Z{#7q-#?_5Ne(;dJ)}R*w zAs~NrWRC}G@3F#odiHluhlKuFk>B$E1saDRZI!?mc>ZoTZ{r<<=opXhpK9#-8u%0Q zhefyOwM$AITrYzfs=5;OisO7r9aD1QM*YD2YbqDOm9Z0JLG}W?5hX%Gy}Q$V$y4_( zKBu@7UEgzan7jAj@96Vpn&+|yUX;0>pZ7Y>9q{@u|F@%>UERwca=z6&9Dr_6FWr&G z@9%c*)V_)<(fV!WQ5|u3{Q=pxya9+kM-nIdFB`*jhaLQY=KVY^vpzBY$o%Ynr}i`% zC&-^%8fSb)6eX=!(p_QK=@wJR z_6`1|TCQ6t#^0W+ntfVpp$>ZA&OhffS0(U1@?Ril9(iRWEc^2vy@sG%P){)arHa@O zW-y3{>~C>WeF)VdDo^_}0{%K@vjV?me<@)N2Tr_ixqfP`$prvd_(SsdPbv$q+6nb6 zeZM;!P{Qu52Wfuy78SEXzNji%zo8fhYtKf26MX06c$4J;^<~ZZN9(XLPv9@z!rwoN zr=N!zd=%xYwI0)ax(WV?|86d2NBGY=P(IW&%{7`Zi__5G3jiM5RW3p^zk0zLVMP=8 zM%qtXs$oy4$L^cvqr$fVe_p~c-rui5ON;e3k=7%u!|rTRis6gDv}PVr071$?<0js<%CWUx)}unaqx`AcA)eS#Z%vlg zJEHnt59mRzi|QMIH!?O)DK^#EZdqTcGvEBpu&RJRTiKAtE0G|T) zP+`4kJkNN}b(&|yFB<=S`F!;^^7ll~Ls_b?4Z@perTM$I#l*2lV&?j}>~hsqsCU|j z>_2QOn`cEn#P@5e1Y{TdhhzLoT@EGjv!lMD@%eT>)~13!fca6~w{3Gk&(U$bEc0~d z5_*TtQ9M%_>WRjH4;$h;|Hj&0S=0x0qIl~);MpzRqGUW4vDnuU`5$o4_w!3yro{k{ zKXzKbkU%sH)2sKO{dpd-FIQ6u)zJJX@L^?-{5b{6uTrZJqJSq=Z2xCC=c-wxXdKxa zs1Th~Ys9nB`)+n|zD9kxalAymGRdPlg%32pa*x`thXme1_ODy->*B~_yl6bjf`YA> zkWcge85`3hfMEY+if_7ZrS0xgASS)z>*b?%X)bZ{{fo{Y8T~YtiUZ^j~ z-trU75Q-jrD?QH^>dYPX!^ZO^J0!koivl&+d;e#f!!ZJ{sT|Euquzub`}qzupUbtv zJ4_4mDZ2k!_*!lf`ks>3TN!tswOIsyv*5j-t=bmwWE54V{p0!-7WeXxBdu560_feL zXQ()TZ=0=f75K`A`PiTlJp2xPYNPcVKyGy#_~^YL{Gz?Xjry_`lJUAF)qu33gFcC# zSM|s7m}L@WN%jP)U|;tDJgB4nTK8(w`)EWLC5?aZotfYdwwcCP-)Cqy3H;@u=Q#xE zYXBZRDZ1a2OV_R^^hP)Ry=u~yd(;z>`BSt8tGqqX>(pdlejQ}d$U=Zrqvwt0YLD&| zkRiO+`N3ow9l`H%`~^T8O7O=c>(!b)731~t9}UIJWxe5lAK+spt>2nq%w8e?XFP6P zws39018?R_Olp1aU;K&l;l|5-zM*&7R;dInGNx@-$DEX6IVk>6LTVL{Q1 z=h6F2>d3kppoe3B5Y(V^UK;Sl>b?KvhiA`r62(RNmU`Wr)C2GyT3?`9AaD>LX3h23 zTHl2{74R|IAO3hM)1W?p(|zw3)44l;?#O@Weia6jf(Kud>HB5Z-qiqq^Hopn)$ud{ zq=3gz{H>I2`on?mp6I$B7WlNW@G#gY-v>Dt#*zg;8jmFufP>iPsG2K^O{&*>sv z(2|I=p!uHQtgrUvgAZEoa_<131n?b->Z^X~A+S0Te|Wy6g_y}V$QO9L`#$TmM(E9$ zU!AVIb>R91;_5q}!&Ho;M15EU@=uWc#Y=*(GMUx~Fx?n>#D|0VW~H^73h+a*qtB-b z#SLm>;A>=0<8(c;27VaXzZ`lirvv-r(d5rY=o=K0TGVGWA8T1Qrpq(xQ?k!60f2A7 z$F*EPCj;L+M8-tp{xyF4585e4HP@xl94;7jhA z##630Bqr|F=h6Hf$gi`+{wXxsE5Ju6N`Ma=OP>eSa~Tc(bYgr$h9t{&0$;b2{g+Fb z&#p#%WIY?iaDA@8cYWp02YS5u=vg}(C4 zoj??O=i~PGl?zCJcdkFC zdKt8aKiPU({|Ed>(e1`ZH1wzJ-EESF*Rtrpcx^L?se z3i^V7QS^Sf4pm6dD`k%7_^As8{$UXIqW!qXs4@h*qDr*>IY5uPKTeeVK25*+$L(6c ziM;PO)`i|L@FPV@_5f^F_9ygQz$xFqcc$2j0s56#(EHyIpe=rezBkhN>phfb%*c<| z^8Ng_souukLf=UF(c?>r_zpgt^=$PxoN9yKXfJ5JZHw@3>lOMK+K*P|yI znwn?pfKS?y{Ilyu1$hhfo$L>zeGx4@?_@miTJ}M|{$Vh*Umh6Lej$Gtm_L!dHVTxp zfH2~H-!;$6Gb7)fSdVswuGLBP0xIqI@9u)*AD|xsiuYbiU6x${UoT5~pQ?j!V;Zu! zI3Bn2xelQpfrpbnbJ>C-0v}o2Q->6L_*!4fw8u>zQzm){gbdH_-ae-4132`C85R^qwOWV%YyjPy5}i57Y$? z{9RA>c7_78f3>z3^z(O(dl ze``}Z*9P-fE%ZK{UbmvxBlLQ7{|Q_%N|sYR{4250CR||!Ut)W@e>F8_a`hlO#$TZS z_eIRmo3E7rhSF!{Z z9DggND{B$YE$hv}UB>anmm5v*tM@7ZYC5og$bND$%KX|_chY>GRoGoW8$6%q(_JM5 zY`u6GAFfir%HF>C3%&mcHR-Vqz-LeLCs*r0Ng|$~%(u2qmrxK(p}1ZL|NlVJ*ou|) zNyD7m5j8dR8}vMcuc1%KPh24Ty^!1XE&St|C_VtX@Bx&#I0}mQh@JqDGvfKh^|mxm zT%QB_U(R2vS++o|MeAw2Z2|fYfI8wY8ur&ig!@vce>Ckc z2W`ATZ6P#|Pr6OV2Y6t^cv^7`?QClWK9KF*RC=Au75YC~&vYOG+u$Fap}*fdgu43$ z`wTR`P^IgbQEx)j{EjcXr|UqP2+#PY4KozF;0MrE^ZtDfyG%3q!;0$zH8?rB68Svq z&u58X`2a6VJb;)^U+fI@DE&qIx7x(TV57c=WKI%gdMEc9H=msI1mbpD#bPm_O1ZJf~~^@!AveIKY603kt7!|@C1 z;Te#$6WvDhsX7n-u0Z{}lRvvIH9Z-6_2VRa`rTHr_x=3>eQAJR3Ml-0txydqaDL)o z{|Y)i7SkS)-;urRVM*o!zht<6sLM&7<*lK&r|~~)A;}*n);AiRwe7)=ZQP&L@59|} z*q?Hw{jW?>Da2ymAIlxZyRBWJp0a_VRLeDlPP%hU~pLZ5o10$VbWEQUhXj zyTGq8-f&;8?E%R{pFnu?xGl39QiuKtTA!(x_u~=Yl;iQ0Y0VJC36KIb-%Yhi4|{X0 zf5UuSxdMKu66ZJZ@N0qmBKB0@AUlm29X_x}^1t^5co!{NB8_Ap{ZSZD)ZqKS{N`OdL3;jE1-t0$?N6fnC-C^nAiuAeABS{eUjP6L2t{c9(aWdq3i-}J;~9eOLIMAx zJ-v@XL4%f-MmV<5Fn13k%7pkE$9gK1Px3h?_gK$#w2Sr<>j4$TJN{)26QE4s=?&X&uUj*o;Pbhk#^l(ym2U*R();6of1*$Auov)i_D_J(jTv_EO9#cnG(Y$m^Ba2h zK=Y~VuIaNem@nR+FZ%VA4*GB!PYgxW0rBz6zt-5dAUM$<$o%`f6}xrNQxqNVkGq`C z75FV=%kTTj>44G;dMo#(2O3oFJ@Wg3<1LyK&&8~zFoC{5-v!uj-$0UEzK`rOel#T1^c4$B08SX=p&wTKUJ*p#&7?poXK7< z=!O=1cBoHiK96uf*$+L*#r+Z}uAy|seszZOj}5pn6n6pfl-J_~VBAALQL~;nh27@} ze#mfrxn5{aJJ7GufAz1fPIm+FuJ1CZqTXt>WdhUjkN?Ka}XUkdMw2#jm~W zO@mm5{FnSk8KPYy@;Pg0KJsiLs0kxLgT3!Fqdv=kaG`gj`$G%10Nz0UIgH{Te*T!vx!`wcMP$Bzy_XF$tVPFscna09y!?;l`rd7^ z3={e*I`&6Bx=mXE*y7>-Ifpv8fS?um#qrJu^hL{1TGSJ)Ujmd>xecdWjW@;nYR>h9 z-_a9;rg+&wr!z?C{h$k=^_uJg4CRErney!e)rD%oXSWa81Hz8&O7J;5=U>1}Zzs|3 zHnRSzg*eO_^wZ>m)@wTNrA9?1Abff6U&i{G(lSFoPWC9rXl_X4V866~3w=Fq2H%Uk z{QbO{({UH@zh&QjdfVGiZ~LdW{nOk2>1}6h!>23e?wtsrtKfUc#JA8WEKfUdr z-u6##`=_`4)7wti!Kb(V)7$>(ZU6MPe|pE$|Ma$hdfPv}?VsNEPjCC1AAfq= zKfUdr-u6##`=_`4)7$>WgHLb!r?>sn+y3co|Ma$hdfVT4@ab*;^tOL`+dsYSpWgOQ zZ~Ge$KE3Uq-u6##`=_`4)7$>(ZGYpz`RQ%{^tOL`+wt3mpWgP@AE-}n`=_`4)7$>( zZU6MPQ$Nb5xBb)G{{P+E{_QXR{NH{TG=8tTOaH1}(}I8P&Ct#IyWjifyFd7&Z-4&n z*#6Ns{GY$Sr#LRX{5#hruD|~e|NIyK@)y7P)zAL$yFd7a`n{ih^NaV3-+lA_fBR?O z|J8(le)Y58{QRHbr1+ozq~NpPzb+8KfAwFcAHVg(Grqq1w?Fy*um1KY_{491j>F=& z;yv{VhnOtyY4YcJclZgyV1GPK{vZ0l`;`CnKfnEZk17A}$KWIX=;wU@pZ?~j81*-p zjQ{*MKmGBE|7SXW`1bGlP%N zD^LA>;rCzbTfb8yah4>0ZR&o0oSJ{=1MhSG`mcZg?>*=5ObtHrkABYg|KqnbHGlHw zf58?f{#}=TnY*};>+(zdc({&icaKa;j><)0PO gn&MyosnXVTTI0x#KmHfr{MT>4`Q|VF&A*rb8*!6w7ytkO literal 0 HcmV?d00001 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml new file mode 100644 index 000000000000..c2a2eab4511c --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml @@ -0,0 +1,1594 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:03:14 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df?restype=container + response: + body: + string: "\uFEFFContainerAlreadyExistsThe + specified container already exists.\nRequestId:95663fec-c01e-0005-03f5-2c3b70000000\nTime:2021-04-09T04:03:15.4909578Z" + headers: + content-length: + - '230' + content-type: + - application/xml + date: + - Fri, 09 Apr 2021 04:03:14 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - ContainerAlreadyExists + x-ms-version: + - '2020-08-04' + status: + code: 409 + message: The specified container already exists. +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/octet-stream + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-date: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df + response: + body: + string: '' + headers: + content-md5: + - z1EKaBGYeFFPXcMBK90K+w== + date: + - Fri, 09 Apr 2021 04:03:14 GMT + etag: + - '"0x8D8FB0C66E66383"' + last-modified: + - Fri, 09 Apr 2021 04:03:15 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-content-crc64: + - f7IDcRFZujI= + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +- request: + body: ' + + SQLselect * from blobstorage + where id < 1;parquet + ' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '293' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: POST + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query + response: + body: + string: !!binary | + T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi + OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh + dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll + ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg + ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg + ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t + Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk + b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i + LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg + ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig + cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg + YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y + aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz + IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK + ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg + ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg + Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg + ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg + ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi + ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv + Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg + ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w + cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0 + aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz + U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt + YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg + ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg + ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz + IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg + Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu + ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl + LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs + ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw + ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh + bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgBeCQoEJjNiRJDCzm420C7q + AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwpeCQoEJjNiRJDCzm420C7qAg4Ewu4EruMJ + XgkKBCYzYkSQws5uNtAu6gIIBq7jCV4JCgQmM2JEkMLObjbQLuo= + headers: + accept-ranges: + - bytes + content-type: + - avro/binary + date: + - Fri, 09 Apr 2021 04:03:15 GMT + etag: + - '"0x8D8FB0C66E66383"' + last-modified: + - Fri, 09 Apr 2021 04:03:15 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml new file mode 100644 index 000000000000..2899b4154d62 --- /dev/null +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml @@ -0,0 +1,1496 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Fri, 09 Apr 2021 04:19:09 GMT + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860?restype=container + response: + body: + string: '' + headers: + date: + - Fri, 09 Apr 2021 04:19:09 GMT + etag: + - '"0x8D8FB0E9FF3E60A"' + last-modified: + - Fri, 09 Apr 2021 04:19:10 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/octet-stream + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-blob-type: + - BlockBlob + x-ms-date: + - Fri, 09 Apr 2021 04:19:10 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: PUT + uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860/csvfilecdb31860 + response: + body: + string: '' + headers: + content-md5: + - z1EKaBGYeFFPXcMBK90K+w== + date: + - Fri, 09 Apr 2021 04:19:10 GMT + etag: + - '"0x8D8FB0EA01A1F5E"' + last-modified: + - Fri, 09 Apr 2021 04:19:10 GMT + server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-content-crc64: + - f7IDcRFZujI= + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 201 + message: Created +version: 1 diff --git a/sdk/storage/azure-storage-blob/tests/test_quick_query.py b/sdk/storage/azure-storage-blob/tests/test_quick_query.py index cf2e1d62ed98..98f9a6b7f343 100644 --- a/sdk/storage/azure-storage-blob/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-blob/tests/test_quick_query.py @@ -6,6 +6,7 @@ # license information. # -------------------------------------------------------------------------- import base64 +import os import pytest @@ -18,7 +19,7 @@ ) # ------------------------------------------------------------------------------ -from azure.storage.blob._models import ArrowDialect, ArrowType +from azure.storage.blob import ArrowDialect, ArrowType, ParquetDialect, QuickQueryDialect CSV_DATA = b'Service,Package,Version,RepoPath,MissingDocs\r\nApp Configuration,' \ b'azure-data-appconfiguration,1,appconfiguration,FALSE\r\nEvent Hubs' \ @@ -936,4 +937,52 @@ def on_error(error): on_error=on_error, blob_format=input_format) + @GlobalStorageAccountPreparer() + def test_quick_query_input_in_parquet_format(self, resource_group, location, storage_account, storage_account_key): + # Arrange + bsc = BlobServiceClient( + self.account_url(storage_account, "blob"), + credential=storage_account_key) + self._setup(bsc) + expression = "select * from blobstorage where id < 1;" + expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" + + blob_name = self._get_blob_reference() + blob_client = bsc.get_blob_client(self.container_name, blob_name) + parquet_path = "parquet.parquet" + with open(parquet_path, "rb") as parquet_data: + blob_client.upload_blob(parquet_data, overwrite=True) + errors = [] + + def on_error(error): + errors.append(error) + + reader = blob_client.query_blob(expression, blob_format=QuickQueryDialect.ParquetDialect, on_error=on_error) + real_data = reader.readall() + + self.assertEqual(real_data, expected_data) + + @GlobalStorageAccountPreparer() + def test_quick_query_output_in_parquet_format(self, resource_group, location, storage_account, storage_account_key): + # Arrange + bsc = BlobServiceClient( + self.account_url(storage_account, "blob"), + credential=storage_account_key) + self._setup(bsc) + expression = "SELECT * from BlobStorage" + + blob_name = self._get_blob_reference() + blob_client = bsc.get_blob_client(self.container_name, blob_name) + parquet_path = "parquet.parquet" + with open(parquet_path, "rb") as parquet_data: + blob_client.upload_blob(parquet_data, overwrite=True) + errors = [] + + def on_error(error): + errors.append(error) + + with self.assertRaises(ValueError): + blob_client.query_blob( + expression, blob_format=ParquetDialect(), output_format=ParquetDialect(), on_error=on_error) + # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py index c5e918819b78..8158ed9d74ab 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py @@ -31,6 +31,8 @@ DelimitedJsonDialect, ArrowDialect, ArrowType, + QuickQueryDialect, + ParquetDialect, DataLakeFileQueryError, AccessControlChangeResult, AccessControlChangeCounters, @@ -40,7 +42,8 @@ Metrics, RetentionPolicy, StaticWebsite, - CorsRule + CorsRule, + DeletedPathProperties ) from ._shared_access_signature import generate_account_sas, generate_file_system_sas, generate_directory_sas, \ @@ -90,6 +93,8 @@ 'DelimitedTextDialect', 'DelimitedJsonDialect', 'DataLakeFileQueryError', + 'ParquetDialect', + 'QuickQueryDialect', 'ArrowDialect', 'ArrowType', 'DataLakeFileQueryError', @@ -97,5 +102,6 @@ 'Metrics', 'RetentionPolicy', 'StaticWebsite', - 'CorsRule' + 'CorsRule', + 'DeletedPathProperties' ] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py index c88f655abd15..61959bb3f799 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py @@ -724,16 +724,20 @@ def query_file(self, query_expression, **kwargs): :keyword file_format: Optional. Defines the serialization of the data currently stored in the file. The default is to treat the file data as CSV data formatted in the default dialect. This can be overridden with - a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect. + a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect or ParquetDialect. + These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string :paramtype file_format: - ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect + ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect or + ~azure.storage.filedatalake.ParquetDialect or ~azure.storage.filedatalake.QuickQueryDialect or str :keyword output_format: Optional. Defines the output serialization for the data stream. By default the data will be returned - as it is represented in the file. By providing an output format, the file data will be reformatted - according to that profile. This value can be a DelimitedTextDialect or a DelimitedJsonDialect. + as it is represented in the file. By providing an output format, + the file data will be reformatted according to that profile. + This value can be a DelimitedTextDialect or a DelimitedJsonDialect or ArrowDialect. + These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string :paramtype output_format: - ~azure.storage.filedatalake.DelimitedTextDialect, ~azure.storage.filedatalake.DelimitedJsonDialect - or list[~azure.storage.filedatalake.ArrowDialect] + ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect + or list[~azure.storage.filedatalake.ArrowDialect] or ~azure.storage.filedatalake.QuickQueryDialect or str :keyword lease: Required if the file has an active lease. Value can be a DataLakeLeaseClient object or the lease ID as a string. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index b8cc3dc71121..21da8026db34 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -19,8 +19,7 @@ from ._file_system_client import FileSystemClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_file_client import DataLakeFileClient -from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode, AnalyticsLogging, \ - CorsRule, RetentionPolicy, StaticWebsite, Metrics +from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode from ._serialize import convert_dfs_url_to_blob_url @@ -495,17 +494,8 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) - def set_service_properties( - self, analytics_logging=None, # type: Optional[AnalyticsLogging] - hour_metrics=None, # type: Optional[Metrics] - minute_metrics=None, # type: Optional[Metrics] - cors=None, # type: Optional[List[CorsRule]] - target_version=None, # type: Optional[str] - delete_retention_policy=None, # type: Optional[RetentionPolicy] - static_website=None, # type: Optional[StaticWebsite] - **kwargs - ): - # type: (...) -> None + def set_service_properties(self, **kwargs): + # type: (Any) -> None """Sets the properties of a storage account's Datalake service, including Azure Storage Analytics. @@ -515,30 +505,30 @@ def set_service_properties( If an element (e.g. analytics_logging) is left as None, the existing settings on the service for that functionality are preserved. - :param analytics_logging: + :keyword analytics_logging: Groups the Azure Analytics Logging settings. :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging - :param hour_metrics: + :keyword hour_metrics: The hour metrics settings provide a summary of request statistics grouped by API in hourly aggregates. :type hour_metrics: ~azure.storage.filedatalake.Metrics - :param minute_metrics: + :keyword minute_metrics: The minute metrics settings provide request statistics for each minute. :type minute_metrics: ~azure.storage.filedatalake.Metrics - :param cors: + :keyword cors: You can include up to five CorsRule elements in the list. If an empty list is specified, all CORS rules will be deleted, and CORS will be disabled for the service. :type cors: list[~azure.storage.filedatalake.CorsRule] - :param str target_version: + :keyword str target_version: Indicates the default version to use for requests if an incoming request's version is not specified. - :param delete_retention_policy: + :keyword delete_retention_policy: The delete retention policy specifies whether to retain deleted files/directories. It also specifies the number of days and versions of file/directory to keep. :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy - :param static_website: + :keyword static_website: Specifies whether the static website feature is enabled, and if yes, indicates the index document and 404 error document to use. :type static_website: ~azure.storage.filedatalake.StaticWebsite @@ -546,14 +536,7 @@ def set_service_properties( The timeout parameter is expressed in seconds. :rtype: None """ - return self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, - hour_metrics=hour_metrics, - minute_metrics=minute_metrics, - cors=cors, - target_version=target_version, - delete_retention_policy=delete_retention_policy, - static_website=static_website, - **kwargs) # pylint: disable=protected-access + return self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access def get_service_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index 7aafe4efc78e..49f9b079f34b 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -884,18 +884,16 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) - def get_deleted_paths(self, - name_starts_with=None, # type: Optional[str], - **kwargs): - # type: (...) -> ItemPaged[DeletedPathProperties] - """Returns a generator to list the paths(could be files or directories) under the specified file system. + def list_deleted_paths(self, **kwargs): + # type: (Any) -> ItemPaged[DeletedPathProperties] + """Returns a generator to list the deleted (file or directory) paths under the specified file system. The generator will lazily follow the continuation tokens returned by the service. .. versionadded:: 12.4.0 This operation was introduced in API version '2020-06-12'. - :param str name_starts_with: + :keyword str path_prefix: Filters the results to return only paths under the specified path. :keyword int max_results: An optional value that specifies the maximum number of items to return per page. @@ -906,6 +904,7 @@ def get_deleted_paths(self, :rtype: ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] """ + path_prefix = kwargs.pop('path_prefix', None) results_per_page = kwargs.pop('max_results', None) timeout = kwargs.pop('timeout', None) command = functools.partial( @@ -914,5 +913,5 @@ def get_deleted_paths(self, timeout=timeout, **kwargs) return ItemPaged( - command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged, results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index f0204b02fc8d..70b4a24ab0e6 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -16,6 +16,7 @@ from azure.storage.blob import AccessPolicy as BlobAccessPolicy from azure.storage.blob import DelimitedTextDialect as BlobDelimitedTextDialect from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON +from azure.storage.blob import ParquetDialect as BlobParquetDialect from azure.storage.blob import ArrowDialect as BlobArrowDialect from azure.storage.blob._models import ContainerPropertiesPaged from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \ @@ -712,6 +713,11 @@ class DelimitedTextDialect(BlobDelimitedTextDialect): """ +class ParquetDialect(BlobParquetDialect): + """Defines parquet input serialization for a file query request.""" + pass + + class ArrowDialect(BlobArrowDialect): """field of an arrow schema. @@ -724,6 +730,14 @@ class ArrowDialect(BlobArrowDialect): """ +class QuickQueryDialect(str, Enum): + """Specifies the quick query input/output dialect.""" + + DelimitedTextDialect = 'DelimitedTextDialect' + DelimitedJsonDialect = 'DelimitedJsonDialect' + ParquetDialect = 'ParquetDialect' + + class ArrowType(str, Enum): INT64 = "int64" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py index f8bbc59eb8da..ba43b0903b1d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py @@ -19,8 +19,7 @@ from ._data_lake_directory_client_async import DataLakeDirectoryClient from ._data_lake_file_client_async import DataLakeFileClient from ._models import FileSystemPropertiesPaged -from .._models import UserDelegationKey, LocationMode, AnalyticsLogging, Metrics, CorsRule, \ - RetentionPolicy, StaticWebsite +from .._models import UserDelegationKey, LocationMode class DataLakeServiceClient(AsyncStorageAccountHostsMixin, DataLakeServiceClientBase): @@ -444,17 +443,8 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) - async def set_service_properties( - self, analytics_logging=None, # type: Optional[AnalyticsLogging] - hour_metrics=None, # type: Optional[Metrics] - minute_metrics=None, # type: Optional[Metrics] - cors=None, # type: Optional[List[CorsRule]] - target_version=None, # type: Optional[str] - delete_retention_policy=None, # type: Optional[RetentionPolicy] - static_website=None, # type: Optional[StaticWebsite] - **kwargs - ): - # type: (...) -> None + async def set_service_properties(self, **kwargs): + # type: (Any) -> None """Sets the properties of a storage account's Datalake service, including Azure Storage Analytics. @@ -464,30 +454,30 @@ async def set_service_properties( .. versionadded:: 12.4.0 This operation was introduced in API version '2020-06-12'. - :param analytics_logging: + :keyword analytics_logging: Groups the Azure Analytics Logging settings. :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging - :param hour_metrics: + :keyword hour_metrics: The hour metrics settings provide a summary of request statistics grouped by API in hourly aggregates. :type hour_metrics: ~azure.storage.filedatalake.Metrics - :param minute_metrics: + :keyword minute_metrics: The minute metrics settings provide request statistics for each minute. :type minute_metrics: ~azure.storage.filedatalake.Metrics - :param cors: + :keyword cors: You can include up to five CorsRule elements in the list. If an empty list is specified, all CORS rules will be deleted, and CORS will be disabled for the service. :type cors: list[~azure.storage.filedatalake.CorsRule] - :param str target_version: + :keyword str target_version: Indicates the default version to use for requests if an incoming request's version is not specified. - :param delete_retention_policy: + :keyword delete_retention_policy: The delete retention policy specifies whether to retain deleted files/directories. It also specifies the number of days and versions of file/directory to keep. :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy - :param static_website: + :keyword static_website: Specifies whether the static website feature is enabled, and if yes, indicates the index document and 404 error document to use. :type static_website: ~azure.storage.filedatalake.StaticWebsite @@ -495,14 +485,7 @@ async def set_service_properties( The timeout parameter is expressed in seconds. :rtype: None """ - return await self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, - hour_metrics=hour_metrics, - minute_metrics=minute_metrics, - cors=cors, - target_version=target_version, - delete_retention_policy=delete_retention_policy, - static_website=static_website, - **kwargs) # pylint: disable=protected-access + return await self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access async def get_service_properties(self, **kwargs): # type: (Any) -> Dict[str, Any] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index 91c954b896f1..7122970713fa 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -834,18 +834,16 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] key_resolver_function=self.key_resolver_function, loop=self._loop) @distributed_trace - def get_deleted_paths(self, - name_starts_with=None, # type: Optional[str], - **kwargs): - # type: (...) -> AsyncItemPaged[DeletedPathProperties] - """Returns a generator to list the paths(could be files or directories) under the specified file system. + def list_deleted_paths(self, **kwargs): + # type: (Any) -> AsyncItemPaged[DeletedPathProperties] + """Returns a generator to list the deleted (file or directory) paths under the specified file system. The generator will lazily follow the continuation tokens returned by the service. .. versionadded:: 12.4.0 This operation was introduced in API version '2020-06-12'. - :param str name_starts_with: + :keyword str path_prefix: Filters the results to return only paths under the specified path. :keyword int max_results: An optional value that specifies the maximum number of items to return per page. @@ -856,6 +854,7 @@ def get_deleted_paths(self, :rtype: ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] """ + path_prefix = kwargs.pop('path_prefix', None) results_per_page = kwargs.pop('max_results', None) timeout = kwargs.pop('timeout', None) command = functools.partial( @@ -864,5 +863,5 @@ def get_deleted_paths(self, timeout=timeout, **kwargs) return AsyncItemPaged( - command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged, results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py index 22814c62477b..82ef758246cf 100644 --- a/sdk/storage/azure-storage-file-datalake/setup.py +++ b/sdk/storage/azure-storage-file-datalake/setup.py @@ -93,8 +93,8 @@ ]), install_requires=[ "azure-core<2.0.0,>=1.10.0", - "msrest>=0.6.18", - "azure-storage-blob<13.0.0,>=12.8.0b1" + "msrest>=0.6.21", + "azure-storage-blob<13.0.0,>=12.9.0b1" ], extras_require={ ":python_version<'3.0'": ['futures', 'azure-storage-nspkg<4.0.0,>=3.0.0'], diff --git a/sdk/storage/azure-storage-file-datalake/tests/parquet.parquet b/sdk/storage/azure-storage-file-datalake/tests/parquet.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8eff6678085dbcdd3edbf6ef3199615c1b61ebe3 GIT binary patch literal 80087 zcmeFaNv<@(a%M-Wh#C>#hy@O`1i=yBMKjb61nnUDzV8F5E!5h$1}#G)eQ9QdI4KP@ zzQB9`efcuOGs5E>Z_GW?{*V9t|J48b5C8gq_4v>K_OJi`FZkd8^*!cV$9g)} z)3Kh8^>nPKV?7<~=~z$4dOFtAu^}BB(y<{O8`7~M9UIcIAsrjiu^}BB(y}o6xZd9h=ax2_2gxKd5vN@E^^84F9qG$MGM}e?tBf@t>Iga4DKg(Oin=QZ$#M zxfIQ%Xf8!_DVj^sT#DgR43}cK6vL$$F2!&uhD$MAis4cWmtwgT%cWQ@#d0Z@OR-#v z~wI4;F;DV|I5T#DyXJeT6R6wjr2F2!>x zo=fpuO30;zTuR8Lgj`CFBwR|ur6gQR!lf{~ zhS@a%m0|)a#ROD}38)kkP$?#$QcOUln1D(#0iBCsb`7&@m|er{8fMopyN1~{%&uW} z4YO;QUBm1eX4f#ghS@dDu3>f!vul`L!|WPn*D$+=*)`0rVRj9(YnWZb>>6g*FuR7? zHO#JIb`7&@m|er{8fMopyN1~{%&uW}4YO;QUBm1eX4f#ghS@dDu3>f!vul`L!|WPn z*D$+=*)`0rVRj9(YnWZb>>6g*FuR7?HO#JIb`7&@m|er{8fMopyN1~{%&uW}4YO;Q zUBm1eX4f#ghS@dDu3>f!vul`L!|WPn*D$+=*)`0rVRj9(Ynffk>{@2mGP{=9wal(% zb}h4OnO)25T4vWWyO!Ct%&uj2EwgKxUCZoRX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7 z*|p5BWp*vIYnffk>{@2mGP{=9wal(%b}h4OnO)25T4vWWyO!Ct%&uj2EwgKxUCZoR zX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7*|p5BWp*vIYnffk>{@2mGP{=9wal(%b}h4O znO)25T4vWWyO!Ct%&uj2EwgKxUCZoRX4f*imf5w;u4Q&Dvul}M%j{Za*D|}7*|p5B zWp*vIYnffk>{@2mGP{o1b%jWV|E?0>zG}~>^f%GF}sf0b%jWV|E?0 z>zG}~>^f%GF}sf0b%jWV|E?0>zG}~>^f%GF}sf0bXLdca>zQ58 z?0RO`GrOMI^~|nkc0IG}nO)E9dS=%%yPnzg%&up4J+teXUC-=#X4f;jp4s)xu4i^V zv+J2%&+K|;*E74G+4an>XLdca>zQ58?0RO`GrOMI^~|nkc0IG}nO)E9dS=%%yPnzg z%&up4J+teXUC-=#X4f;jp4s)xu4i^Vv+J2%&+K|;*E74G+4an>XLdca>zQ58?0RO` zGrOMI^~|nkc0IG}nO)E9dS=%%yCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22g zvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1 zGP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wI zA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO z8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAYyCJh1GP@zO8#22gvl}wIA+sAY zyCJh1GP@zO8#22Qvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{P zvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+ zF}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH z5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o47 z8!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaHyAiV+F}o478!@{Pvl}tH5wjaH zyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8x zvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sH zGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJ zF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf z8#B8xvl}zJF|!*pyD_sHGrKXf8#B8xvl}zJF|!*pyD_sHGrKXf8#B8Jvzsux3A39p zy9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcx zvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+K zFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux z3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A39py9u+KFuMt} zn=rcxvzsux3A39py9u+KFuMt}n=rcxvzsux3A2keFsz6DkN^80fB*f@t7HHCeQVHH zuTxhx{o6kW`o7=N)oQ7BUNQUs_y86=ek&GOMf+#`8H={+4)0Z&+TUwmjMrLTwd(rd z_j<36daU>qMb#0U>3jRV?$-Ra+$JHZO-XPtMxU>|K5Wrss=Mg5|F&k& zzE0_f>bo<;SbaOrr=r(eP;QTI57i!gKeM3N&j8GuhO-$51sEezr{SAy~+&Le_7VG&DR~@_x#Eq-KFn&IFuWR zujPD#?=5mQT*L4EA}gwK-;8Q|_j`S=hu>4%s&wjquYH%dU4!rI>+$z`3#RFK-J;f# z>eD^BUUJ*1`J?(S>~q_uPE}gb`CVmjj@A3B-qZP|%bVBD*{F1&`pDm}?w7_X+fsdI zd1>A&UsaRR_s!3c9`$sq^q~4Wx_a*S(x}tzzw_x&Js_Y^sO6^bKl3uphTriQ@xBAN zD{o)5zV!Y)ym_#-mue=uKlhe@;~ETVtBL1*y<1=QsPFgtm48otx#v@_rh>k|>D)f} zPOIu9Uv~FQSz~f_G*lmO?V9WMR`*E!<|NqiscK(-<$aa8?ylWbdD8v#-E$QPy{PZ< zzxTU6zveg3)wz(OU9VONG zG-UNVw_a5RmDk%V)8jm=HKqG|Z52N|66;t_v!EZk8>XC7d{Nk+d5X~ z)`N#Fr}B1F)nyP^_(s>;+G)tA?^b~$zV=ePt$GKwjC8+_#@}rsMtS zT~*h!>bZX3Z`}PH?8;lZzro|(Q0%X&S315f+x@Fkt?r6_O?3_eZ{>4p|K{yD_v>BM zchdbZshOUA9lH4QNZ{6gzvX0uf-nhQ~hC&@JyVHftH2=-1>`UL@H6Fdq_o%1g_Up2Bn+D)9rSlo4Ezn<4s7Bh82@R{m{mU*o zK7Y^7=9^bpNxbyeG8NzasBtELO%)t_InAgKs=w9DLop6c6))A-+UcOnms~YHpRc~| zv7a;b_2k1@j4sXeuIx(X^=qB^>K@ejQTt!^Y0+O&`&kZXpC9Y_q@zu3v^V%Qt$Dh?4 zjDzpd-qHDHT~)X>pOqVFJW*U*RgPv+C-Zz{U)?tLQpZ8kF-uYAk_dnxhx2Y^=jF;(pH@AJ;+hTlo zQ~B$b4S`=j6>xiz-e$q2r)so({!RT}E&Rzd`u<{gem5vk^G5e`vRB}?2JLf6_pi|F zbyn@qZ)%_Bx7@n#Ix#h&@yB$gPoK?~S{L%OFWw?uF`l?{YESOey8P^|%DBHT{iNHc z!~NQ*Ju%zXI=ytNyy)}IvvqFUOZDW$=k0X2E?=%5P3Mz!qe)K-KVS0WeRcNO5xxxc zK3d~oJZG;?OZRVVZ;Wpar#i>&eZIA0+RQ4S=z7l@o!fhBbuPr$-tFde=%4D6>gV$n zhCp|wyeEE|p?Wk%C~9@oK8$v{rvT%>W}x=&+Hm9UUaMo__8{HT^(rb=1jNhur4A$7 zTAe3-f6z47(iL94BOQ;ib$947Q}wZvf9~3fFE#4n@roT=Oz6%@H7B)qeLf6zca*rF zDW8`071^pgH#whG znXU)p^?~Z!p5LIW_EcL%?af>j-8k)+I=Q_xZ&PE0^PxW=KlL4;XUr$H@O(@!<8WvF zrCOeUzFpV!>oBSImdzK=`Wd%a%u^5^H&)V4(bvvL1W zX5~_Mw?}(S?S-jcjqNNLAHKwUko)t%j6zwyU)7W!eV)}S4|x7CVRmrie&5_byf5a9 zfu7aU52T=A&9r}hTZn7f#VN39+8 zAKhLaUmld`PpJNy%)3luJYaczT5f*bmupj}rt`~Y*P6Y$)NQDKMhuoQyvBTi+sD2S z#^(wuwGY&v=3iD0WmjXqO!e!ZX6{$-R6bMvU_R08lS6;fli$~oj%|Ad3U~eI$MB^4 z;}JOdEY;t5UE8(mNfix!|NEJ>Z*Gil3p)R2Fz6zVOX;0>x@wni(+J*kDzEpx^8JGT zXXV#LIb?2Z)ynOWef&@!t;6_+-tTS<08jYZZsc227Q@>jo^r3mcXgD6j5;nt1;Dj?Jcj$Jgma<=sTVs~8z7?1YMW4RU>iRP(#E%9@u_RN3r z2E+5uwCq#u>lO1=YH#x8u(PXD_3->-(7UNI*Hjn3-)*yP_QfhwQG1{5b()?SKP@x$ zPaEPs7z#A%d&rNgDji02IpQ1Jul}dD)#H9ywd};3U;6?9iA}9N)mLBX{z40c`2^Mf zb58YrqJ2KO|Gl!|HaFsD{YLkrTZ?)gJ>p$C-M`m&XyPZt+ZO-(zHS}Yw=8ajS<&yc zp1aHhEk1vcFGtm0#bvZgAL39eK!te%ri9sDJDB_k7QE6yd~Ri%lK;o8%5$Tj+V zy50xZnU=m(Urz1AhPc8u=~8V4^{@Nr&G}5D$}C-xeZ^)_GgS%>z0`RIJoVB6bLZ>r_-T+p3cXLPGDuldziVC?O(?NN58?{gn! zUuaX6<^FqVXM?K7c(bGWSlYD9#&1)NrR(>F)$dfF>gnlqjc7(5oT=J4e%sB(rU#7Q zTer~t-}1h&X#d)g>tjgAXQ|P?as1MhL2q@oD0Jh$&!2i6dX0F-HPQV?7$R*-j0dlP z+vDKyo0)U9c`E<8$KdF%5&bodx6ZCx=N99yj^_u{aJ-0t;d*60TBVP9wo7e0)&Es* z*}I+?A0AYHy4&w3ZEo;F*KhlEobUTmSx?^&yVurVxyna6KaJ_mfEcW5csyBr+0eTU z=gapOv7jed(B2j;@stnkZ$60eH($?^P1kKu9s(7=>&Lz8YHT|I-|<~@RW96KjZe3wL8|;j^_eaRi1=nz*+Bm8XWqGBnGs(hUcW5w zm&IAk*XaJF10rCqM0|qd+i81u^)KF4j>KCZ%z7Aopz@WDciV{RN0}kMN%tdN+OeLG z3jGuF_|4mL7lA5x{QuhFC|djbJk^JL5Nxd$yw83%&0_qWqCZ=SPYko0A^W^)+wE6B z)7RbKhyM9uKA%nN%3-`|GHTy$1Q4EO`c(bU^_u4$Fryh%&*O9Sy@>eKTGh-)k8sQ6 zFkYE?K9A_yoPUTfHQe4~sM#Szu&d#v_IfS8#TVPG^h*6vU!_@V(O6!fy9~=34(y#jbi~btx8o%qahd=M)7ymh^J;&G(Q&z-Z>Vn>P z@3aJ0I;oGZ*MI9XUfrUwC;WFjx~F|T@G{jChgw-7z8 z5b?!$o7_MLhqSh?nx4zYHM)tS`{@A7^nk9r`Q8 zB!AyO6$_%l@VOu8ejE63_6O$M3$?FJ^$g%IS2efC*V1QNzqM)u8o#Zmj}8kos+RFi z3m=}|tEJ=qtu7{$zZfs4?0axGE!G6EzCb)K8iCU7+%aC@_IN(-b$&mUS5!Y1ajNUi zF<+^u{ciP=78m%OKPoRhnrYjjo)7bh_N421cRU7BO&6}8{N5Wg)hXuFWlrtOxK77p##MbcwWqT= z*4<+M6Y%_C+b|sHf7i?7&&99$wHMYOJhj)Q&Hae6v`Tq=Gw1udRN~dpxSJ z^m)JdbjGeif+730@~uBXfHZ^fE{dKTiV*?L5#F}`Uhx_@tg z#SKKb)S-!oyPe)X9kIS-==__$?RxF4D!IR{pW^HD5Al?pc(ZN4^!3n*r@l z&hhBGonH(PFh1e=Z=D~Od@~E3FT#VTxt37{2fd!hdYx{>H(riM8oQO{WSn|7Nm?UUl&L>9JtNcrXpd%lq$s2G#gs zDvb5ro!SEg2Xzx1h@bO%arvFya+NRE_lW~MGcp+DpH z;91A6|IKHfiv08Q^=`*EszOtJ4EfnK?p{>M@daqUG^xh=Nl)$lb?LI$Fn=F=I{s|e zpws<_@e|Lt*X^t?H>;HUi_i5>Hu*|rJpX%(63usx_Oqkx%ABf*#K?n28k@!OFC|~v)>&4RF_UmK&sY5)0_*#x_nx_0wp4WHx47<8t#B(jL zAFmqM)8%M?*#8B6TVG+k^IGz$XaQTkH|jaa*V&{xt9*m_EBUkpLArN{$MzqckA0Tx zsM1}{1+_o>Qekxj@gB##2>{xFs&0>DS^YMChn7OS7 z?hmy`&z?T#j`h#JBi`mV*RD5S-4neYE-bIR7VCeG+lSYV{q!JyVaTVU_M5NP8vPm7 zCsga|Y{2@$LickHwgc@^tu(LKjcxa4>D%M{`SX5WDq{}ywbY*lS=qR;$9hRgyqx*o z75$3wAoI0Mu0{y9Ks=Go@0+jAbs6T%C(Yk-JWKcG+n`z=-)0?lZxpG+{LTJ+!sM%8 z=ihqZMfI8W2u}7`FF8}X9|)shJ#)qW0z>>=%hO^(V^yZ0>+Rda)VId_mR{dw7c5PM z^^Bg*7Z=+!>ryH_w(|SFXMc{{H3s_|h+p(gW-EU2(~5Y=YJ_(V_}8(&?TUry4m>R! zA3c}JX3smSo9B~LT^zxN^{=O=>(4KXXp2F-QsNU;)xD`3l;?QZmZjrzxEAqfI=>su z-CSe+5wqOi`DM#(+>Us`!Q+YhtGeD{KDqPy<)znStTF#PIUa|}S-uwAg7r1Je?jTa zVnuvy;rP;2_Ws*(e!)TI`)=Ngsi{!k7VBXx=3C@v+f}{BcPV$%{m|oeJ{s-a zyHI;qeOa9~%P*cwug?~Pv2UHQ9>C)n9b|z8Zx7E8^!5bng!0~*d^bB5*mZiTkNZnE z=GwXk>lcp4J4e|f#_;{e`Z$K?ZBb6>4|)A;|AiO5f7J0%{dE|fnF9S!evuDZaQF3s z@$IzI`{+%}F0%#JXLISn1IDLj zqw8Cyp~-KYU(fvhMvLyzH{#XYemKnDW#l<$9S~nVMjG$- z9U>0foMOF!?vJV6yBsItRlHu_7~8(+(y*RJ{drRyw?#lvHN0PG+Vd^PmL7!*`SH`| z7;G8buP&hLGiD8d6!@#?{GX<*-y7@sH;->O^X#o3fBhS^PYc#Q{5v8({g5AiEs8$N zFyG?!MqBN!2r&QY`2BLO-g%<<8^zP^>vGFFYE?euH-kG)71YabEV#_Tz^B&z?0PgN#c9<#(fB02u>S=uteUw0eEOk9clPVw==}CuXNZ9#9>?t& zqQjf((gpD$x*h~y@hU~UaG?6%^-_NW=7aCC{H}i)9(%V9+WVKjZ^>JPr!app9B;od zFT)J9QgcB4)4rA0{h+_C9Pxp$V);%6^UIyeFIQCHP+`8Bk$(ZkuVeM>s^j^1JG{?% zJRkNaP-Nw#fa|HVPBl-}MFX(0pirEUzbEHvx9<{MP3zji2kP5B3cEc^2NEgQbjnIj|l! zun)y}uiN@zy`TG|w=DaiyHnMaT^!}qchm=Pn+xnW zBwm(UUv@|Q)N*`c+SBf=+=lor)knVeXTM{-Ww^huuB*ARS59e;uVHpOT^ZKr2X0^b zy|~83YW3~=?|!HEa@(TIR8UjIp3n_E%8*p!dv8?|}VZ{CHbW% z!%XeM`Y`V=K=^g>dz)iF5AoQSWwnfmCxen-eXL7RzWssrirc#{z;4SL@z;U(LlnNk zdR=*{sVCn?-#6W`VE$t1d=T5}I|NYG$@7=And+^@et>Tzewq>s4(D*9zo6@Rm*Tqh zf&HR9UcZXlAx4G$6AST;X$6`G>{n=ceF^bwtaoAmaQ!Ob8@G4ZK9V75rv{#H6zBWR{?}hmR9@%i+PwRT^*g%W zq951pE3rSoQTtg|h<!a}o_Gc{DYjHmfUEiKvx?2!`u6h3RA>iET0pr1f+N*S&-+nGyZ5L?JzDE`ctZp0jp0VBD~m7#`B9Uzy_+}#r{8PPwbNhYmL`3U+~y~ ziKX7({uVkuookF}G2g#A{$l64zgO%RX?T9uRzun9Nvn+8&ul2};s8%qOZ@!ywxvgh z`RvN|cb8c)1lX^((fvu?TFg(0{V>dDZxMaRhE#P7)Lxvyr-K*!E83Cn2bNd5uF$!1 zy#LL2cF@6!^-JE*n4asmb=ZGfa{TnGr(yWe{_HFHkIi+qT5&&um-@5)?S38NjQvA& zKXI$KDR^GY=V^R+7SE7h^{6`D|822PyS%dz`{C(&K3xRod<5#+sXaFKwfk?ri)}>Y zt3d!PxUj#L$5;K3y?3yC#Ix!8>@hZZvtmC5*H2!a-v0K3_q-mC)^sWHg~~s~E7qS8 z(Rn@MZFK*#~qWu<{N8CukZ54&b_Ko6VErRv777X zxBrXBXXSPpw5ix%e;&W{|FEyAe-MvD6!Q1F#J-u}#D4RPUa|j)_se?B1&$Bv zp|7Lwe@cXN3hd92{hM9(J=QBeXPyK5 zVJW^4tb@gf3i|`NKgE99VZwhD!d}1fw*Ba{^~8S6f?m&0;Czq$7WGIxA>NG@C#)A7 zyx%;pa^21y_H(r~9_Z|n`yI~%j65D}_re7o=AQ@0n|teu`?nwHv*hPhKK|U%-;Xu5 z4=?sI{BDrKI>PUK5c-*d6Z<_EUN6U7qYQ=*`+aNbFRpL3dVVsT5ApS^d(fvf=7XND zx7jlE?rn+vjMTp57+$$xZ`H=_V}RY2&w=^N`qBMdpW&)^ovAaY_N+EHK9BKG_fmbF zDP|NJ&vTq5^&jhg*3*mr@!5#iZ~Qby+?e0al-*l3t&fU1I+S=EJ2{>-7e2gFBxK<)dJ+M&aW4)#OP{ln^4bz_S&_8$^IUy$VkdT^C5 zGMHBONNY@F-v2J0Eyul)JMPdF_%_CNA|wWS%W5nHHmzn0(o>E7FO$Nc2Wh(GL3 z$aRh9Wlmm?!QR-m35F8$Bl5j`&ay45N)0>l)_2t}BAy}sPW~ZmGtO8ONBp1e_w8<5 zd4u)4hWeWh?Q=GwebSCzkL$N$J1xflJU+m-v3YJDi~S(!@0NMGAM^(~ z@#_24WFz)_T|Kq`*bTCelW#Fz=lB2`Pz<%PU;Ux)zmF0t(%Ap=NWA1Ku;mB)m;Pft z2eUPdpdO6JiO;S$bcQ*J^1T0aobJlhm>*jnA7ZGFr@Jinv+?-XVf(>RHy-^N`R4F+ z=2l~WC3Xo@{a^tF8@>@=;{5@x*TIDc3a~y*e#|?T!_AB9ZwmaAVzF{IX$w7r9UcS5%e+6W+k)z7 z(hBVp-Oov5h3!Clre*!U(piJP2=Pg3Z}VwzPirw>$Z0&e>!zFL9`TQx>Z_Yl|BcuW zo6g+db?Ju(O0gcs^JR~@1Qy62^=Z2Q{e&Hel4iWw_on1 z_5<-QJOZ?Xx0mKO=T^-oTYuv@y1zTTJ=(cMebf8ZhZTvX!+r%G5C5M3ISrn-z&g_J z{BFbs@c<~|-#niwJi=La|Lu>Z`Y{#4mFBoQvMZdbh{#@dH#B;-&{>5`9YA?U#o6uxEYU1&7hQ-2Qy0D%yk^koC z+U3Uc8;<99b-kcRpKmp@55 zzhnMD*FWNE;iD@bluzT860r>bVZY?S`;}gYg~9>x0kiUWGA*zh66ZUxpC8s0Fhs%n z&P4ai&PRzY`iM8qbUzC37dK;n!sF?B@OY?m73Oa_KhNnkX0Y{%{htBxR}XVh+qS}f z4eFopFwfQPX{qLuuCJK7dn&PiuBhnqu1PV!#(sw`AU>~t8_-;W_mAddSl!9iWkq>8 zmDev0k&_zn=#kpL^Tcc#4?ro?@O-Pp1H!-gLuaV`eY)`Y51wz9`~M+8&`)+z1M}pv zw|a^I`*-;HE{wL)7SBFmzcHWxQ>BN+^ColJ{yp3N_iX#$v+aM+w*Nib{`YMAZ|w2+ zZ2RA{?SId<|2^CO_iX#$v+ckB;P2V?zh~S3o^Ahow*Bwf_P=M_fBnJVv+aM+w*Nib z{`YMA-?Qz1&$j>igTH6n|DJ9Cd$#@W+4jF@+y9-jd0NWTQl6Ibw3KJ0JR{{9DbGlGM#?i%o{{p5 zlxL(oBjs5s&q{e#%Cl0QmGZ2VXQezVYu zl$S_(iIkT}d5M&lNO_5rmq>XDmj^+JYotb$zg(UUxI7(jdH8K}d7sPE0hgx(E>8zi zp7^1~5By99A18ij@dH0KEdRfhCw^%0LyI3;{J<{-^XJ76Eq-Y6LyI3;{Ltcu7C*H3 zfgF-tj`*R)4=sM+H{a!bIY043iyvD2(Bg*{KeYIv#SblhXz@dfA6op-;)fPLwD_UL z4=sLZ@dKGq_`JjqEq-Y6LyI3;{Ltcu7C*H3p~Vj^erWMSiyvD2(Bg*{KeYIv#Sblh zXz@dfA6op-;)fPLwD_UL4=sLZ@k5IrTKv%BhZaAy_@TuQEq-Y6LyI3;{Ltcu7C*H3 zp~Vj^erWMSiyvD2Ko3LpZNv}!c9Xnjo{jin#1A8Wn1FdU;)fAGjQC;152T9X^284# zei-q?h#yA!4%J-Ga*(KaBWc#1A8W81ci1A4dEz;s-L!ayjCM z5kK%-d-DIw^@<-x{4nB&5kHLhVZ;w3ei-q?h#yA$Fye<1KaBWc#1A8W81ci1A4dE@ z)-XOl@xzE8M*J}1hY>%F_+i8kBYqh1!-yY7{4nB&5kHLhVZ;w3ei-q?h#yA$Fye<1 zKaBWc#1A8W81ci1A4dEz;)fAGjQC;14%F_+i8kBYqh1!-yY7 z{4nB&6+f)_VFTs`sd}mYt@vTZ4=a9H@xzKAR{XHyhZR4p_+iBlob5_z^aF&HP#EKdks+ z#SbffSn&ftZpg=pA6ERZ;s<`)P2OkUtoUKY4=a9H@xzKAR{XHyhZR4p_+iBlD}Gq< z!-^kP{IKGO6+f)_VZ{$CepvCtiXT?|u;PamKdks+#SbffSns( zKajPQ?xzz!@KbN{n(wa@Kb-jC#1CW(;?Id6PW*7Ni62hs(Kb-jC#1AKaIPt?t|KY?BCw@5b!-*eG{BYuj6F;2z z;lvLoemLnrocQ6y4<~*&@xzH9_(^`QPw~TvA5Q#m;)fGIocQ6y4<~*&@xzH9PW*7< zhZ8@X_~FD4Cw@5b!-*eG{BYuj6F;2z;lvLoemL>Ni62hs(Kb-jC#1AKaIPt@Y zA5Q#m;)fGIocQ6y4<~*&@xzH9PW*7%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`o zBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OM zKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE z@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>% z6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#JLh&OMKSJ>%6hA`oBNRVE@go#J zLh&OMKO*rX5< zKO*rX5i0=Ke%L?#w|_>?(0olNr`~Vp zwfKMjzW><={@=Cv->#rb_qA`3!KC7h2*tD?`GSlHWkJ87KaM?ec_Cxe;OOBhrHG!(VkE!xd-jt*i5KzYNYfXV|TquQqvC;urYo7yNB;Tu*=u0d-Fq63P=f z2s4L_d@E(>LHggqd=oO3Ir{wD7yIOpF)iba%*S;171ENal{4O6Ro@Q1L57TsGU}Z9 zVK$_xQxj+OF7o4UR%8IaIAd12H*dwGRko96z&cxWJnk|!{xQ^Z`vRuah7t%h&dg5q{UG^ zXEfR!QV|)4jN?6JMg~#3p1ZD|`>v3Yjx+ioy`*W8Qbi4Z z|6N}`uk+zfWKgN;dIx0Ys_Uvn258Dyv_0jtBMlxhSkwI|4f3V6g;P~P8CDA9b9Bq| z%Lql^cRHj3&XBE&kB(-?dSQ4Ms%_o||$( zg4GTgVhZxtWXO=4)}KmGdVe|dcT7uUh~o@E^IUIznZL-mOBrLXS}(b~@%e`81L-%5 z^+3kh#?$xZY4+U99H^NyG#kC9d3GRUYs(qrf_FSKWH50ZWi&CRMampI9k6^wL!3)0avXTSbO#^rBsa{bFlvvEd4-KF~7aevd5&iC*I67u2m zC)dxjO;wToGM-(WVd(n;vmoPTa8vueT)&L&sLypL{$6vX$B2w(NM-*!pL87C?wbO% zU&MERUuPMN1{t~82j{mOS&7tIQT-snYY?o+SmZ4EesAM9BgHB*rV$s)nkp^A^{Z$8l?7+g=)5&!*T#9`ytUca`nLQ-$>5 z+kuQ?NaOrF|L?+f|urydy}Q^)NSGIEU;8H-ZR5ZQg% z`tHGqjOA3n`e{eoB7=3>} zMMiU^9VeeqSHW|^M^F97ouj+@Dr6Yt4BNxD4&R9kXnLmW(Q}^G$a$ugl`|%0nQqLR z!#`>d#w9OVErLn5Hy+QhSR5vn`R~esA*?w5g?^GWU zf9HmTk{a#jchUJ9KhX z^S$>2GOiAEzo6r3o_fNsq7xrOxxM{~49Q4*`m3LLdUVj&$Y94A%X70T5 z7WKvLzt`*BXUK@S&vbvzb#WKkU}TJ=^Lvo}cJ;_8xgF$3{oIY+uLI)^`g~>k(X2Z% zWV6p2nI)Ia7x0PBUw^L+kX91?HPu%$@5MWJ78#|;9ym4HbUq&O#8O5?=ugVP>H62r=HojdL-0bpjXuA!#(XN{Ujaih z`)V5|t2)Ujynp3e7s&8eQF&u_*F%Q!P+1UPYp%25wG%Q@vwvM4wEc#RgeTSKUgp`f zq5smHLDZWw9gt;8wVYAU&E3AfTdxAn@cIrta@eB(-Z{fzo_mvC&8ZeHf48U=wp7QxUkU^a@^sYr$TBM{@n)xlB_eDl`^e0R3yMNW3m3J^81KCO6 zzgz`|3)~vHGerWgbqEuM*7_E)Ju6y#Bb}bVPDVkdd7H3rsMK zzYL5wXEe+UTaRPeBBL6OH=c4FZHbJO&qqGG^S1YMAjADa?S)0Y+aC8o0qWoPpYCWo z`yc~aPWA2U3=K^4DSK0Wqwhkl`P-<8dB4orjrTFBmNTSbd^bORg^cc;VK6&y?S=vw zyDPe$+ot_cuE=m+)A{H5(&!uC{}j}I1~oEduJG$x`27w2Q-zG@*~;U&rL4{d;{n^y z^|kqjJAsUn$OHa6|9W+4K4HGprquq8gC z4vf=wGzuymiRa~Xy}8;8K2v?7f7+3O9vM0ZY7a{EXAaq&(SOnXSc0al?n7g|$MX}U zi2U|-SHnfun}WT(zRWlN> zW@-!Q`p)yQ6|zfWzC_p4`VPL=$l!O-{g}VXZ??zylglfc4Yc?Ocie z(bDy0NayWWWDIni(e)e;jL$HCF%{jPwEX&S!~CJ*49~^ns%&+)>Nq1{fqK3sWDL$n zDi8BdQw|s}Yz>Wvs>&f{=+~-!r1QmC=(@T)P-{l*S)j}8?!f2$5?@Vrjzx#|E#vve zFkE@5(VwpeeO|xor}r~c!AyMh$1pxmiSZ6+WX_$-?N>jle#ocgelFyk9+1J4`Xi%} zuJoKHHEZUjwOO5&T1_c^{$4Q~Xzi;;Zhw~m{Z)aC#LGwHB>I<09Xu zA59H1VAq_1z5AAGv}1=~siyi^*5e%R1@W4c_{-X*ZRf8B&&2Dn<)(IfkMR{{h;$IT zc-9j0Rr2#*p0E04Bo^KgEJ6-n%m=fFcv+4rdxtz%BWGNEk;E6IzKcU z^|LHR|unxc|(Cvd^ne4F$DdWw4$Xk|e8s_>#@@m} zsu}D82C|LU4v-L{BzhfSn{+9Rz{o!!B~cQo4~n9w55WH=MT(RuU8YH&AK)f%fc$|i z0=UW1z3*f;b_@h?`v3#XXx`_MMDp@}oOA9&+F$lL)tn4N#&PaL zHtB~G%e|FF2hc_sL+epIa+Xbv`sJqau3_}&h!gMkn&Z12;!zh~8iZIMKHLI>8vn>yEj*#UW{ZwXE0jd@@cfrS%AX zfkU|KR^Sxc_xov-Rih+M?B@Lc(I(4LHJA_1PrBg*rkZi$D%Ep3gF=%H2u}KhpE&+z;*mp4#*ECGC($oOm4~jc2da-Pt|> zAL7riJl)$N-!)TJVQ5aIUeSEYt=>H9(Mgg0nL5M$JFL%1 z{!SitwGt=Jnv(2iMtPU~kbq~<{Nn)bZBf`yxgdMm^0qe3jd*cWyaY^j6>gN`boBmk zzEQpTYG~P?sR+Ee#q-%dkxFbP;RNkuXg%hst{)(%h`%&nOXY&fb`=Zfr`L4@G67x| zIG=4BuOuKm(Qthg+qIlF4*(fXZL209!Y)T^`} zgC3iq@>WDX;r(3OwqCKH&XMv1fFbL?tt0Av+MoMfn+ua7%uMSY7o1@&&qE9ojmLSl zMpNo)>@f4Zs>jAwMIC2~Hdrj+g+-b~v2mYa^^*l|#+Vj!C zE9idv){fymkRNQ6FVt&cTn2su?cr;my{<#M2aRibf5ck@caeo=eC)d7sEeUN{3ibn z*ydO};EA=T>-*Nzy(GkU-tTQGrvZZ>fPcU1cXu&X?z-y`x6{ z>%Z_~S!;wIvSwk$-f$^X>wufwt9d5qt!-lx3TgcHSSzNTWHpNtdK+n(MB z)x>2zP5{pX+hbXI0M5XlCYt~Ly4LwU(fj(stDfoXCWrVPIev%K6eaSlhU0tfjcw!u zyy=whcna-t*7@RbP4}Os-BcO=ykmUFxDzh5sgaM6f9jDdV>=8YZRB6eeaw0>BTh`G zYgfv?sk;jKH{H*G9U5EUn+xMjsP6kNTI7o-*>mHfd|5(2?b!fd<`dSpvnz@QC&Wuh&u_rSouLB0$nkNGCJ3E{Z{#7q-#?_5Ne(;dJ)}R*w zAs~NrWRC}G@3F#odiHluhlKuFk>B$E1saDRZI!?mc>ZoTZ{r<<=opXhpK9#-8u%0Q zhefyOwM$AITrYzfs=5;OisO7r9aD1QM*YD2YbqDOm9Z0JLG}W?5hX%Gy}Q$V$y4_( zKBu@7UEgzan7jAj@96Vpn&+|yUX;0>pZ7Y>9q{@u|F@%>UERwca=z6&9Dr_6FWr&G z@9%c*)V_)<(fV!WQ5|u3{Q=pxya9+kM-nIdFB`*jhaLQY=KVY^vpzBY$o%Ynr}i`% zC&-^%8fSb)6eX=!(p_QK=@wJR z_6`1|TCQ6t#^0W+ntfVpp$>ZA&OhffS0(U1@?Ril9(iRWEc^2vy@sG%P){)arHa@O zW-y3{>~C>WeF)VdDo^_}0{%K@vjV?me<@)N2Tr_ixqfP`$prvd_(SsdPbv$q+6nb6 zeZM;!P{Qu52Wfuy78SEXzNji%zo8fhYtKf26MX06c$4J;^<~ZZN9(XLPv9@z!rwoN zr=N!zd=%xYwI0)ax(WV?|86d2NBGY=P(IW&%{7`Zi__5G3jiM5RW3p^zk0zLVMP=8 zM%qtXs$oy4$L^cvqr$fVe_p~c-rui5ON;e3k=7%u!|rTRis6gDv}PVr071$?<0js<%CWUx)}unaqx`AcA)eS#Z%vlg zJEHnt59mRzi|QMIH!?O)DK^#EZdqTcGvEBpu&RJRTiKAtE0G|T) zP+`4kJkNN}b(&|yFB<=S`F!;^^7ll~Ls_b?4Z@perTM$I#l*2lV&?j}>~hsqsCU|j z>_2QOn`cEn#P@5e1Y{TdhhzLoT@EGjv!lMD@%eT>)~13!fca6~w{3Gk&(U$bEc0~d z5_*TtQ9M%_>WRjH4;$h;|Hj&0S=0x0qIl~);MpzRqGUW4vDnuU`5$o4_w!3yro{k{ zKXzKbkU%sH)2sKO{dpd-FIQ6u)zJJX@L^?-{5b{6uTrZJqJSq=Z2xCC=c-wxXdKxa zs1Th~Ys9nB`)+n|zD9kxalAymGRdPlg%32pa*x`thXme1_ODy->*B~_yl6bjf`YA> zkWcge85`3hfMEY+if_7ZrS0xgASS)z>*b?%X)bZ{{fo{Y8T~YtiUZ^j~ z-trU75Q-jrD?QH^>dYPX!^ZO^J0!koivl&+d;e#f!!ZJ{sT|Euquzub`}qzupUbtv zJ4_4mDZ2k!_*!lf`ks>3TN!tswOIsyv*5j-t=bmwWE54V{p0!-7WeXxBdu560_feL zXQ()TZ=0=f75K`A`PiTlJp2xPYNPcVKyGy#_~^YL{Gz?Xjry_`lJUAF)qu33gFcC# zSM|s7m}L@WN%jP)U|;tDJgB4nTK8(w`)EWLC5?aZotfYdwwcCP-)Cqy3H;@u=Q#xE zYXBZRDZ1a2OV_R^^hP)Ry=u~yd(;z>`BSt8tGqqX>(pdlejQ}d$U=Zrqvwt0YLD&| zkRiO+`N3ow9l`H%`~^T8O7O=c>(!b)731~t9}UIJWxe5lAK+spt>2nq%w8e?XFP6P zws39018?R_Olp1aU;K&l;l|5-zM*&7R;dInGNx@-$DEX6IVk>6LTVL{Q1 z=h6F2>d3kppoe3B5Y(V^UK;Sl>b?KvhiA`r62(RNmU`Wr)C2GyT3?`9AaD>LX3h23 zTHl2{74R|IAO3hM)1W?p(|zw3)44l;?#O@Weia6jf(Kud>HB5Z-qiqq^Hopn)$ud{ zq=3gz{H>I2`on?mp6I$B7WlNW@G#gY-v>Dt#*zg;8jmFufP>iPsG2K^O{&*>sv z(2|I=p!uHQtgrUvgAZEoa_<131n?b->Z^X~A+S0Te|Wy6g_y}V$QO9L`#$TmM(E9$ zU!AVIb>R91;_5q}!&Ho;M15EU@=uWc#Y=*(GMUx~Fx?n>#D|0VW~H^73h+a*qtB-b z#SLm>;A>=0<8(c;27VaXzZ`lirvv-r(d5rY=o=K0TGVGWA8T1Qrpq(xQ?k!60f2A7 z$F*EPCj;L+M8-tp{xyF4585e4HP@xl94;7jhA z##630Bqr|F=h6Hf$gi`+{wXxsE5Ju6N`Ma=OP>eSa~Tc(bYgr$h9t{&0$;b2{g+Fb z&#p#%WIY?iaDA@8cYWp02YS5u=vg}(C4 zoj??O=i~PGl?zCJcdkFC zdKt8aKiPU({|Ed>(e1`ZH1wzJ-EESF*Rtrpcx^L?se z3i^V7QS^Sf4pm6dD`k%7_^As8{$UXIqW!qXs4@h*qDr*>IY5uPKTeeVK25*+$L(6c ziM;PO)`i|L@FPV@_5f^F_9ygQz$xFqcc$2j0s56#(EHyIpe=rezBkhN>phfb%*c<| z^8Ng_souukLf=UF(c?>r_zpgt^=$PxoN9yKXfJ5JZHw@3>lOMK+K*P|yI znwn?pfKS?y{Ilyu1$hhfo$L>zeGx4@?_@miTJ}M|{$Vh*Umh6Lej$Gtm_L!dHVTxp zfH2~H-!;$6Gb7)fSdVswuGLBP0xIqI@9u)*AD|xsiuYbiU6x${UoT5~pQ?j!V;Zu! zI3Bn2xelQpfrpbnbJ>C-0v}o2Q->6L_*!4fw8u>zQzm){gbdH_-ae-4132`C85R^qwOWV%YyjPy5}i57Y$? z{9RA>c7_78f3>z3^z(O(dl ze``}Z*9P-fE%ZK{UbmvxBlLQ7{|Q_%N|sYR{4250CR||!Ut)W@e>F8_a`hlO#$TZS z_eIRmo3E7rhSF!{Z z9DggND{B$YE$hv}UB>anmm5v*tM@7ZYC5og$bND$%KX|_chY>GRoGoW8$6%q(_JM5 zY`u6GAFfir%HF>C3%&mcHR-Vqz-LeLCs*r0Ng|$~%(u2qmrxK(p}1ZL|NlVJ*ou|) zNyD7m5j8dR8}vMcuc1%KPh24Ty^!1XE&St|C_VtX@Bx&#I0}mQh@JqDGvfKh^|mxm zT%QB_U(R2vS++o|MeAw2Z2|fYfI8wY8ur&ig!@vce>Ckc z2W`ATZ6P#|Pr6OV2Y6t^cv^7`?QClWK9KF*RC=Au75YC~&vYOG+u$Fap}*fdgu43$ z`wTR`P^IgbQEx)j{EjcXr|UqP2+#PY4KozF;0MrE^ZtDfyG%3q!;0$zH8?rB68Svq z&u58X`2a6VJb;)^U+fI@DE&qIx7x(TV57c=WKI%gdMEc9H=msI1mbpD#bPm_O1ZJf~~^@!AveIKY603kt7!|@C1 z;Te#$6WvDhsX7n-u0Z{}lRvvIH9Z-6_2VRa`rTHr_x=3>eQAJR3Ml-0txydqaDL)o z{|Y)i7SkS)-;urRVM*o!zht<6sLM&7<*lK&r|~~)A;}*n);AiRwe7)=ZQP&L@59|} z*q?Hw{jW?>Da2ymAIlxZyRBWJp0a_VRLeDlPP%hU~pLZ5o10$VbWEQUhXj zyTGq8-f&;8?E%R{pFnu?xGl39QiuKtTA!(x_u~=Yl;iQ0Y0VJC36KIb-%Yhi4|{X0 zf5UuSxdMKu66ZJZ@N0qmBKB0@AUlm29X_x}^1t^5co!{NB8_Ap{ZSZD)ZqKS{N`OdL3;jE1-t0$?N6fnC-C^nAiuAeABS{eUjP6L2t{c9(aWdq3i-}J;~9eOLIMAx zJ-v@XL4%f-MmV<5Fn13k%7pkE$9gK1Px3h?_gK$#w2Sr<>j4$TJN{)26QE4s=?&X&uUj*o;Pbhk#^l(ym2U*R();6of1*$Auov)i_D_J(jTv_EO9#cnG(Y$m^Ba2h zK=Y~VuIaNem@nR+FZ%VA4*GB!PYgxW0rBz6zt-5dAUM$<$o%`f6}xrNQxqNVkGq`C z75FV=%kTTj>44G;dMo#(2O3oFJ@Wg3<1LyK&&8~zFoC{5-v!uj-$0UEzK`rOel#T1^c4$B08SX=p&wTKUJ*p#&7?poXK7< z=!O=1cBoHiK96uf*$+L*#r+Z}uAy|seszZOj}5pn6n6pfl-J_~VBAALQL~;nh27@} ze#mfrxn5{aJJ7GufAz1fPIm+FuJ1CZqTXt>WdhUjkN?Ka}XUkdMw2#jm~W zO@mm5{FnSk8KPYy@;Pg0KJsiLs0kxLgT3!Fqdv=kaG`gj`$G%10Nz0UIgH{Te*T!vx!`wcMP$Bzy_XF$tVPFscna09y!?;l`rd7^ z3={e*I`&6Bx=mXE*y7>-Ifpv8fS?um#qrJu^hL{1TGSJ)Ujmd>xecdWjW@;nYR>h9 z-_a9;rg+&wr!z?C{h$k=^_uJg4CRErney!e)rD%oXSWa81Hz8&O7J;5=U>1}Zzs|3 zHnRSzg*eO_^wZ>m)@wTNrA9?1Abff6U&i{G(lSFoPWC9rXl_X4V866~3w=Fq2H%Uk z{QbO{({UH@zh&QjdfVGiZ~LdW{nOk2>1}6h!>23e?wtsrtKfUc#JA8WEKfUdr z-u6##`=_`4)7wti!Kb(V)7$>(ZU6MPe|pE$|Ma$hdfPv}?VsNEPjCC1AAfq= zKfUdr-u6##`=_`4)7$>WgHLb!r?>sn+y3co|Ma$hdfVT4@ab*;^tOL`+dsYSpWgOQ zZ~Ge$KE3Uq-u6##`=_`4)7$>(ZGYpz`RQ%{^tOL`+wt3mpWgP@AE-}n`=_`4)7$>( zZU6MPQ$Nb5xBb)G{{P+E{_QXR{NH{TG=8tTOaH1}(}I8P&Ct#IyWjifyFd7&Z-4&n z*#6Ns{GY$Sr#LRX{5#hruD|~e|NIyK@)y7P)zAL$yFd7a`n{ih^NaV3-+lA_fBR?O z|J8(le)Y58{QRHbr1+ozq~NpPzb+8KfAwFcAHVg(Grqq1w?Fy*um1KY_{491j>F=& z;yv{VhnOtyY4YcJclZgyV1GPK{vZ0l`;`CnKfnEZk17A}$KWIX=;wU@pZ?~j81*-p zjQ{*MKmGBE|7SXW`1bGlP%N zD^LA>;rCzbTfb8yah4>0ZR&o0oSJ{=1MhSG`mcZg?>*=5ObtHrkABYg|KqnbHGlHw zf58?f{#}=TnY*};>+(zdc({&icaKa;j><)0PO gn&MyosnXVTTI0x#KmHfr{MT>4`Q|VF&A*rb8*!6w7ytkO literal 0 HcmV?d00001 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml index 8a3aaef8a699..75808cd7d66e 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml @@ -2,7 +2,7 @@ interactions: - request: body: ' - 1.0truetruetrue5' + 1.0truefalsetrue5' headers: Accept: - application/xml @@ -11,17 +11,17 @@ interactions: Connection: - keep-alive Content-Length: - - '267' + - '268' Content-Type: - application/xml User-Agent: - - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 7675879d-9bea-11eb-9017-c8348e5fffbf + - 3249dac5-a7c6-11eb-b681-c8348e5fffbf x-ms-date: - - Mon, 12 Apr 2021 23:54:47 GMT + - Wed, 28 Apr 2021 02:05:25 GMT x-ms-version: - - '2020-06-12' + - '2020-08-04' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: @@ -31,13 +31,13 @@ interactions: Content-Length: - '0' Date: - - Mon, 12 Apr 2021 23:54:47 GMT + - Wed, 28 Apr 2021 02:05:24 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 x-ms-request-id: - - e5c9e03f-801e-0055-5cf7-2f5d2b000000 + - 80857b38-d01e-0044-6ed2-3bf560000000 x-ms-version: - - '2020-06-12' + - '2020-08-04' status: code: 202 message: Accepted @@ -51,32 +51,32 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - 76e307d5-9bea-11eb-9616-c8348e5fffbf + - 32788c99-a7c6-11eb-8724-c8348e5fffbf x-ms-date: - - Mon, 12 Apr 2021 23:54:48 GMT + - Wed, 28 Apr 2021 02:05:25 GMT x-ms-version: - - '2020-06-12' + - '2020-08-04' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0falsefalsetrue5falsefalse2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html" headers: Content-Type: - application/xml Date: - - Mon, 12 Apr 2021 23:54:47 GMT + - Wed, 28 Apr 2021 02:05:24 GMT Server: - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: - chunked x-ms-request-id: - - e5c9e0ab-801e-0055-14f7-2f5d2b000000 + - 80857bb9-d01e-0044-5bd2-3bf560000000 x-ms-version: - - '2020-06-12' + - '2020-08-04' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml index 8dea1faa9409..f1e279a11dc7 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml @@ -2,22 +2,22 @@ interactions: - request: body: ' - 1.0truetruetrue5' + 1.0truefalsetrue5' headers: Accept: - application/xml Content-Length: - - '267' + - '268' Content-Type: - application/xml User-Agent: - - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - d182be6d-9bea-11eb-8465-c8348e5fffbf + - 2b37dee6-a7c6-11eb-9248-c8348e5fffbf x-ms-date: - - Mon, 12 Apr 2021 23:57:20 GMT + - Wed, 28 Apr 2021 02:05:13 GMT x-ms-version: - - '2020-06-12' + - '2020-08-04' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: @@ -25,42 +25,42 @@ interactions: string: '' headers: Content-Length: '0' - Date: Mon, 12 Apr 2021 23:57:19 GMT + Date: Wed, 28 Apr 2021 02:05:12 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 - x-ms-request-id: 40d35052-701e-006e-50f7-2f188f000000 - x-ms-version: '2020-06-12' + x-ms-request-id: 59421d43-b01e-006d-32d2-3bcb14000000 + x-ms-version: '2020-08-04' status: code: 202 message: Accepted - url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties + url: https://seannse.blob.core.windows.net/?restype=service&comp=properties - request: body: null headers: Accept: - application/xml User-Agent: - - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-client-request-id: - - d1c4844a-9bea-11eb-be81-c8348e5fffbf + - 2b50bdfa-a7c6-11eb-a412-c8348e5fffbf x-ms-date: - - Mon, 12 Apr 2021 23:57:20 GMT + - Wed, 28 Apr 2021 02:05:13 GMT x-ms-version: - - '2020-06-12' + - '2020-08-04' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html" headers: Content-Type: application/xml - Date: Mon, 12 Apr 2021 23:57:19 GMT + Date: Wed, 28 Apr 2021 02:05:12 GMT Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 Transfer-Encoding: chunked - x-ms-request-id: 40d350ad-701e-006e-03f7-2f188f000000 - x-ms-version: '2020-06-12' + x-ms-request-id: 59421dd9-b01e-006d-03d2-3bcb14000000 + x-ms-version: '2020-08-04' status: code: 200 message: OK - url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties + url: https://seannse.blob.core.windows.net/?restype=service&comp=properties version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml new file mode 100644 index 000000000000..227c3694ab89 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml @@ -0,0 +1,1643 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 60cf3f29-996d-11eb-a886-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:21 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:21 GMT + ETag: + - '"0x8D8FB9145645382"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:22 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b503-101f-0007-357a-2d398a000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 6137edf4-996d-11eb-b015-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:22 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=append&position=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:21 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b504-101f-0007-367a-2d398a000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + If-Match: + - '"0x8D8FB9145645382"' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 615e1394-996d-11eb-915d-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:22 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=flush&position=80087&close=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:22 GMT + ETag: + - '"0x8D8FB9145A3D919"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:23 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1577b505-101f-0007-377a-2d398a000000 + x-ms-request-server-encrypted: + - 'false' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + SQLselect * from blobstorage + where id < 1;parquet + ' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '293' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 617433b5-996d-11eb-a99a-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:23 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-08-04' + method: POST + uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query + response: + body: + string: !!binary | + T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi + OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh + dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll + ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg + ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg + ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t + Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk + b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i + LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg + ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig + cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg + YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y + aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz + IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK + ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg + ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg + Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg + ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg + ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi + ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv + Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg + ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w + cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0 + aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz + U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt + YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg + ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg + ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz + IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg + Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu + ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl + LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs + ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw + ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh + bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgDTcqc2iYsPRaCt87a9W16y + AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwrTcqc2iYsPRaCt87a9W16yAg4Ewu4EruMJ + 03KnNomLD0WgrfO2vVtesgIIBq7jCdNypzaJiw9FoK3ztr1bXrI= + headers: + Accept-Ranges: + - bytes + Content-Type: + - avro/binary + Date: + - Fri, 09 Apr 2021 19:54:23 GMT + ETag: + - '"0x8D8FB9145A3D919"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Fri, 09 Apr 2021 04:03:15 GMT + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 6f7f6af3-e01e-0012-6f7a-2dfb13000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-08-04' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml new file mode 100644 index 000000000000..c408d32ecffa --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml @@ -0,0 +1,1542 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66737680-996d-11eb-a17f-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:31 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + ETag: + - '"0x8D8FB914AE5DEAD"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:31 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce30-501f-000b-7c7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: !!binary | + UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA + ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA + MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC + AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA + MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC + AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA + NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC + AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA + NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC + AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA + ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC + AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx + MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx + MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx + AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD + AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA + AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA + ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA + MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx + NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3 + MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4 + AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD + AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA + AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA + ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA + MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy + MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy + NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1 + AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD + AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA + AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA + ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA + MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy + NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4 + NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky + AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD + AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA + AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA + ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA + MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz + MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0 + MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5 + AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD + AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA + AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA + ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA + MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz + OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5 + OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2 + AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD + AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA + AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA + ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA + NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0 + NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1 + NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz + AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED + AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA + AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA + ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA + NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1 + MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx + MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw + AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD + AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA + AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA + ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA + NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1 + NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2 + OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3 + AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD + AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA + AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA + ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA + NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2 + MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy + NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0 + AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID + AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA + AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA + ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA + NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2 + NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4 + MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx + AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD + AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA + AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA + ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA + NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3 + MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0 + MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4 + AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD + AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA + AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA + ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA + NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3 + ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5 + NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1 + AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD + AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA + AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA + ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA + ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4 + NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1 + NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy + AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD + AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA + AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA + ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA + ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5 + MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx + MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5 + AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD + AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA + AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA + ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA + OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5 + NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2 + OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2 + AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD + AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA + AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi + bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw + DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1 + dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA + AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl + NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA + M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu + d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0 + aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w + MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz + ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM + AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn + aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA + AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy + LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0 + eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h + bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn + b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm + DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz + Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA + AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj + Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA + bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu + dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy + ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1 + ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy + NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM + AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh + dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA + AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0 + LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0 + dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54 + aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1 + ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly + DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1 + ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA + AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6 + ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA + ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku + MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu + cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr + bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy + NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM + AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv + czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA + AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n + LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6 + cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n + ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl + cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo + DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o + eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA + AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y + cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA + bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u + cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo + Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi + dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0 + Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M + AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11 + bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA + AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy + LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw + aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o + dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy + b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn + DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz + eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA + AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs + bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA + b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu + M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1 + anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1 + bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw + MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM + AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu + dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA + AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu + LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr + NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p + cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo + MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky + DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0 + a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA + AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2 + eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA + cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu + cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz + Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz + dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3 + MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM + AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx + NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA + AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy + LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6 + d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y + ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq + MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz + DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi + bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA + AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3 + NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA + dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu + cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx + MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw + bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt + bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M + AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz + cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA + AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp + LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3 + ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v + a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh + YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly + DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw + dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA + AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk + ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA + bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su + YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm + eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq + bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3 + cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M + AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo + YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA + AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52 + LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy + cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v + bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0 + Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s + DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n + ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA + AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft + Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA + YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu + eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj + dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz + MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4 + bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM + AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj + eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA + AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt + LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1 + aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p + ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk + Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj + DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi + ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA + AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx + dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA + ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu + MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj + c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj + cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40 + cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM + AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0 + YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA + AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0 + LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy + ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n + dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi + Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96 + DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk + ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA + AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw + by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA + bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu + cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z + Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx + YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0 + ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM + AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0 + enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA + AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4 + Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt + YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n + eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx + YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw + DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3 + eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA + AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll + aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA + MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu + bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj + bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj + MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv + M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM + AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4 + ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA + AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0 + LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw + b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56 + YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q + MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz + DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw + cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA + AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n + Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA + bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu + dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw + cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn + dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n + MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM + AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5 + M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA + AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs + Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs + YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y + amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk + d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx + DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx + MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA + AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi + bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA + a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu + NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz + eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1 + dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1 + eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM + AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3 + dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA + ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv + LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp + c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55 + bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz + MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1 + DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu + eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA + AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5 + aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA + eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou + c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx + YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw + ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv + Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM + AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l + MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA + AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy + Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk + a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o + ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs + bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m + DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5 + cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA + AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs + aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA + Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu + cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1 + bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt + cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0 + NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM + AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u + bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA + AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4 + Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx + MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54 + eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp + NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh + DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp + Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA + AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo + NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA + b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu + eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm + ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky + YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi + aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM + AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx + MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA + AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy + LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn + M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p + d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh + czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o + DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0 + ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA + AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2 + cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA + NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu + ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw + NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3 + aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh + dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz + FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l + YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z + amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz + DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr + a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA + AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx + ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA + bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu + Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1 + MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4 + YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow + ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM + AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5 + ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA + AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5 + Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv + eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o + dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3 + aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw + DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk + NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA + AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v + by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA + cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu + cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6 + dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn + ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz + emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM + AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw + MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA + AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1 + LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt + bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t + NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt + NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5 + DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw + aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA + AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx + ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA + bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu + eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr + dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp + ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3 + dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM + AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm + eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA + AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4 + LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm + MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51 + bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm + Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x + DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0 + cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA + AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv + dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA + YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu + YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk + eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2 + cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi + eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM + AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn + cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA + AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy + LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu + bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z + b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1 + eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy + DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3 + Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA + AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz + Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA + eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu + dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy + MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq + ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp + MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM + AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1 + eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA + AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0 + LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy + Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41 + ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm + Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo + DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3 + b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA + AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251 + ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA + anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu + YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1 + bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw + NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw + aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM + AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs + MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA + AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl + LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5 + Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p + cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv + MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw + DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz + MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA + AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy + di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA + ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu + ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq + cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu + dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s + YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM + AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm + cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA + AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx + LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx + ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53 + MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls + ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk + DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1 + ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA + AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky + bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA + MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu + Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx + bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96 + bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i + aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM + AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6 + dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA + AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q + LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo + c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k + MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1 + MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj + DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj + bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA + AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu + MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA + d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu + eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz + dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz + cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3 + ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM + AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv + NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA + AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm + LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0 + cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41 + ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5 + bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5 + DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr + NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA + AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js + aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA + MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu + MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr + NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz + dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y + cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM + AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0 + NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA + AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y + LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx + bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54 + NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl + aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2 + DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr + bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA + AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz + Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA + aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu + NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx + ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4 + dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz + eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM + AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y + d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA + AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq + LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4 + a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x + bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No + cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr + DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm + ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA + AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj + My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA + dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu + dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx + ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0 + eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz + Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM + AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz + bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA + AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0 + LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5 + anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40 + d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz + emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx + DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1 + c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA + AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv + dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA + bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku + bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1 + eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy + eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn + enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM + AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw + cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA + ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5 + LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp + ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t + cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr + ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv + DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj + dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA + AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1 + dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA + eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu + NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm + eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy + ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl + bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM + AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx + dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA + AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv + Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2 + enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y + cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx + cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6 + DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr + Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA + AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy + bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA + MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u + anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow + YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3 + aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq + MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M + AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs + djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA + AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy + LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj + djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o + a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw + YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl + DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn + b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA + AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx + My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA + eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu + dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj + eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli + cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl + aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM + AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw + anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA + ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv + LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz + bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s + Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj + c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw + DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr + dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA + AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0 + di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA + YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu + dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x + dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3 + agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41 + cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM + AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81 + MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA + AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu + LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu + cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u + M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo + M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0 + DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht + MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA + AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh + ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA + MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku + ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs + c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw + FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw + MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx + MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3 + BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE + AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA + AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA + ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA + MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx + MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw + NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2 + NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0 + BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE + AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA + AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA + ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA + MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx + MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx + MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy + NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx + BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE + AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA + AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA + ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA + MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx + MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx + NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4 + MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4 + BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE + AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA + AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA + ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA + MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx + MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy + MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz + OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1 + BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE + AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA + AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA + ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA + MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx + MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy + ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5 + NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy + BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE + AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA + AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA + ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA + MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx + MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz + NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1 + MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5 + BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE + AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA + AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA + ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA + MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx + Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0 + MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw + OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2 + BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME + AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA + AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA + ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA + MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx + NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0 + NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2 + NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz + BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE + AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA + AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA + ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA + MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx + NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1 + MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy + MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw + BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE + AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA + AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA + ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA + MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx + NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1 + NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4 + MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3 + BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE + AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA + AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA + ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA + MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx + NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2 + MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz + NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0 + BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE + AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA + AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA + ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA + MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx + NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2 + ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5 + NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx + BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE + AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA + AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA + ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA + MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx + NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3 + NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1 + MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4 + BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE + AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA + AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA + ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA + MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx + Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4 + MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw + OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1 + BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE + AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA + AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA + ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA + MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx + ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4 + NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2 + NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy + BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE + AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA + AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA + ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA + MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx + OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5 + MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky + MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5 + BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE + AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA + AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA + ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA + MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx + OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5 + NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3 + OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2 + BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME + AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB + LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5 + YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr + DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0 + MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA + AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy + dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA + dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu + ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5 + dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0 + cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3 + MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM + AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls + d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA + AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1 + LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1 + NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x + dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p + b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q + DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq + cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA + AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl + di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA + Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku + b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4 + aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj + NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0 + M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM + AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw + YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA + AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu + Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv + dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j + MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu + eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz + DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw + eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA + AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn + NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA + MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu + eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u + eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx + cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1 + dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM + AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6 + M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA + AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw + LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy + NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55 + ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj + dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi + DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs + aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA + AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi + eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA + NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu + bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0 + MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv + dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv + cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM + AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0 + aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA + AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy + LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2 + MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52 + Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl + ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt + DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1 + c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA + AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0 + ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA + Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu + cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6 + dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm + bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy + ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM + AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4 + ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA + AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw + LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu + a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z + b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk + eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt + DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt + M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA + AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj + Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA + Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou + d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3 + MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz + cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0 + cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM + AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1 + bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA + AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo + LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl + bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h + Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt + MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps + DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1 + MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA + AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3 + eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA + czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu + a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz + cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1 + dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx + bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M + AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2 + Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA + AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1 + LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx + ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y + ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp + Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14 + DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2 + dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA + AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj + di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA + ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu + cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy + d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx + egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1 + Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM + AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk + MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA + AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0 + LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs + bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k + aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py + MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu + DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz + ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA + AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl + Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA + Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu + c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt + Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu + dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm + bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM + AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p + YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA + AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi + LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk + ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41 + M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw + emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji + DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp + Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA + AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv + dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA + ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u + YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr + MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y + cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx + bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM + AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm + d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA + AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl + LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6 + aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t + bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq + a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1 + DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0 + cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA + AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk + Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA + YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu + NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6 + cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq + MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5 + dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM + AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0 + cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA + ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu + Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr + b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p + NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x + cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi + DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh + MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA + AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq + dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA + cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu + bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj + eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs + dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli + ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM + AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk + YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA + AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx + LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp + bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j + bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv + NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs + DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy + ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA + AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw + NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA + eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou + MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj + MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx + NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo + M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM + AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu + b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA + ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1 + Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2 + cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y + NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1 + Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs + DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti + ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA + AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj + cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA + Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u + bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt + dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl + YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl + dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM + AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt + NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA + AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx + LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4 + cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s + MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp + MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx + DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo + cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA + AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz + di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA + MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u + amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq + cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi + bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01 + bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM + AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1 + MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA + ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1 + LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw + ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40 + eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv + dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi + DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6 + djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA + AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01 + aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA + bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu + cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4 + amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s + aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx + MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM + AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h + eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA + AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv + Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy + azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53 + cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1 + a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx + DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk + M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA + AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi + Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA + bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au + aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm + bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0 + ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4 + ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM + AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5 + c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA + AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq + LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk + dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q + Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj + aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry + DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk + Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA + AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2 + YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA + andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu + aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw + NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy + ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1 + eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz + FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m + aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl + ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty + DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm + aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA + AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1 + cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA + aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u + bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5 + aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv + cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4 + d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M + AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi + YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA + ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy + LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy + Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z + dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt + ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm + DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np + YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA + AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp + YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA + aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu + djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo + NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j + cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m + ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM + AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx + YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA + AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz + LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2 + Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x + YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj + NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90 + DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm + amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA + AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk + NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA + bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu + cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z + cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl + eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj + cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM + AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl + MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA + AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn + LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx + cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z + ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj + Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw + DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv + aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA + AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt + ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA + aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu + MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy + cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs + egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox + dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM + AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4 + dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA + AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1 + LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj + cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p + YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4 + ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx + DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv + aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA + AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj + cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA + b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu + NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk + eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi + ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6 + MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM + AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk + cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA + AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1 + LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi + c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54 + YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0 + NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp + DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu + and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA + AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu + by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA + MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu + Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq + b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk + bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr + Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM + AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj + NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA + AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl + LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy + MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m + ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps + Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh + DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1 + azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA + AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1 + bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA + bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou + dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r + bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq + cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0 + em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM + AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx + bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA + AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4 + LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3 + M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o + cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv + Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3 + DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk + c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA + AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di + Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA + d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu + YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp + d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt + egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh + ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM + AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z + a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA + ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo + LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2 + b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q + NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp + YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l + DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh + ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA + AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw + aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA + MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu + aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy + dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn + egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1 + MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM + AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk + aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA + ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6 + LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk + am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40 + cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0 + bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy + DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt + MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA + AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx + Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA + MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu + NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht + enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh + agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx + anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM + AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj + ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA + AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1 + LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj + M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l + bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th + Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw + DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z + Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA + AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3 + by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA + aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu + dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w + azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp + NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh + ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM + AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx + MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA + ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy + LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv + dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x + b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1 + cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm + DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw + cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA + AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh + aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA + cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu + eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn + a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y + ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0 + eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM + AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx + c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA + AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi + LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn + M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55 + bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1 + eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz + DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1 + czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA + AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn + ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA + YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu + emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh + Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo + cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo + YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM + AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r + ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA + AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4 + LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0 + c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z + MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp + NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6 + DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3 + aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA + AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201 + ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA + aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu + YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp + ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx + NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho + ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM + AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3 + bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA + AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq + LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh + czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56 + bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph + MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk + DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy + b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA + AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny + Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA + amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u + MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq + emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5 + cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs + YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM + AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj + ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA + ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0 + LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl + aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54 + d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr + bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6 + DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3 + MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA + AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh + di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA + c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu + eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy + dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn + YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr + aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM + AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz + amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA + AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu + LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv + YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r + azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh + ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx + DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41 + cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA + AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x + Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA + NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu + bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw + dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj + MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0 + ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM + AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294 + NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA + AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs + LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr + Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41 + YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh + b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz + DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu + MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA + AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw + dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA + dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u + djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh + eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV + DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG + CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ + GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW + 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA + FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm + eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0 + fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz + dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP + GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ + Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1 + LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg + KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB + UjE= + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '80087' + Content-Type: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66b6659e-996d-11eb-9ac2-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:31 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=append&position=0 + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce31-501f-000b-7d7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + If-Match: + - '"0x8D8FB914AE5DEAD"' + User-Agent: + - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 66dabc17-996d-11eb-bb26-c8348e5fffbf + x-ms-date: + - Fri, 09 Apr 2021 19:54:32 GMT + x-ms-version: + - '2020-06-12' + method: PATCH + uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=flush&position=80087&close=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Fri, 09 Apr 2021 19:54:31 GMT + ETag: + - '"0x8D8FB914B1C8907"' + Last-Modified: + - Fri, 09 Apr 2021 19:54:32 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 1b04ce32-501f-000b-7e7a-2dd77b000000 + x-ms-request-server-encrypted: + - 'false' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py index 32e1f00ba6a8..472a6d62605b 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -263,7 +263,8 @@ def test_set_logging(self): @record def test_set_hour_metrics(self): - hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + hour_metrics = Metrics( + include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act self.dsc.set_service_properties(hour_metrics=hour_metrics) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py index ed9b9c2c8e3b..4246f3e85e7d 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -300,7 +300,8 @@ def test_set_logging(self): loop.run_until_complete(self._test_set_logging()) async def _test_set_hour_metrics(self): - hour_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + hour_metrics = Metrics( + include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act await self.dsc.set_service_properties(hour_metrics=hour_metrics) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index b7f26dace2ab..fd305b6e4f41 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -417,8 +417,8 @@ def test_get_deleted_paths(self): dir2.delete_directory() file_in_dir3.delete_file() file_in_subdir.delete_file() - deleted_paths = list(file_system.get_deleted_paths()) - dir3_paths = list(file_system.get_deleted_paths(name_starts_with="dir3/")) + deleted_paths = list(file_system.list_deleted_paths()) + dir3_paths = list(file_system.list_deleted_paths(path_prefix="dir3/")) # Assert self.assertEqual(len(deleted_paths), 6) @@ -428,10 +428,10 @@ def test_get_deleted_paths(self): self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') - paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page() paths1 = list(next(paths_generator1)) - paths_generator2 = file_system.get_deleted_paths(max_results=4).by_page( + paths_generator2 = file_system.list_deleted_paths(max_results=4).by_page( continuation_token=paths_generator1.continuation_token) paths2 = list(next(paths_generator2)) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index 937e05e4c5ab..b65a9a865be8 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -654,10 +654,10 @@ async def _test_get_deleted_paths(self): await file_in_dir3.delete_file() await file_in_subdir.delete_file() deleted_paths = [] - async for path in file_system.get_deleted_paths(): + async for path in file_system.list_deleted_paths(): deleted_paths.append(path) dir3_paths = [] - async for path in file_system.get_deleted_paths(name_starts_with="dir3/"): + async for path in file_system.list_deleted_paths(path_prefix="dir3/"): dir3_paths.append(path) # Assert @@ -668,12 +668,12 @@ async def _test_get_deleted_paths(self): self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') - paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page() paths1 = [] async for path in await paths_generator1.__anext__(): paths1.append(path) - paths_generator2 = file_system.get_deleted_paths(max_results=4) \ + paths_generator2 = file_system.list_deleted_paths(max_results=4) \ .by_page(continuation_token=paths_generator1.continuation_token) paths2 = [] async for path in await paths_generator2.__anext__(): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index 0aae5aca4ad5..0668835b1cc5 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -6,6 +6,7 @@ # license information. # -------------------------------------------------------------------------- import base64 +import os import pytest @@ -22,6 +23,7 @@ ) # ------------------------------------------------------------------------------ from azure.storage.filedatalake import DataLakeServiceClient +from azure.storage.filedatalake import QuickQueryDialect CSV_DATA = b'Service,Package,Version,RepoPath,MissingDocs\r\nApp Configuration,' \ b'azure-data-appconfiguration,1,appconfiguration,FALSE\r\nEvent Hubs' \ @@ -845,4 +847,45 @@ def on_error(error): on_error=on_error, file_format=input_format) + @record + def test_quick_query_input_in_parquet_format(self): + # Arrange + file_name = self._get_file_reference() + file_client = self.dsc.get_file_client(self.filesystem_name, file_name) + errors = [] + + def on_error(error): + errors.append(error) + expression = "select * from blobstorage where id < 1;" + expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" + + parquet_path = "parquet.parquet" + with open(parquet_path, "rb") as parquet_data: + file_client.upload_data(parquet_data, overwrite=True) + + reader = file_client.query_file(expression, file_format=QuickQueryDialect.ParquetDialect, on_error=on_error) + real_data = reader.readall() + + self.assertEqual(real_data, expected_data) + + @record + def test_quick_query_output_in_parquet_format(self): + # Arrange + file_name = self._get_file_reference() + file_client = self.dsc.get_file_client(self.filesystem_name, file_name) + errors = [] + + def on_error(error): + errors.append(error) + + expression = "SELECT * from BlobStorage" + parquet_path = "parquet.parquet" + with open(parquet_path, "rb") as parquet_data: + file_client.upload_data(parquet_data, overwrite=True) + + with self.assertRaises(ValueError): + file_client.query_file( + expression, file_format=QuickQueryDialect.ParquetDialect, + output_format=QuickQueryDialect.ParquetDialect, on_error=on_error) + # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-share/CHANGELOG.md b/sdk/storage/azure-storage-file-share/CHANGELOG.md index a43c5bfdc1c0..a7c701c865aa 100644 --- a/sdk/storage/azure-storage-file-share/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-share/CHANGELOG.md @@ -1,6 +1,6 @@ # Release History -## 12.4.2 (Unreleased) +## 12.5.0b1 (Unreleased) ## 12.4.1 (2021-01-20) diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py index 91cf474e0d6f..bfd3230dfa42 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.4.2" +VERSION = "12.5.0b1" diff --git a/shared_requirements.txt b/shared_requirements.txt index e945638b35e2..626927eb4f34 100644 --- a/shared_requirements.txt +++ b/shared_requirements.txt @@ -144,15 +144,15 @@ avro<2.0.0,>=1.10.0 #override azure-ai-formrecognizer msrest>=0.6.21 #override azure-ai-formrecognizer azure-core<2.0.0,>=1.8.2 #override azure-storage-blob azure-core<2.0.0,>=1.10.0 -#override azure-storage-blob msrest>=0.6.18 +#override azure-storage-blob msrest>=0.6.21 #override azure-storage-blob-changefeed azure-storage-blob>=12.5.0,<13.0.0 #override azure-storage-queue azure-core<2.0.0,>=1.10.0 #override azure-storage-queue msrest>=0.6.18 #override azure-storage-file-share msrest>=0.6.18 #override azure-storage-file-share azure-core<2.0.0,>=1.10.0 #override azure-storage-file-datalake azure-core<2.0.0,>=1.10.0 -#override azure-storage-file-datalake msrest>=0.6.18 -#override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.8.0b1 +#override azure-storage-file-datalake msrest>=0.6.21 +#override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.9.0b1 #override azure-security-attestation msrest>=0.6.0 #override azure-security-attestation azure-core<2.0.0,>=1.8.2 #override azure-data-tables msrest>=0.6.19 From 1140458fd84cd8d6547527b86e7e843e823dad2b Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Tue, 27 Apr 2021 22:00:18 -0700 Subject: [PATCH 10/22] migrated remaining tests --- .../tests/test_datalake_service_client.py | 82 +++++++----- .../test_datalake_service_client_async.py | 125 ++++++------------ .../tests/test_quick_query.py | 10 +- 3 files changed, 94 insertions(+), 123 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py index 472a6d62605b..080c121e4971 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -7,16 +7,13 @@ # -------------------------------------------------------------------------- import unittest -from msrest.exceptions import ValidationError - from azure.core.exceptions import HttpResponseError from azure.storage.filedatalake import DataLakeServiceClient from testcase import ( StorageTestCase, - record, -) + DataLakePreparer) # ------------------------------------------------------------------------------ from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ @@ -26,10 +23,9 @@ class DatalakeServiceTest(StorageTestCase): - def setUp(self): - super(DatalakeServiceTest, self).setUp() - url = self._get_account_url() - self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + def _setUp(self, account_name, account_key): + url = self._get_account_url(account_name) + self.dsc = DataLakeServiceClient(url, account_key) self.config = self.dsc._config # --Helpers----------------------------------------------------------------- @@ -108,8 +104,9 @@ def _assert_retention_equal(self, ret1, ret2): self.assertEqual(ret1.days, ret2.days) # --Test cases per service --------------------------------------- - @record - def test_datalake_service_properties(self): + @DataLakePreparer() + def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Act resp = self.dsc.set_service_properties( analytics_logging=AnalyticsLogging(), @@ -125,13 +122,15 @@ def test_datalake_service_properties(self): self._assert_properties_default(props) self.assertEqual('2014-02-14', props['target_version']) - @record - def test_empty_set_service_properties_exception(self): + @DataLakePreparer() + def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) with self.assertRaises(ValueError): self.dsc.set_service_properties() - @record - def test_set_default_service_version(self): + @DataLakePreparer() + def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Act self.dsc.set_service_properties(target_version='2014-02-14') @@ -139,8 +138,9 @@ def test_set_default_service_version(self): received_props = self.dsc.get_service_properties() self.assertEqual(received_props['target_version'], '2014-02-14') - @record - def test_set_delete_retention_policy(self): + @DataLakePreparer() + def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) delete_retention_policy = RetentionPolicy(enabled=True, days=2) # Act @@ -150,8 +150,9 @@ def test_set_delete_retention_policy(self): received_props = self.dsc.get_service_properties() self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) - @record - def test_set_delete_retention_policy_edge_cases(self): + @DataLakePreparer() + def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) delete_retention_policy = RetentionPolicy(enabled=True, days=1) self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) @@ -175,7 +176,8 @@ def test_set_delete_retention_policy_edge_cases(self): # Assert received_props = self.dsc.get_service_properties() - self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + self._assert_delete_retention_policy_not_equal( + received_props['delete_retention_policy'], delete_retention_policy) # Should not work with 366 days delete_retention_policy = RetentionPolicy(enabled=True, days=366) @@ -185,10 +187,12 @@ def test_set_delete_retention_policy_edge_cases(self): # Assert received_props = self.dsc.get_service_properties() - self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + self._assert_delete_retention_policy_not_equal( + received_props['delete_retention_policy'], delete_retention_policy) - @record - def test_set_static_website_properties(self): + @DataLakePreparer() + def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) static_website = StaticWebsite( enabled=True, index_document="index.html", @@ -201,8 +205,9 @@ def test_set_static_website_properties(self): received_props = self.dsc.get_service_properties() self._assert_static_website_equal(received_props['static_website'], static_website) - @record - def test_disabled_static_website_properties(self): + @DataLakePreparer() + def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) static_website = StaticWebsite(enabled=False, index_document="index.html", error_document404_path="errors/error/404error.html") @@ -213,8 +218,10 @@ def test_disabled_static_website_properties(self): received_props = self.dsc.get_service_properties() self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) - @record - def test_set_static_website_props_dont_impact_other_props(self): + @DataLakePreparer() + def test_set_static_website_props_dont_impact_other_props( + self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] @@ -250,9 +257,11 @@ def test_set_static_website_props_dont_impact_other_props(self): self._assert_static_website_equal(received_props['static_website'], static_website) self._assert_cors_equal(received_props['cors'], cors) - @record - def test_set_logging(self): - logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + @DataLakePreparer() + def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) + logging = AnalyticsLogging(read=True, write=True, delete=True, + retention_policy=RetentionPolicy(enabled=True, days=5)) # Act self.dsc.set_service_properties(analytics_logging=logging) @@ -261,8 +270,9 @@ def test_set_logging(self): received_props = self.dsc.get_service_properties() self._assert_logging_equal(received_props['analytics_logging'], logging) - @record - def test_set_hour_metrics(self): + @DataLakePreparer() + def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) hour_metrics = Metrics( include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) @@ -273,8 +283,9 @@ def test_set_hour_metrics(self): received_props = self.dsc.get_service_properties() self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) - @record - def test_set_minute_metrics(self): + @DataLakePreparer() + def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) minute_metrics = Metrics(enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) @@ -285,8 +296,9 @@ def test_set_minute_metrics(self): received_props = self.dsc.get_service_properties() self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) - @record - def test_set_cors(self): + @DataLakePreparer() + def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py index 4246f3e85e7d..a5227fb090fc 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -8,16 +8,12 @@ import asyncio import unittest -from msrest.exceptions import ValidationError - from azure.core.exceptions import HttpResponseError from azure.storage.filedatalake.aio import DataLakeServiceClient -from testcase import ( - StorageTestCase, - record, -) +from asynctestcase import StorageTestCase +from testcase import DataLakePreparer # ------------------------------------------------------------------------------ from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ @@ -27,13 +23,10 @@ class DatalakeServiceTest(StorageTestCase): - def setUp(self): - super(DatalakeServiceTest, self).setUp() - url = self._get_account_url() - self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + def _setUp(self, account_name, account_key): + url = self._get_account_url(account_name) + self.dsc = DataLakeServiceClient(url, credential=account_key, logging_enable=True) self.config = self.dsc._config - loop = asyncio.get_event_loop() - loop.run_until_complete(self.dsc.__aenter__()) # --Helpers----------------------------------------------------------------- def _assert_properties_default(self, prop): @@ -111,7 +104,9 @@ def _assert_retention_equal(self, ret1, ret2): self.assertEqual(ret1.days, ret2.days) # --Test cases per service --------------------------------------- - async def _test_datalake_service_properties(self): + @DataLakePreparer() + async def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Act await self.dsc.set_service_properties( analytics_logging=AnalyticsLogging(), @@ -126,21 +121,15 @@ async def _test_datalake_service_properties(self): self._assert_properties_default(props) self.assertEqual('2014-02-14', props['target_version']) - @record - def test_datalake_service_properties(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_datalake_service_properties()) - - async def _test_empty_set_service_properties_exception(self): + @DataLakePreparer() + async def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) with self.assertRaises(ValueError): await self.dsc.set_service_properties() - @record - def test_empty_set_service_properties_exception(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_empty_set_service_properties_exception()) - - async def _test_set_default_service_version(self): + @DataLakePreparer() + async def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Act await self.dsc.set_service_properties(target_version='2014-02-14') @@ -148,12 +137,9 @@ async def _test_set_default_service_version(self): received_props = await self.dsc.get_service_properties() self.assertEqual(received_props['target_version'], '2014-02-14') - @record - def test_set_default_service_version(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_default_service_version()) - - async def _test_set_delete_retention_policy(self): + @DataLakePreparer() + async def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) delete_retention_policy = RetentionPolicy(enabled=True, days=2) # Act @@ -163,12 +149,9 @@ async def _test_set_delete_retention_policy(self): received_props = await self.dsc.get_service_properties() self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) - @record - def test_set_delete_retention_policy(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_delete_retention_policy()) - - async def _test_set_delete_retention_policy_edge_cases(self): + @DataLakePreparer() + async def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) delete_retention_policy = RetentionPolicy(enabled=True, days=1) await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) @@ -204,12 +187,9 @@ async def _test_set_delete_retention_policy_edge_cases(self): received_props = await self.dsc.get_service_properties() self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) - @record - def test_set_delete_retention_policy_edge_cases(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_delete_retention_policy_edge_cases()) - - async def _test_set_static_website_properties(self): + @DataLakePreparer() + async def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) static_website = StaticWebsite( enabled=True, index_document="index.html", @@ -222,12 +202,9 @@ async def _test_set_static_website_properties(self): received_props = await self.dsc.get_service_properties() self._assert_static_website_equal(received_props['static_website'], static_website) - @record - def test_set_static_website_properties(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_static_website_properties()) - - async def _test_disabled_static_website_properties(self): + @DataLakePreparer() + async def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) static_website = StaticWebsite(enabled=False, index_document="index.html", error_document404_path="errors/error/404error.html") @@ -238,12 +215,9 @@ async def _test_disabled_static_website_properties(self): received_props = await self.dsc.get_service_properties() self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) - @record - def test_disabled_static_website_properties(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_disabled_static_website_properties()) - - async def _test_set_static_website_props_dont_impact_other_props(self): + @DataLakePreparer() + async def test_set_static_website_props_dont_impact_other_props(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] @@ -279,12 +253,9 @@ async def _test_set_static_website_props_dont_impact_other_props(self): self._assert_static_website_equal(received_props['static_website'], static_website) self._assert_cors_equal(received_props['cors'], cors) - @record - def test_set_static_website_props_dont_impact_other_props(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_static_website_props_dont_impact_other_props()) - - async def _test_set_logging(self): + @DataLakePreparer() + async def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) # Act @@ -294,12 +265,9 @@ async def _test_set_logging(self): received_props = await self.dsc.get_service_properties() self._assert_logging_equal(received_props['analytics_logging'], logging) - @record - def test_set_logging(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_logging()) - - async def _test_set_hour_metrics(self): + @DataLakePreparer() + async def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) hour_metrics = Metrics( include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5)) @@ -310,12 +278,9 @@ async def _test_set_hour_metrics(self): received_props = await self.dsc.get_service_properties() self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) - @record - def test_set_hour_metrics(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_hour_metrics()) - - async def _test_set_minute_metrics(self): + @DataLakePreparer() + async def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) minute_metrics = Metrics( enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5)) @@ -326,12 +291,9 @@ async def _test_set_minute_metrics(self): received_props = await self.dsc.get_service_properties() self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) - @record - def test_set_minute_metrics(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_minute_metrics()) - - async def _test_set_cors(self): + @DataLakePreparer() + async def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] @@ -354,8 +316,3 @@ async def _test_set_cors(self): # Assert received_props = await self.dsc.get_service_properties() self._assert_cors_equal(received_props['cors'], cors) - - @record - def test_set_cors(self): - loop = asyncio.get_event_loop() - loop.run_until_complete(self._test_set_cors()) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index 7c0338bf6674..222813ea8a00 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -868,8 +868,9 @@ def on_error(error): on_error=on_error, file_format=input_format) - @record - def test_quick_query_input_in_parquet_format(self): + @DataLakePreparer() + def test_quick_query_input_in_parquet_format(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_name = self._get_file_reference() file_client = self.dsc.get_file_client(self.filesystem_name, file_name) @@ -889,8 +890,9 @@ def on_error(error): self.assertEqual(real_data, expected_data) - @record - def test_quick_query_output_in_parquet_format(self): + @DataLakePreparer() + def test_quick_query_output_in_parquet_format(self, datalake_storage_account_name, datalake_storage_account_key): + self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_name = self._get_file_reference() file_client = self.dsc.get_file_client(self.filesystem_name, file_name) From 75a81ccc95d4eba5aeb51950d7773390aa7a6124 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Wed, 28 Apr 2021 13:51:17 -0700 Subject: [PATCH 11/22] parquet file fix --- sdk/storage/azure-storage-blob/tests/test_quick_query.py | 2 +- .../azure-storage-file-datalake/tests/test_quick_query.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/storage/azure-storage-blob/tests/test_quick_query.py b/sdk/storage/azure-storage-blob/tests/test_quick_query.py index 98f9a6b7f343..3f6d92e0d687 100644 --- a/sdk/storage/azure-storage-blob/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-blob/tests/test_quick_query.py @@ -949,7 +949,7 @@ def test_quick_query_input_in_parquet_format(self, resource_group, location, sto blob_name = self._get_blob_reference() blob_client = bsc.get_blob_client(self.container_name, blob_name) - parquet_path = "parquet.parquet" + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./parquet.parquet")) with open(parquet_path, "rb") as parquet_data: blob_client.upload_blob(parquet_data, overwrite=True) errors = [] diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index 222813ea8a00..bae49347a91b 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -881,7 +881,7 @@ def on_error(error): expression = "select * from blobstorage where id < 1;" expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" - parquet_path = "parquet.parquet" + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./parquet.parquet")) with open(parquet_path, "rb") as parquet_data: file_client.upload_data(parquet_data, overwrite=True) From f8332374c62614745e6416eb3b7dd3fcdddc31b9 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Wed, 28 Apr 2021 14:01:04 -0700 Subject: [PATCH 12/22] parquet file fix --- .../tests/{ => resources}/parquet.parquet | Bin .../azure-storage-blob/tests/test_quick_query.py | 2 +- .../tests/{ => resources}/parquet.parquet | Bin .../tests/test_quick_query.py | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) rename sdk/storage/azure-storage-blob/tests/{ => resources}/parquet.parquet (100%) rename sdk/storage/azure-storage-file-datalake/tests/{ => resources}/parquet.parquet (100%) diff --git a/sdk/storage/azure-storage-blob/tests/parquet.parquet b/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet similarity index 100% rename from sdk/storage/azure-storage-blob/tests/parquet.parquet rename to sdk/storage/azure-storage-blob/tests/resources/parquet.parquet diff --git a/sdk/storage/azure-storage-blob/tests/test_quick_query.py b/sdk/storage/azure-storage-blob/tests/test_quick_query.py index 3f6d92e0d687..fa1352409cc4 100644 --- a/sdk/storage/azure-storage-blob/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-blob/tests/test_quick_query.py @@ -949,7 +949,7 @@ def test_quick_query_input_in_parquet_format(self, resource_group, location, sto blob_name = self._get_blob_reference() blob_client = bsc.get_blob_client(self.container_name, blob_name) - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./parquet.parquet")) + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) with open(parquet_path, "rb") as parquet_data: blob_client.upload_blob(parquet_data, overwrite=True) errors = [] diff --git a/sdk/storage/azure-storage-file-datalake/tests/parquet.parquet b/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet similarity index 100% rename from sdk/storage/azure-storage-file-datalake/tests/parquet.parquet rename to sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index bae49347a91b..9542e85391c5 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -881,7 +881,7 @@ def on_error(error): expression = "select * from blobstorage where id < 1;" expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./parquet.parquet")) + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) with open(parquet_path, "rb") as parquet_data: file_client.upload_data(parquet_data, overwrite=True) From c390f913fad34b24d7346b7d4f61a06ad5b4d4c7 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Wed, 28 Apr 2021 17:33:54 -0700 Subject: [PATCH 13/22] path --- sdk/storage/azure-storage-blob/tests/test_quick_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob/tests/test_quick_query.py b/sdk/storage/azure-storage-blob/tests/test_quick_query.py index fa1352409cc4..d4f93f8cd7fc 100644 --- a/sdk/storage/azure-storage-blob/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-blob/tests/test_quick_query.py @@ -973,7 +973,7 @@ def test_quick_query_output_in_parquet_format(self, resource_group, location, st blob_name = self._get_blob_reference() blob_client = bsc.get_blob_client(self.container_name, blob_name) - parquet_path = "parquet.parquet" + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) with open(parquet_path, "rb") as parquet_data: blob_client.upload_blob(parquet_data, overwrite=True) errors = [] From c6dd7a4ef7c6ea0eb69c9d683cb62eb94bae13c3 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Wed, 28 Apr 2021 17:34:02 -0700 Subject: [PATCH 14/22] path --- .../azure-storage-file-datalake/tests/test_quick_query.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index 9542e85391c5..179d217579a9 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -902,7 +902,7 @@ def on_error(error): errors.append(error) expression = "SELECT * from BlobStorage" - parquet_path = "parquet.parquet" + parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) with open(parquet_path, "rb") as parquet_data: file_client.upload_data(parquet_data, overwrite=True) From 1e796846fb21806821799977018d95c9b5c612c2 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Thu, 29 Apr 2021 09:50:41 -0700 Subject: [PATCH 15/22] fixed recordings for the recursive bug --- .../test_file_system.test_get_deleted_paths.yaml | 8 ++++---- ...ystem.test_undelete_file_with_version_id.yaml | 2 +- ...file_system_async.test_get_deleted_paths.yaml | 16 ++++++++-------- ...async.test_undelete_file_with_version_id.yaml | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml index 22256e1ba770..abbdbad93587 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -383,7 +383,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0 response: body: string: '' @@ -425,7 +425,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1 response: body: string: '' @@ -551,7 +551,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3 response: body: string: '' @@ -593,7 +593,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir response: body: string: '' diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml index 920144044b53..41ff2d4cd98d 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -107,7 +107,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?recursive=true + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87 response: body: string: '' diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml index 20015d5895c7..5be0f0b32c74 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -274,7 +274,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0 response: body: string: '' @@ -289,7 +289,7 @@ interactions: status: code: 200 message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0 - request: body: null headers: @@ -304,7 +304,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1 response: body: string: '' @@ -319,7 +319,7 @@ interactions: status: code: 200 message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1 - request: body: null headers: @@ -394,7 +394,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3 response: body: string: '' @@ -409,7 +409,7 @@ interactions: status: code: 200 message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3 - request: body: null headers: @@ -424,7 +424,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir response: body: string: '' @@ -439,7 +439,7 @@ interactions: status: code: 200 message: OK - url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir - request: body: null headers: diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml index 422bf04e7469..be3e34c508b0 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -76,7 +76,7 @@ interactions: x-ms-version: - '2020-06-12' method: DELETE - uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87 response: body: string: '' @@ -91,7 +91,7 @@ interactions: status: code: 200 message: OK - url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87 - request: body: null headers: From 8d8c11c6b3dfb4f760883afd5568a1bd5b572fbb Mon Sep 17 00:00:00 2001 From: tasherif-msft <69483382+tasherif-msft@users.noreply.github.com> Date: Mon, 3 May 2021 12:14:45 -0700 Subject: [PATCH 16/22] Stg77 Cleanup (#18376) * STG77 Preview Cleanup * resolved more archboard feedback * privated undelete path * removed parquet format --- .../azure/storage/blob/__init__.py | 4 -- .../azure/storage/blob/_blob_client.py | 39 ++++---------- .../azure/storage/blob/_models.py | 17 +------ .../tests/test_quick_query.py | 51 +------------------ .../azure/storage/filedatalake/__init__.py | 4 -- .../filedatalake/_data_lake_file_client.py | 16 +++--- .../filedatalake/_data_lake_service_client.py | 4 +- .../filedatalake/_file_system_client.py | 8 +-- .../azure/storage/filedatalake/_models.py | 14 ----- .../aio/_data_lake_service_client_async.py | 6 +-- .../aio/_file_system_client_async.py | 6 +-- .../tests/test_file_system.py | 4 +- .../tests/test_file_system_async.py | 4 +- .../tests/test_quick_query.py | 45 ---------------- .../azure/storage/fileshare/_share_client.py | 11 ++-- .../fileshare/aio/_share_client_async.py | 11 ++-- 16 files changed, 46 insertions(+), 198 deletions(-) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py b/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py index 99075baf1ea1..9164961ea10a 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/__init__.py @@ -54,10 +54,8 @@ BlobQueryError, DelimitedJsonDialect, DelimitedTextDialect, - ParquetDialect, ArrowDialect, ArrowType, - QuickQueryDialect, ObjectReplicationPolicy, ObjectReplicationRule ) @@ -227,10 +225,8 @@ def download_blob_from_url( 'BlobQueryError', 'DelimitedJsonDialect', 'DelimitedTextDialect', - 'ParquetDialect', 'ArrowDialect', 'ArrowType', - 'QuickQueryDialect', 'BlobQueryReader', 'ObjectReplicationPolicy', 'ObjectReplicationRule' diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py index 37a043116cba..e82c04f7bd8f 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py @@ -55,8 +55,7 @@ upload_block_blob, upload_append_blob, upload_page_blob, _any_conditions) -from ._models import BlobType, BlobBlock, BlobProperties, BlobQueryError, ParquetDialect, QuickQueryDialect, \ - DelimitedJsonDialect, DelimitedTextDialect +from ._models import BlobType, BlobBlock, BlobProperties, BlobQueryError from ._download import StorageStreamDownloader from ._lease import BlobLeaseClient @@ -833,32 +832,16 @@ def _quick_query_options(self, query_expression, # type: (str, **Any) -> Dict[str, Any] delimiter = '\n' input_format = kwargs.pop('blob_format', None) - if input_format == QuickQueryDialect.ParquetDialect: - input_format = ParquetDialect() - if input_format == QuickQueryDialect.DelimitedJsonDialect: - input_format = DelimitedJsonDialect() - if input_format == QuickQueryDialect.DelimitedTextDialect: - input_format = DelimitedTextDialect() - input_parquet_format = isinstance(input_format, ParquetDialect) - if input_format and not input_parquet_format: + if input_format: try: delimiter = input_format.lineterminator except AttributeError: try: delimiter = input_format.delimiter except AttributeError: - raise ValueError("The Type of blob_format can only be DelimitedTextDialect or " - "DelimitedJsonDialect or ParquetDialect") + raise ValueError("The Type of blob_format can only be DelimitedTextDialect or DelimitedJsonDialect") output_format = kwargs.pop('output_format', None) - if output_format == QuickQueryDialect.ParquetDialect: - output_format = ParquetDialect() - if output_format == QuickQueryDialect.DelimitedJsonDialect: - output_format = DelimitedJsonDialect() - if output_format == QuickQueryDialect.DelimitedTextDialect: - output_format = DelimitedTextDialect() if output_format: - if isinstance(output_format, ParquetDialect): - raise ValueError("ParquetDialect is invalid as an output format.") try: delimiter = output_format.lineterminator except AttributeError: @@ -867,7 +850,7 @@ def _quick_query_options(self, query_expression, except AttributeError: pass else: - output_format = input_format if not input_parquet_format else None + output_format = input_format query_request = QueryRequest( expression=query_expression, input_serialization=serialize_query_format(input_format), @@ -911,18 +894,14 @@ def query_blob(self, query_expression, **kwargs): :keyword blob_format: Optional. Defines the serialization of the data currently stored in the blob. The default is to treat the blob data as CSV data formatted in the default dialect. This can be overridden with - a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect or ParquetDialect. - These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string + a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect. :paramtype blob_format: ~azure.storage.blob.DelimitedTextDialect or ~azure.storage.blob.DelimitedJsonDialect - or ~azure.storage.blob.ParquetDialect or ~azure.storage.blob.QuickQueryDialect or str :keyword output_format: Optional. Defines the output serialization for the data stream. By default the data will be returned - as it is represented in the blob (Parquet formats default to DelimitedTextDialect). - By providing an output format, the blob data will be reformatted according to that profile. - This value can be a DelimitedTextDialect or a DelimitedJsonDialect or ArrowDialect. - These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string - :paramtype output_format: ~azure.storage.blob.DelimitedTextDialect or ~azure.storage.blob.DelimitedJsonDialect - or list[~azure.storage.blob.ArrowDialect] or ~azure.storage.blob.QuickQueryDialect or str + as it is represented in the blob. By providing an output format, the blob data will be reformatted + according to that profile. This value can be a DelimitedTextDialect or a DelimitedJsonDialect. + :paramtype output_format: ~azure.storage.blob.DelimitedTextDialect, ~azure.storage.blob.DelimitedJsonDialect + or list[~azure.storage.blob.ArrowDialect] :keyword lease: Required if the blob has an active lease. Value can be a BlobLeaseClient object or the lease ID as a string. diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py index d1ba86751695..1ddde2e46c5c 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py @@ -67,14 +67,6 @@ class PremiumPageBlobTier(str, Enum): P60 = 'P60' #: P60 Tier -class QuickQueryDialect(str, Enum): - """Specifies the quick query input/output dialect.""" - - DelimitedTextDialect = 'DelimitedTextDialect' - DelimitedJsonDialect = 'DelimitedJsonDialect' - ParquetDialect = 'ParquetDialect' - - class SequenceNumberAction(str, Enum): """Sequence number actions.""" @@ -1011,7 +1003,7 @@ def _from_generated(cls, generated): return None -class DelimitedJsonDialect(object): +class DelimitedJsonDialect(DictMixin): """Defines the input or output JSON serialization for a blob data query. :keyword str delimiter: The line separator character, default value is '\n' @@ -1021,7 +1013,7 @@ def __init__(self, **kwargs): self.delimiter = kwargs.pop('delimiter', '\n') -class DelimitedTextDialect(object): +class DelimitedTextDialect(DictMixin): """Defines the input or output delimited (CSV) serialization for a blob query request. :keyword str delimiter: @@ -1045,11 +1037,6 @@ def __init__(self, **kwargs): self.has_header = kwargs.pop('has_header', False) -class ParquetDialect(object): - """Defines parquet input serialization for a blob query request.""" - pass - - class ArrowDialect(ArrowField): """field of an arrow schema. diff --git a/sdk/storage/azure-storage-blob/tests/test_quick_query.py b/sdk/storage/azure-storage-blob/tests/test_quick_query.py index d4f93f8cd7fc..cf2e1d62ed98 100644 --- a/sdk/storage/azure-storage-blob/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-blob/tests/test_quick_query.py @@ -6,7 +6,6 @@ # license information. # -------------------------------------------------------------------------- import base64 -import os import pytest @@ -19,7 +18,7 @@ ) # ------------------------------------------------------------------------------ -from azure.storage.blob import ArrowDialect, ArrowType, ParquetDialect, QuickQueryDialect +from azure.storage.blob._models import ArrowDialect, ArrowType CSV_DATA = b'Service,Package,Version,RepoPath,MissingDocs\r\nApp Configuration,' \ b'azure-data-appconfiguration,1,appconfiguration,FALSE\r\nEvent Hubs' \ @@ -937,52 +936,4 @@ def on_error(error): on_error=on_error, blob_format=input_format) - @GlobalStorageAccountPreparer() - def test_quick_query_input_in_parquet_format(self, resource_group, location, storage_account, storage_account_key): - # Arrange - bsc = BlobServiceClient( - self.account_url(storage_account, "blob"), - credential=storage_account_key) - self._setup(bsc) - expression = "select * from blobstorage where id < 1;" - expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" - - blob_name = self._get_blob_reference() - blob_client = bsc.get_blob_client(self.container_name, blob_name) - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) - with open(parquet_path, "rb") as parquet_data: - blob_client.upload_blob(parquet_data, overwrite=True) - errors = [] - - def on_error(error): - errors.append(error) - - reader = blob_client.query_blob(expression, blob_format=QuickQueryDialect.ParquetDialect, on_error=on_error) - real_data = reader.readall() - - self.assertEqual(real_data, expected_data) - - @GlobalStorageAccountPreparer() - def test_quick_query_output_in_parquet_format(self, resource_group, location, storage_account, storage_account_key): - # Arrange - bsc = BlobServiceClient( - self.account_url(storage_account, "blob"), - credential=storage_account_key) - self._setup(bsc) - expression = "SELECT * from BlobStorage" - - blob_name = self._get_blob_reference() - blob_client = bsc.get_blob_client(self.container_name, blob_name) - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) - with open(parquet_path, "rb") as parquet_data: - blob_client.upload_blob(parquet_data, overwrite=True) - errors = [] - - def on_error(error): - errors.append(error) - - with self.assertRaises(ValueError): - blob_client.query_blob( - expression, blob_format=ParquetDialect(), output_format=ParquetDialect(), on_error=on_error) - # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py index 8158ed9d74ab..459c4c07b44a 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py @@ -31,8 +31,6 @@ DelimitedJsonDialect, ArrowDialect, ArrowType, - QuickQueryDialect, - ParquetDialect, DataLakeFileQueryError, AccessControlChangeResult, AccessControlChangeCounters, @@ -93,8 +91,6 @@ 'DelimitedTextDialect', 'DelimitedJsonDialect', 'DataLakeFileQueryError', - 'ParquetDialect', - 'QuickQueryDialect', 'ArrowDialect', 'ArrowType', 'DataLakeFileQueryError', diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py index 24870a295d64..e15842dc3b6d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py @@ -724,20 +724,16 @@ def query_file(self, query_expression, **kwargs): :keyword file_format: Optional. Defines the serialization of the data currently stored in the file. The default is to treat the file data as CSV data formatted in the default dialect. This can be overridden with - a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect or ParquetDialect. - These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string + a custom DelimitedTextDialect, or alternatively a DelimitedJsonDialect. :paramtype file_format: - ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect or - ~azure.storage.filedatalake.ParquetDialect or ~azure.storage.filedatalake.QuickQueryDialect or str + ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect :keyword output_format: Optional. Defines the output serialization for the data stream. By default the data will be returned - as it is represented in the file. By providing an output format, - the file data will be reformatted according to that profile. - This value can be a DelimitedTextDialect or a DelimitedJsonDialect or ArrowDialect. - These dialects can be passed through their respective classes, the QuickQueryDialect enum or as a string + as it is represented in the file. By providing an output format, the file data will be reformatted + according to that profile. This value can be a DelimitedTextDialect or a DelimitedJsonDialect. :paramtype output_format: - ~azure.storage.filedatalake.DelimitedTextDialect or ~azure.storage.filedatalake.DelimitedJsonDialect - or list[~azure.storage.filedatalake.ArrowDialect] or ~azure.storage.filedatalake.QuickQueryDialect or str + ~azure.storage.filedatalake.DelimitedTextDialect, ~azure.storage.filedatalake.DelimitedJsonDialect + or list[~azure.storage.filedatalake.ArrowDialect] :keyword lease: Required if the file has an active lease. Value can be a DataLakeLeaseClient object or the lease ID as a string. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index 21da8026db34..dfed0048b37d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -495,7 +495,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] key_resolver_function=self.key_resolver_function) def set_service_properties(self, **kwargs): - # type: (Any) -> None + # type: (**Any) -> None """Sets the properties of a storage account's Datalake service, including Azure Storage Analytics. @@ -539,7 +539,7 @@ def set_service_properties(self, **kwargs): return self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access def get_service_properties(self, **kwargs): - # type: (Any) -> Dict[str, Any] + # type: (**Any) -> Dict[str, Any] """Gets the properties of a storage account's datalake service, including Azure Storage Analytics. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index 49f9b079f34b..a1c82c422852 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -750,7 +750,7 @@ def delete_file(self, file, # type: Union[FileProperties, str] file_client.delete_file(**kwargs) return file_client - def _undelete_path(self, deleted_path_name, deletion_id): + def __undelete_path(self, deleted_path_name, deletion_id): quoted_path = quote(unquote(deleted_path_name.strip('/'))) url_and_token = self.url.replace('.dfs.', '.blob.').split('?') @@ -763,7 +763,7 @@ def _undelete_path(self, deleted_path_name, deletion_id): return quoted_path, url, undelete_source - def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] """Restores soft-deleted path. @@ -781,7 +781,7 @@ def undelete_path(self, deleted_path_name, deletion_id, **kwargs): The timeout parameter is expressed in seconds. :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient """ - _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + _, url, undelete_source = self.__undelete_path(deleted_path_name, deletion_id) pipeline = Pipeline( transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access @@ -900,7 +900,7 @@ def list_deleted_paths(self, **kwargs): If omitted or greater than 5,000, the response will include up to 5,000 items per page. :keyword int timeout: The timeout parameter is expressed in seconds. - :returns: An iterable (auto-paging) response of PathProperties. + :returns: An iterable (auto-paging) response of DeletedPathProperties. :rtype: ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] """ diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index 70b4a24ab0e6..f0204b02fc8d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -16,7 +16,6 @@ from azure.storage.blob import AccessPolicy as BlobAccessPolicy from azure.storage.blob import DelimitedTextDialect as BlobDelimitedTextDialect from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON -from azure.storage.blob import ParquetDialect as BlobParquetDialect from azure.storage.blob import ArrowDialect as BlobArrowDialect from azure.storage.blob._models import ContainerPropertiesPaged from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \ @@ -713,11 +712,6 @@ class DelimitedTextDialect(BlobDelimitedTextDialect): """ -class ParquetDialect(BlobParquetDialect): - """Defines parquet input serialization for a file query request.""" - pass - - class ArrowDialect(BlobArrowDialect): """field of an arrow schema. @@ -730,14 +724,6 @@ class ArrowDialect(BlobArrowDialect): """ -class QuickQueryDialect(str, Enum): - """Specifies the quick query input/output dialect.""" - - DelimitedTextDialect = 'DelimitedTextDialect' - DelimitedJsonDialect = 'DelimitedJsonDialect' - ParquetDialect = 'ParquetDialect' - - class ArrowType(str, Enum): INT64 = "int64" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py index ba43b0903b1d..da01081e2342 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py @@ -4,7 +4,7 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Optional, List, Any +from typing import Optional, Any, Dict from azure.core.paging import ItemPaged from azure.core.pipeline import AsyncPipeline @@ -444,7 +444,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] key_resolver_function=self.key_resolver_function) async def set_service_properties(self, **kwargs): - # type: (Any) -> None + # type: (**Any) -> None """Sets the properties of a storage account's Datalake service, including Azure Storage Analytics. @@ -488,7 +488,7 @@ async def set_service_properties(self, **kwargs): return await self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access async def get_service_properties(self, **kwargs): - # type: (Any) -> Dict[str, Any] + # type: (**Any) -> Dict[str, Any] """Gets the properties of a storage account's datalake service, including Azure Storage Analytics. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index 7122970713fa..de4af05e82fb 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -710,7 +710,7 @@ async def delete_file(self, file, # type: Union[FileProperties, str] return file_client @distributed_trace_async - async def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + async def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] """Restores soft-deleted path. @@ -729,7 +729,7 @@ async def undelete_path(self, deleted_path_name, deletion_id, **kwargs): :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient or azure.storage.file.datalake.aio.DataLakeFileClient """ - _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + _, url, undelete_source = self.__undelete_path(deleted_path_name, deletion_id) pipeline = AsyncPipeline( transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access @@ -850,7 +850,7 @@ def list_deleted_paths(self, **kwargs): If omitted or greater than 5,000, the response will include up to 5,000 items per page. :keyword int timeout: The timeout parameter is expressed in seconds. - :returns: An iterable (auto-paging) response of PathProperties. + :returns: An iterable (auto-paging) response of DeletedPathProperties. :rtype: ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] """ diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index a15c3ae0a378..0501afae7b20 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -611,7 +611,7 @@ def test_undelete_dir_with_version_id(self, datalake_storage_account_name, datal resp = dir_client.delete_directory() with self.assertRaises(HttpResponseError): file_system_client.get_file_client(dir_path).get_file_properties() - restored_dir_client = file_system_client.undelete_path(dir_path, resp['deletion_id']) + restored_dir_client = file_system_client._undelete_path(dir_path, resp['deletion_id']) resp = restored_dir_client.get_directory_properties() self.assertIsNotNone(resp) @@ -626,7 +626,7 @@ def test_undelete_file_with_version_id(self, datalake_storage_account_name, data resp = dir_client.delete_file() with self.assertRaises(HttpResponseError): file_system_client.get_file_client(file_path).get_file_properties() - restored_file_client = file_system_client.undelete_path(file_path, resp['deletion_id']) + restored_file_client = file_system_client._undelete_path(file_path, resp['deletion_id']) resp = restored_file_client.get_file_properties() self.assertIsNotNone(resp) # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index 6a8d64caba45..ccb249eceb88 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -764,7 +764,7 @@ async def test_undelete_dir_with_version_id(self, datalake_storage_account_name, resp = await dir_client.delete_directory() with self.assertRaises(HttpResponseError): await file_system_client.get_file_client(dir_path).get_file_properties() - restored_dir_client = await file_system_client.undelete_path(dir_path, resp['deletion_id']) + restored_dir_client = await file_system_client._undelete_path(dir_path, resp['deletion_id']) resp = await restored_dir_client.get_directory_properties() self.assertIsNotNone(resp) @@ -779,7 +779,7 @@ async def test_undelete_file_with_version_id(self, datalake_storage_account_name resp = await dir_client.delete_file() with self.assertRaises(HttpResponseError): await file_system_client.get_file_client(file_path).get_file_properties() - restored_file_client = await file_system_client.undelete_path(file_path, resp['deletion_id']) + restored_file_client = await file_system_client._undelete_path(file_path, resp['deletion_id']) resp = await restored_file_client.get_file_properties() self.assertIsNotNone(resp) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py index 179d217579a9..4098867aea0a 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_quick_query.py @@ -6,7 +6,6 @@ # license information. # -------------------------------------------------------------------------- import base64 -import os import pytest @@ -21,7 +20,6 @@ DataLakePreparer) # ------------------------------------------------------------------------------ from azure.storage.filedatalake import DataLakeServiceClient -from azure.storage.filedatalake import QuickQueryDialect CSV_DATA = b'Service,Package,Version,RepoPath,MissingDocs\r\nApp Configuration,' \ b'azure-data-appconfiguration,1,appconfiguration,FALSE\r\nEvent Hubs' \ @@ -868,47 +866,4 @@ def on_error(error): on_error=on_error, file_format=input_format) - @DataLakePreparer() - def test_quick_query_input_in_parquet_format(self, datalake_storage_account_name, datalake_storage_account_key): - self._setUp(datalake_storage_account_name, datalake_storage_account_key) - # Arrange - file_name = self._get_file_reference() - file_client = self.dsc.get_file_client(self.filesystem_name, file_name) - errors = [] - - def on_error(error): - errors.append(error) - expression = "select * from blobstorage where id < 1;" - expected_data = b"0,mdifjt55.ea3,mdifjt55.ea3\n" - - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) - with open(parquet_path, "rb") as parquet_data: - file_client.upload_data(parquet_data, overwrite=True) - - reader = file_client.query_file(expression, file_format=QuickQueryDialect.ParquetDialect, on_error=on_error) - real_data = reader.readall() - - self.assertEqual(real_data, expected_data) - - @DataLakePreparer() - def test_quick_query_output_in_parquet_format(self, datalake_storage_account_name, datalake_storage_account_key): - self._setUp(datalake_storage_account_name, datalake_storage_account_key) - # Arrange - file_name = self._get_file_reference() - file_client = self.dsc.get_file_client(self.filesystem_name, file_name) - errors = [] - - def on_error(error): - errors.append(error) - - expression = "SELECT * from BlobStorage" - parquet_path = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "./resources/parquet.parquet")) - with open(parquet_path, "rb") as parquet_data: - file_client.upload_data(parquet_data, overwrite=True) - - with self.assertRaises(ValueError): - file_client.query_file( - expression, file_format=QuickQueryDialect.ParquetDialect, - output_format=QuickQueryDialect.ParquetDialect, on_error=on_error) - # ------------------------------------------------------------------------------ diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py index 9166016d5f4f..2b37a56d807c 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py @@ -269,8 +269,8 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode) @distributed_trace - def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): - # type: (int, Optional[str], **Any) -> ShareLeaseClient + def acquire_lease(self, **kwargs): + # type: (**Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share @@ -278,12 +278,12 @@ def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): .. versionadded:: 12.5.0 - :param int lease_duration: + :kwarg int lease_duration: Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. Default is -1 (infinite lease). - :param str lease_id: + :kwarg str lease_id: Proposed lease ID, in a GUID string format. The Share Service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. @@ -301,7 +301,8 @@ def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): :dedent: 8 :caption: Acquiring a lease on a share. """ - kwargs['lease_duration'] = lease_duration + kwargs['lease_duration'] = kwargs.pop('lease_duration', -1) + lease_id = kwargs.pop('lease_id', None) lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore lease.acquire(**kwargs) return lease diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py index c8eecd699083..05fc93b88473 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py @@ -130,8 +130,8 @@ def get_file_client(self, file_path): _pipeline=_pipeline, _location_mode=self._location_mode, loop=self._loop) @distributed_trace_async() - async def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): - # type: (int, Optional[str], **Any) -> ShareLeaseClient + async def acquire_lease(self, **kwargs): + # type: (**Any) -> ShareLeaseClient """Requests a new lease. If the share does not have an active lease, the Share @@ -139,12 +139,12 @@ async def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): .. versionadded:: 12.5.0 - :param int lease_duration: + :keyword int lease_duration: Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. Default is -1 (infinite lease). - :param str lease_id: + :keyword str lease_id: Proposed lease ID, in a GUID string format. The Share Service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. @@ -162,7 +162,8 @@ async def acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs): :dedent: 8 :caption: Acquiring a lease on a share. """ - kwargs['lease_duration'] = lease_duration + kwargs['lease_duration'] = kwargs.pop('lease_duration', -1) + lease_id = kwargs.pop('lease_id', None) lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore await lease.acquire(**kwargs) return lease From e3455b0d42d6acff61326543146b935b4454a84e Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Mon, 3 May 2021 14:40:00 -0700 Subject: [PATCH 17/22] removed parquet dialect from serialize and droped the blob dep version --- .../azure/storage/blob/_serialize.py | 11 +++-------- sdk/storage/azure-storage-file-datalake/setup.py | 2 +- shared_requirements.txt | 10 ++++++---- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py index c2e150dda40d..8f6f265dce52 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py @@ -13,7 +13,7 @@ from ._models import ( ContainerEncryptionScope, - DelimitedJsonDialect, ParquetDialect) + DelimitedJsonDialect) from ._generated.models import ( ModifiedAccessConditions, SourceModifiedAccessConditions, @@ -162,12 +162,7 @@ def serialize_blob_tags(tags=None): def serialize_query_format(formater): - if isinstance(formater, ParquetDialect): - qq_format = QueryFormat( - type=QueryFormatType.PARQUET, - parquet_text_configuration=' ' - ) - elif isinstance(formater, DelimitedJsonDialect): + if isinstance(formater, DelimitedJsonDialect): serialization_settings = JsonTextConfiguration( record_separator=formater.delimiter ) @@ -200,5 +195,5 @@ def serialize_query_format(formater): elif not formater: return None else: - raise TypeError("Format must be DelimitedTextDialect or DelimitedJsonDialect or ParquetDialect.") + raise TypeError("Format must be DelimitedTextDialect or DelimitedJsonDialect.") return QuerySerialization(format=qq_format) diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py index 7c4e0eea3688..62b64edf60f5 100644 --- a/sdk/storage/azure-storage-file-datalake/setup.py +++ b/sdk/storage/azure-storage-file-datalake/setup.py @@ -95,7 +95,7 @@ install_requires=[ "azure-core<2.0.0,>=1.10.0", "msrest>=0.6.21", - "azure-storage-blob<13.0.0,>=12.9.0b1" + "azure-storage-blob<13.0.0,>=12.8.0b1" ], extras_require={ ":python_version<'3.0'": ['futures', 'azure-storage-nspkg<4.0.0,>=3.0.0'], diff --git a/shared_requirements.txt b/shared_requirements.txt index 81c244ac2419..b5df03e3402d 100644 --- a/shared_requirements.txt +++ b/shared_requirements.txt @@ -147,15 +147,15 @@ pyjwt>=1.7.1 #override azure-ai-formrecognizer msrest>=0.6.21 #override azure-ai-formrecognizer azure-core<2.0.0,>=1.8.2 #override azure-storage-blob azure-core<2.0.0,>=1.10.0 -#override azure-storage-blob msrest>=0.6.21 +#override azure-storage-blob msrest>=0.6.18 #override azure-storage-blob-changefeed azure-storage-blob>=12.5.0,<13.0.0 #override azure-storage-queue azure-core<2.0.0,>=1.10.0 #override azure-storage-queue msrest>=0.6.18 #override azure-storage-file-share msrest>=0.6.18 #override azure-storage-file-share azure-core<2.0.0,>=1.10.0 #override azure-storage-file-datalake azure-core<2.0.0,>=1.10.0 -#override azure-storage-file-datalake msrest>=0.6.21 -#override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.9.0b1 +#override azure-storage-file-datalake msrest>=0.6.18 +#override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.8.0b1 #override azure-security-attestation msrest>=0.6.0 #override azure-security-attestation azure-core<2.0.0,>=1.8.2 #override azure-data-tables msrest>=0.6.19 @@ -254,6 +254,7 @@ opentelemetry-sdk<2.0.0,>=1.0.0 #override azure-mgmt-keyvault msrest>=0.6.21 #override azure-mgmt-resource msrest>=0.6.21 #override azure-template azure-core<2.0.0,>=1.10.0 +#override azure-mgmt-servicefabricmanagedclusters msrest>=0.6.21 #override azure-mgmt-managedservices msrest>=0.6.21 #override azure-mgmt-databoxedge msrest>=0.6.21 #override azure-mgmt-kusto msrest>=0.6.21 @@ -263,4 +264,5 @@ opentelemetry-sdk<2.0.0,>=1.0.0 #override azure-purview-catalog msrest>=0.6.21 #override azure-mgmt-rdbms msrest>=0.6.21 #override azure-mgmt-peering msrest>=0.6.21 -#override azure-mgmt-mixedreality msrest>=0.6.21 +#override azure-mgmt-confidentialledger msrest>=0.6.21 +#override azure-mgmt-mixedreality msrest>=0.6.21 \ No newline at end of file From a5264f0f504a8f5599d7b0a83a25facd9f6a7c3f Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Mon, 3 May 2021 14:40:15 -0700 Subject: [PATCH 18/22] removed parquet dialect from serialize and droped the blob dep version --- shared_requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared_requirements.txt b/shared_requirements.txt index b5df03e3402d..5ca4e1d8d616 100644 --- a/shared_requirements.txt +++ b/shared_requirements.txt @@ -147,14 +147,14 @@ pyjwt>=1.7.1 #override azure-ai-formrecognizer msrest>=0.6.21 #override azure-ai-formrecognizer azure-core<2.0.0,>=1.8.2 #override azure-storage-blob azure-core<2.0.0,>=1.10.0 -#override azure-storage-blob msrest>=0.6.18 +#override azure-storage-blob msrest>=0.6.21 #override azure-storage-blob-changefeed azure-storage-blob>=12.5.0,<13.0.0 #override azure-storage-queue azure-core<2.0.0,>=1.10.0 #override azure-storage-queue msrest>=0.6.18 #override azure-storage-file-share msrest>=0.6.18 #override azure-storage-file-share azure-core<2.0.0,>=1.10.0 #override azure-storage-file-datalake azure-core<2.0.0,>=1.10.0 -#override azure-storage-file-datalake msrest>=0.6.18 +#override azure-storage-file-datalake msrest>=0.6.21 #override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.8.0b1 #override azure-security-attestation msrest>=0.6.0 #override azure-security-attestation azure-core<2.0.0,>=1.8.2 From 2a795805a2bda04337afbeaf5d482628bfc06314 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Mon, 3 May 2021 16:32:53 -0700 Subject: [PATCH 19/22] lint --- .../azure/storage/filedatalake/_data_lake_service_client.py | 2 +- .../azure/storage/filedatalake/_file_system_client.py | 4 ++-- .../storage/filedatalake/aio/_file_system_client_async.py | 2 +- .../azure/storage/filedatalake/aio/_list_paths_helper.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index dfed0048b37d..5aa17894baf0 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Optional, List, Dict, Any +from typing import Optional, Dict, Any try: from urllib.parse import urlparse diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index a1c82c422852..03aa9c71e8aa 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -750,7 +750,7 @@ def delete_file(self, file, # type: Union[FileProperties, str] file_client.delete_file(**kwargs) return file_client - def __undelete_path(self, deleted_path_name, deletion_id): + def _undelete_path_options(self, deleted_path_name, deletion_id): quoted_path = quote(unquote(deleted_path_name.strip('/'))) url_and_token = self.url.replace('.dfs.', '.blob.').split('?') @@ -781,7 +781,7 @@ def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): The timeout parameter is expressed in seconds. :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient """ - _, url, undelete_source = self.__undelete_path(deleted_path_name, deletion_id) + _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id) pipeline = Pipeline( transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index de4af05e82fb..c9247e5e1bfb 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -729,7 +729,7 @@ async def _undelete_path(self, deleted_path_name, deletion_id, **kwargs): :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient or azure.storage.file.datalake.aio.DataLakeFileClient """ - _, url, undelete_source = self.__undelete_path(deleted_path_name, deletion_id) + _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id) pipeline = AsyncPipeline( transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py index 58b0cf799c83..03831a5ecc5c 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py @@ -6,7 +6,7 @@ # pylint: disable=too-few-public-methods, too-many-instance-attributes # pylint: disable=super-init-not-called, too-many-lines from azure.core.exceptions import HttpResponseError -from azure.core.async_paging import AsyncPageIterator, AsyncItemPaged +from azure.core.async_paging import AsyncPageIterator from .._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code from .._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix From 8d3eabdb72e501d85ec78080ccd3379efa756047 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Sun, 9 May 2021 14:03:44 -0700 Subject: [PATCH 20/22] resolved feedback comments --- .../azure/storage/filedatalake/_path_client.py | 3 +-- .../storage/filedatalake/aio/_file_system_client_async.py | 2 +- sdk/storage/azure-storage-file-datalake/setup.py | 2 +- .../azure/storage/fileshare/aio/_lease_async.py | 2 +- sdk/storage/azure-storage-file-share/setup.py | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py index e3a09499b4b3..665322e49d56 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py @@ -212,13 +212,12 @@ def _delete_path_options(**kwargs): options = { 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions, - 'cls': return_response_headers, 'timeout': kwargs.pop('timeout', None)} options.update(kwargs) return options def _delete(self, **kwargs): - # type: (bool, **Any) -> None + # type: (**Any) -> None """ Marks the specified path for deletion. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index c9247e5e1bfb..98fc89eadb2d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -852,7 +852,7 @@ def list_deleted_paths(self, **kwargs): The timeout parameter is expressed in seconds. :returns: An iterable (auto-paging) response of DeletedPathProperties. :rtype: - ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + ~azure.core.paging.AsyncItemPaged[~azure.storage.filedatalake.DeletedPathProperties] """ path_prefix = kwargs.pop('path_prefix', None) results_per_page = kwargs.pop('max_results', None) diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py index 62b64edf60f5..c56745603eb0 100644 --- a/sdk/storage/azure-storage-file-datalake/setup.py +++ b/sdk/storage/azure-storage-file-datalake/setup.py @@ -73,7 +73,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python', classifiers=[ - "Development Status :: 5 - Production/Stable", + "Development Status :: 4 - Beta", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py index 027dd2f85863..0d99845ce901 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py @@ -203,7 +203,7 @@ async def break_lease(self, **kwargs): operation, a fixed-duration share lease breaks after the remaining share lease period elapses, and an infinite share lease breaks immediately. - .. versionadded:: 12.6.0 + .. versionadded:: 12.5.0 :keyword int timeout: The timeout parameter is expressed in seconds. diff --git a/sdk/storage/azure-storage-file-share/setup.py b/sdk/storage/azure-storage-file-share/setup.py index a2cea96e1294..df38d0044dea 100644 --- a/sdk/storage/azure-storage-file-share/setup.py +++ b/sdk/storage/azure-storage-file-share/setup.py @@ -59,7 +59,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file-share', classifiers=[ - "Development Status :: 5 - Production/Stable", + "Development Status :: 4 - Beta", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', From b32f9674c519295ef690fd0e740101e9284b4d8d Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Sun, 9 May 2021 16:40:21 -0700 Subject: [PATCH 21/22] fixed return type --- .../azure/storage/filedatalake/_path_client.py | 6 ++++-- .../azure/storage/filedatalake/aio/_path_client_async.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py index 665322e49d56..8f0f58869fe3 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py @@ -3,7 +3,8 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Any, Dict +from datetime import datetime +from typing import Any, Dict, Union try: from urllib.parse import urlparse, quote @@ -212,12 +213,13 @@ def _delete_path_options(**kwargs): options = { 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions, + 'cls': return_response_headers, 'timeout': kwargs.pop('timeout', None)} options.update(kwargs) return options def _delete(self, **kwargs): - # type: (**Any) -> None + # type: (**Any) -> Dict[Union[datetime, str]] """ Marks the specified path for deletion. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py index 43537ec532cc..80c43d77704d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py @@ -4,7 +4,8 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Any, Dict +from datetime import datetime +from typing import Any, Dict, Union from azure.core.exceptions import AzureError, HttpResponseError from azure.storage.blob.aio import BlobClient @@ -133,7 +134,7 @@ async def _create(self, resource_type, content_settings=None, metadata=None, **k process_storage_error(error) async def _delete(self, **kwargs): - # type: (bool, **Any) -> None + # type: (**Any) -> Dict[Union[datetime, str]] """ Marks the specified path for deletion. From d9b46dbd0fd78b8394538063ad0555db8f3d7bc5 Mon Sep 17 00:00:00 2001 From: Tamer Sherif Date: Sun, 9 May 2021 20:52:19 -0700 Subject: [PATCH 22/22] skipped list deleted paths tests --- .../azure-storage-file-datalake/tests/test_file_system.py | 2 ++ .../azure-storage-file-datalake/tests/test_file_system_async.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index 0501afae7b20..1137f5754e96 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -416,6 +416,8 @@ def test_list_paths(self, datalake_storage_account_name, datalake_storage_accoun @DataLakePreparer() def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key): + if not self.is_playback(): + return self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = self._create_file_system() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index ccb249eceb88..2b31480e2662 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -576,6 +576,8 @@ async def test_list_paths_pages_correctly(self, datalake_storage_account_name, d @DataLakePreparer() async def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key): + if not self.is_playback(): + return self._setUp(datalake_storage_account_name, datalake_storage_account_key) # Arrange file_system = await self._create_file_system()