Hjsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget-/translations/zh_CN/virt/kvm/review-checklistmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/zh_TW/virt/kvm/review-checklistmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/it_IT/virt/kvm/review-checklistmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ja_JP/virt/kvm/review-checklistmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/ko_KR/virt/kvm/review-checklistmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget-/translations/sp_SP/virt/kvm/review-checklistmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhG/var/lib/git/docbuild/linux/Documentation/virt/kvm/review-checklist.rsthKubhsection)}(hhh](htitle)}(h Review checklist for kvm patchesh]h Review checklist for kvm patches}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhenumerated_list)}(hhh](h list_item)}(hoThe patch must follow Documentation/process/coding-style.rst and Documentation/process/submitting-patches.rst. h]h paragraph)}(hnThe patch must follow Documentation/process/coding-style.rst and Documentation/process/submitting-patches.rst.h]hnThe patch must follow Documentation/process/coding-style.rst and Documentation/process/submitting-patches.rst.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(h;Patches should be against kvm.git master or next branches. h]h)}(h:Patches should be against kvm.git master or next branches.h]h:Patches should be against kvm.git master or next branches.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hIf the patch introduces or modifies a new userspace API: - the API must be documented in Documentation/virt/kvm/api.rst - the API must be discoverable using KVM_CHECK_EXTENSION h]h)}(hIf the patch introduces or modifies a new userspace API: - the API must be documented in Documentation/virt/kvm/api.rst - the API must be discoverable using KVM_CHECK_EXTENSIONh]hIf the patch introduces or modifies a new userspace API: - the API must be documented in Documentation/virt/kvm/api.rst - the API must be discoverable using KVM_CHECK_EXTENSION}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(h1New state must include support for save/restore. h]h)}(h0New state must include support for save/restore.h]h0New state must include support for save/restore.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hNew features must default to off (userspace should explicitly request them). Performance improvements can and should default to on. h]h)}(hNew features must default to off (userspace should explicitly request them). Performance improvements can and should default to on.h]hNew features must default to off (userspace should explicitly request them). Performance improvements can and should default to on.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj2ubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hmNew cpu features should be exposed via KVM_GET_SUPPORTED_CPUID2, or its equivalent for non-x86 architectures h]h)}(hlNew cpu features should be exposed via KVM_GET_SUPPORTED_CPUID2, or its equivalent for non-x86 architecturesh]hlNew cpu features should be exposed via KVM_GET_SUPPORTED_CPUID2, or its equivalent for non-x86 architectures}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjJubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(h,The feature should be testable (see below). h]h)}(h+The feature should be testable (see below).h]h+The feature should be testable (see below).}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjbubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(h|Changes should be vendor neutral when possible. Changes to common code are better than duplicating changes to vendor code. h]h)}(h{Changes should be vendor neutral when possible. Changes to common code are better than duplicating changes to vendor code.h]h{Changes should be vendor neutral when possible. Changes to common code are better than duplicating changes to vendor code.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjzubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hPSimilarly, prefer changes to arch independent code than to arch dependent code. h]h)}(hOSimilarly, prefer changes to arch independent code than to arch dependent code.h]hOSimilarly, prefer changes to arch independent code than to arch dependent code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hUser/kernel interfaces and guest/host interfaces must be 64-bit clean (all variables and sizes naturally aligned on 64-bit; use specific types only - u64 rather than ulong). h]h)}(hUser/kernel interfaces and guest/host interfaces must be 64-bit clean (all variables and sizes naturally aligned on 64-bit; use specific types only - u64 rather than ulong).h]hUser/kernel interfaces and guest/host interfaces must be 64-bit clean (all variables and sizes naturally aligned on 64-bit; use specific types only - u64 rather than ulong).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh)}(hnNew guest visible features must either be documented in a hardware manual or be accompanied by documentation. h]h)}(hmNew guest visible features must either be documented in a hardware manual or be accompanied by documentation.h]hmNew guest visible features must either be documented in a hardware manual or be accompanied by documentation.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1hhhhhhhhKubh)}(hhh](h)}(hTesting of KVM codeh]hTesting of KVM code}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK(ubh)}(hAll features contributed to KVM, and in many cases bugfixes too, should be accompanied by some kind of tests and/or enablement in open source guests and VMMs. KVM is covered by multiple test suites:h]hAll features contributed to KVM, and in many cases bugfixes too, should be accompanied by some kind of tests and/or enablement in open source guests and VMMs. KVM is covered by multiple test suites:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK*hjhhubhdefinition_list)}(hhh](hdefinition_list_item)}(hX8*Selftests* These are low level tests that allow granular testing of kernel APIs. This includes API failure scenarios, invoking APIs after specific guest instructions, and testing multiple calls to ``KVM_CREATE_VM`` within a single test. They are included in the kernel tree at ``tools/testing/selftests/kvm``. h](hterm)}(h *Selftests*h]hemphasis)}(hjh]h Selftests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhK3hj ubh definition)}(hhh]h)}(hX+These are low level tests that allow granular testing of kernel APIs. This includes API failure scenarios, invoking APIs after specific guest instructions, and testing multiple calls to ``KVM_CREATE_VM`` within a single test. They are included in the kernel tree at ``tools/testing/selftests/kvm``.h](hThese are low level tests that allow granular testing of kernel APIs. This includes API failure scenarios, invoking APIs after specific guest instructions, and testing multiple calls to }(hj/hhhNhNubhliteral)}(h``KVM_CREATE_VM``h]h KVM_CREATE_VM}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j7hj/ubh@ within a single test. They are included in the kernel tree at }(hj/hhhNhNubj8)}(h``tools/testing/selftests/kvm``h]htools/testing/selftests/kvm}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hj/ubh.}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK/hj,ubah}(h]h ]h"]h$]h&]uh1j*hj ubeh}(h]h ]h"]h$]h&]uh1j hhhK3hjubj )}(hX```kvm-unit-tests`` A collection of small guests that test CPU and emulated device features from a guest's perspective. They run under QEMU or ``kvmtool``, and are generally not KVM-specific: they can be run with any accelerator that QEMU support or even on bare metal, making it possible to compare behavior across hypervisors and processor families. h](j)}(h``kvm-unit-tests``h]j8)}(hjuh]hkvm-unit-tests}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjsubah}(h]h ]h"]h$]h&]uh1jhhhK:hjoubj+)}(hhh]h)}(hXLA collection of small guests that test CPU and emulated device features from a guest's perspective. They run under QEMU or ``kvmtool``, and are generally not KVM-specific: they can be run with any accelerator that QEMU support or even on bare metal, making it possible to compare behavior across hypervisors and processor families.h](h~A collection of small guests that test CPU and emulated device features from a guest’s perspective. They run under QEMU or }(hjhhhNhNubj8)}(h ``kvmtool``h]hkvmtool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh, and are generally not KVM-specific: they can be run with any accelerator that QEMU support or even on bare metal, making it possible to compare behavior across hypervisors and processor families.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK6hjubah}(h]h ]h"]h$]h&]uh1j*hjoubeh}(h]h ]h"]h$]h&]uh1j hhhK:hjhhubj )}(hFunctional test suites Various sets of functional tests exist, such as QEMU's ``tests/functional`` suite and `avocado-vt `__. These typically involve running a full operating system in a virtual machine. h](j)}(hFunctional test suitesh]hFunctional test suites}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK@hjubj+)}(hhh]h)}(hVarious sets of functional tests exist, such as QEMU's ``tests/functional`` suite and `avocado-vt `__. These typically involve running a full operating system in a virtual machine.h](h9Various sets of functional tests exist, such as QEMU’s }(hjhhhNhNubj8)}(h``tests/functional``h]htests/functional}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh suite and }(hjhhhNhNubh reference)}(h=`avocado-vt `__h]h avocado-vt}(hjhhhNhNubah}(h]h ]h"]h$]h&]name avocado-vtrefuri,https://avocado-vt.readthedocs.io/en/latest/uh1jhjubhO. These typically involve running a full operating system in a virtual machine.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK=hjubah}(h]h ]h"]h$]h&]uh1j*hjubeh}(h]h ]h"]h$]h&]uh1j hhhK@hjhhubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubh)}(hsThe best testing approach depends on the feature's complexity and operation. Here are some examples and guidelines:h]huThe best testing approach depends on the feature’s complexity and operation. Here are some examples and guidelines:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKBhjhhubj)}(hhh](j )}(hXrNew instructions (no new registers or APIs) The corresponding CPU features (if applicable) should be made available in QEMU. If the instructions require emulation support or other code in KVM, it is worth adding coverage to ``kvm-unit-tests`` or selftests; the latter can be a better choice if the instructions relate to an API that already has good selftest coverage. h](j)}(h+New instructions (no new registers or APIs)h]h+New instructions (no new registers or APIs)}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKJhj)ubj+)}(hhh]h)}(hXEThe corresponding CPU features (if applicable) should be made available in QEMU. If the instructions require emulation support or other code in KVM, it is worth adding coverage to ``kvm-unit-tests`` or selftests; the latter can be a better choice if the instructions relate to an API that already has good selftest coverage.h](hThe corresponding CPU features (if applicable) should be made available in QEMU. If the instructions require emulation support or other code in KVM, it is worth adding coverage to }(hj>hhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hj>ubh~ or selftests; the latter can be a better choice if the instructions relate to an API that already has good selftest coverage.}(hj>hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKFhj;ubah}(h]h ]h"]h$]h&]uh1j*hj)ubeh}(h]h ]h"]h$]h&]uh1j hhhKJhj&ubj )}(hX6New hardware features (new registers, no new APIs) These should be tested via ``kvm-unit-tests``; this more or less implies supporting them in QEMU and/or ``kvmtool``. In some cases selftests can be used instead, similar to the previous case, or specifically to test corner cases in guest state save/restore. h](j)}(h2New hardware features (new registers, no new APIs)h]h2New hardware features (new registers, no new APIs)}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKPhjjubj+)}(hhh]h)}(hXThese should be tested via ``kvm-unit-tests``; this more or less implies supporting them in QEMU and/or ``kvmtool``. In some cases selftests can be used instead, similar to the previous case, or specifically to test corner cases in guest state save/restore.h](hThese should be tested via }(hjhhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh;; this more or less implies supporting them in QEMU and/or }(hjhhhNhNubj8)}(h ``kvmtool``h]hkvmtool}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh. In some cases selftests can be used instead, similar to the previous case, or specifically to test corner cases in guest state save/restore.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKMhj|ubah}(h]h ]h"]h$]h&]uh1j*hjjubeh}(h]h ]h"]h$]h&]uh1j hhhKPhj&hhubj )}(hXBug fixes and performance improvements These usually do not introduce new APIs, but it's worth sharing any benchmarks and tests that will validate your contribution, ideally in the form of regression tests. Tests and benchmarks can be included in either ``kvm-unit-tests`` or selftests, depending on the specifics of your change. Selftests are especially useful for regression tests because they are included directly in Linux's tree. h](j)}(h&Bug fixes and performance improvementsh]h&Bug fixes and performance improvements}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKXhjubj+)}(hhh]h)}(hXThese usually do not introduce new APIs, but it's worth sharing any benchmarks and tests that will validate your contribution, ideally in the form of regression tests. Tests and benchmarks can be included in either ``kvm-unit-tests`` or selftests, depending on the specifics of your change. Selftests are especially useful for regression tests because they are included directly in Linux's tree.h](hThese usually do not introduce new APIs, but it’s worth sharing any benchmarks and tests that will validate your contribution, ideally in the form of regression tests. Tests and benchmarks can be included in either }(hjhhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh or selftests, depending on the specifics of your change. Selftests are especially useful for regression tests because they are included directly in Linux’s tree.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKShjubah}(h]h ]h"]h$]h&]uh1j*hjubeh}(h]h ]h"]h$]h&]uh1j hhhKXhj&hhubj )}(hXkLarge scale internal changes While it's difficult to provide a single policy, you should ensure that the changed code is covered by either ``kvm-unit-tests`` or selftests. In some cases the affected code is run for any guests and functional tests suffice. Explain your testing process in the cover letter, as that can help identify gaps in existing test suites. h](j)}(hLarge scale internal changesh]hLarge scale internal changes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhK_hjubj+)}(hhh]h)}(hXMWhile it's difficult to provide a single policy, you should ensure that the changed code is covered by either ``kvm-unit-tests`` or selftests. In some cases the affected code is run for any guests and functional tests suffice. Explain your testing process in the cover letter, as that can help identify gaps in existing test suites.h](hpWhile it’s difficult to provide a single policy, you should ensure that the changed code is covered by either }(hjhhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh or selftests. In some cases the affected code is run for any guests and functional tests suffice. Explain your testing process in the cover letter, as that can help identify gaps in existing test suites.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK[hjubah}(h]h ]h"]h$]h&]uh1j*hjubeh}(h]h ]h"]h$]h&]uh1j hhhK_hj&hhubj )}(hXNew APIs It is important to demonstrate your use case. This can be as simple as explaining that the feature is already in use on bare metal, or it can be a proof-of-concept implementation in userspace. The latter need not be open source, though that is of course preferrable for easier testing. Selftests should test corner cases of the APIs, and should also cover basic host and guest operation if no open source VMM uses the feature. h](j)}(hNew APIsh]hNew APIs}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKghj?ubj+)}(hhh]h)}(hXIt is important to demonstrate your use case. This can be as simple as explaining that the feature is already in use on bare metal, or it can be a proof-of-concept implementation in userspace. The latter need not be open source, though that is of course preferrable for easier testing. Selftests should test corner cases of the APIs, and should also cover basic host and guest operation if no open source VMM uses the feature.h]hXIt is important to demonstrate your use case. This can be as simple as explaining that the feature is already in use on bare metal, or it can be a proof-of-concept implementation in userspace. The latter need not be open source, though that is of course preferrable for easier testing. Selftests should test corner cases of the APIs, and should also cover basic host and guest operation if no open source VMM uses the feature.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKbhjQubah}(h]h ]h"]h$]h&]uh1j*hj?ubeh}(h]h ]h"]h$]h&]uh1j hhhKghj&hhubj )}(hXBigger features, usually spanning host and guest These should be supported by Linux guests, with limited exceptions for Hyper-V features that are testable on Windows guests. It is strongly suggested that the feature be usable with an open source host VMM, such as at least one of QEMU or crosvm, and guest firmware. Selftests should test at least API error cases. Guest operation can be covered by either selftests of ``kvm-unit-tests`` (this is especially important for paravirtualized and Windows-only features). Strong selftest coverage can also be a replacement for implementation in an open source VMM, but this is generally not recommended. h](j)}(h0Bigger features, usually spanning host and guesth]h0Bigger features, usually spanning host and guest}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhhKrhjnubj+)}(hhh]h)}(hXYThese should be supported by Linux guests, with limited exceptions for Hyper-V features that are testable on Windows guests. It is strongly suggested that the feature be usable with an open source host VMM, such as at least one of QEMU or crosvm, and guest firmware. Selftests should test at least API error cases. Guest operation can be covered by either selftests of ``kvm-unit-tests`` (this is especially important for paravirtualized and Windows-only features). Strong selftest coverage can also be a replacement for implementation in an open source VMM, but this is generally not recommended.h](hXtThese should be supported by Linux guests, with limited exceptions for Hyper-V features that are testable on Windows guests. It is strongly suggested that the feature be usable with an open source host VMM, such as at least one of QEMU or crosvm, and guest firmware. Selftests should test at least API error cases. Guest operation can be covered by either selftests of }(hjhhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh (this is especially important for paravirtualized and Windows-only features). Strong selftest coverage can also be a replacement for implementation in an open source VMM, but this is generally not recommended.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKjhjubah}(h]h ]h"]h$]h&]uh1j*hjnubeh}(h]h ]h"]h$]h&]uh1j hhhKrhj&hhubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubh)}(hXFollowing the above suggestions for testing in selftests and ``kvm-unit-tests`` will make it easier for the maintainers to review and accept your code. In fact, even before you contribute your changes upstream it will make it easier for you to develop for KVM.h](h=Following the above suggestions for testing in selftests and }(hjhhhNhNubj8)}(h``kvm-unit-tests``h]hkvm-unit-tests}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j7hjubh will make it easier for the maintainers to review and accept your code. In fact, even before you contribute your changes upstream it will make it easier for you to develop for KVM.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKthjhhubh)}(hOf course, the KVM maintainers reserve the right to require more tests, though they may also waive the requirement from time to time.h]hOf course, the KVM maintainers reserve the right to require more tests, though they may also waive the requirement from time to time.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKyhjhhubeh}(h]testing-of-kvm-codeah ]h"]testing of kvm codeah$]h&]uh1hhhhhhhhK(ubeh}(h] review-checklist-for-kvm-patchesah ]h"] review checklist for kvm patchesah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjju nametypes}(jjuh}(jhjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.