<s> """<STR_LIT>""" <EOL> from __future__ import with_statement <EOL> import codecs <EOL> import re <EOL> import sys <EOL> import time <EOL> from array import array <EOL> from bisect import insort , bisect_left <EOL> from copy import copy <EOL> from functools import wraps <EOL> from struct import pack , unpack <EOL> from threading import Lock <EOL> from whoosh . compat import xrange , u , b , string_type <EOL> from whoosh . system import IS_LITTLE <EOL> try : <EOL> from itertools import permutations <EOL> except ImportError : <EOL> def permutations ( iterable , r = None ) : <EOL> pool = tuple ( iterable ) <EOL> n = len ( pool ) <EOL> r = n if r is None else r <EOL> if r > n : <EOL> return <EOL> indices = range ( n ) <EOL> cycles = range ( n , n - r , - <NUM_LIT:1> ) <EOL> yield tuple ( pool [ i ] for i in indices [ : r ] ) <EOL> while n : <EOL> for i in reversed ( range ( r ) ) : <EOL> cycles [ i ] -= <NUM_LIT:1> <EOL> if cycles [ i ] == <NUM_LIT:0> : <EOL> indices [ i : ] = indices [ i + <NUM_LIT:1> : ] + indices [ i : i + <NUM_LIT:1> ] <EOL> cycles [ i ] = n - i <EOL> else : <EOL> j = cycles [ i ] <EOL> indices [ i ] , indices [ - j ] = indices [ - j ] , indices [ i ] <EOL> yield tuple ( pool [ i ] for i in indices [ : r ] ) <EOL> break <EOL> else : <EOL> return <EOL> try : <EOL> from operator import methodcaller <EOL> except ImportError : <EOL> def methodcaller ( name , * args , ** kwargs ) : <EOL> def caller ( obj ) : <EOL> return getattr ( obj , name ) ( * args , ** kwargs ) <EOL> return caller <EOL> if sys . platform == '<STR_LIT:win32>' : <EOL> now = time . clock <EOL> else : <EOL> now = time . time <EOL> utf8encode = codecs . getencoder ( "<STR_LIT>" ) <EOL> utf8decode = codecs . getdecoder ( "<STR_LIT>" ) <EOL> def array_to_string ( a ) : <EOL> if IS_LITTLE : <EOL> a = copy ( a ) <EOL> a . byteswap ( ) <EOL> return a . tostring ( ) <EOL> def string_to_array ( typecode , s ) : <EOL> a = array ( typecode ) <EOL> a . fromstring ( s ) <EOL> if IS_LITTLE : <EOL> a . byteswap ( ) <EOL> return a <EOL> def make_binary_tree ( fn , args , ** kwargs ) : <EOL> """<STR_LIT>""" <EOL> count = len ( args ) <EOL> if not count : <EOL> raise ValueError ( "<STR_LIT>" ) <EOL> elif count == <NUM_LIT:1> : <EOL> return args [ <NUM_LIT:0> ] <EOL> half = count // <NUM_LIT:2> <EOL> return fn ( make_binary_tree ( fn , args [ : half ] , ** kwargs ) , <EOL> make_binary_tree ( fn , args [ half : ] , ** kwargs ) , ** kwargs ) <EOL> def make_weighted_tree ( fn , ls , ** kwargs ) : <EOL> """<STR_LIT>""" <EOL> if not ls : <EOL> raise ValueError ( "<STR_LIT>" ) <EOL> ls . sort ( ) <EOL> while len ( ls ) > <NUM_LIT:1> : <EOL> a = ls . pop ( <NUM_LIT:0> ) <EOL> b = ls . pop ( <NUM_LIT:0> ) <EOL> insort ( ls , ( a [ <NUM_LIT:0> ] + b [ <NUM_LIT:0> ] , fn ( a [ <NUM_LIT:1> ] , b [ <NUM_LIT:1> ] ) ) ) <EOL> return ls [ <NUM_LIT:0> ] [ <NUM_LIT:1> ] <EOL> def _varint ( i ) : <EOL> a = array ( "<STR_LIT:B>" ) <EOL> while ( i & ~ <NUM_LIT> ) != <NUM_LIT:0> : <EOL> a . append ( ( i & <NUM_LIT> ) | <NUM_LIT> ) <EOL> i = i >> <NUM_LIT:7> <EOL> a . append ( i ) <EOL> return a . tostring ( ) <EOL> _varint_cache_size = <NUM_LIT> <EOL> _varint_cache = [ ] <EOL> for i in xrange ( <NUM_LIT:0> , _varint_cache_size ) : <EOL> _varint_cache . append ( _varint ( i ) ) <EOL> _varint_cache = tuple ( _varint_cache ) <EOL> def varint ( i ) : <EOL> """<STR_LIT>""" <EOL> if i < len ( _varint_cache ) : <EOL> return _varint_cache [ i ] <EOL> return _varint ( i ) <EOL> def varint_to_int ( vi ) : <EOL> b = ord ( vi [ <NUM_LIT:0> ] ) <EOL> p = <NUM_LIT:1> <EOL> i = b & <NUM_LIT> <EOL> shift = <NUM_LIT:7> <EOL> while b & <NUM_LIT> != <NUM_LIT:0> : <EOL> b = ord ( vi [ p ] ) <EOL> p += <NUM_LIT:1> <EOL> i |= ( b & <NUM_LIT> ) << shift <EOL> shift += <NUM_LIT:7> <EOL> return i <EOL> def signed_varint ( i ) : <EOL> """<STR_LIT>""" <EOL> if i >= <NUM_LIT:0> : <EOL> return varint ( i << <NUM_LIT:1> ) <EOL> return varint ( ( i << <NUM_LIT:1> ) ^ ( ~ <NUM_LIT:0> ) ) <EOL> def decode_signed_varint ( i ) : <EOL> """<STR_LIT>""" <EOL> if not i & <NUM_LIT:1> : <EOL> return i >> <NUM_LIT:1> <EOL> return ( i >> <NUM_LIT:1> ) ^ ( ~ <NUM_LIT:0> ) <EOL> def read_varint ( readfn ) : <EOL> """<STR_LIT>""" <EOL> b = ord ( readfn ( <NUM_LIT:1> ) ) <EOL> i = b & <NUM_LIT> <EOL> shift = <NUM_LIT:7> <EOL> while b & <NUM_LIT> != <NUM_LIT:0> : <EOL> b = ord ( readfn ( <NUM_LIT:1> ) ) <EOL> i |= ( b & <NUM_LIT> ) << shift <EOL> shift += <NUM_LIT:7> <EOL> return i <EOL> _fib_cache = { } <EOL> def fib ( n ) : <EOL> """<STR_LIT>""" <EOL> if n <= <NUM_LIT:2> : <EOL> return n <EOL> if n in _fib_cache : <EOL> return _fib_cache [ n ] <EOL> result = fib ( n - <NUM_LIT:1> ) + fib ( n - <NUM_LIT:2> ) <EOL> _fib_cache [ n ] = result <EOL> return result <EOL> def float_to_byte ( value , mantissabits = <NUM_LIT:5> , zeroexp = <NUM_LIT:2> ) : <EOL> """<STR_LIT>""" <EOL> fzero = ( <NUM_LIT> - zeroexp ) << mantissabits <EOL> bits = unpack ( "<STR_LIT:i>" , pack ( "<STR_LIT:f>" , value ) ) [ <NUM_LIT:0> ] <EOL> smallfloat = bits >> ( <NUM_LIT> - mantissabits ) <EOL> if smallfloat < fzero : <EOL> if bits <= <NUM_LIT:0> : <EOL> result = chr ( <NUM_LIT:0> ) <EOL> else : <EOL> result = chr ( <NUM_LIT:1> ) <EOL> elif smallfloat >= fzero + <NUM_LIT> : <EOL> result = chr ( <NUM_LIT:255> ) <EOL> else : <EOL> result = chr ( smallfloat - fzero ) <EOL> return b ( result ) <EOL> def byte_to_float ( b , mantissabits = <NUM_LIT:5> , zeroexp = <NUM_LIT:2> ) : <EOL> """<STR_LIT>""" <EOL> if type ( b ) is not int : <EOL> b = ord ( b ) <EOL> if b == <NUM_LIT:0> : <EOL> return <NUM_LIT:0.0> <EOL> bits = ( b & <NUM_LIT> ) << ( <NUM_LIT> - mantissabits ) <EOL> bits += ( <NUM_LIT> - zeroexp ) << <NUM_LIT> <EOL> return unpack ( "<STR_LIT:f>" , pack ( "<STR_LIT:i>" , bits ) ) [ <NUM_LIT:0> ] <EOL> _length_byte_cache = array ( '<STR_LIT:i>' , [ <NUM_LIT:0> , <NUM_LIT:1> , <NUM_LIT:2> , <NUM_LIT:3> , <NUM_LIT:4> , <NUM_LIT:5> , <NUM_LIT:6> , <NUM_LIT:7> , <NUM_LIT:8> , <NUM_LIT:9> , <NUM_LIT:10> , <NUM_LIT:12> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT:16> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT:20> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT:30> , <NUM_LIT:32> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <EOL> <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] ) <EOL> def length_to_byte ( length ) : <EOL> if length is None : <EOL> return <NUM_LIT:0> <EOL> if length >= <NUM_LIT> : <EOL> return <NUM_LIT:255> <EOL> else : <EOL> return bisect_left ( _length_byte_cache , length ) <EOL> byte_to_length = _length_byte_cache . __getitem__ <EOL> def first_diff ( a , b ) : <EOL> """<STR_LIT>""" <EOL> i = - <NUM_LIT:1> <EOL> for i in xrange ( <NUM_LIT:0> , len ( a ) ) : <EOL> if a [ i ] != b [ <NUM_LIT:1> ] : <EOL> return i <EOL> if i == <NUM_LIT:255> : <EOL> return i <EOL> def prefix_encode ( a , b ) : <EOL> """<STR_LIT>""" <EOL> i = first_diff ( a , b ) <EOL> return chr ( i ) + b [ i : ] . encode ( "<STR_LIT:utf8>" ) <EOL> def prefix_encode_all ( ls ) : <EOL> """<STR_LIT>""" <EOL> last = u ( '<STR_LIT>' ) <EOL> for w in ls : <EOL> i = first_diff ( last , w ) <EOL> yield chr ( i ) + w [ i : ] . encode ( "<STR_LIT:utf8>" ) <EOL> last = w <EOL> def prefix_decode_all ( ls ) : <EOL> """<STR_LIT>""" <EOL> last = u ( '<STR_LIT>' ) <EOL> for w in ls : <EOL> i = ord ( w [ <NUM_LIT:0> ] ) <EOL> decoded = last [ : i ] + w [ <NUM_LIT:1> : ] . decode ( "<STR_LIT:utf8>" ) <EOL> yield decoded <EOL> last = decoded <EOL> _nkre = re . compile ( r"<STR_LIT>" , re . UNICODE ) <EOL> def _nkconv ( i ) : <EOL> try : <EOL> return int ( i ) <EOL> except ValueError : <EOL> return i . lower ( ) <EOL> def natural_key ( s ) : <EOL> """<STR_LIT>""" <EOL> return tuple ( _nkconv ( m ) for m in _nkre . findall ( s ) ) <EOL> class ClosableMixin ( object ) : <EOL> """<STR_LIT>""" <EOL> def __enter__ ( self ) : <EOL> return self <EOL> def __exit__ ( self , * exc_info ) : <EOL> self . close ( ) <EOL> def protected ( func ) : <EOL> """<STR_LIT>""" <EOL> @ wraps ( func ) <EOL> def protected_wrapper ( self , * args , ** kwargs ) : <EOL> if self . is_closed : <EOL> raise Exception ( "<STR_LIT>" % self ) <EOL> with self . _sync_lock : <EOL> return func ( self , * args , ** kwargs ) <EOL> return protected_wrapper <EOL> def synchronized ( func ) : <EOL> """<STR_LIT>""" <EOL> @ wraps ( func ) <EOL> def synchronized_wrapper ( self , * args , ** kwargs ) : <EOL> with self . _sync_lock : <EOL> return func ( self , * args , ** kwargs ) <EOL> return synchronized_wrapper <EOL> def unbound_cache ( func ) : <EOL> """<STR_LIT>""" <EOL> cache = { } <EOL> @ wraps ( func ) <EOL> def caching_wrapper ( * args ) : <EOL> try : <EOL> return cache [ args ] <EOL> except KeyError : <EOL> result = func ( * args ) <EOL> cache [ args ] = result <EOL> return result <EOL> return caching_wrapper <EOL> def lru_cache ( maxsize = <NUM_LIT:100> ) : <EOL> """<STR_LIT>""" <EOL> def decorating_function ( user_function ) : <EOL> stats = [ { } , { } , <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ] <EOL> @ wraps ( user_function ) <EOL> def wrapper ( * args ) : <EOL> ptr = stats [ <NUM_LIT:2> ] <EOL> a = stats [ ptr ] <EOL> b = stats [ not ptr ] <EOL> key = args <EOL> if key in a : <EOL> stats [ <NUM_LIT:3> ] += <NUM_LIT:1> <EOL> return a [ key ] <EOL> elif key in b : <EOL> stats [ <NUM_LIT:3> ] += <NUM_LIT:1> <EOL> return b [ key ] <EOL> else : <EOL> stats [ <NUM_LIT:4> ] += <NUM_LIT:1> <EOL> result = user_function ( * args ) <EOL> a [ key ] = result <EOL> if len ( a ) >= maxsize : <EOL> stats [ <NUM_LIT:2> ] = not ptr <EOL> b . clear ( ) <EOL> return result <EOL> def cache_info ( ) : <EOL> """<STR_LIT>""" <EOL> return ( stats [ <NUM_LIT:3> ] , stats [ <NUM_LIT:4> ] , maxsize , len ( stats [ <NUM_LIT:0> ] ) + len ( stats [ <NUM_LIT:1> ] ) ) <EOL> def cache_clear ( ) : <EOL> """<STR_LIT>""" <EOL> stats [ <NUM_LIT:0> ] . clear ( ) <EOL> stats [ <NUM_LIT:1> ] . clear ( ) <EOL> stats [ <NUM_LIT:3> ] = stats [ <NUM_LIT:4> ] = <NUM_LIT:0> <EOL> wrapper . cache_info = cache_info <EOL> wrapper . cache_clear = cache_clear <EOL> return wrapper <EOL> return decorating_function <EOL> def clockface_lru_cache ( maxsize = <NUM_LIT:100> ) : <EOL> """<STR_LIT>""" <EOL> def decorating_function ( user_function ) : <EOL> stats = [ <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:0> ] <EOL> data = { } <EOL> if maxsize : <EOL> clock_keys = [ None ] * maxsize <EOL> clock_refs = array ( "<STR_LIT:B>" , ( <NUM_LIT:0> for _ in xrange ( maxsize ) ) ) <EOL> lock = Lock ( ) <EOL> @ wraps ( user_function ) <EOL> def wrapper ( * args ) : <EOL> key = args <EOL> try : <EOL> with lock : <EOL> pos , result = data [ key ] <EOL> clock_refs [ pos ] = <NUM_LIT:1> <EOL> stats [ <NUM_LIT:0> ] += <NUM_LIT:1> <EOL> except KeyError : <EOL> result = user_function ( * args ) <EOL> with lock : <EOL> hand = stats [ <NUM_LIT:2> ] <EOL> end = hand <EOL> while True : <EOL> hand = ( hand + <NUM_LIT:1> ) % maxsize <EOL> current_ref = clock_refs [ hand ] <EOL> if current_ref : <EOL> clock_refs [ hand ] = <NUM_LIT:0> <EOL> elif not current_ref or hand == end : <EOL> current_key = clock_keys [ hand ] <EOL> if current_key in data : <EOL> del data [ current_key ] <EOL> clock_keys [ hand ] = key <EOL> clock_refs [ hand ] = <NUM_LIT:1> <EOL> break <EOL> data [ key ] = ( hand , result ) <EOL> stats [ <NUM_LIT:2> ] = hand <EOL> stats [ <NUM_LIT:1> ] += <NUM_LIT:1> <EOL> return result <EOL> else : <EOL> @ wraps ( user_function ) <EOL> def wrapper ( * args ) : <EOL> key = args <EOL> try : <EOL> result = data [ key ] <EOL> stats [ <NUM_LIT:0> ] += <NUM_LIT:1> <EOL> except KeyError : <EOL> result = user_function ( * args ) <EOL> data [ key ] = result <EOL> stats [ <NUM_LIT:1> ] += <NUM_LIT:1> <EOL> return result <EOL> def cache_info ( ) : <EOL> """<STR_LIT>""" <EOL> return ( stats [ <NUM_LIT:0> ] , stats [ <NUM_LIT:1> ] , maxsize , len ( data ) ) <EOL> def cache_clear ( ) : <EOL> """<STR_LIT>""" <EOL> data . clear ( ) <EOL> stats [ <NUM_LIT:0> ] = stats [ <NUM_LIT:1> ] = stats [ <NUM_LIT:2> ] = <NUM_LIT:0> <EOL> for i in xrange ( maxsize ) : <EOL> clock_keys [ i ] = None <EOL> clock_refs [ i ] = <NUM_LIT:0> <EOL> wrapper . cache_info = cache_info <EOL> wrapper . cache_clear = cache_clear <EOL> return wrapper <EOL> return decorating_function <EOL> def find_object ( name , blacklist = None , whitelist = None ) : <EOL> """<STR_LIT>""" <EOL> if blacklist : <EOL> for pre in blacklist : <EOL> if name . startswith ( pre ) : <EOL> raise TypeError ( "<STR_LIT>" <EOL> % ( name , pre ) ) <EOL> if whitelist : <EOL> passes = False <EOL> for pre in whitelist : <EOL> if name . startswith ( pre ) : <EOL> passes = True <EOL> break <EOL> if not passes : <EOL> raise TypeError ( "<STR_LIT>" % name ) <EOL> lastdot = name . rfind ( "<STR_LIT:.>" ) <EOL> assert lastdot > - <NUM_LIT:1> , "<STR_LIT>" % name <EOL> modname = name [ : lastdot ] <EOL> clsname = name [ lastdot + <NUM_LIT:1> : ] <EOL> mod = __import__ ( modname , fromlist = [ clsname ] ) <EOL> cls = getattr ( mod , clsname ) <EOL> return cls <EOL> def rcompile ( pattern , flags = <NUM_LIT:0> , verbose = False ) : <EOL> """<STR_LIT>""" <EOL> if not isinstance ( pattern , string_type ) : <EOL> return pattern <EOL> if verbose : <EOL> flags |= re . VERBOSE <EOL> return re . compile ( pattern , re . UNICODE | flags ) <EOL> try : <EOL> from abc import abstractmethod <EOL> except ImportError : <EOL> def abstractmethod ( funcobj ) : <EOL> """<STR_LIT>""" <EOL> funcobj . __isabstractmethod__ = True <EOL> return funcobj </s>
