
    Ğimd                        d dl Z d dlZd dl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mZ  G d de          Z G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de          ZdS )    N   )InfoExtractor   )ExtractorError
clean_htmldetermine_extdict_getint_or_none
js_to_jsonstr_or_nonestrip_or_nonetraverse_objtry_geturl_or_nonec                   >   e Zd ZdZdZdZdddddd	d
dddgddddddddd
dddddddddd
ddddddd d!dd"d
d#d$d%d&d'dd(dd
d)d$d%d*d+d,d-d.d/d0d1id2d3d4dd5d6d7d%d8d9d:d;d<d=d>d1d?d@d1d?dAd1d?dBd1d?dCd1d?dDd1d?dEd1d?dFd1d?dGd1d?gZdH ZdNdJZdK Z	dL Z
dM ZdIS )OTVPIEtvpTelewizja Polskaz{https?://(?:[^/]+\.)?(?:tvp(?:parlament)?\.(?:pl|info)|tvpworld\.com|swipeto\.pl)/(?:(?!\d+/)[^/]+/)*(?P<id>\d+)(?:[/?#]|$)zThttps://swipeto.pl/64095316/uliczny-foxtrot-wypozyczalnia-kaset-kto-pamieta-dvdvideo64095316mp4uA   Uliczny Foxtrot — Wypożyczalnia kaset. Kto pamięta DVD-Video?r   iv  re:https://.+)idexttitle	age_limitduration	thumbnailz:Failed to download ISM manifest: HTTP Error 404: Not Foundz>Failed to download m3u8 information: HTTP Error 404: Not Found)url	info_dictexpected_warningsz=https://www.tvp.pl/polska-press-video-uploader/wideo/6204235162042351WideozWideo Kamera   )r   r   r   descriptionr   r   r   r   r   zJhttps://wiadomosci.tvp.pl/50725617/dzieci-na-sprzedaz-dla-homoseksualistow50725617u)   Dzieci na sprzedaż dla homoseksualistówz$md5:7d318eef04e55ddd9f87a8488ac7d590   i  )r   r   r   r$   r   r   r   z,https://warszawa.tvp.pl/25804446/studio-yayo25804446zStudio Yayo20160616i4bW   )r   r   r   upload_date	timestampr   r   r   zGeo-blocked outside PL)r   r   skipz+https://www.tvp.info/52880236/09042021-080052880236z09.04.2021, 08:00)r   r   r   r   r   z)https://opole.tvp.pl/9660819/rozmowa-dnia9660819u#   Od poniedziałku do piątku o 18:55zRozmowa dnia)r   r$   r   i  skip_downloadT)r   r   playlist_mincountparamsz)https://abc.tvp.pl/48636269/zubry-odc-12448320456u   Teleranek, Żubr)r   r   r   unavailablez!https://jp2.tvp.pl/46925618/filmy46925618Filmy)r   r      )r   r   r1   zKhttp://vod.tvp.pl/seriale/obyczajowe/na-sygnale/sezon-2-27-/odc-39/17834272r   only_matchingz/http://wiadomosci.tvp.pl/25169746/24052016-1200zLhttp://krakow.tvp.pl/25511623/25lecie-mck-wyjatkowe-miejsce-na-mapie-krakowazDhttp://teleexpress.tvp.pl/25522307/wierni-wzieli-udzial-w-procesjachz\http://sport.tvp.pl/25522165/krychowiak-uspokaja-w-sprawie-kontuzji-dwa-tygodnie-to-maksimumz]http://www.tvp.info/25511919/trwa-rewolucja-wladza-zdecydowala-sie-na-pogwalcenie-konstytucjizbhttps://tvp.info/49193823/teczowe-flagi-na-pomnikach-prokuratura-wszczela-postepowanie-wieszwiecejzyhttps://www.tvpparlament.pl/retransmisje-vod/inne/wizyta-premiera-mateusza-morawieckiego-w-firmie-berotu-sp-z-oo/48857277zQhttps://tvpworld.com/48583640/tescos-polish-business-bought-by-danish-chain-nettoc                 t    |                      dg|d          }|sd S |                     ||t                    S )Nz9window\.__(?:website|directory)Data\s*=\s*({(?:.|\s)+?});zwebsite datatransform_source)_search_regex_parse_jsonr   )selfwebpagepage_idwebsite_datas       YC:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/tvp.py_parse_vue_website_datazTVPIE._parse_vue_website_data   sS    )) I+
 N	$ $
  	4g
SSS    Nc                 z   t          |t                    r|                     ||t                    }g }|                    d          }|rXt          |t
                    r|n|gD ]=}t          |                    d                    }|r|                    d|i           >|                    d          dk    }|r	|d         }n'dt          |                    d          p|          z   }dt          |                    d          p|          ||rt          nt          
                                t          |                    d	                    t          |                    d
                    t          |                    d                    t          |                    d                    |d	S )Nr;   imager   typewebsitetvp:_idurl_transparentr   leadrelease_date_longr   )	_typer   r   ie_keyr   r$   r,   r   
