
    V|h]                         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  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Jr   " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N   )InfoExtractor   )	HTTPError)ExtractorErrorOnDemandPagedListage_restricted
clean_htmlextract_attributesint_or_nonetraverse_objtry_getunescapeHTMLunsmuggle_url
update_urlurl_or_noneurlencode_postdatac                   X    \ rS rSrSrSSS.rSrS r\S 5       r	S	 r
S
 rS rSS jrSrg)DailymotionBaseInfoExtractor   Nzapplication/jsonzhttps://www.dailymotion.com)zContent-TypeOrigindailymotionc                 $    U R                  S5      $ )Nzhttps://www.dailymotion.com/)_get_cookies)selfs    V/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/dailymotion.py_get_dailymotion_cookies5DailymotionBaseInfoExtractor._get_dailymotion_cookies!   s      !?@@    c                 L    U R                  U5      nU(       a  UR                  $ g N)getvalue)cookiesnamecookies      r   _get_cookie_value.DailymotionBaseInfoExtractor._get_cookie_value$   s"    T"<< r   c                 (    U R                  SX5        g )Nzwww.dailymotion.com)_set_cookie)r   r%   r#   s      r   _set_dailymotion_cookie4DailymotionBaseInfoExtractor._set_dailymotion_cookie*   s    .<r   c                     U R                  5       nU R                  US5      nU(       a  US:H  O[        SU R                  S5      5      U l        U R                  SU R                  (       a  S5        g S5        g )Nffon   	age_limitoff)r   r'   r	   	get_param_FAMILY_FILTERr+   )r   r$   r.   s      r   _real_initialize-DailymotionBaseInfoExtractor._real_initialize-   s`    //1##GT2,.bDjN2t~~VaGb4c$$T43F3F4RERr   c                    U R                  5       nU R                  US5      =(       d    U R                  US5      nU(       a  U$ SSS.nU R                  5       u  pVU(       a  UR                  SUUS.5        OSUS	'    U R	                  S
