€•MŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ7/translations/zh_CN/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/zh_TW/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/it_IT/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ja_JP/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/ko_KR/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/pt_BR/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ7/translations/sp_SP/driver-api/media/drivers/bttv-devel”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒQ/var/lib/git/docbuild/linux/Documentation/driver-api/media/drivers/bttv-devel.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒThe bttv driver”h]”hŒThe bttv driver”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒbttv and sound mini howto”h]”hŒbttv and sound mini howto”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)”}”(hXThere are a lot of different bt848/849/878/879 based boards available. Making video work often is not a big deal, because this is handled completely by the bt8xx chip, which is common on all boards. But sound is handled in slightly different ways on each board.”h]”hXThere are a lot of different bt848/849/878/879 based boards available. Making video work often is not a big deal, because this is handled completely by the bt8xx chip, which is common on all boards. But sound is handled in slightly different ways on each board.”…””}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubhï)”}”(hXITo handle the grabber boards correctly, there is a array tvcards[] in bttv-cards.c, which holds the information required for each board. Sound will work only, if the correct entry is used (for video it often makes no difference). The bttv driver prints a line to the kernel log, telling which card type is used. Like this one::”h]”hXHTo handle the grabber boards correctly, there is a array tvcards[] in bttv-cards.c, which holds the information required for each board. Sound will work only, if the correct entry is used (for video it often makes no difference). The bttv driver prints a line to the kernel log, telling which card type is used. Like this one:”…””}”(hhþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhŒ literal_block”“”)”}”(hŒ1bttv0: model: BT848(Hauppauge old) [autodetected]”h]”hŒ1bttv0: model: BT848(Hauppauge old) [autodetected]”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j h³hÇh´KhhÝh²hubhï)”}”(hŒôYou should verify this is correct. If it isn't, you have to pass the correct board type as insmod argument, ``insmod bttv card=2`` for example. The file Documentation/admin-guide/media/bttv-cardlist.rst has a list of valid arguments for card.”h]”(hŒoYou should verify this is correct. If it isn’t, you have to pass the correct board type as insmod argument, ”…””}”(hjh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``insmod bttv card=2``”h]”hŒinsmod bttv card=2”…””}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjubhŒq for example. The file Documentation/admin-guide/media/bttv-cardlist.rst has a list of valid arguments for card.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhï)”}”(hŒçIf your card isn't listed there, you might check the source code for new entries which are not listed yet. If there isn't one for your card, you can check if one of the existing entries does work for you (just trial and error...).”h]”hŒëIf your card isn’t listed there, you might check the source code for new entries which are not listed yet. If there isn’t one for your card, you can check if one of the existing entries does work for you (just trial and error...).”…””}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KhhÝh²hubhï)”}”(hXSome boards have an extra processor for sound to do stereo decoding and other nice features. The msp34xx chips are used by Hauppauge for example. If your board has one, you might have to load a helper module like ``msp3400`` to make sound work. If there isn't one for the chip used on your board: Bad luck. Start writing a new one. Well, you might want to check the video4linux mailing list archive first...”h]”(hŒ×Some boards have an extra processor for sound to do stereo decoding and other nice features. The msp34xx chips are used by Hauppauge for example. If your board has one, you might have to load a helper module like ”…””}”(hjLh²hh³Nh´Nubj%)”}”(hŒ ``msp3400``”h]”hŒmsp3400”…””}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjLubhŒ½ to make sound work. If there isn’t one for the chip used on your board: Bad luck. Start writing a new one. Well, you might want to check the video4linux mailing list archive first...”…””}”(hjLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubhï)”}”(hŒÐOf course you need a correctly installed soundcard unless you have the speakers connected directly to the grabber board. Hint: check the mixer settings too. ALSA for example has everything muted by default.”h]”hŒÐOf course you need a correctly installed soundcard unless you have the speakers connected directly to the grabber board. Hint: check the mixer settings too. ALSA for example has everything muted by default.”…””}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K'hhÝh²hubhÉ)”}”(hhh]”(hÎ)”}”(hŒHow sound works in detail”h]”hŒHow sound works in detail”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjzh²hh³hÇh´K-ubhï)”}”(hŒoStill doesn't work? Looks like some driver hacking is required. Below is a do-it-yourself description for you.”h]”hŒqStill doesn’t work? Looks like some driver hacking is required. Below is a do-it-yourself description for you.”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K/hjzh²hubhï)”}”(hXbThe bt8xx chips have 32 general purpose pins, and registers to control these pins. One register is the output enable register (``BT848_GPIO_OUT_EN``), it says which pins are actively driven by the bt848 chip. Another one is the data register (``BT848_GPIO_DATA``), where you can get/set the status if these pins. They can be used for input and output.”h]”(hŒ€The bt8xx chips have 32 general purpose pins, and registers to control these pins. One register is the output enable register (”…””}”(hj™h²hh³Nh´Nubj%)”}”(hŒ``BT848_GPIO_OUT_EN``”h]”hŒBT848_GPIO_OUT_EN”…””}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj™ubhŒ`), it says which pins are actively driven by the bt848 chip. Another one is the data register (”…””}”(hj™h²hh³Nh´Nubj%)”}”(hŒ``BT848_GPIO_DATA``”h]”hŒBT848_GPIO_DATA”…””}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj™ubhŒZ), where you can get/set the status if these pins. They can be used for input and output.”…””}”(hj™h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K2hjzh²hubhï)”}”(hX-Most grabber board vendors use these pins to control an external chip which does the sound routing. But every board is a little different. These pins are also used by some companies to drive remote control receiver chips. Some boards use the i2c bus instead of the gpio pins to connect the mux chip.”h]”hX-Most grabber board vendors use these pins to control an external chip which does the sound routing. But every board is a little different. These pins are also used by some companies to drive remote control receiver chips. Some boards use the i2c bus instead of the gpio pins to connect the mux chip.”…””}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K9hjzh²hubhï)”}”(hŒ¾As mentioned above, there is a array which holds the required information for each known board. You basically have to create a new line for your board. The important fields are these two::”h]”hŒ½As mentioned above, there is a array which holds the required information for each known board. You basically have to create a new line for your board. The important fields are these two:”…””}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K?hjzh²hubj )”}”(hŒ€struct tvcard { [ ... ] u32 gpiomask; u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ };”h]”hŒ€struct tvcard { [ ... ] u32 gpiomask; u32 audiomux[6]; /* Tuner, Radio, external, internal, mute, stereo */ };”…””}”hjçsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j h³hÇh´KChjzh²hubhï)”}”(hŒÎgpiomask specifies which pins are used to control the audio mux chip. The corresponding bits in the output enable register (``BT848_GPIO_OUT_EN``) will be set as these pins must be driven by the bt848 chip.”h]”(hŒ|gpiomask specifies which pins are used to control the audio mux chip. The corresponding bits in the output enable register (”…””}”(hjõh²hh³Nh´Nubj%)”}”(hŒ``BT848_GPIO_OUT_EN``”h]”hŒBT848_GPIO_OUT_EN”…””}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjõubhŒ=) will be set as these pins must be driven by the bt848 chip.”…””}”(hjõh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KJhjzh²hubhï)”}”(hŒØThe ``audiomux[]`` array holds the data values for the different inputs (i.e. which pins must be high/low for tuner/mute/...). This will be written to the data register (``BT848_GPIO_DATA``) to switch the audio mux.”h]”(hŒThe ”…””}”(hjh²hh³Nh´Nubj%)”}”(hŒ``audiomux[]``”h]”hŒ audiomux[]”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjubhŒ™ array holds the data values for the different inputs (i.e. which pins must be high/low for tuner/mute/...). This will be written to the data register (”…””}”(hjh²hh³Nh´Nubj%)”}”(hŒ``BT848_GPIO_DATA``”h]”hŒBT848_GPIO_DATA”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjubhŒ) to switch the audio mux.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KOhjzh²hubhï)”}”(hXFWhat you have to do is figure out the correct values for gpiomask and the audiomux array. If you have Windows and the drivers four your card installed, you might to check out if you can read these registers values used by the windows driver. A tool to do this is available from http://btwincap.sourceforge.net/download.html.”h]”(hXWhat you have to do is figure out the correct values for gpiomask and the audiomux array. If you have Windows and the drivers four your card installed, you might to check out if you can read these registers values used by the windows driver. A tool to do this is available from ”…””}”(hjGh²hh³Nh´NubhŒ reference”“”)”}”(hŒ-http://btwincap.sourceforge.net/download.html”h]”hŒ-http://btwincap.sourceforge.net/download.html”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jSuh1jOhjGubhŒ.”…””}”(hjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KUhjzh²hubhï)”}”(hŒÄYou might also dig around in the ``*.ini`` files of the Windows applications. You can have a look at the board to see which of the gpio pins are connected at all and then start trial-and-error ...”h]”(hŒ!You might also dig around in the ”…””}”(hjjh²hh³Nh´Nubj%)”}”(hŒ ``*.ini``”h]”hŒ*.ini”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hjjubhŒš files of the Windows applications. You can have a look at the board to see which of the gpio pins are connected at all and then start trial-and-error ...”…””}”(hjjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K[hjzh²hubhï)”}”(hŒcStarting with release 0.7.41 bttv has a number of insmod options to make the gpio debugging easier:”h]”hŒcStarting with release 0.7.41 bttv has a number of insmod options to make the gpio debugging easier:”…””}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K`hjzh²hubhŒ block_quote”“”)”}”(hX================= ============================================== bttv_gpio=0/1 enable/disable gpio debug messages gpiomask=n set the gpiomask value audiomux=i,j,... set the values of the audiomux array audioall=a set the values of the audiomux array (one value for all array elements, useful to check out which effect the particular value has). ================= ============================================== ”h]”hŒtable”“”)”}”(hhh]”hŒtgroup”“”)”}”(hhh]”(hŒcolspec”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j¨hj¥ubj©)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K.uh1j¨hj¥ubhŒtbody”“”)”}”(hhh]”(hŒrow”“”)”}”(hhh]”(hŒentry”“”)”}”(hhh]”hï)”}”(hŒ bttv_gpio=0/1”h]”hŒ bttv_gpio=0/1”…””}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KdhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjÅubjÉ)”}”(hhh]”hï)”}”(hŒ"enable/disable gpio debug messages”h]”hŒ"enable/disable gpio debug messages”…””}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kdhjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjÅubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÃhjÀubjÄ)”}”(hhh]”(jÉ)”}”(hhh]”hï)”}”(hŒ gpiomask=n”h]”hŒ gpiomask=n”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kehjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjþubjÉ)”}”(hhh]”hï)”}”(hŒset the gpiomask value”h]”hŒset the gpiomask value”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kehjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjþubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÃhjÀubjÄ)”}”(hhh]”(jÉ)”}”(hhh]”hï)”}”(hŒaudiomux=i,j,...”h]”hŒaudiomux=i,j,...”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kfhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhj5ubjÉ)”}”(hhh]”hï)”}”(hŒ$set the values of the audiomux array”h]”hŒ$set the values of the audiomux array”…””}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KfhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÃhjÀubjÄ)”}”(hhh]”(jÉ)”}”(hhh]”hï)”}”(hŒ audioall=a”h]”hŒ audioall=a”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kghjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjlubjÉ)”}”(hhh]”hï)”}”(hŒƒset the values of the audiomux array (one value for all array elements, useful to check out which effect the particular value has).”h]”hŒƒset the values of the audiomux array (one value for all array elements, useful to check out which effect the particular value has).”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kghj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÈhjlubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÃhjÀubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj¥ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j£hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jžhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜h³hÇh´Kchjzh²hubhï)”}”(hŒ:The messages printed with ``bttv_gpio=1`` look like this::”h]”(hŒThe messages printed with ”…””}”(hj¼h²hh³Nh´Nubj%)”}”(hŒ``bttv_gpio=1``”h]”hŒ bttv_gpio=1”…””}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j$hj¼ubhŒ look like this:”…””}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Klhjzh²hubj )”}”(hXAbttv0: gpio: en=00000027, out=00000024 in=00ffffd8 [audio: off] en = output _en_able register (BT848_GPIO_OUT_EN) out = _out_put bits of the data register (BT848_GPIO_DATA), i.e. BT848_GPIO_DATA & BT848_GPIO_OUT_EN in = _in_put bits of the data register, i.e. BT848_GPIO_DATA & ~BT848_GPIO_OUT_EN”h]”hXAbttv0: gpio: en=00000027, out=00000024 in=00ffffd8 [audio: off] en = output _en_able register (BT848_GPIO_OUT_EN) out = _out_put bits of the data register (BT848_GPIO_DATA), i.e. BT848_GPIO_DATA & BT848_GPIO_OUT_EN in = _in_put bits of the data register, i.e. BT848_GPIO_DATA & ~BT848_GPIO_OUT_EN”…””}”hjÜsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j h³hÇh´Knhjzh²hubeh}”(h]”Œhow-sound-works-in-detail”ah ]”h"]”Œhow sound works in detail”ah$]”h&]”uh1hÈhhÝh²hh³hÇh´K-ubeh}”(h]”Œbttv-and-sound-mini-howto”ah ]”h"]”Œbttv and sound mini howto”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Kubeh}”(h]”Œthe-bttv-driver”ah ]”h"]”Œthe bttv driver”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jÈŒfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j$Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÿjüj÷jôjïjìuŒ nametypes”}”(jÿ‰j÷‰jï‰uh}”(jühÊjôhÝjìjzuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.