thumbnails)
isinstancestrr>   r   getlistr   appendr   
TVPEmbedIErP   r
   )	r?   
video_datarA   rQ   rG   thumbthmb_url
is_websiter   s	            rC   _extract_vue_videozTVPIE._extract_vue_video   s   j#&& 	\))*gPZ)[[J
w'' 	#-eT#:#:G%%  &uyy'7'788 %%x'     ^^F++y8
 	IU#CC;z~~e'<'<'GHHHC&jnnU33>w?? *:uu
BBDD !8!899&z~~f'='=>>$Z^^4G%H%HII#JNN:$>$>??$

 

 
	
rE   c                 t   |                      dg|dd           }|r|                     ||          S |                     ||          }|r_|                     |||          }d|t	          |                    d                    t	          |                    d                    |dS t          d	          )
Nz5window\.__(?:news|video)Data\s*=\s*({(?:.|\s)+?})\s*;z
video datadefault)rA   playlistr   rM   )rO   r   r   r$   entriesz$Could not extract video/website data)r=   r\   rD   _vuejs_entriesr   rT   r   )r?   r   r@   rA   rX   rB   ra   s          rC   _handle_vuejs_pagezTVPIE._handle_vuejs_page   s    ''D)
L$ ( 0 0
  	H**:w*GGG33GWEE 		))#|WEEG $$\%5%5g%>%>??*<+;+;F+C+CDD"   CDDDrE   c           
   #      K    fd} ||          E d {V  |                     d          |                     d          k    rt          j        d          D ]t}                                          ||d| d|i          |          }|                     d          s|                     d	          s d S  ||          E d {V  sd S d S )
Nc              3   4  K   |                      d          r                    | d                   V  |                      d          pg D ]}                    |          V  |                      d          pg D ]}                    |          V  d S )NlatestVideovideositems)rT   r\   )wdvideor?   s     rC   extract_videosz,TVPIE._vuejs_entries.<locals>.extract_videos   s      vvm$$ A--b.?@@@@@))/R 5 5--e444444.B 5 5--e4444445 5rE   items_total_countitems_per_pager   zDownloading page #page)notequeryrg   rh   )rT   	itertoolscountrD   _download_webpage)r?   r   rB   rA   rk   rn   page_website_datas   `      rC   rb   zTVPIE._vuejs_entries   s?     	5 	5 	5 	5 	5 ">,//////////00<3C3CDT3U3UUU!** = =$($@$@**3>YSW>Y>Y28$ + A A% %! ),,X66 ?P?T?TU\?]?] EE)>*;<<<<<<<<<< VU= =rE   c                 J   |                      |          }|                     ||          \  }}t          t          fD ]M}|                    |j                  r1|                     |j        |                                |          c S Nt          j	        d|          r| 
                    |||          S |                     g d|d|          }dd|z   |                     |d           pd|v r|                     d	|d           nd |                     |d           d
