django-uwsgi-0.1.3/0000775000175000017500000000000012516642453016055 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/setup.py0000775000175000017500000000322212516641220017560 0ustar mechanismmechanism00000000000000import os try: from setuptools import setup, find_packages except ImportError: from distutils.core import setup from django_uwsgi import __version__ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-uwsgi', version=__version__, description='uWSGI stuff for Django projects', long_description=open('README.rst').read(), url='http://github.com/unbit/django-uwsgi', author='Eugene MechanisM', author_email='eugene@mechanism.name', license='MIT', zip_safe=False, classifiers=[ 'Development Status :: 4 - Beta', 'Framework :: Django', 'Intended Audience :: Developers', 'Intended Audience :: System Administrators', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.4', 'Topic :: Software Development :: Libraries :: Python Modules', 'Topic :: Internet :: WWW/HTTP :: WSGI', 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Software Development :: Build Tools", "Topic :: Software Development :: Code Generators", 'Topic :: Communications :: Email', 'Framework :: Django', ], keywords='uwsgi, django, mail, cache, template', packages=find_packages(), include_package_data=True, install_requires=[], extras_require={ 'uwsgi': ['uwsgi'], }, ) django-uwsgi-0.1.3/README.rst0000775000175000017500000000145612516642110017543 0ustar mechanismmechanism00000000000000django-uwsgi ~~~~~~~~~~~~ Django related examples/tricks/modules for uWSGI Screenshots ~~~~~~~~~~~ `django-debug-toolbar `_ panel .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot1.png `Wagtail `_ admin interface: .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot2.png .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot3.png Documentation ~~~~~~~~~~~~~ `Read the documentation at rtfd.org `_ Contributors ~~~~~~~~~~~~ See `CONTRIBUTORS `_ License ~~~~~~~ `MIT `_ django-uwsgi-0.1.3/LICENSE0000775000175000017500000000206012516641220017052 0ustar mechanismmechanism00000000000000The MIT License (MIT) Copyright (c) 2014 unbit Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. django-uwsgi-0.1.3/docs/0000775000175000017500000000000012516642453017005 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/docs/requirements-docs.txt0000775000175000017500000000004112516641220023204 0ustar mechanismmechanism00000000000000sphinx releases sphinx_rtd_theme django-uwsgi-0.1.3/docs/cache.rst0000664000175000017500000000116312516641220020572 0ustar mechanismmechanism00000000000000Cache Backend ============= Installation ------------ change settings to: .. code-block:: py CACHES = { 'default': { 'BACKEND': 'django_uwsgi.cache.UwsgiCache', # and optionally, if you use a different cache name 'LOCATION': 'foobar' } } Settings -------- ``UWSGI_CACHE_FALLBACK`` - ``False`` - raises Exception if ``uwsgi`` cannot be imported. - ``True`` (default) - if uwsgi is not importable this cache backend will alias to LocMemCache. Note that south or other mangement commands might try to load the cache backend so this is why it's the default.django-uwsgi-0.1.3/docs/todo.rst0000775000175000017500000000075112516641220020501 0ustar mechanismmechanism00000000000000Todo ==== * Tests * uWSGI config generator * Improve `Docs `_ * Translations? Some code is borrowed from projects I did earlier and some code is still not added yet, but does exists in my projects. .. _PostgreSQL: http://uwsgi-docs.readthedocs.org/en/latest/ImperialMonitors.html#pg-scan-a-postgresql-table-for-configuration .. _MongoDB: http://uwsgi-docs.readthedocs.org/en/latest/ImperialMonitors.html#mongodb-scan-mongodb-collections-for-configuration django-uwsgi-0.1.3/docs/changelog.rst0000775000175000017500000000015112516641220021455 0ustar mechanismmechanism00000000000000:orphan: ========= Changelog ========= * :release:`0.1.1 <2015-04-22>` * :release:`0.1.0 <2014-04-10>`django-uwsgi-0.1.3/docs/features.rst0000775000175000017500000000151612516641220021352 0ustar mechanismmechanism00000000000000Features ======== * Admin page with `uWSGI`_ stats (options to reload/stop uWSGI, clear uWSGI cache) * uWSGI :doc:`cache` for Django * uWSGI :doc:`email` for Django(send emails via uWSGI's `spooler`_) * Debug Panel for `django-debug-toolbar`_ (offers same functions as admin page) * Django template loader for `embedded`_ into uWSGI files * Django :doc:`command` ``runuwsgi`` (with live autoreload when DEBUG is True) * uWSGI config generator * Django CBV Mixins based on uWSGI decorators Some features are not added into repo or not yet implemented(See :doc:`todo`) .. _uWSGI: http://uwsgi-docs.readthedocs.org/en/latest/ .. _django-debug-toolbar: http://django-debug-toolbar.readthedocs.org/en/latest/ .. _spooler: http://uwsgi-docs.readthedocs.org/en/latest/Spooler.html .. _embedded: http://uwsgi-docs.readthedocs.org/en/latest/Embed.htmldjango-uwsgi-0.1.3/docs/conf.py0000775000175000017500000000254612516641220020305 0ustar mechanismmechanism00000000000000# -*- coding: utf-8 -*- import sys import os on_rtd = os.environ.get('READTHEDOCS', None) == 'True' if not on_rtd: import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] sys.path.insert(0, os.path.abspath('..')) from django_uwsgi import __version__ extensions = [ 'sphinx.ext.intersphinx', 'releases', ] releases_issue_uri = "https://github.com/unbit/django-uwsgi/issues/%s" releases_release_uri = "https://github.com/unbit/django-uwsgi/tree/%s" templates_path = ['_templates'] source_suffix = '.rst' master_doc = 'index' project = u'django-uwsgi' copyright = u'2014, Eugene MechanisM' version = __version__ release = __version__ exclude_patterns = ['_build'] pygments_style = 'sphinx' html_static_path = ['_static'] htmlhelp_basename = 'django-uwsgidoc' latex_elements = { } latex_documents = [ ('index', 'django-uwsgi.tex', u'django-uwsgi Documentation', u'Eugene MechanisM', 'manual'), ] man_pages = [ ('index', 'django-uwsgi', u'django-uwsgi Documentation', [u'Eugene MechanisM'], 1) ] texinfo_documents = [ ('index', 'django-uwsgi', u'django-uwsgi Documentation', u'Eugene MechanisM', 'django-uwsgi', 'One line description of project.', 'Miscellaneous'), ] intersphinx_mapping = {'uwsgi': ('http://uwsgi-docs.readthedocs.org/en/latest/', None)} django-uwsgi-0.1.3/docs/integrations.rst0000664000175000017500000000122712516641220022236 0ustar mechanismmechanism00000000000000Integrations ============ Django-Debug-Toolbar -------------------- If you're using `django-debug-toolbar`_, you can add: .. code-block:: py DEBUG_TOOLBAR_PANELS += ('django_uwsgi.panels.UwsgiPanel',) .. _django-debug-toolbar: http://django-debug-toolbar.readthedocs.org/en/latest/ .. image:: screenshots/screenshot1.png Wagtail ------- If you're using `Wagtail`_: There is `wagtail_hooks.py` file available and `Wagtail`_ will read it automatically And you don't have to add `django_uwsgi` into urls.py `Wagtail`_ admin interface: .. image:: screenshots/screenshot2.png .. image:: screenshots/screenshot3.png .. _Wagtail: http://wagtail.iodjango-uwsgi-0.1.3/docs/screenshots/0000775000175000017500000000000012516642453021345 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/docs/screenshots/screenshot3.png0000664000175000017500000014423212516641220024310 0ustar mechanismmechanism00000000000000PNG  IHDRMՕzTXtRaw profile type exifxU 0 C"#gHtPڴ @hۂIu yT( 9k+n*%C]1pc..SfTZ5'I K,! iTXtXML:com.adobe.xmp ?P sBITO IDATx}tT?Of=OٓyȐL!b"B(zkAzPU{lxZo{{sp;H`%( Ab3B&L13O{@L&Ʉ$KfL}[bd P$I tBeAP&E !IYD2L49`%)_@|@@|@|@@|@|+㸬k4<(E0]T*VU(P(?Jh4p8`=`:>H Ny^PNc&=T*"7,*6@xW*tT/}B|FX} gDwaFc^^^2},CL@{>4F|={(&  ?[LON,G]T&W "Ir2c*~*{P(DF?`(,, sJJ?%ɲ<]iڌ0FeYfYVզEՆa> _nPWqA'x"۷60 1~Boq˲ a$D|<:nxB~Z0,ˉDB; _:vsX>D?1`5C+Yf$its (///}X,Kr%$ٳY{ 뮻,tuu W<쳂 >|e8'5.4{d2O9r|aeeec'?<;+ʡ yyy "c;N0K⍵e+k4zw 4(Y"Lt:ZP(t:F%Ȯ `0(Ja?C5S&?ic?Ow}w.;ټysII s6(((H jyO& BՎ5M Tv'3@ΟqPh}nm~t9ǹ?׭[xU*d2f,t:XPPY^^^OFx<}>eGG}ӫdYE1 aL#f(gf]5O8/֭G>ܹsܒ WFK?=縓LM%IE1GQR9J%˲t:_FCP,Eq.H$7Ȩl~>R)X17le&Mo_, "J`Y(3V{&|y2LgUj3SPTXlp8\PP0OR9VGѫo]=GN,C]M]=yp M?~|ꆾ}3ɚsg?=T_`TQXS,.!w7sƥߺDbӱ?ȡUQ/w&5:f$[TWl4^YAksI˥o_[PPƛowC#:.H`޵+%Lބ>C.ñ,Z,vͥhZYY9\Z9IϞ(rc\f9+EyQp ,lug{gz>X1JJISq叔b|ˠ+*q2K>9VbqլWSEu+Q_b_)9Xk4o_7= r?NUVMn, D+%  +P(N^2kj5r嗯^mќϚ.mGΟ$ߞ3v_f]W0fu T_WXGJ7E+,f_|;4}ĠmQ~O+)}qzmvؼYjm2F6G[ҚFs_dkй6O-_/?qP)2@ %Ii̿w?!BpK_)drpppvD2J=?5#cL]g2M3| NWXơ֗n봓9trq8՗݀R،}>ks #7\ HOٻf$b9I`7 "7.=? W9pY羷㧻@ԿdYp*x< |>z~hhhK&I' z`*.,^ؐM(jb%LqSFci96w/*W]eZϓiΒjm:ث)P}o~)(v{FU|ӎ?p]cXk knns_>"ɲHDh4jǚ?>EQT*MP(Ւ/P~~~~6***sÃz}KXTdHM;{XE6  `g\׍-ظ%j-$!qS+ y6ZIDT×hCoR_h{Eq-"}A_c;Pm~-?DDki% RhVVpoYQ>uJ/o1fPw}vcW5Vwݢ%:vYbD(Tmh4jyH=SHoy`QUcK]2_{gKЬa[VFwﳶ\,Fc馲5gV}!Kw˙2KoUlF1{~XH."#И7EWrvڥx[ؕI+Ooߞ3/(ݾrӐ}AOSw.ĽQuqer2tI\_UUL7,|+629z0ZUe7\weOW_3_fN.d%KYZwc՗Un[çGt~S\yQ֚bl{#[Fn *k\ {aAV%*`G^j;Q[lL3ϰ%һeU>nK*]}Q٦ŷl*y棓Nj RgwSEu+.=:f*K%.?Sx#yuˎoO/zT3 :ӎQ(ᰵ7Er̼聓m#*r˼N볝ؕ=g<-׎ YiyZȿNO~QzFi("J 6w"'^5ɹuGP:kd YޚmwFE$NoؑtN&[3$ηKm ;S9jĈ}t!JAc 7O Dv;KO%@,6gt5N"m"{q%hNPZφkNK$>3A9"9[Bb}ݢ.++ˣ}{K?NWo[VuyN׮l6W> 9xX>G~"~oh=`ĉ|B8kM p _NRˉVw8HDj钿X}#O>{)qwx]wg}kqQ&YLHBF dҫ/luXMrH`2'm1.F,7v_zͫ8 sCY˓r~![aBdRrd܄v~pWX1wK-֖!g[u'ޒQ}aL4- dZ:摟yh{jMO߳ȸ׿2}\gZ ~xqKrN8Cr^,D|5)5:qWc8G*.}gxg`ԘkY/7Znk*+=m[t<*^6z f`Տpv|SE1 "7.~~1^;qfւ*jD33kZ(teMV.1wo}z'J3y7E&3QpsV-̜9+iӦD2ٹ ̵ O9qY&R#6D(Qʼn3NccdxVʚw=I%;e3*֢RŪwCdH yL(t9ɖYnyluV'Z3'akxUЯ7r>+cPFju"Ab.ȞȮ\qw4cJSzNturoc#.ߟ Nel{9i\:ow rcR~Ww[+O 35ESX^ՠq4ް$I3EQĺzM$˲(JV[Ƒ D - p3uɤ׎}EQErujw=Dru'/NEueM5vٲu+`Mr:~?81i%$mQu)(YS5C# P( h4*X;??qX,H$"B Hbj(غX>o&:wEeQւ|_qdktǵ (^c,aVnhHmBD=z yTҺM.db,{UVT_޺ኬőyJ}R>wXem[Jaof(D|&eURn/6w>GYn̏:?O-+nZ7Šm_i)/'ߛΩ]sEt$za@ΟfΝ :S*{ Q_TJX @ Uņoxej`P ~Q5k4KŸY6-IGOjM\?ŠQ&].+Vѭ@Qv2> IDAT5.{tzdVb+KLawHE6ʨaq^U.XYkTFʨRY7d:E>걫K^,S[:}q Rg"oG vcWW'9.Lb1;-2 6 wϜMƩ? BQPP"bI>LjZFz  oP(t:]^^FQTځ^ quuw,^¼^pԛ#g><'7ܶ<"1--47i>y'vNؿuV=ְByaq|pqBIͫu㺾s]^(+9]t}^y棎0 -_/ꎦ`8MKlw='NsXW7;-O$8V__T`w8rX9~溧o+b7{]&PۭͿ^JyjWG}/Ɔ:aGk4a鷯e}X+&ƉE`Sg/tZ /UZޗy¿UU/~UΗζLjumԬt>]u%#kW\/|K3+|AOS靽1?= yO%V}mK Rju1W~;V_Gү4r_XUf u &DJN[e.j-qgW# _Ν;7m gٲ{fh45秢RRZXLR,!kլkO9QXYWyӵ+tڟ+T*Մ!?jFh4Jr>,k?|FjGT\ آ*t>GaHgZ,Ako֭;|X^,;,zS0N7b!T_>zx?lie a'@Ο4~z6d 2r8zjh4F"\ RXqjI)۰Prexw tEEg})aО?KL:˲~%ls 쓙*\uھh|Y*o_if|qfkjwB`kJ0 0 "˲ Ry~~~~>%D"q#.EBzq6ٚAGL Җ JK\gOYѱ9rӛ|u֍`-5K$`0XPP0L ,RƯE1f/Dѱ&O&!x(*((HSP+D"s}=*OYWSRxʂ/ziBq$In{wرc qKD" ꋢ d<Fq?44oju>#FG.𫲭?Q0~z؊KΝe˖3_aaXd2$IJd2y4fKTF@"H ǚx]2jsi,zӵ7>lIwS,~B1z'fmϟ};v63\|u\B>e휟L&"\Wg{~('O֎;~ߏ1 SVVi+ӟ?6S* "5PRRbX<ϧOʹoƖz{{e?;vll`M0I$bT|yyyH$Ǘ $w;vLqaaaEE!HQչo9{sbΎx@nmO"wpI[θwVYg:du$n~ec_EU^Ç>o,ݺ* >zڕ3IK{e***\GȇtJryd2///ߌs\o6[Φ'`UV33OZ)\RZVm[/^(EuE; _6n{n~\^0LEE`CD"$IaF-**fyz]n Ŗ:"WH%z|UIceƊF5m@ꙇo}*l6g?ވP_}uu5B>~p}(JcX4%D"!B ^+Ax_YOfrkJ]]꒺*_ZŬ=L<| i\Sh+VֵvV?iIO{Htlj),E?xk*~F=Y=ml⹡A{H&KEIA'KY*Xl#_\\0p8F=А(WC3}D)IQf('W^:kI|0BD]mkꁢ\԰hQC>>sB{_wRS'=7kwņynmKÙh!qr`_tSyFc[7Ay9mĽ39ҦS*& Nqa%%%c0Z"k)ѧYVϽ7V(j痹 xgWBjwd֕875h󗞡{so0#(D "vRSє\CE_j9_ :ۢj@wۑDp+/{JsEC~-}3+т ZFaY\rW*Aӡ`U-~W^K>=A9?lJxNA 舎1%?Zb%\ 0JdWy>UGz@mʵW([(G!/Ͼ1֓A "Co,"(ODDF߂qڥ2{Pқ^c # Qmjw1\uWq+̐)QhC=[ʫD3GN4t1O[ʋlVnVwDgn[ks@ފ+7#IӧsR\d 񥧸Pc}RWϛ00k\U0*Inw#sUFcFj?bi ?we||@ΟbMDѨ08 Eiэ?Wn,rG7c>fvo1A| "Cwn\~< zN{CGr.;WZ(]p{~(N@D;ͼkϪIEGxM'U_s(]݁hzoof3.*jMFK""갶E|* ^| ֮V. ψ à>]hƨhغm !~m Q]C9ڟ[Y#Q}p]xZ2}di"}'qO'u@[n[[7Oswx0`^~綍KtQp[-\,@'1!Rs#ᮍd{̻hǯ#.$IyUk$I"vŕuOoVZyooyH]{Û->ɰ|ʬ#@obuj  .43 hZRj:[><)Wj\=kYzīo鑈\ e$$IJDd?Hz"\NmnM#%R[zsPט)A̋(u cf* Jzu򵷮Y_^!lQG_DSbgғ}hX%"1 d%"Zo>\hFcnܶ7iD_ǩ}r>LZ A}|@|@@|@|@@|@||?> ۋBs>B!U@ӡVW"&L&S( sАBr>DH7F’|*#q~sJj$ݾIm{kahlDl3~s:RC1Lx<>5sZ$SST 3γ,''cZ:'?k㕐'NE3Gl߹U&%{x:4nkG<[.kN)|}7uu%]{o➘UNjh+7"  èꂂYV.WMy x~/<6Ly͸!r$˲E`0O=??{D"QXXVb%嗯":o{bD/TW/5 FJ#$ s;ۛѹkp]rj~萯,ZxS1H}4e7j̨T}Sv?^PJΖS^2,j\PIE:m2St"CJˆ>/_;YMD>W/n*/_v?js_M~~N!I_~Lt: ` B~Ν,CCCpPΒ.2YCm ꯖ|O6oOܑHY&R^7ƼlkXǩ B@ Lls={v>u盆:ňrom_e=1M9!#O1d72>϶Rxo[Ϝ-4Lّ/Cޭ f|O9D"'9jwQ].WaapK{"df <'kGD?ÿlk/)OM廎Lմ.1 \\8I䊄'&>t"Qџ?kƿ0q-D,\ZQtzx(vaGV+_ck+T?쟸:D4[s>`-ĉ>5f%)*%w~98+{.]?1]]O0ae7V&9a[]?-˗7 `bTY3mS mtX,H(W~Rf6Ԛl?@.)9 t:N788844maP( q%I2%Iݬ>s0O5m:l%Zօ ՕMf_xj ,[V*|v|7z(d`.4ǽa9Bj+Q0|CEτV.ؾ;o3ӏn7pOfm}sjWOQG|ZJ%wc=J|[78 8VK`ܻ=٩\{pL3٢lX:)}k4[U߹>G|yEID,_V6+xqMt%X =;zwҰj  hDbW)))aYeG|ӕ֞hB|Dley<>4vLwG,tnSn3 ڿ66 n;ܷeY8Msͱjh򁖽->J%ּz5$Zgؙ'eeB&l`DᎴh+%Sۻ=AzU{MmOjkn wAC Idpyefٝݙ琄$_ٙwf}Il)ߛX%EQl=Vve%\quنU"}$*jc #I_&qVG 7ɆKƄY3G 4'|111 +{#3)UC9P/=KÖm/..ӟ>X t(Q>̀x|}޻xȅm;*-j+6vKJ2zWy<O};0NFO 2P2R===!-q>Qq sqшbA·٧NZl|Vfz^$uvvũQr>\!?L{WQH8vkxJLĕp~YWg>s}'+K#I҄uuu]LWd{}83шp'it ]a{nH0y+t, I?--#jڂ(F…>X1̝s\\!?韡yA W ~wN2Lt1:"RLxZFl/7dT*q\('_kz/\2W[FEi0pnȃ'*+2fmǒm0\0 צ?j;טE|fp ȌSN5S!0wtt6<\;HʉO լI؝a9>j|"…9ўT]]S:eg#_KnD /㺫 :ewy|b7Fȏ"z`oZE B(F)A}>U#Gj].ץW̛߿90j,au< ￘& @;GnW\? 7.oCmG;:>q=cgT*ͫd.ik{RO|f[[[gyCòwIkN2u BcoK|b/$e2\nTrt1L 0NZ`Ya.|  b\b-_2#YPXE:L B(L}WWWBBTx<Ӿrar9qjj 3+**JP$I.펋|ɯqJ呄9&aZP(c~1B___gghLj}ȲH7DW!`zokkPAڦU*B> |Cx)ݠDQt\^WRq篿_@ '@`|C @YKRM`Ɔ9`Y%m|mx&  ^/>\ZllE+c䉷-C9\epWWWl8qR.)1E]PD|?%qի+e܎fWHWW׬Urf\.ǩ@·KKyw51+WiQ,*1~EڔJ!YIQ;)̮fp3111** '.^t*gbnIL4k |u}+Ůörxu:+˲]r;O-MQzeŵJ"m]"鳊HR- `$A<,<0QL& \28TDy_/ƥ$&T8%9lLblc-d9~v\T{lK6ecl%8f˷‰$**J&£©>a5kt:)@D!u֯,Ol>5 DIblgdYbUoډB ؄lй:xO]5>EY0Ƒ[+Ēa{ <^^݆0{jZrNgd~9 :;^JPpxJW؅VCo}LeE>6ջu؀zĀTuD$r~R DD#yc*"S}tN >jte]D~RFkDβZs"O" mլ>weݯN,k]?3I=UD剌oǠXYmmm$ΐT*TD'eR! ~}D{ZUIlϟ7M\}Q+=^ m9_Ȋj9IB'aAYTcmYǶM=uvVwVY}Krey~VXg 7)'"eDUMYں\^}ysmj$gȉH57ȨR{И-^ 2RСoo}:UM}=UӞsLy'2ny+=Iϯ9bGЗ.K:~w<Ñ|b_VCζI عF3#5:PΕ7(p\.?jV|__>HTzQne0ƲHԴ7yڞr󃉺:|Ȳ4ĨLҳ 2-suR.6f(T[wPw&Pé#O=y)DrJy]OkС.[6Zo2ICUY󒿬%ҭH nhr1[;b$4 2Y K7wq咜/ښ \ytQu dJnܰt#W.^=Ob^ہaR8!Sbd-,(QGEEȝ!|>;&,F>KPtvv5.ZJK`H2r %j>wnIḻ4\B]m1DL^m?j<^ ]7.|0Y ]p4x/D$[%i~~_Yfd7տד5 օC+N,>Z*#7*H|ԫ8"YUSd.Y~JR0LL&2JG-^'S/f 'Z0}~m;?`_;!" HRs뙐* 4 x>>^}d,>,˗/ѾaFC8# 3\zljRLϾÒkdQ^0IW:" [~GGLjϲdC~?o,v}>߈5ZYʐ'wTx\3Cl9?rTTY|Nb+֔Nk|2MMDZ\c7 IDATܶ4aDViI&ǟVph4n*=8^:pe70tU?P[r<]裤d e4J,W,zCGR=ti[M[?oQHE3DdK6[Z$c0<֞`1_G6u6%d\L<+Ha=$OrDԥ?>ݚ+/8.Vsz/]Q͛:T#և.# ;ͧ w֊t=Dǟcl{:2dhl,vil;׬g5duٹshĥYAGl6fܚpBڹs'B.аԁ7s;$UD$tF w|iwSSzNy-y'"9eXBnhZ٬T*G}}EjSܽ#_&"ܝ:w}7i$ϳZv\O//0=ş*SIZ\mLnڟ|H΍|/'}:O*bde(-8tF)dTԌuxge,dTUn-r2|nYS"1l?;]\xՕ֜`r2ʘSȣI֟kZǽaYȗViO^m?;LDQE/NS)cD%>0igIah'}x'b_Z^+u5?¤Q7-k ]d$ߔK#j3NwJԾշIy1ߋBӞ?<9vm9gY&0J|MƆGDYapJ^\ii=52oֺ\"T,apL{+XgE?XyɤR&`噴%Z" u8\Yfܲ.O95u:l*1-uo͜1p7OIgnHI?eTBse\كe֏c-|tԾ]$ݚ;)Ow;"MRV,b75iU!".)'Dal :{M˂1l]'j2.r&=nY׋aDqAfEΗvz{0k o$9[GvuHDrnr-,"b9)YW<8*T/]HEydOnNdp}0GEE!\OYc<8ww!@|˴w\xkZloks(QJJNFkK #\;ث{jvV ||@|@@|@Rs ™o ~%9&=:Z@_˚ou .7'ܓ>7:WEkO| Y'}-EaoO6:\hWS%j7%q`n?=VW,;F?pqPu3O?0dBjja~"w pg9sPӆ|1bK'>$օO-YoְldQB |Ŋ{v؏J}|z5콖K֧Ͻ;-mԕ sRڡ ]V$3.˅M]zyVIEDDC{V=" 4*ϟ? '*.huޑå*^dQӧT)#Yӵ3w]R,MpYd2ūTCTwua' c%+vbKv޽i׫yXGLj%n%#Zf6qpI0{ ccQӀ|)?d[-1 i W-4uz9D_>K;nn+ٸdcIqXbQOylI{K\~6z2Z##v0yGp)i*_hÿ.9mkb Ust}moڗ+-uŃWiwˌIWϏه 2eQ Z,zL|޻h ӵLvJm}JKqA`G9-Y(=:q}:_VaȲ|'6nIqE"Vt*0ߥnA$Q*U:)r>:=Eٖ+`'"&Y ༽Z\_[^62JGvoiODlrAzvGHaO\nqضcKĤTNr[&**C|iB| 7ƱDZ˲ 4좒%E cG6!;qI{kMdNG k=/5w`d2S&㆝q.iҏ&cwN^:%u EU b+ A3A Օ֑2aIE^+km%޴$q`W,OוKVhEǡ_DL1"0C_xgⳒ|.L.Nt{߲nMV֌BkRM6TkW6D[GIUoޘǶxFyiЎʑo2G%lcqV:4ȯBL~+0`zfݾD=CY4cz눧Đnrw=tOD:Q^Y}z:+H$m)Vd%Jjnch#|*R?`zf8hWdDY+,_dΒ>Z =5F%r䬪9Jj?S"e*8M#b 9kV&QZMG~X㤤K$x* $pڔ{N.6vgΏ5ߘ^U\eE"ev':K_lyUDXKX"QceҋKE1 K͇mYIB̊/4՜ Υ5gBR|z6ξV4".}݃CĥZ4>9Y#yg+:֕ ˚_ks \z :Rj됈1,],HKj(9A!|ÎW,ECF 7.L ҆{l;.xаt C׳^,\[I4 Y9_yW5zz}Z"R]{_6%zg#O)@v#_Q6  1RGS$:%G$ei{:$""modfW&'yه ԕq,wY)*hrת[YdG)4 _Y͢tz={37d .Z}lD\/lw0_$%KDWE$y⭩SU)5uMqCvQOmOz\%`T;-eW UZv$ }S3/4leB"%9I߰q/|Sdee>", %9^Q#|>gn6RA\B_)X7bIow h0\729o|9؎ӑL#SCDd(Ys~> ZuQ:>V !^~QQ֠HfCg1ԭVj~XioDD"oD"]u{^f]1+(ȞZThՈ 1n|-`ppgdF~ SZ),zuSc'H3҉bgǹ;UDD[5>>iڊW |t!4-keo̰u_ڽހ$)f <#E<pΗ:1؄+7Ő7՞eES\6 Cs_vLnx{Xs\9J||֒: -(IJb '\LtԙRGU X'm}?7G3ޠz:Ұrw$AaL E3"09y0/jcm _;}zd&'. WoHC? r!hÍ7e c}|#ltl#g hpX̠KI:tgtG" m9Oi2F =>HH/|psH )ϋ}5i \^n/'}wҴ )đk[mv1o8ísR-_rr kC+n׻F Fg07򃋫,k]?3ˉ${_\4~SMEf|@T]5$Z>Xw eÍiYIƀDŷV/-?̋,)'mO=@7?Z>s^}[~bY<,)re=3p( RtsG~$\D!TZ)Rh#6}0d3A#K;ǼYϐԳ7}+5'C26#}ߩkDDcL/J7Kgug|)LU4bwXuOܝ'@ uz9E6L֝}atUyPY{8(_%`U\ee%'?W?%=- SJwH(Đ| /5аzm˞==_ɏ?P"kswH-yt,m{߳13ͳʺ;Tzp-P>,YV.aoѹusyBk6oh m +Uoko{xˆ`0xgͷNtЯ_(}xa~Ԓ[Q%RP[^bKg^]v?ںco23̄NyWKztlˍZIp9*߬4jo}85Uet;W`쩚;~f?qV" /ض2AK|˖'-rWݚ''ZkJVfBQvc6Tc}cXZFԿxZt@wMv,z䷿8t+޷j{53YڝY+~pu{ưp6]U.~9E٫uD{js?zfGML_[۲t(x7Xw_L~eO ŎܥQ_{W+5)1F98aRtK{%TÑ0:yKZq_Fo|wJA_t|+ iu΁L׿b^[>GhD}[[~)8t-夝[ؿPdm̋~1XߛaGIKl?kwGZ>;\^dBL<+Ha=$O9M-Q =8Thr!s- @636#O~QPjM! nXZcsĥ,-3D CGwW9ȣf""pYs;vUtHDDLJZeNB7`԰,:9 rLaO"bs W0|}^VWjf6%֬T(o:׮+\BD+pKn䟾{pm_F >(?^xX{(L4C!I͑ ׹`Ҕ<PȪ* aoצi*Oܿ(i[c'\-y=1}srGIC"bVg隫R4q'5 tUN]:"wl9#%;O‡ٲe߸cevi^?kR$rد΍8'k8m&s>RN}~ߤjMK6}Rݽ'aD'}/ϒQy/o}~ޛ8La0ǻ'rg?(!~1v7=rۡ2䊏2Beڔ|@ΟkCCSm/zcIru{KL;JueףKb{C|n}.Aa1fjF8L~ܺ𶿜2"{Uf|C9c:򞕔:FCO,qZ'VV%Fl-[ <+۞ŹJM`$mַ7=pUq3;6on9=uz>oZƷOftx(u&\p?^i$|鴋e@pJsN .h/1+p[Wj vRA\B_aXDWoDJ{XHDt_Fݲg>@< `9w类gfW5]NY'Y H\A"=c JrK1s 'KuG;&HZnqc(G,Ʒ-|H!;E ㈺Nvon.|0skߎ Kvr2[3ʤk}DD C]6{s4$"vDSS^`]$nO鈽`\I "sr3KΊ D(5{c=w.].\SȹݪAb'[ oA9\2Q/q YJmsiDxC%sXnUx<?ƺЊd33\*3Z/us{QW EW"999999z.<[BW^JZHx"gXJֳ 7 O;'Y67uG0ui*'ZM"˲^[e Eӏ~k:ǩLH`x0.s>_CDd̺A5և v?W1ܻɧvmoi4+d"\9_U$|B[aoN45$"5+¨~9yCD˃xKB#=-͎PV,K]"鳊ȲbCK$bEEV(h$""6nUqʱYbg5hco+^H"pi#@DzkQAHl=zy%=TVn.).HĊr[e?\9[1'\Ҩ%"o|dxU1qvהUXId+=hvp),b[ VT$[Vlnos+="ݶ'"m?n?֟5-Jo<Ro&wƂfChZwNz# pB7`԰,q}zD:kAVZEYI0"nNqU&ŰD ח4+e*%i`Mq[%eg KP]GH3o+0VZE&F}-OH8J1"V⼽3w~͕ٔ\mCY.c=vNGUVGyp|6&i;tW֒idbvk֬9hұѥ$5li&s]~jCc驧uGD(igUկښ"e[ᴝ :v}5v Kފn\3Ik)dU}1Ј̪T܉y!&ܶq՚bSח,ؕ2PMԒF8 E?Am.*I?Z6: |]i)dUqVt*lgYeY9 LxT]Ԝ|kz!FeGvU3N|wβ̥Z6}Ip7 Tn֠!: Iq +m4U=D:@G&9際+*4٥"3W4}N_j^C13/W.*mdI@|NԔFЖS T-[Z6q8=cg_ןcNnqQG'aVAkQGVn-=mTBڻ ((Νsws],G4I;Ȼ=[XKhrߤ./uLp}8Kû[mKzkY.} :TWl֥""_? :#b1R 1Cf\4~ֵO?><-]TZZ<~ Wٸ*ϯygo,X紈+ccx `q:Y2sOѫ-3-G_\J,/Y ti sJj$MDĒ$غU]z.ӎ8ݱel}؇$^JD vxC_-x=Ugƚ1Ӯ-w[XcSfSmEB+PS0W DD)ihk:K\R"6SԦj J] 45rR"ҹo\.g^/tͶ*+$X9_֯yǵ4q߸%y|MDD>$"]͆qINW N1rxxC 11_MLwv\3>.pTW1\b9X?fY 2gG?ЫʣH[]=[]t<]]c?[CUt6%'luBϽ,59%H-iUSEgå9:5-7b@G.D}=""tO_#-~yƎ"m@GҒ x=9UX`l&5s̳_%ϻoߴ75cCs;7!tpFR&LHII1'8Rb:׿uU?4nxGu:ZϹ5'niY Ȍ r> r>|@|@|༦)hF r> r>|p!h_C*5Uswk#v_m~l1Xu~n$a=׿P?硢0rftw+wVbΘ:̵qi+>E]ڸ9vs4Ӿӿrۦ,+tb8O3UDvqLdxaO{D3sxHlGzc}\>F6θomyަ}v-˵S{Q4T~ο~ *9.ӊXV$""u?{̬KݺGQ 6p!|E6&U,⯪l_EK3DԻ7+"ZB`o@?`=&E#_dQVUmdf&VQ۞{n` '1o[*x$Ƚv HS?Z(&Lv-[^\[IsW y=9Yv#rF;w|wڟ\9?s *MKhQ`ۜ1?-gv-DK(Y3cqRQ>!g+kۋϽVݲ1紮c?sgΘ6Ǧn]-mu/n=í؜LH2lUn~s?/]nK=xݷ﫱}o߸gcW7'8`3NR2z c}}f#UDbQqn$q35]juvys?Vol:HN6ޠ9Kjj_B휥c紮#*IJHhvӮYظ-}-ӭsATg˧kc\6˷˿ѯ*O'Ɵ` q7-/"',C`tyUVc̩?O?(R)g^bqA02'f2>Ouӹ՚-lge+e׾߸[D2f9>0|}-KZ=5+$N%.?ڔo˂o/ږo*"9_7\?~L%Nd\{oiSߨu >d|,?0zFɵ}!98l@S_}jԨ1л@L䃘g2j|!7b~`q4W)zϓò8L9v&I]""lעKaϿRNyJ F[ u"!酧1vi63fґYD1LEF~\~To /l^17Rc+v,bt |,tsvA?Xu$d+.VMոC쒒\(4n *"h&-Դ33?ۤI4kt19 JgM}uc){^Avʲ#:/"<(M] .J"YZ4)%Ig])pPE;4]jp{ˊMZä4(]u8KRLimMC{ޭz|IEio7Nqɬl8?ۡ'",='i:v>Ĵ=U:yN~?~ykVo|;O_|_(S&GB凞[43)Ù{JD4{~ziך[쬮lQꚗV-%3w-Tu)2J\ֶƐ)@UVV\^쨪7:RnS""gI>O'$eKR_Y5;i}6s̒yR_YեD;~lrW6 ZrZM!N/UDDtoU,i)[R2 c㎾Z=DS҆}S4-m8s%NQڽ""91kV5}Ucf̞sKkuy\]s'pQZĹ Ng`G[2%c27u].l`;JoOb K]AS.?H^81G5cw6 |!lO ;EbD1lg+0@G;="z=kv}Q_{_6lv^] ~hR攺""*q""ȾwC1VUCcz`sWt֥K,]{ÏՕM"vfvյg;pj M˶mZ@M9P#ǜ6OsСi\ohA-W4Nhm+mm=v~kk;\_]9VOqȥWSaήѾb&-{&oV杺F[ѣ+Ṅ&K汕V\9qT/ g>mz!?` [}ɗY|qZ:B>н啊-YgݾqVf\Do8}\=ѻ܃/yx' YϿru?rZeݟFO?sM& *WY"RQISB2J)ͤ|"fI/UMuɒ28Tth̼9thcSC9\"ȉ,yO;+yKk6W䦔*/u0EDviknũo~}q?{Պlњ|0xh9Fl~gfV ؽ啊-U>SW;FPҏ鑾Q_U>߼=ThO9jSd4CiUKHumI"&]i&a,~=7^3Psb5 FnMr=f͚[V6{K͑p^ -4_nEĚW>c5P-pzˋoCK;FDDl_?~(^`Jyq~IQ4>nyu]AZא7౏?|798pe|:1'>Qd˻S\Ϛ9=-)smg'NP`uw@tڴ읟v*Q"tXSn7uCl3ǞL~5֢r:%Z%9SN,Au07 9kSc;~wsW~sLj_]~0[-}aEzcrnyEDv|LmIDATa'˾Գ/"a*VQׯ>Ԏ^{Gbw0kk0Ǐ`OGj~0A`ǟV D  H+~7R800~]ʿ#`\i?^Yct;#5%Nz[M}Z%JD@]u."=M_qISRJo()w)]ǎkҔҕҴHsu44%J)ioʳ#R{W5H/-+SzaF͘1,8'fIǪ/P~NV-V\}cϿh"_yDFcwwyf}ryՒƗ~#wƔ}׋u*wAvkf2UO R"55u„ ))ïSq =gQvGMĭ+ݷj'?lnOHgp5eIzfIɞjXw-,\y_#29X~~+xt:utϛ/m{{?. Ɏ_=e`Ğځ]^9O&>VHqca>pM@|@|HYi|`d1Yh|`d|GtF;y:Xʜjoz]S:wCQPZ.J4-u1e.-tRig*({B>Uޖ[<'-:=2KK&D4w7+98iʕ Sf12$T];n]MWiwŭL)q7kܲ^j .\ *zW;"$YL9GK); ~5B ^44%J)iRβRE4寫ws#h5o\.gok)+i&VpA5sLZ 4HMM0aBJJlM r> r>~W'(o=ђ]?xhWƾ46PnVe]cmڸeiʑ mec7D{KBG=~wѝJn )؊yH$}yVY5ڌ"2/}䖵-c\`cȸm(sQ] Cۘtݻmn |#*b4nLJɽD|fsL=8wǺm9&(4{ݵO??Ovц6]MUOۙV8urA?ak^_7?{ӤDP߶uLf&]ײ?gNIb̸?rxtju?)4ܩ nYe/dL3zٺ ƴe 4Z6{M|8lI.J6Jp˺־'_/Y3tG>FiELGi'$hvw_WI4AFMzrhoxd~=;rr=b]`-Fh'Dx٪e9I.wmϬSq|[HemhAwthOW1y[;myV ]Vs(һϱ8(^I,7إcF|pk_FF%9hEѝ붘M>40mAu; r> @|@|@`dh} dRJf ;6999555%%?9$/{(|{{9/dI'H=bJ}=;atYH98iQz)cElMCV署79 JgE)Mt: r>p~Ov)~`o^ݔ2>F} QP:;]hu1e.cDD">Oolqҧkb+B n_ gƒ7'ۑ9nz~e_19JmN3 ~~ikVeŹaOsב}L%*DbGU_2 MUUGCT]$"b,s9:|8LyOO7HS74kns-ޯwzL\.SZ^M/քLҏe2i&Mh̼9thcS(|p?ԿcV<ఽ18khs?ԝzWs}6ŦLG,++iZڼ`vݞ) |Kvoc˚}t̹A޽)%%qh6Ӭ4չIP^ώx.^M5?u_KJsks|K,l#_D }mncc xͷ'9=9}͖]}19593+4Pr L>Io+sQhnk)@l S2{5^zwծmԾpj sZ kj7ͷIROH8c n~PL9+.qb  A5/&W]("*7= 1ꫝǚ[}1P˚ 6mn]~MW;>ďzD:euh[婲94 G|{C՛Poo!ufc뮐 HESڳv7-lTX':;ê@9ENvo`.YYH5ko*xsٯ^xڷ;`⫮HTp{mH,&qӊQF[:b!ufsi;6zDүZ`Jbo`SmC랾S}֞p!]0ѭO?-zlۮ{h$H[?xK=(bLi !V]$tc{:_x˸5MBo׼vްdU lg5~TI]ẓ»6Nh RsWw@r-ֿ7E$Բ:J9΀lB&_o"n&^u9E?PٞPpmB[@ zC}q|͜,ʚoW56ʾخ 7OIT6~J{j;?ӂqzw IFM&Fe%\/~WƐ<9.^DS/O6DB"3$s:{OUF̫&*/_̿\vqWrfŞH|=1.uJF%f  L\w=pZ[v9gNLѬYӬ֎^jnJkqoo͚>ջ'j-ybb_g$& %lq93[eU~gTD4gϲ9ߜp$ 0qf $EO}%_BD=. o("B?z3!a!Q; q,_;Rzo^bb4[ ͿqCbg_qtEo"#%&Q6kltkH( fM4Ѐ?0^U3:)iSSB$>^{FȘsӌ|8/K5nW`I\ApL3.8ўX+$j*SӚ\t=[ĵ iR0Yt?~mQPUZ?qv׾aꜭUkZq3ϴHU X_8Ǎ8pҪm;lK*,Jd_t|g89֐-x1$$~zzPᎎЬ/8>QS5>N{EDTp|0ghS޼k`U8V"[Sq{̀X_,ޚ/»ZCwg_Zpႂ;ӒCo-ow[Ǐ$lT8kɅShB).׾ͱĥM{X:!^gXk6$~#H`95iVyŭC;%廎_5o'ǛS'&""935o^0g-? U/zbtU !FOk(f0⒳ mGB\[=Uo3['F ,}_nC\R̢"-arqQbuuM Vt%E9ow$gO~CڧW_폚9s&10p8L#`XJ &fBY]3p`E0̩yv d=Qz_}̛L>ĝw޹r h=d.s_wXK>,@XY X&ɷ־V"$aܔ 4Y-B;\Ԙ9sK/mmm=Ŷfdd\ ȼ}ydѢEWnoo?^z饋-"ɡ>2@|@|LMsǔYv+~yw~.b}seS|c2]eZuO blN=!y:ۜ6]QP:.Jh{=ސh K=t>ܱ '98:,q9M?('/Vv%ykxUW$7tܫPfUDĒTSke[DT('>~=S5Ew9썊X33C~L7q's_k[cm7V| лWLiyK6X~\ПimjRl>rOɚ(u9|"j_ &Oݮ>l>"GuhvG+Pz3'9Uf[r|Q+<yE]6혅U;ٶ6=;[H,qe"zfO~7A3Ub1Q޽mݞ.np~a>ywvxJ:TgD,}{~~fcw3fZ+!mzUU55$=e,k)tE1%37("l خ3Wyhk̒J:KMh&ƈB2#4U/N|Ps)J)%z[]7$z2omᨈ]5UESR5e\])Hw DD)ihp|F͜9VLe_Mv%LywޖS1 ^K+v9ީl ~~RK}Ush]W+kڙ~fR&LHII1ʹ p`<0 ~Ӓo~s;/~7mmfջ kf i+tJL%St~>ܰ̕t4Mu ' 98_ ʆPT99 r> r> @|@||M#۳gRl6n|-la [.-,l9s&Y 4HMM0aBJJlM r>8w?W3jկ {IENDB`django-uwsgi-0.1.3/docs/screenshots/screenshot2.png0000664000175000017500000022710312516641220024306 0ustar mechanismmechanism00000000000000PNG  IHDR`pzbzTXtRaw profile type exifxU 1C3EG @ Ӟ.mKUQ߇,dhM9DCi !L}p^;1ijg;¥YZi'L,R iTXtXML:com.adobe.xmp 8CsBITO IDATx}\S?wsrrL1@pxjֱwsn^lSalrjvVm^-X@Q "& I"r/X99*n7w1w]q_A=1TQݘ$yl*nEL&Sfklllkkvnǫe2L&kllsn*o뗫ju7UQ:^!k:[愅&$/X.:}Be/Ȉ o5ȉ;:Dw?j1hԅ[n "!GăsRdXM5%eĔƩ uN畑9%F uߍHZw*`!NJ~fNrslSW*DOYXn}e9I-*u.7и>#y7ju19c,P7/7A!kXtүuτlj<{2bcV$:wB8|16~JMj<9C OU3;uG4o%Yi:[D1OLi{/tnQ%ODmt*r'HdRg)DII:+Ūݖl?.wJg-~('8tDD Yz]G-oDg(Dm|:`=tlڲB/OVDE(rzZ$'?>&Nys_}R>ډ|׷Mb>9rN0e*` P0zw'*I͵U}Px)69^-"~(&C:g|2\n6zH죙 n[)/- %I'җlYвg;DDN$""'!1"qD\g̯nH=st66@5Z^^L0VZ-˙ڿiv9|oM%+E}xU%oWa5$?%+E7`lή+侕*`o"Ws-|3E3BH%K tZBZwU[[[_Jlݺu޼y{2䮝y={6 iU555.W?|?;YzΝ/w :uFuʕ+JR* ۡU=XmϏϞ.dG @ CuD4}K[[[r_v0xȒrӱnͽd6{n`֑`plpyUU`Hp di}هu_ \ M tuw#AMbHy45=˄0Lnl2<Ndɒŋum5 Njjjn1_~˖-nH`ܑmmmVٹsgBBBqq1EDDIݹi]CCHUSS3k֬bup#дh4HǺ.?qФ`дqlhhФ`Y&Nh{ F#kWV*F/lj`r^|EEL&Ce)~fMdd$bo߳i0q#a ZՍH^;+s\u(;ՍH:V#Jdjjjz`dALՍTQ{E#_ DDd+x,u%wMB%}6l=wV"Lzdd%9ZyV5sͺxgo^a,;^)NT$KD>^ / %"߸5v!BP5iV~<H|rãgl)=|%jW=4#_l*w5˪].Ekr]uW}{oE1׬w'K{Ӷm)K]+$T=&{pҥK#UV-..FXMXCYۅB^|ֲp,:6>-?pľD6 xߴpݶT,o18LyD"3_GD,NIYIߘhJ}qoN昜}œlߠa٨[*>)Yy{v4%U8\*M;'3,_w 7voD}kS{^>PxϮHUWq}EogGw͉ۘDqwH؆* `n7_y F]t{A 79aJ:%`3T@_$I;wZhu_r Y4Z3-9xpt` B ,$%6"[Y&BAD$zY"#%a+W{7<"U^㉈Lylr\Zy"b9%"b9.+Җ'+T/s<|/H%KDb]]+,g))^q13Un{cVm\p{%zUj GĪ H#]tjTigЪFe><ӲxXE¾jf׼{]g]{cvO,;?>b^y%4ʫ7׮ MI"7bTז=ݓE(9'%"r[mfCvMMf'"ϟ9Yo)ޮ.L PDڬUƦc厇sZpw}JQKMΪjDM֧Rګ~Ei8yP_3y䨴٪VyՑяq 9mMٵ5 o3KVpct޻!D+R9TMU'lY''َ^vtV3)=tAڬn|-B`KS3'sFeGRzqGɑJ7%qLgPSY6iHG ϰU4P__s>ezGxyb=ݎFJ*5믋waZ5-J>bTjKJkX)_W鸸G8",ܰ=4W)V&Cѕj^~&IܰQEB3:WQ@IkDI=[&۰Pu}c< +О∌ *dlF9:aзⱕIt I,X?#/`q,J"v:wQ9tj_HcÚ2X.?No6 *4:%V S*Uj3g};Uc}q kCC/=HN r8uLg%OcsOwrC4N!r,|Ҡ*eJ1ZQx&$P{Iس f%>0WxJjsBA*j ޲on(VC>AKBzxi@|MDzě\]xDj Llrb$<=Edt{UƦeDF| mcCWm޾tJz8l'5a-k5/ Hp0RLo- 5kÈ\yJ\82׎K#@*KrCD^gkqgP#["1Dz=W$5kf%8Oe!MK]јϔ50K]%R+2:4Nʊ(+٩-]3+Ne=AG5 ˩X"jmg =*NQ81|DK=m1?o{#T9d^\6ՔFϑ^39L&}so]39I.\Y!ߞ'gQ R(?ji}S|WQȤ [,,騛Aݎ?k~mu8Qkl_z.k5rQ8[wM\7Nkoc n>yh{4zHx}~M\\Cur"&%{<`xO-..bL:ſ^?̔̑$S pVI:\JccV_7YUZ*:PT%ޘw kKWC>eꪸ/w6S橮9_m\|jRA=Sq ҲWM^ ?xبșo;Rtbc'b)*^j˓a ]MN8m@sz|vA詴{^|N, 'fdtLаY**H勓4,يrϲ,F?/'V.}ןdz,;)f򘙾wu]ϭ#߸5ª.}q_Q=,˒PI Kƫ{wvm9""*'kzj{K <}XMרRh◪RW%֖<Xp@IzLlEo.f = r ,p< ԭanh;9P6y,Er$ǚ@Qm}eᲀo)ʻ,5ҒI\U1}9ۘip|2:.˦\^. IDAT<.eY g$#e [**XNe q^CuI}̓::y̦ʝ;}e@a\2xǽtg>8gBx8a1!rmm%1)_@u{]lM +/J&>kPNbj܉:r*.|?m}Y3ODa졼nz\@}`"@ v\m!3;́@M-uI (A2+1^Ƈl_\b֭;wtR_rLt lW'1D,%-f"r lKr5lc^[Rղ{ Bϛ6NIrhrxV?+h>S-IvábáRّDl3:eLr1rKDLR/m*iy+?j.;]VSC|N-^5+G@WIeiqKEL"qThROՖޓ6u\nG[!Q NjgDD<"8ZS;@Xkㄦ<j5֪뻘IYF$ñ="q|%kR,*)x"(~!ݎnyfEX}ce%]o2s4{HN1mr# `lummm$kCsν{0&r;=DDXG-''Wk}gr2ٟ%^1ުb8M8]eAOA!%)w[#vY:OpN J.qBՆTj ID=& ܎7Wh͖ Z=7pCU]6n(K|#%m4^F=ku'sVZ2M3"# gQ αk#}rZ)yzADxj,ZWWiN-bY % gnu:_ͺ to Gm7= z,&fsF+2 `u #RwΝ;kjjl„ bʬn:L`֟cWjo]G(3HΩTjK9ehNP8"9x'bI ][I9Eobm'H Qe ]RnE??) 4 0 . J"rZZ(b% kFM0Y'e}Jh'rc-43k:ZWa7~?7xPک&iO^ r[ ʿ~g0O܋C|^NjX9A}˺|@<+j-fs5MKSՍת|ikܲ===:u6NIRQ) 7YxT詨p`jNgϞ={֭[T*ђn.WIU5pmc+/SBcDT6Sk0ZCjդxR_析$SQ{SI$lJl Ve8*8z%"b%"5\ҙ!l3:W~DorxX4L>VtZd>Wo,Xabڨ""A7AAq ۘirt؀xm2'e[f!|޶@I_h/y#.[Qjq1W0' \;%ܖ8 tT8EjX:Vo`LϹiትE."ЩCןC;PS4 0x.*{3k |2]ya eLz< z[뎴. %G=1FGoӟmmDGa u ??[Bk/ke/^ roi,s$1D.klqe>a""bd9 zV%ϖwIـEq3 : =[><]4"rt= o-q(OٹSVٸɉoLf·:2,$=vwa-Wg[{3V ē#yبxd52y&1oF$er4e^b1PFzCD EPD'5 TTz(8[>P\9kяm;81*<\hiryH eE{Eڄ Y:up*Zz[XKF9'_-YҥK;wpcBjц'٫N DD6swj =,VJ5c %  yj0jLWq>ޙ6KYc;n3rzO2jԦ(*cVRXS6ZmBAQRN9yycݡAFtR9Kj'GX"P?q*,4z&(LƊ-M'ΗY\U58\n5W;l0F k_TQ*yZ,#Κk9VĐo+(/,1 ,_ȱAR\pӌԩ{ c& T:~x\k{7|AX'ō/QAcר̰HQQ`HZp8Xwҥ.J0` \$zmt9tyle5~}jSeeY&22U1˷ك`HZZ$I$re2 Vb1 X5>Psv;~3:AD&L8N"B8N$d2tl,ub;k]C*z>Lt}s6559K$aa+-bu.{Ǻ@F V{Lr9KU޽.+uHKo7~dyǁJw=>m۶ G[^KDqk6<*-} TzZ_&ٰTÒo_^}m,GЎ۬9rkc/}͛:N3:v~T(0dn[򠮩0{_" YM^7g6Ұ >ɶHVO-#c>Ў6l[bxeipIbK,9"ǢQt~NZ$sSS6.TuffK/OEv,uyy._WN-6m.H"g˛3H"Kr C׏"8cbo8]-HI%0[.>_6/LZYYfMZ4Ŕ\|Rű _}{':"5VW߈>HDDֈx>brUξ<󊹴EL%ґ}66Һ0+ yJ;Y YN5E]U5!OSHխ oPVkn[ª(HD9$߮]my{{:33.by:{@q!*fԘr>.wTӡ< ;i]ua0T [N^+ d79Ҩ ~a$sɳ,bGS"n&y|>1Nq5:NZm۷T|gʓ:\w7:BBgNs <Jˈ)?C^0NZףcD"0X ZU3>"V*u^;}G^?Mݢ:[Y2— V&YU+R/MX!KݖVYgM<ܖ+Z/3nKfrU#i>,c QK mn&<9ڎeBՓێ7I'>/0ƥGr$Ip@f7:p!bAF.7W`#q:"g,ΩSw*ff jFVhUhVs4On۷ofsJn[pWzFGTGxh ( uN2!u[E_6>.i9x2 XySޮ-gY}'|lPX}9;oDU.%LZam|֓\x畧KBEcOw191ruaߖDfãkG<'w~lTSO[B%˓[%`5mڴGiii%$::wv3*ƪtݽqK:+&KUj)Um߻-NիWW=mqI7֭[Z5]߱``:nw`hnuefiN'bhT>s8&SY"RM GEA222nڱZm_nur\(dfތ0.Z6u_nSwZ_TTTFIEEC&C= mtP[[h#anHn 04AAAn: MJJ`6R 0*8.HF. 04<f3:Ԓ Mfff[[h u urJ׋#ϭP 0l~Z[Cōۍ hZ0 p+(((((~X,Q B ] v{SSSuuNvHK(hWI$Vj CvvnFxnuC,;Co Gaa!*m??A%(!!̖Rtڴi'O! L$M2+W* Fӵ6<ԣ X,<ٕ+Wl6H$Q0~o DDD%0=^ :\. H4sO`$,!v&삑3Lݧ.C= :9s̙3}Uo".溞pWHHŜuN}3Nyj[=g)|l59kTKf$> ق?ѵ f'(NGv'wHI|`"yܞ6¹a0FXl?X327, IDAT?t^7zl{^[jgV:ǒMck1)^oTGDb2ujD!KDD*6qA ޘO..F!&"SC~8-AP<:o˓e ۜ( O"8aZGH-}AS/]}yD?3zېX3Dl^!)]f&=H7/ћ uD-֠H/<#ިľaS17*Y?ZLdĎ&,hތD04 bolRbN%`q1I"N0z7:3mJDn̑Ͻom<dnլ]vLs9[̚q̼>º#_fOiKN8rñܟ;_&[&"XLty?HD؟lvΚ[<cz| - zb"2]8bJO'dϧڻ۵k&pɜ!bEؽs>?}ADl#+e`%"r;?,_sO^WNI?30\~ BB`Pknͺ[ֶvw[Vtj~.*+$* I`L?aff 6siMΎk蔰 MH [3\uJ- q՛N:'wKVm<*aq޴@IOX4hiN:E&gh)*VquԢ=knzc3f͊ΦȈCu\q7ewV[ãd ڵa0Oʴ9-~XQ֣4Jb2 + *}ua0gSADDnI۵AOB-Q1>=7BD\?,ߦ^ 2޿(*!;LyThX;9V}yRhZlnFD|mjXf=ON;y8UZwEpV8#(E{ɪ R ;N]Z\"As7}>7^Yֺu~΢%Kdggg/Y5}mE%/c"뙋^DDd#~C.${"b'nԢ IH'aۊ!BIJ{O`Ln2#FmѸ"NY}o^Ĺg|] 89{R`)v;nsrz?׶Z"C݆1btZi_dۇJ_m`onik6,F+" cFju$iEDd!"rr9vP0C^q?x9*OWGk֦6SA}JhvY "ulƱ}Ըv^7Y%fε""/dɶ#?,,<f'D'@CDgu8o8d0rf .tqpώ5Ż^Rv\D$ks"v2j]&KRi/wTtQ9R%"֣,;~XFHCD$$-h̎Cg';]k[}tvq߂xkHH/ҵil.>M-K6hEzNȌ(H>L/"V n 2*|ca*-v}xCOΓ""KK2q颗H6S.S$GJ==7\cH]'Oh=Zi>r%̞xg[OY/MۖڰSDD>Yb7=v1>S?v~y$a5/mu1{gɷ2R_s>8:*7Ezs57vfƑe4,jSBD$vEdm:GJ℆;ܡ6,b`ovg>ȰjD>4xrEۖ\B4 ҒcGܘKo Z`CAѦ' { &K砹Ga!!6Դq\5$O ubݮcwC:亳kk+}G/ ш&l-h7""7 gzœ:nxu`GXVkҿ>P漨r,}""A>_Nxwv"7_7!"ӌtg:O.=,lVD+=Dz6l}gteϮ]{SDTgWMjhVMyң556O)㽺]۶n+k XWDN=`\CT"ǥ-XhE2bnN7NzFp~ TGtTjoED!""Β7.63ۦÖwlm[8!_u ovq%$vu"3`/׸sӘGmϦ "nUDD"nH#BLX0kBOM;1bn=#"?P!"!w$-euըl'hNFkED:Mu (L?.ZoфͿ5K!zIZv 9_sG겻o#%%36csh;nx?$#;T篞i#-9m5"ҳe94D$"z֌lm="J_G :50sgtkw" 9iZ7fQrAVu""6kyqXirn-?NM 9++""5G>hfqNh,}!]hS١|o))7/vFlԫ_#Jzυ^=ݙ yZQ(Þ2-j4gy[XS5)53pJ-Knzۆ[SKŶ+"'2d &dXt{l͛ogDz{7V.k}s:wDƅ?YD sF?w\D$eEbd59)7,%7>t#ӚoO[gS6w xpWsVrvM1&"_D4^ݍ_m{5=9⼭~K[M<&3Zw{~[<~>ܑZu_ycTO;ЫeWW ~ۗwddh2|e6 .l^.USJϙO>(Tw҄ :uS2 XZ[rWt|KvvvEEMQu%ً-ʈ=:w3ng~9yuo7"qQ[GfL`yÊ__[2c{Z~ƳwG^\!oՈ7EDoȉz3|\D$!'aXXJ6O,NtO dfG,WugY~Q=O9g@;[e5]}Kxw67lwW##PXEk~oI+Qo:9p<0l`ZOMsw}ovHsHvq<"θ0>h#u{-tLtn.0;AD4|Zv"1MD]{wlN7#lVDvND$ {baô 76uZڅͭ>Ru4u#дui>zpW{`r44;(m=Ի}ȉ㎁JZ[?(ۼP^z*^8;lE>xgElMm?~7KSw<Vәll3?8۬my3pz=kNZfw ޿EysTD{ݴi7xc>j%Eu'vsW߭@_1xoS>ߊ3{EEEm~ӎ`oGL^~>/mj.PIIOL?.LUȔ)S#MG>L/{xx͏?f%8,`#MgDC1g]__OM\$p9sC?1_@8?r^{?3/2ѭ0np~S <@b2%26\K*K*ʄSr U0s\=l W!Z\K =a4\>ѭh'.V x u Zx [騯/myR i577S ֙f* x u Zx u Zx Ur=\{s%DoA[X Dy/ٶ֮]{Y:[:[:[:[:[:[*dJ\ޜ=1:?CBP?J\nSee}~%43P EV߽P?r~&^}wjy6(| LZN 17oǸ\\]lO\_`rs%sqǭSWsk76\H.8ue!1.WWRU]@jۇ8+_ܢ(ª$-wYb \MeHM (JWEA!1'W抌S5EE#K.K J%r!ѺʒeЌtcC+_79D$ aelsrۊ6nƘwS膒6IM IDATQ'F֯XnDfHن6(i2"!A~c}\hR[RGS| y+=ymvwGG˲bTe[:<4{Sxv JVriwu@f\ՖWa<60U1${r&Dbtdңu;|w@?Mon<|Nc[ 7Xe?DíhNoL+ӫ-.?He "אֆRy(놆ȕwgM?k} 5 NcL=VT?3#!"*24W R*{ۨ\v0~DlN=4erPsu-Ől/#)3Z#""~D@x- &]k>jg7Kb|ƐVkսau.xI˭swn]y_YnG>nW-QYڕm.:,3s&4[UQcXn:3ke3aܪ2-ke-.e.+9 uUJJ$U3k./阬'8$L6Di3?W7_O%[vfMuw_ \)T%TX:[:[:[:[\n\_1ڎ]w|)ҿZ\CnkjpKj-6{[7cxܚYW +"^zLZomnSMNH=E/5|Kƙ _K[GWYOgfщXWRo:50Yc~M~Kkr+]9~y\Y8m4V<6_:t߇)Af/XLan /:\1|];gs7t {{;/a–ޅqpepI$yOUk2fEt4 ՉHp*̛uq"{[ ;"Jw="d(6%rՑW}-wcj>8炎HU"OOU/F}]?,8js(a%p2DpeP}G$_"&*0C'"{MrN4.1 ("b^kKs(BbaSskDM#Geqw&[|^t!A!"e;oO ?}=ٵxuBH}Nx̠9b ϥ7?>~#"}&ǩQ uw>R|T qnn١ִG@"h= ռk"])MN?3dnS}Dc=TgOk5SHωk;D|W$ώ7NWW۫56QKl:mаఉQ wߖfxNʢ:v%d^#2eΌ`q6&6"Mt5w@";ejܿ*љ>pE4W=;!W?ͶSg.ѸO5jm]}ED[OmvC딦SMƦ9Q!Am#|zvJG,:s""aϽ'4M:l"j_>b֔ zctaQFܖ)^:\azw8tT$8k95\]V?=hdٔp|:,vl~DƤKQOsU!QQ}xit8lj`h>'̛6!"SGP)"fzD('i8xuVoѮ _Qz3HpuO 㞌ӉtfYk:[7ozJMV"ks|^(Ӳ'vuGeO#w%"'ό?(Zy2|Dzk=WEM~Qji8xzs7UƹGr甏WDZNT;VLWY>G?O4'1GttS"Q"a4G&{~hrc |bw!΍9e WD~rl]'^>ڼrJ䲼z3VpTy_E]iGh煄)-]WONmSMUD^&CֶKD%L \nԊm9̜kcS$rzd~[rckSϬy!=:]XմO]U)))4P +ޛp]lȭ:[:[&$+5˹ZsM#MZN M4tmx,s8t e2E,ǭgYF`KP^1\+2M=Ͽu捌^WY<8njpc[Z>#==ݲH g}|t]_D2GOX|!+uoS3Ũ7;%cnV@뛎x^+~" +wD?[&uGvY WYF u 慈,<ㅗ/C_Wxpެ>ѽ%W~Ӟ-Fȗ[u5'z'O->"2kXr7J!YzHz'GDVgIwݵ>ʡ]I!""]{Į\3tae֍UIF,""Sqw=?+>К|OL]ԽW/"yK~f$u[rYGUA')U@|&1Zb=6jfV~pUyTpOէST-96UL^Vp+,WDQ\%Iy._CJDQl5E=)~s}%]3oJ)Kc%\EZ˷ҙh*0 a6L6θWDZzb?6`4Ծ."~ +3#k ύ{rhb.MnX-M HX5ۜ;`cݳdbƪ@)Uv/”+J *]m.Wk_ח"2\ƚۓYLGƂzMRn^̘`EDDsM@]_GonG[U\DZZ'"bo6xPĆ*03gQGS;:L3bv=25!TCasv@*?1WJo Mq;fF4ƴUVs u]v\qDe?~p+h0.KLT49LEtdh\9S%"(M5j=,a(K\PQ{Q 4bs(*2Fq;\KCՖrG%9jJ jeKSޭQt&'8 y4a~ڒnCjJDe,7@ n*}|@XD ?Ca ^59802>Q|Gnjr+4\BI-f+zdT>03=PD\ϛPr3=4Q-Gn62ƨDw:,3s&4[UQCD:*JYy"r,% vseWҼHKSGmf\[Ql5EU<U)))_!:dW 9ߝ{pݟ&w&feV_~idh- ie9ۅWf*ڵk6KuQ6h7{6oo5,~`JRWVPP@pY.vj8 Μ] DoADoAG IDAT]f*>/u :YXpӦ77\T /"}"UgDNV_xg'{=NmœZq*.3[9!|:L]/> 7˚5%{'_97|} +֬苻:WOޣ/%>*Kƥ5|_Ňt7qkN):xrFm}Y?%jS;{'Eӗ!u<ǾwϿPmSMGok^O/⡠JzbJ֚'L[ n7>qP6)ŨUH|ȑ"":"1J+"G'm".Km\s5:6*)i' 2DLg[u3=Ig5'c7)V>]ku~5TDD͜ .T64:j55 _2)$va`WԺ+JW;-hDeĺnikۼSEDn{.;fj_4|t RR*Z;U^aq5gu@㊯%Mp9',&:Exy\0wqQ?:3d&CˠeVRqz X%b`SIVB-w{ {9>Z{۰{/I\am㪰:k:)T, Af53zF!j4B_Ͽf>u}k>3y뇘m)F ݩN;7$bɈuornI琈ωudқ^\V""z#iŁ) {d{BƮN{;{!ДG`INĭ*wUe t77%-0/TW z!K;_owM<_p(wӝ~1`ixDi2ï{=m}mlζ</_?ӿZ4D´"1_GQgO[3ˍp(<7=yuLۯCw/ ͹sfroaYe`|٫wtM[$9cGSXEZw3 o\9ޜT_H_B"c#8\j&}ļѲˣuc՝͘Uy~'Q7u^Z}ٟ)xیyn$60Tbuƣ'C7"_,Ki]oWÏ[G3"gO<.艿ylϿy@IZw#lܱ#+"o8|9$r|'fnO~? ]>I~}hz-VwT˗BelXB#9rOM߹Ad2ՙB˟U!PHdʑޫ; W<_qw'a(;JR*s]۩g{)'ID4Ծ=ks1n+gn~HOXvOtk#ޖ3sϺ:ع,`Nj>y1~ogzV' q-,=g Zg܇b_|y͏vzP֤`+ ?3[Xg& fuY72ru);_(E֤t7鑹$ ݼ}C/ij8&?+OI:m{dWF.Ov$+mQ"#'w=?/?=OSU6+k6lY1} BZGa֓W CwcuSGuy%{wf_Ku]GumVFeV( 6㸻Q_t8k۽7MxzZ9olsŦZ9{lick׋̌^j?zTRR|z /l9~O$RVr8Po<5}Ȕb-( rGZ7>4a}kMBZ-]vsfܭɉ~ED\ԋWxElQoZ^SXKY<M 乃%doyh(o YeuGjݝ{k*s(Rƾۋhxy^}Aof}=ٵ*f5t:âStKrZŠyŒW\Lƛe o2zܵvo>7SWcr'g :k~F{aNĦۼ.^/2=OqjѣTu:bJv滒")2:,xWiIgU۔WRYDD1=A12K1gnu[y9{j;DĘYIpM,,zkbLWŠHsweI@}GCےQTZTUsf7]Z<Ũ.0IjҲtKի5%emo0M"\h [Njy}KZAZhiuVZAZhiuVZAZhiuVZAZhizZ ϾXb*TP)*4 *TP.,s:t:w{pw_D|ac;_lExtjjZbW;&߿4:V1W~zwbA5od. {*s̳,FtEDF=A}[SD$Ss-=3'}{"y#!Nz;<,"⪎⃮|ϔW'?Es[4̰wĔBD$9b3I"DDtɫc""Q+-]LNDَ>4rd-4; a] :ESмU^IGE]<~嬩(NRHt%|Q=1r><6ٍ#,1+VX"BDn859FDD(3cS!bDgl+oi(ќ~kQQs;M^mk`PD$r,ë>O$RVr8Pqkܣ( t -4FϠ%#en'Ѷ x>eKeŨ,]U()QLHDt1<nxyՃ#mu|.Τ_h&]6xgտе'/Ӌ:MEd8۷x 9 C>:Q͎S%5 >~乃%doyh(o33>7eh?43p:a,T8,"AKmѢf_zϻ*\}?XB:Ђ+O%YnizꄩKW"""}k829)AM{ߔ{]5;3sۈ4؅GC"3#/-׏c5#]Qrfu]Op[_D~qk;3]x:Q"3#F^l?3O`pnCnsFbbQF7)lf>wc-,t9bE1a IDAT '8@š <}ekVAbCʴ3;[)Ey4ik;3\ ti&)7DoIKR/~i(O'E{*u/9ZҐ:GO^J c7,eN.`^ϟJ7+"bL+)-vEdԡ}CA1Te7WU{|A1[+3JQOq/{c&{ToX+੺n>2* ȩm1֗:ԗ?cnܛum_P Tβ"zUt>-"@q;q9oo0m7_{zݶ1)b|*4rEuX}u|6- ]kasK/!#+wqEGgfu~<,4Jp&<&{0Ax(f%>wv'τ :@+H  :@+H  :@+H  :@+H,dxxxŊ+PB OQ!TPB 5u` iG`WYY" :@+H  :@+H  :@+H  :@+H <zwl D#iЀ vd`Ƌ+ 7ۣY83=}btXiYٵB_/z>nN\>qDZ\2"y&ƊL}(7~=zۏpmw|>…>Լ`)"t)+QgvOOk]bR~DS;襤w1SlƝۉKVn*. _;nm ˋlG'.뚊]#Ki_T1XP5xs( EDD^SSŘWRZ4=;,.`}ɞ&q2"*uQ_錦 zn_(7A/"Mg#cGgfTuZcTϻ-cγW&W9]+ LrLk;O/ʺ"]~U"[\j: |ۆc"&o&)iթpdrϭVfoYj:}Gm'Mo_\7wۦWj8,+_ؘΓ~_Τ/΄pÕ\`q:< CM(ͳ uU5*d,))L zYUUI̶d}uRDF$}'"ꐻ'(:x| DO^mUi oQ ~ OzoLRs|bDޔ ԇۆ|Sʇg)&nblzU{{ǿ"t"w& Z |yǹ-ʴrW^}WrMg/~pf~?_}GQ~{'pm߾}G3|)~)|O~Ya߹Iw'hWYbn)6 Tq 2s; 9if Oa)-9J"cށ[q.:yu^D$jeEG;q=|hصOs؝ۆa] :ESsU^y?x׷&϶y_D$d>C݃DXcZVX"BD.vurkQfƦxn<4 bTDDQ}^5։rf{ILInor#֒li: }bLXO]U(b> ǔ(]xb&$Q"S}{[Z7*cl> 3I#fD%M'%:`*o:,"SǡDܾENwǛ0?Ni AV6e\O`wR&ucVU$H+A/"xʄ)V3sXxzB%E<%tXokS惟Ww׶KTw2,qzQ~5*RÐH?Th±~g&{^.5O@۸ŒayNξfQY wLȰ{z{v"a-4wbdgݔnOʊPYMO0ڂxZ xi'GQTOSӕ6&E,Oexx&`UVV. Ģuk?]rn~|:uX|1cO4}01  *-ZNᙰVZAZhiuVZAZhiuVZAZhiuVZAZhizZ ϾXb*TP)*4 *TP.,s:t:v#h-,,=2ȷ4NO yPWѧm.26BoG7lZf}>}q`", WKI2'e W|aEXz>)J$4[ǾJ=.`I "04 E揼}YeY4*x ۑ=vtӝkSQñ%"dl+:F-7x4z+< KˋfQYRb,y ^DdHɞ)+RU4 H[6Ysߦ=|0G9UwcbfQYi=ZDZSRq(79P鳕t?~ =Շ;"-ckyyuyCu= kח;9R}s( KkgiIN— #4yIvKzgf&[sbD˨_^"LQLs1#\\bzꀵe\h]Œ]\2~#{ol1́omѓC;$t-iWeʙ |mĖ>#~.ԞʺNCl,Ən7l"uԺL"2ZYg[_7Vt`ٕB^!ә/|JLZWufwNa)) o3ua’!Qձwߺh#;;= aD0UeWD[Us.ׂ+G8RLη;HuSə JⅢ45-G|owƋH^ߐVZcjsc$W/0xO?XmQBGLD~襤y2s'WF>>uz^B'[ܶ`i #aIKmTuP}AbvQDf:KkMyZ*vtز ;zאQZ2kw~7Η Fc*^DRMc3R"Rצ^l%-FDB]Ǐ-kbDkM:k ٹ0KV,/}?bQED`PI)j̸vݾP2-MRKI}iʉuH"MJxb&$1zPXDwJ:=1oCkb>2 Ng,i!l6EQE$0]0㻯* XRnF?(VgAC-2nT?yu9;4;!Xԕ޳Hh&bSc#djTHD$4uERM2qfvk'bb23zmdbvʼn],kbJ,2-_eܚ?^  2"4ƚgW{{s謢)O3W)*/uH8KN[6,Jlj{Ȅ{aNĦۼ.^/2=OqtG':"-L"S'S3ߕAT&ȴ v(h0sE$ڹܘ{iі5Sf[`U6E&5;م%vion*)߽QTsF+͢45T9ʽwpWWt3=JFaz[XWTWc?up_Gl;]qOsUOV7֗050XkvYUM@ףZ|ڎ=}Q7#+z-ٻgXm FG * ,dNY[oSKI3~hUD>:Q͎S%5 w直K756=o̝ETq"x[N bQUu6R,su|vd'bqXv K)Ơ?XV`r5Z,2=89ɫۃD|nFS\Q]FQz[=#w}{,֧13x߳լ0{5ݻtߐhLQ?,ݟsΧM*ǗsuVZAZhiuVZAZhizZ~Xl*TP *4 *TPpZvO<;_}]lmRUoT*|owzzk{\_^Եq.@NyewvuIW7l%[++ foW3:N큨t֭ v 4DI\l⌚1-RZcc"ہ3[md(RD tF vRl+7 Pݹcq; G8:hTLtfMEotEEm]uP[WXroM&~E:ふuV lpNQLw+b2Xs0X "M{8Tdl"S7mPP Elyk" Ί5&>r^_#& ÷C!]\LZ#|f34:|w"DSoss.DN<٠b+37",D)xxǎ|l83XV '(6W44FюspG-EўA1x ]jU\^Zﯯ3{J]fQ\e%@n:5<qm晰i9CξbS.-xq֋j2 Uo.r@KYƳ] UY1 j*(րQZbIw Gin.`^ԁ}wB߉qnouVp:hm :@+H  :@+H  :@+H  :@+H BO ˖-B *TAPB *TS@ n7]iG`n :@+H  :@+H  :@+H  :@+H  :@+Ho_cNO *>w{4#۬#HpfMm}VP^S%OQ{ZCY1VVU"2sx(5MƮ!CioSQ'|=E;N:|71r\;wU84Alfwx~MtVBuevu48)2u1 nɋt]mږH~RXQdSdfzOUsDm>_MW&Q;UPVU` dz6+i:ܱ/$ҺNZq-0k*zn,-Umkj(slԹW*""3Gz#5.E>10Ul"&pMUx4x`D E@X^7,Hht0"nzcH_cJ8)(:误8SXZ|Mk#Iۘ u5^KfO`sOxi<%+"}7v. Ϥ^O#bX洋DFk;wmQNC"J#u?j節b[t48jR\^Zﯯ3{J]f;v`../v5V-+q(@_xj_C[YX`EvB#IWר ACNIAkquCyV ² a'"ҍQLVmo%]r;GYo4M0~x䍏<`uuu }  :@+H  :@+H  :@+H  :@+H BO ˖-B *TAPB *TS@ n7]iG`n :@+H  :@+H  :@+H  :@+H  :h[VL B,# #8wO8QIy˛< O9>~Yt }bdP['''fז{"":gJ=ɯ*՟9o:F5W6}&Cb;GgNcX2}EKD{X\MZ\Ϫ,$sl|&%`"9YIUKRZ̑nnMuNI1/e tN&̕FN/15}yjc+˜'9yOt͓X^e<I$Utor\ |aɬ2bӟ\y%Ep";[/ QKlHluqE$ݲb旳33O_^T$yȪ7J2$1q76-Op5J|O~z\]:%\V""`r'S/Jrftrek3dzྲྀC/ͥ9,`Oψm_M8I`hLb.$?6w[![/VRjV~?2zӕ!x&~̓.m|d鵖prrD^y,K'9އG7r@p%,:ܱ/$Һ[lYm -D=:̆!Ufbp85~4*9[j+ފ_1"tulDLĘa1$˽<]Do/DR7]3x YNed8!.n9HFvv^D˩.s}}ye28e7\7v:Й-ɡ-.2tljqO-w.ՋђN99iq"_LHld$ȝm}z~n?,m+2u3UDDoJ׋HF2s2K<3gz>߄E̹z1ff(""fRk w$Q ʍ(qg(11QYq8:71+&˖pZdn)>Y8$CD$ݹ5ݱ#T*Y*;^<:I&U$"":cf 2p2NI._.帒|qdrRDbenN1mQ&%]FQocK^[?[f俼g,loߕ>]wP#15|7^qf2)j$X|Ht;vrRL2ڔn>OXDt |un|Hpyj)}}sgáL@eeC-%-p3|ݓYI_ xyHƊNO]xn>nDe?vf%Yg%/Թ˓qTdM ED$=y??ǃK,~]P,[/7eɯ;aKL|r-{-7]$[wUQ,2;7zKjgv8$2GIYq8 sb+tYEĔeHpx*5~f4x Lf=49?}F ]2)F˦;31N̳+3&N?--Yv[ԥg(zQ 9>tԋHR?~:IL>vFWX;>&"b,_OܸgX&0%Ds3&H"'X:b%N_LUop_E`mzrڻj뤬 *س\6iINeUD%viRZl1;7溽QS JxeqpzFzfIqI>õ~m-Z){ӹe/3GIeqF˵LKDnRL in.`^w7p; !zMսQ潾my"2rGkPV[;`Ǟ@x`+,, 7FZ=<`WFNz%Y'qnH밠Nx$-E־GiHo0ҝe뼣jY 3 :@+H  :@+H  :@+H  :@+H,d||<òe˨PB oP!TPB Ђ4M0~x[- :@+H  :@+H  :@+H  :@+H I]::0w =-QYO9>>#Ug'x|q6 Q7oHL|={=L?*[e-x\[45"b),p[EDf;Eo ͯyw3ϊlE;=Y>Gͻ{ u[ܴ-N5zR)*Yui=<CcJgE$c{g""÷hp}uc@mݒhoZ۴-OZ_>ѱpB9^_UhtomVE$:غ=d+tDfJaY:G4[|kNI5} * (xLq*oτ-0k*zn,-Umkj(QzYbnMEMVE3"&{A<;vhsEdf1$yz#5.E>10RdRt:+QTINQT5<]juX$4:g }Qn<n1nlu[KY'ux0wԔ,"fw=;z}olߺ鵬no$ϲk3\{4V:K,ˍ"gLX<8ƷFڥ/"2"NS9[<6z#!yk*jהo@`kỳo.SiѨ-/tHXV.O8~YL>~Fr7 %K`؝.yFa3DG13ވ!8>%"Je/./v5V-+q(@_{2tU=[ORgׯ^ dZo<+[aYMUY#GwLVDL9e5Uf5DDd}O}XJvv4eju76,hP,um>"vGnٓWհ˓gu1Tڥfl||&[-̌VL>5Du"wNq)kun1Xr\J4p;:<VwE>|E:@+H  :@+H  :@+H  :@+H,d||<òe˨PB oP!TPB Ђ4M0~x[- :@+H  :@+H  :@+H  :@+H 7ui׻ă<ā]eeUFi?:<nY PG{UA<;j@KSkҳ1fo&l5u[[ZpT(ZU1OWDDhiW[PD ][\fQ46Cc]E]8k[ckSHUwl|{}u@Sc[o("b0Jw*mmi6i]CΜPG޶sQQڻD1:ܯj_Ȕخg6ED"rӢm._}aPOJkdt*2u9`-ٺiimS69Fn޳uFߐ8*wn&yͽSeU B6d]KfCMu>C֪ m&: Q;RZWyS8+jS?[=}+ V""fRGgք-0k\S%OD ,vUlYwVv{BjUY*k<3f19\nUDpT1ٜEk\fY|7Hpp0""ǭ>`h*:;EDԊ9d1HTD@Xds*1Gڽ[hIRV&] IDAT*6+o-_w=Y^QuQRV^-2X] }R積ַNb0-|V[[5%/M6șѨDGT3f zں:vޱxOַZټq[-/JVEfFo fa[8YY٩ٯUl"S6R 6F,*" 3 T:$ "u*vw瞖mru^Gqx=9]]uRVlGmUNIBYGh{[W{yVIEQ[}_CroM"@`fK5tEL%oUz@mWCw} maga:<ڭ(VU$ѺTLE.CafDN++IWר ACNI쪬*mjo7؊*jj|b-nkjimSNQF- ]aCQvYUYUvWӴrc&ujg]D%;w[RRl;E`+(X/v̫&y4X]]Bo5{go jZʹ>aٲeTPB7*TPBuhA W?M<-WZAZhiuVZAZhiuVZAZhiuVZAZhiuVZAZ͛n}gXΎ0stw)xFUz-| @Lݤ $ ^TuSK"`oM 7Vl[Lte2gHlHhRepg]4 O>~sEHor;jL57ftR|s1q|ttktZ i@xVd/*7U;+msQ1nޱ&+-]Y1 J+*RfMm}QT4wօUnLtlܽmmjb}ˉ|PTL9%[k6û~'Tڥ: EŒ_iKRznQi+%"1s#HhI&t("zKYw:xHooXU*4ECf{'|`ݶصΖ׼.3M{z#9%eN ttWGw7te7d)(Zl tt=ެ[F6Rv{`N]gmj7ST,4A_[Qe[9jƔTn=B]coR:|󜈍5#ߢIO'jRg]+,O:vp_Ym3]hJ2t3aq̅6;$Ժg[w8>qcU-yԪ5Vh Mj88*b+̳m(j8C^}naHp4zBQy^׻H4vLSFkkʱ$pD yEcz}kO`\:_ $*SEdB#:xo*~6䁏>ВX,[:NϾkYYY?Dȑ#ϟO<^12s[㻞m{W6%\7; U[k/뵀O &o~&t܏7 @|?j癌O7gcƂl^ccyc||<#cZ[^O?W^Yh\z_я~_[bիWa5-od@`b ͈;'bud)e RCfBeSvEfs]8n8VGAfGLy7حʽL5 өY19n9e7hw,>v#`Ǚq_ccc c%7ߢ??61MqD|^nQbGRb'u F@C﬏uK.miiʺ3KKKK&߾} L&S~~~*#eFa3DGങD""ƺQ}JN."奖ڮƺpiEV]gl-eѾ}C9Cξb%2$u:旳")f~EU)\Y?M\=ܪ3666==lٲtbn"rԥ7gvW\1 /~h4j0._?//VifSNaYMUY԰HNY=S~iMPchu6`/ݵ2\u k1mr{ U465;"[AieiҊ};rJj+;P_7Y7W25 5w(7; ?s^˘| oh.mzzzz{,{ݑn~wsNw+W-Zի:.^ٳ:.L^/>6+ϾcC{׾o:T˴Y<۷q9y/HS7o^{^[隚bW=MDDfggS_WgϞDഴ!ә <29S26SAyKϯ/=xbQ Mԁ}αӺ͛7?HK]?vvĕ+W<(׮D/r_ydIOdFOgM]|PH/QmMWm[Չ:4:NW[[5L*%K?\_Rw~vc'O_Ox_ P8)"]'u+ y_޳dRK:<&덺/OEExճ)It2䭍:iȵpINN.ybUҡO&u?cnцSW~^И1L^o4&N|ôD"Z:'RwK.v ˗//[,//ODΝ;u/GNU7u""tox&fcG?K|ya2t]jghw$ၑte?9R>)=_8qJ:yɗֻf7͇9 ~BsCޮMqiiiNLL\z5=='s 6X,Tѣ---ދ/=D.w}_H\[RmFϞz•څڕBcMwCU+Kձ&GA=ܼ/99֙u_77G?dyw2wy+%%%Z,n B!B!~z<go.w.a駟 B777,wB!B!nƿu/^ݽ_{, f u!B!B ^fAAA=/!ZZZq83n8@B!B!Р?^QQa2m+gخgr @0vX աֶcǎF!Bb޼y7nH$X@  (r{ؾIRh4?d2Yr|3gA!Bѣ üVu>% BqIlL&N"R#Qϟ8q"B!zD"Qnndg1`~xQQQzs8'''''',hB!BGB"@!B!BhhB!B!BCFB!B!*XQ`>Z-q" ݭ~iAp'OOOKFhaK:@!Bhhzc̾fXs1G JD(##!B{¢G7P~X!B )CGX!B Z:B!B!BCFB!B!*0ZB!B!P:B!B! !B!B!4T`!B!Bu!B!B |,BxhypHbeK쭧v쳈؈a_6ΦO7U_p3|1UijQwG?%Bmet*i Tto:6s  CWw̃`TQ[E68URÁaڝܱ" -P){_˗Teqژh#_I!R.0fl*c"|׊jP3_qB\?!s^jǮkb'&x\'^R_zuO]86ek{.)LǟZ{u3b/L͵.T062|%gƮϓ/Μ1,{;~4 %VO2/+s^F3|Wy;4|Wy: Wyٍ`鬧sʟ8ipeE.s,~\u@a` sG[5zxX@ՠIBEp]{n-)L#L Uq5V!B!hhMg2ΊGe$L0s/] #pZ~C$ݕ>mU4~&5 @G.G&-cu|͏+ &Q.6 Nj: ȀZ E5"b}쁥`;ʯ*xR~Ο[U"Sʿ] 0"U.o`݄ژ ,˼`72j ,Vf_MoVឺ4mJE0l϶/_Np$)%p$h8Sp$.O 4ˎ\ZvVcQ1bO7/H\/-Vfh)~LǡoY1''ѕOW{ 6O_2W40zm=AίOMYBi̤-Kvy1ixInIOIyOrn$jM>c{[ :} 1} 4n=XXEΖ[Ȅ9U8N1 IrvOǜ (t\@w1n@B! IDATBu~i{͚/ZG uχCum]X򒞨c_ІQ ?n=Z:G{Syi y(#!v%9KZ) 7?Ug@~Y׺;sۋ uLQMBaꞮ#MZ鴷j?Cw *kLa'i n˯n=Ke^EA:[q[\*V?>jR`0,v '{.X:?I <Ƴʋz]A-7"p X̽E[=? >̴*@[w+.ڥf УG ziT3v{t8Wk;3@Orj =-9NO{xWe *0mu4qvM}Q f2i,տ(y6-+)4Or1v¸,_,%Vex/U7iۤqot?&[3GQ K%Ord&~Iݏ3"`DM6b߼&1jezw3i+p]CEwfgBi&llÄįʚMn)tަwE;w}U%uNy}e&xL^ W`ڻ&xYjŽ6?~cW^E+ 7l?6*~O:]M@^r,ܳ5M @e:F0HG-+c"1ի8Wk[N]jۑSd@iB8{>_FKsu )T'"9y]E~tN-M*B!n?pE2L]E93@Ӗm0ߚ q3֟9l|_j9ܫ9 xIHʷW*ْ өi tnP )qI ="NzRc*;Wy==AWM}]Pc64S7mtm]g;[l1&Rw77[Cۛ ug3!iD@$ j)BmBB"0I X/T$ l[[WP3u H) Ѳ=B2e|,L_R,)Z8Śr'Kwn|F1b 5ؓFہ\{xZRFvU3]V}GUK>9l# cpA>߮ )` '_* 'm+В#bh:öJ+$]uTH b9mL$Tݲ'!EuTvuZ58ɞMc 35/F{1A࡮B=6:9 jTUF3Zˮ뾁+pM3;tgӥٔ"FAҩJsT!4$n RRX 7G 4bHT,%4YolܣA:s!b Jޘ^']<Ȟ'HT>qsaI{ B"2JBJ*\''BC?cİ|C(Bmyv6d^-jfu&cfjSH)_i^8 zu,6n:{Zi3L!.}}YKO^p^ʂ5XyIh}$탯9l<4`= 2'??QWL,ph)Vup0ȸu0ӻ 2ٔ)MÔo [g Ӹm/o0$/?b)l2[v7GHie:{H!sNGلd@jܑ:k'_G2ˮh(؍o&}zIjl3?Y29 呆 sJN4I呔$q P ; 4n{8'_#Sau]La]H ߤpDž:Mmf05vwk%%Lꨫ|{u'J1qx&X:sҹOݪ.k||s;M+]21,O(=@L B!Zș3?o>ZcvFth柲,AYe<([emڮYf=֘O1VbuVotOXk/3@[x~NkJ1Y=8\;I|CV-Yss\O1Vi+wlK#y&cOs9(vZm7 I[przWU|:Tl=J,7TF'/R$.~Oշ(.Ҁ4k&S+ȳ㖤jȰ(|/ !PPiɆ%YlVV#D6շuHUDTin6% *Kƨb7̷l)Xqk+gRYY-u4r5Si0).e_$1J0;dqʅA 2s¶Ex c41r<zq0㪫z!QSjcW4o/w&]8&&:zFV_{%@CDpV_lG?da$UyQV+R̼ƌQJD u? ҞG8D6ZF3{E.Rҫ~}V!'pTy4)b MaGWN GG_K K:SR~Õ+/A~Ax vWEx7%\aE$4[\^\MY 6lh|~e3IhkGrs]~zHP>TjX[TLLk*P Tدͪ J)ZCg29)V/gRL3xf e3elfY=x?\.Ç B&&ea!PYڧɪ 4,T*$,l>aRBLjO퇦4\͋dg59Y1!r[DDBύ7A(?W}WY]~N}][ڮwxv!~qd" 1 Py ;.c:Θ{V̅"Hkpq_2{rw3fq6x(8x'ZjIN:]~?ɉ_L ܜb4"iݝg&'+ Tϐvlݍ4J;__1w̵?2]H]v^cڢ- c:^nps pdSaIgI|#| l7kRC@xy#Br㝶,}w9&x )zUҾ>:)`SC&Y1Uh;{;u:{pMn aR@{D;v|]b}'5s@/8IW'p 8J(GIMZ)ίcG se4)?֓?L"q/B=B5F b*pDQKeA?.3a`9<9zӑ}m[[-u\(`Se|Hаw7} ll%O h~[56ϓZN2jωѧf1;p9VZ:!E >fO}};Xlف>ڿ?1R'1oܑ6XAE,$\* IrJy(͆BqT"";A#nɒ%K,^^+m@ٿ0i7mڑ=g0i5l v麜LJ <|A*A)\Rxn_:N#F?3X*Y݊zG\Fe~X#xM'9˧ ʮD#kr4gSh*S&gL=MQ:E'*4o|G.i>M9f[$C\[մr˝2s(FcO-8c. DM2.0Cڴ:@GKU q?ڕXO]7 %]Y \E=!9ƭx w*;W\Ԑy=;0 9lxr?./LFKi -5vp֡`d.\~b+3Ϝ뤸aT6fsZNs*@[iƤ! ulv]x]#K隃X){`4nSDO ,=XioU`cnUа}_ BeƀES`._>Iw2SoE kE7ϗ~;;ۛ?meUNv}ym-rwWpw3v+qW!c2w^ uZiVk+uR5]\Ns* ^pf3@9?@e!%3`mm6^h+ -Pgܝf$a% v-dR|4Xf2dԍr iK->6g8N.7W:f^+QZVN[ Ϗ%rQ\<خdknقLy(JQz`wk ?bYRIJJ T˜͉1IIoLg)RnNʡi9udϲ nݟ4 q)$$n,X0(2T~(UTR_?1\̲LerB !/HڼYVJF)( rH*ԳwRnu<'fOηk-έ5ܞ /{!/9_yzV0 ̵Nj[-琛Qte.z| SwZ]|_Naz)6I'"Ώ3W'7vmvgwK'~zpwO>wT%in?z4GэB觏F{()|wwTʸӽkĄH Vs 鐒۝>4 %=Z:FsR*T7(̙j H?klseGc ɿP'TO@ ARfTY}|+~K얃ޗ}]o3͘1pm2d] &92z>Xx_YdR~o=#'O~ir TO+z"c"p B!~r@%˂ LtU{BCC|g{^}x:VQƛ%Kjlf c){˨Jy5.#gMr{L-d Il4R6O.).kpsAAнM,F,F/oÒ@/깧S@gW !B8ZK`9 'E1oyKg +`Sz:8`wTH7/#GEAIDAT*cev,%B!a<9a鏏>lX,M{]ȵ[lfxƆj(-kZo卑ۘ@g~-- q3Z)a1 B!Џpg?Ui0|FIsrs=fGGO@_|fZ81zTӗ{;NΜ5?gNf ̍0fΦZ-)B!B!B?CS}w˩,hq|-6,4ÏiOO<VLX!B )\,;*78 ` Q6˧|VkcMx ͘X!B )|,rjk@w8N CijoF!BmB!B!*0ZB!B!P:B!B! !B!B!4T`!B!Bu!B!B C!B!Bhc[h4?d2Yb|!B!~ MMMVu>% )#=NIENDB`django-uwsgi-0.1.3/docs/screenshots/screenshot1.png0000664000175000017500000037605412516641220024317 0ustar mechanismmechanism00000000000000PNG  IHDRszTXtRaw profile type exifxU 0D=EG')t8N'tЎuǤ7 8Bԙ=727ҵwev|flFWBϷ H,! iTXtXML:com.adobe.xmp >:sBITO IDATxyxU?=A$,aK$BF4 C\ϸsfu.`A HC5DHIHg~Tҩ^bw-NU3sa 2K~Z}}g1ҬwƺZEgwe8xYf? }.zBGj}Vᰴw8z'Qc*VV)lem7\!7Ž>y>nvGq})5:ZՕtQDZvWHH2s$EFw9Ή'.=$. e;QBQ6SѪnuRVJr\gH$em$\6*t2fSF`NvDhfS*nZNj8UtJnwW)ujnF=ۿA*9,.NnZmNQjtZJɈaYmOx5̭V"Ύ;'ZS1#5d3YK(*rYzHP~Ob=[La\mfuGlVJ.ک;""z* J r٬2onk"*96;PkT1LV3rZvňSiujt9.4HPf89S5mu[DEՌ;SP*PYWjNE$ɗRSasHJDL!R \-Z[MM:S]i2)M&Rej)D1;9fjZYDTj""BCDtv6b!xijNn7ገԩuj[;ptqֻ VE.fw1&~!Lөhv Xֳ*8Y}\ŋz?IөxQf#91Ċwn眈nsSk)T%qADG"{`+6B`LRaxuZg'ja{ BUjjZ}6`_67x0 +dZh)L\v'Rj2 Sj4ef`s9lN"FIP۝Ή8ԙI%ΉBqŔ:59,tBQ>[/.K=BWRccDcc.ƘRz^T0"2CD0#]6BiTJ!cLTi"jFNy wRlNr9hq(\y1"=d9;"Z4rVu9tI'[/2^l7mm&Ntr=㸣lhuZk.BODrX=˸*V` <ewVV)HBV9N"JbvJ"Ng7rttZGՌNv7 b=I#qpeKmژ8N TEFkii6-]MMzuʝ6KJBP3bu:eR1\jyUjWGuLhZ휈,v^ۭv''ZQwXm.N J),*\} vUzNgo^;,NއYF;TձLf}cK36VVyz~uxƧ,;&j(*\??%v2crMVw[Us_bpr V8g,84=Xu0dO 55I褤k}%qnz>119:::`W?"rup7nw}MD>]N'v~w|VsN( vNlujN(]kΉ):FA.΅OLZ:MW~tVoU>bs3Z]dʶv 6H6W3gJ6g3R6NBOCGSƕzr.ըEky/l6EK_n7uxV;w믿>+*F.tl.[{[kU2w:[[Z[Z6~Ymm6sb9-VљqtZ[ZZݓwZZ[[zĖziDXZ(SW\|(&T) ,U"f Zw.|쩒6G^ҥm?i$"_w޳ k2h8x^ѱ辗^{hL QWù\S΄7t'\.]*Nׅ zfr}~Htz;lYyf.[{&l &d "gZ_޲ctBX\QODDDTW;DXlzNzrblTllrfEw<4VlaK˭DCzq3StD:]|z%U&YwZ5 ? ho8𚒜t*5? SUjRdK×_}ŋKC?Ν; ֭[ssse[[̙CD'N,(( (9x]eZ"aQLY7y7ĥ_ g(-?#Q8X^EDڬ9Q^[6/ˋ-lZ1"h%?nmʯCz٬Q҅SNgSSSss3q d2566:z>*Ư,FɫmmgfΚv˗O0ow߽{c=VVVkvBtĉ^tlffK| UĘL 2. Mﳹk9^¸16^Ev{~=637K뺏v2sSs5Պv)2QR^^R]T,Yk F߳?قw'r?LQy͝;%)!|aqOU.HؽKɣ+2e׹ ](kkZ?KU񲂇ce,kdd?MMMuuusy}}}ccdjh;/9]OV>lРAwuן{oϞ=?lv͟?wyW^xaO<񄰗{^x_|1BݫBq9.9m;!2wi h,7T}]j"0ty DTxޓ+ydt9!L\~tӦ'䧅Z J93j4iS'M9);VKDw>eסZ:4--)Ak?VS}h$0߿e@ZZjP*qp%8nN$J EuuupʽM+vfi)?ǜ={v_o{Zj~P(BP(KJ$$&zފ0G),,X!޽ B_~36yY8J@dy+9_ р$"&Cݥs͆3D]ԦXY8;Δ<5̼KVoih˔UI}4oc(I_lQCDD6egΊeϭ?F4tG6?^gک1D֒7WZ}MK'J[ֲjc'j$zP2Jvttt8F3`%H.6w{y13OzG~QDnŋ®XNƍBm5\ᶶSOtM'N8q;s`rk5ƨ[f}!.Oݦ6=v}ə:JK!Mb:WJMK%*6Z Z ED41`-6oyeK֬/i$jZC *뙒9λ9Ӹ1;gqҟ?|DldVW]ҁXX=}DTnbj%wXOW+Ƙ$wS*cT8QYYӅZ9V=i`08kHÇ/\rIQ(?[oU]]OlذB.zx̞G}f4L*HǪwyTJ4]MϊyFH,>C"ߘ.%#aFB"ʋ ?\z1:μߧgn\NDX 菟fci鱪ZCUXZZ]o%g[ڲg[Ѐ'ML$+B}8wy#*X,uuu1]~.T.|M6-^XR^҈x;{^zݙ+^ZnYkذ}Yb-[>9sO%w{t^gBeW"e4{lmzڝޅokqgUCj+Ԃ,ǖd4?ڵ3_ne 6\[o06SF"QbޤW1}5'gF ?rί[~"m̅٩)ɱP.f b3]]tjKCUi΢3c'X4rp)\vTu:]fY;\h4III1qlv:+jWoT xtG5?yp7_w_rog;.o[]YޘQ;wWd5UNKDdI*ZMd53WLȓs vV7df4 Ȍ%"[qar.(][26/)4Xzo>aC &g' 3VH,ZU'nm6+-56.>=g+]%n݂8"t:k{{䀸8N) Я_?N^dWd t:x1 Q/dz= 5DDr87j._W,W?LMV̂TIJ3y(I%[y n:/R?[XKDFD(:Yέ麨z"\tb^tL~k ⑱V|uKտE߫_&=[is& \ zGu[kk[GGhk8(&''tBGGGkk༇XUX¸̜4":Bc1~,f’6dJGwscȺbr%UoPVZ>tS#+(&ƪV[ZZZo;S=Ij¯_=٬'٨뢣c%zhnii6[bb['4(wxcQe\xXpp>}+TxpE8˥Kf\/2w$g6$+67 ~C~ r8׳RCQ/ua\1qq.LZ[Z[c*Rns8'"11XuoA.p`j~, E=t'o7 +i$3.sn;v7_uI\o F͝;BT*[.X X3 UR0Qb+,&o糮/3Q΋apsg~DC+ k zSqR0"3՜SWş{l9X2"`rw64 »لExt)-@vL]3 O2ԃLc/;<"cU ƒΉċ3yL[av '1kɝ5.rŸܫ/Ļ =zDgү\.$$Mǃul?Y {2Kw_1qsH~`OmrPa@bb}*jZVjj6[VV[[kXC3|J&Ҹmu#RycZ=z.Zqwރ8.c= :aٺg#z7IGH@?fJ28'b-Ē^#~_ϟ3gί?*a/Bttŋ9Qff9sj >bt][o6lXTTTCCCف7onlj:<w}233bNZw_}>w}c֭CVV֭޺zj5\8ɕ0wl۶mƌw>y$13zø8.8DṚ&S(aaÇo֘f3ol1qlu]yXukGGGJJ/~1c7 0mڴÇGmmmC ;n'xS6:?c*>|w}F߀z#w ֭;wɓ'Qrrܹs8o<͜[p'JKO߿?5G޼y/ˡCSF##JII/`8Hg?{c=/y?Ǐ/++#N3gΘ6o۶ms_n˖-oƯ_|׽ g͚u}to//+ XH&b[IIIΝkjj"sv`NjЗ[gt/Բe2q~̙KMMץ ǎ=ZRm߾d2xB7=j}w;)_ k%%%[n5wtp"blܹe۶n-@/^?qYnU.^p8{JJ*9Nu۶ ;ٳg_~۶m[ly DD/ɓǏs΄s~K ϝ;k 'XU$kr7TQQqu }{ƍ=jZd ,|$=-]Dᰯ]#GѨQg~#?x͚5$YdHGIO'ñvߎ$Gyl-[FD/~_޽o9bŏ-&իW 4]XxË~7k|dr9׮P*D?-:y{. XtGqȣQ(خⴚg.=99f=zjkkkkkdd~1*tmooݰaѣ_xᅇW/\ NIIUUG+{!#G>_vÉuuTR9Nݰa/_}UqE MIytѢ1c3gδ#^xyM2;p8o/VUBC|p*h=جY-ZwgBѝJzz\p>pڴifV4S**oJJR*Db;}lr\.E\]%{UI<9r5u:]jj'1rG{{oSR^w]Ξ=k2 :;G 9͛70a޼ysJIA4DgtܻiiiߜNp58pǪyKqrV:_~׌ C߸n""ѸaÆW_p#aS!;O˯jժ#GT(B]cT9%Q9fkϟtNS:thѢE B݄CUlk׮]towދ/M2Eo|=adQQC?LN81>={piYm[tҷ~kޯo(6iҤK.}g.5s=uuu.377wرDjVk{[{FFƌ3>2"zꩧ>㔔ӧ kjj]hѻxӄ urebጕ%"ҥKW~!c4uT\.Ĺk(Z#QEG4hw=63󋒒'N$ LOwyf}OZ&MR*o1 CbbbVVĉC|ϝ֌曣G&$$7nM7]_QQ񗿼uk$na 7l|o#wFᠻ_nNԜƍ+++ǏϚ5kVI'N_2cƌsΙLI&M<ԩS'Oh4=駟(+t*J*s+wJ=EqF{ |ߔC-RmV"ڱcG||<^fMJJx8Ee|ntq{p(*>]zu]r$Y OpȻG! .IC3~v;3<㔤V_ca918WTqDDo7OgL\} +: r۹&={/`o0$~'!>>׮Ocft'|nXzT(w5[\PG>q&#|EuRyAܑ$(dOB8&,}^N1h.[0UͮQw~_׬69tr\ĹǏw)?s0(y*nDcǮu{ SY|-͊0 kvDdm^)"g8]וA&W<]X!Ap TZK7zm0UN־ NRTѩp2Gr/\fMT Ȼnb J~cBGO挫/{FTέKg?0OZ*zIj*Bs.@팅:?temq<(pn*D륊CeK{R$ˢLj,..mɉgcQqދ9;L/ Vŋ/k'&O]WCDDޟܿg#Z{'vM6>7 c[M[rg>])ٜ.{ bXatmjѰ ċ2O=< Det\ftXD;''+PTדʸ1PY%хN69Z/T~n ڿ3 k d  kkk9y _5\SEIzҹYPNT]v}کݍnBH5777VU|ѣGhF'NlkkBDpBŜ9vntFgϞZ":tu]s@oy9Gq V-fG?aS<|のT^UwEm۪7,1l۵kۻ/5Ⱥzyն5 -۶pTp9Z/Q]kJ>}5Uz/? eӦDuu#[FQ]]U}&W'Z{>78p:Dٯ}6՚)n#99yС|fذa>%%%y11UV7|suum:4e"r8c6m崴~]z\󵵉 ‘ 4h5!!ܹsAs,>ln3K^x`ƖO-&<~b|-tDC潻oZ?^ n{B+/X(![tne kڬ&zx=$LKJ >-o_ @+xYDUlMJ8PXcBIdr+ѩ??_x.8544DDDZC 1t8q"%%ERjj}Z111F"U(؀LBќӧO?9i#€ӑF 6]>|/$F Gtcƌ63###%URR"~fٽl6/0Nt:ݘ1c qQbbŋM&錋lj222c.oUTomFqȑqqqGVM6}}egg3l6NtReeeZZڀ\.(//;<wGaTI7*cHBƴ3zof,х-We|g_E=;]}7{Rl)矛fT<=<'N{jJP&$&'O8qB8:22o!ĄnjnTTLq7;qDCC#;vDd鰌;V$q@aÆ744M:egϞZh޺g.c)S?~ٳ$Jfs7xРsq'''wttԞ?OD))).믿&q>|&& ;6n8P+Ç*V599YZ_[abDa1 _,p\ً=Z^Ʌq D4 =nМ67Ss.u_NJ=lx޽_ z5=pY:;$"!Cjٳgm6}պ . 0`ҤI/^4 #%%eJh4UΝ;bjnaĨQ⯉/++oOJJ8q555\] #""Uox҈ST.tI W8p`rrĹsm6OD㍧OSבcǎ%Gw0lѣGl6ɓ'v133STj4}iZ^__OBn~uu5-D=]s<2-#6p@d͝Y YW \#wޝ]8..Tٲ<3mY7~zOAO~6Up j_N:%TQdddCc}njrFh|SK.NZW&Ο??.+bQ}}ĉDԔHDB#={6''g߾R_ C[[7S ^ IDAT)U#GBC:u*߂ SՍ_`G'jnu˨O>;.oc̄""WNQQ2нԷ|#}˽v2dn){ yp{o7+~ˆcxe[Ur>we~z?3 V?Z{871aU?{5}%swp}.-|,|WU!D&yeyJQ{aq0M4pqmn: y>%DŽ:{n0dd q.F*G`Ʌ{_ l|t^]Z2{ ]wP,PX2ӒxKoB *qq^¯G;T=57:z '@C'% 6ND@6̃,u*i畃srK 0LWc4a/DśwKrn콏PK~xh Kgm_CzaCj Lr}X8& ~8=aBzaGO0U4Jy\&$a>/C= V6?K4^썇y,VSi$k6|GSALח+&/gMqIIA&Z<LګHYýZ4\&=ʏNz;Am U}!];7-8L g;\n;{.m3^yt^OZ _}z~H+pA諫i`Tay)M+n}84ug~c qIǺ ' N:Oc'DZperzrYYY WPyyy5.kc^Xo_(+Ή1-T{UѼUyZ <'0Ux9߃2LLr/ ] z $ܧpΓ_$_a!,I+YTi{u_a\EsbC~;rNr:l^TEE_|e " I+a}YRicZL|߯_s5#{;rse8x z?u W$س5UJ1|."ԬXfK{ЛaX ;%1XlzuuXUHDdٙ-(\,e)1]^Qs:Xʲ*_gpn৪!N:?p드b]jl6&iݺu555ZmmZkaju^6?c"mLJygNl.~ݬ""]l6&1Vwԥ%+vqCahhAA zb8ޫwúEܓ!5<{綾f?|͆5y䨨(N=Vg\7+i4[xK'j~YUg_t9Euu?4nvq&:4&<cŊ` n|An'--˸"b=["#eN7oغuɓ'{Dy;,YaĞÈN[O0h+di=펶 bUc{x?(:jyըTR "Dրଢeld&r.sIvz}^3r)sib0- r m=!CDD7N%[KDFB8Nk!s/)JŹ뉨g\*N+$O~٫/G!x8^SLV~\|x"KO5?P~r'3r'ebۇ|֭[}A0A2"?p>-SJ?ng[Z:Q4M۰aҥKW~&NњTM=NMݹT HDD9~_߷FOM=&;'Lf6M4z{T1'"~ EXx6o%0őGd>Qp­Ddaghۏ#}D;:8GiZGG~UW/[lĉ-ۿo?跿>o(W\NO?oK/0"Y_}+ѣz衻k޽{ʕ+ku:TÉ'_p . &Mf]~W\qřgy%T_?a„/xܹ't 7ܐoFE}م ]r뭷N8_`Aoow9fu|[[[_>+rJGY(P,SޓiM b$ Nw(J!Rr?;w$1V lX9M4az?Xۭ֮[a,"fޑ<ppl ͜9sڴi]v٪Uس>ϟ?? UVaÆ]v1x h֬YMvy~<zp<76}FhѢ_~8Zr=;wO?/|2>k'?#Y_|o8ZjqwYgkz?]O?_|'?{e:s|}ET²oe}hI N%!5lS!DG Ow I0ydyў6#P D;/?/.Y9-hLB ]6WDdEDV.ID}z#+"pTKcbA^Oۻf͚#F11f͚3f rO2M^y>8+V {)S%.yI:::.#QEDDlbx[2wp֭ūsUs1U_}|GD===mmmF:a 'N\re1MRWa… /^ѱw%K;|uF-7nյqcƮvzOh- Ҥp[fQGGD4ڞ},);S4VA4=LWrxB.pdfUu钕G DW ݷlYI ڑբq^"[2֩'\}B.b`?[g܃+$9qT񴷷o޼ޛWלӯV|ߓ,=zE|>_ȶz+JD\f%),rOH@X\x2eFqQ~󄼞W^yY08}H$6P7.n`#npWy?hUGJX8%wؓghd KCV,HQHDo[w I1p4b&{ylW;|967?|>߫r9ٱcGJmW]tɒ%KL;m۶}ݎ5/k>k+.-T%FkċpV iphƌޥ3/b@9R8‡Md( | (%jNfpD+nYnƍ]tѾ}OGі-[ଳo>3ѩϦ@OW*L}”7^twwW3ƶ7*9Z6pΝoYVX6{XhѪU^}եKկ`u,;t߉+KjoO>e˖;CӴ۷Ϟ=;߹(vMv7x3f|k_ɏ\V3g}2CGD<{7jԨ`0O?[e`y`0W^}e޼yW]+Gz?i"Zt~\IG}t̘1@ /ܸq} BW_}UW]5v̘mohݺup?Gdw?!۶m6m~!ڸqɓhkk#'xbܸqnezzz:::h䓊9W1QiVG6Z_]8 ,]WV+-_reᖽuORwK/ݝ?|Yg*38OƱ>l3UnCX2O&-6+?rZoE {IuOr_._v??w_+ᗽh$qMB0lxX#nX ^Osl'?ɏ~p8|1l{̽j8JUq*7FCzjp3}ڭRGu969OzzzpINv[|Z5,_-2e+kѭpE=M6 a@9 cvùX7Ɔڂk1!x3 5kBfh%q*p!:5{8Ū9cum/:kquXqOlx28ڸ\ ZK>ŕXҷe헖q*慻ߝ*YsxYz:r` ҉x!CF: 2O$*R6$sh<i!sdN_gb%WPy_ >Qϙax"xʥ "(!툽3FL^\]1OCaC6laKwe*\Tԓ0όatC72Q!$M#E-g躞炾H~YgRT:ur8j(eVDdWd2tȈS&Y?fu]׳1ASCi l[n8wxhVxSfU*c F>&{ 4ʫKk8=6*D$B'x~s"#C^R ADԀ*DQTL#7 MNIrY^HD4M+HmE$I $ +' WxQYR' Lc-(Q8krn[h2:NX5)A^ IDAT5HJZ/rc}\Yayu;wJW ըtٗjW]blH}B\s5vfh"g% U]M"rhFz"6D4#~-a^{tD˗K`*ג&;=y i\U,\:=Hւ_9eT4# UP< %y^ŒQ,XO6I/zĵJ;/^1J$bSVhӖuo"\K_3*Iv!b变+Mqca ^ 6]վAeUݻm6mڴZِR2=lܸqU O<1n82===D4yIquO;\"mb7ղ=XҍLPsjZ~mw"̩f_,~ G`!,hj7k5p 9C嘞7fʶ"8/%kvK9H6vɘPO8n?:\nڇ?\t-:mzTmm]u$~9s[^~+ؽ?2 ֯_%8>O:Zt=VTĵPʖ><믿NDrʜ9syP>d4e9ښ=LGĈqı^#[nUs0N F4~w͈N8ӽggԇ\fUSO}e=+VXV@\Yoha(JX@WL4V}AY 7:0j=Q8joo?h݌۝FX )4+]r9s8iӦM81Lˎ=nx5]]]gN;w]]]KD|e^xau./~ׯ_e'tү~k׮_n!ŢEϭ4--cؚ5k-[vi{C2r;kgo./ˈTU?y '4>a@fϕL&0mڴvy]]]D4bM:::nٲe'N7&'Κ51ch.Xog?{뭷dʔ)Db̘1-馛N9wcƌɟ&LΝ{I'p zĉ y*nXգL:V@hkHyg})?ml)כk+le L/ eL""+"1̤wMDdU1LX Pikι_j>9>/L̜9sڴipxgϟogy?>S|z̘1sڵkSԏL&3bDI3>h%Zc=6o޼;]?G]s5M/K꧞z˟~=u]C}ll:[KH`ñj^po_jߴ{իxQa9ʼexp Q>5 ٌuK<I}7!TVE#&6t, ?s)nfH=cַn31c<#SӧO]fM>cY3(IDiwuW^aÆ6m3gozkK7˿iDꫯO5ʲ 6,\gW?sK,qr?]s|I\e.hL(Ȉ8zϚgϞJؿ3rlMgeC_%C7 ݒC!)FΔD@$#ej,+SZβ,ˣq;|~> X` 6ȣ4-xrQٗ\J_K2oY%^>TBL6$h X d4^K~HT2-2ɜG[?iA̩R4gx`, ddҺIAY$xLy2XV%Pt#dKOnݺ;waͱ/mlbYV>%?{Ͽ ={~׿Wk.]v W 鈈1FD+ >_|}H$׷wlʒےo*B:"j}U$Nj̺V9X@[<Ɩ-Su9dq)}&DRL6Zl,Ƴn"|"L#z0z:ħS9ޫi S#dPȄQO4뺞 J[h2xvb8Nqo*La頪 멠3QU}G!PGciSӦeW$IӉLSCnJ& g-"^%!!5h lcѳfJ>p|sow;pB5\3cƌ6l(˲iwqgu9y,:Ϗ_׿^L04.u Y˓8VO$q#FpcOѺgMDDa_ 4-^^=!-2,H)/NyBmKꉀ"IDDUDğ ("%$s,=}_? ZVV+a4HTDPy`Oxh*SvUf?~|:9L"zW.];4뜾q!mr#=rVX`?Zƹ^f: ɡ}p7@0ұl#^[qX_"rTP""mqZ%;'TL2(Ddxƴ i-Kefx:cOe?=?O>[x!5#F`/,E,y^'3jPD%HMEE%C*!3.\XR`Ϟ=7p 7Pv{{G6orhdGWV}}Xk>UlP,jm?V{NYur5k8AUR3%Y.qʑ2UUVHqI)V`9 jT.5cyL1[Z%C*HU<εq+aU.9_*kr\uk>꾑P sZ\9%p6d rcΧ&rFUO;Nws t2*f (KP֌9>9ۈX~i+k~W]vʑz&kޝ.<}:IV~ծS*UU|*[ױV{zZ6spX!s\q>F8VmVOEqǺ%ɜ&\EVkTιw=-l뀫qθ:^_:̵mQ&! qCjMg,io%' c6PHJ3-:Wv͹"szȦUL{+ \fnc6S;1mM7W}YZ5#lrp^n `'^&Zױ V26^Vn3Q_.@2A()V_k+VW\)c%\űt ; 8?kN}Gskh|I iYEV1YrCtV1iQm2ܱ"cuj0FjleI+hp[逇qzLԴe| $AATe?WXH  7̄e))k2WQV ( W\95P+]G2FwgK^1Be#UԶbvB2ƙs㵆2aJVkKT4%tEcuDŽb )S[@Rra詀RmZz*;jUC]#2nRM᜙K3x /Oe]"3(UY+S+Qo koo|u%\2ua{q,XP65UY ]σ#c.kQg>Y$Q`B'# ڳ*U'^I$QYV&(~,+$3SeQEqpn%AEV?g 7-"+$UY1 _s=͈Hg#3ϬlH}~ʊ˘DʢׯKlP!Š"EE9"2ӑ&WS]3J!U)Ԭn]3l\J_ T:M(騖c㈑- Wx뭷VZ5cƌ$Ѹq>O=N'i޽F8nȑDߟ?^3ʪcnJ!UV|>D*WKdg3O4AQO=͚_Z:*7<ڒuS_JH(ij­=vr15GםjT{g{ɓ'wtt}{:u)r3:::֬YcYYg[bEc=?[Va0裏0 ?~+~׮]Ť \E)FıNN#d.UTaP~ YRlq%jY;xwPPe7U^ =z2$K%1 DҖG#!e5<_L $syz6MBITcxV?LE;A^Ƣ,|h|.$e5Kf~TD2 j3s&/iiiV)KkM pӎg %_$Ga߄j)ÕE1#rO?O8]]7n\;['p‹/HD~-[&M'Ka5UY괕s`eX"V m::+$m̾JZIh ˂(riZ IDATY,3M%[Pg%IV5!Ot"E?Ys+R38avO/}i牸SO=F˿˨F3F쟿Hg>mi?G)BV6o;OS|$ѣ+yDQ2eoX)_+lqӡ`'ұzιgn}ŶmV7V6$Ɔ34jDkuMՔǚ۸qɓhkk#'x0AOOOGGMgZ5 ݻM\~_"yO=\Fٹq}n13osO__Yg/[j՞={YcƌorJ˲*{~dɒo{{駟;f;c_~yDTU)8sUϒ[r5Nz,\=Mպ^*~ 0H\WLPDP:L 0$2֥F:u9paU sWPݩ\ʮ ܼ9{7ZXczn(oW6`5Z42.%*)?KŚÞ%{tYv8꺃gsec.9}klvX}jqd8g帎6 \SrVzƉ0cfXUJ&썣)Wψ۵۷|j\ٚsl";dž^s?\>biIVSXU:#Flqq#j4UR#p =:쮡'1RK4qT'j[OwEX٪Ӻf9{ulp\\,kW5+UJJVdž s<_شinTϬ,npZ]aVKW9+_]W6*G˘֚UvgFqT2qNJS͘ksVqkYg/>0g1Nj*{6WM:sC65Ѣ8cǎ=1kH~=<^k`fai}Z[33*7:O+_I[__W¸!a}B}5dbz 5W3R@(5xk/ xR2ܚukBj0#D)63aoԲ|e y:1^oC.ùϩ^Y+H E4SE#8ٳPu͆t!jC{M6uj =hJ蜙rVLL 3 COoSQqV8q5tHDDdce9X;4f>.3$qul< W8a= CO3@ŝCqêɖwel?O%ͱҟf ܻ8T~Lk8+$UYADdEQe,cZ(yԴEDF++'1x$m(^51(E_x+CpŋAM {=Dċ1sEd#1]M<91f:By`@3ƲJ,y\2g1(xٟ']Y\<"SK?m9=2M""Ӵx_z]F*%IK:+DSY$T ^" FߝVl!fY1+dd\In3+ƚ=n$o>H2LKOM%J< $rR@1i$ o4Seq AUXBԀ*DQTLt" xj?LG}ޘrRkǧ!CKHHij֐ ELQre?lWOĢ`H*־|xA&)JL"!JVl\'},α5C,g+7\%̅+Y:XϹm]_YD?J(AH҉3Ji#73SĎtPx&rX% U$U# GHFS¥̂wc&KUMxƤ#<~Xg- +5JS˦9xr.ZDfFJmi3U @ϭ5z׷w^+oӴ;ߌbo߿T¢j-g2Y-S+:G Z<8d{81_O?}̘k\8j Fa6xB7O-Ydڵ?7o.4ƕDukp0ƈ裏>zG?䓯}3gcHa@W]Bv\˗߹s? /|ᇫW~K z{{5M{_ݻwĉ;;;먚J>)q6CG܋]nuo-2^zi**KUtJRI\{{{ggg{{`aq.Qkq'_M/vܹw߾;oԨQO?ŋ,Xpݻ/~ogW]u9sGoڴiůQ]efJF61* Dy '4vS(܆Խ lbJZ爸o~csE-Zk_ǖ[ַ/lƌD4bM:::nٲe'N ^J>8r^lq4-BU/~g})XKࢾ`9Z9]~~ǟ={,Y?o~u"9siӮ xgyfiΟ?H8fKfvMݥ#Fs̱^C b*th۪61#ƶ狘k׮b>`옱qt֬Y61Fk֬=3#p\GU`Q\wbcgϞgϞNѶlMgeROfc2_{t ݲܛK! CL6$LGX$x<(deCҩ?(0s1JzƪCG|H3 cYX<ȱ.?Y!u*Oс6Jh&裏+IUN2x<7o,0Lt#5lo/Jr-Y"Yn*sGWyf]= Xِjz5%ih$/ܫ1U95yaf[&K߰'V&FXV V&$C>=a6 ,DI<AS>`g/~gEٶ-woWUMߪdEPl( qŨ%I_gf">IEQVcYrQI d,UBЪ=>ߵj HV.PDqn&_W~E_pH$I(yC)\\'Ky"qb(kCt,-F"^d6l2gQJ@ZD3P%|AD_ "0xȹ.9Q7b:"hANi2cUI˱'==i+ִsSMHS X1] tP\cL2MvQU5"R(cH>=No N{&>՟LǽJP"YUUlFDڻ*Q\RªDCI!U5RxLeEQ27`j6sȻxLk.(w}hZͫ)Y 鼖 ^9rوJDqO/$pP/ j0fCqTVy晵k.\𪫮:s_wuoV_U`5BWֻU.6Y |i6Unr h` TS9MI֩ߓHrUG)qڭ)H+U"/Ob~_MRTe"N1fM{7ҙSոGemw "EBH*Ux8$ t.gs1%.y}AQٔռJ H sb^^W2RF,X0?\U[ouɒ%u|bcCWf:1)ݾnGwվgqQRӴj%[} %刈\NsqQ(T*LŰ/Ḑ`>66ߐDpwq(P&2rX2 JBi8ҔT2疽<'J1ږ_A" Uʩ_/κuN?t[n67yW5󟿼pN;wm?m?4r:bbX9< 1ɶd}\}}v]mSU)(g\^@.+(9"gu{C9QrpLш(Ew06R-Ő*JH<r5VHd@\߭Fͩxx`0Ո4%Nq_tS@(#|:Q=/ODP$sŲ׾,qVq 7f=h;EzNW~  &ucƍ9#"gj/oM?Ҹm..&HIF &>̹/ !p2h/ Q8A&#nsǓ9D.O0y"> { Ō,?y[Յ]9@Kb1"*ӍTn4k1U擰:d^?Xcݰ `ggJnܸqԩ}Uhnn&K9=1{l":3ҺѱkkDtLvj&B˴1""!z{RQdUr,zHհL}'Y۳V꨿QQ">2uF}q1H,U{FSZbMGY̰1vn:%<؃qKI;fMQ"BS5n|7s5"S|D.iڨn3 peBaX!9c*1-5YD},U9Pj=*k@:w2 ]yGP[\J;z @0Ui1^KMz Y拠*;AmZ`c*/i5~?/نJfk}"`ܬ*Е2e5.hUӫnȡlWz!k n!*La?rHPo+ԢJջfMʧGUoc *_Vi3)?֎9jWˬ ؀2< Pg-?ͫ>TJ;9koѶ6ػ.m3njMm}` k:"Yݒ~8>%85)/.,urGE]8^S$Z# ]jZ'nd9N/RVSڲ-y63iҤ#G^zʕz9szzz>Õ+W_SO9-ZTs{.Aپ|>sofΜN8~̙MMMaԚ.upo?4r[nOlܸs/[17l0Iޚ‘HUղIN bH9~᪏®@Zv"UH=&J1D d+ܸKO:{<>ƍ={ֶm,z嗿/ >ܮU`V } #nj,Ox&,"Q8 XSSӜ9sRe-ZjW\IDÇ;wn:^h믿^˞x≅ vn Np?3&"sٰaÞ={}fQ#wO8O3&sԳ^*6fY'N; 6u]wkwjܻE9>ʁ[05Q85i{Qw?T]u]ײAٌv=]9tyGMo&cJsz.0r֔5k׼@cǶyO>{o{="6jhMӈ褓Nz͛SfA{۷Q{{:S֬Yۛ}=;qd M.+s<VÆ ?묩o&KO>Æ ;Ìwmcێ;G}4D4eʔ5kּM>^;c֮]o>"z뭷DTc9;묳̽r1Fk׮=39P~ICqD bNJWN(H" /x UWEQ]/gxQ.hLTv W4"|:" n_H?cJ6e- @B-gEQ8t3IL-\IES#^=RX@Jmq;?ܽg7#;>7(F 555OrVWWwgggZ-[dn>sFlav/yzIOOw!HFgԨ0kW"bGնgϞ/~K7tܹsFG}Ѱa8nGQs#8n馩S9kѣҕWpŃ |]]Fs~3o٣DSOZ1m|M,g >3=z4oO<~|SL馛cD# 7|8wK4{+bԨQDԳߛp҄>*5$˱D ~).Ĕ)I Š].r2(j.Eéjy5/lTL;fBZX g5-c|,*J*Hw"_Te\2pFQT%)kj+gM*ygռdPV|i5d5 ;pa ʙ+ʈ=,ogN??g%cDl׮]Ƣ._~l(v?\qG9O{Qu&KJX]'۷ @DvaDtvtt,]tKF1ڨՈ>#7_W;w|et/啗?vWzqky}zhVu׳r2m۶N"I&O;W.MZXȈoV7~258$2B u'Cp(oNƣI%I+{E(y"ҲԻٌsDiy-L%=."ATCl]Y n'IR(}^Mz瓣a˶^1,佡'LiٸDW4[UUuf,-ڲeQG5bĈ={wF)I#xM3jBJgDt#vS1G>~?.jiiinnk} m۶utt}￿m׳gF<|F=;weˈhĉ۷o'bӧfջv""ؾ}#E駟aÆÆٳ=sSNE_4*lnj2-mSՃk$xi%ᠧ.qR$bPJ6!NMCŚs,ˉtNM%AMݢ5qWsecgnBW9NSѸi[+g>XE,~fwrˎ;֮]/|9z+bΝ${=]9gN#saÆ757Mrֺuo7'M|G&Ovo>l3^xy:;; cgN:M1>CD4|#MDzbӧO7'i>CD#G4iڵkk޽g5e[9g?/?쳯ڌ3λ\c:fQ j8Έqn٣iҔD${#|]MIIJEԄArGqPR4%ļlXMē\+:c_֟JP:$QjOʧdw؝J^K_&U9 &\ޔ_вpVGb`TsCnR'DDӋwLˡ#-l=O?=cƌkfk֬Yre{{{}ы.sem۶G5PK:;;鴹L/{c5#b=?'4*|ꩧ$Ijiiٻw?NDcƌ7qw޽{ƻO=߰mlu[ZZz7|qGqĺ{wfΜji"7| ՕdfΜ}˗=XJk3d3p>g9fܼyZZ_5.]K/7MMMVy?oqe-Zhԩ/]%MZ[VZED-ƍ3f~^%r:aObƍSN-Rc>7٬_ q Ţ~+RJ%\ %JϧXنaYy"|:D3G1ȑp:ϹxQBb>qE\ɫ&hef5#;<(2r& S9}DL th"*TQJՈH<*#0tǏ_f"Zti[[3r3'iO'bżF3טK]itK{ֆٓR\;k/2FuuʏɓnjS:|ꅖVQ6*wiSJH!;W;kpN̐1G*A\l5]uUO=T=7o5ϡ#lÆ 3gc>o>&ښ}k9H~srɀ?mZX"p 0uSXa0)f@;PN}G([[;.T^9N>6RQ+HTJLjby`/RҠj ̮GƎš&ΌS*.k(++fN1j춣25ST(mdBKΘi1^%F3 qYF65y#nq9a}+,'̺Rui؁1%a֣՜gpΦJe U-R?g/xh^%W s5``XyFcD^O;Tq=\dXd09V,Ve/mlO6d+ae@AkknR,nMs~D].%OmL78NnyA(U;?P~8;v}ԭǞ׭LXT|v[P>?F5JHNwz#@0;dZ+KGY(YzuU [S1tɱ:8kpfR~Q 4%< s_'JS54V~Lc;mb+QՃx_MME|X(Q9 \.DH1Mdba2ʁ'$(f`Ŭ֬:[Zq%*Br69Vi>1ؿlP%LH?cD ZZEYz,""]ՓP55(39UU|H 5RrPTUͥH(?|TṾ[WQ> )ޠ1C?~bfDşL<8D;^K!9n.u޵j`mBeT89GDܦiX&.-wZ%/OD.DK版8O@x_Pq5%ᤐ'"NB>-TLRue#"RAҔ+d\F,zǕ-bl@ /X ݱ[W}*WPisӊE/qW[z ͥoΤBʶs f05,;(WU:gb1Ug߉`sf\c|,c;V0+Jxj]MA|6P4"-*k^VƉGKFS9""5IG+d2ŋo#F?lq'&O2wy?я^{mHZ~YWUmUt]c̾̾}Oq{v?#w_~"63.ݴ;qCⳟl,{~ݻw|7pôiӾ(FpN8/#>beyذa-[VZؤtZַ n=έВ9GAYlUְtZ["g=(}W{b[lٰaCgg's1svBqs_6l/}i߾}ƝUVg?1c??:{{ʏFjϕG[*[ VJ4[\bHd:+^ynU=|Ĉqmٲs{'1bܹ GKV"r \.WҥK<]v/G`/㎷zkҤIDD2<ꨣf̘ADk׮9sE]|gʔ)DK/s=ӦM;zzz.]zwtwwa`.l˖-۶m̙3J"9]wq}T*uwwwu;.5xf{؞*u%ӝmUhc^_!p!9S5_e"zWܹs=Xܸ}qCbҥ3f?iҤ&"OꫯQSSS,={o~ >Cs(7t-Xm/_ve[n-kbW3gΏ9s\{W]u'pu]gܟ>}ŋ_o}[6CxU\TcS)hoOױ1b}W xT9FDl\}Y>YfM^{m󟻺 .:u7+Vʕ+~y-[і-[:::h===Ne/¢EhW\q㎻+c=FDVzgn;-ZK/iXmEYUƊ*ubzZ!Gm;xDel9;Ssbײ:p: F3 IDATgx;n+_>}={^xcќ/yW[Ņ ?J::>8Shڴig}ָw˗;[_y[nҥKW\OVkJN-tK췺MP;FVwMx_‹.ܱcǾ}e5557UjMDsssoooww//}SL\#F"Vw!e,3:ƌۛKo}E{{7կ~o?͛oe`ԫEAD,-U܋k[ubŽ[j7qw?7̡^{^E>>o4oeMn4f̘۷w<һ+VXbȑ#;o1c9WҜ5뻩ݟ=c*eպ*&ŪNcډx(*$p\/# &J֯_}y1tsԨQgyƍ}رk.K/!ind7""f>glnn6ѷzv3#iӦ]s5/-[/ B#FزeW_襗^3<ۍ4Cncz_Cm6`9r~FgcGSD_|={,X`„ 56}ַuw{O?ݻhժUw'O|?fmia{C/ZgTf*[xnݜ΁ƍNj\k(#,hوWV"~e r%8Oygc^ۧ3q'-l4bJӡ@Jeb@LeC"gǏ@ss3-]陎ٳg)g}d^xs=Gwz-[虑` 'Sq*sxkeXfKؘmj:yc@D;QHD R GHM'^7!""-29^\^ɭ|>xyAWWWK/{zz.)S}GEl ,/z:U Q9i "NUtf\t6tj4h&-F];dRd2þ`'@];o޼g?kiiQe޼yA1ӳ )O)gҘ3˥ciJ -5}Sy$X>!fDO+_ʪU֞:w>mͲ!r!<+n4fe$ljr<.@S1S w8e'"OeF|_#ry" TUcOY1m5)fse~¡vͨϳL߲Y_isdR`TZ馼NMce"} K phiH't(62snRV00QX[8Օ@^0 &SpHlژ3SUϊ=U*˲j?k]4XnOq` `~`;m^!\WkX9` c*覟 daꨭɔOSF՚beհt6* 1^Zk4-tJj򼭶u3ͪJhIq IJ1qh*1Dlו RݶON2ю;Ն|qdj5rN:+nyސ^L.Y'Ax8|r`czkЋhl_|꫼ꫜ Lץh=NX4uWeow9w 8O8}@E*cm2KJa3BZkfuvS"h9<i bp`5i٠ oɼu4lM3Sv K5]Wh- J>y"ZӲp(pb8&÷ `?7ĦWegVaf*k*FL'"W>U(]"jʸ|6&{^xHJDFD|<iiYTҲ1- zC!g9,rd+(7oEe  xqE#2A$7 snwGU5} S,WD$G3J\L\lU49dI_&۬Oj (rb̃‡Rl6S~L6) nY)*ϐkK*L' DD/L.Š|$>< "(yy"r'"]Z>emF{>-n^Sd6El6٪yY[< LƳT*LŰ/>O*1#ƕ)Cq!s勦%.Dr$4Oj_Ri?"ʧnI>ͧC4?'99Nɠ;N(q8 h*F MA-xb (ye dNRҩT2lkùr g;LmӝÂ;?NRj6a„B:6luF0X4f yt,#"MT|4 +'%8Yg l"!PSYqi(TQ Dⱐ;({pR-̈N)> $]Y$D˥1E#\BAkY5d/OtO%[5M36r&c<ѤE(&HƣJ#3#^RԭQTٍs)K1d[KiZ< $畃xTr >T9iJ"zB_/ xcB$&H|q1 +*HAAc#)獥"|+S8KbqĹa_. nGNҩӈku"^A=!-;@]\AJzb@?χܼ 0{J݈>JS-=)J餪Ur$E= b@c6SB9qTZ/ih޴ZWWܾ}}oӦMht˖-{jIauZ:tvv7n:u* 5djҒeX%'DtҶ6g:::fϞMDuƠÚp8}0?*N,ԧqSLanbׯgD3gμkoob==tZ/a~id}ѲӦM[vŬmKs]vA5a1oY֗kU1^kcwݻyݻw/Y~=q\r񮩞NS B0[~^M沘U!9mlxe={b-[lذcz1̕erWr`eIe U\kX.WLe5ZWA09Vw1#ƍGDF$nĈs1bS#lG22V{Ix^YS':QN6瞋D";v01cƼyN; 6׿^rQL|u׍;71c7|'wvv> .4R.\7ny"Ȃ |>QGy?=~ݲh$ϐOP,D+ܹs=W`.$Ws "6l1c~먶R裏ӟAG~斖v.\vQ#G^wu>]v͝;_zYf|ͥތ3.\o~OKQ\G9_~naɒ%?ωhŊƍ;sǂ5kϟOVWܱߏ|9"o!Fnk%I"d2{ZklƆH}LO' qfܹ PT1eNr-[DndDJN>|fW_}6o;Lx,Y?D"q 'hd_=l0sw]m=3F0nԨQv/K6br&4i/&M6{o}X{mHSb hS)[xE]cǎ}Rs .Gv,b=;w|w>ukk(W6?ehȑ?}>_ss͛E!"# Ko۶ƌ!|;wQ>ڸ0~}s̹W^}}jo!>Kx\̋^4v=f1fj3ylY>+V{e7({r/k׮SN9/&|>ODGuTy#GD}Nv mJއ~;v̙3o~p 7@T[$lf+{ҩ`1b@1bHw,ncDCL W3TShOްaÚ5k֬Yox㍓&M")S\2NڵONDm۶]Rsq7nxI')?~ر杳z6}?|qݔu0H3C8hSG09e y/Eܻw^;y_Df͚ .`֬YWJDѯ~??;_w}O~reό=o^~}W^߱s5k&L? сp=m(<V-@WG߱2l5eag7oگڵ?sؿۿmܸno8q5\i&MD˖-[>h &(-[v-r)P(k^wreY^>{ի,9 TM5TQe7N:p?DtҶ6g:::fϞMDgQ}R42އm[7_gzQkxhPB͟Nzٌeste7^/} 2N1 lPYϥ^y^yWDmk|>Nƪ}]Me*'RX..3RJ唸;%iW~gekh? g4ǵ~֍iJx^䉊Apd/DtEQO iJ +Z.!Eb%5D+ n_$;X~9xV "G|&' J\N8G2gi Zcۅ̡7f3]0DzŘuи rH` u6 56eCR(H95Qɟ~ړPUUMVrPEQj^NdEQT:SR(L*qoR'p\Nq<2^Dai!ƨ aڇf\ZvReTaޘa\ꖆyOT9"}AMi>pD$H!"ryd1(=>$IO -k'B|.RbHkLNy`(TVNYh]:U٣*[n/X!U%b734K却4t霜MRdr'|&+R2 _ͤeH4A^K4"J`tTQ}kޜހ`^W˦fAatݦ*|\&P4"ʥ['e RjDD=?X<%E-mԔ$%dS^S('m.߭DY(smEbƴHu4T:NL/.="]qrum{eC6 iؕq;>!L܁dB]gdŋnp#*G.w0H%"|*e[[?wFb('y,DĹF 㱌, ƹ񄄅q,IOQfqbwinˊ7Y* h4Vmv)O'~aoD˳΁ uƍSN|:Qa#-r˹b4B{{M%'c^wyVxM\wTSA#L:s~g<Kw%5? !yeuvpeՃD+ZV=\>c̸nl8+h{SL_]Rfӧ_ﮮ~zΝ`pϞ=RoEfj*!HD9$"rF[p0H&n!Q:Iٛ=6Do4%JK$"i)ݑIRF$3dj3nG5IOK/خ@,;\.tD\Mmq)rN+El\kW &rJ#gu#+Fsqϟַt\ft2ļ6?.osk!TZ""*]4o$)K%G;`<[0HvHJ%Ԙ%m"揥S6ODWpD)$^O:rDŔy6lذb'zj̘1ڕU)/LV4r h_s[f4VqF-ǥ~//oٲƍw%鎹UoM'B,M WDbGsqґ^I$mM")Rn;1 TyHK$ hS:]b<g(9lH21UlMĽ)'*N6o6ZNJ2D$I$6[sZCL2?/)^[beO,Vgر㮜s /`ϟ'NX.e~8'Ƌ3tӑn=\y3/3c^ɍ4U+_BիW?o6|\sMu SHIl.>EXmNYR*- $NAt#>B%uYHsX"+i 紷DZ3^JDnP8BIhqNOuȥmހ7[@?BGjhO'kI 8a7Ʃ|\FΓd,YO>eOoHVrרVxUȌoޟ\1:CVKZk:wcҁ1bϞ='"a]8p`QL 2*l۶m1&/v,Y2tP2g& { yO;wr7Ƴ>{]w-YDQs=˖- ro~wy1cvwV^ӡ޾nM{}}QӧOF_|񩧞RtI{;p6nգ]rws=HL vp9n+DrLDƔ/Y5V|oLL5э^Xڶ{\:e? ߪTۚRm}Vı2 ʻ! '5??2L<'aÆ=s?s=tИ1c~bرg*Uț>}SO=t'xOۛ~_#<"~n駟9s W zW^yek]zwj.91Ƶrkpz bh~=v=Y :xOOlWoIOOEn 2[>CSO[ׯ_/ L:uڵﯫ#]vm߾p,Zn>$gYK/;8X-5{РAc_l_˗s=W_]zO~c._|Ŋ?քiut'8M!Ws>3/6ir͙sŁ/^۫w5oqVXB7ʭ`W;q7U;V)Wهc"h2^綾^xb"Oz<2(#O?8߷_bQ֚Ȍ $O'|7g{%O>y~Go喭۶܍㲑"\ܕ+]YXVVøJ+i]O7yƍhof̘q 7Gm6[ss3g>c>[>?YzΟ~e^?#Flټ?޽{~9sw}'/!|ѣpN+r5nJsenFW|Kkt10@` *7._(/iӦn7l]v]}>_1vM7m۶>nÏWW]}/~8wE^~y3\o~?5+~1nwΛw"mmmwuSO=p8}ժUD||?_yܰ׎:qntK8VI7c-+SWעm۶M<_N8FeP@^mɒ%)T:;;gϞMD&- Me 6~-W^Ud:GjWj9UL.k5jU֮q8,<N}=Z g]xmFbV{QR*xb{oRc`5?JLgQY5qnvwkZh[X2$I$X,pq^H^o4.b$]ᔻYijrNE6['+Z~q٘<]+M4RK1iyǑi 3D{}L-XЕk@JHDR2^%m5GD)i()"-v5cL<lNQ9x]bcT?,rEU\Ur[K*^DUCuKޯXLY8[á&ؼog,v+Rɒ;t@.|^BYHcPk8٬ + ˵ HkYH{í+E˷F}^Jۭp8ڬ`9S-w쥹0/x>D>[ J$`$`{k$٭>"{D@uX'ۈ4@?vc ct7sǔߦs1iG%/fn9zcݜ1X[BQ'F<;Q|Lc߿#m6ydRoP$ݾ]pL5ʠ@}}=-YdСze:;;gϞMD'NnD%3Nt.PmkC,Sk6Nh5t`En 9)3nWrwկt U*oi_.!lGIǯ^@s/ @xÖPSnL rv*ry6cG6:8o.ZSkeEfg鵘?^UHq=Jɯ`oĚ?7JTĚ%#Qs!ӾNrLdb`^:iqZ?fG[bYU/*)$ΰ6*te/`%;noAnx0&21V\ʍ毫8%?53;7n;y'7s-\Ì.xsi.I/o&ux g>a@)?V rl MKܸUp.rq<Π0sX_=j6ֵ--Ea7X 4}eР3g 0`ڵL߽{^KY]];p]vuY_:bg=`O<Dy{ibZgjV&ZAu &w+џ!VȁUQ@s)t~ܹrʆ1cte2w~W:;L6C7~;oٲe]]]zSʙƌG=(Ti6cZhLB*4M6Տ6)rQOOs3f766b1"Z~gݺm;cp:h{nnLGWCܫZWv^i7H43>^{z+**e85{4qҞ={{コ뮿~…{yה|L&sW0ƈs݃_֬Y-7*װ|d8V%doX>3Zt?YXJʨdl0}. =9 IDAT mmmD+ҥٲ/^k㞞>hĈ|G{sڽ{ڵeX ۊJbFp24{~'^VװdɒreF-0N2]xQn\]-c맫Fa= s[TM(E]Gk[-}͟6&6m$5ԞV4]Ռr(eϬ s+;fNjfA*8Vs&߫Uڤ;$q5̧xcVI\עuB)K0-ʫ<%.X}WF}jƥ>[oHHDb@\{n*hFJz(h"L,l6QZQ:wVQPR2f\Lt©cԸT.naE7"")9m6MZDWs,#lcexcux[n*vw4.HRGGp'7c%g- l*ߐ2] f3r5 㬞P J$Hكt&͑ #Tؙ@"JAkI "`.Ţ$IG5Q:%"J6o6ZNJiעQNJFb^˚$9 GSDDXkwlG&I l@l D"XѣL|p #1h=T^ubן`viVz=\Ud78*5gyy=qA^GK$,ogEEtR,MaFp#Vn GbY:chF!C8s=43XSnHaURd~GOx֬Cv{9򷗛?%8,n81 *6KXy`wJɸ1~5|ge4d}I'1 ֭[/u򷗛U1LSs#9R ndG\/nj+9XFED;wعsg1x*DNjp}3p?n^ˑC@X+],e;k,IR__wWWO?s`0gϞ^a*jgNg4ԣ͎NUV´e.QUE{La=1ne:g:6?'>tP__#9gs>NطVT!8RDiNz-L0a{y=g/\sWx͛7/.\/ܹnUY$tf{?ӟ;/PD矿+W\xc˖-D4nܸK.?3$3UnڴiP͛}?|{7(Q}駟8q%K.\8pӧ?#3fhiCY "0+@J|MӜQKS2(/B{ٺu˾Ok a@3j x[nws!yʕ$'qDDdɒgg}JD'tҜ9sϟ֦sϽͫ#QJ'V>ޟ 67soX?gʔ)kSN2qT 壟%KL>{8q:x\v-uuuhJ~׆ 2aE\/'S>dXuciB}}B.+ aZ zaWe,X`7x]o~}7.\GD'|2ڵ\9ю;֭# :/XɈs 85 [ܞ~(1ǣ3۷zzzگyhӊXNnP|'Oq8wywu]w)`9- jv,7W[qGn*{3\dW_9sfwwr˖.Bqyrw&}] qVT&2Ç8_ΪUĕo|C"r.joo7n,+A9H6wUZMq!W8X!*k08si˖]~ 80qРA&Lؾmuvvo2׿{袋zÇWZhf8&w-3jRwGa*9(bCGx~xѢE_{~k_s\ Br_O,%K]vEH$kȑ_\XL^"K?hWcJǗMswTfGŊrox%G!ҚEX/^Noٳgnj^jOn 5YA`Q96bȐ!C aUWwłVta\uGx091f/͇3{NVFVuS lw'}~Y{GcʗB^2v+M{]/;LŴp2L-ٵN9\m5Wd2k3P͕0սnuMrjS5+Vn!2&vyŪїνrD„SǬP%pV{+((/Bc6TU2^&U3s 㺗l7rWTA!}߽]DįqsO8yg;i:ʔE]Vuu|LhlkurWa\ShgCqsf96zdb{$GeݽN+uSa*z)C}v|鱻8}W#Ӎk"r,[:[D)m|U04_3 ̨<B{F㭪~qQR %"iu]DD81gWG!钺;5qƍ?nGyj,Zh߾}s3zSZE]lijzh]~ِ!CQ[[[[hѵpJlG3ApDWi GA}}=-YdСze:;;gϞMDT# oj%KF~}+VZʼnƌ3}Ç{۲eK[[\7΢Nt")hr26 0 .4qݻ_xb.\kI&M0g(4xoF*Cէf.q޽[.袆@A~e+xѰfpЫlʈs%yg'j_У뭖;sؾq}}} R9.ZQ-^t5RzgguV_o믿vg~Gv" 6*5k֖-[JCN: 0@DtX cqV}9Fl2":ΎT*Nvm 6 3"~WrEqFD6Y}/1b߾}Y! IDAT_=bĈQF=䓪r '\~寽#F7n޷o9s޴x |Ȑ!?}48lذɓ'8e˖}駹 LWq qFJgX\ =wy2hg͚/~ɬKVXq99nZr/-[%0aB{{uꫯnjj[nN<⋇8qevtt̞}gݫP?=\GG9v'zRc͚5Tx嗯^s#No꫶l}+s^w^bqgnټyĉv&cǶڽ뤡Ca)8$zϿ_Q ߏ/0ЯǑTn#Glw%f5Y>X>p֭gqƾ}͘1V^MD'NӇnݺL;_xĉ#G$7n\jN;{cnۺu_|-[lcVȶo%]+tO=*Zzile:{9,[{{f}GvwwtI퓇޽F!ojj]]]rP4lذ7[nʔ) *4 =N9M[(fF~gu͛֐P_"m޼yڴiC ٿ1c?s"׿I4 |#<"߉ &3F^??n;s 'yn }}}}sΦM&OBDӦM[|9燇 6}ER03#!2ԏNs,qʕ_NcLg/Өi-ZʔsM5NY*IZĸN.}Ӿ>; P5V~?7]8[F.Iq>V\1 )mQsl-ki.WPB Ps3uzNear1_zYUf|0͖lSUgXNsy^;J rW73£Əc>EKW-3:U?xI+]V*Ŧ߲~L󏃕wU"Oh+8(br4<._iQQQRǹj5a-*M+S+wAUqUt|!0TxUuXrĩ)m:V:oHeJ8UXL=?n6,~tz x>xx&på 5ѕtSI';^V2mg V/!Vm۶ _P8FuD/˕Q+H)78'y@B@i4&3Gc++sJ6qgɓc(Ew)W`XBD<o($sʋWe(cMPl6N+rWݟ̭jd55 &"ԆX 4^7ՠcfN9t #%-ʨr5rB^69pMDr1U&ŴːF7[q)-,QќFr&88#f:,:C7g ſ3 lXe xir'7nEF8pR?r-Q>h\ XY@`_^+j8JoVVK;M@##vWwe\mH\Vݽ[\.baY~TT$qc")"")dY<1 ?D\Lac&cbsR(<+ӋղJf8f\uvVv1sў2jIɠvO_ێnjljMoG3ṕ6@,# MV/~ 64X(ODk4G ӛTQj4G榃ˇBÊcrWEl+dL2K.=MX:2jƥBޟKp#|ho"'JTwb@N+4㮢e H+V+^4xpZژQ=$)oIٔy 5)z0**>Vy 5ZDg㥦s`hK-hUBQI:F_Inc]⭝{ܮ_NWuLZ>zXlA1  (d B,a9ǜ3Kf;g_y2'|yũ X$ t7|Tj&){≍X[N4,wkD1?[LMRKjYtuVQ%":n㙘TBNDGQ )Ð]dV +XT~G''W% XqZp krDezS⮫ҖL.꫇ Yvm޽􋯿>-ABhAXwLXD]fnɦFB 'IÈfCDdnѪOsX)F?gH.&7ȦKDmD䚺RFLNeYXB88Z0xWьNsYLoLϒiLCUٔ)b0u7-oԆu*vptπ*ך=|TU9rώŹƎ{I']}UMڢ` #㏣ ~6deMb!_I&>1AYǍD"!1?uoT9+^u"?NEYoF $V  8b9'"#K`t9N}FED~[^n駟>xZ]VsÓƍ}СlڴiĉDtoC嗘+ =iLy6Nۢ0hzc>0~o?0%O\a+2,ZjYlʃ.1 /ayu"qGrIǍO.f~iӦ}߾=߼o^zߟ;~1O!喛x㍎UU,Xpw0DwyǛ PMTwV;SZ+> H62ijDn^Ν;;w+W$|3\s5jvS80Gu~>'+V<3;w<3΋.୹P',/cQHӴ~7l0o޼u"M ϟ/wtt̟?>eV֘:C ŘegA0\CٵkW"XaêU6oL >|ҤI={uV0ײo*q|Wg-V[WZ}3wv޼?._,Tj@g6kkJftǷ=쳺Q8nnEh& y rҤI/IQc0MAuW/ 2Ķ™<̎;A{{W~ʫ,^_=W^q.1o16riok;_~z/p嗗fĉ>y̙CD ywT; f20^|ūp^~zѢEGx/kM4߫Gc-*S-6-z]xEI&1Ji8WCc]/2}.?nkk#}=Co}SvmD_j„ ߿{9_W͵ZDG6*|k&IsPW<«+MVW f@ho**$9uz-7x~^{^سgvZl?p>&l6;f̘.6nܸs}֬32x7#ysO_|ņfǎ|ٶ}r '?hΜ9̍;3?4M"/Ҷ 1D6{c0k0 .#Wu}֜&FDVۚ5ֶm۪? b%{'/BY/ҟ'7tS0xۦMرo&bN>Ogu ʪ =zt{{Z8XS ƌӷoߙ3g9:d;[=^z__p[o՝WUjF*VLٖMtVjLsj۴iӮ⊭[O7ikk߷o߫*X#Pb/ߝu}ᄑϭ6f̘']8я~TW^SNپ}ҥK0vHmU5?&)D+H24*;?;|*ZRXalj;5@s_2yS~s犢X3sgW~w[⿉SxۉN䓮Avgg3 RZYHSД)S>k֬aV\y6v؛o}c"0l;"YV7w[د>X[p=ޅ84]qahʕ[l뮻_Hw?kV&vvv29c"qlV[uvvVzw7a„sxܞM1 sĈKF 嗿 ڿ… ~a":䓛i㮰ÔlT`SͯGQv_#Tkh={/~3gδ7~O}jb p' +ҥK=ϻ?p wyWYe뢋.My˖зB˖->x*}?;x`0<|;?\5 G:uom۶͟?J:#JthY 똖GZ 8ژ=񏍶o>qC ٺu}ѵF%N /O|׵'~a>8hР__>{˖-+^޲eˤIN<+VLDyɓ'}xnqҚzVمy0+ZɕY?V+o+P_iW;v,putt5Fv">}СCٴiĉ|[Ĭ1><)نRV=ۼZ%Ee^Qҝ +wti<%F%l͚qİᖞ5bvϊKuR9zX Mur S*)΄y^ Dt'J b`gckяr\]̪˶ͤтiɄ4mʨ̸ِCmF1c@Y L1*Ԡ$ Scj2rTTi>d2%bZ%rzY3S[6u8Lj"qDt=Jo\ ?m(<{찢-]UU"Kr0iGu=DQA,""'$^;L^ IDAT9I+5^ m"JQA1&3.ޘ *8W8N]"KNJyMD4İ&D du·2GĊh$IrXW*eqpT u)V3(^SLJf2Ń?3 1ߌ'c^Y(w0.#Yq(%IS uh&}߷C&D0Kӑ$Eii9zHS4k[]2Z f,˲&SN6PSb*Ty2j eYfRIkNDG $+;X9a %qE 6bBZSٖbRxN JfKYDd J|/םXeTǗl+JGju[LvnU9pefUq?GMn${AX퐠%R!1 fBfYp"(p\"d>LD$(AE x:$P"'L*h:5'"V O2ԃ.7T7m5j!qr8x" &YMbJdJ(HZP]- DN M".qr$(YlacUKս;8[gm޼gw^zرd@ttt5Fv">}СCٴiĉ T9!* Պ1uOT߷Ey~F۴pSB0+U-WzCwyE߼%heR\HEXW6A׫lޑ7-X%mZid\md[!#9q( T1=tܡU\ބr3^"5XTbj$eGzoVR͜|`ʫznut^z+#ֈϕmZq~Hx>R{X^7s/SL 5S ^c:58R5Fw5189SO=7ȝbYv/@2|VY wxWc|yqPwf̘1K.ݲeK){ni+W|W;;;ͶGEt,[!*crfZ=iVC0|GѬYh3d^~a믿~„ Jj 4hݻh޼yygU3gر t7_>^3f9sL/EFD~[[۪U={ﭷr,kۻwo߾}|sikr9U}Cyѥ>m8( 5=Z޲e-ϝ;K_Rq0^{]_lׯ_ 刢~ |Z#FشiܹssYg9S͜9s۶m~駟`<ՙڝVei!0L}۷o߰aCJ޽{?bĈ/}KDm۶9sL6/߿ݻ-ʧ*f˗_uU}yw+*oG-/(q-? 㸋.T60MΆx4]F(u۲jD3w%a$E?|4g&FglXq1ò,ˈ -J"ͤClE'AqY %r"9z$j2iYz3Kf\8aݲ,L*i-\rOOHLHKIIӲ,+qjps\+jUh-3zFc\'izWEe.y>ϣMؽ&w/ԯa֌cŰn[*X$l`TA.'BѰ<R<ƵMUaaXUw'~}p@0 +dCGH&Pk8$2s,42!Vw?2v8LȬMr>Zm=\=J"v=4L=&Dr]]ဓH虸.b 3L#DD,˲_bU_.l<(FBIrՀo)}K}jTZXn 6bTTʾ3nwE9T/Xi *\U ]*"R8\=~zWbTZJUU~Ryr~uF583.,FɘBǻfZ'5o%'T\3PBv=RqX˅*^7 rd-KăX\uO8QdpNd53+ݨ'9x–mFHw-SU܌T *o&ҖKDVRԢLJ*e-'2WhS1󉾕l[csxvX *cLH,KNH^ʚ*<iKYbh((abYQK&5чR8PC8^TԳ]v#vg!d ;־Ү(GDPET~X01 ^`ϖvԮ'H)#^A,HI/NPy"b`*){BAgQ1L^M`H#,KFO,˂KVkùxJ2Žy35`*ihpYh*&F_fVԻZcݤ*DijX,]A7vgDKPˉt *BXV $_F5VPgQTPaV쟡R7vW4LG#17oV^=vöV\q+5¢Fi#^9^'% ^ 8Butt5Fs`tJZ<`āƕ_~GD0yU*qCL]T\YeZ3#b]i|wD4}CK p$cr:HQ.cv.†o:TJqkiYGp1]k1egZ!gF~ompQ 8`d@ʔm[@G5k/B~^iTryz d|hy.Oc`@՘s4>kWvzƞ5HT\z ^ӥ`N!C7nPPB[僛Bx~mtVl-&Uġ͚/_]<+mdtٺm[y0|2ˡ8J׻>*8?0EW*W[4_1|#8PTÔN9mZ6)js6఩]GT4|=yyEKȕ/MB bwxy^-U' Uf-xi>wzZ*|Y@EA12r#U^'r;q=J{jnb~̏4 WbaZLL\j;FAj^L65hԡn C{{V7VGs`KVq^>,k -oBkj:` b$nw1l6c̺ =1bM1UK;pdaf֎BE<4Xè3Tp8!j<{GViZ ;0S}jIj1'zV+=ki8G" ƌH,+Kv:( 36V*;sB wrр( iqd4k  Yuk&/Hj<ٙ" HM᥸EDN2BiAMeID-av*uvXVFE5 r''\eǹ?tT#60 TzT4HEp{H'_ח]58Gi >nږ qkf<iZFB3Yl,nii4-;ьCDnhֲ,=HT'RRҴ,FܨFDءe[v6`ڱS.,˲A#,3wjl0ҁl$u?|Z">~Ryr2cilXq1ò,ˈ -|M8FJuXN2zի5spNUՑ#G~c/vqc?{IC|zϧZ2MյRY6R8"!uQtQPUNQ%+XL.dY"Ԉ:2D)U] kggF 4#"Vy2N`EU,ܠɵESWᤲ+wPbVefuH>}N;my0Lu}oO߲eKSmȸAT,[+ HLE1u*Q@(n΢J026s,4R,0 ðj.NjkzG.nTBӐ@*ƦidBpKy~k2pɫWצ2Hgx})w={oٲ'Xn]<߰aQU- ƱnMElX#bDDrL6:x8x3mlvf*c9z2);wIGf< *1yynZɇ@RKDv&%HdNeֺDtBwn5–ۺpr, +&Gb-( qr, 5Uy%900lX.ItLbe |%tTbX(')(jNjwqJ"B"ﰜ(C8^KDMn${A1EDX!# "bD& *B%bh:m;T=~_L:J!T`o맟~FSO=jVhBs>XyDs玿o]w݌3V\IDgU" 27oYV^=vwxRAC IDAT%74;a&e3J̑k%13jk4QFHxnHcr z%~O>_hѢ{eØğ |ƌs*SVvu͗sM$߰O|QG[?Y#%M>}С}o$'nT.+I%D.b.j"Y'6tuz߿駟>|x!OG}ߴiGϾo!ٷm]/7W\I|ժUs}_rٳ_+R<ƍ{M |IMwX\Y4-:tmmZY~3i.«ΣmM=~_LW{6>ncǎַ5{l"3g?+$ٳy=ܯx`,G?f&uܹs?믿?>uTh¤(>'im?{… zf"0aBHu֧zj ,p]aZ7/ԫ8f*z˟eȯǔO޻oeӨk|\5km۶58ƍk׮s綵ysνK L8CDӿ;woQeѢESL93VXQ8JRXN;4Y_~gѢEs /0}9shsZNyiڴ+b֭eꫳ8զ?nks8߿%KO[8޵kWKE۲eK/"4hPq? &_ж2e-2eʔ|;||7Zܾ;i~2)ߨQzVʳb+9g͛_c*0,/=DoFnm߾O>2eJlW_8(5xS:X:餓(gA4K瞅 ر㬳κk鮳gϞ={/)S򗿺ʦ=ceeєF͘1cٲe?x"X~_~7F"ұY;ƎC˟%_~ݸt_uU},˷r ,KD۶mׯ_(5kVЂ h4:cƌ!CBM6>aMW@9m*h$y{w `Y{H-N;Gy?MVV|'?Ƀ>HDϿ|IIfΜ9gΜ%KB}3o޼~u]ٳ_~arW^)'7ѕ!|"zJDLDƭ^zر!1jԨ cZ59ہ2Dނo>zg*Eڄjי(^٦]^V<܊ ӧ:kUֳyeky*3/{HV1ϧ+[kkϼJ= Q9ue~cmS{Zj^kqn6$aíJ˰b(kg#20\ iV\5*=<%r=a)†K䤕SrUIAL8:hl[\{GD]\4G/r̈́dR6 Qq_v:%iv6dGq#~e/NJK,fȚSqf#Zf-2b*]{^͏ȲZ$'0kd*)K*eT+]!)~{qN6A$-n8DdD!͍2c=;޺ ׵ڵ)M fLeA7WUY>*8qUEQIK.Tp1Š؅gFJXDN6Fv r0ic= ѨJ@iӵbq̍4(8VNVJȱb98f/B m Ay%*;\:#|:Pr yj^L[[s7|4kYqcj$9n\<7d|B? <;֓Vc\̰,2|B rZ|tV4p#Q+1Mì)X)id6TPp2!-%%M˲lčc.tZv, /aX"@([ѬH ;MmĄ-""%GJקhXZGU4ǔ3~Q9y!U}po+4xZ3=(c>jvt(pHHm>Le[nPΰD亶ɚ̕%DMCT5J,Y%yUUWRzHd]=YkdU)q!?.LFг̚IU D+)kI]]B15&MJ2)AFD! OD4섙T@X4> & ѥ*t'ƆyiKW1Pid]& C)32M#esF.@N9B0mz<(zTU |<W1t>_4R1#PPXQ K]3OfnX[OVqW䚙6VTC5|şh8ԘY\&Rb^E޾-rU{ͷS ^3Oj=qj2'84m"rdfy9*M.)M%S\Y)awmd@YE ǓqN>N'7Vd'M[DĎ΄@P\f&'qx:z )S +.Dq%㡠*]b5I,+%Y-$!"NROӑ`+\Vދ?p)?!P@6{AYfLVO%e*>V%/VqT6uٱXznqټys\zرc-CcԨQ57y35cJgwz=ECہ~whU#|bsPO>t6|ix>'ꩧ^őe* ӓ;fe[D0H=}Jsw~h쉽p.'LvPho$w Vl}C0Wes [eCͻZj<naСn b*ڃZ<ޑ # VMb#b|˩NشiUZ6$az1)V̫s U_2ҥߚgy=/w[Gf͚[aq_t y-i)VYch̘1~G}O{sYjU~vڕ MP&ٳZpI'|\?w0^QvMD ;裏.^+g8g-_ӧϻKD[n#oGDÇҗDDǽ;#FEDe)Rʕ\pꩧ2D׬YtokџsC._}Ν4zɒ%ߵkغu+M0aϞDp7bY6W~۷rx[Q!\reawPӪ TQe=ʇSٳgcƌY|رcs'_{ȸagة\t]tMD4v؏l{ذarʉ'q֬WӷѣGoذaٲemmm7|K/DD+V3f=#38+Ї>̥MSm{ȑ}1O>e[-YdL /^GD1bą^د_O>jkkJj>*n73g2dHGygvXXr:oM*2ՃpO[+Ga͆%=X5 ]~UR*+eT+)LjM^QT)V9#fT:؎Z(1v뚉ICtH ;\6"qn6e۶mDYLJ[NNK)e[es6!ɐs񊦊F-%b*.UTR6W3s^=ݨxx xV 'ū9ЫReWXxW2UA8=cZڔb76].m`sEx5Bĉ"Ufԯv 3SٕI)sk$7NQfsbDdU4-P7' iQ' Z=Zj- )+"j@00y7pYmWNTBvo*qĉJl6m+ΤrA]H.{h59`\OX}eDž26-3Eq"94D$QϸOblXVx[n^'t9B↽sݼo.u|ŪO=߮䂵'꺟=qĉ!MҤ)n*tM T3iMIT1q.X&"f%TQEyŐh2WȲ +!;5`^}+,Qy^aE= ru/{ka\ZqY X `_kE081rNQx$]|H8TAΤ+H*%ҙd^5%&21(2CxAIO1V*<{ڧcbs 1*<"ʇk J^-W*oZyVY*G}]HrU\*(/+@@gg}/;:: P{{{kkk6Q&P+d5+VYP遷__X}WHתmnɫpvY\īIDs5jT~iU@-*8KUtjU8>]]nn)[~aZnpu$,^:gbVqD4xݽpꆤOxD^IkvfT׮SXC!T֫wTWdߎz>:֝~X 0<.@e&*zZa;_JoPv+8YtJ.㪿J[i{z a.7I*JOR=*Rҡ~/ IDAT*m+ZmX2UwwZ' [ 螦v*(rի{VVs7ղy^3JV{, o?u @MUGK?W=**M x1W^Ϙ*rea}aԱjT9/գZ[=Ԩ$xB Q䲊I*T!"+µ5U^0GmUy\բV9u0էCWܡJ-ǫ:vuPt^YU_+*Xu)ka YSt9ZXs,_0lF]"/W{jAP,שiihW{ A]U=Uk.-hMsUXOIoUjV*O-y~Xa@^ĭ;ױCѶT9Fu+}\j]D\Ʀ=a zz[WSٯWŀc`Ͼ^ $ ;pC,12B<~&'RbƌDDz8aĉz"x"fz4k3 t*"8CeTg^a*WkY٬]EQ5X-ܺ!Pտkuy\0UUlݫM?ցo2_Meǎ%oߞd.XPg>0Ne {O1;~qa=%fY ESR.ZĉNHp!YVR*4 R$x3V|ҋo\奯5ױRP+kT\ F<@]'X K{{ Z՘]XԴۑGzFwߝv0fT0HR׈k" MFvJ##rEA7Xӏ+ef*LJ#rCLM;rDW"eS&T`)XvJ^A3ڨlA*yrs^*ZUr-۩t݊}[opk!ߔWХ Set\k+y;="~T &ر7}ݷa&O\KKKoooM6HTYSregs ]ለ a`~QsDD:;9{ႅK,zҔҩtp_[tijh:Vor] P%@6yN"ںuC=u{w!SN9.e_۠qL2Kdsn*iDdٵ޷8)$;D%bV*aI!T7i\"T]Dj JE@oꔼsws3w;VZ_?mZ \kYUfykdoYby\?ZͶmے%K㎅ yG5f֬Y{TJ2"rAQ[+y=63eTLizH#AOCEqSQFA9NSw7|y\}տgϞ_rW>Ol}ٲMB+fk'i\="hNKJVG}`͊ȓnnn3f̚5k:;;g͚OO0l0f8rP& #CDDZq;?jKq !)8ג)  R@hVP !9M~:gΝ?ϒ$ssÿ/sݲu˘1cx!Cছ<]w :4ؽ޻q뮻_ynݶuʔ)ss=㎻Zn[vGՈWp&OZٴ5(WrZFDtG|3),Xv'ZQAp,`#ѣGGWsJŅ b?9C|K,+7͛7֭[B-ZDXn<8a„ȷ#\oϟiӦ8NE],Lb;0iJ0WuU_LվV ۼ~۩roo{'Ю<{ٛ6uh"P6i W5mK%W:*Ύ;Ɔ]mvgU%NiA8dY&BM8_f{~߆GWZEvء:|W!з] <9sGo^rTxgW!U ̙3ڱcGɩ=@@P7k\gݺu;v(xرǮ]g|ˏjScի-"@ @D--[[ɔGQ7!h 648|),/GKcU& , jU/עZ*]y \l0-ZRG@ PZV80 ϫpJv͕۶mҥKNzwjժ:O<nX+[liӦAG}4bĈ|!CdY^tn?x}={޼yTpk׮-//+X[{燢]\ZUɎjo@hKR-_`wWmx^)Nť 2.O:^{QGĉ,XlLuY(-5ͳ:k~ɓ'Ϟ={ȑ,_g?--Zte{r$=3kּtM/6mgu"Q{SO=u7\wu_?h /po^U0E,=Wv[E%oRr/xR:v^[Z^=d{(=*vttWoO*jl?T;g{@C@]UJxKA^=O$[D4wQFaf@%ܨ0+?O31GUaWO7XJfX6+BB@Ip56VdRN+ݿF%[V^*]T/0^@u}p8f&→2-vJGF\R!3EpvlLj -)j\6gdnLOZDDl-mfe3%(f8m"nT Y =bm;f" Fa)1M5 [Ϙe;FIIJn_R"gfJ0Dz9L˹x"fDx0nڶm >Grd3^O&LMO̵]=fb O@G3ٔM'efKrlΕF6V*9Nk;n8aq*pDJQy"-FeK[m "hY8" 2 J2'2D21}-/xV:f!9cM@{Ԝ)Bs Gqn.$i jHU\8 +Q\Y\W,&"}RK'b2rWm3q'IWT5Jv.xf[ԴB8,Ϛ OT_e\9tUt21F`е,\3]Έ8cHPUΈ-FDN6v$ $%5i13ĐRq.L"ٙxdMdd-]aferV DMr״.JYm}<KL:1(a'EbEI4gÈ`\yArGD5ј.()Wg|RAN8KgbqA.A2r2Nd&b2/b٤$1IEAMLIU9s(JΉ8oQNIf|Jxb$yAQ)q⊩K_ٳ8㌖oΝ{sz+´iZZZOtIwK/tĉ_WZ׿uذa_~yggڵkw m۶ߺu+YC?<;w$gOnܸTOOOcccSSS hjj%1cƼkDݽj*Q0`uuuٶ>x "Zf͆ s믿^XC1c?/}K~PQ3g5M>|yȑ;VӴӧ_|%e]FD_a6cƌo{+ވmێp #|駟;ÇO8D4bĈh4:lذ2UOСC/ܹg1b̙3.]|\p/83F &^zԨQ---7o.)uYg_~pgzwygoo3Mf̙3mڴo}[֭[bESS[NXbũzzz)q+b>4Z[[կ.X_.)?bĈ|yg>~4ɓ'׾?QG]xmmm}Qy޹sN>a`qرc|͞;w.]c%@ d~s]z &444 :t۶mSa>|_ /,X c?CU6l0vXy7tж>Zc9fĈ5.w9,YgYt)S*ZtyWg9#5k֌?ޏDQ?IDŎ5OwS8qb~_=2Uwgog˿׿(ÇBq||yM6Oohh8c{{yI&E]+7/&_޻KcMMM/R^Xcɿx /pӦM?/x^wu֭fD_|ŧzysٴi__p}Q]T tvvY͎Xv_joŋL`/A h;z̸g\<>¸:Vp^3;sap8fFDAUY^ɨ(ȋz&"bV*$ ' $Ȓ J4UEQMX,_^Ƌ*5?m;! zpWAɈ\#KPbĎ)*ןW"rm쵵ِr@MsEc2q5(34X 5"j)I+s#Z<4m%Hn."J VZ|JdŤEVN&3*q3Zԉ9ٰ+1ffyr~NZHf2ɴ,9]JK+-qdtYIfV:rƈJ KbƩIl"Tz2&¹e{a9сtA h ?|km10޴I nIbG1Ll3 ]䈈W#zPI,D)QP%X%\8+FJ23]i2rI$.qDu g0վAֽH 0/9EM[sUJW^ qR$+LH\$7-DD[ji%ƅ2Vҏ\!'+T?W< {ʟ 'j %-FDNZϋUxگMIKB1AHĔO $ q.X&"f%TQktj9XAru>As %bv&iv3rJ2S X&8)IUA:LZ/ūUZt&B1AMLZfD^ILLbPDc-U.W R|y⊩-[l꥗^f_}?_A"뮻~tM .|W1c*z7Ͼk .O~r!ᦛnzLӜ3gW<=g5kGMTJ2 e>BD& GL<RY'⊦큎6<_DVb!#fD%IZ)Fe%&M}߼+;͛7/]t޼yeʔ;wUW]~NknnN&s_+L677/[t~xmۮz̍7޸hѢ%KS[ouȑ T[n׾ 6lؐ/sGuQ/G矟qŊ~GD6lhll:t-[RnjsǞtI OZdɍ78{y͟?;C9s]]]ˍ}=܀D ^Mm ?hllܹs-ZhѢ;cĉgώD"?яŎ8"* :"< .~p1l޼yٲe===@6o78s .]_Eڵkhȑ#9oW^yEUճ:몫(/s|p̙SNOz ')44$|y睍7^{zg?ْlV:sG;~g?;dȐ{ժUDq$I<|ǿ͛7/+X 0zzzn_O<3}?~;죏>뮻H#3ٜ1> 㘕 ɂ  %";! jHSdY)"(AAlFLE\#K~r(eJN:5?٨"`PP &g =$7$Q%=eS_eQp>`nY5U ՠoew}4>0'cFDm۶z$LjѬafJF&sx3eَqKD:|̰m;eq-{y i)eٶmQbEYy=25Kk<[iK q#ģLҖ6ӊUv:eٶsN+mL*JFDN&aYY6g(h|kzuĤu?ALM6 Yso$7Z$3å L*L#gusq#J-D94]3]iuk${<-KA"dK;.7NQZp6cf3ɸe)#m MH#b)]UUӴhBG͉" *"~AS`5Ԣ1aAlY!'IWT5Jv.k.UXI#"r`N}<7UT+.!3MU3CK39_9f3VZ Ϛ  Ǡ+>A\L5Œ#"'RNH'"!M孌EMDRFPO=D]v3MDJ7I0As %bv&iv 1838%B89I(hL5Qydui: )ibx&.qdx-BarDA5Ių߂.W 81X(Ą : %%NZ!MHP$sP< K|((E!y'^0R,h'<ά`p:;;fGGG[[FomҤIRt/np|x O|S\pAKK?|СC/첧~z͚5D4v?^|ŷzS@0 6k֬Gydէv|A(rݵ ӦMkiilhh^#ꪫ֬YiӦONV^MDoF65jҤI .<(3x'7n3qC9S87rm۶}_3ḟ~3ѐ!Cf̘}̘1Uf̘ܼnݺ^zƺu-ڲey睷saÆ\W_-)q [&"Y?éS4iRɅڎ:;v<3{uI'|ɽC}֭[}}e˖8 ڵk \sαm{Փ'O>#{zz7o>Sx 㮹L&z#GysرmmmC y7o޼|1 N8u$IK3f,YdÆ 8"ZpƍBK/m۶´/~!@ PR`رDꫯN> qYgf%EfrȖ-[b~GlÇK?vww֯>{„ t0#655=cE֭[׭[7}°O uY̻B&Lhoo_zQZZZ>>f#Glmmohx?=aÆr9"jnn1c*͎1O∨a֭[nmii=z++М9s:n۶y>n-[l۶aÆZ_=MMM_|qSSӟ{QGX<ѣGo߾_޸qcGGǹϭkhhE?GU=mmm(644,Zhb |+V8sFyI'uuu}ᇷ~I'Ty\׽m۶{ ƎO;^xᅒyK,8qbKKXᅆ 2qљg9a„7|/~SO=s,Xs2eO<|1 M6=㚦555uwwL|_~}ss_͛7mڴO?Ν;6l8;;;wAD%J.裏nݺ_rOOOCCO?ƍ̜9{ذawujmm'viGy}qDlٲ`0|a͛}&NCi/Ç7ο_޻KcMMM/~tvvY͎6j>Z@cccM4 C n a^0`/Aa3㚞qzk$4y%-aCggsÃڳ3z8FzP;13"(H0\bfD?邜긹&(hlMܞ&]~ E+];!%B.u?rqI>4>|]y_?^lh[nXm۶pb&$q,*\w'LNS`9%!0X8`I%!d%Wnظq?~\ʣ>Z]wuk/x͛lݱc 7Cqܦ mÆ ??!":oo{ys~ c<?>oy޽C x8ӦM[Ô[CG8xQ T=|ǎC=tСW7n|~YtfqYKQo>vm_)0/uOo 0o,*i+G)GRޗEc۶ "btRJ)/~k*VTA^ub_SEm)!Ӛ8#"@xٽ{wMΒ{y|ED[oF[Lgq4eԎ' "{3nah'2MgZˣZk͂2N~h\euo>T;)w~^U]gvLZV_3!}_Ɖ,ġ#""}fC4mww:%_| _Bٻw㭷zhrMM0X޸DL[ʦ(mq<1z0)٧;1ʧY^vmSw3kسDcUZ'5Xn(~?iqɤdq֯_rˋ^ݻwfu#}׮]}{OtmkEC=oK/׾-"\p : IDATtM]t>~{~~8[oE/z0NV]o)9aϛ:vv"!'a8 =]Gn|Ed}ZIJYwJFIps=y}C7_W=y=.[YY? 6izeڵKDNt(/moKooȟٟp Wk׮$In5c<~zNb8V4 rLA=nrP 3Y;.k<-E؈{gf.Ǝ&ʑv%˼~5u-8Olڴ,G?*"wuE]ۿEQx??~7رCDO|^o|OtOEqy'"=ʅ^xu׭[ _|/l)|Szk_o߾{K_5nSh'M˻n>McϞ=H̺?c[n)PIa;vYEo<禛nڿu۷o߼yM_̟V6uѶ??+++zի@ ΒVzΝ~]|7_Wr-~3Fzݺu;sСNt:v}/xݿ8<-aҗ]z={ٵk׻|;ozӛܹ~ըOy_-ٺ;8W7o―m֭O͛??^z_W~8Eg?5yw#?ݻ1m۶mGYpKfK.y/~n:|׻7cc=׾k}O͗q)i2ND~o}M<}}{߮]~`w/ ?xwZ+S/0n=0X8`I%!| ,g9Y fQ\pqFWuGn:ƙ6uU)Ǎ8u+jz*VEĴy乮igz4*; _)D<Dc9a3o/FLUQڶg"5b-le٩nv:n¯i'ͳ&]nbBP'zTuujUgit59Mevju;8 N֙84~y]DAq5 m5o`6,lMA,q盎mX~V͚ȫkvn#+0<,9&+KDj E.cfΔF:I5\H 㬓 uE]0aC=QIG]]Ue9 y.â+KDbYń(3d?Y?c1Ys,^`tY8'qecY 4呭e1F,7 z2팈Ezi-g:&o;vу'Bb?奓0DَDW'2eiYV_Wi%I2K'eX1Wgvc_UylL ]G,FVD`ŕW^\gϞ|3&Xw3cǎ-[PApm߾}ͧ8`eeGۺu.K.~?p_|g?Yi۶mGSSJ};yEd/˩ d) 7ܰ~ݻw_͛7x{Ay+_`ޥ'xn{'?}^q=?/|СCԒ,qw+w5ywӉUW]C ^җ^|ys>?W_}-[}^{m\ݰa."^zm|O~GO?qcK^K.%#X}{/~zֳ1ǽ??_}[ߺ w|=s}߰a7_<G޷msW\qu]w?w}^7뮻>O8f0`zggx8xK2/]w5޽o/~ys[o]wu^x 7pСٳgϕW^k׮{ ._ٽ{?\p^{wu]3dqO}SQmذa޽=??nGø׼5g=<^{lÆ ۷oꫯ+׭[?{QD.[om~ӛt .iy_|7җ[nׯ?4-ߺ{Y;v۷o߼y)XYY9ѶnJIp۶m;rA, a$qKB,b8ӦM[q1㜸GDt9q#4\yʹYs†,wRXTIZ^QnS,r۶U0"u]NjgZTFkn ʱUxϑz0$&.T=OkE?Ѝ]F&=ROfSQ9?LBW)8o_9r "}/SAZ;~R_;ݙqWUO?TG\Fj:[\G;v"tEtNṱ'ykD̠6w,qv'Ց0n{ Nd'܉^ZDL;-$J}S›uZk݌$f>_h-fOLu=6Y4niѸU}9yCK5mNS^G>84~y]DΪoCMFZk4Nk_-6MQ"xc`Ue[Ӭkۦc#"bQDD`Ze6uw2g4_y߇zIn MK=鼴ʓ6vM,1f0C7kS#[׌A:zصD I#;<aeYzȞsOʯtEu6_ͿSoVKH ㎏L;Q&YȾtIBOX(Ivz8˲9P/|6zLk*\^dSRvy784 zDKD`è,wmOG*/"bGGaѕ }ol3ƍ)Ϊ:w\e#C3gc.ӕDU"jIsDča4)eL4ɱ#t:R2ԳJIhYkU^^Md, Uڬ5r束m\X}t9m|՜M]V_njz 3̾}(ΪƩx#͕m *V?q于8nj͌d6-8/''9QQvwƖij9e[UbxYy%YPME Ub~VDc1vc_Uyl&YŮ# #S+"V0$ TfXIn޽{Ϭ;lB9}͛7―m֭ m۶)qKB, a$qKB, a$qKB, a$g+3mTښ>I;~qux>ILEq9,/1"Wysuj#ˆjqi\8:Жcr'ΈH_Į6LJufg94Arc('dG~Ɯdf;VAr9Gqn%sRK}x6kqv\Ͼhz2˛!]GD,/)fвT_~_U$,˟y`Iw> Ԩ;Hi`K 쒑-;ˉgߪmhm鵏\gAX*MXbۻwܱcǖ-[ΤP&gi^Oْ{~ ۷o޼h[nXm۶poXXh6#3 Vi3XX8`I%!0X8`I%!0X8`I%9a='] mS%ǡBqGi9 W8n̝0N%e5>л#MEjYQ<"]<7fQ,&3Mqv։Y䧍4PRʏR $qݺH*jYR$ui4V"i$լ5k?3/ uWD?@͗g4'Akc+{rkh`+.۵=?ƙh8-Kix95?ؔ`9sc_ gUV皭5_&".w,3tv x ,۱DgM^i3H_N=ܲy=nw^;*&+u^0vIMobq,RI-'V'9N\mWܦztʼn#*΋DHZdmc#?. ^ p6ۻwܱcǖ-[ 8o߾ySrmݺbmvt{=0X8`I%!0X8`I%!0X8`I%!0 ط׭_goW*myti]檤YLu3}bc?-/OnݓLO};(zm[rp\'< \Dz,r0-#}s EȴrϰMdLx +_X¸btQW?|SʭMIV: W ""*KUhڢscgQRy7:thh2ü؋f1ƴK"35+mv,b8ӦJQaq "e "߱M7K|8Q^4o"O)7׃:r8 }wfjz*VED (=Qxa ΈEJ)0㮵EA'ΈfTyj_7YOw, = tf(clj^ĴgYg-Hy*x{ӆz_(pdhJ-"'\v{Q iD` m< 'Te'"-:Jވ㺶%" tYZcObId>qr$Q{Jy3!ͷ^Fy4Z6wqZ`6,dO#$!eeլjiHߔǮ%"*DNPY"(g7 Ә$7 ILWTi%"i.UXńqby:JkT uE]0aC=>ˠqDĘ,c\''gȓd[ư1}ol,^#JG=]z8C/=MKmDD"?*z۶Edhg}FDvу(c͹+lQ`ՓigD/bKnSXŽMUEFJD,/u=ߏ 'ވ3 R*y9RNv;3 D&YƮqX#oU^vߪkU U(ǛȤ h{f=wرe*Ρ۷o޼h[nXm۶^O9 0X8`I%!0X8`I%!0X8`I%YLgDroLEq9P+֌Pâø"u]NjgZLaκu=Eh{sO1K.F뺮rlAĴRaAx~7üGa͏M)7H>}1Jwgĥ"ǍB׶O?TGM7K|R;\a,ւ8]d7]u7sIފ]u]3 ˯pigDL;h۫,qv'<yUWuy2i=uU׳JFRMۮ94~y]DAq5 m5Mevju;8YPh;Ue[ӬkۦcÉ(?%InUz;֪.gyٵMIbۏaTiź*L|[D,7 i9Id0 , &I$m+IczZ,bWƙvqt}Wy0_gyȩkƮ n?톣Io4GVhݐUOnYX]au*diWnO8r]q7mohA0+'%Zvjԋ4pl7 Ub~VDTm7[oV؛dAX*MXʒ$P%b2,:l޽{Ϭ;lre;>!Mmr:&\۷o߼y)XYY9ѶnJIp۶m;/B< $9;~J۞ SzJ,a$qKB, a$qKB, a$qai;&g12m_Ѩ6bez?vMW7=8 8\UJB6U* Ϗf1,(Gy}}E(`Tcn]R 1UQڶ6:if&`T{*\GY*7;#s0q=PBYLחL]"":dӎq?t&s()HvֺQ8鞌غ<i,(E̠6-1mywM:\sy8%bvvθjڶ iY7m,k=uU׳JFq,&mbϏFyDX$g[Ǯ%"NvS|?FM~_UGouq* \uxMFr@ĝZo> X{gXltk~ >!ah5eDٰQ,7,SoL9cYAϛ:vDDL۱j&;= YdZ։erO'oy[N|`i2}7i0OgY D;5"k(T* &+:#"}]ӼDtE8A BdG wW0LWjM,9l, "}&d܍$Kqn%sRK-nS_8aVN<˒FI&b"vlm2rcY 2,iZޤ I:"byI1eq-""UthYFAZNJF>]G[w3cǎ-[մK몞RtMy<%l߾}ͧ8`eeĝoy[LnJIp۶m;rg\pƵ\wG-8KX, a$qlxϬe]c*Ρ. `/c,IENDB`django-uwsgi-0.1.3/docs/contributing.rst0000775000175000017500000000017112516641220022237 0ustar mechanismmechanism00000000000000Contributing ============ .. _Code Style: Code Style ---------- .. _Docs: Docs ---- .. _Tests: Tests ----- django-uwsgi-0.1.3/docs/command.rst0000664000175000017500000000065412516641220021151 0ustar mechanismmechanism00000000000000Management Command ================== runuwsgi -------- .. code-block:: sh python manage.py runuwsgi runuwsgi options: ----------------- http ---- .. code-block:: sh python manage.py runuwsgi http=8000 socket ------ .. code-block:: sh python manage.py runuwsgi socket=/tmp/projectname-uwsgi.sock Other options ------------- Any other options can be passed via environment variables, prefixed with `UWSGI_`django-uwsgi-0.1.3/docs/email.rst0000664000175000017500000000211112516641220020610 0ustar mechanismmechanism00000000000000Email Backend ============= A Django backend for e-mail delivery using uWSGI Spool to queue deliveries. Usage ----- First, add uWSGI backend in your settings file. .. code-block:: py EMAIL_BACKEND = 'django_uwsgi.mail.EmailBackend' And send your e-mails normally. .. code-block:: py from django.core.mail import send_mail send_mail('Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False) Note ---- You must setup uwsgi spooler. Example ini: .. code-block:: ini plugin = spooler spooler = /tmp spooler-import = django_uwsgi.task or use built in management command `runuwsgi` Changing the backend -------------------- By default the 'django.core.mail.backends.smtp.EmailBackend' is used for the real e-mail delivery. You can change that using: .. code-block:: py UWSGI_EMAIL_BACKEND = 'your.backend.EmailBackend' django-configurations --------------------- If you're using django-configurations in your project, you must setup importer as mentioned in django-configurations docs for celerydjango-uwsgi-0.1.3/docs/index.rst0000775000175000017500000000076112516641220020644 0ustar mechanismmechanism00000000000000Welcome to Django-uWSGI's documentation! ======================================== You can view the code of this project or fork it (please, send pull requests), at `Github `_. .. toctree:: :maxdepth: 2 features installation configuration decorators email cache command integrations screenshots todo changelog contributing Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search`django-uwsgi-0.1.3/docs/configuration.rst0000775000175000017500000000057112516641220022403 0ustar mechanismmechanism00000000000000Configuration ============= Adding django-uwsgi to your project ----------------------------------- Add ``'django_uwsgi',`` to your ``INSTALLED_APPS`` in ``settings.py``: .. code-block:: py INSTALLED_APPS += ('django_uwsgi',) Add django_uwsgi into ``urls.py``: .. code-block:: py urlpatterns += patterns('', url(r'^admin/uwsgi/', include('django_uwsgi.urls')),)django-uwsgi-0.1.3/docs/Makefile0000775000175000017500000001520212516641220020437 0ustar mechanismmechanism00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/django-uwsgi.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/django-uwsgi.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/django-uwsgi" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/django-uwsgi" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." django-uwsgi-0.1.3/docs/screenshots.rst0000664000175000017500000000045512516641220022072 0ustar mechanismmechanism00000000000000Screenshots =========== `django-debug-toolbar `_ panel .. image:: screenshots/screenshot1.png `Wagtail `_ admin interface: .. image:: screenshots/screenshot2.png .. image:: screenshots/screenshot3.pngdjango-uwsgi-0.1.3/docs/installation.rst0000775000175000017500000000170612516641220022236 0ustar mechanismmechanism00000000000000Installation ============ django-uwsgi is easy installable via pip: .. code-block:: sh pip install django-uwsgi or clone it from `github `_: .. code-block:: sh git clone https://github.com/unbit/django-uwsgi.git cd django-uwsgi python setup.py install By default ``django-uwsgi`` doesn’t installed with uWSGI as requirement. And here are a few known reasons why: * Django project installed into virtualenv and running in `Emperor `_ mode. In this case uWSGI is installed system-wide or into some other virtualenv. * Some devs love to use system package managers like apt and prefer to install uwsgi other way. * you need to build uWSGI with custom profile ex: ``UWSGI_PROFILE=gevent pip install uwsgi`` You can install django-uwsgi with uWSGI by appending [uwsgi] to the install command: .. code-block:: sh pip install django-uwsgi[uwsgi]django-uwsgi-0.1.3/docs/decorators.rst0000775000175000017500000002330412516641220021700 0ustar mechanismmechanism00000000000000Decorators ========== `The uWSGI API `_ is very low-level, as it must be language-independent. That said, being too low-level is not a Good Thing for many languages, such as Python. Decorators are, in our humble opinion, one of the more kick-ass features of Python, so in the uWSGI source tree you will find a module exporting a bunch of decorators that cover a good part of the uWSGI API. Notes ----- Signal-based decorators execute the signal handler in the first available worker. If you have enabled the spooler you can execute the signal handlers in it, leaving workers free to manage normal requests. Simply pass ``target='spooler'`` to the decorator. .. code-block:: py @timer(3, target='spooler') def hello(signum): print("hello") Example: a Django session cleaner and video encoder --------------------------------------------------- Let's define a :file:`tasks.py` module and put it in the Django project directory. .. code-block:: py import os from django.contrib.sessions.models import Session from django_uwsgi.decorators import cron, spool @cron(40, 2, -1, -1, -1) def clear_django_session(num): print("it's 2:40 in the morning: clearing django sessions") Session.objects.all().delete() @spool def encode_video(arguments): os.system("ffmpeg -i \"%s\" image%%d.jpg" % arguments['filename']) The session cleaner will be executed every day at 2:40, to enqueue a video encoding we simply need to spool it from somewhere else. .. code-block:: py from tasks import encode_video def index(request): # launching video encoding encode_video.spool(filename=request.POST['video_filename']) return render_to_response('enqueued.html') Now run uWSGI with the spooler enabled: .. code-block:: ini [uwsgi] ; a couple of placeholder django_projects_dir = /var/www/apps my_project = foobar ; chdir to app project dir and set pythonpath chdir = %(django_projects_dir)/%(my_project) pythonpath = %(django_projects_dir) ; load django module = django.core.handlers:WSGIHandler() env = DJANGO_SETTINGS_MODULE=%(my_project).settings ; enable master master = true ; 4 processes should be enough processes = 4 ; enable the spooler (the mytasks dir must exist!) spooler = %(chdir)/mytasks ; load the task.py module import = task ; bind on a tcp socket socket = 127.0.0.1:3031 The only especially relevant option is the ``import`` one. It works in the same way as ``module`` but skips the WSGI callable search. You can use it to preload modules before the loading of WSGI apps. You can specify an unlimited number of '''import''' directives. django_uwsgi.decorators API reference ----------------------------- .. default-domain:: py .. module:: django_uwsgi.decorators .. function:: postfork(func) uWSGI is a preforking (or "fork-abusing") server, so you might need to execute a fixup task after each ``fork()``. The ``postfork`` decorator is just the ticket. You can declare multiple ``postfork`` tasks. Each decorated function will be executed in sequence after each ``fork()``. .. code-block:: py @postfork def reconnect_to_db(): myfoodb.connect() @postfork def hello_world(): print("Hello World") .. function:: spool(func) The uWSGI `spooler `_ can be very useful. Compared to Celery or other queues it is very "raw". The ``spool`` decorator will help! .. code-block:: py @spool def a_long_long_task(arguments): print(arguments) for i in xrange(0, 10000000): time.sleep(0.1) @spool def a_longer_task(args): print(args) for i in xrange(0, 10000000): time.sleep(0.5) # enqueue the tasks a_long_long_task.spool(foo='bar',hello='world') a_longer_task.spool({'pippo':'pluto'}) The functions will automatically return ``uwsgi.SPOOL_OK`` so they will be executed one time independently by their return status. .. XXX: What does the above mean? .. function:: spoolforever(func) Use ``spoolforever`` when you want to continuously execute a spool task. A ``@spoolforever`` task will always return ``uwsgi.SPOOL_RETRY``. .. code-block:: py @spoolforever def a_longer_task(args): print(args) for i in xrange(0, 10000000): time.sleep(0.5) # enqueue the task a_longer_task.spool({'pippo':'pluto'}) .. function:: spoolraw(func) Advanced users may want to control the return value of a task. .. code-block:: py @spoolraw def a_controlled_task(args): if args['foo'] == 'bar': return uwsgi.SPOOL_OK return uwsgi.SPOOL_RETRY a_controlled_task.spool(foo='bar') .. function:: rpc("name", func) uWSGI `RPC `_ is the fastest way to remotely call functions in applications hosted in uWSGI instances. You can easily define exported functions with the @rpc decorator. .. code-block:: py @rpc('helloworld') def ciao_mondo_function(): return "Hello World" .. function:: signal(num)(func) You can register signals for the `signal framework `_ in one shot. .. code-block:: py @signal(17) def my_signal(num): print("i am signal %d" % num) .. function:: timer(interval, func) Execute a function at regular intervals. .. code-block:: py @timer(3) def three_seconds(num): print("3 seconds elapsed") .. function:: rbtimer(interval, func) Works like @timer but using red black timers. .. XXX: What the hell does _that_ mean? .. function:: cron(min, hour, day, mon, wday, func) Easily register functions for the `CronInterface `_. .. code-block:: py @cron(59, 3, -1, -1, -1) def execute_me_at_three_and_fiftynine(num): print("it's 3:59 in the morning") Since 1.2, a new syntax is supported to simulate ``crontab``-like intervals (every Nth minute, etc.). ``*/5 * * * *`` can be specified in uWSGI like thus: .. code-block:: py @cron(-5, -1, -1, -1, -1) def execute_me_every_five_min(num): print("5 minutes, what a long time!") .. function:: filemon(path, func) Execute a function every time a file/directory is modified. .. code-block:: py @filemon("/tmp") def tmp_has_been_modified(num): print("/tmp directory has been modified. Great magic is afoot") .. function:: erlang(process_name, func) Map a function as an `Erlang ` process. .. code-block:: py @erlang('foobar') def hello(): return "Hello" .. function:: thread(func) Mark function to be executed in a separate thread. .. important:: Threading must be enabled in uWSGI with the ``enable-threads`` or ``threads `` option. .. code-block:: py @thread def a_running_thread(): while True: time.sleep(2) print("i am a no-args thread") @thread def a_running_thread_with_args(who): while True: time.sleep(2) print("Hello %s (from arged-thread)" % who) a_running_thread() a_running_thread_with_args("uWSGI") You may also combine ``@thread`` with ``@postfork`` to spawn the postfork handler in a new thread in the freshly spawned worker. .. code-block:: py @postfork @thread def a_post_fork_thread(): while True: time.sleep(3) print("Hello from a thread in worker %d" % uwsgi.worker_id()) .. function:: lock(func) This decorator will execute a function in fully locked environment, making it impossible for other workers or threads (or the master, if you're foolish or brave enough) to run it simultaneously. Obviously this may be combined with @postfork. .. code-block:: py @lock def dangerous_op(): print("Concurrency is for fools!") .. function:: mulefunc([mulespec], func) Offload the execution of the function to a `mule `. When the offloaded function is called, it will return immediately and execution is delegated to a mule. .. code-block:: py @mulefunc def i_am_an_offloaded_function(argument1, argument2): print argument1,argument2 You may also specify a mule ID or mule farm to run the function on. Please remember to register your function with a uwsgi import configuration option. .. code-block:: py @mulefunc(3) def on_three(): print "I'm running on mule 3." @mulefunc('old_mcdonalds_farm') def on_mcd(): print "I'm running on a mule on Old McDonalds' farm." .. function:: harakiri(time, func) Starting from uWSGI 1.3-dev, a customizable secondary :term:`harakiri` subsystem has been added. You can use this decorator to kill a worker if the given call is taking too long. .. code-block:: py @harakiri(10) def slow_function(foo, bar): for i in range(0, 10000): for y in range(0, 10000): pass # or the alternative lower level api uwsgi.set_user_harakiri(30) # you have 30 seconds. fight! slow_func() uwsgi.set_user_harakiri(0) # clear the timer, all is well .. _Emperor: http://uwsgi-docs.readthedocs.org/en/latest/Emperor.html django-uwsgi-0.1.3/.editorconfig0000775000175000017500000000026712516641220020531 0ustar mechanismmechanism00000000000000# editorconfig.org root = true [*] end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.{py,rst,ini}] indent_style = space indent_size = 4django-uwsgi-0.1.3/CONTRIBUTORS0000775000175000017500000000030412516641220017724 0ustar mechanismmechanism00000000000000Roberto De Ioris, Unbit, Eugene MechanisM, MechanisM, Ionel Cristian Mărieș, Jayson Reis, jaysonsantos, django-uwsgi-0.1.3/PKG-INFO0000664000175000017500000000437412516642453017162 0ustar mechanismmechanism00000000000000Metadata-Version: 1.1 Name: django-uwsgi Version: 0.1.3 Summary: uWSGI stuff for Django projects Home-page: http://github.com/unbit/django-uwsgi Author: Eugene MechanisM Author-email: eugene@mechanism.name License: MIT Description: django-uwsgi ~~~~~~~~~~~~ Django related examples/tricks/modules for uWSGI Screenshots ~~~~~~~~~~~ `django-debug-toolbar `_ panel .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot1.png `Wagtail `_ admin interface: .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot2.png .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot3.png Documentation ~~~~~~~~~~~~~ `Read the documentation at rtfd.org `_ Contributors ~~~~~~~~~~~~ See `CONTRIBUTORS `_ License ~~~~~~~ `MIT `_ Keywords: uwsgi,django,mail,cache,template Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: Django Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.4 Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Internet :: WWW/HTTP :: WSGI Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Internet :: WWW/HTTP :: Site Management Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Code Generators Classifier: Topic :: Communications :: Email Classifier: Framework :: Django django-uwsgi-0.1.3/django_uwsgi/0000775000175000017500000000000012516642453020535 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/emperor/0000775000175000017500000000000012516642453022206 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/emperor/admin.py0000775000175000017500000000046212516641220023644 0ustar mechanismmechanism00000000000000from django.contrib import admin from .models import Vassal class VassalAdmin(admin.ModelAdmin): list_display = ['title', 'extension', 'updated', 'created', 'enabled', 'ts'] search_fields = ['title'] list_filter = ('enabled', 'created', 'extension') admin.site.register(Vassal, VassalAdmin) django-uwsgi-0.1.3/django_uwsgi/emperor/__init__.py0000775000175000017500000000010012516641220024300 0ustar mechanismmechanism00000000000000 default_app_config = 'django_uwsgi.emperor.apps.EmperorConfig' django-uwsgi-0.1.3/django_uwsgi/emperor/models.py0000775000175000017500000000453512516641220024044 0ustar mechanismmechanism00000000000000import time from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils.text import get_valid_filename, slugify from django.utils.encoding import python_2_unicode_compatible EXTENSION_CHOICES = ( ('.ini', _('INI file')), ('.yml', _('YAML file')), ('.xml', _('XML file')), ('.json', _('JSON file')), ) @python_2_unicode_compatible class Vassal(models.Model): """ Model for uWSGI Vassals """ title = models.CharField( _('Name'), max_length=250 ) name = models.CharField( _('Filename'), help_text=_('Name of uwsgi config file'), max_length=255, db_column='name', editable=False ) extension = models.CharField( _('Extension'), max_length=4, default=EXTENSION_CHOICES[0], choices=EXTENSION_CHOICES ) config = models.TextField( _('Config'), help_text=_('Config file blob'), db_column='config' ) ts = models.FloatField( _('Unix Timestamp'), help_text=_('A number representing the modification time of this row in UNIX format'), db_column='ts', editable=False ) uid = models.PositiveSmallIntegerField( _('The UID of the vassal instance'), help_text=_('Required in Tyrant mode (secure multi-user hosting) mode only.'), db_column='uid', blank=True, null=True ) gid = models.PositiveSmallIntegerField( _('The GID of the vassal instance'), help_text=_('Required in Tyrant mode (secure multi-user hosting) mode only.'), db_column='gid', blank=True, null=True ) created = models.DateTimeField( _('Created at'), auto_now_add=True ) updated = models.DateTimeField( _('Updated'), auto_now=True, blank=True, null=True ) enabled = models.BooleanField( _('Enabled'), default=True ) def __str__(self): return self.title def save(self, *args, **kwargs): self.name = get_valid_filename(slugify(self.title) + self.extension) self.ts = time.time() super(Vassal, self).save(*args, **kwargs) class Meta: verbose_name = _("Emperor's Vassal") verbose_name_plural = _("Emperor's Vassals") db_table = 'vassals' django-uwsgi-0.1.3/django_uwsgi/emperor/apps.py0000775000175000017500000000024512516641220023516 0ustar mechanismmechanism00000000000000from django.apps import AppConfig class EmperorConfig(AppConfig): name = 'django_uwsgi.emperor' label = 'uwsgi_emperor' verbose_name = 'uWSGI Emperor' django-uwsgi-0.1.3/django_uwsgi/templates/0000775000175000017500000000000012516642453022533 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/templates/uwsgi/0000775000175000017500000000000012516642453023671 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/templates/uwsgi/wagtail_uwsgi.html0000775000175000017500000001611212516641553027431 0ustar mechanismmechanism00000000000000{% extends "wagtailadmin/base.html" %} {% load i18n %} {% block titletag %}{% trans "uWSGI Status" %}{% endblock %} {% block bodyclass %}uwsgi{% endblock %} {% block content %} {% if unavailable %} {% trans 'ERROR: uWSGI is not available!' as uwsgi_header %} {% include "wagtailadmin/shared/header.html" with title=uwsgi_header icon="cogs" %} {% else %} {% trans "uWSGI Status" as uwsgi_header %} {% include "wagtailadmin/shared/header.html" with title=uwsgi_header subtitle=version icon="cogs" tabbed="true" merged="true" %}

