Ë
    g^(hRC  ã                  óÒ  — U d dl mZ d dlZ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
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mZmZ d dlZd dlmZ d d	lmZmZmZmZ d d
l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* d dl+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; erd dl<m=Z= d dl>m?Z? da@daAdeBd<   ej†                  j‰                  eEd«      ZF ejŽ                  eE«      ZHd„ ZId„ ZJd*d„ZKd*d„ZLejš                  dk(  ZN ejŽ                  eE«      ZH e9e,   «       ZOd*d„ZPd„ ZQ	  ej¤                  eQ¬ «       d+d!„ZTe4 G d"„ d#«      «       ZU G d$„ d%«      ZVej®                  j±                  d&d'«      d(k(  s7ej®                  j±                  d)d(«      d(k7  s e;«       r ej²                  «       rneVjµ                  «         ej¶                  eP«       y# eS$ r Y Œžw xY w),é    )ÚannotationsN)ÚFutureÚProcessPoolExecutorÚThreadPoolExecutor)ÚBrokenProcessPool)Úpartial)ÚtimeÚtime_ns)ÚAnyÚCallableÚOptionalÚTYPE_CHECKING)Ú get_registered_device_interfaces)ÚcountersÚdynamo_timedÚget_metrics_contextÚset_feature_use)Úconfig)
Ú_load_triton_kernel_from_sourceÚ	code_hashÚCodeCacheFutureÚCppCodeCacheÚCppPythonBindingsCodeCacheÚCUDACodeCacheÚHalideCodeCacheÚLambdaFutureÚROCmCodeCacheÚ	torch_key)ÚAnyPoolÚSubprocPool)Ú_async_compile_initializer)Ú_set_triton_ptxas_pathÚ_worker_compile_triton)Úclear_on_fresh_inductor_cache)Ú	_FaketqdmÚtqdm)Ú
OrderedSet)Úhas_triton_package)Ú
HalideMeta)ÚCachingAutotunerg        zOptional[float]Ú_t0Úkernel_codec                 óR   — t        «        	 ddlm}   | «        y# t        $ r Y yw xY w)zG
    Setup that must be done prior to forking with a process pool.
    r   ©Ú
triton_keyN)Úcaching_device_propertiesÚtriton.compiler.compilerr/   ÚImportErrorr.   s    ú[/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/async_compile.pyÚpre_fork_setupr4   >   s)   € ô ÔðÝ7á�øÜò áðús   Œ š	&¥&c                 ó~   — t        «       D ]0  \  } }|j                  «       sŒ|j                  j                  «        Œ2 y ©N)r   Úis_availableÚWorkerÚget_device_properties)Ú_Údevice_interfaces     r3   r0   r0   Q   s8   € Ü?ÓAò <ÑˆÐØ×(Ñ(Õ*Ø×#Ñ#×9Ñ9Õ;ñ<ó    c                 ó&   — t         €t        «       a y y r6   )r+   r	   © r<   r3   Ú_compile_startr?   W   s   € ä
€{Ü‹f‰ð r<   c                 óJ   — t         �t        «       } t        | t         z
  z  ad a y y r6   )r+   r	   Ú_cumulative_compile_time)Út1s    r3   Ú_compile_endrC   ]   s'   € ä
€Ü‹VˆÜ  B¬¡HÑ,Ð Ø‰ð r<   Úwin32c                 óN   — t         D ]  } | j                  «        Œ t        «        y)z/Shut down all outstanding compile-worker pools.N)Ú	_pool_setÚshutdownÚ
after_fork)Úpools    r3   Úshutdown_compile_workersrJ   n   s   € äò ˆØ�‰�ðä…Lr<   c                 óh   — t         j                  «        t        j                  j	                  «        y)z7Reset pools to initial state without shutting them downN)rF   ÚclearÚAsyncCompileÚprocess_poolÚcache_clearr>   r<   r3   rH   rH   u   s   € ä‡O�OÔÜ×Ñ×)Ñ)Õ+r<   )Úafter_in_childc                 ó|   — t         j                  €t        j                  «       t         _        t         j                  S )z}
    Temporary for internal rollout. Assign config.compile_threads lazily and return it.
    TODO: remove after rollout.
    )r   Úcompile_threadsÚdecide_compile_threadsr>   r<   r3   Úget_compile_threadsrT   �   s-   € ô
 ×ÑÐ%Ü!'×!>Ñ!>Ó!@ŒÔÜ×!Ñ!Ð!r<   c                  óx   — e Zd ZU dZi Zded<   ed
