\Tc@sddlZddlZddlZddlmZmZmZmZddlZddl m Z e a ide fe6ddfe6ddfe6ddfe6Z idd6dd6dd 6dd 6dd6dd 6dd 6dd6dd 6dd6dd6dd6dd6dd6dd6Zied6ed6ed6ed6ee 6ZdZdZdZdZdZdZdZeZddddddd d!d"d#d$d%d&d'd(d)d*d+fZd,Zd-Zd.Zi ed/6ed06ed16ed26ed36e d46ed56e d66e d76e d86ed96ed:6Zd;Z d)e!fd<YZ"d=efd>YZ#e#Z$d?Z%de&fd@YZ'de'fdAYZ(de'fdBYZ)d'e*fdCYZ+de'fdDYZ,d e'fdEYZ-d#e'fdFYZ.d$e.fdGYZ/d&e'fdHYZ0d%e.fdIYZ1d(e'fdJYZ2dKefdLYZ3dMe3fdNYZ4dOe3fdPYZ5ie4d,6e5dQ6Z6dRZ7dSe8fdTYZ9d!e9fdUYZ:d"efdVYZ;e e dWZ<fdXZ=dS(YiN(tBOM_UTF8t BOM_UTF16t BOM_UTF16_BEt BOM_UTF16_LE(t __version__tutf_8tutf16_betutf_16tutf16_letu16tutf16sutf-16t utf_16_besutf-16bet utf_16_lesutf-16letu8tutftutf8sutf-8cCstj|jdkS(NR(tBOM_LISTtgettlower(tencoding((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt match_utf8Dss'%s's"%s"s%ss '"s"""%s"""s'''%s'''tDEFAULT_INDENT_TYPEtDEFAULT_INTERPOLATIONtConfigObjErrort NestingErrort ParseErrortDuplicateErrortConfigspecErrort ConfigObjt SimpleValtInterpolationErrortInterpolationLoopErrortMissingInterpolationOptiontRepeatSectionErrort ReloadErrort UnreprErrort UnknownTypetflatten_errorstget_extra_valuest configparsers i t interpolationt raise_errorst list_valuest create_emptyt file_errort configspect stringifyt indent_typeRtdefault_encodingtunreprtwrite_empty_valuescCsVtdkrddland|}tj|}|jdjdjdS(Nisa=ii(tcompilertNonetparset getChildren(tstp((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytgetObjs   cBseZRS((t__name__t __module__(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR$stBuildercBsbeZdZdZdZdZdZdZdZdZ dZ d Z RS( cCs+tdkr!t|jjnt|S(N(tmR4R$t __class__R:(tselfto((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytbuilds cCstt|j|jS(N(tlisttmapRAR6(R?R@((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt build_ListscCs|jS(N(tvalue(R?R@((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt build_ConstscCsIi}tt|j|j}x|D]}t|||\$) | # Two $ signs (?P[_a-z][_a-z0-9]*) | # $name format {(?P[^}]*)} # ${name} format ) cCs|jdp|jd}|dk rL|j|\}}|||fS|jddk rqd|jdfSd|jdfS(Ntnamedtbracedtescaped(RR4Rt _delimiter(R?RyRwRERp((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRss  ( R:R;RjRRRRt IGNORECASEtVERBOSERqRs(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs ttemplatecGs|j||S(N(t__new__(tclstargs((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt __newobj__sRcBsReZdZdZdZd!d!dZdZdZdZ e dZ dZ d!d Z d Zed Zd Zd Zd!dZdZdZdZdZdZeZdZdZeZde_dZdZdZe e dZ!dZ"dZ#dZ$dZ%dZ&d Z'RS("s A dictionary-like object that represents a section in a config file. It does string interpolation if the 'interpolation' attribute of the 'main' object is set to True. Interpolation is tried first from this object, then from the 'DEFAULT' section of this object, next from the parent and its 'DEFAULT' section, and so on until the main object is reached. A Section will behave like an ordered dictionary - following the order of the ``scalars`` and ``sections`` attributes. You can use this to change the order of members. Iteration follows the order: scalars, then sections. cCs,tj||d|jj|ddS(Nii(tdicttupdatet__dict__(R?tstate((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt __setstate__scCs(t||jf}t|jf|fS(N(RRRR>(R?R((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt __reduce__scCs{|dkri}ntj|||_||_||_||_|jx$|jD]\}}|||t}n|j}tj|d}|dkrxt |j_|S||}|_nX|j ||S(N( t_interpolation_enginetAttributeErrorRR(RORRtinterpolation_enginesRR4RPR(R?RwREtengineRQtclass_((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt _interpolates        cstj}jjrt|tjr@j|St|trfd}g|D]}||^qh}||kr|Sqn|S(s+Fetch the item and do string interpolation.cs&t|tjr"j|S|S(N(RVtsixt string_typesR(R(RwR?(s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt_check/s( Rt __getitem__RR(RVRRRRB(R?RwRRRtnew((RwR?s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR(s   c Cst|tjs%td|n||jkrQg|j|A version of ``get`` that doesn't bypass string interpolation.N(tKeyError(R?Rwtdefault((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs  cCs#x|D]}|||| v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised' (RtMISSING(R?RwRR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytpops   cCsJ|j|j}|s%tdn|d}||}||=||fS(sPops the first (key,val)s": 'popitem(): dictionary is empty'i(RRR(R?tsequenceRwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytpopitems  cCsPtj|g|_g|_i|_i|_d|_g|_g|_ dS(s A version of clear that also affects scalars/sections Also clears comments and configspec. Leaves other attributes alone : depth/main/parent are not affected N( RtclearRRRRR4R-RR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs       cCs3y ||SWn tk r.|||<||SXdS(s:A version of setdefault that sets sequence if appropriate.N(R(R?RwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt setdefaults    cCs)tt|j|jt|jS(s8D.items() -> list of D's (key, value) pairs, as 2-tuples(RBtzipRRtvalues(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRscCs|j|jS(sD.keys() -> list of D's keys(RR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytkeysscCs%g|j|jD]}||^qS(s D.values() -> list of D's values(RR(R?Rw((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRscCstt|jS(s=D.iteritems() -> an iterator over the (key, value) items of D(RGRBR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt iteritemsscCst|j|jS(s.D.iterkeys() -> an iterator over the keys of D(RGRR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytiterkeysscCstt|jS(s2D.itervalues() -> an iterator over the values of D(RGRBR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt itervaluessc sYfd}ddjgjjD](}dt|t||f^q)S(sx.__repr__() <==> repr(x)cs1y |SWntk r,tj|SXdS(N(R RR(Rw(R?(s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt_getvals  s{%s}s, s%s: %s(RuRRtrepr(R?RRw((R?s6/opt/freeware/lib/python2.7/site-packages/configobj.pyt__repr__s sx.__str__() <==> str(x)cCsi}x||D]t}||}t|tr;|j}n<t|trYt|}nt|trwt|}n|||>> n = a.dict() >>> n == a 1 >>> n is a 0 (RVRRRBRM(R?tnewdictRt this_entry((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs   cCssxlt|jD]X\}}||krat||trat|tra||j|q|||>> a = '''[section1] ... option1 = True ... [[subsection]] ... more_options = False ... # end of file'''.splitlines() >>> b = '''# File is user.ini ... [section1] ... option1 = False ... # end of file'''.splitlines() >>> c1 = ConfigObj(b) >>> c2 = ConfigObj(a) >>> c2.merge(c1) >>> c2 ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}}) N(RBRRVRtmerge(R?RRwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs cCs||jkr|j}n+||jkr6|j}ntd||j|}||}tj||tj||||j||j|||j |}|j |}|j |=|j |=||j |<||j |>> config = '''[XXXXsection] ... XXXXkey = XXXXvalue'''.splitlines() >>> cfg = ConfigObj(config) >>> cfg ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}}) >>> def transform(section, key): ... val = section[key] ... newkey = key.replace('XXXX', 'CLIENT1') ... section.rename(key, newkey) ... if isinstance(val, (tuple, list, dict)): ... pass ... else: ... val = val.replace('XXXX', 'CLIENT1') ... section[newkey] = val >>> cfg.walk(transform, call_on_sections=True) {'CLIENT1section': {'CLIENT1key': None}} >>> cfg ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}}) R)tcall_on_sections(trangeRvRt ExceptionRPRtwalk( R?tfunctionR)RtkeywargstoutRJRR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRJs:/        cCs||}|tkrtS|tkr*tSy6t|tjsKtn|jj|jSWn!tk rt d|nXdS(s_ Accepts a key as input. The corresponding value must be a string or the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to retain compatibility with Python 2.2. If the string is one of ``True``, ``On``, ``Yes``, or ``1`` it returns ``True``. If the string is one of ``False``, ``Off``, ``No``, or ``0`` it returns ``False``. ``as_bool`` is not case sensitive. Any other input will raise a ``ValueError``. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_bool('a') Traceback (most recent call last): ValueError: Value "fish" is neither True nor False >>> a['b'] = 'True' >>> a.as_bool('b') 1 >>> a['b'] = 'off' >>> a.as_bool('b') 0 s$Value "%s" is neither True nor FalseN( RORPRVRRRRt_boolsRR(R?RwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytas_bools     cCst||S(si A convenience method which coerces the specified value to an integer. If the value is an invalid literal for ``int``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_int('a') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: 'fish' >>> a['b'] = '1' >>> a.as_int('b') 1 >>> a['b'] = '3.2' >>> a.as_int('b') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: '3.2' (tint(R?Rw((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytas_intscCst||S(s> A convenience method which coerces the specified value to a float. If the value is an invalid literal for ``float``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_float('a') #doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ValueError: invalid literal for float(): fish >>> a['b'] = '1' >>> a.as_float('b') 1.0 >>> a['b'] = '3.2' >>> a.as_float('b') #doctest: +ELLIPSIS 3.2... (RT(R?Rw((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytas_floatscCs0||}t|ttfr)t|S|gS(sU A convenience method which fetches the specified value, guaranteeing that it is a list. >>> a = ConfigObj() >>> a['a'] = 1 >>> a.as_list('a') [1] >>> a['a'] = (1,) >>> a.as_list('a') [1] >>> a['a'] = [1] >>> a.as_list('a') [1] (RVRMRB(R?Rwtresult((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytas_lists  cCsF|j|}tj|||||jkrB|jj|n|S(s Restore (and return) default value for the specified key. This method will only work for a ConfigObj that was created with a configspec and has been validated. If there is no default value for this key, ``KeyError`` is raised. (RRRRR(R?RwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pytrestore_defaults cCsGx|jD]}|j|q Wx|jD]}||jq+WdS(s' Recursively restore default values to all members that have them. This method will only work for a ConfigObj that was created with a configspec and has been validated. It doesn't delete or modify entries without default values. N(RRRtrestore_defaults(R?RwRp((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs N((R:R;RjRRR4RhRRRRPRRRRRRRRRRRRRRt__iter__RRt__str__RRRRORRRRRRR(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRsH      ;                T ,    cBsFeZdZejdejZejdejZejdejZejdejZ ejdejZ ejdZ ejdZ ejdZ ejd Zie e fd 6e efd 6Zied 6ed 6ed6ed6ed6ed6ed6ed6Zd/d/d/d/eeeeeed/d/eeedZdZd/dZdZdZdZdZdZdZdZdZdZd Z ed!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d/d/d+Z+eed/d,Z,d-Z-d.Z.RS(0s2An object to read, create, and write config files.s^ # line start (\s*) # indentation ( # keyword (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'"=].*?) # no quotes ) \s*=\s* # divider (.*) # value (including list values and comments) $ # line end s=^ (\s*) # 1: indentation ((?:\[\s*)+) # 2: section marker open ( # 3: section name open (?:"\s*\S.*?\s*")| # at least one non-space with double quotes (?:'\s*\S.*?\s*')| # at least one non-space with single quotes (?:[^'"\s].*?) # at least one non-space unquoted ) # section name close ((?:\s*\])+) # 4: section marker close \s*(\#.*)? # 5: optional comment $s^ (?: (?: ( (?: (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#][^,\#]*?) # unquoted ) \s*,\s* # comma )* # match all list items ending in a comma (if any) ) ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#\s][^,]*?)| # unquoted (?:(?}|j ||jrd |jdj!}t"|jdkrd|} t#| } n |jd} |j| _$|| _%| n|`|dkrd|_n |j|dS(NtrbsConfig file not found: "%s".twRdcsYx|jD]}||||infile must be a filename, file like object, or list of lines.is s s css!|]}t|tjVqdS(N(RVRR(t.0Re((s6/opt/freeware/lib/python2.7/site-packages/configobj.pys ss at line %s.iis2Parsing failed with several errors. First error %s(s s (s s s (&RVRRtfilenametostpathtisfiletopent readlinesR,RkR+twriteRBRMRRt_errorsR4t_handle_configspecR-R\RRRUt _handle_bomtendswithtnewlinestalltAssertionErrorRtrstript_parseRfRvRterrorstconfig( R?RR-thtcontentRReR~tinfoRmterror((Rs6/opt/freeware/lib/python2.7/site-packages/configobj.pyRsj           ("         cCs |dkrt}nd|_g|_|d|_|d|_|d|_|d|_|d|_|d|_ |d|_ |d|_ |d |_ t |_d|_|d |_|d |_g|_g|_d|_|jrt |_ntj|dS( NR)R(R*R+R,R.R/RR0R2R1(R4RR RR)R(R*R+R,R.R/RR0RPtBOMRR2R1tinitial_commentt final_commentR-RRR(R?R((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR0s.                      c sYfd}ddjgjjD](}dt|t||f^q)S(Ncs1y |SWntk r,tj|SXdS(N(R RR(Rw(R?(s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRQs  sConfigObj({%s})s, s%s: %s(RuRRR(R?RRw((R?s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRPs cCs |jdk r7|jjtkr7|j||jSt|ttfrY|d}n|}t|tj r|j||jS|jdk rt|jj}|dkrxQtt j D]=\}\}}|sqn|j |r|j||SqW|j||jSt |}|j |sE|j||jS|t|}t|ttfrw||ds  $c Cs@|r|jr|dkrdS|rt|ttfr|sDdSt|dkrq|j|ddtdSdjg|D]}|j|dt^q~St|tj s|j rt |}qt d|n|sdS|j od |kod |k}|o0d |kr'd |kp0d |k}|oa| oad |koad |koad |k}|sq| ou| }|r|j st}qd |krtd |q|dtkr|dtkrd|krt}q|j|}n|j|}|tkr8d |kr8|j r8|j|}n||S(s Return a safely quoted version of a value. Raise a ConfigObjError if the value cannot be safely quoted. If multiline is ``True`` (default) then use triple quotes if necessary. * Don't quote values that don't need it. * Recursively quote members of a list and return a comma joined list. * Multiline is ``False`` for lists. * Obey list syntax for empty and single member lists. If ``list_values=False`` then the value is only quoted if it contains a ``\n`` (is multiline) or '#'. If ``write_empty_values`` is set, and the value is an empty string, it won't be quoted. Rdt,iit multilines, sValue "%s" is not a string.s""s R5RWRVs#Value "%s" cannot be safely quoted.i(R2RVRBRMRvt_quoteRPRuRRR.R,RUR*tnoquotRt wspace_plust_get_single_quotet_get_triple_quote( R?RERYRtno_lists_no_quotest need_triplethash_triple_quotetcheck_for_singletquot((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRZsB & "*1     !cCsJd|kr+d|kr+td|nd|kr@t}nt}|S(NRWRVs#Value "%s" cannot be safely quoted.(Rtsquottdquot(R?RERc((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR]$s   cCse|jddkr=|jddkr=td|n|jddkr[t}nt}|S(Ns"""is'''s#Value "%s" cannot be safely quoted.(tfindRttdquotttsquot(R?RERc((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR^.s * c Cs||jr|dfS|jsP|jj|}|dkrFtn|jS|jj|}|dkrztn|j\}}}}|dkr|dkrtn|dk rg|fS|dk r |r| rd}q |pd}|j|}n|dkr"||fS|j j |}g|D]}|j|^q;}|dk rr||g7}n||fS(s Given a value string, unquote, remove comment, handle lists. (including empty and single member lists) Rds""N( RR*t _nolistvalueRyR4RgR:t _valueexpR>t _listvalueexptfindall( R?RERKR*tsinglet empty_listRPRR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRC8s6                 " c Cs<|d }|d}|j|d}|j|d}|j|} | dk rtt| j} | j|| S|j|dkrtnxZ||kr|d7}|d7}||} | j|dkr|| 7}qPqWt|j| } | dkrtn| j\}} ||| |fS(s9Extract the value, where we are in a multiline situation.iiiis N(t _triple_quoteRyR4RBR:RRfRg( R?RERRHRGRctnewvaluet single_linet multi_lineRKtretvalReRP((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRAis0            cCst|ts|y"t|dtdtdt}Wq|tk rV}td|q|tk rx}td|q|Xn||_dS(sParse the configspec.R)R,RsParsing configspec failed: %ssReading configspec failed: %sN(RVRRORRRkR-(R?R-RR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs  cCs|j}|jd}t|trZx0|jD]"}||kr1|||_q1q1Wnx|jD]}|dkr|qdn||kri||>> filename = a.filename >>> a.filename = 'test.ini' >>> a.write() >>> a.filename = filename >>> a == ConfigObj('test.ini', raise_errors=True) 1 >>> import os >>> os.remove('test.ini') R5s# RpRRditmodeRtwin32s s tasciitwbN(0R/R4RR1R(RPR!R3R8R&RRRRRRtlstripR{RRVRRztextendRRyR"R RtencodeR RRRRRR tlinesepR\R|tsystplatformRuRRR(R0RR(R?toutfileRpRtcstcsptint_valRet stripped_lineRxRt comment_lineRRPtlR/toutputt output_bytesR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRs                 ('     '  c sdkrjdkr*tdnrLddlm}|_nrjj_jj_jj_jj _ jj _ jj _ qnjj fd}it }t }gjD]} | kr| ^q} gjD]} | jkr6| ^q6} gjD]} | jkra| ^qa} xjD]} | dkrqn| jks| jkr!t }d}r1| jkr1jj| gj| <jj| dj| RZR]R^RCRARRwRyRzR{RRRR(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR/sx            6 ` u     G 1 #    r cBs#eZdZdZedZRS(s A simple validator. Can be used to check that all members expected are present. To use it, provide a configspec with all your members in (the value given will be ignored). Pass an instance of ``SimpleVal`` to the ``validate`` method of your ``ConfigObj``. ``validate`` will return ``True`` if all members are present, or a dictionary with True/False meaning present/missing. (Whole missing sections will be replaced with ``False``) cCs t|_dS(N(RR(R?((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRhR scCs|r|jn|S(s9A dummy check method, always returns the value unchanged.(R(R?RtmemberR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRU s(R:R;RjRhRPR(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyRF s  cCs+|dkrg}g}n|tkr1t|S|tksLt|tr|j|d|f|rv|jnt|Sxt|j D]w\}}|tkrqnt|j |t r|j|t |||||qn|j|||fqW|r!|jnt|S(s An example function that will turn a nested dictionary of results (as returned by ``ConfigObj.validate``) into a flat list. ``cfg`` is the ConfigObj instance being checked, ``res`` is the results dictionary returned by ``validate``. (This is a recursive function, so you shouldn't use the ``levels`` or ``results`` arguments - they are used by the function.) Returns a list of keys that failed. Each member of the list is a tuple:: ([list of sections...], key, result) If ``validate`` was called with ``preserve_errors=False`` (the default) then ``result`` will always be ``False``. *list of sections* is a flattened list of sections that the key was found in. If the section was missing (or a section was expected and a scalar provided - or vice-versa) then key will be ``None``. If the value (or section) was missing then ``result`` will be ``False``. If ``validate`` was called with ``preserve_errors=True`` and a value was present, but failed the check, then ``result`` will be the exception object returned. You can use this as a string that describes the failure. For example *The value "3" is of the wrong type*. N( R4ROtsortedRPRVRRRRBRRRR%(tcfgtrestlevelstresultsRwR((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR%\ s*         cCszg}|jg|jD]}||f^qxD|jD]9}||jkr9|jt||||fq9q9W|S(s Find all the values and sections not in the configspec from a validated ConfigObj. ``get_extra_values`` returns a list of tuples where each tuple represents either an extra section, or an extra value. The tuples contain two values, a tuple representing the section the value is in and the name of the extra values. For extra values in the top level section the first member will be an empty tuple. For values in the 'foo' section the first member will be ``('foo',)``. For members in the 'bar' subsection of the 'foo' section the first member will be ``('foo', 'bar')``. NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't been validated it will return an empty list. (RRRR&(tconft_prependRRQ((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyR& s )((>R RRtcodecsRRRRRt_versionRR4R3R%RR'RRdReR[R\RhRgtobjectRt__all__RRtMAX_INTERPOL_DEPTHRORPRR9RR$R<t_builderR1RgRRRRkR"RRRRR!R R#RnRRRRRRRRR%R&(((s6/opt/freeware/lib/python2.7/site-packages/configobj.pyts   "           7     |   g<