{% trans 'Information' %}

{% for key, value in stats %} {% endfor %}
{% trans "Option" %} {% trans "Value" %}

{{ key }}

{{ value }}

{% trans 'Options' %}

{% for key, value in options %} {# uWSGI allows to use options without values if value = true #} {% endfor %}
{% trans "Option" %} {% trans "Value" %}

{{ key }}

{% if value %}{{ value }}{% else %}true{% endif %}

{% trans 'Magic table' %}

{{ magic }}

{% trans 'Workers' %}

{% for w in workers %} {% endfor %}
{% trans "id" %} {% trans "pid" %} {% trans "status" %} {% trans "requests" %} {% trans "exceptions" %} {% trans "signals" %} {% trans "running time(ms)" %} {% trans "avg response time(ms)" %} {% trans "load" %} {% trans "last spawn" %} {% trans "respawn count" %} {% trans "address space (vsz)" %} {% trans "resident memory (rss)" %}
{{ w.id }} {{ w.pid }} {{ w.status }} {{ w.requests }} {{ w.exceptions }} {{ w.signals }} {{ w.running_time }} {{ w.avg_rt }} {{ w.load|floatformat:2 }} % {{ w.last_spawn }} {{ w.respawn_count }} {{ w.vsz|filesizeformat }} {{ w.rss|filesizeformat }}

{% trans 'Applications' %}

{% for w in workers %} {% for app in w.apps %} {% endfor %} {% endfor %}
{% trans "#" %} {% trans "modifier1" %} {% trans "mountpoint" %} {% trans "interpreter" %} {% trans "callable" %} {% trans "chdir" %} {% trans "requests" %} {% trans "exceptions" %}
{{ app.id }} {{ app.modifier1 }} {{ app.mountpoint }} {{ app.interpreter }} {{ app.callable }} {{ app.chdir }} {{ app.requests }} {{ app.exceptions }}

{% trans 'Spooler' %}

{% for j in jobs %} {% endfor %}
{% trans "job filename" %} {% trans "environment" %}
{{ j.file }} {{ j.env }}
{% endif %} {% endblock %}django-uwsgi-0.1.3/django_uwsgi/templates/uwsgi/panel.html0000775000175000017500000001205512516641616025664 0ustar mechanismmechanism00000000000000{% load i18n %} {% if unavailable %}

{% trans 'ERROR: uWSGI is not available!' %}

{% else %} {% endif %} django-uwsgi-0.1.3/django_uwsgi/templates/uwsgi/uwsgi.html0000775000175000017500000000137312516641220025713 0ustar mechanismmechanism00000000000000{% extends "admin/base_site.html" %} {% load i18n admin_urls admin_static admin_list %} {% block title %}{% trans "uWSGI Stats" %}{% endblock %} {% block extrastyle %} {{ block.super }} {% endblock %} {% if not is_popup %} {% block breadcrumbs %} {% endblock %} {% endif %} {% block bodyclass %}{{ block.super }} app-django_uwsgi model-status change-list{% endblock %} {% block coltype %}flex{% endblock %} {% block content %} {% include "uwsgi/panel.html" %} {% endblock %} django-uwsgi-0.1.3/django_uwsgi/templates/uwsgi/wagtail_dashboard_item.html0000775000175000017500000000050312516641220031224 0ustar mechanismmechanism00000000000000{% load i18n wagtailadmin_tags %}
  • {% blocktrans count counter=workers with workers|intcomma as total %} {{ total }} uWSGI Worker {% plural %} {{ total }} uWSGI Workers {% endblocktrans %}
  • django-uwsgi-0.1.3/django_uwsgi/mail.py0000775000175000017500000000102312516641220022017 0ustar mechanismmechanism00000000000000from django.core.mail.backends.base import BaseEmailBackend from . import pickle class EmailBackend(BaseEmailBackend): def send_messages(self, email_messages): num_sent = 0 if not email_messages: return for email_message in email_messages: if self._send(email_message): num_sent += 1 return num_sent def _send(self, email_message): from .task import send_mail send_mail.spool(body=pickle.dumps(email_message, 2)) return Truedjango-uwsgi-0.1.3/django_uwsgi/decorators.py0000775000175000017500000002460412516641220023254 0ustar mechanismmechanism00000000000000""" uWSGI decorators shipped with django-uwsgi in case if uWSGI installed system-wide, and django project runs in Emperor mode and using virtualenv, so uwsgidecorators module not importable. """ from functools import partial import sys from threading import Thread from . import uwsgi, pickle if uwsgi is None: raise ImportError("uWSGI is not available") if uwsgi.masterpid() == 0: raise Exception( "you have to enable the uWSGI master process to use this module") spooler_functions = {} mule_functions = {} postfork_chain = [] # Python3 compatibility def _encode1(val): if sys.version_info >= (3, 0) and isinstance(val, str): return val.encode('utf-8') else: return val def _decode1(val): if sys.version_info >= (3, 0) and isinstance(val, bytes): return val.decode('utf-8') else: return val def _encode_to_spooler(vars): return dict((_encode1(K), _encode1(V)) for (K, V) in vars.items()) def _decode_from_spooler(vars): return dict((_decode1(K), _decode1(V)) for (K, V) in vars.items()) def get_free_signal(): for signum in range(0, 256): if not uwsgi.signal_registered(signum): return signum raise Exception("No free uwsgi signal available") def manage_spool_request(vars): # To check whether 'args' is in vals or not - decode the keys first, # because in python3 all keys in 'vals' are have 'byte' types vars = dict((_decode1(K), V) for (K, V) in vars.items()) if 'args' in vars: for k in ('args', 'kwargs'): vars[k] = pickle.loads(vars.pop(k)) vars = _decode_from_spooler(vars) f = spooler_functions[vars['ud_spool_func']] if 'args' in vars: ret = f(*vars['args'], **vars['kwargs']) else: ret = f(vars) return int(vars.get('ud_spool_ret', ret)) def postfork_chain_hook(): for f in postfork_chain: f() uwsgi.spooler = manage_spool_request uwsgi.post_fork_hook = postfork_chain_hook class postfork(object): def __init__(self, f): if callable(f): self.wid = 0 self.f = f else: self.f = None self.wid = f postfork_chain.append(self) def __call__(self, *args, **kwargs): if self.f: if self.wid > 0 and self.wid != uwsgi.worker_id(): return return self.f() self.f = args[0] class _spoolraw(object): def __call__(self, *args, **kwargs): arguments = self.base_dict.copy() if not self.pass_arguments: if len(args) > 0: arguments.update(args[0]) if kwargs: arguments.update(kwargs) else: spooler_args = {} for key in ('message_dict', 'spooler', 'priority', 'at', 'body'): if key in kwargs: spooler_args.update({key: kwargs.pop(key)}) arguments.update(spooler_args) arguments.update( {'args': pickle.dumps(args), 'kwargs': pickle.dumps(kwargs)}) return uwsgi.spool(_encode_to_spooler(arguments)) # For backward compatibility (uWSGI < 1.9.13) def spool(self, *args, **kwargs): return self.__class__.__call__(self, *args, **kwargs) def __init__(self, f, pass_arguments): if not 'spooler' in uwsgi.opt: raise Exception( "you have to enable the uWSGI spooler to use @%s decorator" % self.__class__.__name__) self.f = f spooler_functions[self.f.__name__] = self.f # For backward compatibility (uWSGI < 1.9.13) self.f.spool = self.__call__ self.pass_arguments = pass_arguments self.base_dict = {'ud_spool_func': self.f.__name__} class _spool(_spoolraw): def __call__(self, *args, **kwargs): self.base_dict['ud_spool_ret'] = str(uwsgi.SPOOL_OK) return _spoolraw.__call__(self, *args, **kwargs) class _spoolforever(_spoolraw): def __call__(self, *args, **kwargs): self.base_dict['ud_spool_ret'] = str(uwsgi.SPOOL_RETRY) return _spoolraw.__call__(self, *args, **kwargs) def spool_decorate(f=None, pass_arguments=False, _class=_spoolraw): if not f: return partial(_class, pass_arguments=pass_arguments) return _class(f, pass_arguments) def spoolraw(f=None, pass_arguments=False): return spool_decorate(f, pass_arguments) def spool(f=None, pass_arguments=False): return spool_decorate(f, pass_arguments, _spool) def spoolforever(f=None, pass_arguments=False): return spool_decorate(f, pass_arguments, _spoolforever) class mulefunc(object): def __init__(self, f): if callable(f): self.fname = f.__name__ self.mule = 0 mule_functions[f.__name__] = f else: self.mule = f self.fname = None def real_call(self, *args, **kwargs): uwsgi.mule_msg(pickle.dumps( { 'service': 'uwsgi_mulefunc', 'func': self.fname, 'args': args, 'kwargs': kwargs } ), self.mule) def __call__(self, *args, **kwargs): if not self.fname: self.fname = args[0].__name__ mule_functions[self.fname] = args[0] return self.real_call return self.real_call(*args, **kwargs) def mule_msg_dispatcher(message): msg = pickle.loads(message) if msg['service'] == 'uwsgi_mulefunc': return mule_functions[msg['func']](*msg['args'], **msg['kwargs']) uwsgi.mule_msg_hook = mule_msg_dispatcher class rpc(object): def __init__(self, name): self.name = name def __call__(self, f): uwsgi.register_rpc(self.name, f) return f class farm_loop(object): def __init__(self, f, farm): self.f = f self.farm = farm def __call__(self): if uwsgi.mule_id() == 0: return if not uwsgi.in_farm(self.farm): return while True: message = uwsgi.farm_get_msg() if message: self.f(message) class farm(object): def __init__(self, name=None, **kwargs): self.name = name def __call__(self, f): postfork_chain.append(farm_loop(f, self.name)) class mule_brain(object): def __init__(self, f, num): self.f = f self.num = num def __call__(self): if uwsgi.mule_id() == self.num: try: self.f() except: exc = sys.exc_info() sys.excepthook(exc[0], exc[1], exc[2]) sys.exit(1) class mule_brainloop(mule_brain): def __call__(self): if uwsgi.mule_id() == self.num: while True: try: self.f() except: exc = sys.exc_info() sys.excepthook(exc[0], exc[1], exc[2]) sys.exit(1) class mule(object): def __init__(self, num): self.num = num def __call__(self, f): postfork_chain.append(mule_brain(f, self.num)) class muleloop(mule): def __call__(self, f): postfork_chain.append(mule_brainloop(f, self.num)) class mulemsg_loop(object): def __init__(self, f, num): self.f = f self.num = num def __call__(self): if uwsgi.mule_id() == self.num: while True: message = uwsgi.mule_get_msg() if message: self.f(message) class mulemsg(object): def __init__(self, num): self.num = num def __call__(self, f): postfork_chain.append(mulemsg_loop(f, self.num)) class signal(object): def __init__(self, num, **kwargs): self.num = num self.target = kwargs.get('target', '') def __call__(self, f): uwsgi.register_signal(self.num, self.target, f) return f class timer(object): def __init__(self, secs, **kwargs): self.num = kwargs.get('signum', get_free_signal()) self.secs = secs self.target = kwargs.get('target', '') def __call__(self, f): uwsgi.register_signal(self.num, self.target, f) uwsgi.add_timer(self.num, self.secs) return f class cron(object): def __init__(self, minute, hour, day, month, dayweek, **kwargs): self.num = kwargs.get('signum', get_free_signal()) self.minute = minute self.hour = hour self.day = day self.month = month self.dayweek = dayweek self.target = kwargs.get('target', '') def __call__(self, f): uwsgi.register_signal(self.num, self.target, f) uwsgi.add_cron(self.num, self.minute, self.hour, self.day, self.month, self.dayweek) return f class rbtimer(object): def __init__(self, secs, **kwargs): self.num = kwargs.get('signum', get_free_signal()) self.secs = secs self.target = kwargs.get('target', '') def __call__(self, f): uwsgi.register_signal(self.num, self.target, f) uwsgi.add_rb_timer(self.num, self.secs) return f class filemon(object): def __init__(self, fsobj, **kwargs): self.num = kwargs.get('signum', get_free_signal()) self.fsobj = fsobj self.target = kwargs.get('target', '') def __call__(self, f): uwsgi.register_signal(self.num, self.target, f) uwsgi.add_file_monitor(self.num, self.fsobj) return f class erlang(object): def __init__(self, name): self.name = name def __call__(self, f): uwsgi.erlang_register_process(self.name, f) return f class lock(object): def __init__(self, f): self.f = f def __call__(self, *args, **kwargs): # ensure the spooler will not call it if uwsgi.i_am_the_spooler(): return uwsgi.lock() try: return self.f(*args, **kwargs) finally: uwsgi.unlock() class thread(object): def __init__(self, f): self.f = f def __call__(self, *args): t = Thread(target=self.f, args=args) t.daemon = True t.start() return self.f class harakiri(object): def __init__(self, seconds): self.s = seconds def real_call(self, *args, **kwargs): uwsgi.set_user_harakiri(self.s) r = self.f(*args, **kwargs) uwsgi.set_user_harakiri(0) return r def __call__(self, f): self.f = f return self.real_call django-uwsgi-0.1.3/django_uwsgi/__init__.py0000775000175000017500000000033012516642137022644 0ustar mechanismmechanism00000000000000__version__ = '0.1.3' try: import uwsgi except ImportError: uwsgi = None try: import cPickle as pickle except ImportError: import pickle default_app_config = 'django_uwsgi.apps.DjangoUwsgiConfig' django-uwsgi-0.1.3/django_uwsgi/wagtail_hooks.py0000775000175000017500000000220312516641220023731 0ustar mechanismmechanism00000000000000from django.conf.urls import include, url from django.core.urlresolvers import reverse_lazy from django.utils.translation import ugettext_lazy as _ from wagtail.wagtailcore import hooks from wagtail.wagtailadmin.menu import MenuItem from wagtail.wagtailadmin.site_summary import SummaryItem from . import uwsgi, urls class UwsgiSummaryItem(SummaryItem): order = 800 template = 'uwsgi/wagtail_dashboard_item.html' def get_context(self): if uwsgi is None: workers = '0' else: workers = uwsgi.numproc return {'workers': workers} @hooks.register('construct_homepage_summary_items') def add_uwsgi_summary_item(request, items): items.append(UwsgiSummaryItem(request)) @hooks.register('register_admin_urls') def register_admin_urls(): return [ url(r'^uwsgi/', include(urls)), ] class UwsgiMenuItem(MenuItem): def is_shown(self, request): return request.user.is_staff @hooks.register('register_settings_menu_item') def register_uwsgi_menu_item(): return UwsgiMenuItem(_('uWSGI Status'), reverse_lazy('uwsgi_index'), classnames='icon icon-cogs', order=800) django-uwsgi-0.1.3/django_uwsgi/panels.py0000775000175000017500000000140412516641220022362 0ustar mechanismmechanism00000000000000from debug_toolbar.panels import Panel from django.utils.translation import ugettext_lazy as _ from . import uwsgi class UwsgiPanel(Panel): """uWSGI Debug Toolbar Panel""" title = _('uWSGI Status') nav_title = _('uWSGI Status') template = 'uwsgi/panel.html' @property def nav_subtitle(self): if uwsgi is not None: status = _('Version %s, %d Workers') % ( uwsgi.version, uwsgi.numproc) else: status = _('uWSGI is missing =(') return status def process_response(self, request, response): if uwsgi is None: self.record_stats({'unavailable': True}) else: from .stats import get_uwsgi_stats self.record_stats(get_uwsgi_stats()) django-uwsgi-0.1.3/django_uwsgi/stats.py0000775000175000017500000000320112516641220022233 0ustar mechanismmechanism00000000000000import os import time from datetime import datetime from django.utils.translation import ugettext_lazy as _ from . import uwsgi def get_uwsgi_stats(): uwsgi_stats = {} workers = uwsgi.workers() total_load = time.time() - uwsgi.started_on for w in workers: w['running_time'] = w['running_time'] / 1000 w['load'] = w['running_time'] / total_load / 10 / len(workers) w['last_spawn'] = datetime.fromtimestamp(w['last_spawn']) jobs = [] if uwsgi.opt['spooler']: spooler_jobs = uwsgi.spooler_jobs() for j in spooler_jobs: jobs.append({'file': j, 'env': uwsgi.parsefile(j)}) uwsgi_stats.update({ 'version': uwsgi.version, 'hostname': uwsgi.hostname, 'magic': uwsgi.magic_table, 'os': os.uname(), 'masterpid': uwsgi.masterpid(), 'stats': [ ('loop', uwsgi.loop), ('masterpid', str(uwsgi.masterpid())), ('started_on', datetime.fromtimestamp(uwsgi.started_on)), ('now', datetime.now()), ('buffer_size', uwsgi.buffer_size), ('total_requests', uwsgi.total_requests()), ('numproc', uwsgi.numproc), ('cores', uwsgi.cores), ('cwd', os.getcwd()), ('logsize', uwsgi.logsize()), ('cache_exists', uwsgi.cache_exists), ('spooler_pid', uwsgi.spooler_pid() if uwsgi.opt.get('spooler') else _('disabled')), ('threads', _('enabled') if uwsgi.has_threads else _('disabled')) ], 'options': uwsgi.opt.items(), 'workers': workers, 'jobs': jobs, }) return uwsgi_stats django-uwsgi-0.1.3/django_uwsgi/cache.py0000775000175000017500000000527112516641220022151 0ustar mechanismmechanism00000000000000try: from django.utils.encoding import force_bytes as stringify except ImportError: from django.utils.encoding import smart_str as stringify from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError from django.conf import settings try: from . import uwsgi, pickle except ImportError: if getattr(settings, "UWSGI_CACHE_FALLBACK", True): uwsgi = None else: raise InvalidCacheBackendError( "You're not running under uWSGI ! " "Set UWSGI_CACHE_FALLBACK=True in settings if you want to fallback " "to LocMemCache." ) if uwsgi: class UwsgiCache(BaseCache): """uWSGI cache backend""" def __init__(self, server, params): BaseCache.__init__(self, params) self._cache = uwsgi self._server = server def exists(self, key): return self._cache.cache_exists(stringify(key), self._server) def add(self, key, value, timeout=True, version=None): full_key = self.make_key(key, version=version) if self.exists(full_key): return False self._set(full_key, value, timeout) return True def get(self, key, default=None, version=None): full_key = self.make_key(key, version=version) val = self._cache.cache_get(stringify(full_key), self._server) if val is None: return default val = stringify(val) return pickle.loads(val) def _set(self, full_key, value, timeout): if timeout is True: uwsgi_timeout = self.default_timeout elif timeout is None or timeout is False: # Django 1.6+: Explicitly passing in timeout=None will set a non-expiring timeout. uwsgi_timeout = 0 elif timeout == 0: # Django 1.6+: Passing in timeout=0 will set-and-expire-immediately the value. uwsgi_timeout = -1 else: uwsgi_timeout = timeout self._cache.cache_update(stringify(full_key), pickle.dumps(value), uwsgi_timeout, self._server) def set(self, key, value, timeout=True, version=None): full_key = self.make_key(key, version=version) self._set(full_key, value, timeout) def delete(self, key, version=None): full_key = self.make_key(key, version=version) self._cache.cache_del(stringify(full_key), self._server) def close(self, **kwargs): pass def clear(self): self._cache.cache_clear(self._server) else: from django.core.cache.backends.locmem import LocMemCache as UwsgiCache django-uwsgi-0.1.3/django_uwsgi/views.py0000775000175000017500000000404712516641220022243 0ustar mechanismmechanism00000000000000from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy as _ from django.contrib import messages from django.core.urlresolvers import reverse_lazy from django.views.generic import View, TemplateView from django.core.exceptions import PermissionDenied from django.apps import apps from . import uwsgi class UwsgiStatus(TemplateView): """uWSGI Status View""" if apps.is_installed('wagtail.wagtailadmin'): template_name = 'uwsgi/wagtail_uwsgi.html' else: template_name = 'uwsgi/uwsgi.html' def get_context_data(self, **kwargs): context = super(UwsgiStatus, self).get_context_data(**kwargs) if uwsgi is None: context['unavailable'] = True return context else: from .stats import get_uwsgi_stats context.update(get_uwsgi_stats()) return context class UwsgiCacheClear(View): """Clear uWSGI Cache View""" def get(self, request): if not request.user.is_superuser: raise PermissionDenied if uwsgi is not None and uwsgi.masterpid() > 0: uwsgi.cache_clear() messages.add_message(request, messages.SUCCESS, _( 'uWSGI Cache cleared!'), fail_silently=True) else: messages.add_message(request, messages.ERROR, _( 'The uWSGI master process is not active'), fail_silently=True) return HttpResponseRedirect(reverse_lazy('uwsgi_index')) class UwsgiReload(View): """Reload uWSGI View""" def get(self, request): if not request.user.is_superuser: raise PermissionDenied if uwsgi is not None and uwsgi.masterpid() > 0: uwsgi.reload() messages.add_message( request, messages.SUCCESS, _('uWSGI reloaded!'), fail_silently=True) else: messages.add_message(request, messages.ERROR, _( 'The uWSGI master process is not active'), fail_silently=True) return HttpResponseRedirect(reverse_lazy('uwsgi_index')) django-uwsgi-0.1.3/django_uwsgi/management/0000775000175000017500000000000012516642453022651 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/management/commands/0000775000175000017500000000000012516642453024452 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/management/commands/__init__.py0000775000175000017500000000000012516641220026543 0ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/management/commands/runuwsgi.py0000775000175000017500000000773112516641220026711 0ustar mechanismmechanism00000000000000from django.core.management.base import BaseCommand from django.conf import settings from django.apps import apps import os import sys import multiprocessing root = os.getcwd() django_project = os.path.basename(root) class Command(BaseCommand): help = "Runs this project as a uWSGI application. Requires the uwsgi binary in system path." http_port = os.getenv('PORT', '8000') # for heroku socket_addr = None def handle(self, *args, **options): for arg in args: k, v = arg.split('=') if k == 'http': if self.http_port: self.http_port = v elif k == 'socket': self.http_port = None self.socket_addr = v # load the Django WSGI handler os.environ['UWSGI_MODULE'] = '%s.wsgi' % django_project # DJANGO settings if options['settings']: os.environ['DJANGO_SETTINGS_MODULE'] = options['settings'] else: os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % django_project # set protocol as uwsgi os.environ['UWSGI_PROTOCOL'] = 'uwsgi' # bind the http server to the default port if self.http_port: os.environ['UWSGI_HTTP_SOCKET'] = ':%s' % self.http_port elif self.socket_addr: os.environ['UWSGI_UWSGI_SOCKET'] = self.socket_addr os.environ['UWSGI_CHMOD_SOCKET'] = '664' # set process names os.environ['UWSGI_AUTO_PROCNAME'] = 'true' os.environ['UWSGI_PROCNAME_PREFIX_SPACED'] = '[uWSGI %s]' % django_project # remove sockets/pidfile at exit os.environ['UWSGI_VACUUM'] = 'true' # retrieve/set the PythonHome os.environ['UWSGI_VIRTUALENV'] = sys.prefix # add project to python path os.environ['UWSGI_PP'] = root os.environ['UWSGI_POST_BUFFERING'] = '1048576' os.environ['UWSGI_RELOAD_ON_RSS'] = '300' # increase buffer size a bit os.environ['UWSGI_BUFFER_SIZE'] = '65535' # some additions required by newrelic os.environ['UWSGI_ENABLE_THREADS'] = 'true' os.environ['UWSGI_LAZY_APPS'] = 'true' os.environ['UWSGI_SINGLE_INTERPRETER'] = 'true' os.environ['UWSGI_AUTOLOAD'] = 'true' # set 12 workers and cheaper to number of cpus os.environ['UWSGI_WORKERS'] = '12' os.environ['UWSGI_CHEAPER'] = str(multiprocessing.cpu_count()) # enable the master process os.environ['UWSGI_MASTER'] = 'true' os.environ['UWSGI_NO_ORPHANS'] = 'true' os.environ['UWSGI_MEMORY_REPORT'] = 'true' os.environ['UWSGI_DISABLE_LOGGING'] = 'true' # set harakiri os.environ['UWSGI_HARAKIRI'] = '60' os.environ['UWSGI_HARAKIRI_VERBOSE'] = 'true' # set uid and gid os.environ['UWSGI_UID'] = str(os.getuid()) os.environ['UWSGI_GID'] = str(os.getgid()) # TODO: Figure out cache os.environ['UWSGI_CACHE2'] = 'name=%s,items=20000,keysize=128,blocksize=4096' % django_project if settings.DEBUG: if apps.is_installed('configurations'): os.environ.setdefault('DJANGO_CONFIGURATION', 'Development') import configurations configurations.setup() # map and serve static files os.environ['UWSGI_STATIC_MAP'] = '%s=%s' % (settings.STATIC_URL, settings.STATIC_ROOT) os.environ['UWSGI_PY_AUTORELOAD'] = '2' # run spooler for mail task if 'django_uwsgi' in settings.EMAIL_BACKEND: os.environ['UWSGI_SPOOLER'] = '/tmp' os.environ['UWSGI_SPOOLER_IMPORT'] = 'django_uwsgi.task' # exec the uwsgi binary if apps.ready: os.execvp('uwsgi', ('uwsgi',)) def usage(self, subcomand): return r""" run this project on the uWSGI server http=PORT run the embedded http server on port PORT socket=ADDR bind the uwsgi server on address ADDR (this will disable the http server) """ django-uwsgi-0.1.3/django_uwsgi/management/__init__.py0000775000175000017500000000000012516641220024742 0ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi/task.py0000775000175000017500000000057712516641220022054 0ustar mechanismmechanism00000000000000from django.core.mail import get_connection from django.conf import settings from .decorators import spool from . import pickle BACKEND = getattr(settings, 'UWSGI_EMAIL_BACKEND', 'django.core.mail.backends.smtp.EmailBackend') @spool def send_mail(arguments): conn = get_connection(backend=BACKEND) conn.send_messages([pickle.loads(arguments['body'])]) django-uwsgi-0.1.3/django_uwsgi/urls.py0000775000175000017500000000047612516641220022075 0ustar mechanismmechanism00000000000000from django.conf.urls import patterns, url from . import views urlpatterns = patterns('', url(r'^$', views.UwsgiStatus.as_view(), name='uwsgi_index'), url(r'^reload/$', views.UwsgiReload.as_view(), name='uwsgi_reload'), url(r'^clear_cache/$', views.UwsgiCacheClear.as_view(), name='uwsgi_cache_clear'), ) django-uwsgi-0.1.3/django_uwsgi/template.py0000775000175000017500000000140312516641220022712 0ustar mechanismmechanism00000000000000from django.template.base import TemplateDoesNotExist from django.template.loader import BaseLoader from django.conf import settings from . import uwsgi class Loader(BaseLoader): """uWSGI Template Loader""" is_usable = uwsgi def symbolize(self, name): return name.replace('.', '_').replace('/', '_').replace('-', '_') def load_template_source(self, template_name, template_dirs=None): filename = 'templates_' + self.symbolize(template_name) for app in settings.INSTALLED_APPS: try: symbol = '%s_%s' % (self.symbolize(app), filename) return (uwsgi.embedded_data(symbol), 'sym://%s' % symbol) except: pass raise TemplateDoesNotExist(template_name) django-uwsgi-0.1.3/django_uwsgi/apps.py0000775000175000017500000000024312516641220022043 0ustar mechanismmechanism00000000000000from django.apps import AppConfig class DjangoUwsgiConfig(AppConfig): name = 'django_uwsgi' label = 'django_uwsgi' verbose_name = 'uWSGI for Django' django-uwsgi-0.1.3/.gitignore0000775000175000017500000000171112516641220020037 0ustar mechanismmechanism00000000000000public/uploads/ public/assets/ *~ .DS_Store .AppleDouble .LSOverride .idea atlassian-ide-plugin.xml # Icon must ends with two \r. #Icon # Thumbnails ._* # Files that might appear on external disk .Spotlight-V100 .Trashes *.sublime-workspace *.sublime-project # Virtualenv # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ .Python [Bb]in [Ii]nclude [Ll]ib [Ss]cripts local_settings.py .idea # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] # C extensions *.so # Distribution / packaging .Python env/ #bin/ build/ develop-eggs/ dist/ eggs/ lib/ lib64/ parts/ sdist/ var/ *.egg-info/ .installed.cfg *.egg # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports .tox/ .coverage .cache nosetests.xml coverage.xml # Translations *.mo # Mr Developer .mr.developer.cfg .project .pydevproject # Rope .ropeproject # Django stuff: *.log *.pot # Sphinx documentation docs/_build/ .env *.db *.sqlite *.sqlite3django-uwsgi-0.1.3/setup.cfg0000664000175000017500000000007312516642453017676 0ustar mechanismmechanism00000000000000[egg_info] tag_date = 0 tag_build = tag_svn_revision = 0 django-uwsgi-0.1.3/django_uwsgi.egg-info/0000775000175000017500000000000012516642453022227 5ustar mechanismmechanism00000000000000django-uwsgi-0.1.3/django_uwsgi.egg-info/not-zip-safe0000664000175000017500000000000112516642452024454 0ustar mechanismmechanism00000000000000 django-uwsgi-0.1.3/django_uwsgi.egg-info/dependency_links.txt0000664000175000017500000000000112516642452026274 0ustar mechanismmechanism00000000000000 django-uwsgi-0.1.3/django_uwsgi.egg-info/top_level.txt0000664000175000017500000000001512516642452024754 0ustar mechanismmechanism00000000000000django_uwsgi django-uwsgi-0.1.3/django_uwsgi.egg-info/PKG-INFO0000664000175000017500000000437412516642452023333 0ustar mechanismmechanism00000000000000Metadata-Version: 1.1 Name: django-uwsgi Version: 0.1.3 Summary: uWSGI stuff for Django projects Home-page: http://github.com/unbit/django-uwsgi Author: Eugene MechanisM Author-email: eugene@mechanism.name License: MIT Description: django-uwsgi ~~~~~~~~~~~~ Django related examples/tricks/modules for uWSGI Screenshots ~~~~~~~~~~~ `django-debug-toolbar `_ panel .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot1.png `Wagtail `_ admin interface: .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot2.png .. image:: https://github.com/unbit/django-uwsgi/raw/master/docs/screenshots/screenshot3.png Documentation ~~~~~~~~~~~~~ `Read the documentation at rtfd.org `_ Contributors ~~~~~~~~~~~~ See `CONTRIBUTORS `_ License ~~~~~~~ `MIT `_ Keywords: uwsgi,django,mail,cache,template Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Framework :: Django Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.4 Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Internet :: WWW/HTTP :: WSGI Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Internet :: WWW/HTTP :: Site Management Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Code Generators Classifier: Topic :: Communications :: Email Classifier: Framework :: Django django-uwsgi-0.1.3/django_uwsgi.egg-info/requires.txt0000664000175000017500000000001712516642452024624 0ustar mechanismmechanism00000000000000 [uwsgi] uwsgi django-uwsgi-0.1.3/django_uwsgi.egg-info/SOURCES.txt0000664000175000017500000000263012516642453024114 0ustar mechanismmechanism00000000000000.editorconfig .gitignore CONTRIBUTORS LICENSE MANIFEST.in README.rst setup.py django_uwsgi/__init__.py django_uwsgi/apps.py django_uwsgi/cache.py django_uwsgi/decorators.py django_uwsgi/mail.py django_uwsgi/panels.py django_uwsgi/stats.py django_uwsgi/task.py django_uwsgi/template.py django_uwsgi/urls.py django_uwsgi/views.py django_uwsgi/wagtail_hooks.py django_uwsgi.egg-info/PKG-INFO django_uwsgi.egg-info/SOURCES.txt django_uwsgi.egg-info/dependency_links.txt django_uwsgi.egg-info/not-zip-safe django_uwsgi.egg-info/pbr.json django_uwsgi.egg-info/requires.txt django_uwsgi.egg-info/top_level.txt django_uwsgi/emperor/__init__.py django_uwsgi/emperor/admin.py django_uwsgi/emperor/apps.py django_uwsgi/emperor/models.py django_uwsgi/management/__init__.py django_uwsgi/management/commands/__init__.py django_uwsgi/management/commands/runuwsgi.py django_uwsgi/templates/uwsgi/panel.html django_uwsgi/templates/uwsgi/uwsgi.html django_uwsgi/templates/uwsgi/wagtail_dashboard_item.html django_uwsgi/templates/uwsgi/wagtail_uwsgi.html docs/Makefile docs/cache.rst docs/changelog.rst docs/command.rst docs/conf.py docs/configuration.rst docs/contributing.rst docs/decorators.rst docs/email.rst docs/features.rst docs/index.rst docs/installation.rst docs/integrations.rst docs/requirements-docs.txt docs/screenshots.rst docs/todo.rst docs/screenshots/screenshot1.png docs/screenshots/screenshot2.png docs/screenshots/screenshot3.pngdjango-uwsgi-0.1.3/django_uwsgi.egg-info/pbr.json0000664000175000017500000000005712516642452023706 0ustar mechanismmechanism00000000000000{"git_version": "46db2ae", "is_release": false}django-uwsgi-0.1.3/MANIFEST.in0000775000175000017500000000020212516641220017577 0ustar mechanismmechanism00000000000000include CONTRIBUTORS LICENSE *.rst recursive-include django_uwsgi * recursive-exclude * __pycache__ recursive-exclude * *.py[cod]