Ë
    ä({jò1  ã                   ó–  — d 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Zddl	m
Z
mZ dZdZdZdZdZd	Zej$                  j'                  d
d«      Zej*                  j-                  ej*                  j/                  ej*                  j1                  e«      «      d«      ZdZdedz   dœZd„ Zdd„Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  r e#«        yy)uÿ  
æ¶¡é˜³åŽ¿äººæ°‘æ”¿åºœ - ç»�æµŽå¼€å�‘åŒºç®¡å§”ä¼šä¿¡æ�¯å…¬å¼€ (www.gy.gov.cn æ³¨æ„�: gy=æ¶¡é˜³é�žå¹¿å…ƒ/è´µé˜³!)
æ �ç›®: æ”¿åºœä¿¡æ�¯å…¬å¼€ > æ¶¡é˜³åŽ¿ç»�æµŽå¼€å�‘åŒºç®¡å§”ä¼š > é‡�å¤§è¡Œæ”¿å†³ç­–é¢„å…¬å¼€
      /XxgkContent/showList/885/86558/page_1.html (86558=é‡�å¤§è¡Œæ”¿å†³ç­–é¢„å…¬å¼€, 6æ�¡)
CMS: è‡ªå»º XxgkContent ç³»ç»Ÿ
åˆ—è¡¨: /XxgkContent/showList/885/86558/page_{n}.html (å®žæµ‹ page_N å�‚æ•°æ— æ•ˆ, è¯¥é¡µæ˜¾ç¤ºå…¨éƒ¨æ�¡ç›®)
è¯¦æƒ…: /XxgkContent/show/{id}.html
      æ­£æ–‡ div#zoom (å�«å¯Œæ–‡æœ¬/è¡¨æ ¼/é™„ä»¶é“¾æŽ¥), æ ‡é¢˜ meta ArticleTitle / div.u-title, æ—¥æœŸ meta PubDate
      éƒ¨åˆ†è¯¦æƒ…ä¸ºçº¯é™„ä»¶åž‹ (æ­£æ–‡ç©º, å†…å®¹åœ¨ /upload_bz/download?siteId=5&id=... é™„ä»¶)
ç”¨æ³•: python3 crawl_gy885_zsgk.py [--pages=N | N] [--sync] [--sync-only]
é    N)ÚThreadPoolExecutorÚas_completedu4   æ¶¡é˜³å¼€å�‘åŒºç®¡å§”ä¼š-é‡�å¤§è¡Œæ”¿å†³ç­–é¢„å…¬å¼€zhttps://www.gy.gov.cnz@https://www.gy.gov.cn/XxgkContent/showList/885/86558/page_1.htmlzwww.gy.gov.cnu   å®‰å¾½z
2020-01-01ÚDB_PATHz/root/search.dbzquality_results.dbé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36ú/)z
User-AgentÚRefererc                 ó°   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       S )Nz$&middot;|&nbsp;|&#160;|\u200b|\ufeffÚ u   ^[â€¢Â·]\s*z\s+ú )ÚreÚsubÚstrip)Úts    ú%/root/gov_crawler/crawl_gy885_zsgk.pyÚclean_titler   &   sG   € Ü
�‰Ð6¸¸AºGÀÓD€AÜ
�‰ˆ~˜r 1Ó%€AÜ�6‰6�&˜#˜qÓ!×'Ñ'Ó)Ð)ó    c                 ó  — t        |«      D ]D  }	 t        j                  | t        dd¬«      }d|_        |j
                  dk(  r|j                  c S ŒF y # t        $ r'}||dz
  k  rdd l}|j                  d«       Y d }~Œsd }~ww xY w)	Né   F)ÚheadersÚtimeoutÚverifyzutf-8éÈ   é   r   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚ	ExceptionÚtimeÚsleep)ÚurlÚretriesÚiÚrÚer#   s         r   Úfetchr*   ,   s€   € Ü�7‹^ò 	ˆð	Ü—‘˜S¬'¸2ÀeÔLˆAØ ˆAŒJØ�}‰} Ò#Ø—v‘v’ð $ð		ð øô	 ò 	Ø�7˜Q‘;ŠÛØ—