S S[        U5      S9S   nU R                  U(       a  SOSU5        U$ ! [         a  n[        UR                  [        5      (       ag  UR                  R                  S:X  aM  [        U R                  UR                  R                  R                  5       R                  5       U5      S   SS9ee S nAff = f)Naccess_tokenclient_tokenf1a362d288c1b98099c7(eea605b96e01c796ff369935357eca920c5da4c5)	client_idclient_secretpassword)
grant_typer>   usernameclient_credentialsr?   z/https://graphql.api.dailymotion.com/oauth/tokenzDownloading Access Token)datai  error_descriptionTexpected)r   r'   _get_login_infoupdate_download_jsonr   r   
isinstancecauser   status_parse_jsonresponsereaddecoder+   )r   xidr$   tokenrB   r@   r>   es           r   
_get_token'DailymotionBaseInfoExtractor._get_token3   sX   //1&&w?r4CYCYZacqCrL 0G
 "113KK($$  "6D		''A0'- ( / 0>?E 	$$x^^UZ[  	!''9--!''..C2G$T%5%5GG$$))+224c&;;N&PZ^` `		s   ?B: :
EBEEc                    U R                   R                  S5      (       d!  SU R                  U5       3U R                   S'   U R                  SX$[        R
                  " SSU< SU< SU(       a  SU-   OS	< S
U< S3	05      R                  5       U R                   S9nUS   U   nU(       d  [        US   S   S   SS9eU$ )NAuthorizationBearer $https://graphql.api.dailymotion.com/queryz{
  z(xid: ""z,  z) {
    z
  }
}rB   headersrB   errorsr   messageTrD   )_HEADERSr"   rS   rH   jsondumpsencoder   )r   object_typerP   object_fieldsnotefilter_extrarespobjs           r   	_call_api&DailymotionBaseInfoExtractor._call_apiS   s    }}  11/6ts7K6L-MDMM/*""2CDJJ 	S$-2E}	VP E vx # 0 6l;' h!29!=MM
r   )r4   r!   )__name__
__module____qualname____firstlineno__r4   r`   _NETRC_MACHINEr   staticmethodr'   r+   r5   rS   rj   __static_attributes__ r   r   r   r      sK    N*/H #NA    
=S@r   r   c                   .  ^  \ rS rSrSrSrS\SS  S3/rSS	S
SSSSSSSSSS\\S.S.SSS
SSSSSSSSS S\\S.S.S!S"S#S
S$S%S&SS'S(S)S*S\S+.S,S-.S.S/S0S
S1S2S3S4.S,S-.S5S6S7.S8S6S7.S9S6S7.S:S6S7.S;S6S7.S<S6S7.S=S6S7.S>S6S7.S?S6S7.S@S6S7.SAS6S7.SBS6S7.SCS6S7.SDS6S7./rSESFS
SGSHSISJSKSLSMS/ S\\SN.S.SOSPSQ0SRSS.STSUS
SV\SWSX\SYSZS[SS\S]S^S_.S.S`SaS
\SbSc\SSdSSeSfSgSh/ Si.SjSk.SlSmS
SnSoSpSq\\SSr/ SSsStSu.SjSk.SvSwS
SxSSySz\SSS{S|S}S~\S.S./r	Sr
Sr\U 4S j5       rS rSrU =r$ )DailymotionIEe   a  (?ix)
                    (?:https?:)?//
                    (?:
                        dai\.ly/|
                        (?:
                            (?:(?:www|touch|geo)\.)?dailymotion\.[a-z]{2,3}|
                            (?:www\.)?lequipe\.fr
                        )/
                        (?:
                            swf/(?!video)|
                            (?:(?:crawler|embed|swf)/)?video/|
                            player(?:/[\da-z]+)?\.html\?(?:video|(?P<is_playlist>playlist))=
                        )
                    )
                    (?P<id>[^/?_&#]+)(?:[\w-]*\?playlist=(?P<playlist_id>x[0-9a-z]+))?
    r   zl(?ix)<(?:(?:embed|iframe)[^>]+?src=|input[^>]+id=[\'"]dmcloudUrlEmissionSelect[\'"][^>]+value=)["\'](?P<url>   N)zphttp://www.dailymotion.com/video/x5kesuj_office-christmas-party-review-jason-bateman-olivia-munn-t-j-miller_newsx5kesujmp4uJ   Office Christmas Party Review –  Jason Bateman, Olivia Munn, T.J. MillerzGOffice Christmas Party Review - Jason Bateman, Olivia Munn, T.J. Miller   zcount:5z"re:https?://s[12]\.dmcdn\.net/v/.+iUOY20170501Deadlinex1xm8rir   )idexttitledescriptiondurationtags	thumbnail	timestampupload_dateuploaderuploader_idr1   
view_count
like_count)url	info_dictz?https://geo.dailymotion.com/player.html?video=x89eyek&mute=truex89eyeku    En quête d'esprit du 27/03/2022z$md5:66542b9f4df2eb23f314fc097488e553i
  zcount:1iV@b20220327CNEWSx24vthzphttps://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames 2137c41a8e78554bb09225b8eb322406x2iuewmz>Steam Machine Models, Pricing Listed on Steam Store - IGN Newsz/Several come bundled with the Steam Controller.J   iT20150306IGNxijv66)r   r   r   r   r   r   r   r   r   r   r1   r   z
video gone)r   md5r   skipznhttp://www.dailymotion.com/video/xyh2zz_leanna-decker-cyber-girl-of-the-year-desires-nude-playboy-plus_redband 0d667a7b9cebecc3c89ee93099c4159dxyh2zzzBLeanna Decker - Cyber Girl Of The Year Desires Nude [Playboy Plus]HotWaves1012r0   )r   r   r   r   r1   z'http://www.dailymotion.com/video/xhza0oT)r   only_matchingzqhttp://www.dailymotion.com/video/x20su5f_the-power-of-nightmares-1-the-rise-of-the-politics-of-fear-bbc-2004_newsz,http://www.dailymotion.com/swf/video/x3n92nfzLhttp://www.dailymotion.com/swf/x3ss1m_funny-magic-trick-barry-and-stuart_funz$https://www.lequipe.fr/video/x791memz0https://www.lequipe.fr/video/k7MtHciueyTcrFtFKA2z7https://www.dailymotion.com/video/x3z49k?playlist=xv4bwzGhttps://geo.dailymotion.com/player/x86gw.html?video=k46oCapRs4iikoz9DWyzhttps://geo.dailymotion.com/player/xakln.html?video=x8mjju4&customConfig%5BcustomParams%5D=%2Ffr-fr%2Ftennis%2Fwimbledon-mens-singles%2Farticles-videoz=https://geo.dailymotion.com/player/xf7zn.html?playlist=x7wdsjz;https://geo.dailymotion.com/player/xmyye.html?video=x93blhiz1https://www.dailymotion.com/crawler/video/x8u4owgz/https://www.dailymotion.com/embed/video/x8u4owgzhttps://dai.ly/x94cnnkzhttps://www.financialounge.com/video/2024/08/01/borse-europee-in-rosso-dopo-la-fed-a-milano-volano-mediobanca-e-tim-edizione-del-1-agosto/x93blhizOnAir - 01/08/24r[      iYf20240801Financialoungex2vtgmm)r   r   r   r   r   r   r   r   r   r1   r   r   r   r   zNhttps://www.cycleworld.com/blogs/ask-kevin/ducati-continues-to-evolve-with-v4/r   x7wdsj2   r   r   playlist_mincountzhttps://www.leparisien.fr/environnement/video-le-veloto-la-voiture-a-pedales-qui-aimerait-se-faire-une-place-sur-les-routes-09-03-2024-KCYMCPM4WFHJXMSKBUI66UNFPU.phpx8u4owguH   À bord du « véloto », l’alternative à la voiture pour la campagnezLe Parisien20240309zcount:7z're:https?://www\.leparisien\.fr/.+\.jpgi*ex32f7bua   VIDÉO. Le « véloto », la voiture à pédales qui aimerait se faire une place sur les routesg     z@)r   r   r   r   r   r   r   r   r   r   r1   r   r   r   zNhttps://www.metatube.com/en/videos/546765/This-frogs-decorates-Christmas-tree/x8vu47wMetatube20240326i^fx2xpy74u&   Está lindas ranitas ponen su arbolito   zQue lindura)r   r   r   r   r   r   r   r   r1   r   r   r   r   r   zInvalid URL)r   r   r   zbhttps://lcp.fr/programmes/avant-la-catastrophe-la-naissance-de-la-dictature-nazie-1933-1936-346819k2Y4Mjp7krAF9iCuINMzBAvant la catastrophe la naissance de la dictature nazie 1933 -1936z$md5:7b620d5e26edbe45f27bbddc1c0257c1u   LCP Assemblée nationalexbz33di  iKg20250218)r   r   r   r   r   r   r   r   r1   r   r   r   r   r   zMhttps://forum.ionicframework.com/t/ionic-2-jw-player-dailymotion-player/83248xwr14qz2Macklemore & Ryan Lewis - Thrift Shop (feat. Wanz)z$md5:47fbe168b5a6ddc4a205e20dd6c841b2   i%P20130114zMacklemore Officialx19qlwr)r   r   r   r1   r   r   r   r   r   r   r   r   r   r   FzIdescription
      geoblockedCountries {
        allowed
      }
      xidc              #   L  >#    [         T	U ]  X5       S h  vN   [        R                  " SU5       H  nSUR	                  S5      -   v   M     [        R                  " SU5       H  n[        UR	                  S5      5      n[        UR                  S5      5      nU(       d  M@  UR                  SS5      nUR                  S	5      (       a  S
U 3nUR                  S5      =n(       a  SU 3nO UR                  S5      =n(       a  SU 3nOM  [        XWS9v   M     g  GN7f)NzS(?s)DM\.player\([^,]+,\s*{.*?video[\'"]?\s*:\s*["\']?(?P<id>[0-9a-zA-Z]+).+?}\s*\);z(https://www.dailymotion.com/embed/video/r   z`(?s)<script [^>]*\bsrc=(["\'])(?:https?:)?//[\w-]+\.dailymotion\.com/player/(?:(?!\1).)+\1[^>]*>r   srcz.jsz.htmlz//zhttps:z
data-videozvideo=zdata-playlistz	playlist=rY   )super_extract_embed_urlsrefinditergroupr   r   r"   replace
startswithr   )
clsr   webpagemobjattrs
player_urlvideo_idquery_stringplaylist_id	__class__s
            r   r   !DailymotionIE._extract_embed_urlsV  s     7.s<<<KKfhoqD<tzz$?OOOq KKsu|~D&tzz!}5E$UYYu%56J#++E7;J$$T**%j\2
 99\22x2!'z2 %		/ :::!*;-8Z<<~	 	=s   D$D!DD$c                 z	  ^" [        U5      u  pU R                  U5      R                  SSS5      u  p4nU(       a  UnS nU R                  XS5      (       a  U R	                  SU 3SU5      $ U R                  S5      nU R                  SUSU R                  < S	U R                  < S
3SU(       a   SR                  U R                  S5      5      OS 5      nUS   nU R                  SU-   US[        US5      =(       d    SS0S9n	U	R                  S5      n
U
(       al  U
R                  S5      =(       d    U
S   nU
R                  S5      S:X  a!  [        US [        5      nU R                  XS9  [        U R                    SU 3SS9eU	S   nUR                  S5      n/ n0 nU	S   R#                  5        H  u  nnU H  nUR                  S 5      nUR                  S!5      nU(       a  US":X  a  M4  US#:X  a:  U R%                  UUS$US%S&S'9u  nnUR'                  U5        U R)                  UUS(9  Mt  US)U-   S*.n[*        R,                  " S+U5      nU(       a7  [/        [0        UR3                  5       5      u  nnnUR5                  UUUS,.5        UR7                  U5        M     M     U HU  nUS    R9                  S-5      S.   US '   UR                  S/5      (       a  M5  US0   R;                  S15      (       d  MP  S2US/'   MW     [        U	S3 [<        5      =(       d    0 nUR#                  5        H.  u  nnUR                  S4/ 5       Vs/ s H  nS U0PM	     snUU'   M0     [        U	S5[<        R"                  1S6 S.[0        14S.[>        14S7S8.45      nU	R                  S95      =(       d    0 n UR                  S:5      =(       d    0 m"U"4S; jn!UU[A        UR                  S<5      5      U[1        U	R                  S=5      5      =(       d    S [1        U	R                  S>5      5      U R                  S?5      U R                  S5      =(       d    U	R                  S?5      U	R                  S@5      (       a  SAOS.U	R                  SB5      U!" SC5      =(       d    [1        UR                  SD5      5      U!" SE5      UUUSF.$ s  snf )GNr   is_playlistr   z$http://www.dailymotion.com/playlist/DailymotionPlaylistvideopasswordmediaz... on Video {
      z
      stats {
        likes {
          total
        }
        views {
          total
        }
      }
    }
    ... on Live {
      z(
      audienceCount
      isOnAir
    }zDownloading media JSON metadatazpassword: "{}"rP   z2https://www.dailymotion.com/player/metadata/video/zDownloading metadata JSONrY   appzcom.dailymotion.neonr   errorr   raw_messagecodeDM007c                     U S   S   $ )NgeoblockedCountriesallowedrs   xs    r   <lambda>-DailymotionIE._real_extract.<locals>.<lambda>  s    Q?T=UV_=`r   )msg	countriesz said: TrD   isOnAir	qualitiesr   typez#application/vnd.lumberjack.manifestzapplication/x-mpegURLrz   hlsF)livem3u8_idfatal)targetzhttp-)r   	format_idz/H264-(\d+)x(\d+)(?:-(60)/)?)fpsheightwidth#r   r   r   z@60<   c                     U S   S   $ )N	subtitlesrB   rs   r   s    r   r   r     s    Q{^F5Kr   urls)posters
thumbnailsc                     [        US   5      $ )Nr   )r   )_vs     r   r   r     s    +aPQdBSr   r   )r   r   r   ownerstatsc                 8   >^  [        [        TU 4S j5      5      $ )Nc                    > U TS-      S   $ )Nstotalrs   )yr   s    r   r   ?DailymotionIE._real_extract.<locals>.<lambda>.<locals>.<lambda>  s    1QW:gCVr   )r   r   )r   r   s   `r   r   r     s    k'%9V*WXr   r   r   created_time
screennameexplicitr0   r   viewaudienceCountlike)r   r   r   r   r   r   r   r   r1   r   r   r   formatsr   is_live)!r   _match_valid_urlr   _yes_playlist
url_resultr3   rj   _COMMON_MEDIA_FIELDSformatrH   r   r"   r   listraise_geo_restrictedr   IE_NAMEitems#_extract_m3u8_formats_and_subtitlesextend_merge_subtitlesr   searchmapr   groupsrG   appendsplitendswithdictstrr
   )#r   r   smuggled_datar   r   r   r>   r   rP   metadatar   r   allowed_countriesr  r  r   quality
media_listm	media_url
media_typefmtsubsfr   r   r   subtitles_datasubtitle_langsubtitlesubtitle_urlr   r   	get_countr   s#                                     @r   _real_extractDailymotionIE._real_extractn  s   *3/-1-B-B3-G-M-MdTacp-q*{"KHk44??6{mD%{4 4 >>/2X %%t'@'@ B DeHP##DNN?$CDVZ#\$ El&&@3F,}g6Y5BX:Y ' [
 W%IIg&>%*>Eyy G+$+E3`bf$g!))e)Q <<.w/$@ @ !))I&	#+K#8#>#>#@GZEE%L	UU6]
 J2W$W!88 $ H H!8U%W\ !I !^ICNN3'))$y)A  )%,w%6A 		"A9MA-0ahhj-I*vs#&&,%*" 
 NN1%/   $A2 Ax~~c*1-AeH55<<AkN$;$;E$B$B% 
 !+KTRXVX'5';';'=#M8 #+,,vr":(<":, |)":(<Im$ (>
 "(%

|5S{m,3%jV- 
 W%+		'"(bX	 %eii&>?$#HLL$<=E$X\\.%AB		,/ 99T?Hhll<.H'||J77QLL(#F+V{599_;U/V#F+"
 	
(<s   R8rs   )rl   rm   rn   ro   
_VALID_URLr
  _EMBED_REGEXint_TESTS_WEBPAGE_TESTS_GEO_BYPASSr  classmethodr   r'  rr   __classcell__)r   s   @r   ru   ru   e   so   J  G D  EO  PQ  PR  ES  DT  TU  V  WL Bad>#%"$
& Q8A>#%#
& B1UL>#%#
 #( @1Y&
  9 C
 > ^ 6 B I Y h O M C A (WnFb \'#%($>
* `(
   we%%C##|
* `"%>#$=(
  ', t'YA2#>#%
  '* _IA>#%-$
kgNP K = =.u
 u
r   ru   c                   $    \ rS rSrSrS rS rSrg)DailymotionPlaylistBaseIEi  d   c              #      #    US-  nU R                  U R                  USU R                  (       a  SOSU R                  U4-  SU 35      S   nUS    H5  nUS   nU R	                  US	   [
        R                  5       US
   5      v   M7     g 7f)Nr   zvideos(allowExplicit: %s, first: %d, page: %d) {
      edges {
        node {
          xid
          url
        }
      }
    }falsetruezDownloading page videosedgesnoder   rP   )rj   _OBJECT_TYPEr4   
_PAGE_SIZEr  ru   ie_key)r   r   pager7  edger9  s         r   _fetch_page%DailymotionPlaylistBaseIE._fetch_page  s     	{	 **GNO  v&
( )1
2 7OD<D//U]113T%[B B $s   BBc                     U R                  U5      n[        [        R                  " U R                  U5      U R
                  5      nU R                  X25      $ r!   )	_match_idr   	functoolspartialr?  r;  playlist_result)r   r   r   entriess       r   r'  'DailymotionPlaylistBaseIE._real_extract  sO    nnS)#I$5$5k%+,0OO=##" 	"r   rs   N)rl   rm   rn   ro   r;  r?  r'  rr   rs   r   r   r2  r2    s    JB$"r   r2  c                   B    \ rS rSrSrSrSSS0SS./rS	r\S
 5       r	Sr