dS )N)ievideo_idz2window\.__(?:video|news|website|directory)Data\s*=)z6<iframe[^>]+src="[^"]*?embed\.php\?(?:[^&]+&)*ID=(\d+)z&<iframe[^>]+src="[^"]*?object_id=(\d+)zobject_id\s*:\s*'(\d+)'zdata-video-id="(\d+)"z@<script>\s*tvpabc\.video\.init\(\s*\d+,\s*(\d+)\s*\)\s*</script>zvideo idr^   rL   rJ   z//s.tvp.pl/files/portal/vr$   TVPEmbed)rO   r   r$   r   rP   )	_match_id_download_webpage_handleTVPVODSeriesIETVPVODVideoIEsuitabler   
url_resultrP   researchrc   r=   _og_search_description_html_search_meta_og_search_thumbnail)r?   r   rA   r@   urlhie_clsrw   s          rC   _real_extractzTVPIE._real_extract   s   ..%%55c7CC &}5 	W 	WFtx(( WtxFMMOOgVVVVVW 9E  	B **3AAA %% 	'
 	'
 	'
 J & 	1 	1 'H$66 7 ' ' I 3g== ,0+A+A!7D ,B ,: ,: ,:CG227D2II 	
 	
 		
rE   )N)__name__
__module____qualname__IE_NAMEIE_DESC
_VALID_URL_TESTSrD   r\   rc   rb   r    rE   rC   r   r      s       G G PJ fX)
 
 IL
 " O))
 
  \@A)
 
  >"%#)	
 	
 )   =()
 
 )  ;@#
 

 "T
  ;'
 

 
 
 3
 
    ]  A  ^  V  n  o  t  K  c myFvT T T
 
 
 
:E E E*= = =,#
 #
 #
 #
 #
rE   r   c                   H    e Zd ZdZdZddddddddddddd	ddgZd
 ZdS )TVPStreamIEz
tvp:streamzf(?:tvpstream:|https?://(?:tvpstream\.vod|stream)\.tvp\.pl/(?:\?(?:[^&]+[&;])*channel_id=)?)(?P<id>\d*)z*https://stream.tvp.pl/?channel_id=56969941Tr8   z-https://tvpstream.vod.tvp.pl/?channel_id=1455ztvpstream:39821455z
tvpstream:zhttps://tvpstream.vod.tvp.pl/c                    |                      |          |                     d pd          }|                     |pdd          }|                     d|dd          }rt	          |fdd	
          n|d         }t	          |dd fd	
          }dp|d         d                    |d                   |                    d          |                    d          dddS )Nz//stream.tvp.pl/?channel_id=r_   zDownloading channel webpagezwindow\.__channels\s*=zchannel listz\[\s*{(?s:.+)}\s*])contains_patternc                 6    t          |d                   k    S )Nr   )rS   )_v
channel_ids     rC   <lambda>z+TVPStreamIE._real_extract.<locals>.<lambda>*  s    zS4\\7Q rE   F)get_allr   rh   c                     |d         du S )Nis_liveTr   )r   r   s     rC   r   z+TVPStreamIE._real_extract.<locals>.<lambda>+  s    )PT@T rE   rL   r   ztvp:{}rw   r   Trx   )rO   r   r   r   	alt_titler   rP   )ry   _proto_relative_urlrs   _search_jsonr   formatrT   )r?   r   channel_urlr@   channelschannelauditionr   s          @rC   r   zTVPStreamIE._real_extract#  s,   ^^C((
../Zj/Z/Z/g^ghh((j6MIOlmm$$%w
2 % 4 4 gq  B,x*Q*Q*Q*Q\abbbbv~  @A  wB'3T3T)U_deee&-??8J#788\\'** W-- 
 
 	
rE   Nr   r   r   r   r   r   r   r   rE   rC   r   r     s        GzJ; 
 ? 
 $ 
  
 / F&
 
 
 
 
rE   r   c                       e Zd ZdZdZdZdZdedd          dgZd	d
ddddddddddddddddddddddddd ddd!ddgZd" Z	dS )#rW   z	tvp:embedr   Fa  (?x)
        (?:
            tvp:
            |https?://
                (?:[^/]+\.)?
                (?:tvp(?:parlament)?\.pl|tvp\.info|tvpworld\.com|swipeto\.pl)/
                (?:sess/
                        (?:tvplayer\.php\?.*?object_id
                        |TVPlayer2/(?:embed|api)\.php\?.*[Ii][Dd])
                    |shared/details\.php\?.*?object_id)
                =)
        (?P<id>\d+)
    z$(?x)<iframe[^>]+?src=(["\'])(?P<url>   N)z
tvp:194536194536r   u    Czas honoru, odc. 13 – Władekz$md5:76649d2014f65c99477be17f23a4deadr'   i\
  zCzas honoruz
Episode 13   zsezon 1r   )r   r   r   r$   r   r   seriesepisodeepisode_numberseasonr   r%   zJhttps://www.tvp.pl/sess/tvplayer.php?object_id=51247504&amp;autoplay=false51247504zRazmova 091220il  r   )r   r   r   r   r   r   z5https://tvp.info/sess/TVPlayer2/embed.php?ID=50595757Tr8   z<https://wiadomosci.tvp.pl/sess/TVPlayer2/api.php?id=51233452zhttps://www.tvp.pl/shared/details.php?copy_id=52205981&object_id=52204505&autoplay=false&is_muted=false&allowfullscreen=true&template=external-embed/video/iframe-video.htmlc                 
   |                      |          }t          j        d          }|                     d| d| |          }|dt	          |          z   d         }|                    d          rV|                     |dd          |d	          }t          |d
          }|dk    rt          d          t          |pd          |                     ||          d         }|d         }	t          |	d t                    }