‘
˜1”ÿøð	ús   �>AÁ	BÁA?Á?Bc                 óf  — g }| s|S t        j                  d| t         j                  «      D ]‚  }|j                  d«      |j                  d«      |j                  d«      |j                  d«      j	                  «       f\  }}}}t        |«      }|sŒf|j                  |t        |z   ||dœ«       Œ„ |S )u)   æ��å�–åˆ—è¡¨ li > a(title) + span(æ—¥æœŸ)za<a href="(/XxgkContent/show/(\d+)\.html)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span>([^<]*)</span>r   r   é   é   )Útitler%   Úpub_dateÚid)r   ÚfinditerÚDOTALLÚgroupr   r   ÚappendÚBASE_URL)Ú	html_textÚitemsÚmÚhrefÚiidr.   Údates          r   Úextract_list_itemsr<   :   s­   € à€EÙØˆÜ�[‰[ØlØ”2—9‘9óò ˆð "#§¡¨£¨Q¯W©W°Q«Z¸¿¹À»ÀQÇWÁWÈQÃZ×EUÑEUÓEWÐ!WÑˆˆc�5˜$Ü˜EÓ"ˆÙØØ�‰ØÜ˜d‘?ØØñ	
õ 	ðð €Lr   c           	      óÂ	  ‡‡— t        | «      }|sy d}t        j                  d|«      }|rt        |j	                  d«      «      }|sVt        j                  d|t        j
                  «      }|r/t        t        j                  dd|j	                  d«      «      «      }|sdt        j                  d|t        j
                  «      }|r=t        t        j                  dd|j	                  d«      j                  «       «      «      }d}t        j                  d|«      }|r"|j	                  d«      j                  «       d d	 }|s_t        j                  d
|t        j
                  «      }|r8t        j                  d|j	                  d«      «      }|r|j	                  d«      }dŠt        j                  d|t        j
                  «      }|r|j	                  d«      Šn8t        j                  d|t        j
                  «      }|r|j	                  d«      Št        j                  dd‰t        j                  t        j                  z  ¬«      Št        j                  dd‰t        j                  t        j                  z  ¬«      Šg }t        j                  d‰«      D �]  }|j	                  d«      j                  «       t        |j	                  d«      «      }}|j                  «       }	t        j                  d|	t        j                  «      s	d|v sd|	v sŒ{|j                  d«      r|n1|j                  d«      r|nt        |j                  d«      r|nd|z   z   Št        ˆfd„|D «       «      rŒÕ|j                  |xs& |j!                  d«      d   j!                  d«      d   ‰dœ«       �Œ d„ }
t        j                  d|
‰«      Št        j                  d |
‰«      Št        j                  d!d"‰«      Št        j                  d#d‰«      Št        j                  d$d‰t        j                  t        j                  z  ¬«      Š|rDt        ˆfd%„|D «       «      }|s.dj#                  d&„ |D «       «      }‰j%                  «       d'z   |z   Št'        t        j                  dd‰«      j                  «       «      }d(‰v }d)‰v xs d*‰v }|d+k  r|s|s	|s|d|g d,œS |‰||d,œS )-Nr
   z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   z5<div[^>]*class="text-center u-title"[^>]*>(.*?)</div>ú<[^>]+>z<title>(.*?)</title>u   -\s*æ¶¡é˜³åŽ¿äººæ°‘æ”¿åºœ\s*$z*<meta\s+name="PubDate"\s+content="([^"]*)"é
   z2<div[^>]*class="[^"]*u-desc[^"]*"[^>]*>(.*?)</div>z(\d{4})-(\d{2})-(\d{2})r   z,<div[^>]*id="zoom"[^>]*>(.*?)</div>\s*</div>z<div[^>]*id="zoom"[^>]*>(.*)z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z,<a[^>]*href="([^"]+)"[^>]*>([^<]{0,120})</a>r   z8\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|et|dps|jpg|png)$z/upload_bz/z	/downloadÚhttpú//r   c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w©r%   N© )Ú.0ÚaÚabs_urls     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>   s   øè ø€ Ò9¨q�q˜‘x 7Õ*Ñ9ùs   ƒéÿÿÿÿú?)Únamer%   c                 óÄ  — | j                  d«      j                  «       }|j                  d«      s"|j                  d«      s|j                  d«      r| j                  d«      S |j                  d«      r$| j                  d«      j                  |d|z   «      S | j                  d«      j                  ||j                  d«      rt        |z   «      S t        dz   |z   «      S )	Nr   rA   Ú
