Ë
    Ìi¼�  ã                   ó
  — d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZ ddlmZ ddl m!Z!m"Z" dd	l#m$Z$m%Z% dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+ er$d dl m,Z, ddl&m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5  ede6e7«      Z8de9de9dee9   dee7e	f   ded   deee9e9f   ee9e9f   f   fd„Z:de	de9de9dee7e	f   de6f
d„Z; G d„ d e<«      Z= G d!„ d"e<«      Z> G d#„ d$ee8   «      Z?y)%é    N)ÚBytesIOÚStringIO)ÚAnyÚCallableÚcastÚDictÚ	GeneratorÚGenericÚIOÚIteratorÚListÚOptionalÚoverloadÚTupleÚTypeVarÚUnionÚTYPE_CHECKING)ÚDecodeErrorÚHttpResponseErrorÚIncompleteReadError)Úwith_current_contexté   )Ú!validate_and_format_range_headers)Úparse_length_from_content_rangeÚprocess_storage_error)Údeserialize_blob_propertiesÚget_page_ranges_result)Úadjust_blob_size_for_encryptionÚdecrypt_blobÚ&get_adjusted_download_range_and_offsetÚis_encryption_v2Úparse_encryption_data)ÚIncrementalDecoder)Ú_EncryptionData)ÚAzureBlobStorage)ÚBlobOperations)ÚBlobProperties)ÚStorageConfigurationÚTÚstart_rangeÚ	end_rangeÚlengthÚencryption_optionsÚencryption_datar$   Úreturnc                 ó|   — d\  }}|j                  d«      €|j                  d«      �t        | |||«      S | |f||ffS )N)r   r   ÚkeyÚresolver)Úgetr    )r*   r+   r,   r-   r.   Ústart_offsetÚ
end_offsets          ú]/var/www/html/strategist-ai/venv/lib/python3.12/site-packages/azure/storage/blob/_download.pyÚprocess_range_and_offsetr7   ,   s`   € ð  $Ñ€L�*Ø×Ñ˜eÓ$Ð0Ð4F×4JÑ4JÈ:Ó4VÐ4bÜ5ØØØØó	ð 	ð ˜Ð# l°JÐ%?Ð?Ð?ó    Údatar4   r5   Ú
encryptionc           	      óž  — | €t        d«      ‚dj                  t        | «      «      }|r|j                  d«      €|j                  d«      �W	 t	        |j                  d«      xs d|j                  d«      |j                  d«      |||| j
                  j                  «      S |S # t        $ r}t        d| j
                  |¬«      |‚d }~ww xY w)	NzResponse cannot be None.r8   r1   r2   ÚrequiredFzDecryption failed.)ÚmessageÚresponseÚerror)	Ú
ValueErrorÚjoinÚlistr3   r   r>   ÚheadersÚ	Exceptionr   )r9   r4   r5   r:   Úcontentr?   s         r6   Úprocess_contentrF   >   sÉ   € Ø€|ÜÐ3Ó4Ð4à�h‰h”t˜D“zÓ"€Gá�:—>‘> %Ó(Ð4¸
¿¹ÀzÓ8RÐ8^ð	rÜØ—‘˜zÓ*Ò3¨eØ—‘˜uÓ%Ø—‘˜zÓ*ØØØØ—‘×%Ñ%óð ð €Nøô ò 	rÜ#Ð,@È4Ï=É=Ð`eÔfÐlqÐqûð	rús   ÁAB% Â%	CÂ.CÃCc                   óT  — e Zd Z	 	 	 	 	 d"dddededededed	ed
eeef   ded   dedee   dee	eeef         dee
eee   gdf      deddfd„Zdedeeef   fd„Zdeeddf   fd„Zdeddfd„Zdedeeef   fd„Zdeddfd„Zdededdfd„Zdededefd„Zded edeeef   fd!„Zy)#Ú_ChunkDownloaderNÚclientr&   Ú
total_sizeÚ
chunk_sizeÚcurrent_progressr*   r+   Úvalidate_contentr-   r.   r$   ÚstreamÚparallelÚnon_empty_rangesÚprogress_hookÚkwargsr/   c                 ó`  — || _         || _        || _        || _        || _        || _        |
| _        |rt        j                  «       nd | _	        |rt        j                  «       nd | _
        || _        |r|
j                  «       nd| _        || _        || _        |	| _        || _        || _        y ©Nr   )rI   rP   rK   rJ   Ústart_indexÚ	end_indexrN   Ú	threadingÚLockÚstream_lockÚprogress_lockrQ   ÚtellÚstream_startÚprogress_totalr-   r.   rM   Úrequest_options)ÚselfrI   rJ   rK   rL   r*   r+   rM   r-   r.   rN   rO   rP   rQ   rR   s                  r6   Ú__init__z_ChunkDownloader.__init__U   s«   € ð" ˆŒØ 0ˆÔð %ˆŒØ$ˆŒØ&ˆÔØ"ˆŒð ˆŒÙ/7œ9Ÿ>™>Ô+¸TˆÔÙ19œYŸ^™^Ô-¸tˆÔØ*ˆÔñ .6˜FŸK™KœM¸1ˆÔð /ˆÔð #5ˆÔØ.ˆÔð !1ˆÔØ%ˆÕr8   Úchunk_startc                 ó€   — || j                   z   | j                  kD  r| j                  }||fS || j                   z   }||fS ©N)rK   rV   ©r_   ra   Ú	chunk_ends      r6   Ú_calculate_rangez!_ChunkDownloader._calculate_range„   sH   € Ø˜Ÿ™Ñ(¨4¯>©>Ò9ØŸ™ˆIð ˜IÐ%Ð%ð $ d§o¡oÑ5ˆIØ˜IÐ%Ð%r8   c              #   óŠ   K  — | j                   }|| j                  k  r$|–— || j                  z  }|| j                  k  rŒ#y y ­wrc   )rU   rV   rK   )r_   Úindexs     r6   Úget_chunk_offsetsz"_ChunkDownloader.get_chunk_offsets‹   s>   è ø€ Ø× Ñ ˆØ�d—n‘nÒ$ØŠKØ�T—_‘_Ñ$ˆEð �d—n‘nÕ$ùs   ‚>AÁAc                 ó¸   — | j                  |«      \  }}| j                  ||dz
  «      \  }}||z
  }|dkD  r$| j                  ||«       | j                  |«       y y )Nr   r   )rf   Ú_download_chunkÚ_write_to_streamÚ_update_progress)r_   ra   re   Ú
chunk_dataÚ_r,   s         r6   Úprocess_chunkz_ChunkDownloader.process_chunk‘   se   € Ø!%×!6Ñ!6°{Ó!CÑˆ�YØ×,Ñ,¨[¸)Àa¹-ÓH‰ˆ
�AØ˜[Ñ(ˆØ�AŠ:Ø×!Ñ! *¨kÔ:Ø×!Ñ! &Õ)ð r8   c                 óT   — | j                  |«      \  }}| j                  ||dz
  «      S )Nr   )rf   rk   rd   s      r6   Úyield_chunkz_ChunkDownloader.yield_chunk™   s.   € Ø!%×!6Ñ!6°{Ó!CÑˆ�YØ×#Ñ# K°¸Q±Ó?Ð?r8   r,   c                 ó  — | j                   r+| j                   5  | xj                  |z  c_        d d d «       n| xj                  |z  c_        | j                  r'| j                  | j                  | j                  «       y y # 1 sw Y   Œ=xY wrc   )rZ   r]   rQ   rJ   )r_   r,   s     r6   rm   z!_ChunkDownloader._update_progress�   sz   € Ø×ÒØ×#Ñ#ñ .Ø×#Ò# vÑ-Õ#÷.ð .ð ×Ò 6Ñ)Õà×ÒØ×Ñ˜t×2Ñ2°D·O±OÕDð ÷.ð .ús   ™BÂB
rn   c                 ó6  — | j                   rf| j                   5  | j                  j                  | j                  || j                  z
  z   «       | j                  j                  |«       d d d «       y | j                  j                  |«       y # 1 sw Y   y xY wrc   )rY   rN   Úseekr\   rU   Úwrite)r_   rn   ra   s      r6   rl   z!_ChunkDownloader._write_to_stream§   s|   € Ø×ÒØ×!Ñ!ñ .Ø—‘× Ñ  ×!2Ñ!2°kÀD×DTÑDTÑ6TÑ!UÔVØ—‘×!Ñ! *Ô-÷.ð .ð �K‰K×Ñ˜jÕ)÷	.ð .ús   ™ABÂBÚgiven_range_startÚgiven_range_endc                 óh   — | j                   €y| j                   D ]  }||d   k  r y|d   |k  rŒ y y)NFÚstartTÚend)rP   )r_   rw   rx   Úsource_ranges       r6   Ú_do_optimizez_ChunkDownloader._do_optimize¯   sW   € ð × Ñ Ð(Øà ×1Ñ1ò 	ˆLð  ¨gÑ!6Ò6Ùð ˜eÑ$Ð'8Ò8Øñ ð	ð" r8   re   c           	      ó”  — | j                   €t        d«      ‚t        |||| j                   | j                  «      \  }}| j	                  |d   |d   «      r|d   |d   z
  dz   }d|z  }||fS t        |d   |d   | j                  ¬«      \  }}d}	d}
|	rtd }	  | j                  j                  d||| j                  | j                  | j                  dœ| j                  ¤Ž\  }}	 t        ||d   |d   | j                   «      }d	}	|	rŒtj&                  }| j                  j)                  d«      r(|j*                  j,                  | j                  d   _        |fS # t        $ r}t        |«       Y d }~Œ�d }~ww xY w# t        t        t         f$ r7}|
dz  }
|
dk  rt        ||¬
«      |‚t#        j$                  d«       Y d }~Œ½d }~ww xY w)Nz0Required argument is missing: encryption_optionsr   r   ó    )Úcheck_content_md5Té   ©ÚrangeÚrange_get_content_md5rM   Údata_stream_totalÚdownload_stream_currentF©r?   Úmodified_access_conditions© )r-   r@   r7   r.   r}   r   rM   rI   ÚdownloadrJ   r]   r^   r   r   rF   r   r   ÚtimeÚsleepÚcontent_lengthr3   Ú
propertiesÚetagÚif_match)r_   ra   re   Údownload_rangeÚoffsetr�   rn   Úrange_headerÚrange_validationÚretry_activeÚretry_totalr>   ro   r?   s                 r6   rk   z _ChunkDownloader._download_chunkÈ   s  € Ø×"Ñ"Ð*ÜÐOÓPÐPÜ!9Ø˜ I¨t×/FÑ/FÈ×H\ÑH\ó"
Ñˆ˜ð ×Ñ˜^¨AÑ.°¸qÑ0AÔBØ+¨AÑ.°ÀÑ1BÑBÀQÑFˆNØ  >Ñ1ˆJðN ˜>Ð)Ð)ôK .OØ˜qÑ!Ø˜qÑ!Ø"&×"7Ñ"7ô.Ñ*ˆLÐ*ð  ˆLØˆKÙØ $�ð
1Ø"6 $§+¡+×"6Ñ"6ð #Ø*Ø.>Ø)-×)>Ñ)>Ø*.¯/©/Ø04×0CÑ0Cñ#ð ×.Ñ.ñ#‘K�A�xð"Ü!0°¸6À!¹9ÀfÈQÁiÐQU×QhÑQhÓ!i�JØ#(�Lò! ð, &×4Ñ4ˆNð ×#Ñ#×'Ñ'Ð(DÔEØNV×NaÑNa×NfÑNf�×$Ñ$Ð%AÑBÔKà˜>Ð)Ð)øô% )ò 1Ü)¨%×0Ñ0ûð1ûô ,Ô->ÄÐLò "Ø 1Ñ$�KØ" aÒ'Ü/°¸UÔCÈÐNÜ—J‘J˜q—M‘Mûð	"ús1   ÂAE Ã% E< Å	E9Å$E4Å4E9Å<GÆ-GÇG)NNNNN)Ú__name__Ú
__module__Ú__qualname__ÚintÚboolr   Ústrr   r   r   r   r`   r   rf   r	   ri   rp   Úbytesrr   rm   rl   r}   rk   r‰   r8   r6   rH   rH   T   s»  „ ð 8<ØØ"&Ø;?ØHLñ-&à ð-&ð ð-&ð ð	-&ð
 ð-&ð ð-&ð ð-&ð ð-&ð !  c ™Nð-&ð "Ð"3Ñ4ð-&ð ð-&ð ˜3‘-ð-&ð # 4¨¨S°#¨X©Ñ#7Ñ8ð-&ð   ¨#¨x¸©}Ð)=¸tÐ)CÑ DÑEð-&ð ð-&ð  
