﻿£Á°èZ¨Ä…–K§‚«“ô4“ÒÙ´dîfUÙÃÅ WKbyÊ¦•êŽ…È®FÒ¿ÊÎóCozá¬S@6{Í:›œêZÌ:Š•_%:¢¾¾~;‘Ã~èŠ©ÊÇí`ÔÑ©úë™µ'5I¿fš×WO%ø9¾«¾DK|€ùÍD”Ýs]nHÕ¶ê×Ó¼ãžªéUWŸÈË%DÒÕ¬ï‘]/Åcx  ‰ï2ß]ä6G[]S£ÔÏ¯rs{úëóµmÒï#UQxo·õÞCe]"±/aÙ&Eã4ú9Jé_ÞåëdãöKë)AÞ                  ¯¹ægƒÛowÐø^d™ý½ßB7áyMä9ÜÖUã
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<html>
import functools
import inspect


class property_nondata:
    '''@property, but using non-data descriptor protocol'''
    def __init__(self, fget):
        self.fget = fget
        functools.update_wrapper(self, fget)

    def __get__(self, instance, owner=None):
        return self.fget(instance)


class property_exp(property):
    '''@property, but blacklist tab completers like rlcompleter from getattr'''
    def __init__(self, fget, *, doc=None):
        super().__init__(fget)
        self.__doc__ = doc

    def __get__(self, instance, owner=None):
        try:
            frame = inspect.currentframe()
            try:
                frame = frame.f_back
                if frame.f_globals['__name__'] == 'rlcompleter':
                    return None
            finally:
                del frame
        except Exception:
            pass
        return super().__get__(instance, owner)