javascriptú#r   rB   zhttps:r   )r3   r   Ú
startswithÚreplacer5   )r8   r9   s     r   Úabs_linkzparse_detail.<locals>.abs_linkƒ   s³   € Ø�w‰w�q‹z×ÑÓ!ˆØ�?‰?˜6Ô" d§o¡o°lÔ&CÀtÇÁÐWZÔG[Ø—7‘7˜1“:ÐØ�?‰?˜4Ô Ø—7‘7˜1“:×%Ñ% d¨H°t©OÓ<Ð<Ø�w‰w�q‹z×!Ñ! $¸4¿?¹?È3Ô;O¬°4©ÓkÐkÔU]Ð`cÑUcÐfjÑUjÓkÐkr   zhref="([^"]+)"zsrc="([^"]+)"z<p[^>]*>z<p>z
<p>\s*</p>zU<div[^>]*class="[^"]*(share|ewm|qrcode|print|bshare|weixin-text)[^"]*"[^>]*>.*?</div>c              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­wrD   rE   )rF   rG   Ú	body_htmls     €r   rI   zparse_detail.<locals>.<genexpr>”   s   øè ø€ Ò:°�a˜‘h )Ô+Ñ:ùs   ƒc              3   ó`   K  — | ]&  }d |d   › dt        j                  |d   «      › d�–— Œ( y­w)z<p><a href="r%   z">rL   z</a></p>N)Úhtml_modÚescape)rF   rG   s     r   rI   zparse_detail.<locals>.<genexpr>–   s3   è ø€ ÒmÐcd ¨a°©h¨Z°r¼(¿/¹/È!ÈFÉ)Ó:TÐ9UÐU]Ô^Ñmùs   ‚,.ú
z<imgz<iframeÚvideoé   ©r.   Úcontentr/   Úattachments)r*   r   Úsearchr   r3   r2   r   r   ÚSÚIr1   ÚlowerrP   r5   Úanyr4   ÚsplitÚjoinÚrstripÚlen)r%   r6   r.   r8   r/   ÚdÚattsr9   rL   ÚlowrR   Úhas_attÚatt_htmlÚtext_lenÚhas_imgÚ	has_videorH   rT   s                   @@r   Úparse_detailro   O   sT  ù€ Ü�c“
€IÙØà€EÜ
�	‰	ÐDÀiÓP€AÙÜ˜AŸG™G A›JÓ'ˆÙÜ�I‰IÐNÐPYÔ[]×[dÑ[dÓeˆÙÜ¤§¡ z°2°q·w±w¸q³zÓ BÓCˆEÙÜ�I‰IÐ-¨y¼"¿)¹)ÓDˆÙÜ¤§¡Ð'GÈÈQÏWÉWÐUVËZ×M]ÑM]ÓM_Ó `ÓaˆEà€HÜ
�	‰	Ð?ÀÓK€AÙØ—7‘7˜1“:×#Ñ#Ó% c rÐ*ˆÙÜ�I‰IÐKÈYÔXZ×XaÑXaÓbˆÙÜ—	‘	Ð4°a·g±g¸a³jÓAˆAÙØŸ7™7 1›:�à€IÜ
�	‰	ÐAÀ9ÌbÏiÉiÓX€AÙØ—G‘G˜A“J‰	ä�I‰IÐ5°yÄ"Ç)Á)ÓLˆÙØŸ™ ›
ˆIä—‘Ð3°R¸Ì"Ï$É$ÔQS×QUÑQUÉ+ÔV€IÜ—‘Ð1°2°yÌÏÉÌrÏtÉtÉÔT€Ið €DÜ�[‰[ÐHÈ)ÓTó aˆØ—W‘W˜Q“Z×%Ñ%Ó'¬°Q·W±W¸Q³ZÓ)@ˆdˆØ�j‰j‹lˆÜ�9‰9ÐPÐRUÔWY×W[ÑW[Ô\Ð`mÐquÑ`uð  zEð  ILò  zLØ"Ÿo™o¨fÔ5‘dÀDÇOÁOÐTXÔDY¹DÔ_gÐsw÷  tCñ  tCð  DGô  tHÑkoð  NQð  TXñ  NXñ  `YˆGÜÓ9°DÔ9Õ9Ø—‘ TÒ%N¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NÐW^Ñ_Ö`ðaòlô —‘Ð(¨(°IÓ>€IÜ—‘Ð'¨°9Ó=€IÜ—‘�{ E¨9Ó5€IÜ—‘�} b¨)Ó4€Iô —‘ÐoÐqsÐu~ô  GI÷  GKñ  GKô  NP÷  NRñ  NRñ  GRô  S€IáÜÓ:°TÔ:Ó:ˆÙØ—w‘wÑmÐhlÔmÓmˆHØ!×(Ñ(Ó*¨TÑ1°HÑ<ˆIä”2—6‘6˜* b¨)Ó4×:Ñ:Ó<Ó=€HØ˜	Ð!€GØ˜YÐ&Ò>¨'°YÐ*>€IØ�!‚|™G©I¹dØ¨2¸8ÐTVÑWÐWØ y¸hÐW[Ñ\Ð\r   c                 ó0  — t        j                  t        «      }|j                  d«       |j	                  «       }|j                  d«       d}| D ]Î  }	 |j                  d|j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      f
«       ||j                  z  }ŒÐ |j                  «        |j                  «        t        d|› dt        | «      |z
  › �«       |S # t        $ r,}t        d|j                  dd«      › d|› �«       Y d }~�Œ@d }~ww xY w)NúPRAGMA busy_timeout=300000aî  CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_id INTEGER DEFAULT 0,
        title TEXT, url TEXT, content TEXT,
        publish_date TEXT, summary TEXT,
        domain TEXT, category TEXT DEFAULT '',
        content_hash TEXT, crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        industry TEXT DEFAULT '', group_name TEXT DEFAULT '',
        script_name TEXT DEFAULT '', attachments TEXT DEFAULT '[]',
        UNIQUE(domain, url)
    )r   z¥INSERT OR IGNORE INTO crawl_results (domain, title, url, content, publish_date, summary, industry, group_name, script_name, attachments) VALUES (?,?,?,?,?,?,?,?,?,?)Údomainr
   r.   r%   r\   r/   ÚsummaryÚindustryÚ