ó!-&ð^&¨Cð &°E¸#¸s¸(±Oó &ð% 9¨S°$¸¨_Ñ#=ó %ð*¨ð *°ó *ð@ sð @¨u°U¸C°ZÑ/@ó @ðE sð E¨tó Eð*¨5ð *¸sð *Àtó *ð¨cð ÀCð ÈDó ð22*¨3ð 2*¸3ð 2*À5ÈÐPSÈÑCTô 2*r8   rH   c            
       ól   — e Zd ZdZdededee   deddf
d„Zdefd	„Z	de
e   fd
„Zdefd„ZeZdefd„Zy)Ú_ChunkIteratorz,Iterator for chunks in blob download stream.ÚsizerE   Ú
downloaderrK   r/   Nc                 ó^   — || _         || _        || _        || _        d | _        |dk(  | _        y rT   )r    Ú_chunk_sizeÚ_current_contentÚ_iter_downloaderÚ_iter_chunksÚ	_complete)r_   r    rE   r¡   rK   s        r6   r`   z_ChunkIterator.__init__   s4   € ØˆŒ	Ø%ˆÔØ 'ˆÔØ *ˆÔØBFˆÔØ ™ˆ�r8   c                 ó   — | j                   S rc   ©r    ©r_   s    r6   Ú__len__z_ChunkIterator.__len__  ó   € Ø�y‰yÐr8   c                 ó   — | S rc   r‰   rª   s    r6   Ú__iter__z_ChunkIterator.__iter__  s   € Øˆr8   c                 ó¨  — | j                   rt        d«      ‚| j                  sEt        | j                  «      | j
                  kD  r| j                  «       S d| _         | j                  S | j                  s| j                  j                  «       | _        t        | j                  «      | j
                  k\  r| j                  «       S 	 t        | j                  «      }| xj                  | j                  j                  |«      d   z  c_        | j                  «       S # t        $ r+}d| _         | j                  r| j                  cY d }~S |‚d }~ww xY w)NzDownload completeTr   )r§   ÚStopIterationr¥   Úlenr¤   r£   Ú_get_chunk_datar¦   ri   Únextrr   )r_   Ú
next_chunkÚes      r6   Ú__next__z_ChunkIterator.__next__  s$  € Ø�>Š>ÜÐ 3Ó4Ð4Ø×$Ò$ä�4×(Ñ(Ó)¨D×,<Ñ,<Ò<Ø×+Ñ+Ó-Ð-Ø!ˆDŒNØ×(Ñ(Ð(à× Ò Ø $× 5Ñ 5× GÑ GÓ IˆDÔô ˆt×$Ñ$Ó%¨×)9Ñ)9Ò9Ø×'Ñ'Ó)Ð)ð	Ü˜d×/Ñ/Ó0ˆJØ×!Ò! T×%:Ñ%:×%FÑ%FÀzÓ%RÐSTÑ%UÑUÕ!ð ×#Ñ#Ó%Ð%øô ò 	Ø!ˆDŒNØ×$Ò$Ø×,Ñ,Õ,ØˆGûð		ús%   ÃAD Ä	EÄ&EÅEÅ
EÅEc                 ót   — | j                   d | j                   }| j                   | j                  d  | _         |S rc   )r¤   r£   )r_   rn   s     r6   r²   z_ChunkIterator._get_chunk_data/  s=   € Ø×*Ñ*Ð+=¨T×-=Ñ-=Ð>ˆ
Ø $× 5Ñ 5°d×6FÑ6FÐ6GÐ HˆÔØÐr8   )r—   r˜   r™   Ú__doc__rš   r�   r   rH   r`   r«   r   r®   r¶   r³   r²   r‰   r8   r6   rŸ   rŸ   ý   sp   „ Ù6ð#˜Sð #¨5ð #¸hÐGWÑ>Xð #Ðfið #Ðnró #ð˜ó ð˜( 5™/ó ð&˜%ó &ð< €Dð ô r8   rŸ   c                   ó˜  — e Zd ZU dZeed<   	 eed<   	 ded<   	 eed<   	 	 	 	 	 	 	 	 	 	 	 	 d(dd	d
ddee   dee   dede	ee
f   dedededee   dee   de
ddfd„Zd„ Zd)d„Zed„ «       Zd„ Zdee   fd„Zed*dedefd„«       Zeddœdee   defd„«       Zd*ddœdedee   defd„Zdefd „Zd!ee   defd"„Zd#„ Zd$„ Zd+d%„Zd,d&„Zd+d'„Zy)-ÚStorageStreamDownloaderz<
    A streaming object to download from Azure Storage.
    ÚnameÚ	containerr'   rŽ   r    NÚclientsr%   Úconfigr(   r*   r+   rM   r-   Úmax_concurrencyÚencodingÚdownload_clsrR   r/   c                 ó¬  — || _         |	| _        d| _        || _        || _        || _        || _        || _        |
