gitextract_3onmcp2r/ ├── .git-blame-ignore-revs ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE.md │ └── workflows/ │ ├── python-package.yml │ └── release.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .readthedocs.yaml ├── AGENTS.md ├── LICENSE ├── README.md ├── conftest.py ├── contributing.md ├── docs/ │ ├── _static/ │ │ └── custom_machine.css │ ├── actions.md │ ├── api.md │ ├── async.md │ ├── authors.md │ ├── behaviour.md │ ├── concepts.md │ ├── conf.py │ ├── contributing.md │ ├── diagram.md │ ├── error_handling.md │ ├── events.md │ ├── guards.md │ ├── how-to/ │ │ ├── coming_from_state_pattern.md │ │ └── coming_from_transitions.md │ ├── index.md │ ├── installation.md │ ├── integrations.md │ ├── invoke.md │ ├── listeners.md │ ├── models.md │ ├── processing_model.md │ ├── releases/ │ │ ├── 0.1.0.md │ │ ├── 0.2.0.md │ │ ├── 0.3.0.md │ │ ├── 0.4.2.md │ │ ├── 0.5.0.md │ │ ├── 0.5.1.md │ │ ├── 0.6.0.md │ │ ├── 0.6.1.md │ │ ├── 0.6.2.md │ │ ├── 0.7.0.md │ │ ├── 0.7.1.md │ │ ├── 0.8.0.md │ │ ├── 0.9.0.md │ │ ├── 1.0.0.md │ │ ├── 1.0.1.md │ │ ├── 1.0.2.md │ │ ├── 1.0.3.md │ │ ├── 2.0.0.md │ │ ├── 2.1.0.md │ │ ├── 2.1.1.md │ │ ├── 2.1.2.md │ │ ├── 2.2.0.md │ │ ├── 2.3.0.md │ │ ├── 2.3.1.md │ │ ├── 2.3.2.md │ │ ├── 2.3.3.md │ │ ├── 2.3.4.md │ │ ├── 2.3.5.md │ │ ├── 2.3.6.md │ │ ├── 2.4.0.md │ │ ├── 2.5.0.md │ │ ├── 2.6.0.md │ │ ├── 3.0.0.md │ │ ├── 3.1.0.md │ │ ├── index.md │ │ └── upgrade_2x_to_3.md │ ├── statechart.md │ ├── states.md │ ├── timeout.md │ ├── transitions.md │ ├── tutorial.md │ ├── validations.md │ └── weighted_transitions.md ├── pyproject.toml ├── statemachine/ │ ├── __init__.py │ ├── callbacks.py │ ├── configuration.py │ ├── contrib/ │ │ ├── __init__.py │ │ ├── diagram/ │ │ │ ├── __init__.py │ │ │ ├── __main__.py │ │ │ ├── extract.py │ │ │ ├── formatter.py │ │ │ ├── model.py │ │ │ ├── renderers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── dot.py │ │ │ │ ├── mermaid.py │ │ │ │ └── table.py │ │ │ └── sphinx_ext.py │ │ ├── timeout.py │ │ └── weighted.py │ ├── dispatcher.py │ ├── engines/ │ │ ├── __init__.py │ │ ├── async_.py │ │ ├── base.py │ │ └── sync.py │ ├── event.py │ ├── event_data.py │ ├── events.py │ ├── exceptions.py │ ├── factory.py │ ├── graph.py │ ├── i18n.py │ ├── invoke.py │ ├── io/ │ │ ├── __init__.py │ │ └── scxml/ │ │ ├── __init__.py │ │ ├── actions.py │ │ ├── invoke.py │ │ ├── parser.py │ │ ├── processor.py │ │ └── schema.py │ ├── locale/ │ │ ├── en/ │ │ │ └── LC_MESSAGES/ │ │ │ └── statemachine.po │ │ ├── hi_IN/ │ │ │ └── LC_MESSAGES/ │ │ │ └── statemachine.po │ │ ├── pt_BR/ │ │ │ └── LC_MESSAGES/ │ │ │ └── statemachine.po │ │ └── zh_CN/ │ │ └── LC_MESSAGES/ │ │ └── statemachine.po │ ├── mixins.py │ ├── model.py │ ├── orderedset.py │ ├── py.typed │ ├── registry.py │ ├── signature.py │ ├── spec_parser.py │ ├── state.py │ ├── statemachine.py │ ├── states.py │ ├── transition.py │ ├── transition_list.py │ ├── transition_mixin.py │ └── utils.py └── tests/ ├── __init__.py ├── conftest.py ├── django_project/ │ ├── app.py │ ├── core/ │ │ ├── __init__,.py │ │ ├── settings.py │ │ └── wsgi.py │ ├── manage.py │ └── workflow/ │ ├── __init__.py │ ├── apps.py │ ├── models.py │ ├── statemachines.py │ └── tests.py ├── examples/ │ ├── README.rst │ ├── __init__.py │ ├── ai_shell_machine.py │ ├── air_conditioner_machine.py │ ├── all_actions_machine.py │ ├── async_guess_the_number_machine.py │ ├── async_without_loop_machine.py │ ├── enum_campaign_machine.py │ ├── guess_the_number_machine.py │ ├── lor_machine.py │ ├── order_control_machine.py │ ├── order_control_rich_model_machine.py │ ├── persistent_model_machine.py │ ├── recursive_event_machine.py │ ├── reusing_transitions_machine.py │ ├── sqlite_persistent_model_machine.py │ ├── statechart_cleanup_machine.py │ ├── statechart_compound_machine.py │ ├── statechart_delayed_machine.py │ ├── statechart_error_handling_machine.py │ ├── statechart_eventless_machine.py │ ├── statechart_history_machine.py │ ├── statechart_in_condition_machine.py │ ├── statechart_parallel_machine.py │ ├── traffic_light_machine.py │ ├── user_machine.py │ └── weighted_idle_machine.py ├── helpers.py ├── machines/ │ ├── __init__.py │ ├── compound/ │ │ ├── __init__.py │ │ ├── middle_earth_journey.py │ │ ├── middle_earth_journey_two_compounds.py │ │ ├── middle_earth_journey_with_finals.py │ │ ├── moria_expedition.py │ │ ├── moria_expedition_with_escape.py │ │ ├── quest_for_erebor.py │ │ └── shire_to_rivendell.py │ ├── donedata/ │ │ ├── __init__.py │ │ ├── destroy_the_ring.py │ │ ├── destroy_the_ring_simple.py │ │ ├── nested_quest_donedata.py │ │ ├── quest_for_erebor_done_convention.py │ │ ├── quest_for_erebor_explicit_id.py │ │ ├── quest_for_erebor_multi_word.py │ │ └── quest_for_erebor_with_event.py │ ├── error/ │ │ ├── __init__.py │ │ ├── error_convention_event.py │ │ ├── error_convention_transition_list.py │ │ ├── error_in_action_sc.py │ │ ├── error_in_action_sm_with_flag.py │ │ ├── error_in_after_sc.py │ │ ├── error_in_error_handler_sc.py │ │ ├── error_in_guard_sc.py │ │ ├── error_in_guard_sm.py │ │ └── error_in_on_enter_sc.py │ ├── eventless/ │ │ ├── __init__.py │ │ ├── auto_advance.py │ │ ├── beacon_chain.py │ │ ├── beacon_chain_lighting.py │ │ ├── coordinated_advance.py │ │ ├── ring_corruption.py │ │ ├── ring_corruption_with_bear_ring.py │ │ └── ring_corruption_with_tick.py │ ├── history/ │ │ ├── __init__.py │ │ ├── deep_memory_of_moria.py │ │ ├── gollum_personality.py │ │ ├── gollum_personality_default_gollum.py │ │ ├── gollum_personality_with_default.py │ │ └── shallow_moria.py │ ├── in_condition/ │ │ ├── __init__.py │ │ ├── combined_guard.py │ │ ├── descendant_check.py │ │ ├── eventless_in.py │ │ ├── fellowship.py │ │ ├── fellowship_coordination.py │ │ └── gate_of_moria.py │ ├── parallel/ │ │ ├── __init__.py │ │ ├── session.py │ │ ├── session_with_done_state.py │ │ ├── two_towers.py │ │ ├── war_of_the_ring.py │ │ └── war_with_exit.py │ ├── showcase_actions.py │ ├── showcase_compound.py │ ├── showcase_deep_history.py │ ├── showcase_guards.py │ ├── showcase_history.py │ ├── showcase_internal.py │ ├── showcase_parallel.py │ ├── showcase_parallel_compound.py │ ├── showcase_self_transition.py │ ├── showcase_simple.py │ ├── transition_from_any.py │ ├── tutorial_coffee_order.py │ ├── validators/ │ │ ├── __init__.py │ │ ├── multi_validator.py │ │ ├── order_validation.py │ │ ├── order_validation_no_error_events.py │ │ ├── validator_fallthrough.py │ │ ├── validator_with_cond.py │ │ └── validator_with_error_transition.py │ └── workflow/ │ ├── __init__.py │ ├── campaign_machine.py │ ├── campaign_machine_with_validator.py │ ├── campaign_machine_with_values.py │ └── reverse_traffic_light.py ├── models.py ├── scrape_images.py ├── scxml/ │ ├── __init__.py │ ├── conftest.py │ ├── test_microwave.py │ ├── test_scxml_cases.py │ └── w3c/ │ ├── LICENSE │ ├── mandatory/ │ │ ├── test144.scxml │ │ ├── test145.scxml │ │ ├── test147.scxml │ │ ├── test148.scxml │ │ ├── test149.scxml │ │ ├── test150.scxml │ │ ├── test151.scxml │ │ ├── test152.scxml │ │ ├── test153.scxml │ │ ├── test155.scxml │ │ ├── test156.scxml │ │ ├── test158.scxml │ │ ├── test159.scxml │ │ ├── test172.scxml │ │ ├── test173.scxml │ │ ├── test174.scxml │ │ ├── test175.scxml │ │ ├── test176.scxml │ │ ├── test179.scxml │ │ ├── test183.scxml │ │ ├── test185.scxml │ │ ├── test186.scxml │ │ ├── test187.scxml │ │ ├── test189.scxml │ │ ├── test190.scxml │ │ ├── test191.scxml │ │ ├── test192.scxml │ │ ├── test194.scxml │ │ ├── test198.scxml │ │ ├── test199.scxml │ │ ├── test200.scxml │ │ ├── test205.scxml │ │ ├── test207.scxml │ │ ├── test208.scxml │ │ ├── test210.scxml │ │ ├── test215.scxml │ │ ├── test216.scxml │ │ ├── test216sub1.scxml │ │ ├── test220.scxml │ │ ├── test223.scxml │ │ ├── test224.scxml │ │ ├── test225.scxml │ │ ├── test226.scxml │ │ ├── test226sub1.scxml │ │ ├── test228.scxml │ │ ├── test229.scxml │ │ ├── test232.scxml │ │ ├── test233.scxml │ │ ├── test234.scxml │ │ ├── test235.scxml │ │ ├── test236.scxml │ │ ├── test237.scxml │ │ ├── test239.scxml │ │ ├── test239sub1.scxml │ │ ├── test240.scxml │ │ ├── test241.scxml │ │ ├── test242.scxml │ │ ├── test242sub1.scxml │ │ ├── test243.scxml │ │ ├── test244.scxml │ │ ├── test245.scxml │ │ ├── test247.scxml │ │ ├── test252.scxml │ │ ├── test253.scxml │ │ ├── test276.scxml │ │ ├── test276sub1.scxml │ │ ├── test277.scxml │ │ ├── test279.scxml │ │ ├── test280.scxml │ │ ├── test286.scxml │ │ ├── test287.scxml │ │ ├── test294.scxml │ │ ├── test298.scxml │ │ ├── test302.scxml │ │ ├── test303.scxml │ │ ├── test304.scxml │ │ ├── test309.scxml │ │ ├── test310.scxml │ │ ├── test311.scxml │ │ ├── test312.scxml │ │ ├── test318.scxml │ │ ├── test319.scxml │ │ ├── test321.scxml │ │ ├── test322.scxml │ │ ├── test323.scxml │ │ ├── test324.scxml │ │ ├── test325.scxml │ │ ├── test326.scxml │ │ ├── test329.scxml │ │ ├── test330.scxml │ │ ├── test331.scxml │ │ ├── test332.scxml │ │ ├── test333.scxml │ │ ├── test335.scxml │ │ ├── test336.scxml │ │ ├── test337.scxml │ │ ├── test338.scxml │ │ ├── test339.scxml │ │ ├── test342.scxml │ │ ├── test343.scxml │ │ ├── test344.scxml │ │ ├── test346.scxml │ │ ├── test347.scxml │ │ ├── test348.scxml │ │ ├── test349.scxml │ │ ├── test350.scxml │ │ ├── test351.scxml │ │ ├── test352.scxml │ │ ├── test354.scxml │ │ ├── test355.scxml │ │ ├── test364.scxml │ │ ├── test372.scxml │ │ ├── test375.scxml │ │ ├── test376.scxml │ │ ├── test377.scxml │ │ ├── test378.scxml │ │ ├── test387.scxml │ │ ├── test388.scxml │ │ ├── test396.scxml │ │ ├── test399.scxml │ │ ├── test401.scxml │ │ ├── test402.scxml │ │ ├── test403a.scxml │ │ ├── test403b.scxml │ │ ├── test403c.scxml │ │ ├── test404.scxml │ │ ├── test405.scxml │ │ ├── test406.scxml │ │ ├── test407.scxml │ │ ├── test409.scxml │ │ ├── test411.scxml │ │ ├── test412.scxml │ │ ├── test413.scxml │ │ ├── test416.scxml │ │ ├── test417.scxml │ │ ├── test419.scxml │ │ ├── test421.scxml │ │ ├── test422.scxml │ │ ├── test423.scxml │ │ ├── test487.scxml │ │ ├── test488.scxml │ │ ├── test495.scxml │ │ ├── test496.scxml │ │ ├── test500.scxml │ │ ├── test501.scxml │ │ ├── test503.scxml │ │ ├── test504.scxml │ │ ├── test505.scxml │ │ ├── test506.scxml │ │ ├── test521.scxml │ │ ├── test525.scxml │ │ ├── test527.scxml │ │ ├── test528.scxml │ │ ├── test529.scxml │ │ ├── test530.scxml │ │ ├── test533.scxml │ │ ├── test550.scxml │ │ ├── test551.scxml │ │ ├── test552.scxml │ │ ├── test552.txt │ │ ├── test553.scxml │ │ ├── test554.scxml │ │ ├── test570.scxml │ │ ├── test576.scxml │ │ ├── test579.scxml │ │ └── test580.scxml │ └── optional/ │ ├── test193.scxml │ ├── test201.scxml │ ├── test278.scxml │ ├── test444.scxml │ ├── test445.scxml │ ├── test446.scxml │ ├── test446.txt │ ├── test448.scxml │ ├── test449.scxml │ ├── test451.scxml │ ├── test452.scxml │ ├── test453.scxml │ ├── test456.scxml │ ├── test457.scxml │ ├── test459.scxml │ ├── test460.scxml │ ├── test509.scxml │ ├── test510.scxml │ ├── test518.scxml │ ├── test519.scxml │ ├── test520.scxml │ ├── test522.scxml │ ├── test531.scxml │ ├── test532.scxml │ ├── test534.scxml │ ├── test557.scxml │ ├── test557.txt │ ├── test558.scxml │ ├── test558.txt │ ├── test560.scxml │ ├── test561.scxml │ ├── test562.scxml │ ├── test567.scxml │ ├── test569.scxml │ ├── test577.scxml │ └── test578.scxml ├── test_actions.py ├── test_api_contract.py ├── test_async.py ├── test_async_futures.py ├── test_callbacks.py ├── test_callbacks_isolation.py ├── test_class_listeners.py ├── test_conditions_algebra.py ├── test_configuration.py ├── test_contrib_diagram.py ├── test_contrib_timeout.py ├── test_copy.py ├── test_dispatcher.py ├── test_error_execution.py ├── test_events.py ├── test_examples.py ├── test_fellowship_quest.py ├── test_invoke.py ├── test_io.py ├── test_listener.py ├── test_mermaid_renderer.py ├── test_mixins.py ├── test_mock_compatibility.py ├── test_multiple_destinations.py ├── test_profiling.py ├── test_registry.py ├── test_rtc.py ├── test_scxml_units.py ├── test_signature.py ├── test_signature_positional_only.py ├── test_spec_parser.py ├── test_state.py ├── test_state_callbacks.py ├── test_statechart_compound.py ├── test_statechart_delayed.py ├── test_statechart_donedata.py ├── test_statechart_error.py ├── test_statechart_eventless.py ├── test_statechart_history.py ├── test_statechart_in_condition.py ├── test_statechart_parallel.py ├── test_statemachine.py ├── test_statemachine_bounded_transitions.py ├── test_statemachine_compat.py ├── test_statemachine_inheritance.py ├── test_threading.py ├── test_transition_list.py ├── test_transition_table.py ├── test_transitions.py ├── test_validators.py ├── test_weighted_transitions.py └── testcases/ ├── __init__.py ├── issue308.md ├── issue384_multiple_observers.md ├── issue449.md ├── test_issue434.py ├── test_issue480.py └── test_issue509.py