group_nameÚscript_namer]   ú[]z  [push] ERR ú: z[push_local] new=z skip=)Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚcursorr   Úrowcountr"   ÚprintÚcommitÚcloserf   )Úrecordsrv   ÚconnÚcurÚn_newr(   r)   s          r   Ú
push_localr†   ¡   sp  € Ü�?‰?œ:Ó&€DØ‡L�LÐ-Ô.Ø
�+‰+‹-€CØ‡K�Kð 
	ô 

ð €EØò :ˆð
	:Ø�K‰Kð xØ—‘�x Ó$ a§e¡e¨G°RÓ&8¸!¿%¹%ÀÀrÓ:JØ—‘�y "Ó% q§u¡u¨Z¸Ó'<¸a¿e¹eÀIÈrÓ>RØ—‘�z 2Ó&¨¯©¨l¸BÓ(?Ø—‘�} bÓ)¨1¯5©5°ÀÓ+EðGôð �S—\‘\Ñ!‰Eð:ð 	‡K�K„MØ‡J�J„LÜ	Ð˜e˜W F¬3¨w«<¸Ñ+=Ð*>Ð
?Ô@Ø€Løô ò 	:Ü�M !§%¡%¨¨b£/Ð!2°"°Q°CÐ8×9Ò9ûð	:ús   ÁCE Å 	FÅ)!FÆFc                  ó¼  — 	 t        j                  t        «      } | j                  d«       | j                  dt        f«      j                  «       }| j                  «        |st        d«       y t        j                  t        d¬«      }|j                  d«       |j                  d«       dx}}	 |D ]Â  }|\	  }}}	}
}}}}}|j                  d	|f«      }|j                  «       }	 |rF|j                  d
||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs d|d   f	«       |dz  }nH|j                  d|||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs dt        |f«       |dz  }ŒÄ |j                  «        |j                  dt        f«       |j                  «        |j                  dt        f«      j                  «       d   }|j                  «        t        d|› d|› d|› d�«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w# t        $ r}t        d|› d|› �«       Y d }~�ŒŽd }~ww xY w# |j                  «        w xY w)Nrq   z�SELECT title, url, content, publish_date, summary, industry, group_name, script_name, attachments FROM crawl_results WHERE domain=? ORDER BY idz[sync] local read ERR: u   [sync] æœ¬åœ°æ²¡æœ‰æ•°æ�®i,  )r   zPRAGMA journal_mode=WALr   z'SELECT id FROM gov_raw WHERE page_url=?zƒUPDATE gov_raw SET title=?, content=?, publish_date=?, summary=?, industry=?, group_name=?, script_name=?, attachments=? WHERE id=?r
   i ¡ rw   r   z«INSERT INTO gov_raw (title, page_url, content, publish_date, summary, industry, group_name, script_name, attachments, site_name, source_url) VALUES (?,?,?,?,?,?,?,?,?,?,?)z  [sync] ERR rx   z±INSERT INTO gov_search(rowid,title,site_name,summary) SELECT r.id,r.title,r.site_name,r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z[sync] OK updated=z
 inserted=u    DBå…±u   æ�¡)ry   rz   r{   r|   ÚDOMAINÚfetchallr�   r"   r   r   ÚfetchoneÚ	SITE_NAMEr€   )rƒ   Úrowsr)   ÚdstÚupdÚinsr(   r.   r%   r\   r/   rs   ÚindÚgrpÚsnÚattr„   ÚrowÚtotals                      r   Úsync_to_serverr–   Ã   s‘  € ð
Ü�‰œzÓ*ˆØ�‰Ð1Ô2Ø�|‰|ð ^ÜˆIó
÷ ‰(‹*ð 	ð 	�
‰
Œñ ÜÐ)Ô*ØÜ
�/‰/œ'¨3Ô
/€CØ‡K�KÐ)Ô*Ø‡K�KÐ,Ô-Ø€M€Cˆ#ðØò 	2ˆAØHIÑEˆE�3˜ ¨7°C¸¸bÀ#Ø—+‘+ÐGÈ#ÈÓPˆCØ—,‘,“.ˆCð2ÙØ—K‘Kð ^Ø ¢¨B°°Ð 8¸(º.ÀbÈ7Ê=ÐVXÐZ^Ð[^ÐJ_Øš  C¢I¨2¨rªx°R¸ºÀÀcÈ!ÁfðNôOð ˜1‘H‘Cà—K‘Kð FØ  g¢m°°W°fÐ%=¸xº~È2ÐPWÒP]Ð[]Ð_cÐ`cÐOdØš  C¢I¨2¨rªx°R¸ºÀÄiÐQTðVôWð ˜1‘H�Cøð!	2ð& 	�
‰
ŒØ�‰ðQô ˆLô		ð
 	�
