
    `i              	          d dl 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	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddl	mZ ddl	mZ ddlmZmZ  e j.                  d      Z	 d&dedeeef   dee   defdZ	 d&dedeeef   dee   defdZ	 d&dedeeef   dee   defdZ	 d&dedeeef   dee   defdZ	 d&dedeeef   dee   defdZ	 d&dedeeef   dee   defdZ 	 d&dedeeef   dee   defdZ!	 d&dedeeef   dee   defdZ"	 d&dedeeef   dee   defdZ#	 d&dedeeef   dee   defdZ$	 d&dedeeef   dee   defdZ%	 d&dedeeef   dee   defdZ&	 d&dedeeef   dee   defdZ'	 d&dedeeef   dee   defd Z(	 d&dedeeef   dee   defd!Z) G d" d#ejT                        Z+ G d$ d%ejT                        Z,y)'    N)AnyOptionalUnion)	urlencode   )_api_module)_common)_extra_utils)_transformers)types)BaseApiClient)get_value_by_path)set_value_by_path)
AsyncPagerPagerzgoogle_genai.batches
api_clientfrom_objectparent_objectreturnc                     i }t        |dg      t        |dgt        |dg             t        |dg      t        |ddgt        |dg             t        |dg      t        |ddgt        |dg             |S )	NformatinstancesFormatgcs_uri	gcsSourceurisbigquery_uribigquerySourceinputUrigetvsetvr   r   r   	to_objects       Y/var/www/html/ts-aiml.yecor.com/venv/lib/python3.12/site-packages/google/genai/batches.py_BatchJobSource_to_vertexr%   "   s    
 !)	+z".&'kH:)FG	+	{#/[&)4i[+IJ	+'(4	:&[>*+ 
    c                     i }t        |dg      t        |dgt        |dg             t        |dg      t        |ddgt        |dg             t        |dg      t        |ddgt        |dg             |S )	Nr   predictionsFormatr   gcsDestinationoutputUriPrefixr   bigqueryDestination	outputUrir   r"   s       r$   _BatchJobDestination_to_vertexr-   8   s    
 !)	+z".()4hZ+HI	+	{#/	,-[9+& 
+'(4	,[>*+ 
r&   c                     i }t        |dg      t        |dgt        |dg             t        |dg      8t        |dgt        | t        j                  | t        |dg            |             |S )Ndisplay_namedisplayNamedestoutputConfig)r    r!   r-   tt_batch_job_destinationr"   s       r$   _CreateBatchJobConfig_to_vertexr5   R   s    
 !)	+'(4kN;K)LM	+x ,	&%%j${VH2MN	
 
r&   c                 j   i }t        |dg      -t        |dgt        j                  | t        |dg                   t        |dg      8t        |dgt	        | t        j
                  | t        |dg            |             t        |dg      $t        |dgt        | t        |dg      |             |S )NmodelsrcinputConfigconfig)r    r!   r3   t_modelr%   t_batch_job_sourcer5   r"   s       r$   #_CreateBatchJobParameters_to_vertexr=   j   s    
 !)	+y!-					*d;	:; 
+w+	!  T+w-GH	
 
+z".	
'[8*5y	
 
r&   c                     i }t        |dg      .t        |ddgt        j                  | t        |dg                   t        |dg      t        |dgt        |dg             |S Nname_urlr:   r    r!   r3   t_batch_job_namer"   s       r$    _GetBatchJobParameters_to_vertexrD      r    
 !)	+x ,		:tK&'BC 
+z".XJ[8* =>	r&   c                     i }t        |dg      .t        |ddgt        j                  | t        |dg                   t        |dg      t        |dgt        |dg             |S r?   rB   r"   s       r$   #_CancelBatchJobParameters_to_vertexrG      rE   r&   c                     i }t        |dg      t        |ddgt        |dg             t        |dg      t        |ddgt        |dg             t        |dg      t        |ddgt        |dg             |S )N	page_size_querypageSize
page_token	pageTokenfilterr   r"   s       r$   _ListBatchJobsConfig_to_vertexrO      s    
 !)	+}%1*-tK+/O 
+~&2	;[<.) 
+z".8,d;
.KL	r&   c                 l    i }t        |dg      $t        |dgt        | t        |dg      |             |S )Nr:   )r    r!   rO   r"   s       r$   "_ListBatchJobsParameters_to_vertexrQ      sH    
 !)	+z".	
&[8*5y	
 
r&   c                     i }t        |dg      .t        |ddgt        j                  | t        |dg                   t        |dg      t        |dgt        |dg             |S r?   rB   r"   s       r$   #_DeleteBatchJobParameters_to_vertexrS      rE   r&   c                     i }t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             |S )Ndetailscodemessager   r"   s       r$   _JobError_from_vertexrX      s    
 !)	+	{#/YKkI;!?@	+x ,VHd;9:	+	{#/YKkI;!?@	r&   c           	          i }t        |dg      t        |dgt        |dg             t        |ddg      t        |dgt        |ddg             t        |ddg      t        |dgt        |ddg             |S )	Nr   r   r   r   r   r   r   r   r   r"   s       r$   _BatchJobSource_from_vertexrZ     s    
 !)	+)*+7XJ[3D2E FG	+V,-9YKkK3H!IJ	+(*56B	[+Z89 
r&   c           	          i }t        |dg      t        |dgt        |dg             t        |ddg      t        |dgt        |ddg             t        |ddg      t        |dgt        |ddg             |S )	Nr(   r   r)   r*   r   r+   r,   r   r   r"   s       r$    _BatchJobDestination_from_vertexr\     s    
 !)	++,-9XJ[3F2G HI	+(*;<=I	[+->?@ 
+-{;<H	[0+>? 
r&   c                    i }t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      $t        |dgt        | t        |dg      |             t        |dg      t        |dgt        |dg             t        |dg      t        |d	gt        |dg             t        |d
g      t        |dgt        |d
g             t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      $t        |dgt        | t        |dg      |             t        |dg      $t        |dgt	        | t        |dg      |             |S )Nr@   r0   r/   stateerror
createTimecreate_time	startTime
start_timeendTimeend_time
updateTimeupdate_timer7   r9   r8   r2   r1   )r    r!   rX   rZ   r\   r"   s       r$   _BatchJob_from_vertexrh   4  s   
 !)	+x ,VHd;9:	+'3^$d;&HI	+y!-WItK';<	+y!-		[7)4i	
 
+~&2]OT+~%FG	+}%1\ND{m$DE	+	{#/ZL${YK"@A	+~&2]OT+~%FG	+y!-WItK';<	+'3	#[=/:I	
 
+'(4	([>*:;Y	
 
r&   c                     i }t        |dg      t        |dgt        |dg             t        |dg      2t        |dgt        |dg      D cg c]  }t        | ||       c}       |S c c}w )NnextPageTokennext_page_tokenbatchPredictionJobs
batch_jobs)r    r!   rh   )r   r   r   r#   items        r$   "_ListBatchJobsResponse_from_vertexro   p  s    
 !)	+()5&'kO;L)MN	+-./;	 [+@*AB	
 "*dI>	
 
	
s   A*c                    i }t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      $t        |dgt        | t        |dg      |             |S )Nr@   doner_   )r    r!   rX   r"   s       r$   _DeleteResourceJob_from_vertexrr     s    
 !)	+x ,VHd;9:	+x ,VHd;9:	+y!-		[7)4i	
 
r&   c            	          e Zd Zdddededeej                     dej                  fdZdddedeej                     dej                  fd	Z
dddedeej                     ddfd
Zdej                  dej                  fdZdddedeej                      dej"                  fdZdddededeej                     dej                  fdZdddeej                     deej                     fdZy)BatchesNr:   r7   r8   r:   r   c                L   t        j                  |||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd        d }	|j                  ,|j                  j                  |j                  j                  }	t        j                  |      }t        j                  |      }| j                  j                  d|||	      }
| j                  j                  rt!        | j                  |
      }
t         j"                  j%                  |
|j'                         	      }| j                  j)                  |       |S 
Nr7   r8   r:   6This method is only supported in the Vertex AI client.rA   rl   rJ   ?r:   postresponsekwargs)r   _CreateBatchJobParameters_api_clientvertexai
ValueErrorr=   get
format_mapr   popr:   http_optionsr	   convert_to_dictencode_unserializable_typesrequestrh   BatchJob_from_response
model_dump_verify_responseselfr7   r8   r:   parameter_modelrequest_dictrequest_url_dictpathquery_paramsr   response_dictreturn_values               r$   _createzBatches._create  s    55O $$OPP8


Ol &))&1	$//0@A$##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL$$,,lLM   +D,<,<mLm>>00'A'A'C 1 L 	%%l3r&   r@   c                J   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	| j                  j                  rt!        | j                  |	      }	t         j"                  j%                  |	|j'                         
      }
| j                  j)                  |
       |
S )a  Gets a batch job.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/456" or "456"
          when project and location are initialized in the client.

    Returns:
      A BatchJob object that contains details about the batch job.

    Usage:

    .. code-block:: python

      batch_job = client.batches.get(name='123456789')
      print(f"Batch job: {batch_job.name}, state {batch_job.state}")
    r@   r:   ry   rA   batchPredictionJobs/{name}rJ   rz   r:   Nr   r|   )r   _GetBatchJobParametersr   r   r   rD   r   r   r   r   r:   r   r	   r   r   r   rh   r   r   r   r   r   r@   r:   r   r   r   r   r   r   r   r   s              r$   r   zBatches.get  s   * 22O $$OPP5


Ol &))&1	+667GH+##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL$$,,t\<M   +D,<,<mLm>>00'A'A'C 1 L 	%%l3r&   c                \   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	y)
a  Cancels a batch job.

    Only available for batch jobs that are running or pending.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/123456789" or
          "123456789" when project and location are initialized in the client.

    Usage:

    .. code-block:: python

      client.batches.cancel(name='123456789')
    r   ry   rA   !batchPredictionJobs/{name}:cancelrJ   rz   r:   Nr{   )r   _CancelBatchJobParametersr   r   r   rG   r   r   r   r   r:   r   r	   r   r   r   
r   r@   r:   r   r   r   r   r   r   r   s
             r$   cancelzBatches.cancel  s$   , 55O $$OPP8


Ol &))&1	2==>NO2##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL$$,,lLMr&   c                H   t        j                  |      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd        d }|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d|||      }| j                  j                  rt!        | j                  |      }t         j"                  j%                  ||j'                         	      }	| j                  j)                  |	       |	S 
Nru   ry   rA   rl   rJ   rz   r:   r   r|   )r   _ListBatchJobsParametersr   r   r   rQ   r   r   r   r   r:   r   r	   r   r   r   ro   ListBatchJobsResponser   r   r   
r   r:   r   r   r   r   r   r   r   r   s
             r$   _listzBatches._listW  s    44O
 $$OPP7


Ol &))&1	$//0@A$##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL$$,,t\<M   8


Mm ..=='A'A'C > L 	%%l3r&   c                J   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	| j                  j                  rt!        | j                  |	      }	t         j"                  j%                  |	|j'                         
      }
| j                  j)                  |
       |
S )a  Deletes a batch job.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/456" or "456"
          when project and location are initialized in the client.

    Returns:
      A DeleteResourceJob object that shows the status of the deletion.

    Usage:

    .. code-block:: python

      client.batches.delete(name='123456789')
    r   ry   rA   r   rJ   rz   r:   Ndeleter|   )r   _DeleteBatchJobParametersr   r   r   rS   r   r   r   r   r:   r   r	   r   r   r   rr   DeleteResourceJobr   r   r   r   s              r$   r   zBatches.delete  s   . 55O $$OPP8


Ol &))&1	+667GH+##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL$$,,$lM   4


Mm **99'A'A'C : L 	%%l3r&   c                V    t        j                  ||      }| j                  |||      S )a{  Creates a batch job.

    Args:
      model (str): The model to use for the batch job.
      src (str): The source of the batch job. Currently supports GCS URI(-s) or
        BigQuery URI. Example: "gs://path/to/input/data" or
        "bq://projectId.bqDatasetId.bqTableId".
      config (CreateBatchJobConfig): Optional configuration for the batch job.

    Returns:
      A BatchJob object that contains details about the batch job.

    Usage:

    .. code-block:: python

      batch_job = client.batches.create(
          model="gemini-1.5-flash",
          src="gs://path/to/input/data",
      )
      print(batch_job.state)
    rx   r
   format_destinationr   r   r7   r8   r:   s       r$   createzBatches.create  s+    : ,,S&9F<<eV<<<r&   c                ~    |t        j                         }t        d| j                  | j                  |      |      S )a  Lists batch jobs.

    Args:
      config (ListBatchJobsConfig): Optional configuration for the list request.

    Returns:
      A Pager object that contains one page of batch jobs. When iterating over
      the pager, it automatically fetches the next page if there are more.

    Usage:

    .. code-block:: python

      batch_jobs = client.batches.list(config={"page_size": 10})
      for batch_job in batch_jobs:
        print(f"Batch job: {batch_job.name}, state {batch_job.state}")
    rm   ru   )r   ListBatchJobsConfigr   r   r   r:   s     r$   listzBatches.list  s?    ( ~((*f



&
!	 r&   )__name__
__module____qualname__strr   r   CreateBatchJobConfigOrDictr   r   GetBatchJobConfigOrDictr   CancelBatchJobConfigOrDictr   ListBatchJobsConfigOrDictr   r   DeleteBatchJobConfigOrDictr   r   r   r   r    r&   r$   rt   rt     s    <@5 5 	5
 u7785 ~~5p MQBB"*5+H+H"IB~~BP <@	: : u778	:
 :x1661""1n <@	F F u778	F
 FZ <@= = 	=
 u778= ~~=B DH ? ?@U^^r&   rt   c            	          e Zd Zdddededeej                     dej                  fdZdddedeej                     dej                  fd	Z
dddedeej                     ddfd
Zdej                  dej                  fdZdddedeej                      dej"                  fdZdddededeej                     dej                  fdZdddeej                     deej                     fdZy)AsyncBatchesNru   r7   r8   r:   r   c                h  K   t        j                  |||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd        d }	|j                  ,|j                  j                  |j                  j                  }	t        j                  |      }t        j                  |      }| j                  j                  d|||	       d {   }
| j                  j                  rt!        | j                  |
      }
t         j"                  j%                  |
|j'                         	      }| j                  j)                  |       |S 7 |wrw   )r   r   r   r   r   r=   r   r   r   r   r:   r   r	   r   r   async_requestrh   r   r   r   r   r   s               r$   r   zAsyncBatches._create  s     55O $$OPP8


Ol &))&1	$//0@A$##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL**88lL M   +D,<,<mLm>>00'A'A'C 1 L 	%%l3s   D1F23F04A=F2r@   c                f  K   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	| j                  j                  rt!        | j                  |	      }	t         j"                  j%                  |	|j'                         
      }
| j                  j)                  |
       |
S 7 |w)a  Gets a batch job.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/456" or "456"
          when project and location are initialized in the client.

    Returns:
      A BatchJob object that contains details about the batch job.

    Usage:

    .. code-block:: python

      batch_job = await client.aio.batches.get(name='123456789')
      print(f"Batch job: {batch_job.name}, state {batch_job.state}")
    r   ry   rA   r   rJ   rz   r:   Nr   r|   )r   r   r   r   r   rD   r   r   r   r   r:   r   r	   r   r   r   rh   r   r   r   r   r   s              r$   r   zAsyncBatches.getI  s    * 22O $$OPP5


Ol &))&1	+667GH+##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL**88t\< M   +D,<,<mLm>>00'A'A'C 1 L 	%%l3   D0F12F/3A=F1c                x  K   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	y7 w)
a  Cancels a batch job.

    Only available for batch jobs that are running or pending.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/123456789" or
          "123456789" when project and location are initialized in the client.

    Usage:

    .. code-block:: python

      await client.aio.batches.cancel(name='123456789')
    r   ry   rA   r   rJ   rz   r:   Nr{   )r   r   r   r   r   rG   r   r   r   r   r:   r   r	   r   r   r   r   s
             r$   r   zAsyncBatches.cancel  s2    , 55O $$OPP8


Ol &))&1	2==>NO2##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL**88lL M s   D0D:2D83D:c                d  K   t        j                  |      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd        d }|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d|||       d {   }| j                  j                  rt!        | j                  |      }t         j"                  j%                  ||j'                         	      }	| j                  j)                  |	       |	S 7 |wr   )r   r   r   r   r   rQ   r   r   r   r   r:   r   r	   r   r   r   ro   r   r   r   r   r   s
             r$   r   zAsyncBatches._list  s     44O
 $$OPP7


Ol &))&1	$//0@A$##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL**88t\< M   8


Mm ..=='A'A'C > L 	%%l3s   D/F01F.2A=F0c                f  K   t        j                  ||      }| j                  j                  st	        d      t        | j                  |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	| j                  j                  rt!        | j                  |	      }	t         j"                  j%                  |	|j'                         
      }
| j                  j)                  |
       |
S 7 |w)a  Deletes a batch job.

    Args:
      name (str): A fully-qualified BatchJob resource name or ID.
        Example: "projects/.../locations/.../batchPredictionJobs/456" or "456"
          when project and location are initialized in the client.

    Returns:
      A DeleteResourceJob object that shows the status of the deletion.

    Usage:

    .. code-block:: python

      await client.aio.batches.delete(name='123456789')
    r   ry   rA   r   rJ   rz   r:   Nr   r|   )r   r   r   r   r   rS   r   r   r   r   r:   r   r	   r   r   r   rr   r   r   r   r   r   s              r$   r   zAsyncBatches.delete  s    . 55O $$OPP8


Ol &))&1	+667GH+##H-LvQy./0dXt$04L*""//;$++88l**<8L66|DL**88$l M   4


Mm **99'A'A'C : L 	%%l3r   c                r   K   t        j                  ||      }| j                  |||       d{   S 7 w)aw  Creates a batch job asynchronously.

    Args:
      model (str): The model to use for the batch job.
      src (str): The source of the batch job. Currently supports GCS URI(-s) or
        BigQuery URI. Example: "gs://path/to/input/data" or
        "bq://projectId.bqDatasetId.bqTableId".
      config (CreateBatchJobConfig): Optional configuration for the batch job.

    Returns:
      A BatchJob object that contains details about the batch job.

    Usage:

    .. code-block:: python

      batch_job = await client.aio.batches.create(
          model="gemini-1.5-flash",
          src="gs://path/to/input/data",
      )
    rx   Nr   r   s       r$   r   zAsyncBatches.createD  s5     8 ,,S&9FEs6BBBBs   .757c                   K   |t        j                         }t        d| j                  | j                  |       d{   |      S 7 	w)a(  Lists batch jobs asynchronously.

    Args:
      config (ListBatchJobsConfig): Optional configuration for the list request.

    Returns:
      A Pager object that contains one page of batch jobs. When iterating over
      the pager, it automatically fetches the next page if there are more.

    Usage:

    .. code-block:: python

      batch_jobs = await client.aio.batches.list(config={'page_size': 5})
      print(f"current page: {batch_jobs.page}")
      await batch_jobs_pager.next_page()
      print(f"next page: {batch_jobs_pager.page}")
    Nrm   ru   )r   r   r   r   r   s     r$   r   zAsyncBatches.listc  sK     * ~((*f

jjj''	  	(s   =AA	 
A)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r$   r   r     s    <@5 5 	5
 u7785 ~~5p MQBB"*5+H+H"IB~~BP <@	: : u778	:
 :x1661""1n <@	F F u778	F
 FZ <@C C 	C
 u778C ~~C@ DH ? ?@%..!r&   r   )N)-loggingtypingr   r   r   urllib.parser    r   r	   r
   r   r3   r   r   r   r   r    r   r!   pagersr   r   	getLoggerloggerdictobjectr%   r-   r5   r=   rD   rG   rO   rQ   rS   rX   rZ   r\   rh   ro   rr   
BaseModulert   r   r   r&   r$   <module>r      s  $  ' ' "       & . . %			1	2 %)tV|$ D> 
	2 %)tV|$ D> 
	: %)tV|$ D> 
	6 %)!!tV|$! D>! 
	!N %)tV|$ D> 
	, %)tV|$ D> 
	, %)tV|$ D> 
	8 %)tV|$ D> 
	* %)tV|$ D> 
	, %)tV|$ D> 
	* %)tV|$ D> 
	2 %)tV|$ D> 
	: %)99tV|$9 D>9 
	9~ %)tV|$ D> 
	2 %)tV|$ D> 
	0ok$$ odo;)) or&   