virtual-bootstrap.py 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508
  1. #!/usr/bin/env python
  2. # Licensed to Cloudera, Inc. under one
  3. # or more contributor license agreements. See the NOTICE file
  4. # distributed with this work for additional information
  5. # regarding copyright ownership. Cloudera, Inc. licenses this file
  6. # to you under the Apache License, Version 2.0 (the
  7. # "License"); you may not use this file except in compliance
  8. # with the License. You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS,
  14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. # See the License for the specific language governing permissions and
  16. # limitations under the License.
  17. ## WARNING: This file is (partly) generated
  18. """Create a "virtual" Python installation
  19. """
  20. virtualenv_version = "1.4.5"
  21. import sys
  22. import os
  23. import optparse
  24. import re
  25. import shutil
  26. import logging
  27. import distutils.sysconfig
  28. try:
  29. import subprocess
  30. except ImportError, e:
  31. if sys.version_info <= (2, 3):
  32. print 'ERROR: %s' % e
  33. print 'ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.'
  34. print 'If you copy subprocess.py from a newer version of Python this script will probably work'
  35. sys.exit(101)
  36. else:
  37. raise
  38. try:
  39. set
  40. except NameError:
  41. from sets import Set as set
  42. join = os.path.join
  43. py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
  44. is_jython = sys.platform.startswith('java')
  45. expected_exe = is_jython and 'jython' or 'python'
  46. REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'ntpath', 'genericpath',
  47. 'fnmatch', 'locale', 'encodings', 'codecs',
  48. 'stat', 'UserDict', 'readline', 'copy_reg', 'types',
  49. 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
  50. 'lib-dynload', 'config', 'zlib']
  51. if sys.version_info[:2] >= (2, 6):
  52. REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
  53. if sys.version_info[:2] == (2, 7):
  54. REQUIRED_MODULES.extend(['_weakrefset'])
  55. if sys.version_info[:2] <= (2, 3):
  56. REQUIRED_MODULES.extend(['sets', '__future__'])
  57. class Logger(object):
  58. """
  59. Logging object for use in command-line script. Allows ranges of
  60. levels, to avoid some redundancy of displayed information.
  61. """
  62. DEBUG = logging.DEBUG
  63. INFO = logging.INFO
  64. NOTIFY = (logging.INFO+logging.WARN)/2
  65. WARN = WARNING = logging.WARN
  66. ERROR = logging.ERROR
  67. FATAL = logging.FATAL
  68. LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL]
  69. def __init__(self, consumers):
  70. self.consumers = consumers
  71. self.indent = 0
  72. self.in_progress = None
  73. self.in_progress_hanging = False
  74. def debug(self, msg, *args, **kw):
  75. self.log(self.DEBUG, msg, *args, **kw)
  76. def info(self, msg, *args, **kw):
  77. self.log(self.INFO, msg, *args, **kw)
  78. def notify(self, msg, *args, **kw):
  79. self.log(self.NOTIFY, msg, *args, **kw)
  80. def warn(self, msg, *args, **kw):
  81. self.log(self.WARN, msg, *args, **kw)
  82. def error(self, msg, *args, **kw):
  83. self.log(self.WARN, msg, *args, **kw)
  84. def fatal(self, msg, *args, **kw):
  85. self.log(self.FATAL, msg, *args, **kw)
  86. def log(self, level, msg, *args, **kw):
  87. if args:
  88. if kw:
  89. raise TypeError(
  90. "You may give positional or keyword arguments, not both")
  91. args = args or kw
  92. rendered = None
  93. for consumer_level, consumer in self.consumers:
  94. if self.level_matches(level, consumer_level):
  95. if (self.in_progress_hanging
  96. and consumer in (sys.stdout, sys.stderr)):
  97. self.in_progress_hanging = False
  98. sys.stdout.write('\n')
  99. sys.stdout.flush()
  100. if rendered is None:
  101. if args:
  102. rendered = msg % args
  103. else:
  104. rendered = msg
  105. rendered = ' '*self.indent + rendered
  106. if hasattr(consumer, 'write'):
  107. consumer.write(rendered+'\n')
  108. else:
  109. consumer(rendered)
  110. def start_progress(self, msg):
  111. assert not self.in_progress, (
  112. "Tried to start_progress(%r) while in_progress %r"
  113. % (msg, self.in_progress))
  114. if self.level_matches(self.NOTIFY, self._stdout_level()):
  115. sys.stdout.write(msg)
  116. sys.stdout.flush()
  117. self.in_progress_hanging = True
  118. else:
  119. self.in_progress_hanging = False
  120. self.in_progress = msg
  121. def end_progress(self, msg='done.'):
  122. assert self.in_progress, (
  123. "Tried to end_progress without start_progress")
  124. if self.stdout_level_matches(self.NOTIFY):
  125. if not self.in_progress_hanging:
  126. # Some message has been printed out since start_progress
  127. sys.stdout.write('...' + self.in_progress + msg + '\n')
  128. sys.stdout.flush()
  129. else:
  130. sys.stdout.write(msg + '\n')
  131. sys.stdout.flush()
  132. self.in_progress = None
  133. self.in_progress_hanging = False
  134. def show_progress(self):
  135. """If we are in a progress scope, and no log messages have been
  136. shown, write out another '.'"""
  137. if self.in_progress_hanging:
  138. sys.stdout.write('.')
  139. sys.stdout.flush()
  140. def stdout_level_matches(self, level):
  141. """Returns true if a message at this level will go to stdout"""
  142. return self.level_matches(level, self._stdout_level())
  143. def _stdout_level(self):
  144. """Returns the level that stdout runs at"""
  145. for level, consumer in self.consumers:
  146. if consumer is sys.stdout:
  147. return level
  148. return self.FATAL
  149. def level_matches(self, level, consumer_level):
  150. """
  151. >>> l = Logger()
  152. >>> l.level_matches(3, 4)
  153. False
  154. >>> l.level_matches(3, 2)
  155. True
  156. >>> l.level_matches(slice(None, 3), 3)
  157. False
  158. >>> l.level_matches(slice(None, 3), 2)
  159. True
  160. >>> l.level_matches(slice(1, 3), 1)
  161. True
  162. >>> l.level_matches(slice(2, 3), 1)
  163. False
  164. """
  165. if isinstance(level, slice):
  166. start, stop = level.start, level.stop
  167. if start is not None and start > consumer_level:
  168. return False
  169. if stop is not None or stop <= consumer_level:
  170. return False
  171. return True
  172. else:
  173. return level >= consumer_level
  174. #@classmethod
  175. def level_for_integer(cls, level):
  176. levels = cls.LEVELS
  177. if level < 0:
  178. return levels[0]
  179. if level >= len(levels):
  180. return levels[-1]
  181. return levels[level]
  182. level_for_integer = classmethod(level_for_integer)
  183. def mkdir(path):
  184. if not os.path.exists(path):
  185. logger.info('Creating %s', path)
  186. os.makedirs(path)
  187. else:
  188. logger.info('Directory %s already exists', path)
  189. def copyfile(src, dest, symlink=True):
  190. if not os.path.exists(src):
  191. # Some bad symlink in the src
  192. logger.warn('Cannot find file %s (bad symlink)', src)
  193. return
  194. if os.path.exists(dest):
  195. logger.debug('File %s already exists', dest)
  196. return
  197. if not os.path.exists(os.path.dirname(dest)):
  198. logger.info('Creating parent directories for %s' % os.path.dirname(dest))
  199. os.makedirs(os.path.dirname(dest))
  200. if symlink and hasattr(os, 'symlink'):
  201. logger.info('Symlinking %s', dest)
  202. os.symlink(os.path.abspath(src), dest)
  203. else:
  204. logger.info('Copying to %s', dest)
  205. if os.path.isdir(src):
  206. shutil.copytree(src, dest, True)
  207. else:
  208. shutil.copy2(src, dest)
  209. def writefile(dest, content, overwrite=True):
  210. if not os.path.exists(dest):
  211. logger.info('Writing %s', dest)
  212. f = open(dest, 'wb')
  213. f.write(content)
  214. f.close()
  215. return
  216. else:
  217. f = open(dest, 'rb')
  218. c = f.read()
  219. f.close()
  220. if c != content:
  221. if not overwrite:
  222. logger.notify('File %s exists with different content; not overwriting', dest)
  223. return
  224. logger.notify('Overwriting %s with new content', dest)
  225. f = open(dest, 'wb')
  226. f.write(content)
  227. f.close()
  228. else:
  229. logger.info('Content %s already in place', dest)
  230. def rmtree(dir):
  231. if os.path.exists(dir):
  232. logger.notify('Deleting tree %s', dir)
  233. shutil.rmtree(dir)
  234. else:
  235. logger.info('Do not need to delete %s; already gone', dir)
  236. def make_exe(fn):
  237. if hasattr(os, 'chmod'):
  238. oldmode = os.stat(fn).st_mode & 07777
  239. newmode = (oldmode | 0555) & 07777
  240. os.chmod(fn, newmode)
  241. logger.info('Changed mode of %s to %s', fn, oct(newmode))
  242. def _find_file(filename, dirs):
  243. for dir in dirs:
  244. if os.path.exists(join(dir, filename)):
  245. return join(dir, filename)
  246. return filename
  247. def _install_req(py_executable, unzip=False, distribute=False):
  248. if not distribute:
  249. setup_fn = 'setuptools-0.6c11-py%s.egg' % sys.version[:3]
  250. project_name = 'setuptools'
  251. bootstrap_script = EZ_SETUP_PY
  252. source = None
  253. else:
  254. setup_fn = None
  255. source = 'distribute-0.6.8.tar.gz'
  256. project_name = 'distribute'
  257. bootstrap_script = DISTRIBUTE_SETUP_PY
  258. try:
  259. # check if the global Python has distribute installed or plain
  260. # setuptools
  261. import pkg_resources
  262. if not hasattr(pkg_resources, '_distribute'):
  263. location = os.path.dirname(pkg_resources.__file__)
  264. logger.notify("A globally installed setuptools was found (in %s)" % location)
  265. logger.notify("Use the --no-site-packages option to use distribute in "
  266. "the virtualenv.")
  267. except ImportError:
  268. pass
  269. search_dirs = file_search_dirs()
  270. if setup_fn is not None:
  271. setup_fn = _find_file(setup_fn, search_dirs)
  272. if source is not None:
  273. source = _find_file(source, search_dirs)
  274. if is_jython and os._name == 'nt':
  275. # Jython's .bat sys.executable can't handle a command line
  276. # argument with newlines
  277. import tempfile
  278. fd, ez_setup = tempfile.mkstemp('.py')
  279. os.write(fd, bootstrap_script)
  280. os.close(fd)
  281. cmd = [py_executable, ez_setup]
  282. else:
  283. cmd = [py_executable, '-c', bootstrap_script]
  284. if unzip:
  285. cmd.append('--always-unzip')
  286. env = {}
  287. if logger.stdout_level_matches(logger.DEBUG):
  288. cmd.append('-v')
  289. old_chdir = os.getcwd()
  290. if setup_fn is not None and os.path.exists(setup_fn):
  291. logger.info('Using existing %s egg: %s' % (project_name, setup_fn))
  292. cmd.append(setup_fn)
  293. if os.environ.get('PYTHONPATH'):
  294. env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH']
  295. else:
  296. env['PYTHONPATH'] = setup_fn
  297. else:
  298. # the source is found, let's chdir
  299. if source is not None and os.path.exists(source):
  300. os.chdir(os.path.dirname(source))
  301. else:
  302. logger.info('No %s egg found; downloading' % project_name)
  303. cmd.extend(['--always-copy', '-U', project_name])
  304. logger.start_progress('Installing %s...' % project_name)
  305. logger.indent += 2
  306. cwd = None
  307. if project_name == 'distribute':
  308. env['DONT_PATCH_SETUPTOOLS'] = 'true'
  309. def _filter_ez_setup(line):
  310. return filter_ez_setup(line, project_name)
  311. if not os.access(os.getcwd(), os.W_OK):
  312. cwd = '/tmp'
  313. if source is not None and os.path.exists(source):
  314. # the current working dir is hostile, let's copy the
  315. # tarball to /tmp
  316. target = os.path.join(cwd, os.path.split(source)[-1])
  317. shutil.copy(source, target)
  318. try:
  319. call_subprocess(cmd, show_stdout=False,
  320. filter_stdout=_filter_ez_setup,
  321. extra_env=env,
  322. cwd=cwd)
  323. finally:
  324. logger.indent -= 2
  325. logger.end_progress()
  326. if os.getcwd() != old_chdir:
  327. os.chdir(old_chdir)
  328. if is_jython and os._name == 'nt':
  329. os.remove(ez_setup)
  330. def file_search_dirs():
  331. here = os.path.dirname(os.path.abspath(__file__))
  332. dirs = ['.', here,
  333. join(here, 'virtualenv_support')]
  334. if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
  335. # Probably some boot script; just in case virtualenv is installed...
  336. try:
  337. import virtualenv
  338. except ImportError:
  339. pass
  340. else:
  341. dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
  342. return [d for d in dirs if os.path.isdir(d)]
  343. def install_setuptools(py_executable, unzip=False):
  344. _install_req(py_executable, unzip)
  345. def install_distribute(py_executable, unzip=False):
  346. _install_req(py_executable, unzip, distribute=True)
  347. _pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I)
  348. def install_pip(py_executable):
  349. filenames = []
  350. for dir in file_search_dirs():
  351. filenames.extend([join(dir, fn) for fn in os.listdir(dir)
  352. if _pip_re.search(fn)])
  353. filenames.sort(key=lambda x: os.path.basename(x).lower())
  354. if not filenames:
  355. filename = 'pip'
  356. else:
  357. filename = filenames[-1]
  358. easy_install_script = 'easy_install'
  359. if sys.platform == 'win32':
  360. easy_install_script = 'easy_install-script.py'
  361. cmd = [py_executable, join(os.path.dirname(py_executable), easy_install_script), filename]
  362. if filename == 'pip':
  363. logger.info('Installing pip from network...')
  364. else:
  365. logger.info('Installing %s' % os.path.basename(filename))
  366. logger.indent += 2
  367. def _filter_setup(line):
  368. return filter_ez_setup(line, 'pip')
  369. try:
  370. call_subprocess(cmd, show_stdout=False,
  371. filter_stdout=_filter_setup)
  372. finally:
  373. logger.indent -= 2
  374. def filter_ez_setup(line, project_name='setuptools'):
  375. if not line.strip():
  376. return Logger.DEBUG
  377. if project_name == 'distribute':
  378. for prefix in ('Extracting', 'Now working', 'Installing', 'Before',
  379. 'Scanning', 'Setuptools', 'Egg', 'Already',
  380. 'running', 'writing', 'reading', 'installing',
  381. 'creating', 'copying', 'byte-compiling', 'removing',
  382. 'Processing'):
  383. if line.startswith(prefix):
  384. return Logger.DEBUG
  385. return Logger.DEBUG
  386. for prefix in ['Reading ', 'Best match', 'Processing setuptools',
  387. 'Copying setuptools', 'Adding setuptools',
  388. 'Installing ', 'Installed ']:
  389. if line.startswith(prefix):
  390. return Logger.DEBUG
  391. return Logger.INFO
  392. def main():
  393. parser = optparse.OptionParser(
  394. version=virtualenv_version,
  395. usage="%prog [OPTIONS] DEST_DIR")
  396. parser.add_option(
  397. '-v', '--verbose',
  398. action='count',
  399. dest='verbose',
  400. default=0,
  401. help="Increase verbosity")
  402. parser.add_option(
  403. '-q', '--quiet',
  404. action='count',
  405. dest='quiet',
  406. default=0,
  407. help='Decrease verbosity')
  408. parser.add_option(
  409. '-p', '--python',
  410. dest='python',
  411. metavar='PYTHON_EXE',
  412. help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 '
  413. 'interpreter to create the new environment. The default is the interpreter that '
  414. 'virtualenv was installed with (%s)' % sys.executable)
  415. parser.add_option(
  416. '--clear',
  417. dest='clear',
  418. action='store_true',
  419. help="Clear out the non-root install and start from scratch")
  420. parser.add_option(
  421. '--no-site-packages',
  422. dest='no_site_packages',
  423. action='store_true',
  424. help="Don't give access to the global site-packages dir to the "
  425. "virtual environment")
  426. parser.add_option(
  427. '--unzip-setuptools',
  428. dest='unzip_setuptools',
  429. action='store_true',
  430. help="Unzip Setuptools or Distribute when installing it")
  431. parser.add_option(
  432. '--relocatable',
  433. dest='relocatable',
  434. action='store_true',
  435. help='Make an EXISTING virtualenv environment relocatable. '
  436. 'This fixes up scripts and makes all .pth files relative')
  437. parser.add_option(
  438. '--distribute',
  439. dest='use_distribute',
  440. action='store_true',
  441. help='Use Distribute instead of Setuptools. Set environ variable'
  442. 'VIRTUALENV_USE_DISTRIBUTE to make it the default ')
  443. if 'extend_parser' in globals():
  444. extend_parser(parser)
  445. options, args = parser.parse_args()
  446. global logger
  447. if 'adjust_options' in globals():
  448. adjust_options(options, args)
  449. verbosity = options.verbose - options.quiet
  450. logger = Logger([(Logger.level_for_integer(2-verbosity), sys.stdout)])
  451. if options.python and not os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
  452. env = os.environ.copy()
  453. interpreter = resolve_interpreter(options.python)
  454. if interpreter == sys.executable:
  455. logger.warn('Already using interpreter %s' % interpreter)
  456. else:
  457. logger.notify('Running virtualenv with interpreter %s' % interpreter)
  458. env['VIRTUALENV_INTERPRETER_RUNNING'] = 'true'
  459. file = __file__
  460. if file.endswith('.pyc'):
  461. file = file[:-1]
  462. os.execvpe(interpreter, [interpreter, file] + sys.argv[1:], env)
  463. if not args:
  464. print 'You must provide a DEST_DIR'
  465. parser.print_help()
  466. sys.exit(2)
  467. if len(args) > 1:
  468. print 'There must be only one argument: DEST_DIR (you gave %s)' % (
  469. ' '.join(args))
  470. parser.print_help()
  471. sys.exit(2)
  472. home_dir = args[0]
  473. if os.environ.get('WORKING_ENV'):
  474. logger.fatal('ERROR: you cannot run virtualenv while in a workingenv')
  475. logger.fatal('Please deactivate your workingenv, then re-run this script')
  476. sys.exit(3)
  477. if os.environ.get('PYTHONHOME'):
  478. if sys.platform == 'win32':
  479. name = '%PYTHONHOME%'
  480. else:
  481. name = '$PYTHONHOME'
  482. logger.warn('%s is set; this can cause problems creating environments' % name)
  483. if options.relocatable:
  484. make_environment_relocatable(home_dir)
  485. return
  486. create_environment(home_dir, site_packages=not options.no_site_packages, clear=options.clear,
  487. unzip_setuptools=options.unzip_setuptools,
  488. use_distribute=options.use_distribute)
  489. if 'after_install' in globals():
  490. after_install(options, home_dir)
  491. def call_subprocess(cmd, show_stdout=True,
  492. filter_stdout=None, cwd=None,
  493. raise_on_returncode=True, extra_env=None):
  494. cmd_parts = []
  495. for part in cmd:
  496. if len(part) > 40:
  497. part = part[:30]+"..."+part[-5:]
  498. if ' ' in part or '\n' in part or '"' in part or "'" in part:
  499. part = '"%s"' % part.replace('"', '\\"')
  500. cmd_parts.append(part)
  501. cmd_desc = ' '.join(cmd_parts)
  502. if show_stdout:
  503. stdout = None
  504. else:
  505. stdout = subprocess.PIPE
  506. logger.debug("Running command %s" % cmd_desc)
  507. if extra_env:
  508. env = os.environ.copy()
  509. env.update(extra_env)
  510. else:
  511. env = None
  512. try:
  513. proc = subprocess.Popen(
  514. cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
  515. cwd=cwd, env=env)
  516. except Exception, e:
  517. logger.fatal(
  518. "Error %s while executing command %s" % (e, cmd_desc))
  519. raise
  520. all_output = []
  521. if stdout is not None:
  522. stdout = proc.stdout
  523. while 1:
  524. line = stdout.readline()
  525. if not line:
  526. break
  527. line = line.rstrip()
  528. all_output.append(line)
  529. if filter_stdout:
  530. level = filter_stdout(line)
  531. if isinstance(level, tuple):
  532. level, line = level
  533. logger.log(level, line)
  534. if not logger.stdout_level_matches(level):
  535. logger.show_progress()
  536. else:
  537. logger.info(line)
  538. else:
  539. proc.communicate()
  540. proc.wait()
  541. if proc.returncode:
  542. if raise_on_returncode:
  543. if all_output:
  544. logger.notify('Complete output from command %s:' % cmd_desc)
  545. logger.notify('\n'.join(all_output) + '\n----------------------------------------')
  546. raise OSError(
  547. "Command %s failed with error code %s"
  548. % (cmd_desc, proc.returncode))
  549. else:
  550. logger.warn(
  551. "Command %s had error code %s"
  552. % (cmd_desc, proc.returncode))
  553. def create_environment(home_dir, site_packages=True, clear=False,
  554. unzip_setuptools=False, use_distribute=False):
  555. """
  556. Creates a new environment in ``home_dir``.
  557. If ``site_packages`` is true (the default) then the global
  558. ``site-packages/`` directory will be on the path.
  559. If ``clear`` is true (default False) then the environment will
  560. first be cleared.
  561. """
  562. home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
  563. py_executable = os.path.abspath(install_python(
  564. home_dir, lib_dir, inc_dir, bin_dir,
  565. site_packages=site_packages, clear=clear))
  566. install_distutils(lib_dir, home_dir)
  567. if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'):
  568. install_distribute(py_executable, unzip=unzip_setuptools)
  569. else:
  570. install_setuptools(py_executable, unzip=unzip_setuptools)
  571. install_pip(py_executable)
  572. install_activate(home_dir, bin_dir)
  573. def path_locations(home_dir):
  574. """Return the path locations for the environment (where libraries are,
  575. where scripts go, etc)"""
  576. # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its
  577. # prefix arg is broken: http://bugs.python.org/issue3386
  578. if sys.platform == 'win32':
  579. # Windows has lots of problems with executables with spaces in
  580. # the name; this function will remove them (using the ~1
  581. # format):
  582. mkdir(home_dir)
  583. if ' ' in home_dir:
  584. try:
  585. import win32api
  586. except ImportError:
  587. print 'Error: the path "%s" has a space in it' % home_dir
  588. print 'To handle these kinds of paths, the win32api module must be installed:'
  589. print ' http://sourceforge.net/projects/pywin32/'
  590. sys.exit(3)
  591. home_dir = win32api.GetShortPathName(home_dir)
  592. lib_dir = join(home_dir, 'Lib')
  593. inc_dir = join(home_dir, 'Include')
  594. bin_dir = join(home_dir, 'Scripts')
  595. elif is_jython:
  596. lib_dir = join(home_dir, 'Lib')
  597. inc_dir = join(home_dir, 'Include')
  598. bin_dir = join(home_dir, 'bin')
  599. else:
  600. lib_dir = join(home_dir, 'lib', py_version)
  601. inc_dir = join(home_dir, 'include', py_version)
  602. bin_dir = join(home_dir, 'bin')
  603. return home_dir, lib_dir, inc_dir, bin_dir
  604. def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear):
  605. """Install just the base environment, no distutils patches etc"""
  606. if sys.executable.startswith(bin_dir):
  607. print 'Please use the *system* python to run this script'
  608. return
  609. if clear:
  610. rmtree(lib_dir)
  611. ## FIXME: why not delete it?
  612. ## Maybe it should delete everything with #!/path/to/venv/python in it
  613. logger.notify('Not deleting %s', bin_dir)
  614. if hasattr(sys, 'real_prefix'):
  615. logger.notify('Using real prefix %r' % sys.real_prefix)
  616. prefix = sys.real_prefix
  617. else:
  618. prefix = sys.prefix
  619. mkdir(lib_dir)
  620. fix_lib64(lib_dir)
  621. stdlib_dirs = [os.path.dirname(os.__file__)]
  622. if sys.platform == 'win32':
  623. stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs'))
  624. elif sys.platform == 'darwin':
  625. stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages'))
  626. for stdlib_dir in stdlib_dirs:
  627. if not os.path.isdir(stdlib_dir):
  628. continue
  629. if hasattr(os, 'symlink'):
  630. logger.info('Symlinking Python bootstrap modules')
  631. else:
  632. logger.info('Copying Python bootstrap modules')
  633. logger.indent += 2
  634. try:
  635. for fn in os.listdir(stdlib_dir):
  636. if fn != 'site-packages' and os.path.splitext(fn)[0] in REQUIRED_MODULES:
  637. copyfile(join(stdlib_dir, fn), join(lib_dir, fn))
  638. finally:
  639. logger.indent -= 2
  640. mkdir(join(lib_dir, 'site-packages'))
  641. writefile(join(lib_dir, 'site.py'), SITE_PY)
  642. writefile(join(lib_dir, 'orig-prefix.txt'), prefix)
  643. site_packages_filename = join(lib_dir, 'no-global-site-packages.txt')
  644. if not site_packages:
  645. writefile(site_packages_filename, '')
  646. else:
  647. if os.path.exists(site_packages_filename):
  648. logger.info('Deleting %s' % site_packages_filename)
  649. os.unlink(site_packages_filename)
  650. stdinc_dir = join(prefix, 'include', py_version)
  651. if os.path.exists(stdinc_dir):
  652. copyfile(stdinc_dir, inc_dir)
  653. else:
  654. logger.debug('No include dir %s' % stdinc_dir)
  655. if sys.exec_prefix != prefix:
  656. if sys.platform == 'win32':
  657. exec_dir = join(sys.exec_prefix, 'lib')
  658. elif is_jython:
  659. exec_dir = join(sys.exec_prefix, 'Lib')
  660. else:
  661. exec_dir = join(sys.exec_prefix, 'lib', py_version)
  662. for fn in os.listdir(exec_dir):
  663. copyfile(join(exec_dir, fn), join(lib_dir, fn))
  664. if is_jython:
  665. # Jython has either jython-dev.jar and javalib/ dir, or just
  666. # jython.jar
  667. for name in 'jython-dev.jar', 'javalib', 'jython.jar':
  668. src = join(prefix, name)
  669. if os.path.exists(src):
  670. copyfile(src, join(home_dir, name))
  671. # XXX: registry should always exist after Jython 2.5rc1
  672. src = join(prefix, 'registry')
  673. if os.path.exists(src):
  674. copyfile(src, join(home_dir, 'registry'), symlink=False)
  675. copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'),
  676. symlink=False)
  677. mkdir(bin_dir)
  678. py_executable = join(bin_dir, os.path.basename(sys.executable))
  679. if 'Python.framework' in prefix:
  680. if py_executable.endswith('/Python'):
  681. # The name of the python executable is not quite what
  682. # we want, rename it.
  683. py_executable = os.path.join(
  684. os.path.dirname(py_executable), 'python')
  685. logger.notify('New %s executable in %s', expected_exe, py_executable)
  686. if sys.executable != py_executable:
  687. ## FIXME: could I just hard link?
  688. executable = sys.executable
  689. if sys.platform == 'cygwin' and os.path.exists(executable + '.exe'):
  690. # Cygwin misreports sys.executable sometimes
  691. executable += '.exe'
  692. py_executable += '.exe'
  693. logger.info('Executable actually exists in %s' % executable)
  694. shutil.copyfile(executable, py_executable)
  695. make_exe(py_executable)
  696. if sys.platform == 'win32' or sys.platform == 'cygwin':
  697. pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe')
  698. if os.path.exists(pythonw):
  699. logger.info('Also created pythonw.exe')
  700. shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe'))
  701. if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe:
  702. secondary_exe = os.path.join(os.path.dirname(py_executable),
  703. expected_exe)
  704. py_executable_ext = os.path.splitext(py_executable)[1]
  705. if py_executable_ext == '.exe':
  706. # python2.4 gives an extension of '.4' :P
  707. secondary_exe += py_executable_ext
  708. if os.path.exists(secondary_exe):
  709. logger.warn('Not overwriting existing %s script %s (you must use %s)'
  710. % (expected_exe, secondary_exe, py_executable))
  711. else:
  712. logger.notify('Also creating executable in %s' % secondary_exe)
  713. shutil.copyfile(sys.executable, secondary_exe)
  714. make_exe(secondary_exe)
  715. if 'Python.framework' in prefix:
  716. logger.debug('MacOSX Python framework detected')
  717. # Make sure we use the the embedded interpreter inside
  718. # the framework, even if sys.executable points to
  719. # the stub executable in ${sys.prefix}/bin
  720. # See http://groups.google.com/group/python-virtualenv/
  721. # browse_thread/thread/17cab2f85da75951
  722. shutil.copy(
  723. os.path.join(
  724. prefix, 'Resources/Python.app/Contents/MacOS/Python'),
  725. py_executable)
  726. # Copy the framework's dylib into the virtual
  727. # environment
  728. virtual_lib = os.path.join(home_dir, '.Python')
  729. if os.path.exists(virtual_lib):
  730. os.unlink(virtual_lib)
  731. copyfile(
  732. os.path.join(prefix, 'Python'),
  733. virtual_lib)
  734. # And then change the install_name of the copied python executable
  735. try:
  736. call_subprocess(
  737. ["install_name_tool", "-change",
  738. os.path.join(prefix, 'Python'),
  739. '@executable_path/../.Python',
  740. py_executable])
  741. except:
  742. logger.fatal(
  743. "Could not call install_name_tool -- you must have Apple's development tools installed")
  744. raise
  745. # Some tools depend on pythonX.Y being present
  746. py_executable_version = '%s.%s' % (
  747. sys.version_info[0], sys.version_info[1])
  748. if not py_executable.endswith(py_executable_version):
  749. # symlinking pythonX.Y > python
  750. pth = py_executable + '%s.%s' % (
  751. sys.version_info[0], sys.version_info[1])
  752. if os.path.exists(pth):
  753. os.unlink(pth)
  754. os.symlink('python', pth)
  755. else:
  756. # reverse symlinking python -> pythonX.Y (with --python)
  757. pth = join(bin_dir, 'python')
  758. if os.path.exists(pth):
  759. os.unlink(pth)
  760. os.symlink(os.path.basename(py_executable), pth)
  761. if sys.platform == 'win32' and ' ' in py_executable:
  762. # There's a bug with subprocess on Windows when using a first
  763. # argument that has a space in it. Instead we have to quote
  764. # the value:
  765. py_executable = '"%s"' % py_executable
  766. cmd = [py_executable, '-c', 'import sys; print sys.prefix']
  767. logger.info('Testing executable with %s %s "%s"' % tuple(cmd))
  768. proc = subprocess.Popen(cmd,
  769. stdout=subprocess.PIPE)
  770. proc_stdout, proc_stderr = proc.communicate()
  771. proc_stdout = os.path.normcase(os.path.abspath(proc_stdout.strip()))
  772. if proc_stdout != os.path.normcase(os.path.abspath(home_dir)):
  773. logger.fatal(
  774. 'ERROR: The executable %s is not functioning' % py_executable)
  775. logger.fatal(
  776. 'ERROR: It thinks sys.prefix is %r (should be %r)'
  777. % (proc_stdout, os.path.normcase(os.path.abspath(home_dir))))
  778. logger.fatal(
  779. 'ERROR: virtualenv is not compatible with this system or executable')
  780. if sys.platform == 'win32':
  781. logger.fatal(
  782. 'Note: some Windows users have reported this error when they installed Python for "Only this user". The problem may be resolvable if you install Python "For all users". (See https://bugs.launchpad.net/virtualenv/+bug/352844)')
  783. sys.exit(100)
  784. else:
  785. logger.info('Got sys.prefix result: %r' % proc_stdout)
  786. pydistutils = os.path.expanduser('~/.pydistutils.cfg')
  787. if os.path.exists(pydistutils):
  788. logger.notify('Please make sure you remove any previous custom paths from '
  789. 'your %s file.' % pydistutils)
  790. ## FIXME: really this should be calculated earlier
  791. return py_executable
  792. def install_activate(home_dir, bin_dir):
  793. if sys.platform == 'win32' or is_jython and os._name == 'nt':
  794. files = {'activate.bat': ACTIVATE_BAT,
  795. 'deactivate.bat': DEACTIVATE_BAT}
  796. if os.environ.get('OS') == 'Windows_NT' and os.environ.get('OSTYPE') == 'cygwin':
  797. files['activate'] = ACTIVATE_SH
  798. else:
  799. files = {'activate': ACTIVATE_SH}
  800. files['activate_this.py'] = ACTIVATE_THIS
  801. for name, content in files.items():
  802. content = content.replace('__VIRTUAL_ENV__', os.path.abspath(home_dir))
  803. content = content.replace('__VIRTUAL_NAME__', os.path.basename(os.path.abspath(home_dir)))
  804. content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
  805. writefile(os.path.join(bin_dir, name), content)
  806. def install_distutils(lib_dir, home_dir):
  807. distutils_path = os.path.join(lib_dir, 'distutils')
  808. mkdir(distutils_path)
  809. ## FIXME: maybe this prefix setting should only be put in place if
  810. ## there's a local distutils.cfg with a prefix setting?
  811. home_dir = os.path.abspath(home_dir)
  812. ## FIXME: this is breaking things, removing for now:
  813. #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
  814. writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT)
  815. writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False)
  816. def fix_lib64(lib_dir):
  817. """
  818. Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  819. instead of lib/pythonX.Y. If this is such a platform we'll just create a
  820. symlink so lib64 points to lib
  821. """
  822. if [p for p in distutils.sysconfig.get_config_vars().values()
  823. if isinstance(p, basestring) and 'lib64' in p]:
  824. logger.debug('This system uses lib64; symlinking lib64 to lib')
  825. assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
  826. "Unexpected python lib dir: %r" % lib_dir)
  827. lib_parent = os.path.dirname(lib_dir)
  828. assert os.path.basename(lib_parent) == 'lib', (
  829. "Unexpected parent dir: %r" % lib_parent)
  830. copyfile(lib_parent, os.path.join(os.path.dirname(lib_parent), 'lib64'))
  831. def resolve_interpreter(exe):
  832. """
  833. If the executable given isn't an absolute path, search $PATH for the interpreter
  834. """
  835. if os.path.abspath(exe) != exe:
  836. paths = os.environ.get('PATH', '').split(os.pathsep)
  837. for path in paths:
  838. if os.path.exists(os.path.join(path, exe)):
  839. exe = os.path.join(path, exe)
  840. break
  841. if not os.path.exists(exe):
  842. logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe))
  843. sys.exit(3)
  844. return exe
  845. ############################################################
  846. ## Relocating the environment:
  847. def make_environment_relocatable(home_dir):
  848. """
  849. Makes the already-existing environment use relative paths, and takes out
  850. the #!-based environment selection in scripts.
  851. """
  852. activate_this = os.path.join(home_dir, 'bin', 'activate_this.py')
  853. if not os.path.exists(activate_this):
  854. logger.fatal(
  855. 'The environment doesn\'t have a file %s -- please re-run virtualenv '
  856. 'on this environment to update it' % activate_this)
  857. fixup_scripts(home_dir)
  858. fixup_pth_and_egg_link(home_dir)
  859. ## FIXME: need to fix up distutils.cfg
  860. OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  861. 'activate', 'activate.bat', 'activate_this.py']
  862. def fixup_scripts(home_dir):
  863. # This is what we expect at the top of scripts:
  864. shebang = '#!%s/bin/python' % os.path.normcase(os.path.abspath(home_dir))
  865. # This is what we'll put:
  866. new_shebang = '#!/usr/bin/env python%s' % sys.version[:3]
  867. activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this"
  868. bin_dir = os.path.join(home_dir, 'bin')
  869. for filename in os.listdir(bin_dir):
  870. filename = os.path.join(bin_dir, filename)
  871. if not os.path.isfile(filename):
  872. # ignore subdirs, e.g. .svn ones.
  873. continue
  874. f = open(filename, 'rb')
  875. lines = f.readlines()
  876. f.close()
  877. if not lines:
  878. logger.warn('Script %s is an empty file' % filename)
  879. continue
  880. if not lines[0].strip().startswith(shebang):
  881. if os.path.basename(filename) in OK_ABS_SCRIPTS:
  882. logger.debug('Cannot make script %s relative' % filename)
  883. elif lines[0].strip() == new_shebang:
  884. logger.info('Script %s has already been made relative' % filename)
  885. else:
  886. logger.warn('Script %s cannot be made relative (it\'s not a normal script that starts with %s)'
  887. % (filename, shebang))
  888. continue
  889. logger.notify('Making script %s relative' % filename)
  890. lines = [new_shebang+'\n', activate+'\n'] + lines[1:]
  891. f = open(filename, 'wb')
  892. f.writelines(lines)
  893. f.close()
  894. def fixup_pth_and_egg_link(home_dir, sys_path=None):
  895. """Makes .pth and .egg-link files use relative paths"""
  896. home_dir = os.path.normcase(os.path.abspath(home_dir))
  897. if sys_path is None:
  898. sys_path = sys.path
  899. for path in sys_path:
  900. if not path:
  901. path = '.'
  902. if not os.path.isdir(path):
  903. continue
  904. path = os.path.normcase(os.path.abspath(path))
  905. if not path.startswith(home_dir):
  906. logger.debug('Skipping system (non-environment) directory %s' % path)
  907. continue
  908. for filename in os.listdir(path):
  909. filename = os.path.join(path, filename)
  910. if filename.endswith('.pth'):
  911. if not os.access(filename, os.W_OK):
  912. logger.warn('Cannot write .pth file %s, skipping' % filename)
  913. else:
  914. fixup_pth_file(filename)
  915. if filename.endswith('.egg-link'):
  916. if not os.access(filename, os.W_OK):
  917. logger.warn('Cannot write .egg-link file %s, skipping' % filename)
  918. else:
  919. fixup_egg_link(filename)
  920. def fixup_pth_file(filename):
  921. lines = []
  922. prev_lines = []
  923. f = open(filename)
  924. prev_lines = f.readlines()
  925. f.close()
  926. for line in prev_lines:
  927. line = line.strip()
  928. if (not line or line.startswith('#') or line.startswith('import ')
  929. or os.path.abspath(line) != line):
  930. lines.append(line)
  931. else:
  932. new_value = make_relative_path(filename, line)
  933. if line != new_value:
  934. logger.debug('Rewriting path %s as %s (in %s)' % (line, new_value, filename))
  935. lines.append(new_value)
  936. if lines == prev_lines:
  937. logger.info('No changes to .pth file %s' % filename)
  938. return
  939. logger.notify('Making paths in .pth file %s relative' % filename)
  940. f = open(filename, 'w')
  941. f.write('\n'.join(lines) + '\n')
  942. f.close()
  943. def fixup_egg_link(filename):
  944. f = open(filename)
  945. link = f.read().strip()
  946. f.close()
  947. if os.path.abspath(link) != link:
  948. logger.debug('Link in %s already relative' % filename)
  949. return
  950. new_link = make_relative_path(filename, link)
  951. logger.notify('Rewriting link %s in %s as %s' % (link, filename, new_link))
  952. f = open(filename, 'w')
  953. f.write(new_link)
  954. f.close()
  955. def make_relative_path(source, dest, dest_is_directory=True):
  956. """
  957. Make a filename relative, where the filename is dest, and it is
  958. being referred to from the filename source.
  959. >>> make_relative_path('/usr/share/something/a-file.pth',
  960. ... '/usr/share/another-place/src/Directory')
  961. '../another-place/src/Directory'
  962. >>> make_relative_path('/usr/share/something/a-file.pth',
  963. ... '/home/user/src/Directory')
  964. '../../../home/user/src/Directory'
  965. >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/')
  966. './'
  967. """
  968. source = os.path.dirname(source)
  969. if not dest_is_directory:
  970. dest_filename = os.path.basename(dest)
  971. dest = os.path.dirname(dest)
  972. dest = os.path.normpath(os.path.abspath(dest))
  973. source = os.path.normpath(os.path.abspath(source))
  974. dest_parts = dest.strip(os.path.sep).split(os.path.sep)
  975. source_parts = source.strip(os.path.sep).split(os.path.sep)
  976. while dest_parts and source_parts and dest_parts[0] == source_parts[0]:
  977. dest_parts.pop(0)
  978. source_parts.pop(0)
  979. full_parts = ['..']*len(source_parts) + dest_parts
  980. if not dest_is_directory:
  981. full_parts.append(dest_filename)
  982. if not full_parts:
  983. # Special case for the current directory (otherwise it'd be '')
  984. return './'
  985. return os.path.sep.join(full_parts)
  986. ############################################################
  987. ## Bootstrap script creation:
  988. def create_bootstrap_script(extra_text, python_version=''):
  989. """
  990. Creates a bootstrap script, which is like this script but with
  991. extend_parser, adjust_options, and after_install hooks.
  992. This returns a string that (written to disk of course) can be used
  993. as a bootstrap script with your own customizations. The script
  994. will be the standard virtualenv.py script, with your extra text
  995. added (your extra text should be Python code).
  996. If you include these functions, they will be called:
  997. ``extend_parser(optparse_parser)``:
  998. You can add or remove options from the parser here.
  999. ``adjust_options(options, args)``:
  1000. You can change options here, or change the args (if you accept
  1001. different kinds of arguments, be sure you modify ``args`` so it is
  1002. only ``[DEST_DIR]``).
  1003. ``after_install(options, home_dir)``:
  1004. After everything is installed, this function is called. This
  1005. is probably the function you are most likely to use. An
  1006. example would be::
  1007. def after_install(options, home_dir):
  1008. subprocess.call([join(home_dir, 'bin', 'easy_install'),
  1009. 'MyPackage'])
  1010. subprocess.call([join(home_dir, 'bin', 'my-package-script'),
  1011. 'setup', home_dir])
  1012. This example immediately installs a package, and runs a setup
  1013. script from that package.
  1014. If you provide something like ``python_version='2.4'`` then the
  1015. script will start with ``#!/usr/bin/env python2.4`` instead of
  1016. ``#!/usr/bin/env python``. You can use this when the script must
  1017. be run with a particular Python version.
  1018. """
  1019. filename = __file__
  1020. if filename.endswith('.pyc'):
  1021. filename = filename[:-1]
  1022. f = open(filename, 'rb')
  1023. content = f.read()
  1024. f.close()
  1025. py_exe = 'python%s' % python_version
  1026. content = (('#!/usr/bin/env %s\n' % py_exe)
  1027. + '## WARNING: This file is generated\n'
  1028. + content)
  1029. return content.replace('##EXT' 'END##', extra_text)
  1030. ##file site.py
  1031. SITE_PY = """
  1032. eJzVPP1z2zaWv/OvwNKToZTKdJJ2OztO3RsncVrvuUm2Sae5dT1aSoIk1hTJEqRl7c3d337vAwAB
  1033. kvJHu/vDaTKxRAAPDw/vGw8Mw/C0LGW+EJti0WRSKJlU87Uok3qtxLKoRL1Oq8VhmVT1Dp7Or5OV
  1034. VKIuhNqpGHvFQfD0D36Cp+LTOlUGBfiWNHWxSep0nmTZTqSbsqhquRCLpkrzlUjztE6TLP0n9Cjy
  1035. WDz94xgE57mAlWeprMSNrBTAVaJYig+7el3kYtSUuObn8Z+TL8cToeZVWtbQodI4A0XWSR3kUi4A
  1036. TejZKCBlWstDVcp5ukzntuO2aLKFKLNkLsU//sFLo65RFKhiI7drWUmRAzIAUwKsEvGAr2kl5sVC
  1037. xkK8kvMEJ+DnLbEChjbBPVNIxrwQWZGvYE25nEulkmonRrOmJkCEslgUgFMKGNRplgXborpWY9hS
  1038. 2o8tPBIJs4e/GGYPWCfO3+ccwPF9HvyUp7cThg3cg+DqNbNNJZfprUgQLPyUt3I+1c9G6VIs0uUS
  1039. aJDXY+wSMAJKZOnsqKTt+Ebv0LdHhJXlygTmkIgyd+ZGGhEH57VIMgVs25RII0WYv5GzNMmBGvkN
  1040. TAcQgaTB0DyLVNV2HlqdKABAhftYg5RslBhtkjQHZv0hmRPaP6f5otiqMVEAdkuJXxtVu+sfDRAA
  1041. ejsEmAS4WWY3mzxLr2W2GwMCnwD7Sqomq1EgFmkl53VRpVIRAEBtJ+QtID0RSSU1CZkzjdxOiP5E
  1042. kzTHjUUBQ4HHRiTJMl01FUmYWKbAucAVb9//KN6cvTo/fad5zABjmV1tAGeAQhvt4AQTiKNGVUdZ
  1043. AQIdBxf4RySLBQrZCucHvNoOR/fudDCCtZdxd4yz4UB2vbl6GlhjDcqE5gpo3H/DkIlaA33+5579
  1044. DoLTfVShhfO37boAmcyTjRTrhPkLOSP4RsP5Ni7r9UvgBoVwaiCVws1BBFOEByRxaTYqcilKYLEs
  1045. zeU4AArNqK+/i8AK74r8kPa6wwkAoQpyaHSejWnGXMJC+7Beor4wnXe0Mt0lsPu8KSpSHMD/+Zx0
  1046. UZbk14SjIobibzO5SvMcEUJeCKKDiCZW1ylw4iIWF9SL9ILpJCLWXtwTRaIBXkKmA56Ut8mmzOSE
  1047. xRd1691qhCaTtTB7nTHHQc+a1CvtWrvUQd57EX/ucB2hWa8rCcCbmSd0y6KYiBnobMKmTDYsXvW2
  1048. IM4JBuSJBiFPUE8Yi9+BoqdKNRtpG5FXQLMQQwXLIsuKLZDsOAiEOMBOxij7zAmt0Ab/A1z8P5P1
  1049. fB0EzkwWsAaFyO8DhUDAJMhcc7VGwuM2zcpdJZPmrCmKaiErmuphxD5ixB/YGdcavCtqbdR4ubjL
  1050. xSatUSXNtMlM2eLlUc368SWvG5YBllsRzUzXlk4bXF5WrpOZNC7JTC5REvQmvbTbDnMGA3OSLa7F
  1051. hq0MtAFZZMoWZFixoNJZ1pKcAIDBwpfkadlk1Ekhg4kEJtqUBH+ToEkvtLME7M1mOUCFxOZ7DvYH
  1052. cPsniNF2nQJ95gABNAxqKdi+WVpX6CC0+ijwjb4Zz/MDp54vtW3iKZdJmmkrn+TBOT08qyoS37ks
  1053. cdREE0PBCvMaXbtVDnREMQ/DMAiMO7RT5mthv02nsyZFezedBnW1OwbuECjkAUMX72ChNB23LKti
  1054. g80WvY+gD0Av44jgQHwgRSHZx/WY6SVSwNXKpemK5tfhSIGqJPjw49nb889nH8WJuGy10qSrkq5g
  1055. zrM8Ac4kpQ580Zm2VUfQE3VXiupLvAULTfsKJolGkwTKpG6A/QD1T1VDzbCMudcYnL07fXVxNv3p
  1056. 49mP04/nn84AQTAVMjigJaOFa8DnUzHwNzDWQsXaRAa9EfTg1elH+yCYpmr6K7vGJyzs2g+6PP7q
  1057. SpyciOjX5CaJgmAhl8CZ1xL5d/SU3MYx7w8sF8YW2oz9WqS5aadm8GKcSVC8RjQCQE+n8yxRCjtP
  1058. pxEQgQYMfGBAzL4nMuUIBpY7d+hYo4KfSgLRchwywf8GUExmNA7RYBTdIaYTcPNmnijJvWj5MG46
  1059. RZGeTkd6QuB14kbwR1hKI2G6oEhXKbh9tKso4jNVZPgT4aOQEHNj5IFKBGmvI4v4JskaqUbOopaA
  1060. /krWCHIEFikyk0QT2sex7QjUXqJc4tNjj5xoJdK8kfbhJrao9mmz1Guu5Ka4kQsw1rijzrLFj9QC
  1061. kVyZgSqFZYEeIPvB8mr8jATjFtYlwD5oa4C1NwTFEMTQ4oCDR5kr4HoOxEgOdJTIqrOsipsUjdNs
  1062. pxtBt4JkooY1hlBDK9CL96iOKhT0LXhNOVJqKyOQvaphB4fwRpConRatFMcE7gLVwhV9vc6LbT7l
  1063. yOkEJXw0tnuJnKZ3Ezu0W3Ag3oLOAyQLCARaojEUcBEFMtshIA/Lh+UCZckXBUBgGBS59w4sExrQ
  1064. EjnKwGkRxvilIG6uJNqXGzMFueaGGA4kao3tAyM2CAkWZyXeyopmMjSCphtM7JDE57qLmEMWH0CH
  1065. ijHo6JGGxp0M/S6PQQmJC1dKnXGo/j9//sxso9YUjyNiM1w0mpwlaea43IEWT8HNNRaco3tiA4jS
  1066. cwDTKM2a4vCjKEq23rCfnDYAE/kRfMV1XZfHR0fb7TbW0WhRrY7U8ujPf/n66788YyWxWBD/wHIc
  1067. adGpmfiI2tADir8xmvZbs3MdfkxznxsJ1kiSFSfXBfH7rkkXhTg+HFuFglzc2gT839hNUCBTMylT
  1068. GWgbthg9UYdP4i9VKJ6Ikdt3NGYjqIMqq9YhOCKFBG2gkmBEXYDZASM5L5q8jhz1pcQXoO4holvI
  1069. WbOK7OSe0TA/YKkopyPLA4fPrxADnzMMXymtqKaoJYgt0nxZOKT/kdkmIVOsNQSSF3V2L9raDWsx
  1070. Q9zFw+XdOjaO0JgVpgq5AyXC7/JgAbSd+5KDH+1HfdqVrh9lPp4hMKYvMMyrvZgRCg7hgnsxcaXO
  1071. 4Wp0r0CatqyaQcG4qhEUNHgkM6a2Bkf2P0KQaO5NcMgbq3sAnTqZJhNPml2AHu48PWvXZQXHNUAe
  1072. OBHP6YkEf+y41/aMt7bJMkoAdHjUowoD9jYa7XQBfDkyACYirH4KuafelvP3nU3hPRgAVnDOABls
  1073. 2WMmbHGdovAgHGCnntXfN5ppPAQCN4n6Pww4YXzCE1QKhKkc+Yy7j8MtbTlP0kF4v8EhnjK7RBKt
  1074. 9shWV3cMytSddmmZ5qh6nT2K51kBXqJVisRHbbvvK5DPjY+HbJkWQE2GlhxOpxNy9jz5i3Q/zLas
  1075. GoxL3bAdMdqkiowbkmkN/4FXQeEw5S6AlgTNgnmokPkL+xeInF2v/rKHPSyhkSHcrvu8kJ7B0HBM
  1076. +4FAMurgHYQgBxL2ZZE8R9YGGXCYs0GebEOz3CvcBCNWIGaOASEtA7hTYzsMFwhPYkyYk4Ai5Nta
  1077. yVJ8IULYvq6kPkx1/0u51AS8I6cDeQo6Uj5xo2gngj7pRNQ+Q/uxNKXWywI4eAYej5sXdtncMK0N
  1078. 8MFX9/W2RQoUMsX84dhF9coQxs09/unE6dESy0xiGMqbyDsBMDONA7vdGjRsuAHj7Xl3Lv3YDcxx
  1079. 7Cgq1Au5uYXwL6pSNS9UNEZ72gbaA8qPuaJPG4vtRToL4Y+3AeH4yoMksy46GMgvkmqb5hGpGL3C
  1080. E594PXTsYj0rdPSR4p0jQAVTWEdvK2BhOss6AoZHWS1LCLKV9sv7YO9caWjh8vDQ82svj7+86i9/
  1081. si8nYT/DxDy7ratEIT0zJiuzLdKzb2FRLcLiknynT6P0aSX68VWhIMwT7z9+FkgITtRtk93jlt6y
  1082. JGJz75q8j0EdNM+95OqsjtgFEEG9hYxyFD2eMR+O7GMXd8fCHgHkUQxzx6YYSJpPfg+cuzYK5jhc
  1083. 7PKsSBZdocYPNH/91XQgl+ci+fVX4T2zdIgxJPajjq9mZ6ZTYjG4bDOkkklG3oAzCB0B0ImXvT7l
  1084. mFUuBWiaya4G3EL8mHaj1Fv4ve69yM58DogeEAcXs18hmlQ6AXWTpBklfAGNw0PUcyYQ5th+GB8P
  1085. 0t0oY9IIfIpnk8FYRV0+g42JOPIe95ejPZdTk60ciBjNp0xUH5UDfT7bHi94Z67u0dJ+2R+0pf8m
  1086. nfVIQN5qwgECPnAN5ujr//9KWFkxNK2sxh2tr+Tdet4Ae4A63OOI3OGG9Kfmk5KlcSZY7pR4igL6
  1087. VGzpvJOSbeCL5ABlwX7GABzcRn1q9rqpKj77IjkvZXWIh0ETgaUextOgCpI+mKN3skZMbLc5JS+d
  1088. woBiSHVGOh1pVxK1nuSwyK4Lk8SQ+U1awVjQKqPo+/c/nEV9BtDT4KBhcO4+Gi55uJ1CuI9g2kgT
  1089. J3rMGKbQY4b8fqmKPA7tKldzHmlShJpsfcL2MoMmshzeg3tyBN6RFh/yYcw2X8v59VTSwSWyKQ51
  1090. sqSvsRkxseeZfgGJSpZUBQMrmWcN0oodPSxfWjb5nBLmtQR7rmsNsfaAjiM5IbTMkpUY0eAFJiM0
  1091. N1K+4iaptLdTVgVWt4kmXRyt0oWQvzVJhoGeXC4BFzzN0E0xT085CfGGT1S56knJeVOl9Q5IkKhC
  1092. HwbR4avTcbbjhY48JDnvzwTE49hj8RGXje1MuIUhlwkX/RQ4LhIjMRxgTuuQu+g5tOfFFGedUpHg
  1093. hJHqn1zS46A7QwEAQgAK6w/HOpfjt0hqck+caM9doqKW9Ejpxp4FeRwIZTTG2Jd/00+fEV3e2oPl
  1094. aj+Wq7uxXHWxXA1iufKxXN2NpSsSuLE2jWEkYSiV0c1zD572u1kInuYsma+5HxaPYZEYQBSlCeiM
  1095. THENpZfr4AMfAkJq2zmBpIft6X3KVWlVwUlRDRK5H081dPBoql+dwVQLoAfzUozPtq+CwR97FMdU
  1096. azKj4Sxvi6ROYk8uVlkxA7G16E5aABPRLWbg7Fl+M51xvq9jqcIP//Xp+/fvsDuCCs15Nw3DTUTD
  1097. gksZPU2qlepLUxtslMCO1NMvVaBhGuDBA3MtPMsB//emwCIkZByxpSPrQpTgAVBNie3mVl5EUee5
  1098. LtHQz5nJ+fThRIR5HbaL2kOk0w8f3px+Og0pCRT+b+gKjKGtLx0uPqaH7dD339zuluI4BoRa51Ja
  1099. 4+euyaN1yxH321gDtuP2PrvqPHjxEIM9GJb6q/y3Ugq2BAgV63TgYwj14ODnD4UJPfoYRuyVHrln
  1100. Leys2DZH9hwXxRH9oUR0dwL/9AtjjCkQQLtQIxMZtMFUR+lb83oHRR2gD/T1/nAI1g29upGMT1G7
  1101. iAEH0KGs7bbf/fMy92z0lKxfnX13/u7i/NWH00/fOy4gunLvPx69EGc/fBZUMIAGjH2iBM/KayxN
  1102. AcPi3pQQiwL+NZjeWDQ1JyVh1JuLC52732CtPBZPos2J4TnXtVhonKPhrKd9qAtSEKNMB0jOpQSq
  1103. 36BLCxgvbbggXhW6wJLuOszQWW106KUvm5hLKXTQGYP0QWeXFAyCa46gicpgaxMVVnwmpC9qDCCl
  1104. bbStFMgoB9U7P3ZOREy+3UvM0WB40g7Wiv4ycnGNrmJVZilEci8jK0t6GNZLtIyjH9ojT8ZrSAM6
  1105. w2Fm3ZFXvRcLtFovI16bHj9uGe23BjBsGewNrDuXVC9ABaBY7SQi7MQnB5G8ha926/UeKNgwPPqp
  1106. cRMN06Ww+gSCa7FOIYAAnlyD9cU4ASB0dsJPQB872QFZ4HF99HqzOPxbpAni9/7ll4HudZUd/l2U
  1107. EAUJri2JBojpdn4DgU8sY3H2/u04YuSoeFH8rcH6YnBIKMvnSDsVtPCZ6nSkZLbUBQe+PsAG7SdQ
  1108. c2d4JctKDx92jSOUgCdqRF7DE2XoF2H9j4U9waWMO6CxdNpihleQ3INp8zkQH9cyy3S17fmbizPw
  1109. HbGaGyWIz3nOYDrOl+Chqq7G4itSHVB45ArNFbJxhS4sHbsvYq/bYGYWRY5Geyf1dp8o+9kf1Ut1
  1110. VkmqXLRHuGyG5dQzx8jNsB1mZ5m7+92Qzm43ojtKDjPG9ENFdY0+ZwBH09OEAyOImLBi3CSb+XQx
  1111. zWtTyJalc9CmoHhBrU5AVJDEeC2K+K/IOd1bVMrcpoCH5a5KV+saU+owOKZKbuz+w+nni/N3VBr9
  1112. 4svW9x5g0QnFAxMuLjjByjHMecAXtxoMeWs6HeJc3YQwUAfBn24TVy2c8AS9cZxexD/dJr7OcuLE
  1113. g7wCUFNN2RUSDAOcYUPS00oE42qjYfy4lWEtZj4Yykhi9bwuAHDX1+dH27NjUCj7YxofcVaxLDUN
  1114. R2awW6nU/eg1Lks8XFmMhjtB65CEmc8Mhl73WvbVRLmfnizizTrAqN/bn8NUDfW66uU4zLaPWyi4
  1115. 1Zb2l9zJmDr95jmKMhBx5A4eu0w2rIp1d+ZAr7q2B0x8o9E1kjio0MNf8lD7GR4mlti9aMUMxFJB
  1116. NgWYz5D6/kEDnhTaBVAgVBQ6ciR3Mn76wlujYxPuX6PWXWAhvwdFqEs0qRa+qIAT4ctv7D5yE6GF
  1117. qvRYRI6/ksu8sPVD+Nmu0bd87q9xUAYolYliVyX5So4Y1sTA/MIn9p5ELGlbj2Mu0061hOZu8FBv
  1118. 9zB4XyyGT08MZh0+6PW7lruuNvKpgx0GLwj4EKpkC9q9bOoR79XewwLsro9gRxEmSX6L9tDrHvQ0
  1119. LPS7fhs4w8EPE8u4l9ZedW5jRLZB+5XzCgKmWtFhiWOFjYfoGubWBp60Vji0T3XFiP09cMXFqUN1
  1120. 4TIKLlRvhaHu0An1w79yLo+uhaVUu9xefdBtC3kjswLcIoi4sDT9V1uaPo4HUx334NWiggT9Rbvj
  1121. SX5NHuLrn88n4vW7H+H/V/I9xBR47Wgi/g4IiNdFBbEVX32jO8lY1l5z0FQ0Cu8mETRK0/P1bXRW
  1122. PnjrwCMBXW/vF9pb/SCwxrDa8DsDAEVeI10Hba2jqSKH3+aaS98NMy7S0K6EuhHJsL/4Hwvmj3TP
  1123. eF1vMlSUTpKg3c7L8OL89dm7j2dxfYt8ZH6GThLBr3/BFekj0gqPgybCPpk3+OTK8Ri/l1k54DDq
  1124. mMtcJMCYS0Tglpc2zuIr6Yn1rZMKA2dR7hbFPMaewFV0E1DUW/Agx054da+F88wLwhqN9SFS68bi
  1125. Y6CG+KUr8SF0pDF6TTSSEEpmeImGH8fhsA2aCMrswp+n19uFmxjWtyFogV1M21WP/OFW6ayZzhqe
  1126. y0yE2ondCXNpLEsTtZnN3btT73OhXyoA6oQy/XKZNFktZA5RBYW5dLsbtKp73YnlhLmFdTndAaJE
  1127. RbZNdsqpNUmUCHHWkC6o4pEE5cwgCv0huWbdi/ewRMN3EQE6IUqxQ+EMVc18zXLM4YBWd72j922a
  1128. f/ki6hGZJ+UYcd46cbBOdJkYo5Ws9fr5wWh8+bw1o5SXnXu3/+YlWBiXUw5AfZZPnz4NxX/cb/kZ
  1129. lTgrimtwSQD2UEAoLqh5j83Wi7O71fdqTUsMLDlfy0t4cEX5Y/u8ySk5d8dQ2hBp/xoYEe5NZPnR
  1130. 9O/YQE5bVXzUyj34yEbbjp/ylF4dgskViSpXv4EFEy9GoIglQTdEiZqnacSBOuzHrmjwnhIm2jS/
  1131. yFvg+BTBTLAVz4g4zFyjd0Uli5Z7LDonIiTAIZUQ8Wx085Fu6gCe0w87jeb0PE/rtsb+mXt8qO/i
  1132. 1vaNIJqvRLJFyTDr6BDDufLmsWrrXRZ3sqjnrRfzSzfl1lklN9+HO7A2SFqxXBpM4aHZpHkhq7kx
  1133. qrhj6TytHTCmH8LhwfQiFDJAcTCAUggangzDwkq0bf2T3RcX0/d0knpoZtIFNLV9uQynR5K8U0cW
  1134. x+38lIixhLR8a76MYZZ3lNjV/oA3l/iTTitigbV3B9696tXk+m47VzC0F94BDr1PxSpIy46ejnBe
  1135. 4mPhM9NqR769Cu/Ug2N4SrjdpFXdJNlU37+eoss2tUfLGk97RejOy2/WZwGHugBX81AXS4PvYOpM
  1136. kJ5Y62jK1SE+1+F57F678W+olAX6ei88PY5J32d82dvR4NjzC3Nx4yEq31wf6FXeu1hOqKonGndr
  1137. FXu98AQh0jVflJYd8rAfNaWB5brCDwWQAQD4w45f9EXnFMgpTeO60X2p/x7Qr7+6C6yrZAaLZinf
  1138. 7isefXHJrWJtE/4sy8bnW4NbiZKxMFdNteDxrTyUElb59iaxqXXoXoiA5ocv+Y4FP+A0LcLJDp+o
  1139. SLvZhiPvopXF7y5StZ2C30UlPWqYVujmYZnhOuEWFNemPLbBEF/VyilFO3KLT/BTXw+WZSf4UhYk
  1140. 6GF9Hd21fB5/19p1j8Cu3Jy99NbuX79waaDH7ueXIRqwC6oJ8aCKTovR9F8juhN9LDic3tCfpX09
  1141. HGc5iAc1ahPNkptk7n7Hw+lDfrtcWx/oXI5wd72zpr3Xhg079zm5z818EIfP7f03Ol1daPZig0Xv
  1142. Gplyvc5UrlZqmuCraqbk5dDZcs98Gbv5ll5TIhO1M+YOb9QDCMMqugrILfSDXQdPil+Zx0ezztVp
  1143. QVNTAZNTEaXSBUev2rYCuJijVhpvkiJc0hRmEvMNqqnKCtyRUL9Yjc8Mh8qsWqAmgtok6tqgbkZM
  1144. 9Hu2cAo+qDbXbzhWZhfHow4Qgqvynfd2cI3gdGrbgF+etRcB04llCJk3G4iP6/YOvH82kYpvnRno
  1145. 0hVusBMjtWLX4RQXsdTyh4MURin2+xfa/HvezR23/8ZWpT2crWiEDr8fc7HQkXLDzemtfSmM++6F
  1146. Bb2vjyIifneCsN1a7rP3/mEr/qpf+kCKUAct3KpfMsEvzuKsClZkOXwEcu9eefAr46zOYofBouE8
  1147. cxVD/60CeGuODO3Q23N6XNB/T47PDO38vt6wzNLLRO/pbKl4wj0GFU8727h15bGI5R5X3i9UfKQr
  1148. 78F/oCuv33UE1kTjo/XBYOniPT4/qwn3xUEtI8CYKRAJk+2dt+wYezhyCwHBIU9vQ/uWPNaZzu0C
  1149. YyaQI/sv0CAQP3Dljls15b2vxMw75Gv70kWPv7t4/+r0gmgx/XD6+j9Pv6MjYsxbdWzWg2OdvDhk
  1150. ah96JWlu3KOP9YYmb7EdeGcW11VrCL323pHIAIThGvqhDe0qMrd534BeLXJ/ECB+97I7UPep7EHI
  1151. PedL1726h3md2rFAP+VCH/PLOZcxj0zWlMWhTYma9jaLpWW0F+Tv2zin5KavTrRTql9VtScBMbaF
  1152. X7QDmLxC/rK5K1PFazMk7Kh0311M1Wp4A8Lc8wYpnEvndUP0piEGVfsvSa5A2SWYg2eHcWJfOEj9
  1153. OE+n7Js0MQ8/l7EhiHcFIeyvzxX2hcz2UCEIWOHpl+kwIkb/6cy2PQ16osTlIV12OkRlc2V/4Z5p
  1154. J/fnFM98avtWCmWOSzHfDZ2XTeae49gxvQHk/FFasFg61bWg+Y6Azq14KmBv9JlYIc52IoIoUR9W
  1155. YMEO0VG/UcZBHu2mg72h1TNxuO8qjHsVRIjn+zsuOrdN9IgXPELdM0I15sKBY4GxZmTfHRfxLUHm
  1156. vLKg11B4zgeeZ+iX/MHXm8vnxzYpifyOze5LDpD2oWPYL9uq8jtffOSMJl6pJlQ7gIUq4y74q9Bh
  1157. zaXYH+D0amT3BEHmwIkhhV778Lm6GeG9TDTsImr57hgWJEZP1JgW5VQVa9ztk3Fvsa3K6sPgAun7
  1158. YfS0H4BCKMO+CX74XRugnp/peHDW0NvirMOJ1wodeaBDcp8XeITx+lrsusPpWtODhlO5uC0y5w5d
  1159. 3tP7DWLNXgP38hId+21Bd+UtD+yx/XxBbHj88weM75dT2OEv7nKoba8vBy8lsBOLBTh4PNuhkHkc
  1160. g3UBhTkiNY21m0bC8eJ3S0aHm9qlIVegw0c1PfgmSAosyImdastvjUHwfz3zySQ=
  1161. """.decode("base64").decode("zlib")
  1162. ##file ez_setup.py
  1163. EZ_SETUP_PY = """
  1164. eJzNWmuP28YV/a5fwShYSIJlLt8PGXKRJi5gIEiDPAoU9lY7zxVrilRJyhu1yH/vmeFDJLVU2iIf
  1165. ysDZXXJ45z7PuXekL784nqt9ns3m8/kf87wqq4IcjVJUp2OV52lpJFlZkTQlVYJFs/fSOOcn45lk
  1166. lVHlxqkUw7XqaWEcCftEnsSirB+ax/Pa+PuprLCApScujGqflDOZpEK9Uu0hhByEwZNCsCovzsZz
  1167. Uu2NpFobJOMG4Vy/oDZUa6v8aOSy3qmVv9nMZgYuWeQHQ/xzp+8byeGYF5XScnfRUq8b3lquriwr
  1168. xD9OUMcgRnkULJEJMz6LooQT1N6XV9fqd6zi+XOW5oTPDklR5MXayAvtHZIZJK1EkZFKdIsulq71
  1169. pgyreG6UuUHPRnk6HtNzkj3NlLHkeCzyY5Go1/OjCoL2w+Pj2ILHR3M2+0m5SfuV6Y2VRGEUJ/xe
  1170. KlNYkRy1eU1UtZbHp4LwfhxNlQyzxnnluZx98+5PX/387U+7v7z74cf3f/7O2BpzywyYbc+7Rz//
  1171. 8K3yq3q0r6rj5v7+eD4mZp1cZl483TdJUd7flff4r9vtfm7cqV3Mxr8fNu7DbHbg/o6TikDgv3TE
  1172. Fpc3XmNzar8+nh3TNcXT02JjLKLIcRiRsWU7vsUjL6JxHNBQOj4LRMDIYn1DitdKoWFMIuJZrvB8
  1173. y5GURr4QrrRjzw5dn9EJKc5QFz/ww9CPeUQCHknmeVZokZhboRM6PI5vS+l08WAAibgdxNyhIghs
  1174. SVyHBMJ3hCcjZ8oid6gLpa7NLMlCN45J4PphHIc+IzyWPrECO7oppdPFjUjEcJcHgnHHcbxQ2mEs
  1175. Q06CIJaETUjxhroEjuX5xPEE94QtKAtDKSw3JsQTgQyFf1PKxS+MOsSOfOgRccKkpA63oY/lUpfa
  1176. zHtZChvlC3WlQ33fjXmAuIYy9AgPY9uBIBJb0YRFbJwvsIcLDk8GIXe4I6WwPcuK3cCTDvEmIs1s
  1177. a6gMgzscQn3uEsvxA88PEB9mu5FlkdCKrdtiOm38kONFxCimkRWGDvNj4rsk8lyX+JxPeqYW47di
  1178. uPACwiL4Mg5ZFPt+6AhfRD7SUdCIhbfFBJ02kUAlESGtAA5ymAg824M0B0bC4RPRBqgMfeNQIghq
  1179. 2HY53kcZOZEIKfGpT6ARF7fFXCLFAzeWMbUgzGOe48Wh5XpcMEcwizmTkbKHvgk8FnvSpTIkIbLQ
  1180. FSxyhUUdhDv0YurcFtP5hkoSO7ZlUY4wcdQEJAnOXQQ+8KwomBAzwhlpWYFHZUCIQ0NuQS141kNi
  1181. W5EdMmcqUCOcCezAjh0hmOtLLxSImh0wHhDbgVQnnJIywhlpRwAogC+XSBXi+DGLIUXaPKRhJCfQ
  1182. io1wRliCh14QOSyOIyppCE9HFrLXQsxDeyrY7jBIhAppB5JzGOb7vu1Fns1C4BePozjwp6SM0Ipa
  1183. NLZdmzBCXceCM4BzofQ85gMoQlvelNJZhCSR2DPgnqTSRUVRGXsBs+AqoJ6YShhvaFGk0BrA7zqM
  1184. 05iFDmXSA3w5gXQiIqfQyh9aJEQseWRBHRQkMla6ApjuhwAMHtnBVKT9oUVEAqu4BKvYoWULAeeG
  1185. ICefMhAeCaZQxh/FKOKuDAAIHmOERKHtIXG4G1LGuMt9PiElGFqEgonA8pFtB2CiKPJCByLAmL4X
  1186. o7SngDMYsRvzAyL9kMK/6B5QDYEFQzzPRYH5ZAobgqFF1JERCX0HZA/YpS5I2kKoufAlWgnfnZAS
  1187. juDOQoxkTDhzSWD7wrdtH2WIliICBE7mSzhiAhLJ2PfAAhxYbkkahEza0kEY8MiZqoBwaJEHjiXA
  1188. W4mWAQXouZ5t25KLyLXxL5zSJRp1Q5bqhZwYHok5+EOlIAA8ci3VWFm3pXQWMUrcCNiAnsOLXGap
  1189. nEW2wdkMzDJJA9HQIjt07BAgh0DHnNm+5ccW8SPqCtR57E9FOh5aBN2ZZ6GZsZWHqRcHwmOSCiuC
  1190. rcyainQ8QgYkGRo7cKsbRTwAOhEhrADgxQLXm+rvGimdRVIgtK7wiR1S22EIE/M9m4bgXjC/mGKS
  1191. eMhHjKBsbKlQkziCA5js2AWzhdSPHfQ4kPLrrDcRYLwpZ1Vx3tQD156U+zSh7byF3n0mfmECo8Z7
  1192. feedGomatXjYXzfjQhq7zyRN0O2LHW4todMuwzy4NtQAsNpoAxJptPfVzNiOB/VDdfEEs0WFcUGJ
  1193. 0C+ae/FLfRfzXbsMcpqVX2w7KR9a0Q8XeerC3IVp8O1bNZ2UFRcF5rrlYIW65sqkxoJmPrzDFEYw
  1194. hvEvDGP5fV6WCU174x9GOvx9+MNqfiXsrjNz8Gg1+EvpI35JqqVT3y8Q3CLT7qodOhoO9aJmvNqO
  1195. hrl1p9aOklJsewPdGpPiDqPqNi9NdirwW51M3QtcpOS8tf1ZEySMjV+dqvwAPzBMl2eMohm/78zu
  1196. nRSouf5APiGWGJ4/w1VEOQjOU6YdSbWvx/nHRulHo9znp5SraZbUvu5Layfz7HSgojCqPakMDMKd
  1197. YC1LTcCZ8q4hMfV2Sp0yrl8RxuPAEY+GGmmXz/uE7dvdBbRWRxO1PGNxv1iZULL20qPaUsnpHWPs
  1198. RTE4IHlOMHPTSyYIvkZG1gmuVc5y+CMtBOHni/rY473sqafdrrdrzia0mKrRUkujQqvSOESfWLA8
  1199. 42Xtm1aNI0GiKKfCI6qskipB6LKn3nlGHfHG/jwT+jyhPhvhtV5wap4qH754PqK0bA4bRCNMn+UU
  1200. +Qk7iVqVus6IcRBlSZ5EfcBxKbrHR50vBUlKYfx4LitxePeL8ldWByIzSIV79ckGoQpalPEqBZUx
  1201. 9amH2Wao/vlMyl2NQrB/ayyOn552hSjzU8FEuVAIo7Y/5PyUilKdkvQAdPy4rglUHUceNG5bri5I
  1202. olJueymaXl02HhuVYFt261GhXTCgLRITnhVFtbTWapMeyDVA3e30pn+6Q9tjvl0TmJ0G5q2SUQcI
  1203. wD6WNXCQfvgCwncvtYDUd0jz6HqHgWizSa7l/KLx2+38VeOq1ZtGdl+FoYC/1Cu/zjOZJqyCazZ9
  1204. 9O9H/r9F+/lP+0v2T+T78u32rlx1tdzWsD7K/JgNAX/OSLaoVEl1JQLMUMd3ukaa4zpVLacsQyqb
  1205. xvepQIa0y6/kqRpSpQwAErCl1VAmRQlHnEpVDgtIOLehN17/3FN+YY7kfcw+ZsuvT0UBaYDzWsBd
  1206. MeKtFVjrksvCJMVT+cF6uM1ZOn5pKYYxQKIPw7nuV9qHUZ0+qFe+hLUayfNPA1Ev5eB01nyToCQS
  1207. elIM/l1e/SkHL9zO55ppXyrr35tuVfGjPAc8+80LpKrLmFxIwUhzVrckGj5rG5KqPiHWLcb/KcnW
  1208. EK0+A2hJ9rc4Vt1Tu14TbI37jxfOnODFvGbDlgwVqbDqRNKLEQ3JDImk/YihANdQB9m6RwqldZ61
  1209. /erW6IHZ67sSvfddqVrveb9wRkfgda5Cbp87lM+MV8MWsSSfBbTfoiWvSeHveZItWwppl9biyoIp
  1210. cbpP/g5s3rbWCqra11GkZVUua7GrjSqwrz7niUqgoyCKL1t1yq4+BniuLp2KHIKUN8rWS2n+NFil
  1211. mnEVl+G76sJK85kU2VL5+fXvd9WfkDTA2iB5+VKW3+mUUJ+cLMVnkak/YM4Rys72Ij2qvu99nW29
  1212. 3qNLFTQnKv/VZztL5YoZKGFtAF1m6tYB5ZwJOBKvoA5V5wuEFs8KjwnG2bLUb/c5QCO4OWu2BHQ3
  1213. Pc5lR6jM22w2Z7MlQExslIe1mANhe9Vu8VzUxLRHeKFE9ZwXn5pN18axZpecVqT5XE4hhUaJu3I2
  1214. UygCDzDdtesFkHypxKZyCtGwVd8Ac/V7RhFJsb5KmR7oXjVUOsvWqpquXkNHoZO1StRk2TROqRDH
  1215. N/WP5aj3GmZnC8OaF8u53mLEe7rkGnww8TM/imx5texL4wc0/ffPRVIBfBBj+Fe328DwT2v10eCz
  1216. ip5qF1ihyhDQyPKiOOnkSMVImI57Pz1UF14Jvb7FxPZqPmabGsJhgKkGkuVqqHGNItqaGivW82c6
  1217. hzvxwNR21GN49xKGQTUUbsYQgA02eheW5qVYrq4goqw2Wmj/ecNmLWhBwVT90sLW7D+5FH8fkOlL
  1218. NCyf11OMfeHc97c+NNUc+w6tVbOqJYiXmunRh9G3Oul6eOiw+kriZc3tAUNP6tZ1SzYcIwZThI6Z
  1219. Ko3e7MDywwGGmoMesj3OIc1A1l5NjLSLU3CB9vPqlTpteVjpNH0Wi0KntTAUjf9mqihLlZ9HXKXU
  1220. vuYQLDplmAA/LTuzhg1n0m/czd2u8dZuZ2wxElqmZdqL/3pE+CsAXoOrmotpmacCtToxGrdNP8ik
  1221. buyvGvpCHPLPGm91JOrvPOgJGMxRAXrT38DdUac+2ZI3RfWPYbPSm7z63c71MPgfDHT4eaP/Hk1t
  1222. m+ls/59T8laZdYJ/U8pVNr9Ud225PQxndu1sa4XEh1WK/RE4pjNFPXk5Q9Uuv5MDOvW15jemsDrN
  1223. 5z9etUXzdYsoc4DgkyaiQh3/IgnRJF0Sev6CvMXyB7RT8/bbOebxPJw+5/X3bq6/mmKuFs2x5rHj
  1224. p3aEKS/w/LN+aqgSoackrV7X58QQ+aSGu7NC5H4WF838o3qt9ly5E3txiO65L921+lOtWF66ai2k
  1225. 5UJNmouCLi7PumNm9e5Dc0QtW1J98ZhadmRXj4A1RX+Yqz/uig3+rYEVGB+aTrNuyNqNTJDvoVyu
  1226. HrqXzRIWd9R5VEPFfF5PCjVJ9x2DCGCErNqJQX+faNveNZ9EVRetur/sT+c73THsdk3Wdy5pZKwN
  1227. 7ZY3TUvUOuDN2NgDqTANbqGnWQpSsP1y/jHrfx/oY7b88LdfH16tfp3r9mTVH2P02z0segGxQeT6
  1228. G1mpIRQKfDG/LtIWEWtV8f8PGy3Y1K330l49YAzTjnyln9YPMbri0ebhZfMXz01OyKY96lTvOWAG
  1229. M1o/breL3U4V7G636D4FSZVEqKlr+K2j6bD9+4P9gHdev4az6lLp0VevdrrlzubhJV7UGHGRqRbV
  1230. 178BYnMUkw==
  1231. """.decode("base64").decode("zlib")
  1232. ##file distribute_setup.py
  1233. DISTRIBUTE_SETUP_PY = """
  1234. eJztG2tz2zbyO38FTh4PqYSm7bT3GM+pc2nj9DzNJZnYaT8kGRoiIYk1X+XDsvrrb3cBkCAJyUnb
  1235. u5mbOd3VoYjFYrHvXUBHfyp3zabIndls9m1RNHVT8ZLFCfybLNtGsCSvG56mvEkAyLlasV3Rsi3P
  1236. G9YUrK0Fq0XTlk1RpDXA4mjFSh7d8bVwazkYlDuf/dzWDQBEaRsL1myS2lklKaKHL4CEZwJWrUTU
  1237. FNWObZNmw5LGZzyPGY9jmoALImxTlKxYyZU0/osLx2HwWVVFZlAf0jhLsrKoGqQ27Kkl+OErbz7Z
  1238. YSV+aYEsxlldiihZJRG7F1UNzEAa+qk+PgNUXGzztOCxkyVVVVQ+KyriEs8ZTxtR5Rx4qoH6Hfu0
  1239. aARQccHqgi13rG7LMt0l+drBTfOyrIqySnB6UaIwiB+3t+Md3N4GjnOD7CL+RrQwYhSsauG5xq1E
  1240. VVLS9pR0icpyXfHYlGeASuEo5hW1fqp33WOTZEI/r/KMN9GmGxJZiRR033lFXzsJtU2CKiNH02Lt
  1241. OE21u+ilWCeofXL4/fXlu/D66ubSEQ+RANKv6P0lslhO6SDYgr0ucmFg02S3S2BhJOpaqkosViyU
  1242. yh9GWew94dW6nssp+MGvgMyD7QbiQURtw5ep8OfsKQ11cBXwq8oN9EEEHPUIG1ss2Jmzl+gjUHRg
  1243. PogGpBizFUhBEsSeBV/9oUQesV/aogFlwtdtJvIGWL+C5XPQxR4MXiGmEswdiMmQfBdgvnrm9ktq
  1244. shChwG3Oh2MKjwv/A+OG8emwwTZ3dlzPXHaMgBM4BTMeUpv+0FNArIMHtWL9aSydog7qkoPVefD0
  1245. Nvzp+dWNz0ZMY09Mmb24fPn8/aub8MfLd9dXb17DerOz4C/B+dmsG3r/7hW+3jRNeXF6Wu7KJJCi
  1246. CopqfaqcYH1ag6OKxGl82vul05lzfXnz/u3NmzevrsOXz3+4fDFaKDo/nzkm0Nsfvg+vXr98g+Oz
  1247. 2UfnX6LhMW/4yY/SHV2w8+DMeQ1+9MIwYacbPa6d6zbLOFgFe4CP888iEyclUEjfnectUF6Zzyci
  1248. 40kq37xKIpHXCvSFkA6E8OILIAgkuG9HjuOQGitf44EnWMK/c20D4gFiTkTKSe5dDtNgk5XgImHL
  1249. 2psE2V2Mz+CpcRzcRrDlVe65lz0S0IHj2vXVZAlYpHG4jQERiH8tmmgbKwydlyAosN0NzPHMqQTF
  1250. iQjpwoKiFHm3iw4mVPtQWxxMDqK0qAWGl94g14UiFjfdBYIOAPyJ3DoQVfJmE/wM8IowH1+moE0G
  1251. rR/OPs2nG5FY+oGeYa+LLdsW1Z3JMQ1tUKmEhmFoiuOqG2QvOt1256Y7yYtm4MBcHbFhOVchd0ce
  1252. pF/gGnQUQj/g34LLYtuqgMe4rbSumMlJYCw8wiIEQQv0vCwDFw1az/iyuBd60irJAY9NFaTmzLUS
  1253. L9sEXoj12oP/fK2s8FCEyLr/6/T/gE6TDCkW5gykaEH0bQdhKDbC9oKQ8u45tU/HT37Bv0v0/ag2
  1254. 9OoEv8GfykD0mWoodyCjmtauStRt2gyVB5aSwMoGNcfFAyxd03C/SsUTSFGv3lBq4rnfFW0a0yzi
  1255. lLSd9RptRVlBDESrHNZT6bDfZbXhktdCb8x4HYuU79SqyMqxGih4tw+TJ8f1Sbk7jgP4P/LOmkjA
  1256. 55j1VGBQV18g4qwK0CHLy/NP889njzILILjbi5Fx79n/PlpHnz1c6vXqEYdDgJSzIfngD0XVeGc+
  1257. 6+Wvst9h3WMk+Utd9ekAHVL6vSDTkPIe1Rhqx4tRijTiwMJIk6zckDtYoIq3lYUJi/M/+yCccMXv
  1258. xOKmakXnXTNOJl63UJhtKXkmHeXLukjRUJEXTr+EoWkAgv96Jve2vA4llwR6U7e8W4dgUpS11ZTE
  1259. In+zIm5TUWOl9LHbjdtzZQw49cSDL4ZoBusNAaRybnjNm6byBoBgKGFsBF1rEo6zFQftWTgNDSvg
  1260. MYhyDn3t0kHsK2u6mTL3/j3eYj/zBswIVJnuzXqWfLOYPVWrzS1kjXcxxKfS5u+KfJUmUTNcWoCW
  1261. yNohIm/izcGfjAVnatWU9zgdQh1kJMG2gkLXm0DMbsiz07Zis+dg9Ga8bxbHULBArY+C5veQrlMl
  1262. 8zGfTfFhKyXiudtgvalMHTBvN9gmoP6KagvAU9XmGF0C9jYVIB4rPt064CwrKiQ1whRNE7pKqrrx
  1263. wTQBjXW6C4h32uWwk/fGvtzAAv8x/5h737VVBaukO4mYHVdzQD7w/yLAKg4zh6kqS6EljfdsOCbS
  1264. 2mIfoIFsZHKGfX8Y+YlPOAUjMzV2irt9xeyXWMNnxZB9FmPV6y6bgVVfF83Los3j3220j5JpI3GS
  1265. 6hxyV2FUCd6IsbcKcXNkgV0WheHqQJT+vTGLPpbApeKV8sJQD7/oW3yduVJc7RqJYHtpEVHpQm1O
  1266. xfikkZ27HCp5mRTeKtpvWb2hzGyJ7ch7niYD7Nry8jZbigosmpMpd16BcGH7j5Je6ph0fUjQApoi
  1267. 2O2AH7cMexwe+Ihoo1cXeSzDJvZoOXNP3XnAbiVPbnHFQe4P/kVUQqeQXb9LryLiQO6RONhNV3ug
  1268. DmtU5DH1OkuOgX4pVuhusK0ZNS1P+44r7a/BSqoJtBj+IwnDIBaRUNsKquAlRSGBbW7Vb65SLKsc
  1269. wxqtsdJA8cw2t1n/GqI6YOtnkBwHWIatf0UHqKQvm9rVIFdFQbKnHRaZ//F7ASzdk4JrUJVdVhGi
  1270. g32p1qphraO8WaKdXyDPn98XCWp1iZYbd+T0Gc4kpHfFS2c95OPrmY9bGrpsSZTikjcZPmLvBI9P
  1271. KbYyDDCQnAHpbAkmd+djh32LSojRULoW0OSoqCpwF2R9I2SwW9JqbS8JnnU0guC1CusPNuUwQagi
  1272. 0AcejzIqyUYiWjLLZ7PtcjYBUmkBIuvHJj5TSQLWsqQYQIAu0UfwgN8S7mBRE77vnJKEYS8pWYKS
  1273. sS4FS2z6h8gzD4d9YCNwJm96V/gT2TyP7tqSuLiSCYfIGc0Fj6cNlbQIZB4qHJpTiHhuchP2MIVd
  1274. 6KX7vR2B7HHaTi4lYkut/3wIYbaRFAtecsgPRr2ZtwiNKVKgJ0CURZsJiUlEsYxz5iYgad+6Niei
  1275. xK15Z4+QK5t8sDDSssBTNM0PqzS0TMdMNZinUEEYriEqLYsHb9XmEUYphYOGzXFqm/vsyZO77fxA
  1276. tSMPdfq6U03XDu+FjhjX8v3QIGDN+6SQjb7JIYj+lLwe1k9jnEFYpFjiTd93yB+Z38EBFvscpUYw
  1277. TpLRrx+rlfppUtv281HJUEtlwP5HPYVaZsq7w1u1MtKaMNshTeUzdcdx/mF+I9WamJEkNhdbHQTx
  1278. LQQ0N3jz6kVwXOPpER5EBvhn0kR9h+hkHEGfXcj2nTQOjVP1U7GMxK+ebVRRr186mtisuIe8FDgV
  1279. ms1or0x5JDawd6GbwqOImdTY1puCDal/n99BzBn0uSHHUXsw5u53WStM8Tu1km8qps/ejZ6rnRSg
  1280. Wh3sBupfD+f6ZuvjCTbnTjAPH7ch9OIDU8DPEvzOncmW1bAS6TnQNyMpWzbPp811RwxwJloAckIt
  1281. EKmQp59F22B+iQFpy3e9G9clxTg3MtjjE/u6SDSSqJpvcKK3bRUtgexwACuj36AKnUySIVbN8Jnl
  1282. aFA1kRVHJ6becwNMgY+jns+G1FiV6Qgwb1kqGrdmqPhdPB/zs1M0xW/UNc/slvmjPpvqluOhPz4a
  1283. 3NMYDslDwQxOnsYtXQUyKixNbzPBMu0L2PQSfK3skQNbNbGKE3s61u51f2cmNipyd7QTS4jnK0g7
  1284. u6NUnKx2ZCQ0CNLd7Ojau52C94zDtB4w4OkRpA1ZBm44LJY/e/3BXKB7wiWUTlCfyEznsWp84Jks
  1285. Lv5L5g+cp0k7KJelAnnMoVrEpjmlq/GpMyG27e6JYWA8KuZ4n33UIMuofqPkfRemC1UnHXXv0WCB
  1286. jwPt8fadr/uSti9wXyNSJp5M83Lqyqw+RIIf8CBjb/wdyl/G5MmsPl/uXN3hnNnqCAlgf/4sWdVs
  1287. tCT2s8qQUQAT3HF6MdqKQjneinr92FYGZBjtpbG8Ht+fUZp1wabPpY6UCwfPH92h4BP8ZiuV9qqT
  1288. LGYuv//+BBmOrhuYL5+/QJ2SSdFyML7t88WfG88Mn9rHtD11GxCf3XV8G746yIr5I4b4KOf+KxZg
  1289. sMIML7K71sWXSWz5Vnbf9gYXy3mSwkwtxrCsxCp58LSr7b17F3LIN6ujNKhs7o1TaoNc/K6ugWnA
  1290. D/oBYlYsHowg9vT84lOXkNCgry+LibzNRMXlNTKzpkRQec9Spi4nJxXsVZ7ey02Mc13YBOAIYM2q
  1291. qbE5inq5QD8u8VgK1qYoVbuRZpZp0ngurrNw5x9ORmdKBgs0+8zFFK7xwYakCut7SYX1mDAFZZN3
  1292. 376R/LEfFg7IrT8Q5FMLlb+ZUsVwvHV4ctLWonKpM97f7VQnXdiFnJJ4YMkOw17Fn+jtWPOvI05n
  1293. YsbRmb7hZ7PNvWe7hxoBR2wrXDCvCEiwhFwjawTtNC6mxIWQjKmFyLBVbp7wTRta9HWLtjNMwdXV
  1294. GWTDdENGDMKcESZv6wBzqOGxdPBOHlliEgterwJnM0j77QnxSI4UgRHDgty08qiKcze7Ukz4hn0d
  1295. 4yzk+durP5jweV9cjRGCUg4V0ryQZF6PN1N9WfDaRXPEYtEIdfELgzMeJncRDjU1HmeU3UnSYkxe
  1296. oIfG+mxe2ze6C3Jp0G7dZrCsonhBfXHpGFEhyTEmD0RsWUG5HYtY3uBPVgre/K1AbRT1sbozlvl9
  1297. X143h838fxhFbJTZpaCwAUP9McGASLbzbVcZp9oqLzUDLRuoBvZXDIM0C6xSyrE2b5ypLVk2EYg8
  1298. VhGErj3t2VR+Ii+k9cIb0IH2vb8/ZZWqnqxIAxy21qOlWWHcWdxP0r6MyELK4QRJkejtyy9R54ZV
  1299. /hfkmHuTzAPnBCPeDOdNTwpM3ehOn9Cs6YhUuj86rjT8fS7Goh1m979XniN66cAuF8bZRsrbPNr0
  1300. +Vz/Zhwp36mRwZ4xtLENx5YR/qhGQlD5rX+UgVD6Zv/wZv4n9rTL8qTj0/c4rD+66Eg0Lq/WIl3J
  1301. ru9iFsx8lgk8YK4X6Lj7kyp14ZYODBWEPLagw+IKtiTpx6+RvIqi75tqvvYH3+j48DdBxTbHQjIr
  1302. Yvz1kHSy2KkmgFJUWVLX9HOe/iBBI0lA0tTwAcbGdcBucQNud4EAf8oDSFeCCJlctwVCFQfgESar
  1303. Hbno7mSmxVMiIsOfZtGlAuAnkUzdK40HG8RKVUAtlju2Fo3C5c2HJ+0q64mKcmd+h2oGcmx1c0wy
  1304. VF471gCK8f31MpMDoA+fuuCrxTIJunoAA2C6crp8H1YipwNuW4EMyk81rJq3I+M/0oQN6FEXH2q+
  1305. EihVMTr+7SEDXkIZF3tqjaG/0HQtiFsB/jkIiPeOsFXx9dd/owQhSjIQH5UpQN/ZX8/OjIwnXQVK
  1306. 9BqnVP4ucL8T2KMSrEbumyR3Sc6ojcX+zrxnPvva4BDaGM4XlQcYzn3E82xu8zAsykqCCbDSloBB
  1307. f7QyZhsi9SRmO0AlqfdsffMJojuxW2gFDPAeJagv0uwiAe7cZwqbvGKqGQTpEV0IAFydBXdWi6pL
  1308. 4sB8acy8kdIZ4wMi6RDL2hvQAh8yaHIOSFKONkBcL2OFdz4FbOlw7DMAow3s7ACgysJNi/0NtyOl
  1309. iuLkFLifQt15bino8ObpqEq0XdQjZGG8XHughDPlWvAXT3gxRuhwkPGEqtx7n+25DNYHgqtDP4sk
  1310. Fbjk9U5Baed3+Jq4CqTjH0EBcQmdp2OGElLpG4ZIahiq39wR3V2T4/zi09z5N4dES24=
  1311. """.decode("base64").decode("zlib")
  1312. ##file activate.sh
  1313. ACTIVATE_SH = """
  1314. eJytU11P2zAUffevuKQ8AFqJ+srUh6IhgcTKRFgnjSLXTW4aS6ld2U6zgvbfd50PSD+GNI08JLHv
  1315. 8fW5557bg4dMWkhljrAsrIM5QmExgVK6DAKrCxMjzKUKRezkWjgM4Cw1eglzYbMz1oONLiAWSmkH
  1316. plAgHSTSYOzyDWMJtqfg5BReGNAjU3iEvoLgmN/dfuGTm/uH76Nb/m30cB3AE3wGl6GqkP7x28ND
  1317. 0FcE/lpp4yrg616hLDrYO1TFU8mqb6+u3Ga6yBNI0BHnqigQKoFnm32CMpNxBplYIwj6UCjWy6UP
  1318. u0y4Sq8mFakWizwn3ZyGBd1NMtBfqo1frAQJ2xy15wA/SFtduCbspFo0abaAXgg49rwhzoRaoIWS
  1319. miQS/9qAF5yuNWhXxByTHXEvRxHp2df16md0zSdX99HN3fiAyFVpfbMlz9/aFA0OdSka7DWJgHs9
  1320. igbvtqgJtxRqSBu9Gk/eiB0RLyIyhEBplaB1pvBGwx1uPYgwT6EFHO3c3veh1qHt1b8ZmbqOS2Mw
  1321. p+4rB2thpJjnaLue3r6bsQ7VYcB5Z8l5wBoRuvWwPYuSjLW9m0UHHXJ+eTPm49HXK84vGljX/WxX
  1322. TZ/Mt6GSLJiRuVGJJcJ0K+80mFVKEsdd9by1pMjJ2xa9W2FEO4rst5BxM+baSBKlgSNC5tzqIgzL
  1323. sjx/RkdmXZ+ToUOrU1cKg6HwGUL26prHDq0ZpTxIcDqbPUFdC+YW306fvFPUaX2AWtqxH/ugsf+A
  1324. kf/Pcf/3UW/HnBT5Axjqy2Y=
  1325. """.decode("base64").decode("zlib")
  1326. ##file activate.bat
  1327. ACTIVATE_BAT = """
  1328. eJx9kMsOgjAQRfdN+g+zoAn8goZEDESJPBpEViSzkFbZ0IX8f+RRaVW0u5mee3PanbjeFSgpKXmI
  1329. Hqq4KC9BglFW+YjWhEgJJa2ETvXQCNl2ogFe5CkvwaUEhjPm543vcOdAiacjLxzzJFw6f2bZCsZ0
  1330. 2YitXPtswawi1zwgC9II0QPD/RELyuOb1jB/Sg0rNhM31Ss4n2I+7ibLb8epQGco2Rja1Fs/zeoa
  1331. cR9nWnprJaMspOQJdBR1/g==
  1332. """.decode("base64").decode("zlib")
  1333. ##file deactivate.bat
  1334. DEACTIVATE_BAT = """
  1335. eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgWIgK0q
  1336. FlWqXJpcICVYpGzx2OAY4oFsPpCLbjpQCLvZILVcXFaufi5cACHzOrI=
  1337. """.decode("base64").decode("zlib")
  1338. ##file distutils-init.py
  1339. DISTUTILS_INIT = """
  1340. eJytVl2L6zYQffevGBKK7XavKe3bhVBo78uFSyml0IdlEVpbTtR1JCMpm6S/vjOSY0v+uO1DDbs4
  1341. 0tF8nJk5sjz32jjQNpPhzd7H1ys3SqqjhcfCL1q18vgbN1YY2Kc/pQWlHXB4l8ZdeCfUO5x1c+nE
  1342. E1gNVwE1V3CxAqQDp6GVqgF3EmBd08nXLGukUfws4IDBVD13p2pYoS3rLk52ltF6hPhLS1XM4EUc
  1343. VsVYKzvBWPkE+WgmLzPZjkaUNmd6KVI3JRwWoRSLM6P98mMG+Dw4q+il8Ev07P7ATCNmRlfQ8/qN
  1344. HwVwB99Y4H0vMHAi6BWZUoEhoqXTNXdSK+A2LN6tE+fJ0E+7MhOdFSEM5lNgrJIKWXDF908wy87D
  1345. xE3UoHsxkegZTaHIHGNSSYfm+ntelpURvCnK7NEWBI/ap/b8Z1m232N2rj7B60V2DRM3B5NpaLSw
  1346. KnfwpvQVTviHOR+F88lhQyBAGlE7be6DoRNg9ldsG3218IHa6MRNU+tGBEYIggwafRk6yzsXDcVU
  1347. 9Ua08kYxt+F3x12LRaQi52j0xx/ywFxrdMRqVevzmaummlIYEp0WsCAaX8cFb6buuLUTqEgQQ6/Q
  1348. 04iWRoF38m/BdE8VtlBY0bURiB6KG1crpMZwc2fIjqWh+1UrkSLpWUIP8PySwLKv4qPGSVqDuMPy
  1349. dywQ+gS7L1irXVkm5pJsq3l+Ib1lMOvUrxI+/mBBY4KB+WpUtcO06RtzckNvQ6vYj1lGoZM2sdDG
  1350. fryJPYJVn/Cfka8XSqNaoLKhmOlqXMzW9+YBVp1EtIThZtOwzCRvMaARa+0xD0b2kcaJGwJsMbc7
  1351. hLUfY4vKvsCOBdvDnyfuRbzmXRdGTZgPF7oGQkJACWVD22IMQdhx0npt5S2f+pXO+OwH6d+hwiS5
  1352. 7IJOjcK2emj1zBy1aONHByfAMoraw6WlrSIFTbGghqASoRCjVncYROFpXM4uYSqhGnuVeGvks4jz
  1353. cjnCoR5GnPW7KOh4maVbdFeoplgJ3wh3MSrAsv/QuMjOspnTKRl1fTYqqNisv7uTVnhF1GhoBFbp
  1354. lh+OcXN2riA5ZrYXtWxlfcDuC8U5kLoN3CCJYXGpesO6dx6rU0zGMtjU6cNlmW0Fid8Sja4ZG+Z3
  1355. fTPbyj+mZnZ2wSQK8RaT9Km0ySRuLpm0DkUUL0ra3WQ2BgGJ7v9I9SKqNKZ/IR4R28RHm+vEz5ic
  1356. nZ2IH7bfub8pU1PR3gr10W7xLTfHh6Z6bgZ7K14G7Mj/1z5J6MFo6V5e07H0Ou78dTyeI+mxKOpI
  1357. eC2KMSj6HKxd6Uudf/n886fPv+f++x1lbASlmjQuPz8OvGA0j7j2eCu/4bcW6SFeCuNJ0W1GQHI5
  1358. iwC9Ey0bjtHd9P4dPA++XxLnZDVuxvFEtlm3lf5a2c02u2LRYXHH/AOs8pIa
  1359. """.decode("base64").decode("zlib")
  1360. ##file distutils.cfg
  1361. DISTUTILS_CFG = """
  1362. eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH
  1363. xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg
  1364. 9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q=
  1365. """.decode("base64").decode("zlib")
  1366. ##file activate_this.py
  1367. ACTIVATE_THIS = """
  1368. eJx1UsGOnDAMvecrIlYriDRlKvU20h5aaY+teuilGo1QALO4CwlKAjP8fe1QGGalRoLEefbzs+Mk
  1369. Sb7NcvRo3iTcoGqwgyy06As+HWSNVciKaBTFywYoJWc7yit2ndBVwEkHkIzKCV0YdQdmkvShs6YH
  1370. E3IhfjFaaSNLoHxQy2sLJrL0ow98JQmEG/rAYn7OobVGogngBgf0P0hjgwgt7HOUaI5DdBVJkggR
  1371. 3HwSktaqWcCtgiHIH7qHV+esW2CnkRJ+9R5cQGsikkWEV/J7leVGs9TV4TvcO5QOOrTHYI+xeCjY
  1372. JR/m9GPDHv2oSZunUokS2A/WBelnvx6tF6LUJO2FjjlH5zU6Q+Kz/9m69LxvSZVSwiOlGnT1rt/A
  1373. 77j+WDQZ8x9k2mFJetOle88+lc8sJJ/AeerI+fTlQigTfVqJUiXoKaaC3AqmI+KOnivjMLbvBVFU
  1374. 1JDruuadNGcPmkgiBTnQXUGUDd6IK9JEQ9yPdM96xZP8bieeMRqTuqbxIbbey2DjVUNzRs1rosFS
  1375. TsLAdS/0fBGNdTGKhuqD7mUmsFlgGjN2eSj1tM3GnjfXwwCmzjhMbR4rLZXXk+Z/6Hp7Pn2+kJ49
  1376. jfgLHgI4Jg==
  1377. """.decode("base64").decode("zlib")
  1378. if __name__ == '__main__':
  1379. main()
  1380. ## TODO:
  1381. ## Copy python.exe.manifest
  1382. ## Monkeypatch distutils.sysconfig