
    dhT              	          S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
JrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  SSKJr  SSKJrJr  SSKJ r J!r!J"r"J#r#J$r$J%r%  \(       a  SSK&r'SSK(J)s  J*s  J+r,  \RZ                  " \.5      r/S	r0S
r1Sr2S&S jr3 " S S5      r4\4" 5       r5\4" 5       r6 " S S\7\	5      r8 " S S\!5      r9 " S S\!5      r: " S S5      r;S\\7   S\<S\\\7   \\Rz                     4   4S jr>SSS\74S jr?S\S   S\\7SS4   4S jr@\\A\44   rB\7rC " S  S!5      rD\DrE\7rF " S" S#\9\:\\E\F4   5      rG\\7\\4   rH\ArI " S$ S%\9\:\\H\I4   5      rJ\GrK\JrL\DrMg)'z*A common module for NVIDIA Riva Runnables.    N)Enum)TYPE_CHECKINGAnyAsyncGeneratorAsyncIteratorDict	GeneratorIteratorListOptionalTupleUnioncast)
AnyMessageBaseMessage)PromptValue)RunnableConfigRunnableSerializable)
AnyHttpUrl	BaseModelFieldparse_obj_asroot_validator	validator      ?i  )
.!?   ¡   ¿returnc                  `     SSK n U R                  $ ! [         a  n[        S5      UeSnAff = f)z5Import the riva client and raise an error on failure.r   NziCould not import the NVIDIA Riva client library. Please install it with `pip install nvidia-riva-client`.)riva.clientImportErrorclient)rivaerrs     a/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/utilities/nvidia_riva.py_import_riva_clientr*   1   s@     ;;  G
 	s    
-(-c                       \ rS rSrSrSrg)	SentinelT>   zAn empty Sentinel type. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r.       r)   r,   r,   >   s    !r5   r,   c                   `    \ rS rSrSrSrSrSrSrSr	Sr
\S	\S
S 4S j5       r\SS j5       rSrg)RivaAudioEncodingF   zAn enum of the possible choices for Riva audio encoding.

The list of types exposed by the Riva GRPC Protobuf files can be found
with the following commands:
```python
import riva.client
print(riva.client.AudioEncoding.keys())  # noqa: T201
```
ALAWENCODING_UNSPECIFIEDFLAC
LINEAR_PCMMULAWOGGOPUSformat_coder"   c                      U R                   U R                  U R                  S.U   $ ! [         a  n[	        SU 35      UeSnAff = f)zReturn the audio encoding specified by the format code in the wave file.

ref: https://mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
)         z>The following wave file format code is not supported by Riva: N)r<   r9   r=   KeyErrorNotImplementedError)clsr?   r(   s      r)   from_wave_format_code'RivaAudioEncoding.from_wave_format_codeX   sV    	~~#((syyA+NN 	%**58 	s   &) 
AAAc                 B    [        5       n[        UR                  U 5      $ )z-Returns the Riva API object for the encoding.)r*   getattrAudioEncodingselfriva_clients     r)   riva_pb2RivaAudioEncoding.riva_pb2f   s     *+{00$77r5   r.   N)r"   zriva.client.AudioEncoding)r/   r0   r1   r2   r3   r9   r:   r;   r<   r=   r>   classmethodintrG   propertyrO   r4   r.   r5   r)   r7   r7   F   s]     D1DJEG 8K   8 8r5   r7   c                       \ rS rSr% Sr\" \" S5      SSS/S9r\\\	4   \
S'   \" SS	S
9r\\	   \
S'   \SS j5       r\" SSSS9\S\S\4S j5       5       rSrg)RivaAuthMixinm   zBConfiguration for the authentication to a Riva service connection.zhttp://localhost:50051z1The full URL where the Riva service can be found.z"https://user@pass:riva.example.com)descriptionexamplesurlNz@A full path to the file where Riva's public ssl key can be read.rW   ssl_certr"   c                     [        5       n[        [        U R                  5      nUR                  S:H  n[        U R                  5      R                  S5      S   nUR                  U R                  X4S9$ )z!Return a riva client auth object.https/   )r[   use_ssluri)	r*   r   r   rY   schemestrsplitAuthr[   )rM   rN   rY   r`   url_no_schemes        r)   authRivaAuthMixin.authz   sh     *+:txx(**'DHH++C03]]G   
 	