d„«       Zedd„«       Zedd„«       Z	ed„ «       Z
edd„«       Zy	)ÚCompiledTritonKernelsa/  
    In memory cache for storing compiled triton kernels.

    Each triton kernel is keyed by the hash of its source code. Each value stored
    in the cache is a return value of AsyncCompile.triton().

    Currently, the cache stores Future objects, but it should be generalizable for any kernels.
    zdict[str, LambdaFuture]Ú_cachec                ó,   — t        | t        «       ¬«      S )a  
        Generates a cache key given a triton kernel's full source code.
        This source includes the inductor meta, compilation metadata, the kernel itself, etc.
        `kernel_src` should be the exact string passed to async_compile.triton()'s first argument.
        )Úextra)r   r   )Ú
kernel_srcs    r3   ÚkeyzCompiledTritonKernels.key˜   s   € ô ˜¬9«;Ô7Ð7r<   c                óT   — t         j                  | «      }|t         j                  |<   y)a�  
        Saves a compiled triton kernel to the cache.
        TODO: We store a LambdaFuture as that's the callable returned by async_compile.triton,
        but the real type we want to return here is actually an abstract triton kernel.

        TODO: Source code here is not just the kernel's source code, but also includes the inductor preamble, etc.
        so it could be less strict.
        N©rV   r[   rW   )rZ   Úfuturer[   s      r3   ÚsavezCompiledTritonKernels.save¢   s%   € ô $×'Ñ'¨
Ó3ˆØ,2Ô×$Ñ$ SÒ)r<   c                ól   — t         j                  | «      }t         j                  j                  ||«      S r6   )rV   r[   rW   Úget)rZ   Údefaultr[   s      r3   ra   zCompiledTritonKernels.get¯   s+   € ä#×'Ñ'¨
Ó3ˆÜ$×+Ñ+×/Ñ/°°WÓ=Ð=r<   c                 ó   — i t         _        y r6   )rV   rW   r>   r<   r3   rO   z!CompiledTritonKernels.cache_clear´   s   € à')ÔÕ$r<   c                óv   — t         j                  | «      }|t         j                  v rt         j                  |= y y r6   r]   )rZ   r[   s     r3   Úremove_futurez#CompiledTritonKernels.remove_future¸   s4   € ä#×'Ñ'¨
Ó3ˆØÔ'×.Ñ.Ñ.Ü%×,Ñ,¨SÑ1ð /r<   N)rZ   Ústr)rZ   rf   r^   r   )rZ   rf   rb   r   Úreturnr   )rZ   rf   rg   ÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rW   Ú__annotations__Ústaticmethodr[   r_   ra   rO   re   r>   r<   r3   rV   rV   ‹   sv   … ñð ')€FÐ#Ó(àò8ó ð8ð ò
3ó ð
3ð ò>ó ð>ð ñ*ó ð*ð ò2ó ñ2r<   rV   c                  ó  — e Zd Zdd„Ze ej                  d«      dd„«       «       Zed„ «       Ze ej                  d«      dd„«       «       Z	e
dd„«       Ze
dd„«       Zd„ Zddd	„Zdd
„Zdd„Zdd„Zdd„Z	 dd„Zdd„Zdd„Zdd„Zy)rM   c                 ó   — y r6   r>   ©Úselfs    r3   Ú__init__zAsyncCompile.__init__À   s   € Ør<   é   c                 óF   — t        «       dkD  sJ ‚t        t        «       «      S ©Nrt   )rT   r   r>   r<   r3   rI   zAsyncCompile.poolÃ   s$   € ô #Ó$ qÒ(Ð(Ð(Ü!Ô"5Ó"7Ó8Ð8r<   c                  ó   — y)z>No-op function to help mark when the subprocess pool is ready.Úreadyr>   r>   r<   r3   Ú
_get_readyzAsyncCompile._get_readyÉ   s   € ð r<   c            	     óÄ  — t        «       dkD  sJ ‚t        j                  dt        j                  t        «       «       t        j                  dk(  rt        t        «       «      } nÃt        j                  dk(  rdt        j                  d<   t        «        t        j                  t        j                  «      }t        t        «       |t        t        t        j                  «       «      ¬«      } t        j                  j!                  d | j"                  t$        j&                  ¬«       | j)                  t*        j,                  «      | _        t0        j3                  | «       | S )	Nrt   z"Creating '%s' pool with %d workersÚ
subprocessÚspawnÚ0ÚTORCH_WARM_POOL)Ú
mp_contextÚinitializer)Úexitpriority)rT   ÚlogÚinfor   Úworker_start_methodr    ÚosÚenvironr4   ÚmultiprocessingÚget_contextr   r   r!   ÚgetpidÚutilÚFinalizerG   ÚsysÚmaxsizeÚsubmitrM   ry   Úready_futurerF   Úadd)rI   Úctxs     r3   rN   zAsyncCompile.process_poolÎ   sý   € ô #Ó$ qÒ(Ð(Ð(Ü�‰Ø0Ü×&Ñ&ÜÓ!ô	
ô ×%Ñ%¨Ò5äÔ2Ó4Ó5‰Dä×)Ñ)¨WÒ4à03”—
‘
Ð,Ñ-ÜÔÜ!×-Ñ-¬f×.HÑ.HÓIˆCÜ&Ü#Ó%ØÜ#Ô$>ÄÇ	Á	ÃÓLôˆDô × Ñ ×)Ñ)¨$°·±ÌCÏKÉKÐ)ÔXð !ŸK™K¬×(?Ñ(?Ó@ˆÔÜ�‰�dÔØˆr<   c                óh   — t        «       dk  ry t        «        | j                  «        t        «        y rv   )rT   r?   rN   rC   )Úclss    r3   Ú	warm_poolzAsyncCompile.warm_poolò   s'   € äÓ  AÒ%ØÜÔà×ÑÔÜ�r<   c                óh   — t        «       dk  r |«       S | j                  «       j                  |«      S rv   )rT   rI   rŽ   )r“   Útasks     r3   rŽ   zAsyncCompile.submitû   s+   € äÓ  AÒ%Ù“6ˆMØ�x‰x‹z× Ñ  Ó&Ð&r<   c                óp   — t        «       dkD  xr( | j                  «       j                  j                  «       S rv   )rT   rN   r�   Údonerq   s    r3   Úuse_process_poolzAsyncCompile.use_process_pool  s/   € äÓ! AÑ%ÒQ¨$×*;Ñ*;Ó*=×*JÑ*J×*OÑ*OÓ*Qð	
r<   c                ó*  ‡‡‡‡‡— t         j                  ‰d«      x}rt        d   dxx   dz  cc<   |S t        d   dxx   dz  cc<   t        j	                  d‰«       t        «        t        j                  j                  dd«      d	k(  r=t        t        j                  j                  j                  j                  ‰«      ‰«      S t        j                  t         ‰‰«      Š| j#                  «       }t%        d
|«       |r�ddg}|D �ci c])  }|t        j                  v sŒ|t        j                  |   “Œ+ }}| j'                  «       j)                  t*        ‰|«      Šˆfd„Šdˆˆˆˆfd„}	t-        |	‰¬«      }t         j/                  ‰|«       |S t1        dddd¬«      5  t3        «       }
t5        «         ‰«       }|j7                  d¬«       t3        «       |
z
  dz  }t9        «       j;                  d‰|«       |cddd«       S c c}w # 1 sw Y   yxY w)a  
        Async_compile.triton is more complicated than the other backends because
        we're trying to optimize compile time as much as possible for this hot callsite.

        First of all, the function is cached by CompiledTritonKernels; if there's a kernel
        already compiled, we grab it directly from the cache and return.

        Otherwise, if we have multiple compile threads, we kick off triton compilations on each
        worker process by giving it a kernel and source code to compile. The worker initializes
        a CachingAutotuner, runs triton compilation, and pickles the kernel back to us.
        We use TritonCompileResult to represent the objects being pickled back to us by each
        worker.

        Some maybe not obvious things that are pickled back to us:
        - Most of the time, we can avoid sending back CachingAutotuner.fn and other metadata
          and do not have to pay the cost of loading the triton kernel on the parent. But certain
          cases, like coordesc tuning and dynamic_scale_rblock, require us to reload the function
          in the parent lazily when we require it.
        - The AutotuneCache, if enabled, is constructed on each worker per triton config
          and pickled by to us via `CachingAutotuner.save_cache_hook`.
        NÚinductorÚasync_compile_cache_hitrt   Úasync_compile_cache_misszTriton Kernel:
%sÚTRITON_INTERPRETr}   Ú1Úparallel_compile_post_warmupÚTORCHINDUCTOR_CACHE_DIRÚTRITON_CACHE_DIRc                 óT   •— t        d«      5   ‰ «       cd d d «       S # 1 sw Y   y xY w)NÚreload_kernel_in_parent)r   )Úload_kernels   €r3   r¤   z4AsyncCompile.triton.<locals>.reload_kernel_in_parent;  s&   ø€ ä!Ð";Ó<ñ )Ù&›=÷)÷ )ò )ús   �ž'c                 ó´   •— ‰j                  «       \  } }t        j                  ‰«       | j                  d‰¬«       t	        «       j                  d‰|«       | S )NF)Úwarm_cache_onlyÚreload_kernelÚtriton_kernel_compile_times_us)ÚresultrV   re   Ú
precompiler   Ú	add_top_n)ÚkernelÚ
elapsed_usÚkernel_namer¤   Úsource_coder–   s     €€€€r3   Ú
get_resultz'AsyncCompile.triton.<locals>.get_result@  s]   ø€ Ø%)§[¡[£]Ñ"�˜
ô &×3Ñ3°KÔ@Ø×!Ñ!Ø$)Ð9Pð "ô ô $Ó%×/Ñ/Ø4°kÀ:ôð �r<   )r^   zasync_compile.precompileTÚtriton_compile_time_us©Úlog_pt2_compile_eventÚdynamo_compile_column_usÚlog_waitcounterF)r§   iè  r©   )rg   ztuple[CachingAutotuner, int])rV   ra   r   Úkernel_code_logrƒ   r?   r…   r†   ÚgetattrÚtorchÚ	_inductorÚ	codecacheÚPyCodeCacheÚloadÚ	functoolsr   r   r™   r   rN   rŽ   r#   r   r_   r   r
   r"   r«   r   r¬   )rr   r¯   r°   Ú