| _        || _	        |xs i | _
        |j                  dd «      | _        || _        d | _        d | _        d| _        d| _        d | _        d | _        d| _        d| _        d| _        d| _        d | _        d | _        d| _        | j
                  xs d| _        || j                  d<   | j                  j9                  d«      €| j                  j9                  d«      �| j;                  «        | j                  s| j                  j<                  n| j                  j>                  }| j6                  }| j                  �| j                  |z
  |k  r| j                  }n||z   dz
  }tA        ||| j                  | j                  | j&                  «      \  | _!        | _"        | jG                  «       | _        tI        d	| j                  jJ                  «      | _%        | j                   | jJ                  _         | j                  | jJ                  _        | j                  | jJ                  _        d
| j6                  › d| j                  �| j                  n| j"                  dz
  › d| j"                  › �| jJ                  _&        d | jJ                  _'        y )Nr   rQ   r8   TÚclsr1   r2   r   r'   zbytes ú-ú/)(r»   r¼   r    Ú_clientsÚ_configÚ_start_rangeÚ
_end_rangeÚ_max_concurrencyÚ	_encodingÚ_validate_contentÚ_encryption_optionsÚpopÚ_progress_hookÚ_request_optionsÚ	_responseÚ_location_moder¤   Ú
_file_sizeÚ_non_empty_rangesÚ_encryption_dataÚ_download_offsetÚ_raw_download_offsetÚ_read_offsetÚ_current_content_offsetÚ
_text_modeÚ_decoderÚ_first_chunkÚ_download_startr3   Ú_get_encryption_data_requestÚmax_single_get_sizeÚmax_chunk_get_sizer7   Ú_initial_rangeÚ_initial_offsetÚ_initial_requestr   rŽ   Úcontent_rangeÚcontent_md5)r_   r½   r¾   r*   r+   rM   r-   r¿   r»   r¼   rÀ   rÁ   rR   Úfirst_get_sizeÚinitial_request_startÚinitial_request_ends                   r6   r`   z StorageStreamDownloader.__init__E  s•  € ð ˆŒ	Ø"ˆŒØˆŒ	àˆŒØˆŒØ'ˆÔØ#ˆŒØ /ˆÔØ!ˆŒØ!1ˆÔØ#5Ò#;¸ˆÔ Ø$Ÿj™j¨¸$Ó?ˆÔØ &ˆÔØˆŒØ"ˆÔØ36ˆÔØˆŒØ!%ˆÔØ=AˆÔð !"ˆÔà$%ˆÔ!àˆÔà'(ˆÔ$à*.ˆŒØ8<ˆŒà ˆÔØ#×0Ñ0Ò5°AˆÔð (4ˆ×Ñ˜eÑ$à×#Ñ#×'Ñ'¨Ó.Ð:¸d×>VÑ>V×>ZÑ>ZÐ[eÓ>fÐ>rØ×-Ñ-Ô/ð 59×4JÒ4JˆD�L‰L×,Ò,ÐPT×P\ÑP\×PoÑPoð 	ð !%× 4Ñ 4ÐØ�?‰?Ð&¨4¯?©?Ð=RÑ+RÐUcÒ+cØ"&§/¡/Ñà"7¸.Ñ"HÈ1Ñ"LÐä4LØ!ØØ�O‰OØ×$Ñ$Ø×!Ñ!ó5
Ñ1ˆÔ˜TÔ1ð ×.Ñ.Ó0ˆŒÜÐ/°·±×1JÑ1JÓKˆŒØ#Ÿy™yˆ�‰ÔØ$(§N¡Nˆ�‰Ô!ð  $Ÿy™yˆ�‰ÔØ+1°$×2FÑ2FÐ1GÀqØ?C¿¹Ð?Z¨D¯OªOÐ`d×`oÑ`oÐrsÑ`sÐ+tÐtuØ,0¯O©OÐ+<ð*>ˆ�‰Ô%ð '+ˆ�‰Õ#r8   c                 ó   — | j                   S rc   r©   rª   s    r6   r«   zStorageStreamDownloader.__len__£  r¬   r8   c                 ó„  — | j                   j                  dd «      }| j                   j                  dd «      }t        | j                   d<   t        d | j                  j
                  j                  di | j                   ¤Ž«      }t        |j                  «      | _	        || j                   d<   |�|| j                   d<   y y )NrÃ   Ú
decompressr'   r‰   )
rÐ   rÎ   r   r   rÆ   ÚblobÚget_propertiesr"   ÚmetadatarÕ   )r_   rÁ   rë   rŽ   s       r6   rÞ   z4StorageStreamDownloader._get_encryption_data_request¦  sº   € à×,Ñ,×0Ñ0°¸Ó=ˆð ×*Ñ*×.Ñ.¨|¸TÓBˆ
ô (Cˆ×Ñ˜eÑ$äÐ*Ð,M¨D¯M©M×,>Ñ,>×,MÑ,MÑ,fÐPT×PeÑPeÑ,fÓgˆ
ô !6°j×6IÑ6IÓ JˆÔð (4ˆ×Ñ˜eÑ$ð Ð!Ø2<ˆD×!Ñ! ,Ò/ð "r8   c                 ó�   — t        | j                  «      r| j                  | j                  k\  S | j                  | j                  k\  S rc   )r!   rÕ   rÖ   r    r×   rª   s    r6   Ú_download_completez*StorageStreamDownloader._download_complete½  s:   € ä˜D×1Ñ1Ô2Ø×(Ñ(¨D¯I©IÑ5Ð5Ø×(Ñ(¨D¯I©IÑ5Ð5r8   c                 ó  — t        | j                  d   | j                  d   dd| j                  ¬«      \  }}d}d}|�r¹	 t        t        t
        t           t        f    | j                  j                  j                  d||| j                  d ddœ| j                  ¤Ž«      \  }}|| _        t        |j                  j                  «      | _        | j                   €t#        d«      ‚t%        | j                   | j&                  «      | _        | j(                  �O| j*                  �Ct-        | j                   | j*                  z
  | j(                  | j*                  z
  dz   «      | _        n<| j*                  �| j                   | j*                  z
  | _        n| j                   | _        	 | j.                  dk(  rd| _        n7t;        | j<                  d   | j<                  d   | j>                  «      | _        d}|r�Œ¹| xjH                  tK        | j8                  «      z  c_$        | xjL                  jN                  z  c_&        |j                  jP                  dk(  r8	 | j                  jR                  jU                  «       }
tW        |
«      d   | _,        | jZ                  sC| j                  j]                  d«      r(|j                  j^                  | j                  d   _0        |S # t0        $ rº}| j*                  €˜|j2                  rŒ|j2                  j4                  d	k(  rs	  | j                  j                  j                  d| j                  ddd
œ| j                  ¤Ž\  }}n!# t0        $ r}	t7        |	«       Y d }	~	nd }	~	ww xY wd| _        d| _        nt7        |«       Y d }~�Œüd }~ww xY w# t@        t0        tB        f$ r8}|dz  }|dk  rt1        ||¬«      |‚tE        jF                  d«       Y d }~�Œúd }~ww xY w# t0        $ r Y �Œrw xY w)Nr   r   F)Ústart_range_requiredÚend_range_requiredr€   Tr�   r‚   z?Required Content-Range response header is missing or malformed.i   )rM   r…   r†   r8   r‡   ÚPageBlobrˆ   r‰   )1r   rá   rÌ   r   r   r   rœ   r   rÆ   rì   rŠ   rÐ   rÒ   r   rŽ   rä   rÓ   r@   r   rÕ   rÉ   rÈ   Úminr    r   r>   Ústatus_coder   r¤   rF   râ   rÍ   r   r   r‹   rŒ   rÖ   r±   r×   r�   Ú	blob_typeÚ	page_blobÚget_page_rangesr   rÔ   rð   r3   r�   r�   )r_   r“   r”   r•   r–   Úlocation_moder>   r?   ro   rµ   Úpage_rangess              r6   rã   z(StorageStreamDownloader._initial_requestÃ  sª  € Ü)JØ×Ñ Ñ"Ø×Ñ Ñ"Ø!&Ø$Ø"×4Ñ4ô*
Ñ&ˆÐ&ð ˆØˆÚð11Ü*.¬u´X¼c±]ÄCÐ5GÑ/HÐJeÈ$Ï-É-×J\ÑJ\×JeÑJeð KØ&Ø*:Ø%)×%;Ñ%;Ø&*Ø,-ñKð ×+Ñ+ñKó +Ñ'�˜xð '4�Ô#ô #BÀ(×BUÑBU×BcÑBcÓ"d�”Ø—?‘?Ð*Ü$Ð%fÓgÐgä"AÀ$Ç/Á/ÐSW×ShÑShÓ"i�”à—?‘?Ð.°4×3DÑ3DÐ3Pä # D§O¡O°d×6GÑ6GÑ$GÈÏÉÐ[_×[lÑ[lÑIlÐopÑIpÓ q�D•IØ×&Ñ&Ð2Ø $§¡°$×2CÑ2CÑ C�D•Ià $§¡�D”Ið.Ø—9‘9 ’>Ø,/�DÕ)ä,;Ø Ø×,Ñ,¨QÑ/Ø×,Ñ,¨QÑ/Ø×0Ñ0ó	-�DÔ)ð  %�ó} ðH 	×Ò¤ T×%:Ñ%:Ó!;Ñ;ÕØ×!Ò! X×%<Ñ%<Ñ<Õ!ð ×Ñ×(Ñ(¨JÒ6ðØ"Ÿm™m×5Ñ5×EÑEÓG�Ü)?ÀÓ)LÈQÑ)O�Ô&ð ×&Ò&¨4×+@Ñ+@×+DÑ+DÐEaÔ+bØKS×K^ÑK^×KcÑKcˆD×!Ñ!Ð">Ñ?ÔHàˆøôo %ò 1Ø×$Ñ$Ð,°·²ÀEÇNÁN×D^ÑD^ÐbeÒDeð1Ø&A d§m¡m×&8Ñ&8×&AÑ&Að 'Ø-1×-CÑ-CØ./Ø45ñ'ð #×3Ñ3ñ	'™˜™8øô -ò 1Ü-¨a×0Ñ0ûð1úð !"�D”IØ&'�D•Oä)¨%Ô0ÿùð'1ûô@ (Ô):¼KÐHò Ø˜qÑ �Ø !Ò#Ü+¨E¸Ô?ÀUÐJÜ—
‘
˜1—’ûð	ûô" %ò Úðúso   Á E#K! Æ$AN' É7O6 Ë!	N$Ë*1NÌAMÍNÍ	M<Í'M7Í2NÍ7M<Í<NÎN$Î'O3Î;-O.Ï.O3Ï6	PÐPc                 ó0  — | j                   rt        d«      ‚| j                  rt        j                  d«       d}| j
                  r| j                  sð| j
                  r8| j                  t        | j                  «      z   }t        | j                  «      }n| j                  }d}| j                  | j                  z   }t        d| j                  j                  | j                  | j                  | j                  j                   |||| j"                  | j$                  | j&                  | j(                  dœ| j*                  ¤Ž}| j
                  r| j                  nd}t-        | j                  t/        t0        |«      || j                  j                   ¬«      S )	að  
        Iterate over chunks in the download stream. Note, the iterator returned will
        iterate over the entire download content, regardless of any data that was
        previously read.

        NOTE: If the stream has been partially read, some data may be re-downloaded by the iterator.

        :return: An iterator of the chunks in the download stream.
        :rtype: Iterator[bytes]

        .. admonition:: Example:

            .. literalinclude:: ../samples/blob_samples_hello_world.py
                :start-after: [START download_a_blob_in_chunk]
                :end-before: [END download_a_blob_in_chunk]
                :language: python
                :dedent: 12
                :caption: Download a blob using chunks().
        zRStream has been partially read in text mode. chunks is not supported in text mode.z<Encoding is ignored with chunks as only bytes are supported.Nr   )rI   rP   rJ   rK   rL   r*   r+   rM   r-   r.   Úuse_locationr8   )r    rE   r¡   rK   r‰   )rÚ   r@   rË   ÚwarningsÚwarnrÜ   rð   rÝ   r±   r¤   r    rH   rÆ   rì   rÔ   rÇ   rà   rÌ   rÍ   rÕ   rÒ   rÐ   rŸ   r   r�   )r_   Úiter_downloaderrz   rL   r{   Úinitial_contents         r6   ÚchunkszStorageStreamDownloader.chunks&  sV  € ð( �?Š?ÜÐqÓrÐrØ�>Š>Ü�M‰MÐXÔYàˆà× Ò ¨×(?Ò(?Ø× Ò Ø×,Ñ,¬s°4×3HÑ3HÓ/IÑI�Ü#& t×'<Ñ'<Ó#=Ñ à×,Ñ,�Ø#$Ð à×&Ñ&¨¯©Ñ2ˆCä.ð Ø—}‘}×)Ñ)Ø!%×!7Ñ!7ØŸ9™9ØŸ<™<×:Ñ:Ø!1Ø!ØØ!%×!7Ñ!7Ø#'×#;Ñ#;Ø $× 5Ñ 5Ø!×0Ñ0ñð ×'Ñ'ñˆOð 48×3DÒ3D˜$×/Ò/È#ˆÜØ—‘Üœ Ó0Ø&Ø—|‘|×6Ñ6ô	8ð 	8r8   c                  ó   — y rc   r‰   )r_   r    s     r6   ÚreadzStorageStreamDownloader.reada  ó   € àr8   )Úcharsr  c                 ó   — y rc   r‰   )r_   r  s     r6   r  zStorageStreamDownloader.reade  r  r8   c                ó@  — |dkD  r!| j                   rt        j                  d«       |dkD  r|�t        d«      ‚| j                   s|�t        d«      ‚| j                  r|dkD  rt        d«      ‚| j                  du r|�t        d«      ‚|d	k(  s3|d	k(  s.| j
                  r2| j                  t        | j                  «      k\  r| j                   sd
S dS | j                  s„|�‚| j                   �vd| _         t        j                  | j                   «      d«      | _        | j                  j                  t        t        | j                  «      | j
                  ¬«      | _        n| j                  €d| _        | j                  r$t        «       }|�|d	k  rt         j"                  n|}n!t%        «       }|d	kD  r|nt         j"                  }|t         j"                  k(  }d	}| j                  }t'        t        | j                  «      | j                  z
  ||z
  «      }|j)                  | j                  |||z    «      }||z  }| xj                  |z  c_        | xj*                  |z  c_        | j-                  «        ||z
  }	|	d	kD  �r| j
                  �s| j.                  | j0                  z   }| j.                  | j2                  z   }
| j4                  dkD  }t7        d| j8                  j:                  | j<                  | j2                  | j>                  j@                  | j*                  ||
||| jB                  | jD                  | jF                  | jH                  | jJ                  dœ| jL                  ¤Ž}d| _'        |jQ                  «       }|r×| j                  sË|rŸ| j2                  | j0                  z
  | j>                  j@                  kD  rod	dl)}|jT                  jW                  | j4                  «      5 }tY        |j[                  t]        |j^                  «      |jQ                  «       «      «       ddd«       n|D ]  }|j_                  |«       Œ | ja                  «        �n@tc        |d«      x}��1|	d	kD  �r+|je                  |«      \  }}| xj0                  t        |«      z  c_        | xjf                  |z  c_3        | j                  r9| j                  �-| j                  j                  || j
                  ¬«      | _        n|| _        |	t        | j                  «      k  r|j)                  | j                  d|	 «      }n|j)                  | j                  «      }|| _        | xj*                  |z  c_        |	|z  }	| j-                  «        tc        |d«      x}�|	d	kD  r�Œ+|ji                  «       }| j                  s8| j                   r,	 t        t        |«      j                  | j                   «      }|S |S # 1 sw Y   �Œ²xY w# tj        $ r t        j                  d«       ‚ w xY w)a�  
        Read the specified bytes or chars from the stream. If `encoding`
        was specified on `download_blob`, it is recommended to use the
        chars parameter to read a specific number of chars to avoid decoding
        errors. If size/chars is unspecified or negative all bytes will be read.

        :param int size:
            The number of bytes to download from the stream. Leave unspecified
            or set negative to download all bytes.
        :keyword Optional[int] chars:
            The number of chars to download from the stream. Leave unspecified
            or set negative to download all chars. Note, this can only be used
            when encoding is specified on `download_blob`.
        :return:
            The requested data as bytes or a string if encoding was specified. If
            the return value is empty, there is no more data to read.
        :rtype: T
        éÿÿÿÿz„Size parameter specified with text encoding enabled. It is recommended to use chars to read a specific number of characters instead.Nz#Cannot specify both size and chars.z$Must specify encoding to read chars.z>Stream has been partially read in text mode. Please use chars.Fz>Stream has been partially read in bytes mode. Please use size.r   r8   Ú TÚstrict)Úfinalr   ©rI   rP   rJ   rK   rL   r*   r+   rN   rO   rM   r-   r.   rý   rQ   z†Encountered a decoding error while decoding blob data from a partial read. Try using the `chars` keyword instead to read in text mode.r‰   )6rË   rþ   rÿ   r@   rÚ   rð   rÙ   r±   r¤   ÚcodecsÚgetincrementaldecoderrÛ   Údecoder   r�   r   ÚsysÚmaxsizer   rõ   rv   rØ   Ú_check_and_report_progressrÝ   rÖ   r    rÊ   rH   rÆ   rì   rÔ   rÇ   rà   rÌ   rÍ   rÕ   rÒ   rÏ   rÐ   rÜ   ri   Úconcurrent.futuresÚfuturesÚThreadPoolExecutorrB   Úmapr   rp   Ú_complete_readr³   rr   r×   ÚgetvalueÚUnicodeDecodeError)r_   r    r  Úoutput_streamÚreadallÚcountrz   r,   r  Ú	remainingr{   rO   r¡   Úchunks_iterÚ
concurrentÚexecutorr´   Úchunkrn   r�   r9   s                        r6   r  zStorageStreamDownloader.readj  ss  € ð& �"Š9˜ŸšÜ�M‰MðCôð �"Š9˜Ð*ÜÐBÓCÐCØ�~Š~ %Ð"3ÜÐCÓDÐDØ�?Š?˜t bšyÜÐ]Ó^Ð^Ø�?‰?˜eÑ#¨Ð(9ÜÐ]Ó^Ð^ð �AŠI˜ !šØ×(Ò(¨T×-IÑ-IÌSÐQU×QfÑQfÓMgÒ-gØ"Ÿnšn�3Ð4°"Ð4à�Š 5Ð#4¸¿¹Ð9SØ"ˆDŒOØHœF×8Ñ8¸¿¹ÓHÈÓRˆDŒMØ$(§M¡M×$8Ñ$8Ü”U˜D×1Ñ1Ó2¸$×:QÑ:Qð %9ó %SˆDÕ!à�_‰_Ð$Ø#ˆDŒOð �?Š?Ü$›JˆMØ"' -°5¸A²:”3—;’;À5‰Dä#›IˆMØ !š8‘4¬¯©ˆDØœ#Ÿ+™+Ñ%ˆØˆð ×,Ñ,ˆÜ”S˜×.Ñ.Ó/°$×2NÑ2NÑNÐPTÐW\ÑP\Ó]ˆØ×"Ñ" 4×#8Ñ#8¸¸uÀv¹~Ð#NÓOˆà�‰ˆØ×$Ò$¨Ñ,Õ$Ø×Ò˜TÑ!ÕØ×'Ñ'Ô)à˜5‘Lˆ	Ø�q‹= ×!8Ó!8à×(Ñ(¨4×+@Ñ+@Ñ@ˆEØ×&Ñ&¨¯©Ñ2ˆCà×,Ñ,¨qÑ0ˆHÜ)ð Ø—}‘}×)Ñ)Ø!%×!7Ñ!7ØŸ9™9ØŸ<™<×:Ñ:Ø!%×!2Ñ!2Ø!ØØ$Ø!Ø!%×!7Ñ!7Ø#'×#;Ñ#;Ø $× 5Ñ 5Ø!×0Ñ0Ø"×1Ñ1ñð ×'Ñ'ñˆJð" !&ˆDÔð
 %×6Ñ6Ó8ˆKÙ˜tŸšá §¡¨T×-BÑ-BÑ!BÀdÇlÁl×FeÑFeÒ eÛ-Ø#×+Ñ+×>Ñ>¸t×?TÑ?TÓUð ÐYaÜ˜XŸ\™\Ü0°×1IÑ1IÓJØ&×8Ñ8Ó:óô ÷ð ð '2ò =˜
Ø"×0Ñ0°Õ<ð=ð ×#Ñ#Ö%ô !% [°$Ó 7Ð7�uÑDÈÐUVËØ1;×1GÑ1GÈÓ1NÑ.�J Ø×)Ò)¬S°«_Ñ<Õ)Ø×-Ò-°Ñ?Õ-Ø—’¨4¯=©=Ð+DØ04·±×0DÑ0DÀZÐW[×WnÑWnÐ0DÓ0o˜Õ-à0:˜Ô-à ¤3 t×'<Ñ'<Ó#=Ò=Ø,×2Ñ2°4×3HÑ3HÈÈ)Ð3TÓU™à,×2Ñ2°4×3HÑ3HÓI˜à37�DÔ0Ø×%Ò%¨Ñ-Õ%Ø Ñ%�IØ×3Ñ3Ô5ô# !% [°$Ó 7Ð7�uÐDÈÐUVÌð& ×%Ñ%Ó'ˆØ�Š 4§>¢>ðäœE 4Ó(×/Ñ/°·±Ó?�ð ˆˆtˆ÷Wñ ûôH &ò Ü—‘ðRôð ðús   Ï*=W0×)W= ×0W:×= Xc                 ó"   — | j                  «       S )zà
        Read the entire contents of this blob.
        This operation is blocking until all data is downloaded.

        :return: The requested data as bytes or a string if encoding was specified.
        :rtype: T
        )r  rª   s    r6   r  zStorageStreamDownloader.readallû  s   € ð �y‰y‹{Ðr8   rN   c                 óL  — | j                   rt        d«      ‚| j                  rt        j                  d«       | j
                  dkD  }|rPd}t        j                  dk\  r|j                  «       st        |«      ‚	 |j                  |j                  «       «       | j                  | j                  z
  }|dk  ryt        | j                   «      | j"                  z
  }| j"                  }|j%                  t'        t(        | j                   |||z    «      «      }| xj"                  |z  c_        | xj                  |z  c_        | j*                  r&| j+                  | j                  | j                  «       | j,                  r|S | j.                  | j                  z   }	| j.                  | j                  z   }
t1        d	| j2                  j4                  | j6                  | j                  | j8                  j:                  | j                  |	|
||| j<                  | j>                  | j@                  | jB                  | j*                  dœ| jD                  ¤Ž}|roddl#}|jH                  jK                  | j
                  «      5 }tM        |jO                  tQ        |jR                  «      |jU                  «       «      «       ddd«       n&|jU                  «       D ]  }|jS                  |«       Œ | jW                  «        |S # t        t        f$ r}t        |«      |‚d}~ww xY w# 1 sw Y   Œ>xY w)
ae  Download the contents of this file to a stream.

        :param IO[bytes] stream:
            The stream to download to. This can be an open file-handle,
            or any writable stream. The stream must be seekable if the download
            uses more than one parallel connection.
        :return: The number of bytes read.
        :rtype: int
        zTStream has been partially read in text mode. readinto is not supported in text mode.zEEncoding is ignored with readinto as only byte streams are supported.r   z&Target stream handle must be seekable.)r�   Nr   r  r‰   ),rÚ   r@   rË   rþ   rÿ   rÊ   r  Úversion_infoÚseekableru   r[   ÚNotImplementedErrorÚAttributeErrorr    rØ   r±   r¤   rÙ   rv   r   r�   rÏ   rð   rÝ   rH   rÆ   rì   rÔ   rÇ   rà   rÌ   rÍ   rÕ   rÒ   rÐ   r  r  r  rB   r  r   rp   ri   r  )r_   rN   rO   Úerror_messageÚexcÚremaining_sizeÚcurrent_remainingrz   r  Ú
data_startÚdata_endr¡   r   r!  r"  s                  r6   Úreadintoz StorageStreamDownloader.readinto  sÉ  € ð �?Š?ÜÐsÓtÐtØ�>Š>Ü�M‰MÐaÔbð ×(Ñ(¨1Ñ,ˆÙØDˆMÜ×Ñ 4Ò'°·±Ô0AÜ  Ó/Ð/ð9Ø—‘˜FŸK™K›MÔ*ð
 Ÿ™ T×%6Ñ%6Ñ6ˆà˜QÒØô   × 5Ñ 5Ó6¸×9UÑ9UÑUÐØ×,Ñ,ˆØ—‘œT¤%¨×)>Ñ)>¸uÀUÐM^ÑE^Ð)_Ó`Óaˆà×$Ò$¨Ñ-Õ$Ø×Ò˜UÑ"ÕØ×ÒØ×Ñ × 1Ñ 1°4·9±9Ô=ð ×"Ò"Ø!Ð!à×)Ñ)¨D×,=Ñ,=Ñ=ˆ