r5   T)preallow_reusevalc                     [        U[        5      (       a  [        [        [	        [        U5      5      $ [        [        U5      $ )z:Do some initial conversations for the URL before checking.)
isinstancerc   r   r   r   )rF   rk   s     r)   _validate_urlRivaAuthMixin._validate_url   s2     c3
LS$ABBJ$$r5   r.   )r"   zriva.client.Auth)r/   r0   r1   r2   r3   r   r   rY   r   rc   __annotations__r[   r   rS   rg   r   rQ   r   rn   r4   r.   r5   r)   rU   rU   m   s    L"'+,G*,PQ#Cz3	 
 $VHhsm 
 
 
 u$D1% %
 %  2%r5   rU   c                   v    \ rS rSr% Sr\" \R                  SS9r\\	S'   \" SSS9r
\\	S'   \" S	S
S9r\\	S'   Srg)RivaCommonConfigMixin   z%A collection of common Riva settings.z!The encoding on the audio stream.)defaultrW   encodingi@  z*The sample rate frequency of audio stream.sample_rate_hertzzen-USzaThe [BCP-47 language code](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) for the target language.language_coder.   N)r/   r0   r1   r2   r3   r   r7   r<   ru   rp   rv   rR   rw   rc   r4   r.   r5   r)   rr   rr      sX    /"'!,,7#H  #"Ns  #M3 r5   rr   c                       \ rS rSr% Sr\R                  \S'   \R                  \S'   SS jr	SS jr
SS	 jrS\4S
 jrSS jrSS jrSrg)_Event   z3A combined event that is threadsafe and async safe._event_aeventr"   Nc                 l    [         R                  " 5       U l        [        R                  " 5       U l        g)zInitialize the event.N)	threadingEventr{   asyncior|   rM   s    r)   __init___Event.__init__   s    oo'}}r5   c                 l    U R                   R                  5         U R                  R                  5         gzSet the event.N)r{   setr|   r   s    r)   r   
_Event.set   s     r5   c                 l    U R                   R                  5         U R                  R                  5         gr   )r{   clearr|   r   s    r)   r   _Event.clear   s"    r5   c                 6    U R                   R                  5       $ )zIndicate if the event is set.)r{   is_setr   s    r)   r   _Event.is_set   s    {{!!##r5   c                 8    U R                   R                  5         g)zWait for the event to be set.N)r{   waitr   s    r)   r   _Event.wait   s    r5   c                 T   #    U R                   R                  5       I Sh  vN   g N7f)z#Async wait for the event to be set.N)r|   r   r   s    r)   
async_wait_Event.async_wait   s     ll!!!s   (&()r|   r{   r"   N)r/   r0   r1   r2   r3   r~   r   rp   r   r   r   r   boolr   r   r   r4   r.   r5   r)   ry   ry      s>    =OO]]'


$ $"r5   ry   output_directorysample_ratec                 &   U (       ay  [         R                  " SSSU S9 nUR                  nSSS5        [        R                  " WS5      nUR                  S5        UR                  S5        UR                  U5        X44$ g	! , (       d  f       N\= f)
zECreate a new wave file and return the wave write object and filename.bxz.wavF)modesuffixdeletedirNwbrA   r_   )NN)tempfileNamedTemporaryFilenamewaveopensetnchannelssetsampwidthsetframerate)r   r   fwav_file_namewav_files        r)   _mk_wave_filer      s     ((fU8H
FFM
 99]D1a a k*((
 
s   B
Brk   TTSInputTypec                     [        U [        5      (       a  U R                  5       $ [        U [        5      (       a  [	        U R
                  5      $ [	        U 5      $ )zyAttempt to coerce the input value to a string.

This is particularly useful for converting LangChain message to strings.
)rm   r   	to_stringr   rc   content)rk   s    r)   _coerce_stringr      sB    
 #{##}}#{##3;;s8Or5   inputsc              #   N  #    SnU  H  n[        U5      n[         H0  nX2;   d  M
  UR                  US5      u  pBX-   U-   v   SnX2;   a  M&  M2     X-  n[        U5      [        :  d  Ma  [        S[        U5      [        5       H  nXUS-    v   M     SnM     U(       a  Uv   gg7f)z9Filter the input chunks are return strings ready for TTS. rA   r      N)r   _SENTENCE_TERMINATORSrd   len_MAX_TEXT_LENGTHrange)r   bufferchunk
terminatorlast_sentenceidxs         r)   _process_chunksr      s     Fu% 0J%',{{:q'A$,z99 % 0 	 v;))QF-=>37++ ?F! &  s   B%$B%B%(=B%c                      \ rS rSr% Sr\R                  \S'   \R                  \S'   \R                  \S'   \
\S'   \
\S'   \
\S'   \\R                     \S	'   SS
\SS4S jjrS\\SS4   4S jrS\\   4S jr\S\4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rSS\S\\   SS4S jjrSS\S\\   SS4S jjrSS\\   SS4S jjrSS\\   SS4S jjrS\S   SS4S jr Sr!g) AudioStream   z%A message containing streaming audio.	_put_lock_queueoutputhangupuser_talking
user_quiet_workermaxsizer"   Nc                    [         R                  " 5       U l        [        R                  " US9U l        [        R                  " 5       U l        [        5       U l        [        5       U l	        [        5       U l
        SU l        g)zInitialize the queue.)r   N)r~   Lockr   queueQueuer   r   ry   r   r   r   r   )rM   r   s     r)   r   AudioStream.__init__  sP    ")kk'2kkmh ("Hr5   c              #      #      U R                   R                  S[        5      nU[
        :X  a  gUv   U R                   R                  5         ML  ! [        R                   a     Md  f = f7f)zReturn an error.TN)r   get_QUEUE_GET_TIMEOUTr   EmptyHANGUP	task_donerM   next_vals     r)   __iter__AudioStream.__iter__  sb     ;;??41CD
 6! NKK!!#  ;; s'   A+ A +A+A($A+'A((A+c                .  #      [         R                  " 5       R                  SU R                  R                  S[
        5      I Sh  vN nU[        :X  a  gU7v   U R                  R                  5         Mt   N0! [        R                   a     M  f = f7f)z4Iterate through all items in the queue until HANGUP.TN)
r   get_event_looprun_in_executorr   r   r   r   r   r   r   r   s     r)   	__aiter__AudioStream.__aiter__&  s     !(!7!7!9!I!I$++//41C"  6! NKK!!#  ;; s;   BAA: A8A: ,B8A: :BBBBc                 6    U R                   R                  5       $ )z(Indicate if the audio stream has hungup.)r   r   r   s    r)   hungupAudioStream.hungup9  s     {{!!##r5   c                 6    U R                   R                  5       $ )z-Indicate in the input stream buffer is empty.)r   emptyr   s    r)   r   AudioStream.empty>  s     {{  ""r5   c                     U R                   =(       a    U R                  nU R                  SL=(       a@    U R                  R                  5       (       + =(       a    U R                  R                  5       nU=(       a    U$ )z;Indicate if the audio stream has hungup and been processed.N)r   r   r   is_aliver   )rM   
input_doneoutput_dones      r)   completeAudioStream.completeC  sa     [[/TZZ
LL$ $LL))++$!!# 	
 )k)r5   c                 Z    U R                   (       a  U R                   R                  5       $ g)z&Indicate if the ASR stream is running.F)r   r   r   s    r)   runningAudioStream.runningN  s!     <<<<((**r5   itemtimeoutc                     U R                      U R                  (       a  [        S5      eU[        L a  U R                  R                  5         U R                  R                  XS9  SSS5        g! , (       d  f       g= f)zPut a new item into the queue.z?The audio stream has already been hungup. Cannot put more data.r   N)r   r   RuntimeErrorr   r   r   r   put)rM   r   r   s      r)   r   AudioStream.putU  sS    ^^{{"U  v~!KKOODO2 ^^s   AA//
A=c                    #    [         R                  " 5       n[         R                  " UR                  SU R                  U5      U5      I Sh  vN   g N7f)z$Async put a new item into the queue.N)r   r   wait_forr   r   )rM   r   r   loops       r)   aputAudioStream.aput`  s<     %%'t33D$((DI7SSSs   AAAAc                 0    U R                  [        U5        g)zSend the hangup signal.N)r   r   rM   r   s     r)   closeAudioStream.closee  s    !r5   c                 L   #    U R                  [        U5      I Sh  vN   g N7f)zAsync send the hangup signal.N)r   r   r   s     r)   acloseAudioStream.aclosei  s     ii(((s   $"$	responseszrasr.StreamingRecognizeResponsec                 (  ^ ^^ T R                   (       a  [        S5      e[        R                  " SSS9mS	UUU 4S jjn[        R                  " US9T l        ST R
                  l        T R
                  R                  5         TR                  5         g)
zIDrain the responses from the provided iterator and put them into a queue.z,An ASR instance has already been registered.r_   r   r   Nc                  j  > TR                  5         T GH  n U R                  (       d  M  U R                   H  nUR                  (       d  M  UR                  (       ax  TR                  R                  5         TR                  R                  5         [        [        UR                  S   R                  5      nTR                  R                  U5        M  TR                  R                  5       (       a  M  TR                  R                  5         TR                  R                  5         M     GM     g)zConsume the ASR Generator.r   N)r   resultsalternativesis_finalr   r   r   r   r   rc   
transcriptr   r   r   )responseresultr  has_startedr   rM   s      r)   worker$AudioStream.register.<locals>.workert  s    %''&..F!.. ))//1++-%)#v/B/B1/E/P/P%Q

3!..5577))--/--/ /	 &r5   )targetTr   )	r   r   r~   BarrierThreadr   daemonstartr   )rM   r   r	  r  s   `` @r)   registerAudioStream.registerm  sn    <<MNN''15	0 	0* !''v6"r5   )r   r   r   r   r   r   r   )r   N)"r/   r0   r1   r2   r3   r~   r   rp   r   r   ry   r   r  rR   r   r	   bytesr   r   StreamInputTyper   rS   r   r   r   r   r   r   r   r   r   r
   r  r4   r.   r5   r)   r   r      sv   /~~KKKKNi&&'' D $)E4$56 $"$!? $& $ $ $ #t # # *$ * *   	3 	3(3- 	34 	3T T# TRV T