|	                    d          r|                     dg           g }|d         D ]}t          |                    d                    }|s(t          |d           }|dk    r.|                    |                     ||dd|
                     l|dk    r0|
ru|                    |                     ||dd                     |dk    r-|                    |                     ||dd                     |                    d          r.|                    |                     ||d d!                     |                    d"||p|                    d#          t-          t          |d$                    t-          t          |d%          d&'          t-          t          |d(                    t-          t          |d)                    d*           t/          |	d+          }t/          |	d,          }g }|                    d-          pd.D ]t}|                    d/          }|rd0|v sd1|v r"|                    |                    d/          |                    d2          |                    d3          d4           ut          |	d5 t0                    }|d6k    rd7}|
st          |	d8 t0                    nd }i }|                    d9          pg D ]c}|                    d          s|                    |d:         g                               |d         |                    d#          d;           d||||||
|||d<	}|	                    d=          d>k    r|                    d?                    |	                    d@          |	                    dA                    |	                    d@          |	                    dB          |	                    dC          dD           |S )EN)	jebac_pisjebacpisziobrosasin70sasin_przejebal_70_milionow_PLN!tvp_is_a_state_propaganda_servicez-https://www.tvp.pl/sess/TVPlayer2/api.php?id=z &@method=getTvpConfig&@callback=   znull,   Ffatal)r   descu   Obiekt wymaga płatnościz@Video requires payment and log-in, but log-in is not implementedzunexpected JSON errorcontentinfoc                     | d         S )NisLiver   xs    rC   r   z*TVPEmbedIE._real_extract.<locals>.<lambda>  s
    !H+ rE   isGeoBlockedPL)	countriesfilesr   m3u8hls)m3u8_idr   livempddash)mpd_idr   f4mhds)f4m_idr   z.ism/manifestmss)ism_idr   directrH   )qualityfps)r   bitratei  )scale)r   width)r   height)	format_idr   r   r   tbrr   r   )subtitler   seoTitle)r$   seoDescriptionpostersr   srcz{width}z{height}r   r   )r   r   r   c                     | d         d         S )NageGroupminAger   r   s    rC   r   z*TVPEmbedIE._real_extract.<locals>.<lambda>  s    AjM(,C rE   r   r   c                     | d         S )Nr   r   r   s    rC   r   z*TVPEmbedIE._real_extract.<locals>.<lambda>  s
    1Z= rE   	subtitleslangr   r   )	r   r   r$   rQ   r   r   r   formatsr   
vortalNamevodz{}, {}r   r   r   r   )r   r   r   r   )ry   randomchoicers   len
startswithr>   r   r   r   boolrT   raise_geo_restrictedr   r   extend_extract_m3u8_formats_extract_mpd_formats_extract_f4m_formatsendswith_extract_ism_formatsrV   r
   r	   int