Ø×'Ñ'¨$¯)©)Ñ3ˆä%ð 
Ø—=‘=×%Ñ%Ø!×3Ñ3Ø—y‘yØ—|‘|×6Ñ6Ø!×.Ñ.Ø"ØØØØ!×3Ñ3Ø#×7Ñ7Ø ×1Ñ1Ø×,Ñ,Ø×-Ñ-ñ
ð ×#Ñ#ñ
ˆ
ñ" Û%Ø×#Ñ#×6Ñ6°t×7LÑ7LÓMð ÐQYÜ�X—\‘\Ü,¨Z×-EÑ-EÓFØ"×4Ñ4Ó6óô ÷ð ð $×5Ñ5Ó7ò 0�Ø×(Ñ(¨Õ/ð0ð 	×ÑÔØÐøôo (¬Ð8ò 9Ü  Ó/°SÐ8ûð9ú÷Zð ús$   Á;K7 É9=LË7LÌLÌLÌL#c                 óž   — | j                   | _        | j                   | _        | j                   | _        t	        | j
                  «      | _        y)z/Adjusts all offsets to the end of the download.N)r    rÖ   r×   rØ   r±   r¤   rÙ   rª   s    r6   r  z&StorageStreamDownloader._complete_readV  s9   € à $§	¡	ˆÔØ$(§I¡IˆÔ!Ø ŸI™IˆÔÜ'*¨4×+@Ñ+@Ó'AˆÕ$r8   c                 ó°   — | j                   rJ| j                  t        | j                  «      k(  r'| j                  | j                  | j
                  «       yyy)zReports progress if necessary.N)rÏ   rÙ   r±   r¤   rÖ   r    rª   s    r6   r  z2StorageStreamDownloader._check_and_report_progress]  sH   € ð ×Ò 4×#?Ñ#?Ä3Àt×G\ÑG\ÓC]Ò#]Ø×Ñ × 5Ñ 5°t·y±yÕAð $^Ðr8   c                 ó’   — t        j                  dt        «       | j                  rt	        d«      ‚|| _        | j                  «       S )ap  DEPRECATED: Download the contents of this file.

        This operation is blocking until all data is downloaded.

        This method is deprecated, use func:`readall` instead.

        :param int max_concurrency:
            The number of parallel connections with which to download.
        :return: The contents of the file as bytes.
        :rtype: bytes
        z3content_as_bytes is deprecated, use readall insteadz\Stream has been partially read in text mode. content_as_bytes is not supported in text mode.)rþ   rÿ   ÚDeprecationWarningrÚ   r@   rÊ   r  )r_   r¿   s     r6   Úcontent_as_bytesz(StorageStreamDownloader.content_as_bytesd  sJ   € ô 	�‰ØAÜô	
ð �?Š?Üð Oó Pð Pð !0ˆÔØ�|‰|‹~Ðr8   c                 ó    — t        j                  dt        «       | j                  rt	        d«      ‚|| _        || _        | j                  «       S )aê  DEPRECATED: Download the contents of this blob, and decode as text.

        This operation is blocking until all data is downloaded.

        This method is deprecated, use func:`readall` instead.

        :param int max_concurrency:
            The number of parallel connections with which to download.
        :param str encoding:
            Test encoding to decode the downloaded bytes. Default is UTF-8.
        :return: The content of the file as a str.
        :rtype: str
        z2content_as_text is deprecated, use readall insteadz[Stream has been partially read in text mode. content_as_text is not supported in text mode.)rþ   rÿ   r3  rÚ   r@   rÊ   rË   r  )r_   r¿   rÀ   s      r6   Úcontent_as_textz'StorageStreamDownloader.content_as_text{  sQ   € ô 	�‰Ø@Üô	
