€•ÜAŒ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”Œ)/translations/zh_CN/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/zh_TW/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/it_IT/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ja_JP/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ko_KR/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/pt_BR/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/sp_SP/sound/hd-audio/dp-mst”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒHD-Audio DP-MST Support”h]”hŒHD-Audio DP-MST Support”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒC/var/lib/git/docbuild/linux/Documentation/sound/hd-audio/dp-mst.rst”h´KubhŒ paragraph”“”)”}”(hŒfTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin and dynamic pcm assignment.”h]”hŒfTo support DP MST audio, HD Audio hdmi codec driver introduces virtual pin and dynamic pcm assignment.”…””}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hŒÊVirtual pin is an extension of per_pin. The most difference of DP MST from legacy is that DP MST introduces device entry. Each pin can contain several device entries. Each device entry behaves as a pin.”h]”hŒÊVirtual pin is an extension of per_pin. The most difference of DP MST from legacy is that DP MST introduces device entry. Each pin can contain several device entries. Each device entry behaves as a pin.”…””}”(hhÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubhÌ)”}”(hX3As each pin may contain several device entries and each codec may contain several pins, if we use one pcm per per_pin, there will be many PCMs. The new solution is to create a few PCMs and to dynamically bind pcm to per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use the new solution.”h]”hX3As each pin may contain several device entries and each codec may contain several pins, if we use one pcm per per_pin, there will be many PCMs. The new solution is to create a few PCMs and to dynamically bind pcm to per_pin. Driver uses spec->dyn_pcm_assign flag to indicate whether to use the new solution.”…””}”(hhéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K hh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒPCM”h]”hŒPCM”…””}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh÷h²hh³hÊh´KubhÌ)”}”(hŒ To be added”h]”hŒ To be added”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh÷h²hubeh}”(h]”Œpcm”ah ]”h"]”Œpcm”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒPin Initialization”h]”hŒPin Initialization”…””}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KubhÌ)”}”(hŒþEach pin may have several device entries (virtual pins). On Intel platform, the device entries number is dynamically changed. If DP MST hub is connected, it is in DP MST mode, and the device entries number is 3. Otherwise, the device entries number is 1.”h]”hŒþEach pin may have several device entries (virtual pins). On Intel platform, the device entries number is dynamically changed. If DP MST hub is connected, it is in DP MST mode, and the device entries number is 3. Otherwise, the device entries number is 1.”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjh²hubhÌ)”}”(hŒ…To simplify the implementation, all the device entries will be initialized when bootup no matter whether it is in DP MST mode or not.”h]”hŒ…To simplify the implementation, all the device entries will be initialized when bootup no matter whether it is in DP MST mode or not.”…””}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjh²hubeh}”(h]”Œpin-initialization”ah ]”h"]”Œpin initialization”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒConnection list”h]”hŒConnection list”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjSh²hh³hÊh´K!ubhÌ)”}”(hŒ€DP MST reuses connection list code. The code can be reused because device entries on the same pin have the same connection list.”h]”hŒ€DP MST reuses connection list code. The code can be reused because device entries on the same pin have the same connection list.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K"hjSh²hubhÌ)”}”(hŒYThis means DP MST gets the device entry connection list without the device entry setting.”h]”hŒYThis means DP MST gets the device entry connection list without the device entry setting.”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K%hjSh²hubeh}”(h]”Œconnection-list”ah ]”h"]”Œconnection list”ah$]”h&]”uh1hµhh·h²hh³hÊh´K!ubh¶)”}”(hhh]”(h»)”}”(hŒJack”h]”hŒJack”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjˆh²hh³hÊh´K)ubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒ”Presume: - MST must be dyn_pcm_assign, and it is acomp (for Intel scenario); - NON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; ”h]”(hŒterm”“”)”}”(hŒPresume:”h]”hŒPresume:”…””}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤h³hÊh´K-hj ubhŒ definition”“”)”}”(hhh]”hŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒAMST must be dyn_pcm_assign, and it is acomp (for Intel scenario);”h]”hÌ)”}”(hjÂh]”hŒAMST must be dyn_pcm_assign, and it is acomp (for Intel scenario);”…””}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K,hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»ubj¿)”}”(hŒENON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp; ”h]”hÌ)”}”(hŒDNON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;”h]”hŒDNON-MST may or may not be dyn_pcm_assign, it can be acomp or !acomp;”…””}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K-hj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj»ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1j¹h³hÊh´K,hj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1j´hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÊh´K-hj›ubjŸ)”}”(hŒ˜So there are the following scenarios: a. MST (&& dyn_pcm_assign && acomp) b. NON-MST && dyn_pcm_assign && acomp c. NON-MST && !dyn_pcm_assign && !acomp ”h]”(j¥)”}”(hŒ%So there are the following scenarios:”h]”hŒ%So there are the following scenarios:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¤h³hÊh´K2hjubjµ)”}”(hhh]”hŒenumerated_list”“”)”}”(hhh]”(j¿)”}”(hŒ MST (&& dyn_pcm_assign && acomp)”h]”hÌ)”}”(hjh]”hŒ MST (&& dyn_pcm_assign && acomp)”…””}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K0hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubj¿)”}”(hŒ"NON-MST && dyn_pcm_assign && acomp”h]”hÌ)”}”(hj6h]”hŒ"NON-MST && dyn_pcm_assign && acomp”…””}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K1hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubj¿)”}”(hŒ%NON-MST && !dyn_pcm_assign && !acomp ”h]”hÌ)”}”(hŒ$NON-MST && !dyn_pcm_assign && !acomp”h]”hŒ$NON-MST && !dyn_pcm_assign && !acomp”…””}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K2hjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œ loweralpha”Œprefix”hŒsuffix”Œ.”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j´hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžh³hÊh´K2hj›h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1j™hjˆh²hh³Nh´NubhÌ)”}”(hŒgBelow discussion will ignore MST and NON-MST difference as it doesn't impact on jack handling too much.”h]”hŒiBelow discussion will ignore MST and NON-MST difference as it doesn’t impact on jack handling too much.”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K4hjˆh²hubhÌ)”}”(hŒŠDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.”h]”hŒŠDriver uses struct hdmi_pcm pcm[] array in hdmi_spec and snd_jack is a member of hdmi_pcm. Each pin has one struct hdmi_pcm * pcm pointer.”…””}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K7hjˆh²hubhÌ)”}”(hŒKFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.”h]”hŒKFor !dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] statically.”…””}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K:hjˆh²hubhÌ)”}”(hŒZFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] when monitor is hotplugged.”h]”hŒZFor dyn_pcm_assign, per_pin->pcm will assigned to spec->pcm[n] when monitor is hotplugged.”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kpcm_rec[pcm_idx].jack directly. ”h]”(hÌ)”}”(hŒdyn_pcm_assign”h]”hŒdyn_pcm_assign”…””}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KChjÌubhÌ)”}”(hŒOWill not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.”h]”hŒOWill not use hda_jack but use snd_jack in spec->pcm_rec[pcm_idx].jack directly.”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KEhjÌubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÉh²hh³hÊh´Nubj¿)”}”(hŒ_!dyn_pcm_assign Use hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically. ”h]”(hÌ)”}”(hŒ!dyn_pcm_assign”h]”hŒ!dyn_pcm_assign”…””}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KGhjòubhÌ)”}”(hŒLUse hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.”h]”hŒLUse hda_jack and assign spec->pcm_rec[pcm_idx].jack = jack->jack statically.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KIhjòubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hjÉh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jõjöuh1j¹h³hÊh´KChj¸h²hubeh}”(h]”Œ build-jack”ah ]”h"]”Œ build jack”ah$]”h&]”uh1hµhjˆh²hh³hÊh´KAubh¶)”}”(hhh]”(h»)”}”(hŒUnsolicited Event Enabling”h]”hŒUnsolicited Event Enabling”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj&h²hh³hÊh´KMubhÌ)”}”(hŒ#Enable unsolicited event if !acomp.”h]”hŒ#Enable unsolicited event if !acomp.”…””}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KNhj&h²hubeh}”(h]”Œunsolicited-event-enabling”ah ]”h"]”Œunsolicited event enabling”ah$]”h&]”uh1hµhjˆh²hh³hÊh´KMubh¶)”}”(hhh]”(h»)”}”(hŒMonitor Hotplug Event Handling”h]”hŒMonitor Hotplug Event Handling”…””}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjMh²hh³hÊh´KRubjº)”}”(hhh]”(j¿)”}”(hŒÓacomp pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp(). Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for both dyn_pcm_assign and !dyn_pcm_assign ”h]”(hÌ)”}”(hŒacomp”h]”hŒacomp”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KShjaubhÌ)”}”(hŒ`pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp().”h]”hŒ`pin_eld_notify() -> check_presence_and_report() -> hdmi_present_sense() -> sync_eld_via_acomp().”…””}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KUhjaubhÌ)”}”(hŒiUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for both dyn_pcm_assign and !dyn_pcm_assign”h]”hŒiUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for both dyn_pcm_assign and !dyn_pcm_assign”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KXhjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj^h²hh³hÊh´Nubj¿)”}”(hX!acomp hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs() Use directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. Use hda_jack mechanism to handle jack events. ”h]”(hÌ)”}”(hŒ!acomp”h]”hŒ!acomp”…””}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K[hj•ubhÌ)”}”(hŒ†hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()”h]”hŒ†hdmi_unsol_event() -> hdmi_intrinsic_event() -> check_presence_and_report() -> hdmi_present_sense() -> hdmi_prepsent_sense_via_verbs()”…””}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K]hj•ubhÌ)”}”(hŒUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. Use hda_jack mechanism to handle jack events.”h]”hŒUse directly snd_jack_report() on spec->pcm_rec[pcm_idx].jack for dyn_pcm_assign. Use hda_jack mechanism to handle jack events.”…””}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K`hj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¾hj^h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jõjöuh1j¹h³hÊh´KShjMh²hubeh}”(h]”Œmonitor-hotplug-event-handling”ah ]”h"]”Œmonitor hotplug event handling”ah$]”h&]”uh1hµhjˆh²hh³hÊh´KRubeh}”(h]”Œjack”ah ]”h"]”Œjack”ah$]”h&]”uh1hµhh·h²hh³hÊh´K)ubh¶)”}”(hhh]”h»)”}”(hŒOthers to be added later”h]”hŒOthers to be added later”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjßh²hh³hÊh´Keubah}”(h]”Œothers-to-be-added-later”ah ]”h"]”Œothers to be added later”ah$]”h&]”uh1hµhh·h²hh³hÊh´Keubeh}”(h]”Œhd-audio-dp-mst-support”ah ]”h"]”Œhd-audio dp-mst support”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”Œentry”Œ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újjjPjMj…j‚jÜjÙj#j jJjGjÔjÑjõjòuŒ nametypes”}”(jý‰j‰jP‰j…‰j܉j#‰jJ‰jÔ‰jõ‰uh}”(júh·jh÷jMjj‚jSjÙjˆj j¸jGj&jÑjMjòjßuŒ 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.