‰
ŒØ—‘ÐLÌyÈlÓ[×dÑdÓfÐghÑiˆà�	‰	ŒÜ	Ð˜s˜e :¨c¨U°&¸¸¸sÐ
CÕDøôQ ò ÜÐ'¨ sÐ+Ô,Üûðûô8 ò 2Ü˜ c U¨"¨Q¨CÐ0×1Ò1ûð2ûð 	�	‰	�úsP   ‚AG= Â14I	 Ã&BH!Å6A!I	 Ç=	HÈHÈHÈ!	IÈ*IÈ;I	 ÉIÉI	 É	Ic                  ó  — dt         j                  v } d }dt         j                  v }t         j                  dd  D ]O  }|j                  d«      r 	 t        |j	                  dd«      d   «      }Œ4|j                  «       sŒEt        |«      }ŒQ t        d|› d| › �«       | rt        «        y t        t        «      }|st        d«       y t        |«      }t        d	t        |«      › d
�«       |sy g }t        t        ¬«      5 }|D �ci c]  }|j                  t         |d   «      |“Œ }	}d}
t#        |	«      D �]>  }|	|   }|j%                  «       }|
dz  }
|
dz  dk(  rt        d|
› dt        |«      › d�d¬«       |€!t        d|d   d d › �«       |d   d|d   g dœ}|d   r'|d   t&        k  rt        d|d   › d|d   d d › �«       Œ’t(        t*        |d   xs |d   |d   |d   |d   xs |d   t-        j.                  dd|d   «      d d dt0        t2        j4                  j7                  t         j                  d   «      |d   rt9        j:                  |d   d ¬!«      nd"d#œ}|j=                  |«       �ŒA 	 d d d «       t        d$t        |«      › �«       |rHt?        |t2        j4                  j7                  t         j                  d   «      «       |rt        «        y y y # t
        $ r Y �Œ³w xY wc c}w # 1 sw Y   Œ€xY w)%Nz--sync-onlyz--syncr   z--pages=ú=z[GY885] max_pages=z sync_only=u   [list] æ— æ³•èŽ·å�–åˆ—è¡¨é¡µu   [list] åˆ—è¡¨å…± u    æ�¡)Úmax_workersr%   r   é   u	     è¯¦æƒ… r   z...T)Úflushz	  [fail] r.   é(   r
   r/   r[   z  [cutoff] r   r\   r>   r   r]   F)Úensure_asciirw   )rr   Ú	site_namer.   r%   r\   r/   rs   rt   ru   rv   r]   z[total] valid=) ÚsysÚargvrP   Úintrc   Ú