ð �?Š?Üð Nó Oð Oð !0ˆÔØ!ˆŒØ�|‰|‹~Ðr8   c                 ó¬   — t        j                  dt        «       | j                  rt	        d«      ‚|| _        | j                  |«       | j                  S )a&  DEPRECATED: Download the contents of this blob to a stream.

        This method is deprecated, use func:`readinto` instead.

        :param IO[T] stream:
            The stream to download to. This can be an open file-handle,
            or any writable stream. The stream must be seekable if the download
            uses more than one parallel connection.
        :param int max_concurrency:
            The number of parallel connections with which to download.
        :return: The properties of the downloaded blob.
        :rtype: Any
        z6download_to_stream is deprecated, use readinto insteadz^Stream has been partially read in text mode. download_to_stream is not supported in text mode.)rþ   rÿ   r3  rÚ   r@   rÊ   r/  rŽ   )r_   rN   r¿   s      r6   Údownload_to_streamz*StorageStreamDownloader.download_to_stream•  sT   € ô 	�‰ØDÜô	
ð �?Š?Üð Qó Rð Rð !0ˆÔØ�‰�fÔØ�‰Ðr8   )NNNNNNr   NNNN)r/   N)r	  )r   )r   zUTF-8) r—   r˜   r™   r¸   rœ   Ú__annotations__rš   r   r›   r   r   r   r`   r«   rÞ   Úpropertyrð   rã   r   r�   r  r   r)   r  r  r   r/  r  r  r4  r6  r8  r‰   r8   r6   rº   rº   5  sì  … ñð ƒIØ0ØƒNØ6Ø Ó ð=à
ƒIð-ð
 '+Ø)-Ø%)Ø#'Ø!%Ø-1Ø ØØØ"&Ø+/ñ\+à#ð\+ð 'ð\+ð ˜c‘]ð	\+ð
 ˜C‘=ð\+ð ð\+ð !  c ™Nð\+ð ð\+ð ð\+ð ð\+ð ˜3‘-ð\+ð ˜xÑ(ð\+ð ð\+ð 
ó\+ò|ó=ð. ñ6ó ð6ò
aðF98˜ ™ó 98ðv ñ˜ð  aò ó ðð Ø-1ò ˜X c™]ð °aò ó ððO¸Tò O˜ð O¨X°c©]ð OÀaó Oðb˜ó ðO˜r %™yð O¨Só OòbBòBóó.ô4r8   rº   )@r  r  rW   r‹   rþ   Úior   r   Útypingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Úazure.core.exceptionsr   r   r   Úazure.core.tracing.commonr   Ú_shared.request_handlersr   Ú_shared.response_handlersr   r   Ú_deserializer   r   Ú_encryptionr   r   r    r!   r"   r#   r$   Ú
_generatedr%   Ú_generated.operationsr&   Ú_modelsr'   Ú_shared.modelsr(   r�   rœ   r)   rš   r7   rF   ÚobjectrH   rŸ   rº   r‰   r8   r6   ú<module>rH     sJ  ðó Û 
Û Û Û ß  ÷÷ ÷ ÷ ñ ÷ VÑ UÝ :å Gß ]ß M÷õ ñ Ý)Ý,Ý,Ý5Ý'Ý4ñ ˆC�˜Ó€ð@Øð@àð@ð �S‰Mð@ð ˜S #˜X™ð	@ð
 Ð/Ñ0ð@ð ˆ5��c�‰?˜E # s (™OÐ+Ñ,ó@ð$˜#ð ¨Sð ¸cð ÈtÐTWÐY\ÐT\É~ð Ðbgó ô,f*�vô f*ôR5�Vô 5ôpx	˜g a™jõ x	r8   