"Xc] "d ")HSM )T )(+L"M RV r5   r   c            	          \ rS rSr% SrSr\\S'   Sr\\S'   \	" SSS	9r
\\S
'   \	" SSS	9r\\S'   \	" SSS	9r\\S'   \" SS9\S\\\4   S\\\4   4S j5       5       r\SS j5       rSS jr SS\S\\   S\S\4S jjrSrg)RivaASRi  zNA runnable that performs Automatic Speech Recognition (ASR) using NVIDIA Riva.nvidia_riva_asrr   zA Runnable for converting audio bytes to a string.This is useful for feeding an audio stream into a chain andpreprocessing that audio to create an LLM prompt.rW   rA   z7The number of audio channels in the input audio stream.rZ   audio_channel_countTz\Controls whether or not Riva should attempt to filter profanity out of the transcribed text.profanity_filterz]Controls whether Riva should attempt to correct senetence puncuation in the transcribed text.enable_automatic_punctuationri   valuesr"   c                     [        5       nU$ z4Validate the Python environment and input arguments.r*   rF   r  _s      r)   _validate_environmentRivaASR._validate_environment        !r5   c                     [        5       nUR                  SUR                  U R                  U R                  U R
                  SU R                  U R                  U R                  S9S9$ )z)Create and return the riva config object.TrA   )ru   rv   r  max_alternativesr  r  rw   )interim_resultsconfig)	r*   StreamingRecognitionConfigRecognitionConfigru   rv   r  r  r  rw   rL   s     r)   r(  RivaASR.config  sq     *+55 00"&"8"8$($<$<!"!%!6!6-1-N-N"00 1  6 
 	
r5   c                     [        5       n UR                  U R                  5      $ ! [         a  n[	        S5      UeSnAff = f);Connect to the riva service and return the a client object.z5Error raised while connecting to the Riva ASR server.N)r*   
ASRServicerg   	Exception
ValueErrorrM   rN   r(   s      r)   _get_serviceRivaASR._get_service  sG    )+	))$))44 	G	   ' 
A=ANinputr(  kwargsc                 F   UR                   (       d;  U R                  5       nUR                  UU R                  S9nUR	                  U5        / nUR
                  (       Gd  UR                  R                     UR                  R                  R                  S5      nSSS5        W(       a  UR                  R                  5       (       dY   XaR                  R                  5       /-  nUR                  R                  5         UR                  R                  5       (       d  MY  [        R                  S[!        U5      5        SR#                  U5      R%                  5       $ UR
                  (       d  GM  g! , (       d  f       N= f! [        R                   a     M  f = f)z3Transcribe the audio bytes into a string with Riva.)audio_chunksstreaming_configg?NzRiva ASR returning: %s r   )r   r2  streaming_response_generatorr(  r  r   r   	not_emptyr   r   
get_nowaitr   r   r   _LOGGERdebugreprjoinstrip)rM   r5  r(  r6  servicer   full_responsereadys           r)   invokeRivaASR.invoke  s<    }}'')G<<"!% = I NN9% $&...''..33C8 ( ,,,,..!%,,*A*A*C)DD LL**,  ,,,,.. 6]8KLxx.4466 ...  (' !;; ! !s   7&E7F 7
FF F r.   )r"   z&riva.client.StreamingRecognitionConfig)r"   zriva.client.ASRServicer  )r/   r0   r1   r2   r3   r   rc   rp   rW   r   r  rR   r  r   r  r   rQ   r   r   r"  rS   r(  r2  ASRInputTyper   r   ASROutputTyperF  r4   r.   r5   r)   r  r    s   
 Y!D#!	<    %	P   #5d  */<* $  4S> d38n   
 
 
  ,0   (  	 
 
   r5   r  c                      \ rS rSr% SrSr\\S'   Sr\\S'   \	" SSS	9r
\\S
'   \	" SSS	9r\\   \S'   \" SS9\S\\\4   S\\\4   4S j5       5       r\" S5      \S\S\4S j5       5       rSS jr SS\S\\   S\S\4S jjr SS\\   S\\   S\\   S\\   4S jjr SS\\   S\\   S\\   S\\S4   4S jjrSrg)RivaTTSi   z?A runnable that performs Text-to-Speech (TTS) with NVIDIA Riva.nvidia_riva_ttsr   z_A tool for converting text to speech.This is useful for converting LLM output into audio bytes.rW   zEnglish-US.Female-1zThe voice model in Riva to use for speech. Pre-trained models are documented in [the Riva documentation](https://docs.nvidia.com/deeplearning/riva/user-guide/docs/tts/tts-overview.html).rZ   
voice_nameNzThe directory where all audio files should be saved. A null value indicates that wave files should not be saved. This is useful for debugging purposes.r   Tr  r  r"   c                     [        5       nU$ r  r  r   s      r)   r"  RivaTTS._validate_environment   r$  r5   vc                     U(       a?  [         R                  " U5      nUR                  SSS9  [        UR	                  5       5      $ U$ )NT)parentsexist_ok)pathlibPathmkdirrc   absolute)rF   rP  dirpaths      r)   _output_directory_validator#RivaTTS._output_directory_validator'  s=     ll1oGMM$M6w'')**r5   c                     [        5       n UR                  U R                  5      $ ! [         a  n[	        S5      UeSnAff = f)r-  z5Error raised while connecting to the Riva TTS server.N)r*   SpeechSynthesisServicerg   r/  r0  r1  s      r)   r2  RivaTTS._get_service0  sG    )+	55dii@@ 	G	r4  r5  r(  r6  c                 V    SR                  U R                  [        U/5      5      5      $ )zDPerform TTS by taking a string and outputting the entire audio file.r5   )rA  	transformiter)rM   r5  r(  r6  s       r)   rF  RivaTTS.invoke:  s"     xxtUG}566r5   c           	   +   $  #    U R                  5       n[        U R                  U R                  5      u  pV[	        U5       H  n[
        R                  SU5        UR                  UU R                  U R                  U R                  R                  U R                  S9nU H9  n	[        [        U	R                  5      n
U(       a  UR                  U
5        U
v   M;     M     U(       a'  UR!                  5         [
        R                  SU5        gg7f)zHPerform TTS by taking a stream of characters and streaming output bytes.zRiva TTS chunk: %s)textrM  rw   ru   sample_rate_hzzRiva TTS wrote file: %sN)r2  r   r   rv   r   r>  r?  synthesize_onlinerM  rw   ru   rO   r   r  audiowriteframesrawr   )rM   r5  r(  r6  rC  r   r   r   r   resprf  s              r)   r_  RivaTTS.transformC  s      ##% #0!!4#9#9#

 %U+EMM.6  11??"00//#55 2 I "UDJJ/++E2	 " ,( NNMM3]C s   DDc                p  ^ ^^	^
^^^#    [         R                  " 5       m[        R                  " 5       m[         R                  " 5       mSUU4S jjnS[        [
           4U4S jjm
SU
UU 4S jjm	SU	U4S jjnTR                  U" 5       5      nTR                  U" 5       5      n  [         R                  " TR                  5       S5      I Sh  vN nTR                  5         U[        L a  OU7v   MO  UI Sh  vN   UI Sh  vN   g N:! [         R                  R                   a     M  f = f N6 N.7f)	zGIntercept async transforms and route them to the synchronous transform.r"   Nc                  z   >#    T  Sh  vN n TR                  U 5        M   N
 TR                  [        5        g7f)z#Produce input into the input queue.N)
put_nowait_TRANSFORM_END)rk   r5  input_queues    r)   	_producer%RivaTTS.atransform.<locals>._produceru  s3     " ,c&&s+,U"">2s   ;$"$;$;c               3      >#      TR                  SS9n U [        :X  a  gU v   M!  ! [        R                   a     M9  f = f7f)zIterate over the input_queue.r   r   N)r   r   r   rm  )rk   rn  s    r)   _input_iterator+RivaTTS.atransform.<locals>._input_iterator{  sL     %//#/6C .(	  {{ s    A& A>A>Ac                     > TR                  T" 5       5       H  n TR                  U 5        M     TR                  [        5        g)z!Consume the input with transform.N)r_  rl  rm  )rk   rr  	out_queuerM   s    r)   	_consumer%RivaTTS.atransform.<locals>._consumer  s5    ~~o&78$$S) 9  0r5   c                  F   >#    TR                  ST 5      I Sh  vN   g N7f)z"Coroutine that wraps the consumer.N)r   )rv  r   s   r)   _consumer_coro*RivaTTS.atransform.<locals>._consumer_coro  s     &&tY777s   !!r   r   )r   get_running_loopr   r   r
   r   create_taskr   r   
exceptionsTimeoutErrorr   rm  )rM   r5  r(  r6  ro  ry  producerconsumerrk   rv  rr  rn  r   ru  s   ``       @@@@@r)   
atransformRivaTTS.atransformj  s     '')#(;;=#*==?		3 	3		,!7 			1 	1	8 	8 ##IK0##N$45#,,Y]]_cBB !n$I   C%%22  	sZ   BD6((D DD &D6;D2<	D6D4D6D D/+D6.D//D64D6r.   )r"   z"riva.client.SpeechSynthesisServicer  )r/   r0   r1   r2   r3   r   rc   rp   rW   r   rM  r   r   r   rQ   r   r   r"  r   rY  r2  r   r   TTSOutputTyperF  r
   r_  r   r   r  r4   r.   r5   r)   rK  rK     s   
 J!D#!	E   aJ  ',5'hsm  4S> d38n   
 !"C C   # ,077 (7 	7
 
7 ,0%D%%D (%D 3-	%D
 
-	 %DT ,05\*5 (5 3-	5
 
t+	,5 5r5   rK  )r"   zriva.client)Nr3   r   loggingrT  r   r   r~   r   enumr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   langchain_core.messagesr   r   langchain_core.prompt_valuesr   langchain_core.runnablesr   r   pydanticr   r   r   r   r   r   r$   r'   riva.client.proto.riva_asr_pb2r&   protoriva_asr_pb2rasr	getLoggerr/   r>  r   r   r   r*   r,   r   rm  rc   r7   rU   rr   ry   float
Wave_writer   r   r   r  r  StreamOutputTyper   rH  rI  r  r   r  rK  NVIDIARivaASRNVIDIARivaTTSNVIDIARivaStreamr.   r5   r)   <module>r     s   0            < 4 I  11


H
%  9 
" " 
$8T $8N%I %BI (" "Dsm27
8C=(4??334"	 	3 	H^4 3d?9S 6 y() L L` c}45cP S*k12_}45_F  r5   