ValueErrorÚisdigitr   r–   r*   ÚLIST_URLr<   rf   r   ÚMAX_WORKERSÚsubmitro   r   ÚresultÚCUTOFFrˆ   r‹   r   r   ÚGROUPÚosÚpathÚbasenameÚjsonÚdumpsr4   r†   )Ú	sync_onlyÚ	max_pagesÚdo_syncrG   r6   r7   ÚvalidÚexecutorÚitÚfut_mapÚdoneÚfutÚdetÚrecs                 r   Úmainrº   ÷   s  € Ø¤§¡Ð)€IØ€IØœ#Ÿ(™(Ð"€GÜ�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#ðÜ §¡¨¨Q£°Ñ 2Ó3‘	ð �Y‰Y�[Ü˜A›‰Iðô 
Ð˜y˜k¨°Y°KÐ
@ÔAÙÜÔØô ”h“€IÙÜÐ,Ô-ØÜ˜yÓ)€EÜ	Ðœc %›j˜\¨Ð
.Ô/ÙØà€EÜ	¬Ô	4ð ¸ØJOÖPÀB�8—?‘?¤<°°E±Ó;¸RÑ?ÐPˆÐPØˆÜ Ó(ó 	ˆCØ˜‘ˆBØ—*‘*“,ˆCØ�A‰IˆDØ�b‰y˜AŠ~Ü˜	 $  q¬¨U«¨°CÐ8ÀÕEØˆ{Ü˜	 " W¡+¨c¨rÐ"2Ð!3Ð4Ô5Ø " 7¡¸ÈÈ:ÉÐgiÑj�Ø�:Š 3 z¡?´VÒ#;Ü˜ C¨
¡OÐ#4°A°c¸'±lÀ3ÀBÐ6GÐ5HÐIÔJØä Ü&Ø˜W™Ò4¨¨G©Ø˜%‘yØ˜y™>Ø 
™OÒ=¨r°*©~ÜŸ6™6 *¨b°#°i±.ÓAÀ$À3ÐGØÜ#Ü!Ÿw™w×/Ñ/´·±¸±Ó<ØUXÐYfÒUgœtŸz™z¨#¨mÑ*<È5ÕQÐmqñˆCð �L‰L˜Öñ3	÷ô: 
ˆNœ3˜u›:˜,Ð
'Ô(ÙÜ�5œ"Ÿ'™'×*Ñ*¬3¯8©8°A©;Ó7Ô8ÙÜÕð ð øôe ò Úðüò* Q÷ð ús1   ÁK!Ã?K6Ä!K1Ä%EK6Ë!	K.Ë-K.Ë1K6Ë6K?Ú__main__)r,   )%Ú__doc__r   rŸ   rª   r­   ÚhtmlrV   r   ry   Úconcurrent.futuresr   r   r‹   r5   r¤   rˆ   r©   r¨   Úenvironr   r   r«   rd   ÚdirnameÚabspathÚ__file__r{   r¥   r   r   r*   r<   ro   r†   r–   rº   Ú__name__rE   r   r   ú<module>rÄ      sÝ   ðñ
ó 
Û 
Û 	Û Û Û Û ß ?àB€	Ø"€ØM€Ø	€Ø€Ø	€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø�W‰W�\‰\˜"Ÿ'™'Ÿ/™/¨"¯'©'¯/©/¸(Ó*CÓDÐFZÓ[€
Ø€ð DØ˜#‰~ñ€ò*óòò*O]òdòD1Eòh=ð@ ˆzÒÙ…Fð r   