~G̤,޳(
x?
LBK3/΂\snjG3[VB\_q'fЙ-![-Tpd1=6& /T.Ιe>5HP
Gw5
nRs+W-ˇ0݃9v<ݰjrUBD|qWJ	)H e=P
~v7> R\9Deu:6kPͲ~2IGr2-@VoYѸ
dIهc&k;O,Ȥ+rփvWZi[;:ƑU/h'($EBpڙ qFI⨁M	NX7K7-ۜV]ɉ9l]7[Ť:jU6yi />_"3id!IUM(@`gCjiO.r~uqXJW-|-m&{QO	H|A`& 	xL_9-i'|QSce(3ф^,TW|41[zT5}EX.yƒ9⡑2p^,Ev-9ƻͬ{b}cx1Z<Zr~gcxf,d<~A#PZ!ՍzfI1 ^AI.nZo.,.Qk2A9Z75-hyOrMU2S8%ӺO0gQV](7n+^ڪAKAc>G'cuLĈx!< JzPҤ~qP\'L+x(<##f?hClyjx :ςOp J&@C`g圮3H@BxZqz=1yRi&~;-3R%Z6q_oߘ&b)	uaNزLX;׏9	, ۦlAO,Œ3j0FMaXs]%ۛYJwgg6Kݱ>;7F)SNQv2"<?Nz!3-Ƃ^i8,{9JU{"G~9v]Oge<xg⠗kR|hjdAI$I`4˅椓ħ>Rb]]@A YڊmJLx6BB?oQ_;=Ӆ=@y3ېKNaD0X&HF|R`5 GQ>ͭi2[k[k] fTs,jS9Ac"98	EW* §ռ؎7Gm@=E)3W3"pGݬ!r 4n򡤇oS~9`>|j_̕{,Ie8W[~$UX'p$كUCl;#	j#dE[wX_
=j/e^ϤtC'[x%4Bnk$W_4ysdXQKRA4uTo<TL:0EW8ˮ3Nᾣ1#ɎzqK0л4Jhu2ؗb\T0b1{_}2#074\DĹn\]>*h5Oe~žaV$~K+63Nᾣ1#Ɏz3Nᾣ1#Ɏzmw 5k9X:dKFv0Q뻇ڀW]v{Wm)k,6"C&*[8LS^t]t 9 E?b++¦>֯
.RH2s%	`vNb=.`pQݏɍJ֞6.S^1\xeo*o\DĹn\]>*h5Oe~Š~^\dv͕cH(vJ[Q͍S	l;!QEW8ˮ3Nᾣ1#Ɏz3Nᾣ1#Ɏzosɲwlc\;WByp4EoECLgu!`Z{ JgZ?avna Yg*6%;3Nᾣ1#Ɏz3Nᾣ1#Ɏzs=I0惟ֵ~{Jw5AUu̓@B//iM1oJM>H6wq]^R	;qN4u \xeo*o\DĹn\]>*h5Oe~E1sၩ us~1G@)Adg^3Nᾣ1#Ɏz3Nᾣ1#Ɏz2G\|CסRD4Ojk)˾O3e;̝%1t
u(z7ݺ̂C~oנ0=*"vl
=R-h/tqy~[e#"He<fk?QjfIF(g`D8wl,:VηPe3 #a>ez8]EKgj\9;o&n^:ߙ
VPe 6OsԭR;-}εUB݈繲pHplPOO[mlI}2?(uJWl!Mm+#ƦMj?jC8b÷is7AbjUjlRK_6rlO3foLp\AV+H+&F@ʓU2ףWjL^,G[R4!,cpf`cj)t|Ru΋9^couFs|O7Wl|$?AMVjʢAxkWa+t[	Fh콨Ioήkgr5Y	ŉW8.SG2	4]_!t>_܂յZH
wmQHPFwBkW19SNdeQYS RF'YwsRX2 \TkӮi~؆vUu>ccL@ݛ[:÷_'jyux#9f	2"!UI'Sz@ٵTI]}N(1,{s%|Wb}ca,}[BJ@UZ)j#~ Z⊙N[CwoS	] fnA$Ъ(ߕHȯN9|itk2j!}!ȟ?E*/-hG5%;ZH~L9:Uhuww
Yiڋ	ω+Gziu5\^	lRWXRRuF2*u(Uu7FK奊Y9Lq V/
$[Tt2!?Bgn27URA64u<#9ڛGV5ybRʋILN|вyq:S<F&f3]Rllޠ ڌt;+0%`}L->,%yF`@e4֯4v.KpWn$]eM%KF)~JC?+(IJܛ`jLWEg[G=UZ*9n2x1|5A|(S^ec=/^4<6jʤ2å-}%NPʨMQuf&8S_bc	!n8CB4v_UkL9SFmNVIվZ&^;Y74W&vM[,sȘ^2)|Hyr$u9wF#LBb]{rO0#6@XOM~_Ns4'^ͷue = self.indextemplate[:colon].strip()
                indexentry = self.indextemplate[colon+1:].strip() % (name,)
            else:
                indextype = 'single'
                indexentry = self.indextemplate % (name,)
            self.indexnode['entries'].append((indextype, indexentry,
                                              targetname, targetname))
        self.env.domaindata['config']['objects'][self.objtype, name] = \
            self.env.docname, targetname


class ConfigOptionXRefRole(XRefRole):
    """
    Cross-referencing role for configuration options (adds an index entry).
    """

    def result_nodes(self, document, env, node, is_ref):
        if not is_ref:
            return [node], []
        varname = node['reftarget']
        tgtid = 'index-%s' % env.new_serialno('index')
        indexnode = addnodes.index()
        indexnode['entries'] = [
            ('single', varname, tgtid, varname),
            ('single', 'configuration option; %s' % varname, tgtid, varname)
        ]
        targetnode = nodes.target('', '', ids=[tgtid])
        document.note_explicit_target(targetnode)
        return [indexnode, targetnode, node], []


class ConfigFileDomain(Domain):
    name = 'config'
    label = 'Config'

    object_types = {
            'option':  ObjType('config option', 'option'),
            'section':  ObjType('config section', 'section'),
            }
    directives = {
            'option': ConfigOption,
            'section': ConfigSection,
            }
    roles = {
            'option': ConfigOptionXRefRole(),
            'section': ConfigSectionXRefRole(),
            }

    initial_data = {
        'objects': {},      # (type, name) -> docname, labelid
    }

    def clear_doc(self, docname):
        for key, (fn, _) in self.data['objects'].items():
            if fn == docname:
                del self.data['objects'][key]

    def resolve_xref(self, env, fromdocname, builder,
                     typ, target, node, contnode):
        docname, labelid = self.data['objects'].get((typ, target), ('', ''))
        if not docname:
            return None
        else:
            return make_refnode(builder, fromdocname, docname,
                                labelid, contnode)

    def get_objects(self):
        for (type, name), info in self.data['objects'].items():
            yield (name, name, type, info[0], info[1],
                   self.object_types[type].attrs['searchprio'])

def setup(app):
    app.add_domain(ConfigFileDomain)