g)DailymotionPlaylistIEi  zdailymotion:playlistzK(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/playlist/(?P<id>x[0-9a-z]+)zChttp://www.dailymotion.com/playlist/xv4bw_nqtv_sport/1#video=xl8v3qr   xv4bw   r   
collectionc           	   #      #    [         R                  " SU5       H@  n[         R                  " S[        UR	                  S5      5      5       H
  nSU 3v   M     MB     g 7f)Nzf<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?dailymotion\.[a-z]{2,3}/widget/jukebox\?.+?)\1zlist\[\]=/playlist/([^/]+)/r   z//dailymotion.com/playlist/)r   r   findallr   r   )r   r   r   r   ps        r   r   )DailymotionPlaylistIE._extract_embed_urls  sU      KKyD ZZ >TZZX]M^@_`3A377 as   AArs   N)rl   rm   rn   ro   r
  r)  r,  r:  r/  r   rr   rs   r   r   rI  rI    sC    $G_JT'
   F  L8 8r   rI  c                   J    \ rS rSrSrSrSrSSSS.SS	./rS
rS r	S r
S rSrg)DailymotionSearchIEi  zdailymotion:searchzHhttps?://(?:www\.)?dailymotion\.[a-z]{2,3}/search/(?P<id>[^/?#]+)/videosrK  z8http://www.dailymotion.com/search/king of turtles/videoszking of turtles)r   r   r   r   zquery SEARCH_QUERY( $query: String! $page: Int $limit: Int ) { search { videos( query: $query first: $limit page: $page ) { edges { node { xid } } } } } c                    U R                   R                  S5      (       d!  SU R                  U5       3U R                   S'   U R                  SS U[        R
                  " SU R                  SUUS.S.5      R                  5       U R                   S9n[        US	S