setdefaultupdater   )r?   r   rw   callbackr@   datastrerror
error_descr   r   r   r   file	video_urlr   r   r$   rQ   rY   	thumb_urlr   r   r   subr   s                            rC   r   zTVPEmbedIE._real_extractp  s   >>#&& = "
   ((pHppfnpprz| | "s8}},R/0g&& 	H$$WQRR[(%$HHE%e[99J888$%ghhh !F/FGGG""7H55i@v$ 5 5t<<88N## 	8%%%777G$ 	 	D#DHHUOO44I 	400Cf}}t99)XW\dipw9xxyyyy t88HU[ch8iijjjjt88HUZbg8hhiiii##O44 t88HUZbg8hhiiii!)$2$((6"2"2&|D:L'M'MNN&|D:P'Q'QY]^^^(d<P)Q)QRR),t=R*S*STT        @AAt%FGG
[[++1r 	 	E		%((I 	Y 6 6*	:Q:Qyy''7++))H--     
 D"C"CSII	>>IFMW74!8!8#>>>SW	;;{++1r 	 	C775>>   Vb11885zwwv: :     &$" "

 

	 88L!!U**!'):):DHHZ<P<PQQ((7++((8,,"&((9"5"5	     rE   )
r   r   r   r   r   _GEO_BYPASSr   _EMBED_REGEXr   r   r   rE   rC   rW   rW   7  s       G GKJ NJqrrNMMMNL 7A## )
 
   \%)
 

 
 G 
 N 
 ~ A$FLn n n n nrE   rW   c                   $    e Zd ZdZi fdZddZdS )TVPVODBaseIEzhttps://vod.tvp.pl/api/productsc                     d  | j         | j         d| |fddd|fdd|\  }} |j                  r|S t          d|                    d	           d
|j         d          )Nc                 "    d| cxk    odk     nc S )N   ,  r   r   s    rC   r   z(TVPVODBaseIE._call_api.<locals>.<lambda>  s    SA^^^^^^^^ rE   /plBROWSER)r   platformc                 :     |           pd| cxk    odk     nc S )Ni  i  r   )r   is_valids    rC   r   z(TVPVODBaseIE._call_api.<locals>.<lambda>  s(    hhqkk&CSA^^^^^^^^ rE   )rp   expected_statuszWoronicza said: codez (HTTP r   )_download_json_handle_API_BASE_URLstatusr   rT   )r?   resourcerw   rp   kwargsdocumentr   r  s          @rC   	_call_apizTVPVODBaseIE._call_api  s    ++33!..H..OY@@%@CCCCO O HNO O$ 8DK   	O[V0D0D[[T[[[[\\\rE   Tc                 V   t          |dt          hfddt          hfdt          hfdt          hfdddt          hfdd	d	d
d
t          hfifd          }t	          t          |d                    |d<   |r6|                    d
|d         t                                          d           |S )Nr   r   ratingr   numberr   serialimages.r   )r   r   r   r   r   r   rQ   )rM   r$   r$   webUrl)rO   r   rP   )	r   r   r
   r   r   r	   r   r|   rP   )r?   rj   with_urlr   s       rC   _parse_videozTVPVODBaseIE._parse_video  s     +'"[M2#k]3'+77[MB#S#}7M/NO)
 )
  	 $.hu>U.V.V#W#W	-  	X'..00    
 rE   N)T)r   r   r   r  r  r  r   rE   rC   r  r    sH        5M24 ] ] ] ]     rE   r  c                       e Zd ZdZdZddddddd	d
dddd
ddidddddddddddddiddddddddd d!d"d#dd$
ddid%d&d'dd(d)dd*d+d,d-d.gZd/ Zd0S )1r|   ztvp:vodzhttps?://vod\.tvp\.pl/(?P<category>[a-z\d-]+,\d+)/[a-z\d-]+(?<!-odcinki)(?:-odcinki,\d+/odcinek--?\d+,S-?\d+E-?\d+)?,(?P<id>\d+)/?(?:[?#]|$)z_https://vod.tvp.pl/dla-dzieci,24/laboratorium-alchemika-odcinki,309338/odcinek-24,S01E24,311357311357r   u6   Tusze termiczne. Jak zobaczyć niewidoczne. Odcinek 24z$md5:1d4098d3e537092ccbac1abf49b7cd4cr  r#   z
Episode 24r   zLaboratorium alchemikazre:https?://.+)
r   r   r   r$   r   r   r   r   r   r   r0   r   )r   r   r2   zGhttps://vod.tvp.pl/filmy-dokumentalne,163/ukrainski-sluga-narodu,339667339667u   Ukraiński sługa naroduz$md5:b7940c0a8e439b0c81653a986f544ef3r'   i  zcount:2)r   r   r   r$   r   r   r   r   z#embed fails with "payment required"zUhttps://vod.tvp.pl/seriale,18/polowanie-na-cmy-odcinki,390116/odcinek-7,S01E07,398869398869zodc. 7z$md5:dd2bb33f023dc5c2fbaddfbe4cb5dba0i
     u   Polowanie na ćmy   z	Episode 7)
