€•ãPŒ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”Œ3/translations/zh_CN/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/zh_TW/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/it_IT/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ja_JP/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/ko_KR/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/pt_BR/driver-api/driver-model/binding”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ3/translations/sp_SP/driver-api/driver-model/binding”Œ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ŒDriver Binding”h]”hŒDriver Binding”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒM/var/lib/git/docbuild/linux/Documentation/driver-api/driver-model/binding.rst”h´KubhŒ paragraph”“”)”}”(hXIDriver binding is the process of associating a device with a device driver that can control it. Bus drivers have typically handled this because there have been bus-specific structures to represent the devices and the drivers. With generic device and device driver structures, most of the binding can take place using common code.”h]”hXIDriver binding is the process of associating a device with a device driver that can control it. Bus drivers have typically handled this because there have been bus-specific structures to represent the devices and the drivers. With generic device and device driver structures, most of the binding can take place using common code.”…””}”(hhÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khh·h²hubh¶)”}”(hhh]”(h»)”}”(hŒBus”h]”hŒBus”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhÛh²hh³hÊh´K ubhÌ)”}”(hX†The bus type structure contains a list of all devices that are on that bus type in the system. When device_register is called for a device, it is inserted into the end of this list. The bus object also contains a list of all drivers of that bus type. When driver_register is called for a driver, it is inserted at the end of this list. These are the two events which trigger driver binding.”h]”hX†The bus type structure contains a list of all devices that are on that bus type in the system. When device_register is called for a device, it is inserted into the end of this list. The bus object also contains a list of all drivers of that bus type. When driver_register is called for a driver, it is inserted at the end of this list. These are the two events which trigger driver binding.”…””}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KhhÛh²hubeh}”(h]”Œbus”ah ]”h"]”Œbus”ah$]”h&]”uh1hµhh·h²hh³hÊh´K ubh¶)”}”(hhh]”(h»)”}”(hŒdevice_register”h]”hŒdevice_register”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´KubhÌ)”}”(hXöWhen a new device is added, the bus's list of drivers is iterated over to find one that supports it. In order to determine that, the device ID of the device must match one of the device IDs that the driver supports. The format and semantics for comparing IDs is bus-specific. Instead of trying to derive a complex state machine and matching algorithm, it is up to the bus driver to provide a callback to compare a device against the IDs of a driver. The bus returns 1 if a match was found; 0 otherwise.”h]”hXøWhen a new device is added, the bus’s list of drivers is iterated over to find one that supports it. In order to determine that, the device ID of the device must match one of the device IDs that the driver supports. The format and semantics for comparing IDs is bus-specific. Instead of trying to derive a complex state machine and matching algorithm, it is up to the bus driver to provide a callback to compare a device against the IDs of a driver. The bus returns 1 if a match was found; 0 otherwise.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Khjh²hubhÌ)”}”(hŒ;int match(struct device * dev, struct device_driver * drv);”h]”hŒ;int match(struct device * dev, struct device_driver * drv);”…””}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K#hjh²hubhÌ)”}”(hŒãIf a match is found, the device's driver field is set to the driver and the driver's probe callback is called. This gives the driver a chance to verify that it really does support the hardware, and that it's in a working state.”h]”hŒéIf a match is found, the device’s driver field is set to the driver and the driver’s probe callback is called. This gives the driver a chance to verify that it really does support the hardware, and that it’s in a working state.”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K%hjh²hubeh}”(h]”Œdevice-register”ah ]”h"]”Œdevice_register”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒ Device Class”h]”hŒ Device Class”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjEh²hh³hÊh´K+ubhÌ)”}”(hXlUpon the successful completion of probe, the device is registered with the class to which it belongs. Device drivers belong to one and only one class, and that is set in the driver's devclass field. devclass_add_device is called to enumerate the device within the class and actually register it with the class, which happens with the class's register_dev callback.”h]”hXpUpon the successful completion of probe, the device is registered with the class to which it belongs. Device drivers belong to one and only one class, and that is set in the driver’s devclass field. devclass_add_device is called to enumerate the device within the class and actually register it with the class, which happens with the class’s register_dev callback.”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K-hjEh²hubeh}”(h]”Œ device-class”ah ]”h"]”Œ device class”ah$]”h&]”uh1hµhh·h²hh³hÊh´K+ubh¶)”}”(hhh]”(h»)”}”(hŒDriver”h]”hŒDriver”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjlh²hh³hÊh´K6ubhÌ)”}”(hX When a driver is attached to a device, the driver's probe() function is called. Within probe(), the driver initializes the device and allocates and initializes per-device data structures. This per-device state is associated with the device object for as long as the driver remains bound to it. Conceptually, this per-device data together with the binding to the device can be thought of as an instance of the driver.”h]”hX¢When a driver is attached to a device, the driver’s probe() function is called. Within probe(), the driver initializes the device and allocates and initializes per-device data structures. This per-device state is associated with the device object for as long as the driver remains bound to it. Conceptually, this per-device data together with the binding to the device can be thought of as an instance of the driver.”…””}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K8hjlh²hubeh}”(h]”Œdriver”ah ]”h"]”Œdriver”ah$]”h&]”uh1hµhh·h²hh³hÊh´K6ubh¶)”}”(hhh]”(h»)”}”(hŒsysfs”h]”hŒsysfs”…””}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj“h²hh³hÊh´K@ubhÌ)”}”(hŒvA symlink is created in the bus's 'devices' directory that points to the device's directory in the physical hierarchy.”h]”hŒ~A symlink is created in the bus’s ‘devices’ directory that points to the device’s directory in the physical hierarchy.”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KBhj“h²hubhÌ)”}”(hŒyA symlink is created in the driver's 'devices' directory that points to the device's directory in the physical hierarchy.”h]”hŒA symlink is created in the driver’s ‘devices’ directory that points to the device’s directory in the physical hierarchy.”…””}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KEhj“h²hubhÌ)”}”(hŒ§A directory for the device is created in the class's directory. A symlink is created in that directory that points to the device's physical location in the sysfs tree.”h]”hŒ«A directory for the device is created in the class’s directory. A symlink is created in that directory that points to the device’s physical location in the sysfs tree.”…””}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KHhj“h²hubhÌ)”}”(hŒÜA symlink can be created (though this isn't done yet) in the device's physical directory to either its class directory, or the class's top-level directory. One can also be created to point to its driver's directory also.”h]”hŒäA symlink can be created (though this isn’t done yet) in the device’s physical directory to either its class directory, or the class’s top-level directory. One can also be created to point to its driver’s directory also.”…””}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KLhj“h²hubeh}”(h]”Œsysfs”ah ]”h"]”Œsysfs”ah$]”h&]”uh1hµhh·h²hh³hÊh´K@ubh¶)”}”(hhh]”(h»)”}”(hŒdriver_register”h]”hŒdriver_register”…””}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjäh²hh³hÊh´KSubhÌ)”}”(hXThe process is almost identical for when a new driver is added. The bus's list of devices is iterated over to find a match. Devices that already have a driver are skipped. All the devices are iterated over, to bind as many devices as possible to the driver.”h]”hXThe process is almost identical for when a new driver is added. The bus’s list of devices is iterated over to find a match. Devices that already have a driver are skipped. All the devices are iterated over, to bind as many devices as possible to the driver.”…””}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KUhjäh²hubeh}”(h]”Œdriver-register”ah ]”h"]”Œdriver_register”ah$]”h&]”uh1hµhh·h²hh³hÊh´KSubh¶)”}”(hhh]”(h»)”}”(hŒRemoval”h]”hŒRemoval”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´K\ubhÌ)”}”(hXWhen a device is removed, the reference count for it will eventually go to 0. When it does, the remove callback of the driver is called. It is removed from the driver's list of devices and the reference count of the driver is decremented. All symlinks between the two are removed.”h]”hXWhen a device is removed, the reference count for it will eventually go to 0. When it does, the remove callback of the driver is called. It is removed from the driver’s list of devices and the reference count of the driver is decremented. All symlinks between the two are removed.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K^hj h²hubhÌ)”}”(hŒÈWhen a driver is removed, the list of devices that it supports is iterated over, and the driver's remove callback is called for each one. The device is removed from that list and the symlinks removed.”h]”hŒÊWhen a driver is removed, the list of devices that it supports is iterated over, and the driver’s remove callback is called for each one. The device is removed from that list and the symlinks removed.”…””}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kchj h²hubeh}”(h]”Œremoval”ah ]”h"]”Œremoval”ah$]”h&]”uh1hµhh·h²hh³hÊh´K\ubh¶)”}”(hhh]”(h»)”}”(hŒDriver Override”h]”hŒDriver Override”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj@h²hh³hÊh´KiubhÌ)”}”(hXUserspace may override the standard matching by writing a driver name to a device's ``driver_override`` sysfs attribute. When set, only a driver whose name matches the override will be considered during binding. This bypasses all bus-specific matching (OF, ACPI, ID tables, etc.).”h]”(hŒVUserspace may override the standard matching by writing a driver name to a device’s ”…””}”(hjQh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``driver_override``”h]”hŒdriver_override”…””}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhjQubhŒ³ sysfs attribute. When set, only a driver whose name matches the override will be considered during binding. This bypasses all bus-specific matching (OF, ACPI, ID tables, etc.).”…””}”(hjQh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kkhj@h²hubhÌ)”}”(hŒÿThe override may be cleared by writing an empty string, which returns the device to standard matching rules. Writing to ``driver_override`` does not automatically unbind the device from its current driver or make any attempt to load the specified driver.”h]”(hŒyThe override may be cleared by writing an empty string, which returns the device to standard matching rules. Writing to ”…””}”(hjsh²hh³Nh´NubjZ)”}”(hŒ``driver_override``”h]”hŒdriver_override”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhjsubhŒs does not automatically unbind the device from its current driver or make any attempt to load the specified driver.”…””}”(hjsh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kphj@h²hubhÌ)”}”(hŒdBuses opt into this mechanism by setting the ``driver_override`` flag in their ``struct bus_type``::”h]”(hŒ-Buses opt into this mechanism by setting the ”…””}”(hj“h²hh³Nh´NubjZ)”}”(hŒ``driver_override``”h]”hŒdriver_override”…””}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj“ubhŒ flag in their ”…””}”(hj“h²hh³Nh´NubjZ)”}”(hŒ``struct bus_type``”h]”hŒstruct bus_type”…””}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj“ubhŒ:”…””}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´Kuhj@h²hubhŒ literal_block”“”)”}”(hŒRconst struct bus_type example_bus_type = { ... .driver_override = true, };”h]”hŒRconst struct bus_type example_bus_type = { ... .driver_override = true, };”…””}”hjÇsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jÅh³hÊh´Kxhj@h²hubhÌ)”}”(hŒWhen the flag is set, the driver core automatically creates the ``driver_override`` sysfs attribute for every device on that bus.”h]”(hŒ@When the flag is set, the driver core automatically creates the ”…””}”(hj×h²hh³Nh´NubjZ)”}”(hŒ``driver_override``”h]”hŒdriver_override”…””}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj×ubhŒ. sysfs attribute for every device on that bus.”…””}”(hj×h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K}hj@h²hubhÌ)”}”(hŒ‡The bus's ``match()`` callback should check the override before performing its own matching, using ``device_match_driver_override()``::”h]”(hŒ The bus’s ”…””}”(hj÷h²hh³Nh´NubjZ)”}”(hŒ ``match()``”h]”hŒmatch()”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj÷ubhŒN callback should check the override before performing its own matching, using ”…””}”(hj÷h²hh³Nh´NubjZ)”}”(hŒ"``device_match_driver_override()``”h]”hŒdevice_match_driver_override()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj÷ubhŒ:”…””}”(hj÷h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K€hj@h²hubjÆ)”}”(hŒëstatic int example_match(struct device *dev, const struct device_driver *drv) { int ret; ret = device_match_driver_override(dev, drv); if (ret >= 0) return ret; /* Fall through to bus-specific matching... */ }”h]”hŒëstatic int example_match(struct device *dev, const struct device_driver *drv) { int ret; ret = device_match_driver_override(dev, drv); if (ret >= 0) return ret; /* Fall through to bus-specific matching... */ }”…””}”hj)sbah}”(h]”h ]”h"]”h$]”h&]”jÕjÖuh1jÅh³hÊh´Kƒhj@h²hubhÌ)”}”(hŒª``device_match_driver_override()`` returns > 0 if the override matches the given driver, 0 if the override is set but does not match, or < 0 if no override is set at all.”h]”(jZ)”}”(hŒ"``device_match_driver_override()``”h]”hŒdevice_match_driver_override()”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj7ubhŒˆ returns > 0 if the override matches the given driver, 0 if the override is set but does not match, or < 0 if no override is set at all.”…””}”(hj7h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´KŽhj@h²hubhÌ)”}”(hŒ!Additional helpers are available:”h]”hŒ!Additional helpers are available:”…””}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K’hj@h²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒN``device_set_driver_override()`` - set or clear the override from kernel code.”h]”hÌ)”}”(hjjh]”(jZ)”}”(hŒ ``device_set_driver_override()``”h]”hŒdevice_set_driver_override()”…””}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhjlubhŒ. - set or clear the override from kernel code.”…””}”(hjlh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K”hjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jfhjch²hh³hÊh´Nubjg)”}”(hŒD``device_has_driver_override()`` - check whether an override is set.”h]”hÌ)”}”(hjh]”(jZ)”}”(hŒ ``device_has_driver_override()``”h]”hŒdevice_has_driver_override()”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jYhj‘ubhŒ$ - check whether an override is set.”…””}”(hj‘h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËh³hÊh´K•hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jfhjch²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jah³hÊh´K”hj@h²hubeh}”(h]”Œdriver-override”ah ]”h"]”Œdriver override”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kiubeh}”(h]”Œdriver-binding”ah ]”h"]”Œdriver binding”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ÄhÿhüjBj?jijfjjjájÞjjj=j:j¿j¼uŒ nametypes”}”(jljhÿ‰jB‰ji‰j‰já‰j‰j=‰j¿‰uh}”(jÄh·hühÛj?jjfjEjjljÞj“jjäj:j j¼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.