hap-cli 0.8.2__tar.gz → 0.8.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hap_cli-0.8.2 → hap_cli-0.8.3}/PKG-INFO +1 -1
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/__init__.py +1 -1
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/node_cmd.py +7 -3
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/flow_node.py +24 -8
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/record.py +14 -1
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_core.py +109 -11
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/PKG-INFO +1 -1
- {hap_cli-0.8.2 → hap_cli-0.8.3}/MANIFEST.in +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/README.md +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/__main__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/config.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/harness.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/smoke.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/app_live_tests/state.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/README.md +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/README_CN.md +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/app_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/app_editor_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/auth_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/calendar_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chart_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chat_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/chatbot_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/config_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/contact_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/department_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/group_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/icon_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/instance_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/optionset_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/page_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/post_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/record_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/region_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/role_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/upload_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/v3_registry.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/workflow_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/commands/worksheet_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/context.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/action_spec_adapter.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/app.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/auth.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/calendar_mod.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chart.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chat.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/chatbot.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/contact.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/control_type_codes.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/department.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/_hapmeta/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/_hapmeta/control_type_codes.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/apply.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/componentlower.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/editspec.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/errors.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/fieldlower.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/jsonschema_mini.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/models.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/ops.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/planner.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/editor/reader.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/field_normalizer.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/field_spec_adapter.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/filter_translator.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/global_meta.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/group.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/icon_index.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/instance.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/logger.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/optionset.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/page.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/post.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/response_crypto.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/role.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/role_perm_builder.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/session.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/token_crypto.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/upload.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/dispatcher.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/render.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/v3/schema.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/view_spec_adapter.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/workflow.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/workflow_node_dsl.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/worksheet.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/core/worksheet_templates.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/hap_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/i18n.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/messages.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/locale/messages.schema.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/conftest.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_editor.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_export_usage.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_app_restore.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_auth_prerelease.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_bug_036430.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_chart.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_config_cmd.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_destructive_confirm_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_full_e2e.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_global_meta.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_i18n.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_approval.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_approval_actions.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_calendar.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_destructive.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_misc.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_post.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_social.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_v3.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_workflow.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_integration_worksheet_extra.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_multi_profile.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_approval_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_id_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_org_id_docs.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_parameter_conventions.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_parameter_mapping_registry.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_record_batch_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_record_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_semantic_types_registry.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_api_schema_loader.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_dispatcher.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_registry_coverage.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_session.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_v3_yaml_translation.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_workflow_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_worksheet_crud_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/tests/test_worksheet_v3_semantic_cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/formatting.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/options.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli/utils/parameter_mapping.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/SOURCES.txt +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/dependency_links.txt +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/entry_points.txt +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/requires.txt +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/hap_cli.egg-info/top_level.txt +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/__main__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/_wftest.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/charts.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/cleanup.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/compiler.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/config.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/errors.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/executor.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/fields.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/hap.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/console.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/jsonl.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/mirror.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/recording/report.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/schema.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/__init__.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/cli.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/executor.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/seed/template.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/selftest.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/smoke.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/step.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/steps.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/store.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/live_tests/workflow_dsl.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/setup.cfg +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/setup.py +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/INDEX.json +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/add_member_to_role.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/batch_delete_records.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/create_optionset.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/create_role.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_optionset.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_record.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_role.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/delete_worksheet.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_info.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_knowledge_list.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_app_worksheets_list.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_optionset_list.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_details.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_discussions.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_list.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_logs.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_pivot_data.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_relations.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_record_share_link.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_regions.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_role_details.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/get_role_list.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/knowledge_search.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/leave_all_roles.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/remove_member_from_role.yaml +0 -0
- {hap_cli-0.8.2 → hap_cli-0.8.3}/sources/v3-api-schema/update_optionset.yaml +0 -0
|
@@ -372,12 +372,16 @@ def node_form_property(ctx, process_id, node_id):
|
|
|
372
372
|
|
|
373
373
|
@node.command("sub-processes")
|
|
374
374
|
@click.argument("process_id")
|
|
375
|
+
@click.argument("node_id")
|
|
375
376
|
@pass_context
|
|
376
|
-
def node_sub_processes(ctx, process_id):
|
|
377
|
-
"""List available sub-
|
|
377
|
+
def node_sub_processes(ctx, process_id, node_id):
|
|
378
|
+
"""List sub-processes available to a sub-process node.
|
|
379
|
+
|
|
380
|
+
NODE_ID is the node being configured.
|
|
381
|
+
"""
|
|
378
382
|
try:
|
|
379
383
|
session = ctx.get_session()
|
|
380
|
-
data = node_mod.get_sub_process_list(session, process_id)
|
|
384
|
+
data = node_mod.get_sub_process_list(session, process_id, select_node_id=node_id)
|
|
381
385
|
ctx.output(data, lambda d: output_json(d))
|
|
382
386
|
except Exception as e:
|
|
383
387
|
ctx.handle_error(e)
|
|
@@ -274,7 +274,9 @@ def get_node_detail(
|
|
|
274
274
|
data["appId"] = app_id
|
|
275
275
|
if instance_id:
|
|
276
276
|
data["instanceId"] = instance_id
|
|
277
|
-
|
|
277
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
278
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
279
|
+
return session.workflow_call("flowNode/getNodeDetail", data, method="GET")
|
|
278
280
|
|
|
279
281
|
|
|
280
282
|
# ── Node Update ──────────────────────────────────────────────────────────
|
|
@@ -572,7 +574,9 @@ def get_webhook_data(
|
|
|
572
574
|
data: dict[str, Any] = {"processId": process_id, "nodeId": node_id}
|
|
573
575
|
if select_node_id:
|
|
574
576
|
data["selectNodeId"] = select_node_id
|
|
575
|
-
|
|
577
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
578
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
579
|
+
return session.workflow_call("flowNode/getWebHookData", data, method="GET")
|
|
576
580
|
|
|
577
581
|
|
|
578
582
|
# ── Utilities ────────────────────────────────────────────────────────────
|
|
@@ -617,7 +621,9 @@ def get_node_form_property(
|
|
|
617
621
|
data: dict[str, Any] = {"processId": process_id, "nodeId": node_id}
|
|
618
622
|
if select_node_id:
|
|
619
623
|
data["selectNodeId"] = select_node_id
|
|
620
|
-
|
|
624
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
625
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
626
|
+
return session.workflow_call("flowNode/getNodeFormProperty", data, method="GET")
|
|
621
627
|
|
|
622
628
|
|
|
623
629
|
def get_sub_process_list(
|
|
@@ -630,7 +636,9 @@ def get_sub_process_list(
|
|
|
630
636
|
Args:
|
|
631
637
|
session: Active session
|
|
632
638
|
process_id: Process ID
|
|
633
|
-
select_node_id: Context node
|
|
639
|
+
select_node_id: Context node. flowNode.js marks ``selectNodeId``
|
|
640
|
+
as required (``*选中节点ID``); omitting it makes the server
|
|
641
|
+
answer code 2000 "节点不存在".
|
|
634
642
|
|
|
635
643
|
Returns:
|
|
636
644
|
Sub-process list
|
|
@@ -638,7 +646,9 @@ def get_sub_process_list(
|
|
|
638
646
|
data: dict[str, Any] = {"processId": process_id}
|
|
639
647
|
if select_node_id:
|
|
640
648
|
data["selectNodeId"] = select_node_id
|
|
641
|
-
|
|
649
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
650
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
651
|
+
return session.workflow_call("flowNode/getSubProcessList", data, method="GET")
|
|
642
652
|
|
|
643
653
|
|
|
644
654
|
# ── Code Templates ───────────────────────────────────────────────────────
|
|
@@ -672,7 +682,9 @@ def get_code_template_list(
|
|
|
672
682
|
data["source"] = source
|
|
673
683
|
if template_type:
|
|
674
684
|
data["type"] = template_type
|
|
675
|
-
|
|
685
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
686
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
687
|
+
return session.workflow_call("flowNode/getCodeTemplateList", data, method="GET")
|
|
676
688
|
|
|
677
689
|
|
|
678
690
|
def create_code_template(
|
|
@@ -774,7 +786,9 @@ def get_flow_app_dtos(
|
|
|
774
786
|
data["enumDefault"] = enum_default
|
|
775
787
|
if field_type:
|
|
776
788
|
data["type"] = field_type
|
|
777
|
-
|
|
789
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
790
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
791
|
+
return session.workflow_call("flowNode/getFlowAppDtos", data, method="GET")
|
|
778
792
|
|
|
779
793
|
|
|
780
794
|
def get_start_event_deploy(
|
|
@@ -809,7 +823,9 @@ def get_start_event_deploy(
|
|
|
809
823
|
data["controlId"] = control_id
|
|
810
824
|
if select_node_id:
|
|
811
825
|
data["selectNodeId"] = select_node_id
|
|
812
|
-
|
|
826
|
+
# Evidence: pd-openweb flowNode.js pins ``base.ajaxOptions.type = 'GET'``
|
|
827
|
+
# for this action; POSTing it returns 404 Not Found.
|
|
828
|
+
return session.workflow_call("flowNode/getStartEventDeploy", data, method="GET")
|
|
813
829
|
|
|
814
830
|
|
|
815
831
|
# ── Data Processing Convenience Functions ────────────────────────────────
|
|
@@ -56,13 +56,26 @@ def _legacy_cell_value(ctrl: dict[str, Any], value: Any) -> str:
|
|
|
56
56
|
if t == 10: # MULTI_SELECT
|
|
57
57
|
return json.dumps(_resolve_option_keys(ctrl, value), ensure_ascii=False)
|
|
58
58
|
|
|
59
|
-
if t
|
|
59
|
+
if t in (29, 35): # RELATE_SHEET / CASCADING_SELECT -> [{"sid": rowId}, ...]
|
|
60
|
+
# Cascade (35) is a relation to a row in another worksheet, persisted
|
|
61
|
+
# the same way as a plain relate (29): an array of {"sid": rowId}. A
|
|
62
|
+
# bare rowId makes the server answer "服务异常" (bug #642cc8).
|
|
60
63
|
if isinstance(value, (list, tuple)):
|
|
61
64
|
ids = [str(v) for v in value]
|
|
62
65
|
else:
|
|
63
66
|
ids = [s for s in str(value).split(",") if s != ""]
|
|
64
67
|
return json.dumps([{"sid": rid} for rid in ids], ensure_ascii=False)
|
|
65
68
|
|
|
69
|
+
if t == 48: # ORG_ROLE -> [{"organizeId": id}, ...]
|
|
70
|
+
# Mirrors DEPARTMENT (27): the legacy AddWorksheetRow takes an array
|
|
71
|
+
# of {"organizeId": id} objects; organizeName is display-only and the
|
|
72
|
+
# server resolves it from the id. A bare organizeId is rejected with
|
|
73
|
+
# "服务异常" (bug #642cc8). See pd-openweb CellControls/OrgRole.jsx.
|
|
74
|
+
ids = value if isinstance(value, (list, tuple)) else \
|
|
75
|
+
[s for s in str(value).split(",") if s != ""]
|
|
76
|
+
return json.dumps([{"organizeId": str(i)} for i in ids],
|
|
77
|
+
ensure_ascii=False)
|
|
78
|
+
|
|
66
79
|
if t == 26: # USER_PICKER
|
|
67
80
|
ids = value if isinstance(value, (list, tuple)) else \
|
|
68
81
|
[s for s in str(value).split(",") if s != ""]
|
|
@@ -486,6 +486,38 @@ class TestRecord:
|
|
|
486
486
|
# endpoint is the legacy AddWorksheetRow
|
|
487
487
|
assert mock_post.call_args[0][0].endswith("/Worksheet/AddWorksheetRow")
|
|
488
488
|
|
|
489
|
+
@patch("hap_cli.core.worksheet.get_worksheet_controls")
|
|
490
|
+
@patch("hap_cli.core.session.requests.post")
|
|
491
|
+
def test_legacy_batch_create_serializes_orgrole_and_cascade(
|
|
492
|
+
self, mock_post, mock_controls, mock_session
|
|
493
|
+
):
|
|
494
|
+
# Org-role (48) and cascading-select (35) cells must be wrapped in
|
|
495
|
+
# the wire shapes the legacy AddWorksheetRow expects — a bare id
|
|
496
|
+
# makes the server answer "服务异常". OrgRole -> [{"organizeId": id}];
|
|
497
|
+
# Cascade is a relation-to-a-row -> [{"sid": rowId}] (like type 29).
|
|
498
|
+
mock_controls.return_value = [
|
|
499
|
+
{"controlId": "cOrg", "controlName": "组织角色", "type": 48,
|
|
500
|
+
"dot": 0},
|
|
501
|
+
{"controlId": "cCas", "controlName": "级联选择", "type": 35,
|
|
502
|
+
"dot": 0},
|
|
503
|
+
]
|
|
504
|
+
mock_post.return_value = _mock_response({"rowid": "r_new"})
|
|
505
|
+
|
|
506
|
+
rec_mod.batch_create_by_name(
|
|
507
|
+
mock_session,
|
|
508
|
+
"ws1",
|
|
509
|
+
[{
|
|
510
|
+
"组织角色": "40d102b2-12bc-48d2-9364-f57070502609",
|
|
511
|
+
"级联选择": "97ebc5ba-4d57",
|
|
512
|
+
}],
|
|
513
|
+
)
|
|
514
|
+
|
|
515
|
+
rc = {c["controlId"]: c
|
|
516
|
+
for c in mock_post.call_args[1]["json"]["receiveControls"]}
|
|
517
|
+
assert json.loads(rc["cOrg"]["value"]) == [
|
|
518
|
+
{"organizeId": "40d102b2-12bc-48d2-9364-f57070502609"}]
|
|
519
|
+
assert json.loads(rc["cCas"]["value"]) == [{"sid": "97ebc5ba-4d57"}]
|
|
520
|
+
|
|
489
521
|
@patch("hap_cli.core.worksheet.get_worksheet_controls")
|
|
490
522
|
@patch("hap_cli.core.session.requests.post")
|
|
491
523
|
def test_cli_batch_create_uses_main_api(
|
|
@@ -899,10 +931,18 @@ class TestFlowNode:
|
|
|
899
931
|
assert not mock_post.called, "flowNode/get must not be POSTed"
|
|
900
932
|
assert "startId" in result
|
|
901
933
|
|
|
934
|
+
@patch("hap_cli.core.session.requests.get")
|
|
902
935
|
@patch("hap_cli.core.session.requests.post")
|
|
903
|
-
def test_get_node_detail(self, mock_post, mock_session):
|
|
904
|
-
|
|
936
|
+
def test_get_node_detail(self, mock_post, mock_get, mock_session):
|
|
937
|
+
"""``flowNode/getNodeDetail`` is GET per ``flowNode.js`` (pins
|
|
938
|
+
``base.ajaxOptions.type = 'GET'``). POSTing returns 404."""
|
|
939
|
+
mock_get.return_value = _mock_response({"nodeId": "n1", "flowNodeType": 4})
|
|
905
940
|
result = node_mod.get_node_detail(mock_session, "wf1", "n1")
|
|
941
|
+
assert mock_get.called, "flowNode/getNodeDetail must be issued as GET"
|
|
942
|
+
assert not mock_post.called
|
|
943
|
+
params = mock_get.call_args[1]["params"]
|
|
944
|
+
assert params["processId"] == "wf1"
|
|
945
|
+
assert params["nodeId"] == "n1"
|
|
906
946
|
assert result["flowNodeType"] == 4
|
|
907
947
|
|
|
908
948
|
@patch("hap_cli.core.session.requests.post")
|
|
@@ -972,12 +1012,18 @@ class TestFlowNode:
|
|
|
972
1012
|
body = mock_post.call_args[1]["json"]
|
|
973
1013
|
assert body["json"] == '{"name": "test"}'
|
|
974
1014
|
|
|
1015
|
+
@patch("hap_cli.core.session.requests.get")
|
|
975
1016
|
@patch("hap_cli.core.session.requests.post")
|
|
976
|
-
def test_get_code_template_list(self, mock_post, mock_session):
|
|
977
|
-
|
|
1017
|
+
def test_get_code_template_list(self, mock_post, mock_get, mock_session):
|
|
1018
|
+
"""``flowNode/getCodeTemplateList`` is GET per ``flowNode.js``.
|
|
1019
|
+
POSTing returns 404."""
|
|
1020
|
+
mock_get.return_value = _mock_response([{"id": "t1", "name": "Template1"}])
|
|
978
1021
|
result = node_mod.get_code_template_list(mock_session, keyword="test")
|
|
979
|
-
|
|
980
|
-
assert
|
|
1022
|
+
assert mock_get.called, "flowNode/getCodeTemplateList must be issued as GET"
|
|
1023
|
+
assert not mock_post.called
|
|
1024
|
+
params = mock_get.call_args[1]["params"]
|
|
1025
|
+
assert params["keyword"] == "test"
|
|
1026
|
+
assert result[0]["id"] == "t1"
|
|
981
1027
|
|
|
982
1028
|
@patch("hap_cli.core.session.requests.post")
|
|
983
1029
|
def test_create_code_template(self, mock_post, mock_session):
|
|
@@ -987,12 +1033,64 @@ class TestFlowNode:
|
|
|
987
1033
|
assert body["name"] == "My Tmpl"
|
|
988
1034
|
assert body["code"] == "console.log('hi')"
|
|
989
1035
|
|
|
1036
|
+
@patch("hap_cli.core.session.requests.get")
|
|
990
1037
|
@patch("hap_cli.core.session.requests.post")
|
|
991
|
-
def test_get_sub_process_list(self, mock_post, mock_session):
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
1038
|
+
def test_get_sub_process_list(self, mock_post, mock_get, mock_session):
|
|
1039
|
+
"""``flowNode/getSubProcessList`` is GET per ``flowNode.js``.
|
|
1040
|
+
POSTing returns 404."""
|
|
1041
|
+
mock_get.return_value = _mock_response([{"id": "sub1"}])
|
|
1042
|
+
result = node_mod.get_sub_process_list(mock_session, "wf1", select_node_id="n1")
|
|
1043
|
+
assert mock_get.called, "flowNode/getSubProcessList must be issued as GET"
|
|
1044
|
+
assert not mock_post.called
|
|
1045
|
+
params = mock_get.call_args[1]["params"]
|
|
1046
|
+
assert params["processId"] == "wf1"
|
|
1047
|
+
# selectNodeId is required by the server (code 2000 without it)
|
|
1048
|
+
assert params["selectNodeId"] == "n1"
|
|
1049
|
+
assert result[0]["id"] == "sub1"
|
|
1050
|
+
|
|
1051
|
+
@patch("hap_cli.core.session.requests.get")
|
|
1052
|
+
@patch("hap_cli.core.session.requests.post")
|
|
1053
|
+
def test_get_node_form_property(self, mock_post, mock_get, mock_session):
|
|
1054
|
+
"""``flowNode/getNodeFormProperty`` is GET per ``flowNode.js``.
|
|
1055
|
+
POSTing returns 404."""
|
|
1056
|
+
mock_get.return_value = _mock_response({"controls": []})
|
|
1057
|
+
result = node_mod.get_node_form_property(mock_session, "wf1", "n1")
|
|
1058
|
+
assert mock_get.called, "flowNode/getNodeFormProperty must be issued as GET"
|
|
1059
|
+
assert not mock_post.called
|
|
1060
|
+
params = mock_get.call_args[1]["params"]
|
|
1061
|
+
assert params["processId"] == "wf1"
|
|
1062
|
+
assert params["nodeId"] == "n1"
|
|
1063
|
+
assert "controls" in result
|
|
1064
|
+
|
|
1065
|
+
@patch("hap_cli.core.session.requests.get")
|
|
1066
|
+
@patch("hap_cli.core.session.requests.post")
|
|
1067
|
+
def test_get_webhook_data_uses_get(self, mock_post, mock_get, mock_session):
|
|
1068
|
+
"""``flowNode/getWebHookData`` is GET per ``flowNode.js``.
|
|
1069
|
+
POSTing returns 404."""
|
|
1070
|
+
mock_get.return_value = _mock_response({"data": "{}"})
|
|
1071
|
+
node_mod.get_webhook_data(mock_session, "wf1", "n1")
|
|
1072
|
+
assert mock_get.called, "flowNode/getWebHookData must be issued as GET"
|
|
1073
|
+
assert not mock_post.called
|
|
1074
|
+
|
|
1075
|
+
@patch("hap_cli.core.session.requests.get")
|
|
1076
|
+
@patch("hap_cli.core.session.requests.post")
|
|
1077
|
+
def test_get_flow_app_dtos_uses_get(self, mock_post, mock_get, mock_session):
|
|
1078
|
+
"""``flowNode/getFlowAppDtos`` is GET per ``flowNode.js``.
|
|
1079
|
+
POSTing returns 404."""
|
|
1080
|
+
mock_get.return_value = _mock_response([{"id": "app1"}])
|
|
1081
|
+
node_mod.get_flow_app_dtos(mock_session, "wf1", "n1")
|
|
1082
|
+
assert mock_get.called, "flowNode/getFlowAppDtos must be issued as GET"
|
|
1083
|
+
assert not mock_post.called
|
|
1084
|
+
|
|
1085
|
+
@patch("hap_cli.core.session.requests.get")
|
|
1086
|
+
@patch("hap_cli.core.session.requests.post")
|
|
1087
|
+
def test_get_start_event_deploy_uses_get(self, mock_post, mock_get, mock_session):
|
|
1088
|
+
"""``flowNode/getStartEventDeploy`` is GET per ``flowNode.js``.
|
|
1089
|
+
POSTing returns 404."""
|
|
1090
|
+
mock_get.return_value = _mock_response({"processId": "wf1"})
|
|
1091
|
+
node_mod.get_start_event_deploy(mock_session, "wf1", "n1")
|
|
1092
|
+
assert mock_get.called, "flowNode/getStartEventDeploy must be issued as GET"
|
|
1093
|
+
assert not mock_post.called
|
|
996
1094
|
|
|
997
1095
|
@patch("hap_cli.core.session.requests.post")
|
|
998
1096
|
def test_add_node_with_action_id(self, mock_post, mock_session):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/component.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/custom-action.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/envelope.schema.json
RENAMED
|
File without changes
|
{hap_cli-0.8.2 → hap_cli-0.8.3}/skills/hap-cli-app-editor/scripts/editspec/field.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|