r   r   r   r$   r   r   r   r   r   r   )ro   r   r   r2   z*https://vod.tvp.pl/live,1/tvp-world,399731399731z*re:TVP WORLD \d{4}-\d{2}-\d{2} \d{2}:\d{2}r   )r   r   r   live_statusr   r%   z|https://vod.tvp.pl/informacje-i-publicystyka,205/konskie-2025-debata-przedwyborcza-odcinki,2028435/odcinek--1,S01E-1,2028419Tr8   c                    |                      |                              dd          \  }}|dk    }|rdnd}|                     |                     | d| |          d          }|                     | d	|d
di          }g |d<   t	          |d          D ]3}|d                             |                     ||d                     4t	          |d          D ]3}|d                             |                     ||d                     4i |d<   |                    d          pg D ]O}	|d         	                    |	                    d          pdg           
                    |	d         dd           P||d<   |S )Ncategoryr   zlive,1livesvodsr  F)r  z/videos/playlist	videoTypeMOVIE)rp   r   )sourcesHLS.r   r   )r-  DASH.r   r   languageundr   ttmlr   r   )_match_valid_urlgroupr  r  r   r   r   r   rT   r   rV   )
r?   r   r(  rw   r   entityr   r`   manifest_urlr   s
             rC   r   zTVPVODVideoIE._real_extract@  s   !22377==j$OO(h&#/%%dnn5K5K5K5KX&V&Vaf%gg	>>X"?"?"?R]_fQg>hh!	)(3QRR 	i 	iLi ''(B(B<QYaf(B(g(ghhhh(3RSS 	h 	hLi ''(A(A,PX`e(A(f(fgggg!#	+<<,,2 	 	Ck"--cggj.A.A.JUBOOVV5zX X    
  '	)rE   Nr   r   rE   rC   r|   r|     s6       G aJ qMA #.)
 
 #F+   Y/A)"	
 	
 #F+  6fA)")
 
 #F+ " <B$)
 
	 	 N k8Ft    rE   r|   c                   L    e Zd ZdZdZdddddgdd	d
ddddddgZd Zd ZdS )r{   ztvp:vod:serieszVhttps?://vod\.tvp\.pl/[a-z\d-]+,\d+/[a-z\d-]+-odcinki,(?P<id>\d+)(?:\?[^#]+)?(?:#.+)?$z3https://vod.tvp.pl/seriale,18/ranczo-odcinki,316445316445Ranczor'   seriale)r   r   r   
categories   )r   r   playlist_countz?https://vod.tvp.pl/programy,88/rolnik-szuka-zony-odcinki,284514Tr8   zFhttps://vod.tvp.pl/dla-dzieci,24/laboratorium-alchemika-odcinki,309338c              #      K   |D ]K}|                      d| d|d          d|d|d                    }t          | j        |          E d {V  Ld S )Nvods/serials/z	/seasons/r   z	/episodeszDownloading episode list for r   ro   )r  mapr  )r?   seasonsplaylist_idr   episodess        rC   _entrieszTVPVODSeriesIE._entriesp  s       	8 	8F~~MMMfTlMMM{FVG_FF & H HH 4,h7777777777		8 	8rE   c                    |                      |          }|                     d| |d          }|                     d| d|d          }|                     |                     ||          |t	          |                    d                    t          t          |dt                              t          |d	          gt          |                    d
                              S )Nr?  zDownloading serial metadatar@  z/seasonszDownloading season listr   )r$   rM   )expected_type)mainCategorynamer  )r;  r   )	ry   r  playlist_resultrE  r   rT   r   r   r
   )r?   r   rC  metadatarB  s        rC   r   zTVPVODSeriesIE._real_extractw  s    nnS))>>)K));. " 0 0 ..1K111;* ! , , ##MM';//mHLLY`LaLa>b>b|H.EUbcccdd$X/GHHI!(,,x"8"899	 $ 
 
 	
rE   N)r   r   r   r   r   r   rE  r   r   rE   rC   r{   r{   [  s        GjJ E$+	
 
 	 	 Q  X F"8 8 8
 
 
 
 
rE   r{   )rq   r   r   commonr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   rW   r  r|   r{   r   rE   rC   <module>rN     s        				 ! ! ! ! ! !                         u
 u
 u
 u
 u
M u
 u
 u
p'
 '
 '
 '
 '
- '
 '
 '
Tg g g g g g g gT    =   BV V V V VL V V Vr)
 )
 )
 )
 )
\ )
 )
 )
 )
 )
rE   