device_strr^   Úis_parallelÚenv_varsÚvÚ	extra_envr±   Ústart_nsr­   r®   r¥   r¤   r–   s    ``          @@@r3   ÚtritonzAsyncCompile.triton  sõ  ü€ ô, +×.Ñ.¨{¸DÓAÐAˆ6ÐAÜ�ZÑ Ð!:Ó;¸qÑ@Ó;ØˆMä�ÑÐ7Ó8¸AÑ=Ó8ä×ÑÐ1°;Ô?ÜÔä�:‰:�>‰>Ð,¨cÓ2°cÒ9ÜÜ—‘×)Ñ)×5Ñ5×:Ñ:¸;ÓGÈóð ô  ×'Ñ'Ü+¨[¸+ó
ˆð ×+Ñ+Ó-ˆÜÐ6¸ÔDÙð 2Ð3EÐFˆHØ3;ÖO¨a¸qÄBÇJÁJº˜œBŸJ™J q™MÑ)ÐOˆIÐOà×$Ñ$Ó&×-Ñ-Ü&ØØóˆDô)÷
ð ô " *°TÔ:ˆFÜ!×&Ñ& {°FÔ;ØˆMäØ*Ø&*Ø)AØ $ô	ñ ô #›9�Ü&Ô(Ù$›�Ø×!Ñ!°%Ð!Ô8Ü%›i¨(Ñ2°tÑ;�
Ü#Ó%×/Ñ/Ø4°kÀ:ôð ÷ñ ùò= P÷<ð ús   Ä	HÄ!HÆ AH	È	Hc                ó   — ddl m}  ||i |¤ŽS )Nr   )ÚMultiKernelCall)Ú$torch._inductor.codegen.multi_kernelrÇ   )rr   ÚargsÚkwargsrÇ   s       r3   Úmulti_kernelzAsyncCompile.multi_kernela  s   € ÝHñ  Ð/¨Ñ/Ð/r<   c                óæ   ‡— t         j                  d|«       t        «       dk  rt        j                  |«      j
                  S t        j                  || j                  ¬«      Št        ˆfd„«      S )NzCPP Kernel:
%srt   ©Ú	submit_fnc                 ó&   •—  ‰ «       j                   S r6   )r­   )r±   s   €r3   ú<lambda>z"AsyncCompile.cpp.<locals>.<lambda>m  s   ø€ ©
«×(;Ñ(;€ r<   )	r·   rƒ   rT   r   r½   r­   Ú
load_asyncrŽ   r   )rr   r°   r±   s     @r3   ÚcppzAsyncCompile.cppg  sX   ø€ Ü×ÑÐ.°Ô<ÜÓ  AÒ%Ü×$Ñ$ [Ó1×8Ñ8Ð8ä%×0Ñ0°ÈÏÉÔTˆJÜÓ ;Ó<Ð<r<   c                óÎ   — t         j                  d|«       t        «       dk  rt        j                  ||«      S t        j
                  ||| j                  ¬«      }t        |«      S )NzCPP+Bindings Kernel:
%srt   rÍ   )r·   rƒ   rT   r   Úload_pybindingÚload_pybinding_asyncrŽ   r   )rr   Úargtypesr°   r±   s       r3   Úcpp_pybindingzAsyncCompile.cpp_pybindingo  sY   € Ü×ÑÐ7¸ÔEÜÓ  AÒ%Ü-×<Ñ<¸XÀ{ÓSÐSä3×HÑHØ˜+°·±ôˆJô   
Ó+Ð+r<   c                ód   ‡‡‡— t         j                  d‰«       ˆˆˆfd„}| j                  |«      S )NzCUDA Kernel:
%sc                 óf   •— ‰ rt        j                  ‰d«       t        j                  ‰‰«      d   S )NÚor   )r   Úcompiler½   )Úaot_compileÚdst_file_extr°   s   €€€r3   r–   zAsyncCompile.cuda.<locals>.task|  s0   ø€ Ùô ×%Ñ% k°3Ô7Ü ×%Ñ% k°<Ó@ÀÑCÐCr<   ©r·   rƒ   rŽ   ©rr   r°   rÝ   rÜ   r–   s    ``` r3   ÚcudazAsyncCompile.cuday  s+   ú€ Ü×ÑÐ/°Ô=ö	Dð �{‰{˜4Ó Ð r<   c                ód   ‡‡‡— t         j                  d‰«       ˆˆˆfd„}| j                  |«      S )NzROCm Kernel:
%sc                 óÊ   •— ‰rt        j                  ‰d¬«      } t        j                  j                  rt        j                  ‰d¬«      } t        j
                  ‰‰«      d   S )NrÚ   )rÝ   Úexer   )r   rÛ   r   ÚrocmÚgenerate_test_runnerr½   )r:   rÜ   rÝ   r°   s    €€€r3   r–   zAsyncCompile.rocm.<locals>.task�  sO   ø€ ÙÜ!×)Ñ)¨+ÀCÔH�Ü�{‰{×/Ò/Ü!×)Ñ)¨+ÀEÔJ�Ü ×%Ñ% k°<Ó@ÀÑCÐCr<   rÞ   rß   s    ``` r3   rä   zAsyncCompile.rocm…  s-   ú€ ô 	×ÑÐ/°Ô=ö	Dð �{‰{˜4Ó Ð r<   c                óÐ   — t         j                  d||«       t        «       dk  rt        j                  ||«      S t        j
                  ||| j                  ¬«      }t        |«      S )NzHalide Kernel:
%r
%srt   rÍ   )r·   rƒ   rT   r   Úgenerate_halideÚgenerate_halide_asyncrŽ   r   )rr   Úmetar°   r±   s       r3   ÚhalidezAsyncCompile.halide–  s[   € Ü×ÑÐ5°t¸[ÔIÜÓ  AÒ%Ü"×2Ñ2°4¸ÓEÐEä(×>Ñ>Ø�k¨T¯[©[ôˆJô   
Ó+Ð+r<   c                óÆ   — t        «       dkD  r4t        dddd¬«      5  | j                  |«       d d d «       t        «        y t        «        y # 1 sw Y   t        «        y xY w)Nrt   zasync_compile.waitTr²   r³   )rT   r   Ú_wait_futuresrC   )rr   Úscopes     r3   ÚwaitzAsyncCompile.wait   sS   € ÜÓ  1Ò$ÜØ$Ø&*Ø)AØ $ô	ñ *ð ×"Ñ" 5Ô)÷*ô 	�Œ�÷*ô 	�ús   �AÁA c           	     óä  — |j                  «       D ��ci c]  \  }}t        |t        t        f«      r||“Œ  }}}t	        t        |«      dt        j                  d¬«      }|j                  «       D ][  \  }}t        j                  r!t        |t        «      s|j                  |«       	 |j                  «       ||<   |j                  d«       Œ] y c c}}w # t        $ r}t        d«      |‚d }~ww xY w)NzInductor Compilationr   )ÚtotalÚdescÚdisableÚdelayzÌA compilation subprocess exited unexpectedly. This is likely due to a crash. To facilitate debugging, you can re-run with TORCHINDUCTOR_COMPILE_THREADS=1 to cause compilation to occur in the main process.rt   )ÚitemsÚ
isinstancer   r   r&   Úlenr   Údisable_progressÚverbose_progressr%   Úset_postfix_strrª   r   ÚRuntimeErrorÚupdate)rr   rí   r[   ÚvalueÚkernelsÚpbarrª   Úes           r3   rì   zAsyncCompile._wait_futures¬  së   € ð $Ÿk™k›m÷
á��UÜ˜%¤&¬/Ð!:Ô;ð �‰Jð
ˆñ 
ô
 Ü�g“,Ø'Ü×+Ñ+Øô	
ˆð #Ÿ=™=›?ò 	‰KˆC�Ü×&Ò&¬z¸$Ä	Ô/JØ×$Ñ$ SÔ)ðØ#Ÿ]™]›_��c‘
ð �K‰K˜�Nñ	ùó
øô" %ò Ü"ðIóð
 ðûðús   ”#CÂ(CÃ	C/ÃC*Ã*C/N©rg   rh   )rg   r   )rg   r   )r–   zCallable[..., Any]rg   r   )rà   )r¯   rf   r°   rf   r¿   rf   )rg   r   )r°   rf   )rÖ   z	list[str]r°   rf   )F)ré   r)   r°   rf   )rí   zdict[str, Any]rg   rh   )ri   rj   rk   rs   rn   r¾   Ú	lru_cacherI   ry   rN   Úclassmethodr”   rŽ   r™   rÅ   rË   rÒ   r×   rà   rä   rê   rî   rì   r>   r<   r3   rM   rM   ¿   sÏ   „ óð Ø€Y×Ñ˜Óò9ó ó ð9ð ñó ðð Ø€Y×Ñ˜Óò ó ó ð ðD òó ðð ò'ó ð'ò

ô
Yóv0ó=ó,ó
!ð  ó	!ó",ó
ôr<   rM   ÚTORCH_TNT_IN_USEr}   rŸ   r~   r   )rg   Úint)\Ú
__future__r   Úatexitr¾   Úloggingr‡   r…   rŒ   Úconcurrent.futuresr   r   r   Úconcurrent.futures.processr   r   r	   r
   Útypingr   r   r   r   r¹   Útorch._dynamo.device_interfacer   Útorch._dynamo.utilsr   r   r   r   Útorch._inductorr   Útorch._inductor.codecacher   r   r   r   r   r   r   r   r   r   Ú+torch._inductor.compile_worker.subproc_poolr   r    Ú'torch._inductor.compile_worker.watchdogr!   Ú%torch._inductor.runtime.compile_tasksr"   r#   Útorch._inductor.utilsr$   Ú	torch.hubr%   r&   Útorch.utils._ordered_setr'   Útorch.utils._tritonr(   Útorch._inductor.runtime.hintsr)   Ú)torch._inductor.runtime.triton_heuristicsr*   rA   r+   rm   Ú_loggingÚgetArtifactLoggerri   r·   Ú	getLoggerr‚   r4   r0   r?   rC   ÚplatformÚ_IS_WINDOWSrF   rJ   rH   Úregister_at_forkÚAttributeErrorrT   rV   rM   r†   ra   Ú	is_fbcoder”   Úregisterr>   r<   r3   ú<module>r!     sÄ  ðæ "ã Û Û Û Û 	Û 
ß NÑ NÝ 8Ý ß ß 9Ó 9ã Ý K÷ó õ #÷÷ ÷ ÷ MÝ N÷õ @ß %Ý /Ý 2ñ Ý8ÝJð Ð Ø€€_Ó à—.‘.×2Ñ2°8¸]ÓK€à€g×Ñ˜Ó!€òò&<óóð �l‰l˜gÑ%€à€g×Ñ˜Ó!€ð  ˆJ�wÑÓ!€	óò,ð	Ø€B×Ñ zÕ2ó
"ð ÷02ð 02ó ð02÷fFñ FðT ‡J�J‡N�NÐ% sÓ+¨sÒ2Ø	‡z�z‡~�~Ð'¨Ó-°Ò4áÔð €v×ÑÔàà×ÑÔð €‡�Ð(Õ )øð{
 ò 	Ùð	ús   Ä4G ÇG&Ç%G&