[        145      nU(       d'  [        [        USSS[        145      =(       d    S5      eU$ )NrV   rW   rX   SEARCH_QUERYrK  )limitr=  rY   )operationNamerY   	variablesr\   rB   r  r^   r   r_   zCould not fetch search data)r`   r"   rS   rH   ra   rb   _SEARCH_QUERYrc   r   r  r   r  )r   termr=  rf   rh   ri   s         r   _call_search_api$DailymotionSearchIE._call_search_api'  s    }}  11/6tt7L6M-NDMM/*""2D$TZZ!/++ !Q F vx # 	0 4&(TF!;< THaSE#BCdGdf f 
r   c              #      #    US-  nU R                  XSU SU 35      n[        US5       H  nU R                  SU 3[        U5      v   M!     g 7f)Nr   zSearching "z" page )r7  r8  .r9  rP   z"https://www.dailymotion.com/video/)rZ  r   r  ru   )r   rY  r=  rM   rP   s        r   r?  DailymotionSearchIE._fetch_page;  s]     	(({4&PTv5VW*QRC//$Fse"Lm]`aa Ss   AAc                     [         R                  R                  U R                  U5      5      nU R	                  [        [        R                  " U R                  U5      U R                  5      X"5      $ r!   )
urllibparseunquote_plusrB  rE  r   rC  rD  r?  r;  )r   r   rY  s      r   r'  !DailymotionSearchIE._real_extractA  sX    ||(()<=##i//0@0@$GY[_g 	gr   rs   N)rl   rm   rn   ro   r
  r)  r;  r,  rX  rZ  r?  r'  rr   rs   r   r   rR  rR    sI    "G\JJI#&
  F pM(bgr   rR  c                   V    \ rS rSrSrSrSSS0SS.S	SS
0SSS.SSS0SSS0S./rSrSrg)DailymotionUserIEiG  zdailymotion:userzhttps?://(?:www\.)?dailymotion\.[a-z]{2,3}/(?!(?:embed|swf|#|video|playlist|search|crawler)/)(?:(?:old/)?user/)?(?P<id>[^/?#]+)z%https://www.dailymotion.com/user/nqtvr   nqtv   r   z,http://www.dailymotion.com/user/UnderProjectUnderProjecti  zTakes too long time)r   r   r   r   r1   r   )r   r   r   paramschannelrs   N)	rl   rm   rn   ro   r
  r)  r,  r:  rr   rs   r   r   rd  rd  G  ss     G TJ6&
 ! >.
 "% 7&
 !
	F. Lr   rd  )rC  ra   r   urllib.parser_  commonr   networking.exceptionsr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   ru   r2  rI  rR  rd  rs   r   r   <module>rn     s      	  ! -   "I= IX~
0 ~
B" < ":85 8,+g3 +g\1 r   