diff --git a/.openapi-generator-ignore b/.openapi-generator-ignore index cd141f7..ef9f034 100755 --- a/.openapi-generator-ignore +++ b/.openapi-generator-ignore @@ -11,3 +11,5 @@ README.md .gitignore setup.py regula/documentreader/webclient/__init__.py +pyproject.toml +.github/workflows/python.yml diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index 8093789..ed84c6f 100755 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -6,6 +6,7 @@ regula/documentreader/webclient/gen/api/healthcheck_api.py regula/documentreader/webclient/gen/api/process_api.py regula/documentreader/webclient/gen/api/transaction_api.py regula/documentreader/webclient/gen/api_client.py +regula/documentreader/webclient/gen/api_response.py regula/documentreader/webclient/gen/configuration.py regula/documentreader/webclient/gen/exceptions.py regula/documentreader/webclient/gen/models/__init__.py @@ -13,21 +14,27 @@ regula/documentreader/webclient/gen/models/area_array.py regula/documentreader/webclient/gen/models/area_container.py regula/documentreader/webclient/gen/models/auth_params.py regula/documentreader/webclient/gen/models/authenticity_check_list.py +regula/documentreader/webclient/gen/models/authenticity_check_list_item.py regula/documentreader/webclient/gen/models/authenticity_check_result.py regula/documentreader/webclient/gen/models/authenticity_check_result_item.py +regula/documentreader/webclient/gen/models/authenticity_check_result_list_inner.py regula/documentreader/webclient/gen/models/authenticity_result.py -regula/documentreader/webclient/gen/models/authenticity_result_all_of.py regula/documentreader/webclient/gen/models/authenticity_result_type.py +regula/documentreader/webclient/gen/models/bar_code_module_type.py +regula/documentreader/webclient/gen/models/barcode_type.py regula/documentreader/webclient/gen/models/bc_pdf417_info.py regula/documentreader/webclient/gen/models/bc_roidetect.py +regula/documentreader/webclient/gen/models/binary_data.py +regula/documentreader/webclient/gen/models/byte_array_item.py regula/documentreader/webclient/gen/models/byte_array_result.py -regula/documentreader/webclient/gen/models/byte_array_result_all_of.py +regula/documentreader/webclient/gen/models/candidates_list_item.py +regula/documentreader/webclient/gen/models/certificate_data.py regula/documentreader/webclient/gen/models/check_diagnose.py regula/documentreader/webclient/gen/models/check_result.py regula/documentreader/webclient/gen/models/chosen_document_type.py regula/documentreader/webclient/gen/models/chosen_document_type_result.py -regula/documentreader/webclient/gen/models/chosen_document_type_result_all_of.py regula/documentreader/webclient/gen/models/container_list.py +regula/documentreader/webclient/gen/models/container_list_list_inner.py regula/documentreader/webclient/gen/models/critical.py regula/documentreader/webclient/gen/models/cross_source_value_comparison.py regula/documentreader/webclient/gen/models/data_module.py @@ -35,86 +42,103 @@ regula/documentreader/webclient/gen/models/details_optical.py regula/documentreader/webclient/gen/models/details_rfid.py regula/documentreader/webclient/gen/models/device_info.py regula/documentreader/webclient/gen/models/doc_bar_code_info.py -regula/documentreader/webclient/gen/models/doc_bar_code_info_all_of.py regula/documentreader/webclient/gen/models/doc_bar_code_info_fields_list.py +regula/documentreader/webclient/gen/models/doc_bar_code_info_item.py +regula/documentreader/webclient/gen/models/doc_graphics_info_item.py regula/documentreader/webclient/gen/models/doc_visual_extended_field.py +regula/documentreader/webclient/gen/models/doc_visual_extended_field_item.py regula/documentreader/webclient/gen/models/doc_visual_extended_info.py +regula/documentreader/webclient/gen/models/doc_visual_extended_info_item.py +regula/documentreader/webclient/gen/models/document_binary_info_result.py regula/documentreader/webclient/gen/models/document_format.py regula/documentreader/webclient/gen/models/document_image.py regula/documentreader/webclient/gen/models/document_image_result.py -regula/documentreader/webclient/gen/models/document_image_result_all_of.py regula/documentreader/webclient/gen/models/document_position.py +regula/documentreader/webclient/gen/models/document_position_item.py regula/documentreader/webclient/gen/models/document_position_result.py -regula/documentreader/webclient/gen/models/document_position_result_all_of.py regula/documentreader/webclient/gen/models/document_type.py regula/documentreader/webclient/gen/models/document_type_recognition_result.py regula/documentreader/webclient/gen/models/document_types_candidates.py regula/documentreader/webclient/gen/models/document_types_candidates_list.py regula/documentreader/webclient/gen/models/document_types_candidates_result.py -regula/documentreader/webclient/gen/models/document_types_candidates_result_all_of.py regula/documentreader/webclient/gen/models/documents_database.py +regula/documentreader/webclient/gen/models/encrypted_rcl_item.py regula/documentreader/webclient/gen/models/encrypted_rcl_result.py -regula/documentreader/webclient/gen/models/encrypted_rcl_result_all_of.py +regula/documentreader/webclient/gen/models/error_coordinates.py regula/documentreader/webclient/gen/models/face_api.py regula/documentreader/webclient/gen/models/face_api_search.py +regula/documentreader/webclient/gen/models/face_detection.py +regula/documentreader/webclient/gen/models/face_detection_item.py +regula/documentreader/webclient/gen/models/face_detection_result.py +regula/documentreader/webclient/gen/models/face_item.py regula/documentreader/webclient/gen/models/fdsid_list.py +regula/documentreader/webclient/gen/models/fiber_item.py regula/documentreader/webclient/gen/models/fiber_result.py -regula/documentreader/webclient/gen/models/fiber_result_all_of.py +regula/documentreader/webclient/gen/models/field_item.py +regula/documentreader/webclient/gen/models/file_image.py regula/documentreader/webclient/gen/models/get_transactions_by_tag_response.py +regula/documentreader/webclient/gen/models/graph_data.py regula/documentreader/webclient/gen/models/graphic_field.py regula/documentreader/webclient/gen/models/graphic_field_type.py regula/documentreader/webclient/gen/models/graphic_fields_list.py regula/documentreader/webclient/gen/models/graphics_result.py -regula/documentreader/webclient/gen/models/graphics_result_all_of.py regula/documentreader/webclient/gen/models/healthcheck.py regula/documentreader/webclient/gen/models/healthcheck_documents_database.py +regula/documentreader/webclient/gen/models/ident_item.py regula/documentreader/webclient/gen/models/ident_result.py -regula/documentreader/webclient/gen/models/ident_result_all_of.py regula/documentreader/webclient/gen/models/image_data.py regula/documentreader/webclient/gen/models/image_qa.py regula/documentreader/webclient/gen/models/image_quality_check.py regula/documentreader/webclient/gen/models/image_quality_check_list.py +regula/documentreader/webclient/gen/models/image_quality_check_list_item.py regula/documentreader/webclient/gen/models/image_quality_check_type.py regula/documentreader/webclient/gen/models/image_quality_result.py -regula/documentreader/webclient/gen/models/image_quality_result_all_of.py regula/documentreader/webclient/gen/models/image_transaction_data.py regula/documentreader/webclient/gen/models/images.py regula/documentreader/webclient/gen/models/images_available_source.py regula/documentreader/webclient/gen/models/images_field.py regula/documentreader/webclient/gen/models/images_field_value.py +regula/documentreader/webclient/gen/models/images_item.py regula/documentreader/webclient/gen/models/images_result.py -regula/documentreader/webclient/gen/models/images_result_all_of.py regula/documentreader/webclient/gen/models/in_data.py regula/documentreader/webclient/gen/models/in_data_transaction_images_field_value.py regula/documentreader/webclient/gen/models/in_data_video.py -regula/documentreader/webclient/gen/models/inline_response200.py -regula/documentreader/webclient/gen/models/inline_response2001.py regula/documentreader/webclient/gen/models/input_barcode_type.py regula/documentreader/webclient/gen/models/input_image_quality_checks.py regula/documentreader/webclient/gen/models/lcid.py regula/documentreader/webclient/gen/models/lexical_analysis_result.py -regula/documentreader/webclient/gen/models/lexical_analysis_result_all_of.py +regula/documentreader/webclient/gen/models/license_item.py regula/documentreader/webclient/gen/models/license_result.py -regula/documentreader/webclient/gen/models/license_result_all_of.py regula/documentreader/webclient/gen/models/light.py regula/documentreader/webclient/gen/models/list_transactions_by_tag_response.py regula/documentreader/webclient/gen/models/list_verified_fields.py +regula/documentreader/webclient/gen/models/list_verified_fields_item.py regula/documentreader/webclient/gen/models/liveness_params.py regula/documentreader/webclient/gen/models/log_level.py regula/documentreader/webclient/gen/models/measure_system.py regula/documentreader/webclient/gen/models/mrz_detect_mode_enum.py +regula/documentreader/webclient/gen/models/mrz_detector_result.py regula/documentreader/webclient/gen/models/mrz_format.py +regula/documentreader/webclient/gen/models/mrz_position.py +regula/documentreader/webclient/gen/models/mrz_position_item.py +regula/documentreader/webclient/gen/models/mrz_position_result.py +regula/documentreader/webclient/gen/models/mrz_rows_item.py +regula/documentreader/webclient/gen/models/mrz_test_quality.py +regula/documentreader/webclient/gen/models/mrz_test_quality_item.py +regula/documentreader/webclient/gen/models/mrz_test_quality_result.py +regula/documentreader/webclient/gen/models/ocr_security_text_item.py regula/documentreader/webclient/gen/models/ocr_security_text_result.py -regula/documentreader/webclient/gen/models/ocr_security_text_result_all_of.py regula/documentreader/webclient/gen/models/one_candidate.py +regula/documentreader/webclient/gen/models/one_candidate_item.py regula/documentreader/webclient/gen/models/original_symbol.py regula/documentreader/webclient/gen/models/out_data.py regula/documentreader/webclient/gen/models/out_data_transaction_images_field_value.py regula/documentreader/webclient/gen/models/p_array_field.py +regula/documentreader/webclient/gen/models/parsed_data.py regula/documentreader/webclient/gen/models/parsing_notification_codes.py regula/documentreader/webclient/gen/models/per_document_config.py +regula/documentreader/webclient/gen/models/photo_ident_item.py regula/documentreader/webclient/gen/models/photo_ident_result.py -regula/documentreader/webclient/gen/models/photo_ident_result_all_of.py regula/documentreader/webclient/gen/models/point.py regula/documentreader/webclient/gen/models/point_array.py regula/documentreader/webclient/gen/models/points_container.py @@ -125,39 +149,91 @@ regula/documentreader/webclient/gen/models/process_request_image.py regula/documentreader/webclient/gen/models/process_response.py regula/documentreader/webclient/gen/models/process_system_info.py regula/documentreader/webclient/gen/models/processing_status.py +regula/documentreader/webclient/gen/models/raw_image_container_item.py regula/documentreader/webclient/gen/models/raw_image_container_list.py regula/documentreader/webclient/gen/models/rectangle_coordinates.py regula/documentreader/webclient/gen/models/result.py regula/documentreader/webclient/gen/models/result_item.py +regula/documentreader/webclient/gen/models/result_mrz_detector.py +regula/documentreader/webclient/gen/models/result_mrz_detector_item.py +regula/documentreader/webclient/gen/models/rfid_a_chip.py +regula/documentreader/webclient/gen/models/rfid_access_control_info.py +regula/documentreader/webclient/gen/models/rfid_access_control_procedure_type.py +regula/documentreader/webclient/gen/models/rfid_access_key.py +regula/documentreader/webclient/gen/models/rfid_application.py +regula/documentreader/webclient/gen/models/rfid_application_type.py +regula/documentreader/webclient/gen/models/rfid_attribute_data.py +regula/documentreader/webclient/gen/models/rfid_attribute_name.py +regula/documentreader/webclient/gen/models/rfid_authentication_procedure_type.py +regula/documentreader/webclient/gen/models/rfid_baud_rate.py +regula/documentreader/webclient/gen/models/rfid_card_properties_ext.py +regula/documentreader/webclient/gen/models/rfid_certificate_ex.py +regula/documentreader/webclient/gen/models/rfid_certificate_origin.py +regula/documentreader/webclient/gen/models/rfid_certificate_type.py +regula/documentreader/webclient/gen/models/rfid_data_file.py +regula/documentreader/webclient/gen/models/rfid_data_file_type.py +regula/documentreader/webclient/gen/models/rfid_data_group_type_tag.py +regula/documentreader/webclient/gen/models/rfid_dg1.py +regula/documentreader/webclient/gen/models/rfid_distinguished_name.py +regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field.py +regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field_item.py +regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info.py +regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info_item.py +regula/documentreader/webclient/gen/models/rfid_error_codes.py +regula/documentreader/webclient/gen/models/rfid_graphics_info_result.py regula/documentreader/webclient/gen/models/rfid_location.py regula/documentreader/webclient/gen/models/rfid_origin.py +regula/documentreader/webclient/gen/models/rfid_password_type.py +regula/documentreader/webclient/gen/models/rfid_pki_extension.py +regula/documentreader/webclient/gen/models/rfid_raw_data.py +regula/documentreader/webclient/gen/models/rfid_security_object.py +regula/documentreader/webclient/gen/models/rfid_session_data.py +regula/documentreader/webclient/gen/models/rfid_signer_info_ex.py +regula/documentreader/webclient/gen/models/rfid_terminal.py +regula/documentreader/webclient/gen/models/rfid_terminal_type.py +regula/documentreader/webclient/gen/models/rfid_text_data_result.py +regula/documentreader/webclient/gen/models/rfid_type.py +regula/documentreader/webclient/gen/models/rfid_validity.py +regula/documentreader/webclient/gen/models/rfidpkd_resource_type.py regula/documentreader/webclient/gen/models/scenario.py +regula/documentreader/webclient/gen/models/security_feature_item.py regula/documentreader/webclient/gen/models/security_feature_result.py -regula/documentreader/webclient/gen/models/security_feature_result_all_of.py regula/documentreader/webclient/gen/models/security_feature_type.py +regula/documentreader/webclient/gen/models/security_object_certificates.py regula/documentreader/webclient/gen/models/source.py regula/documentreader/webclient/gen/models/source_validity.py regula/documentreader/webclient/gen/models/status.py +regula/documentreader/webclient/gen/models/status_item.py regula/documentreader/webclient/gen/models/status_result.py -regula/documentreader/webclient/gen/models/status_result_all_of.py +regula/documentreader/webclient/gen/models/string_item.py regula/documentreader/webclient/gen/models/string_recognition_result.py +regula/documentreader/webclient/gen/models/symbol.py regula/documentreader/webclient/gen/models/symbol_candidate.py +regula/documentreader/webclient/gen/models/symbol_estimation_item.py regula/documentreader/webclient/gen/models/symbol_recognition_result.py +regula/documentreader/webclient/gen/models/t_doc_binary_info.py +regula/documentreader/webclient/gen/models/t_doc_binary_info_item.py +regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info.py +regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info_item.py regula/documentreader/webclient/gen/models/text.py regula/documentreader/webclient/gen/models/text_available_source.py regula/documentreader/webclient/gen/models/text_data_result.py -regula/documentreader/webclient/gen/models/text_data_result_all_of.py regula/documentreader/webclient/gen/models/text_field.py regula/documentreader/webclient/gen/models/text_field_type.py regula/documentreader/webclient/gen/models/text_field_value.py +regula/documentreader/webclient/gen/models/text_item.py regula/documentreader/webclient/gen/models/text_post_processing.py regula/documentreader/webclient/gen/models/text_result.py -regula/documentreader/webclient/gen/models/text_result_all_of.py regula/documentreader/webclient/gen/models/transaction_image.py regula/documentreader/webclient/gen/models/transaction_info.py regula/documentreader/webclient/gen/models/transaction_process_get_response.py regula/documentreader/webclient/gen/models/transaction_process_request.py +regula/documentreader/webclient/gen/models/transaction_process_result.py +regula/documentreader/webclient/gen/models/trf_ft_bytes.py +regula/documentreader/webclient/gen/models/trf_ft_string.py regula/documentreader/webclient/gen/models/verification_result.py regula/documentreader/webclient/gen/models/verified_field_map.py regula/documentreader/webclient/gen/models/visibility.py +regula/documentreader/webclient/gen/models/visual_extended_field_item.py +regula/documentreader/webclient/gen/py.typed regula/documentreader/webclient/gen/rest.py diff --git a/.openapi-generator/VERSION b/.openapi-generator/VERSION index 28cbf7c..5f84a81 100755 --- a/.openapi-generator/VERSION +++ b/.openapi-generator/VERSION @@ -1 +1 @@ -5.0.0 \ No newline at end of file +7.12.0 diff --git a/Pipfile b/Pipfile index b93bfce..9143252 100755 --- a/Pipfile +++ b/Pipfile @@ -6,11 +6,13 @@ name = "pypi" [packages] certifi = ">=2024.07.04" six = ">=1.10" -python-dateutil = ">=2.5.3" -urllib3 = ">=1.26.19" +python-dateutil = ">=2.8.2" +urllib3 = ">=1.25.3, <3.0.0" vistir = ">=0.4.0, <=0.6.1" idna = "==3.7" requests = ">=2.32.3" +pydantic = ">=2" +typing-extensions = ">=4.7.1" [dev-packages] setuptools = "==74.1.1" @@ -18,6 +20,8 @@ wheel = "*" twine = "*" chardet = "*" packaging = ">=22.0" +types-python-dateutil = ">=2.8.19.14" +mypy = ">=1.5" [requires] python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index 643280e..01c49c2 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "fad756fcd8e239cc9f1d1bf190997e996038e7782915b3a57c84e9fe891e455f" + "sha256": "cf7aff34bee0197a2eb173fb259bc628cd2c8df062cd6682adfcb0ba576f4838" }, "pipfile-spec": 6, "requires": { @@ -16,110 +16,120 @@ ] }, "default": { + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", + "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2025.1.31" }, "charset-normalizer": { "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "colorama": { "hashes": [ @@ -138,13 +148,128 @@ "markers": "python_version >= '3.5'", "version": "==3.7" }, + "pydantic": { + "hashes": [ + "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", + "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.10.6" + }, + "pydantic-core": { + "hashes": [ + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" + ], + "markers": "python_version >= '3.8'", + "version": "==2.27.2" + }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "requests": { @@ -158,12 +283,21 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.17.0" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==4.12.2" }, "urllib3": { "hashes": [ @@ -190,17 +324,17 @@ "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" ], - "markers": "python_version < '3.12'", + "markers": "python_version >= '3.8'", "version": "==1.2.0" }, "certifi": { "hashes": [ - "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", - "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" + "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", + "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==2024.8.30" + "version": "==2025.1.31" }, "chardet": { "hashes": [ @@ -213,107 +347,117 @@ }, "charset-normalizer": { "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "docutils": { "hashes": [ - "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", - "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" + "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", + "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" + ], + "markers": "python_version >= '3.7'", + "version": "==0.20.1" + }, + "id": { + "hashes": [ + "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d", + "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" ], - "markers": "python_version >= '3.9'", - "version": "==0.21.2" + "markers": "python_version >= '3.8'", + "version": "==1.5.0" }, "idna": { "hashes": [ @@ -332,6 +476,14 @@ "markers": "python_version >= '3.8'", "version": "==8.5.0" }, + "importlib-resources": { + "hashes": [ + "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065", + "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717" + ], + "markers": "python_version >= '3.8'", + "version": "==6.4.5" + }, "jaraco.classes": { "hashes": [ "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", @@ -358,11 +510,11 @@ }, "keyring": { "hashes": [ - "sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", - "sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b" + "sha256:4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", + "sha256:e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741" ], "markers": "python_version >= '3.8'", - "version": "==25.4.1" + "version": "==25.5.0" }, "markdown-it-py": { "hashes": [ @@ -388,59 +540,113 @@ "markers": "python_version >= '3.8'", "version": "==10.5.0" }, - "nh3": { + "mypy": { + "hashes": [ + "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c", + "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", + "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", + "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", + "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9", + "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", + "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", + "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35", + "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319", + "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc", + "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb", + "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", + "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", + "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60", + "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31", + "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", + "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", + "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", + "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", + "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", + "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837", + "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6", + "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", + "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", + "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", + "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", + "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", + "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", + "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b", + "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac", + "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", + "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", + "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", + "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", + "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", + "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", + "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", + "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.14.1" + }, + "mypy-extensions": { "hashes": [ - "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f", - "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be", - "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50", - "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe" - ], - "version": "==0.2.18" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, - "packaging": { + "nh3": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293", + "sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1", + "sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab", + "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde", + "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e", + "sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251", + "sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa", + "sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d", + "sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578", + "sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f", + "sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a", + "sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82", + "sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b", + "sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b", + "sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585", + "sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967", + "sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283", + "sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431", + "sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9", + "sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42", + "sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629", + "sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759", + "sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243", + "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286" ], - "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==0.2.21" }, - "pkginfo": { + "packaging": { "hashes": [ - "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], - "markers": "python_version >= '3.6'", - "version": "==1.10.0" + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==24.2" }, "pygments": { "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" + "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", + "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" ], "markers": "python_version >= '3.8'", - "version": "==2.18.0" + "version": "==2.19.1" }, "readme-renderer": { "hashes": [ - "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", - "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1" + "sha256:1818dd28140813509eeed8d62687f7cd4f7bad90d4db586001c5dc09d4fde311", + "sha256:19db308d86ecd60e5affa3b2a98f017af384678c63c88e5d4556a380e674f3f9" ], - "markers": "python_version >= '3.9'", - "version": "==44.0" + "markers": "python_version >= '3.8'", + "version": "==43.0" }, "requests": { "hashes": [ @@ -469,11 +675,11 @@ }, "rich": { "hashes": [ - "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", - "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1" + "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", + "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90" ], "markers": "python_full_version >= '3.8.0'", - "version": "==13.9.2" + "version": "==13.9.4" }, "setuptools": { "hashes": [ @@ -484,21 +690,69 @@ "markers": "python_version >= '3.8'", "version": "==74.1.1" }, + "tomli": { + "hashes": [ + "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", + "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", + "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", + "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", + "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", + "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", + "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", + "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", + "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", + "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", + "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", + "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", + "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", + "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", + "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", + "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", + "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", + "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", + "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", + "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", + "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", + "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", + "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", + "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", + "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", + "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", + "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", + "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", + "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", + "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", + "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", + "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.1" + }, "twine": { "hashes": [ - "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db" + "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", + "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.1.1" + "version": "==6.1.0" + }, + "types-python-dateutil": { + "hashes": [ + "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", + "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.9.0.20241206" }, "typing-extensions": { "hashes": [ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version < '3.11'", + "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==4.12.2" }, "urllib3": { @@ -512,12 +766,12 @@ }, "wheel": { "hashes": [ - "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f", - "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49" + "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", + "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.44.0" + "version": "==0.45.1" }, "zipp": { "hashes": [ diff --git a/dev.md b/dev.md index 5c4e28a..83b2a94 100644 --- a/dev.md +++ b/dev.md @@ -1,7 +1,31 @@ # Development -To regenerate models, clone [latest OpenAPI definitions](https://github.com/regulaforensics/DocumentReader-web-openapi) -and use next command from the project root: +Models generation based on [openapi spec](https://github.com/regulaforensics/DocumentReader-api-openapi). + +## Generation + +To regenerate models from openapi definition, +clone [latest open api definitions](https://github.com/regulaforensics/DocumentReader-api-openapi) +and use next command from the project root. ```bash ./update-models.sh ``` + +## Generator configuration Features + +1. When generating oneOf schemas, the generator creates its +own abstract class, which does not look like it would like. +The problem was solved by replacing the abstract generator +class with ours using typeMappings in the generator config. +2. The generator treats the discriminator value as a string, +but in our case it's numbers. To solve this problem, changes +have been made to the model_generic.mustache template. + +## Problem solving + +To solve new problems, use the generator +settings ([python](https://github.com/OpenAPITools/openapi-generator/blob/master/docs/generators/python.md), +[common](https://github.com/OpenAPITools/openapi-generator/blob/master/docs/customization.md)) +and [templates](https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator/src/main/resources/python). + +**Do not edit the generated files! They will be overwritten after generation!** \ No newline at end of file diff --git a/example/README.md b/example/README.md index 9c1b86c..eec65c1 100644 --- a/example/README.md +++ b/example/README.md @@ -54,16 +54,29 @@ API_BASE_PATH="http://127.0.0.1:8080" python example.py ``` ### Output + This sample generates the following text output: + ```text --------------------------------------------------------------------------- - Document Overall Status: not valid - Document Number Visual: OO0000000 - Document Number MRZ: OO0000000 - Validity Of Document Number Visual: 0 - Validity Of Document Number MRZ: 0 - MRZ-Visual values comparison: 1 + Web API version: 7.5.308602.1848 --------------------------------------------------------------------------- + Document Overall Status: not valid + Document Number Visual: C01YPTNHM + Document Type: Germany - ePassport (2017) Service + Validity Of Document Number Visual: 2 + +-----------------------All Text Fields------------------------ +Source: Surname, Value: MUSTERMANN +Source: Surname And Given Names, Value: MUSTERMANN ERIKA +Source: Document Status, Value: SPECIMEN +Source: Surname, Value: MUSTERMANN +Source: Surname And Given Names, Value: MUSTERMANN ERIKA +Source: Document Number Checkdigit, Value: 1 +Source: Document Class Code, Value: PO + +... ``` + Also, it stores [portrait](portrait.jpg) and [document image](document-image.jpg) images in the current folder. You can modify [this example](../example/example.py) and re-run it to get your own results. diff --git a/example/encrypted-rcl.txt b/example/encrypted-rcl.txt deleted file mode 100644 index e22b191..0000000 --- a/example/encrypted-rcl.txt +++ /dev/null @@ -1 +0,0 @@ -MDAwMXjaHJtnd6Js14YBUexOejSJqZNepqRMvQd7V5BqAQRb7A0FBPGvv3ner3vtdS0W7Ovcx/EBIKLwEVfowHfs31vyPJqAftCBMBZhPYkeiu5WAy5LMLFxcYdF9xwwE6Gj2K9StZIOcduenf0E6eSzoypJRRzw/sEuK5CDCmgdLeyHeyLhvi5hOLCgKyWyyhaFXSESilJ4kfJVNg48RMqjjeui9woJChNlWv/vJDKeXsjqBELC8qw/h9an6YqiiOmbSYSZfX4Xlovx83eHJ2NMJqXri4ij/tCmiSZnZdajCDQ98dPaQuOvMxFmelZOrhazo++OI7uaxZC7FyLZugQjekcLwOhofNGxt3UxbHTOyeW4B6KTeqx8vQe/zMtGer1xnTOq91lZaGTVqklqvkmgVtSyq8R1WuPHx3JRzax9z8/gR81kv+1rlfWhShikKiz3y/OL7kl/xsqI+nnaXqlX+Go2S5/8k+TOZBWd/TppNuSLhqH0G2Nl0Z9faGd9bSLPhyfR5lQHy5Npnbspzo+0aHs6+2WbzJVNw5DLtZm8MD6aP29roiH3T6TWoveEzxvK/CTrulim1hn53+2izJwYY2srF26IJmzR7DXnMsukneq0Wv5ndnledQfPkJ5gXbXOivqcIxqOdq/NF01T3Om/9IbtOhj73Sgti3+GkkDMHe7HdRfEOboA99GpxxhOY2DV4Ln1V/JmOaoCJcUdXvOphyEVgis77n9IOKo1AB/NwZFdbZWrDaZ5X8I8zD5pDnPQPmRLQ1v2EXMHWjxmvzv3UomM0/MVtmOIbbMZsQS8rb6xuTrrF+bKxLiYzJvGhdoZz2YXf9webb6Yxm6vFjR1v3gviwFPe1FqnWhn6dXso/nzZM6s/7+5/pR3e1YzOaP8d96W81fcTFEbOE+uNffc/T5ZjPW1FzcWyxc53IjOvl+cA90Z1y29PE447xtdm67LrJFPRx+Lr8eLdNEqOVeTVv/PpCfz2pfscWBYxbvNhw2+N/nO1pFYjGS1I+yvhCXHVQsTflxUB+wjNqlqpZ1v+ycSPuDVXaCCat4YS0aiZiXOx2/te4WSBTVQJppoGMFyWcusXa+rH+9NmMHOiaXA4GiH38cYFpTK28DOyu4gisF0vQztCrQ2n62v/rit3UluMbvbVeYQghocKjB8RZVot33kA4G4/2cCa7k+zcWpXoKef90mbTA02fBrCf9NjG3uyC1pkmePk95SXwglwkXaOkhbN3OVSut1F5kPq1Hb7PibIIIMbDS2bUqcTYcx5jQ8MsM1lLGExoPzGcWy8sN390VpbRZbm06kEXqw1mZ1m6DqrIcoXUqFWqvc3zDhYQqcCySvbvx2PsyBRXxuQdpV8Nw9xc0pr6BLNxx+aM0RdjK6pNeYG9kU+MX7TnDlmVpJmnJ9XTdtO2IPDctiobq9fu64V27CCvPnQLRZ9mGFuaR9pZfHW80i3C64S6b5WGHpbjU85+uN5+FdORMrdFZbbSCC7qlokqh8+olcrU2anR+eDVIlIEx7Sk0oLMfZ5/52ttqQG/K2wc57gJcJEdrFjzXgnQndqOsb3JifQWvloIbaiiH1rXOGamtYM77WymL/SimIIgs/BM9EAazO/C4+1Dyvj4FeM9cm1fmddiGRilWJPHcr89qJ6nuX51eZ/TYxmU0nv854rPVaqZUDVlm12qxX2mfpHdCXtqvpWCsToZ51GX5NvqyWqK3HufJrWrYrvlqFKdb3s0jVTvTWxyiXPqu750vnrh6STITWHxZlYN8WOFmFCXLqwNLR2hpaIae9pDblITZ8UrYd2087g7be+xe4tobrVUC4K82T2TvZaDSbrSoVkG5ATyR8HE2bdiik7WL0HlcfXznkv5VpDQCemUZweW8tICYQsEBdbtO0NrN1jtB/zKsYs2uUOv5kEZHOCDpbnTmfeHP+OKjnjqKwf7Bt+4peav04ZFa2LWZF3aWU5Sx8hBy8bqUZhD57aTOwBSMS76S8ShjiJ/uvg2EnELGxhyBAur0GSdt89IHHpJkMtH02BhMWaI11EmMsHz4+rNkyYJOcNJ5ijTZFEna0DWzk1xcLnWnAJAnK9YuGlxya7FEhOHxZfeVc0MKxyk+VnHK15okktBM82NmLWPaP8uSMBkBC8OxElTHem37jSTFfDqSYk0grquQEd91PX/zeca7XZuIo9R1f+fByJ5pVYmPrWrimvgudqZg0KT0q5ZFeJeicvTwdvSalMpQkD2wVkyT5RVxuNrl+rLr3q1SoBd+jD4dz1edYFCWX1f51bu9MW4jry2ceTGCB+nqewPP7kXba+Sol44atf9ubmqEvka2MLH1L7ziXgGVCen7mKt5HeUr0tFwNyQ5h2mOzT4MT7nPXRgGwh0Ym1OVG8M6BS2Doz908yuIBF6kzjMQnaXvHurMU5JByJbe4zCdXWUofHcaCZ4A+gA3X7xmj2cEU0i9YqUhkdSQQgUko4EDx0Kw2f+3u9ej10dYNVLTo0/mREwcmWNtXT+H6sh5OHI2L3LAh1mt2tcn7aH5mIsQdfGWkJZUWnI+Djv9iuRktBHLLqHJ8TDgO7LKpbEPO2NKDe9I1NXQVXRsK7baWbrbmsJVhu83taDU0ToFuD3VYq45rxx5tJq4ZU4PCTerzSk1XteUi5y4Z5DmaY7nAVEADJWB6STkWmjUKV2PHnZ3uOMgmv3mOgVInjIvfXLBa2jXQnDjFIHYnC1Bfl0LEXWkSkWhiLIBDdR7Pu9bHYxtTNH/9JqgGPZtOGamK2N7HR6Vvab5eakPPCmfFUlM8npQufgF3A2tdO9p66oeWJKsa6WrtCOutSPB6uIjQ7xCymhJT7D3TLFGU40VzxJmE+p+73+FO4WSWLbeqVc5w2fEj2lG2dErzQULAcyYtzbZ+yP+lSAApe7dipOIAhoWdamWihqaWDjTXO0F8eMEh/PpkWgj0nGTMjbigpXXxZf8god2FQ4gQh6VFtYq4LuuoCkS569IKx9/ss7CTe3l780+gCo3s+9vWhN1DRKBZDpSq+vcaSS2ajff6jpaI5YgMnRBl5lndsU+kmLl9McjUrksgkWFWSLxXYXiYfC9b09pFscWLnzDCEV6D7rdzd1zrEd9/8JD66uFxrWFE5GHjfEoPZUu0Yvgz7qxH8JXe4xB08Gh2EevY+PWlUufuGrV2BILrDc54w697S7VWOfLPkZycCg2mOn2dDXomRYOJghvAu39T8RSPZMlvNOPPYjFAhbjuR9yVWKeHoOhJ5k/WemvqBslsfSrFp9UWyydAeVIMzc/T5MoHcFHjhTWmPde7GxE45u3S49FyMHR/seRi9lKxXWnWlcS+sTc8KEjtARtLM1IdO5uHpXTkj+vHfGbIjfQpHarUt5BxMBwtrcIB0DE95byV+Lp7vdIj653hewDSvtwe1vOyxxresyuGzyKlIjWlNmL5xT3ojlaqxRq1kbZRFORyy2RzGzm/BtCpRNz8IBornzGBw3HTMrDl30C86QECSNcn1w03w6RYVru7uXjuTPAKtL05TVqqApaLYM1sYk1tEtYDlC6EWFubDuWvBg50zB25TLu5KMaJ74SummlpHkxpbkFgPFXeLyhrxU6WaGsttLXM6wi3+/t5BVZCmSMI4zP+rVoq1FAEPZo5uBgXl5VUcW0+YnA1tBlytKq9m09XcyqaO8xkXA1QvXGTRSgSxdhs3lF8Kc+budnOfWWu955rcjXscjluLdJiYIW2HYkAbxdBC1Ohm7P96lf9s3+vXk3Mn6TocLVd7garra9Ft4ujS/uQxVYKx+4ThtDU1XKd9OzM6GZa6reY32ObMr2qkFMCdxV89VzapML3QGPVB3KeKD82NWun9Uf2+vcSCpO47Anz3c+kLIaj6Qf/fJZCDNevS0vDCisuIByfZUf1/A7DBKVjcJY9ZyCqU8zSgRhx+M1hJsMzaV24mtIRZOWCtHhxlIMiF8uHFTAJOWK+qdHYxIedcI++uLddElMJ6X5L19nQXz1t2y7KbUkWAJyIKwLSjF0v6PFkbxou6eFi0PCZMxSjcw+L4odgedujSj9/mI69bBWFmtKeUTcUIVEXaS3AhS/3H1Wvoy323tzhIHke1SukFFhLEc+uM5nXp5FU7/d0sAA2B2UFhr79p54nw+o67rsK1es+kq6KfIOzxSrOLt7wAZ51/mYCVtInkWGnabm9B588KrMy/D8NS/WfEqmwZGFeIGcXBUiWpgAkeeZEiC3ac43qeGPnR90VGh1iGQKgRUKYRPRGaymJxqlvl/IC0mz/0zoubH4erBIIdOf7Tx3M2yEq7R5aOOyDAEaL+kd86Zu1pyMqPtDfz5cwmPzaGUYslkP/bV0DhTR39NSfQectHRnl2PJQLEHOvaA3XlQ+drcKpl695UQGoLy3dT0SwOagLy5peTkFHUEKFUrU9wCa9JY9+nqnGy7OL+apeRXadp95a1zZRjl+GDxzI7OLrIA1mzs5Tx8vz4paqE4uiKziLIBgQ7x6vbQvdCmN/7FHIuVNMoVtfwA21jLvervoemoSh9+BYa1j7TOBHnL++xYoWWCk/eeOm1t3Ek740DoGIRv6rJH6FC2utW9y3ZrFi8UqfXTs8T+F+YR5lMf6ygRuGGCkBBXCGfeF8NKk64S9/1UM55PnZnE9WzCwtKY7gZLo9Ivv07sgpzJtMTZvh19ABqLrY+uB05JfmshcM48Uyr5cLyQgss7YjDLu0nUSrbHMor2kS944FguZ4Q3FGKu7ZgFrSee/3R5sxnLV7xsipT3o8mJdH0zqh9GzCTUkErQ18Exa4NBZzjUO496t9Z8UDFnQ13umMT2NrlphPGKL14yNfiU/mCy7fKlFeKZw8QMrQOefU1tBFxR812kmV1/LZaswWcv5mngCOOMGPLBwDm05X22UKc767rzfvwRIy1TO/fBg1INhmnKkQCEc4NS+8hmCB7ahVn4VEtgaT8zOL26fPOhMU7evF/wQsqraUaHNLjjzcvmmhxosM7T2Ilr/i7lEoPbF/raZ5y2UmffE1XoVDSUEXUV4UXxxvYZXZHYd/B2L1pf/8stUW9m98tmZeiKMH7rQDvvGeuLbH5YmMWh+63pYSuvG4Vd4ONefyn09Bm6ljfMP81rMvftaGQE/zoqCaHYdFZxhSh1Ksora2ak6ODeXNWIFeQADXX1k3WMRT1DUjCr3+jgCcRplv6+BuA4lgakBmg+Ld0mYvAVX9aLSoLWzLYXu47FlbBSrU0P/9H50l7dP+2T6oruK0qcOO1pabt2cXPeTjSn3B67C8bvciKNEPGQeTM4ERzJP65Poj0SbqWPgmqdEZ1J1Gp2m6nzcVVuKM0eyzRVoQ+sCWDrxh1YCl36rHMPpXT2p6MtDx4tut7emk92rqgB+ItV4y5b1F5Tpq3xdM1Rdit2Hm63ug8rEiZ4nbd/1qBIvX+8LjfitrZBTUXcx3JrfrzAZ5ddo9rnCgPoGW0pJ3bNDN0wZJld1PLeXtTPVrrZVYWLI+Fb+W19CV1JpI1OrVx7761BNv3S5PCuiVhrvX7LvllsMj0a06LhUyOeHT6mOEHBQvumylntae4UKdWW1WIZmlnR98ZpozUNHpt2phy+q2JfhtjkjmyH1qjIOZ3cdxabfiVkPnXgqRq/OSFBp3oY5kupHxuNE/4vbEXXMFLSD9zBe+S+DO6g44l9+5sR2NHLnHtjl5xmW7QielXxMbRaZkl2bEPXXRHth3wBqdsPyzWpA/eUIwB8Zwmr4+pNZLwyIo2FkZ2s7rpWisXCxGR+6tgcuI1M/+mpcF5l6GS0wcM38iH6j6Wm0LZAOKa8H+tLT4LdKRrRPoylHbbb35XY1SkVChoOxCSKslIHUkh6Bh4IFuNl3U5No90mSyiKY/MCd2berldyvjqdJ9y0OW21uX66+9jRBJf4lvH08TAKV6Gcsx3Y/616HBfVt/OfXI0uAxop4hfNV05DurocjPfRbDiyFKoaNv9Lmx7lbeisMMHu3tvWQV9HQkzVbG7uhcTBIitZ4ufIldb3va0Xm266IrfJhcqGmYdzAt8dzXu+Z2bd4s1lUMtmdyliXE+YNHwjn1gXjyF7Ko84XBqtUxy/fHz/vlVHI6dtgQfDLIFessXS7VODJLV/WyZHHMgMNFO9O3cGxSWj3JvAutEHj7y7YYo4YomlU+WKBNW51aH8RX0GR79YYNkdc+UUUx38cfvbUrBGXh0LAAgbn8HaJi+hZy1NhU5uW9QVVCulZEealVLuF55d/PZacbtu2uQ2YGKzhgthqL1Oh/Lu741XiYObSmVfZzz4MnLuAgk3fm0yM1c5Wq6h9r7ByQCzYtKb517HRoMAsWLIqNWm+uTuJJedPP38sizXGavn0Wmb9X/Qu9x7kj9b7YLG6w4ZS2dnK6pzj7C0eCsPpzYL6VNXZRj18C0aalnEZhqJ8pRTEXf3nVKjE2Gtf0olGjXF0VX1x6ju0MS0hnszZS+HQveKbotlSfhFoba/t/a3mKpalqFZxIuRS1ahIPN385rtapfnF27bUQM4+61vZbEidH4Xf2p1ZQy/nF/W46CqWRIP5ltt/SovRBn1uMZL4l1AhIYYtCrG2QgXcP6xDyNBaNegMo5gpZ3gjub4yzCm8ugWAVoFrbBqVcU0Ol9RdH3SYSeXmWlHToXdLdtlEsaO9m2U5/IG+BTta5gFmwgfH7aNmVdr0XKQy6Qle87HYuvjfSs50F8A3ycEJQR37cgmFbR5MqQxX2LRUH35K2dr5xbR08IBD0THcLSmWxXVg/05Qqojl56ZH5S4WtQ9HY0ByGHrJI5l8uJAwn3AYnp8onk4Ve/r99uxatOmJ50KCE2kOCJnwlFlGmM3CZqAjzBZlUsYqoMsDUFrj8svB73d2kilhe1As4UhMGyuTt7b6RVrxzbNLNKptH850OpjjwkCV+WQEipAw6W1gHrS2CQzxEFq2imXkyKiYLoqzaZfxstaDsk64MnYd3i7pgxKeOARC1XB+5ZW2BaJSW4FuZbNkr1mAIdn7mCc4WaO6/Pfsv5vMwZiaPz7jIautZI+lbJ5EGIqcGn6oF4uBmWe8dGA/ddmJ1vu3J9Uz7QLC0aHrwKHsWVe0luCatubkU+hGdc0hKXFXN2NdkB+Vk7XX3C9HUpfY8K8rU7I5ZL29Zqv4IlxxMhdtnFlNOeLD6ElQR81a+tX/3012VkmIBX++2b4SMKFRaIhamz+ff6toa5KYn8+XCulKd0xtDO1DwZ51alr+KxFK4xHqqoZMz6tS9hr9GZ2TJhU4WQx01geGp0vjGf7zOptN1dK+vTRj6L7P6tdzYrEEbE6+KHM1aG/tiJphvpXx8rh3+PQLmXcLfAk6aZDc6SjSGBmxvLcl+Sh7340uHf2TKggm3wgNlcCd4OVnYaoDSIZepCRbX2kpUwSXa/zNYDfT40qx/Bk3N9ZXq2ycC2/8dr9i61ZcO4OpcMQ5e1dbnrLPl+Aci418WlvyGaYJM6MNhXlfanb73una2jJcgddSRn0iPUw1lhMjkrRh+KjVOga8Q+X23Dil3jtoE/wNG5JDaMIveW1BeBJJUVq0jOWOeGH3GgZjtQcgTKJmp0WqasR2XnRjz2zX6C/nhqDtkaGEXgJt2BGK7GX7Kwq0zm+VNezD7Xst15h7DFxnCTHE3FvhgO10hJcCeDRRFKWnrVu2yIpMCFaOlyN4MtCt5FEM3EblkDa/sYQrc1+zWzxu1atsxgBSVIIBQ9PMKwMPPMe7ZFhY+x52oJGQwJtve20w8gev8csRiIMJ6i550+x9CDu6xUVCOMbXplU/+Lg+wN89fClnUZUEh9ibIu8JY/XoX3tAKk2lVnQDCVnF/7h1GYK//ddCcNgolTbOCFq/Ho0TuqcGAHnoNJmMoGGzJm3bWpM6odM9KHNklR9Cx9WO/ndnuSz/VcaoqQb40RoqJu8jnKbp4gvsQTM3CrCa2f78cFzhjLaseJ+WgHqDLaCjQN2S4Kb34mbefF9R/B5CUNTesBgH+OKV+Y/AW7XJV3y+aO0NOqRQDgizcuuEcmf5UC1K/Rb1pQM2iPHScn6482zEBNr/w6olzK/9ekwGFqg3uPa6t6IDUsQz352SkHvy4pAFwH/8O0/rCQT45MSW+fQ0W85GYhM2WyezmyogopH2LdmYd067M4stfrV1+iO7Qquu6+2ZpL+1NlvMqIYP64MX9Hur95GZKTenKyuSNiRExQPGdq02MdDAD2sEOx7IOAnWoUF6dsp/EfjkBNTemDXqvdnNrOvCxsblTjf1IWIbjNsOHDdNPaSDxCQU36ABslfPRfjf5XKDvOLBVDX8pfjiInGLSw4gTFQ/a/VWMsat2S68R1VSE9BsUy6OcL9TPFmurz/F/v2Y1pYGf7bHk9K3yCrGhxphrxk6LQXMZZFb127p44Z9u/+xNGvFr8H/cmpNy9iv2+0SNt2sJVY6aa1Q/0wmBtQGZqQUUiSFrnAVmn2+ubERIdtCSTk4BnwGMbKDrdtknX+oPeRd6JTPOih84nWxPmAOX+fOHnqLgBl7PAFbEcSjkBV8oPEfbqU/semZuxQpceUD9d4NIq6Wd/vqzg6C7OzHw7ytpMFVo5dQobofh0nbvMaijsPb/RCYsuNVYO7K/3Ftv9fLh5PjA9Ma3l17IVXvVyYUeDy7bXhqmj0MdQFj6NrVUVrf+gn9SWtyi/W6B/SR3VoPhGol0Ff3XDvuJAbXSeZVLBvk0zjsiEovL2eIFklwGHYTJ8FdbSEFUagMxJU/1MU6XA1xI5vuoey+aoWMM5YDx/7AIcbHTlhA2CfgI/0bBhcScs9dT8UejvwvN9xS9242yyznL6/WQ9OsYT3wQExRJ/2ksePpWxLxatoMtIhuO+L/NCGO399YPiEx0D/obHm8FGbYD7E6p+XUIqZYbAsz97jY6XVg93p4S+Vh5breSzrpt3uf5rC3VzNyJ98o3odq6tpWD/nCE8ibbVFiM119iEpA2l4kxTL497/t635UQGuur+5x2am4ghWPrEWg/g525U/bl3XpyyoB52+qzveMduyynmFyEDBPrSIIAfVkiFejBV+3efpxZ7pCos3v26LLwsXEnbGU9n5c/PI0xSkV3GaA7LdqMShGVpGECUH9J8VLtSrqeT0H6kHGbEnlI/fPdXpdtkbfkHgs4izTBppVZxUT+eva5BiYSMRK4rJJMHpfeSe8t4DfcwCx1W/7xUz8vOwjKA0cRettagRJiqWlZ5/GcC3k1pfKu7QZMyweUIhajl+tDosdcxFkPFRosPq1g+jmcVv34GdEdHv/k/tyuvpn+z/faL2Mov+ljQVHfzx7F2KBkHzwyJFxwEJa1AfQjOLAYPDB7SByfyslSfgocCOs5rvI0hqeylpRoijexYj1tk34tB+tg38Ie9JGIsePO4a8ts3Ct9nE/JYdsmwT5JDq0LH0hmRpfMC+kBza2ZinuCR3635rm+Sgyz1altGsbeIjEg0dbaWw456txZfwY+UJsdGrb/mavGIenl9e+PdEjzsn1sDsgltH3o34yBpb/KWfK07SBi9LdOt4zOCclK7mbw+u1iRLJwKMLYh8bXG1o3pFEg+J/GBXQNNKe+TPZNsGI4hRWNr54rya1pRp4hsJZlbfc3n1ECDiGhPNF7PvvneFqp6PZ+zy33uWtsaAgPUPFavsz1+wGAXCA3uuOiu0lmH2smvL9ijF0iQhAlL2FJIgZeR2+dnLVUvlTxdE23Ipy1AoEFZm2sRnfyqHa7G28BWD+FpQXSyOYldbwJ8aLk1jQR8AoOd4GvVPURIp1Dfm3sMsotUPXVhtDQQ7U5nkT3/en+/VggL9DFOY7kLLgfJCH9cKEV/qWlLkVfkAgsDsSshuLYDQ28aF7CwPGoudNNT0f4u8N5u6tRzx17eqB/tVs6xIG+GBTXF6CMdKvfp2dpW19qOzIFPWhoQVK1caOV+jMkBcvzNGy1ZkN1lGIIq1aryBXsb2jhehVUbJIC1YOJZqCGsd9LnDmIexxbwoSO/A4IwVn9lesgZ6Haa+6iRo5zFgoFMiUQs23LqwPGJdRX+DPPCIHaKqwguML7JN6dB55hAPBji7cYW/Aw+z3VEzN0Damop4wKXUJlIUrs9au3d2hxK1kbnn4/BK2Mf3dhfBxOmUQzKtOIhGKg6fLTlBIknt08JEnXaUMEwadP15WBoiln55GxJDPOeCqdC6YaYsF4YnOgGb6NxJL8PYaTbTQpyfsitzMWkcLqCLiVV7iQpWDm9593fm+Mg3Solx9HinJbayRWKqteQzj27jD2Yx+fExjI2R7ECKAwEMXfNP2ndVPJYqc0SyNTDfkh9DyQfH47P7eBn2b8AfcUF65hYzSvY1XjgZ3ESIJEANv4zxMbldQGci+b3o83UhPSK93TFSCRdGE1ZetcyA9M3umU/Npr3/ec5TzHOuS8Jx/PfVwzuiYvLeTdzeeG7lBClo2jhb0Vl1dnAQTy2fmTHBA/Y0WFH/+O5X/ZQ7XLd4F6nQhTwF5gNiOg3yD4UD5X1FRGyfxCxXv+oJs4+78fDXz3GWVCTsGqz6RC41I62W6XDJ/a18SoN4n69+kH2f9DiHAVW/+WTeeHRIjO9fCGQZFsZ0fhpR8U7D4yzHt7Qxx+5EENsi6KIxlr1CruBeXKyt8ywlt6s5up8uTtGVyG8KuxWv2aSPX2RV9MDksNxbnhUdMB6vh8LJb1ayeaun1u/ThuDV+i/cVWF9HCoOqUrYMn1xSiGw9MV7YOk0Kijx51ENU68RopaNgUvbqnY3+B73RplE71Jh8DoZAZlm/CZ1Cs348H48/VPXKm7brpgVA62Jdny75wrsTaaW1sNhbTq6jUzkCn2Rkm/T76KV377Xw8AFPo+kG9Oq9M7nTVjKTger6NeoeyXwKraImyffjpCtVHniv93iGAGfdZsfKea3QSVX2SEUSyF+bVlnVY81vQyF4/dp3TeBOVbZxatk6K7VC/agwNCbQauD4k4XneGd/HSC292LroCWXEW33S6gBuyB8qJgG+yCRraw3E9qh1KSnSWIObvRztV8tykutMhsvN1bphxOo5HPBGC1CEyYiq6EkTZA1v7s2hxX3h2MrdE/M+eNbtTzR1+73wft+M2ruUo8yeNYA8kqrdq8Ovt2OF1Owd4P0ALJtwuzLSeot+OjfEOZM7fwLJLABMXtHwhW2aSwWbas24o15s3KAyOaGVJzaOfY6i9zS0Q5uqihknfiWGaL1iqame7knYmBOTJGLuyAEXNeOlJXvz5CLkBEus7/4HXE/A7VW6WEGskbY6JSDI4ZZBHzwog7Txa4ZHzFHBzO34Go07ZdWtaJJ306ixjhdtw//IYSVZS0vNeIyriWOeVETan7fnzeVqbCfLaPwUXjBo+QlSgWa0TaSKqSppqIXbyeoArxmuRbEXDTarj4Bi5Fjz6zjuhbdpqLC+0Iu2IsoY0jWcTVEE61K5mHodRjl5svB0/SQahrpKlFOWKZzeB9vK4v/YPz4ZeGmBSUzkGqvUC/ZFaJ9IzKeOuAYktlnJ9NIo7xFbzcrg8teuQqf0J6WSNt/lzlV3nIpTTLrY0/0nGuDMdq91hZYnenWeE9XsybZNyb+X4wsITTfqgdQWpAzU3wyJ8/j3/Hqg2rft0QIB+TK2halFwRmnZUum7NJlNA3ahm2+oLRqZqFeif7Zhusurs35VK1//EyrXOOEZJqngxp7q0fdw8dEnhOn5l8lhJPTy0Pi4TZrm0903r9Xfr7+NEa2WO0tJfwtdfS1k8BjTjxOQPmCLj4v1ma/sd5i3o3qcVMj41yNGoGCy348MvgzOZaULc8VZ0DANYsiw4+c3Us1lK02Xr37SVMr0IQeYn62wjSCOevaDWpDt9fxubjd3ZcVlbPL08/+VwJszad2xj/EsRjI+QaDRKQl7pZRlOLGoG1lgvda9nZOJHoPv4tJ9WJ+yhb56pQTldSVdwYJwoPa638rPkB8q8pcTIgkkmOfmdczwH7Vqs23q5EmTQ0axW8lOh7SsPdpgbkQPb2sHXEoV0dvuUrSpf3108yXa0SDzZYFAHQ3OhnSXlGYteeV+3O6uRuX6Uxhx/UdaoVfw2fweEG40x8bSRrSkXQWomWWp1IaLsgt/4PVO3xPEFbxT+o2hwlmas+x+iARbfn/DcdLWTVWBBjbSmethZvtn3rgNc5KyyhlM4Oex1K+DW71e7KcHE+U6ZjVwOQmyk0s7vH2Mg87ODzcKT0dPC4Dcfuj4SZClYfuBqS5v86262BL7QqyJjjbXrTMtFfzigdZAIUFBiWdliMm0ncJnev/WG+l0V82CqbUeerQ/qpD5YU/8U24gAxqHy1gQuhm7rXojugo6nK7yOUIT7axEaf9HLHjkGEqEQsVW+kNF6386+Gbw0CpbTiV6F3Pp1LYfYeD3nRu0WJDxRZWSU92YTwOT7kIyDLE81Q31wy4vHG4l769uBS8Zlm90TUqFvWRSKTXPKSphuvH8WayGblMDL0CLne99qzSeWe+dduslBS7dPRWGo7RukLNXsZDjGcv642zZCS3tI30pSaSLMW7ADOFgNBeLS7slxlPHFOysDJrJzGbrjvqATmFCkz00Bn+5GpA6eIe6gKzLU6OiuszkVuQbWctLTBir+WTr7W5PXOVp1j+sR8yztWTFx+NfZzbrLgEm7ZxmwgTZWNfns0jaaXa9eg4UkyM/9+gx2XDNTZRK98p/ANSARSWzvrzEDwSJLlfXoo2TlkXjmSoIVZLcqperomuZn8Hzv5eKwEJ8gVGZfSeo7RayaV+UEtr2A9E00R6nQ0U1jEF8WHaF6evX8vOesdOjD2M/bUgI9CaYsqbHVth/L4aXTNclVq7p94lmrgqfYjEW3//y3yiRBsnp9JVrkt3GWTi1DDTAIPBWLyRBgAZMsM01QV6MCr/agi7eDJEy4Zn8vS4F1UU9B7exU4k0zv/5mA1trunfCWWeVbzk5JkSfUndzUaTVMLYzJ713RF7YDmEKyMWus3RTF7PJ0EkYNDK+zDtrxjaOW9bybJku7QCKMr+UebdUGoVz/sgn8ArFjkNp7ZJEoya5WV0AtseD659YzN0L+X/WmomTUr5YarD+XB+/fIfS4/S01aHE0MB7N8zbE+DD7udrykIa/PFnypL4VsrMCuXcmlfXl1yy5UmF7WsgFJ907D6JtxF08fMN9z6KLzN+EWDxYmEkZMGYXmn/zW4cz2oFjdpLGavOn6TeEjJHxy1nWZlkxvtArkQW21O1R08Ur7mm0ruHW6AUCe3Z8q11kOD4sZ7+9uNjeoIrIU1Luu9lMJDSpVCWl9F7wxEZKyaQuWjEkYXbJUR72PPN36tlnI3WPlFRFvlUU8Y7U8kvbKv2NVaRuhrlPwcqELHXK5pEacPl/YF2G2PA90RF6xthWRnKLRnoJoq1bH9JElTT0lCAwrVspJL46RXyYpR1Zrn9mmjBn8iekgnTS7Oy9u4hq0pzQte36zDd2xa7qx5Q9X5+8S0AvZf/bRMpe0gpdW1spLEzyM+Zit7EI9q5Myow93kqiFGnLr/uSopU0+MoBuA0JFdTjSJHi3kfcZsXa6IlvN3OoT77yMBqMduvc8RjoRF0i1UdNRjKsPG2pTzMTpGttzZdRGMSrBCeAkJn284e4fi7jR0gEHH+Mm1omEBVlQLaiFDzNPnGypWRJeBcYBRBVbh5Rtt0OW7xNuwSA19Ym7xpc45kj6cEc9It/5walj0iRBTZqEoPumuNLe5d/s3VYBvnfWB7yGNrPK03R+XhIUhXk+L7nOUPbsF433QPeUtvATrmBpZQEeTPbTmMnjcxaccqLcUw+pjxlqQpOjF/l481D1Zjokb6X/74cZwKWax/fFmOAsn6zOYOjRLdPhy+7U4ck3rsOwjB6DfZodXjt1nn0kzjjdgnT43PP4FJS3WhK1MbdCW8MPlSs739ZuHas+J8NBUn3+6270ZEEWZz9ngsvp1IkVqLxL2V6ZOOtzvl0czmUcH+FF975yL6mv8B4LYiKX4BgJRlz5QZHjebIK/CoHMnZSuWIy6n0Ve+rIEGXEcCgWfHbJUSUwczBtoSfdYDMScn9LBF94fyHW7FnDMhHH99H4McdH51tZOfBcv1pwdVizvQdFFqIFa1Bf+b3O6LkFBZ/5T48fi5uGqvZeyPfpmtZ0X+yTmrGhusqISXrOhLsxvZ72m8MhDI6ynFFmlfKIrx/3wnBl5he/Ovl80eVLU4+sdhdUYeRfbC3vQwtYRjLp5bL3xZbDEJn93fv06OJ2Dp5hsN2vK2FcaG61HvyEJhFx3BMRF7hBQdT86zDrlRf0kduJbNSZE+/REhmqeKO3DYjx7xBR5yXJCkkgN7JyEWN49z6RpvQ/ZtINFZi7NXbMCu/wCRWtlQMYtOvNbsPF/K6sx5ZmJN/lm+F+cUkPy3X5CymPhtiwdH/2JGW53manJV31xfk1ncI5WBFTggNzMpBg//oQ9PfbgCqU4XQ+p75jqR6msEyNo+Tb6vinOzKx1AjWjPmur2oObR482zthxUxefvNXp86a6G8oAGRUvjh7JVEbtQaUlV3EDPUZiFYOFTcPULBbWFeW8RW/5NZcKW1uua1AHdbt+xINuSUQ8WbdYxs0yuS7cXK4CLWTthyNO2TI+kleaPV3l9nWUWBy1700wFLwHDQp/XCwwpf/EH5NrUwMv+MysXuSjlAKoiKmKNv/cS806szisXqgSoqSk1GwObP/UA+h4YY39wGIEfkB6Ejpj+SqhuzU8CQ81i30YidUTfW7kCIQC5B24n8xUfzdLVVMUNKmpQjkjr3uK7gBn2A72q7NWi0eV1ttQbzy7c8s/SjHbWrj8LgIEREylujNhyKO8Fr1MZ9AMPL0UPJB6u+jFe3d20Q9M0ElmARDQA+xiyOKow8VZLYHS4+oHE3frNqmFbghlvY4z/2b/39oBKjTrbEa2+17g7kWyBQlhGPEV/pfqx5hJbTTS/iVX2xstW+o/3vxDZx9HbvMIhtliBPIwkiKYyJXw3Q4MJiNu37XU7a0miGdU8814+Liv9acTNTBaJKpSclfptoeEXLmfADg0lqqm7GlQcOQwiivSKj8//Ju9qsfpjMzsrfA2qUSoxmrBCcZf2r0fRcnJ0w3DRDl/wgF1t9/hiGe42I3CSqaG+XURecuCSQVTmRCsnalXdIR9YTYDb9IhtGn2N2W16OSAI2JdaQN4Ts6sVO/BGt5HrnLscCoXC71vscLa4W+WrPI5sX18KALSq36cPbK2TUScSUtCjiKbYpcclXqpyLSoxNUkfL8bkOfzqtn/USvKv81Zd8M3GfbVWHmuyZ1u7iBAApxm/q1EhFTT7UKQE/Tq/6bQXtuTD7wpNFYUsU5cYQqotneLP7VlE71RxcbDEj6ukzjY9W86gaJGWi0/pMhb/JPNrSbSNl6GW04X1lFV/QhUjxqp/4pwka9D298B2RRLW+Ku3mlQ82a6ZhyNFMrY67GJtH0hKkdeP2a+/oatxSLTY1TpdD8f96a9LbrlLgyBVaJSH2qDYA1OEpfA+/Kqv4rtXSyNSats315e9975QeaTWQf0ITIraqlQOHXOOQXJJ1VuNww28GnVf9wC6VnqO3vxerNq8APrW81VRYIxGbGGw+wIH2BW3ZRJp4VrEPb16z7XN5d6eJZi3VqVq9jlX/eDKLhf+OCl/GKHJjVgXWCOHTzYu0XH6QAS1/r3y/1OASqyxWUSTwM2YDgSF1gp8b7mnQK8jipbez2qc2fzKoXCkd/Tm/DWdLEql3U9ioOQxcGC+BKF5Ff6XxY7HIdu65dbNWOoE1ZoNy+um86GTjBjarUsgw49ipJVgi21WHmCpB3SrWGwGdkSLmH+k52yF/263IR2VVTNBdt0jbslUULGV9XDWvbnl4PurIO6nM6VxdmfiIzIS+ftml6614kTkpw1ArkOp2YgsNCtdxJtyNfbWITzLItlY4SXkTADMXfreai6McXnLic2r26ZH1BK5orrDwFlAKq6qEnswaQme46kvEEuCh0/2+XzUmPy6qjdwTAZMPxuOAaR6lAXmg2rJ3HbH56Lz5OMTyNjbN5vGHMyq1qPXA9nmqi4n72RuZjaO85VfJB8edG3XTG3GYMrCWDiPD+AzR00OlXfwfrt1usLaBag1WqOJnb1yQY/3qZBVNejhZj1jY2CK1toFfZGSMxRij+XhYVvEgDzyHsuvrN1FmZaYTxCKpTapCaEn6Qf1NPeRKMRdnhb4Q2zRRCWVoIbFL0VvlS5PEvMfgM51T/OZcdzm+XcB9uwVLny/A9TVfJCIZckKk6fyz0WoW6UjYf2ar9Xsd6tCxMbncy07hddjri+bVoO8cA8sunXJ0XnPDrNpE2u2SPieLRtlBh8lqAyek35r3Wy6fnNBdbQ3cxNDCdELBnLwYqdVnkDk6EXUSlmve2xdJG7sxq/FewuK3/saVQ5X1BxJQgzMghudyqpGwJYCLOpi8dkxsY+7d/su3WjrU8u/Z1APP1WKVXa0KFD54cN0g/N1Q83Dk16FTd/POS0zuc/euUYdayW+vV8stYlK3pbXBDBStoLg9rrGRRiSgMKR0B/nMEbDN/4gIBuRJre5kQ2EwY/KB+xmV/nc3+yn7bzMU6aT1453X5gKy7iOt39/LsUDCyTyiEJHFC4ER9qgNOwPn9cXRjc9UDMXSmvZY6oeMCFuOk5OFpEAv75hW0H+W9wVOyhoMzNQfEu+xidJtCr/mER535Nn3NS7FKLdcZoVDW1eqa3+7iRV6RsfK62AbJInK3cRtTIHhhXuPYW89jGb99/AbsKjLp6uQkSF6w8GJbDVL/cBzHfCvzcC8vHW/nhZ3xraowvrBw8bTmt5it9dFgn1YtnFYomgppt6Ebg4YFS5SFKyMKsGRaKN0JbPrt88m6h2dx+R8qQ4Mt1llZ+H1kuw9gytqEqcwyLRBGVfLxwhaDdp9YEJWU0kvxLV0FZzaWZlpNYQQWfyTBrSQYdxV2vXU1uuQaNNu/5c2rTyuGh9hUtLoopmskORjFf7Ng8A+EEdtKzJwwmCHztqTfTo64vhm32oRrjwOpNQROeaHFseegOqnX9bZjs0Obesh8fU57EUJ6m3J5fcocdorWBZqGZaxgdzTKvuU7U7xy6FRnPH5XOnEqp+KhhmCL5LrU4dSBvhvd542Twud+mmp1mIGSXIQVKrCo6mGMpD5CBPqS2Qtlu3rrMC7bLkuSrsidT1USjBt45EyllM86RpjexWsLDnC9iHjsr26JMzh0xr4PH2Isi50bTHlNBSPVi3878KUytX1M7E0jh5pxqLFbGzD/5aIsEltvESj+rAoDP2jyPtKYeclU5C03Y8HUJkZuzzeqSEQdv/vdkqxmo6udvOVrSXQia23VrBnF96Nd/SdIOv7f8IZwE7PQUBM7Zpv3wY4pxLDlojjdVVexLrJgrEYg5v94hhjQkl++ex2dhL0MvYGtlyPl17HTOX5LbqsSjQUmYhRB2qO4aNg4VkfNbpHVTrpSUk45I/bvmyf7mHK6t3j4NvoicRHDJAt7rP5x6HdoWSg0T/sV2KLxzDGivC1KHTVUq1GvALo9LgvybV1hlj6Ksu7lI0Q8XIVvUm6ramMS+TFLqvnpPnSjvQwXe8RcL2QmbZo4IEtueNky17kKwgnf0HtbjqfBmQ5qL79z/T6UPDpajfykh5vIQz+1wBmeQlvFoZhqkp3d1MIPNdFztwmJWbN/VSnhPq/5IlRR2OUkFpHAjJrTUp2crCcgWrBwgzJfllCVsAp3uSZ07pvejf1xIU2bHoeJYYrWMV5n4QYMRZEexRGlzuQ2v70mzd0BavR8FLXAoCdfVqIqARMdpsRoWX/m1vPHWXWk6puC4zvWUmWgHg019pBVlof91tpOo1JuVOQTJjx+VD113UC4WKqd0ljVTuyzKCrdJO76FJxmHt3445Noj6KMhINjgabHjRbLYXs6bkNG5E+5trlGLL92lomZcTRjXFEhbLXoAD/IaszEcWDtxMTeFaPIKND6rsjZszkcT3T4HjRWKciQXhg8WqGFtzaRxpmxyDiY5+CEcl6VJf5DoIPtF07Oyn829xTU8nrkvdOve6N+G2NVrVYge3grVOL8xUCNKtUYdFpgFOefujwu94rKM8+gkw5AOI1n5wMF50xKdO8tCwV0xx12jU+Ssq05gZDy9HO45Us0y/ETmgScIkjMbLCB/VvupUfDYB1klvKF5Hd6dEO8lsWwP/XCWibcuSK3h9uvAa8XI2jh8YW7iddBdZOUkYFXz6aZzjrZHDffdzdqHNl69+vl5Nz4qTiGUa1ssHeMV3lLLFraK98b+fQgSpEkpCMfVvNoTDvdzDmFw6rWwuyKOhBqr96z2+uy19m/IpUoSIPRe5pgE4r/3MJHPxuMU2ZK0Pio9OulvkhB0/+7xMTuM687c4HZsy8ooV3/Hr/47XSjMT2TkHxtW7BNsI8iBXDBLgClkXcYDOX+pwfLblTQVj49MsePCuoUAiv5cIr7/ViqOuCPtrLMeNsW6yhllCe3QuPPucLolLxBu4ueuDltYsu9HXqzhuX3ZbACHbqi/OZHCkA13/PhNfcFvurl37eBvW01W1EGF2gbKMuqQyncqtluPl8JnBYxgjKNmXpiXmPvGmHCix8/0JEhERjzkpJZH/MGHPtmnFZu+6ZfXM14qleM1Tqpp9O0EWocnW5sEuPzVY4qc3+t66llytY54U9VTEifqSnG7hTVar1QzPMg+Xe4+bT665rpAThzcLmVTMs1xDcLOJ2hh9c2iUi6UQZJtP57Q7ySPGdeDxM2gjROjv1apWt5NLuqP31Zg/ToUqh1Sx1Qz9XufUzKnPnXFpVx7nnKoUGjUnHIoD/5qVtplrRWxl25EO+8OI1aLnFxJLY/m02WSAoPZZKE97OLYbnVu+MQtSW5KWYiHrKOOqXSeryk+GEyIXfYJry7YtwzpN1mKVJ/+QIM4gc7mDGsYgPDxzusIZErOoeM/IyVhXaP8fBWeh3Da3RlGZ2W4aRofaMDRY+huZ2RYzWOYYYpJtWfjqN/cBJM2c852915qRVBgDD8cuWy0dkxJfCc5T9ogOsCXJUsbuFp6o8qSoLT6dOjZ76gZjy/HrZvgs65pI7SOcnS8QBBgri7T6EWXIwRonTRXk49asMf4vUL8eqH3ZvFsbgh6HFSTZAned6YoUAwybLTFYPLVKMuKVKWTu0Usxv8vk9lZa5xxDkI345ThuA9SpbZ9v1zF5cMq5q0IuM65s+4GPD+FrTGz0Vh/N29nYkDEf/MnQXLtEdksCiHPQZ6B8npzWbP0np5PYecXoOKi3P+5/yFj3zJ5CuoM8LUL1eL9iKZnJK+rKVPWagl8EVBwHen48Sb782zkoxqD3hd3NeDybDr8tn0Yne4ndU2vDzSVTiOxVl5nw54ws8Izn4XptjtIJdWW16pWwz6KvJ2CJxewIiVBjH+jNQu2oUTlEFkQBwIJH/2Tc7c9+2a7bPu4R3iHNVbaUpKLVy13VWVwIpEjaWTslSPEA9/fybGaU8lKAEHzlMtxz7NniYKpSPNv8nYVhFTM3W/w4j9XfKX6OZ/cNMrGwNXeOcSf2NRFKpZ0hF0tDD8yTttltTdr4yO1gvbn4DtE5L59q4CQpgDs+fMe8UkopebnY1tLUl8ltj/AgROyxO4rnS4CcDDih6O+fQVFNof9dIc1YcEItEi1IqX/WZJgUMTExKwS0OrRYBTgb0IzuGO1xou9R7240cJ+bCk0lTrgTsieUf7ZHUNeChDQClKP18bIXQCvR/WXSqtpvv43d/bXmXFpSTRJ658PLiBUjYHN52p20QKHHOxP4+c6dURrHPamdzaaHuzOKSqqohKdN9XHwTEcm1MTtYJK6gs47XKJzEvIcFRAQSObz0shcj4WdlnMS4zJNj/ErtYkZOH+nNNzdFQSTJWt/xR6p5Iim/rjqymJhsyz2m40hZS6RIdwa8hlzLaCUi/LGsMy3O+j2P4Nh+hz/wycyTJRlprVFfb+tEXu9R7e52HFYj/UUCJyNYlqqTnxTwrDQj5t/X9I6d+JByTKElBvL9uWQTAqYfbx3adEAFtKzSRdxntz7u6x+tskzMQaFe8JCaiBESsk0it9yscWA7z7zKSi3WeEcMX90czMSjqkF+eQsju4/2OpTSkvp7VkySKznqsZwij2wRQYhNBasAhHX81VMR7T4+VYflNbnM6SKCeMMaPvCebdVauDSHwt8ygtTXYeLId6+HyAcCrVfXgC7Y31cHK4jzibNfPg/1vomomr0trOUkM6UyITngm8/1+OMnmMDj0R9GASmNo6Qw1Jzepq9Mac4JubtUjVUPsuRBZa1v/28K2ZMaLr1hC6XTigx7prymI+y/v7FkBRlb+Gab0zUK8YG4XN3aemD0hkHaHtCqhWb2IvJ4+aS2ioG8A0QoubxzHqjn7S+BlmFhpD8xT5vIx3Gi51P0f7Q10zNPkmOhlUM2tkevTv11LMtVbeeivmqR9x37lyBOSxTz+H9VP1vPHewVi0qke0EYdobUIL1ChcUqXbXIjO1Dd8/222+mu5EAxdqXbiUItW4iibr+cRN1Z/vTkPdXS89N7KEWjJJGPvzKzTJYJPMhQ/BqKCuE/sjiBrXRg75tcfSo+4sELcWxAEyOEigwNOzMR+PajU7ZZmTH7Hcwj2YWk5Du6SP3kU6iO5vxJfM+DT3oWlx4F55iks63bn+U2Uzt9OOkIOwFF2cwLm7raF7OOldj+lRcYXTG8z0Onm9HhMQyh2w6/PqJaZMdhq2fWBZPTYfG7luS8oCUrns28Nwpde+/r27Z1rViWl7rrc5fKGkNLE/MWv4qRXRJtVMQ//uqmmYPRTcSS9RxPHkE2VGvTppWMZ1EWRB2jb8kEncdtjPzmW6+YeCkzmXIuLs0uY6cXVMo0d/dc/nbTsCiPq8gVtJZgX6UrbFSN/2WdulcwEZ8G4vN6IeRSATKndwW1cdj1pE0VRXpInX3b51yXS6AM2lUTEzoi7tBfKvxx0GbUWcjCAA47Q5RaibSMczlVI0tllFnO169pDA7bMHHsv16ns/vOv+/39UF/5WzBXv095qmmEpPBra3FwTqm1d3wXaDn3s5NgF2rD/2Xd22rGce3sVmldW7XBqMUj3DTLkA3Zp0O7kjRXItWt7Yldbrtib678ZiKDv4tZKkYtfxNnhbspGuk0At/AUyqXNKGmPNeVNLTxnoMgXQyEw5L1wca/pda61SDUhCq1wwqlwmassTGaNNNww+QOdj3AeLZlhsjklAr+/ediYv8kJVjyDe3o8oa5+qJJc75yBoVRZlJA4lIE3//18Z3hEtaP0bEnOi+5mY4erHqCPcZgNd5f4AdwuJqD7Xq2Qj4Uegk8MgrwHIGDaNt1JipRs5Jg5CNrI30NaVBzdct1wjL2FngeuHa1agRpSlWb3rxTFHyFBy2gYykeWQUdfDX+jqmurSiutIdZ7vbX4fnHr9bYStcarw75Mvrm+AuXGJxIaowv1qhqciZPl1gix1TcNpuqIX9xEb00XSdj21l2462XC12YqEZkt1VvfHROHB6DgGANA3SvGCqxu//dbY2jlPeEP8lDS5saB7KBqQdUQpJ6nee+I0kh3sZa9LG9qavz83m4ZonOS9dp307bVkDIHpy4VLYJwbSNHM0hK8fLx+egOZ9M05X6wNEtzklL+NmFTjoiBWAyVZpCV9BGXzV5KV8EHxOksXVJzQuRDgf2DSr2dzhZIWyLpmJo0idFYi584ZaAyMQRkbdUqujSfHpFN8iJ/MXsHHKPl0yPgLj/oiJkmCURoZciAn6uk7OCOs1524d/ksJtO3fyT7z7YWo+xPQECcgkNhSzAa1T7Y7V0fhAgMjS3JkQnpR+CjytkNjc87bAjo+xvhMD00NaYu/cZ54hopx4CvmyAdcWiawkC5jdysbQ0vnt8daoZyb8sPVettt05L2VAO87hpaPSbWeUGnc6F8kahB0lpJ223xf2uDb1kIP/+8Qo1nUmm3g/oJVMV9gf+nrvGes9dVydtRlEm1tdzRc9vn03lwJ/8Oi0FhfjgtSwxhV93YXF16jVhIPhnByOjN74QdzFnV9cKnEvoy/jV/OC9JoqCjONzSzt5Et8tYHlLVf+tZmozc/eQxO6ADv/3U3gA6Xq+xplP0+32c9JMZtHahx2fXE9XxfK37eWHx9oRIb2M+7VM8fCBtfJg2/pOcC3AhRV2kng4Axiz2sTSzXcVBV3hf6VbO0Mf1H0uGX4IJOFCIYF4KCqbielGp38+A88MifRRTvuRGbtrC1HANnu7ZbnaRqN8/atX1NSuyjVK3t2pzNi5x6YlwO4U/fpdzmimD+yYQ2ACd6sGzmkNHPfuINV6VzDQmKj0VC7i/3c9UGPX/LmrTYpAms2xtNAPwfqW9EDmbWjEMzG7QSykxpkNLiRDnAP6+M2FFPPYoRn9iVYTFEFqOgPWJo71vyNhjLm4dAUWubik3Lxw/61Wau2a9azmVB76zJBxec/7tfWB2OoRb6tT2y2/5rGAT2gtwm8TMyYg4VIo4s/tblYfQn5JDe8evZNHsU/DeycVlPaSTOv7NOp4V5793sY57McLfKbXSXFPXc1vDM9/bJct2qD2vajZ+FjAweKc18N9eE6FUKfZjQ+1bfwvVEj8hgjDE7afLoKZ0Eezh/Ylffiq1Wa7MAgYN91/QVelmU1pK79eBfE7jelI2as4Nfj3zohdrf//ojKH1eZnI2ea0LsvbFnQAuQ2RnX1nt9O4kMkQw2+lqKuAv4YMRebGUku8+h7yRNeYmuI0/grtvwWaz12nKHEqdB3jbtnbm265arElNXn8tSwoEViTXFNjILixvYpYFgUBBDzoEwgHs+hJ3ebLWsLA/S/hvnlNw/5PK6bCM5oA49AMGYyJXY1qPLOWPEUNmszVbXo082ZyudrPxUjczfkm2QU4b7dHRiL7k4wSsvRJSHR8Aj4nMAjv++/drteSHH6N8p2UCxxsBdx5qixoje0nbU55ji5MssRNRPGKBagG/C16EFLux5Xq+mbSAg5bVMyEQoqlaeQsl3M+jbDjOMs3zj78z2cWjbZWhOp+7Kf0cayBPV1xepdtwl2k8HYYqf2Bvqeqsv4V8K/lwm5XX9B3z4QA8ZP0vota+0sNNBS2S5QJ6jf4xyXqqmyCQXr5zkZ4lR98f5yUbBiyrSAWAvxPI2KV0Yw3GtiV/Jd+3Z7kE7+ydTjoku7zvQcjsKjv/8Yguwh1B6Tnp2PtAF8DlWu4C/dEQGMgBdxAIN3EZUV2uk3/szOusmdwJTHzR3KdjcG7PzIl45GPMskNYaqWXmetKEuatheBknw5eH32li2gVeznmCi/JiNZGUpLoBnAG3B3Nn0CatINNW4DK/dI5jgPcgxDYzWB37hs+bF/FxKi9U4aS4PBUeBLblzOy+ziZj5KrbrWuJ16/HO4Nmf4RHDy1udBLXK+bIlnZbIJY968TzVTrhFriJcjR4x7aXzp/+iwXMi8btVUhl9gXOabXkqbU/OddWOzkP4ty6MjSqv6bHOx4FDulnM5fNk70jUmb1y2hk46xJxtg29uY3My4rsNtf9PIkj+IzG8r4DtyBDqLHm/95XYkwUeWxVCwmJHa4AFgUu0woxjvmDZJb4S0Z0r+eRV7CjNYzv4QbeuNxItsUiK67M6iXCORL7WFb23Atk1/FBIE2EuiV4g7N2lBv30unx+uk6kw36YwIzvaG51sgz+4qBNQGbCsom5j2oudnv3KWS9Btm6jch6aTQTRtNVvvgjOH5o0Ew1a3WFQNPmJkbL/m/BH29FV2y+V4BiaWp/ThzgNVzqYtPBCa1rRS19pVY7B6oyE9PvVjM+g1CI12fAIHzvh5lq1w4nRiOvzDq1gxt3A016sewxYFA0bAhYc+R6a1fKd+nJcZ6CXlneO2ybKRBZ/CQNX0xbNrgBg3lTOs06JZ0hm2hXjBbyVe8ar9udlNCo0DMqUD6+hZlJ1Dk+XpePARew5l2xB6+zcoc3CL6nzdBmL2e5cyb04wQ2/Nns3bbbMTs2hUFMeooHASmVgJ3R1xFMuiWVyaGCdyjKMWegQRJXSMirVpadGC7c20Dy0s4nDidUP/m2uwQvo4MtE4bMLAmTo14das4OBXr8cQAnkca42meMfoaPLhv7tdWwzTbPsvSaHy3T1YcMX5R2Y/WebP658YpvSua7RlPoxILd/6WolsGcaA6gXsn8BxRgkIiDToWg5/K65l9Toyy6zW4FHiQZ93OqPrgvFfoR6rTt/OWsTweaos8AOtOdOK9/1fOCpT3PBKxmf6AUpiaHXF5T/ok42G8+Y8MXfa21YoqgRJ6T1Isr/X6IbszsNdm923Mi61a8n7LbtiaVCtGr+s1RaXmDbSHUGUKJN49rg9zkq1NK3xtHbXnYtNPlr4u9VPTCXn14ilZ5yyKScyLYpmW3tlNB7Ms/O+T67iHZdPUjzqdUg9MxiREd/cwLJpX3RAHTLbWnTyHF+zBt0mwd9PINggiSlT465uZG+/AyxTB8AgB7pDIa3a7Ed0HDm0NmcLQbIrZ4m5PjtnMKJmOfYiV7VYAiIfrkKGe58s1Lf7glpqT/3Qb7qCB5fFRwft1IOLsX0UWPOrt2C1Xy2c5O2dxlcPyzcFFMaS6WvgoSjZWDN37OfVyrfysF6APbfnV/Ox3fz0oAQmoBMslpaHysdW8D78kJa6mWz5rOZpBr+RJBlve7+2XHMzrUlPgG3ChEcYsZCrEbnQvI941/Nm9V27FfV6nixJ8eTyy2/HH1zvj+P79KwnH7eHVfdS06vby4vqj/dcq84ItzPTXn9h81VZ9Gz7w2Ebizj8NziaPnFzJpd2aYPy/Au08uGN15KztbauMnuRYWfWiv5y3WK8UKCezxJOyQb71GHD/cFQ2oZw1Zl/ViFWfk8OYvZiuNdp2aPnMxo1GPDuJnUwChhzNzjlMhzX3DQ8ed43zWy9wJ7p5DWUFzn/f4WtbzMHlbPW/MGE4y/HxHbHzrRjvfpZf4kOrqvR12VDkQGcIDOB8/P1SNyMY53y3cLl2JQ3bGZGgoBanR9v1PP1g8bWT8YUjRLmF7TasffQMnKlhBxdoZsVL9YdcSPU3Y7jF8gXMovKxvCejMGVc8YvstvRrZq8TOxQ3d/3Vaz9FiOLwx1JkXIkhrw0jLSFLM8zztjI9z5r6/nIW6u9au10276ArYVc0jlMVIeexDZ3y99vD7rJ/N4ZxCU/1t9V1MnYvvlPwI6TH/1cTXm4Q6TKduemJ6G7UC8aHcLmu3nGpSX/k6qDuPHsOf6l05VeeyvIVVvn8d6gypaQhOp6nF+wE5Xk2yuUMPWdjHRWKQAvBwrQKRWc+w4PAL5VBlaVF8qcBJ4GL9s2GAaWf/jaeAb1mSrqefj2fJWdp/yC90+acR0uinK/oWX4vfIP7nG9BkLVzp+YVfeHSQSSFPLhwgzE25BxE6nLQ7RqCFrRw+1VJazz0mDePY7YDWSVO1+Coqapaw/6eZ8l63DhFGyZrxlkyElTi/5A74Mv/QktZJek0ixiGGqa8bH7POwD67YEen84zjVeXH253RrVgd7k1Pg1Q2jqnQOEZcx4VSoTrhe9O/hXgeUFVHyKqZKv1JEPyJY9E7XOB2fdoKiDe2eT0ah8o2j1Fnv7F9gWZVJKB6DJaHaGfXBJZJG0+kl76KbWUVO7++cpV1K4Rjs23hkobNXFOOJIrR8m1OGZM5T8GPDj+Zrl7bwmSbDNdp4mNYdsi20a9tF68vVuxjo4tvIk8KJTLFH98dLmcbfvJmsY4GqCyrWdrxcAfoKmPc782fFoXm/H87C7OjolCwiY0jFjD3Rg3mpPtzvJhwwcV714V47ZbF+U/7BEA0icbw5qlbvJWM6VEMq2x+ZrhCwuMKP1oBSJDxGnOwnXivP8dBOscZD/slVN/iDQ9LLSkLVmcg//bcYUyLGw++1pEeOnvvz8/M/+33BLWU6Ll5MOfAokKFAzEx6uzBfuP+hW3B09sT6ThdCGmktcv/hP6XNcPJbdlCbl8iABMJ7RcD4sOeMryXdPWsRx14dqrczYpJC9eD25E5us0Tq/sjXQB5hTo1jG6d52vCLbGUKB4u/3nyAoHSl9gJ+ufzWii6noBPaJRM69HgM1twuGiUQwUgt9+DrgWDvW2CUAaXBOT3v+bF/V4KSjat9uOKtvAwgZHrjgWqIewi+607lotQ4XcZo8GiAxSbc/f3bauD7Jvt1NzKp9AXH5cRFwJcdO8bfYS9psZdpe43uBr9VF1+V+s0emThed/rJlp3R7fzGQd0DYStd+IH+6C6fWid+PLNB0Tsc+KnlfUY/weQNa/I0IMRjDRsMGb59KNXY//lycJ9RxcS3ubqGHn+qSMl5vz/71ZA+X3cOSRBMYxChQdCn6YvEaecmroEAlzqoEqj3W33l0elZSdW3uEETviiV6TpbkWLY7Lawv7RsP2MfcWGRDlhAzHqQ4M8O/X387L9aQCbwHx2pL9zBXx9lU25Qh8v0H3nP10fSfmUZoJXzuVKfPf4BwDIXTy4uvBNi+Lb3XMmzTqugzHArgcfozOrYp0glEF8W66gGuXvfHOAh5Sk8qEd/DWD5TNPE2aMDkcdHKEF3yGYNJ019nrdTytHIeWcD90ejlCwy1j5omllXIWr1rfNX9+fd0s56ntWSL3PhUFk4//ec9B6V2IPl8DKTJe1ao9i3RKreqx/1Qb1pNoMoaMWpq0XfY3VI8lautSSvdSz6EP5ZaGNPlbT0JYrskBwbL6DwmCvS43ZqemuDU1vv7c7m0xex14229UY0cSXxmYdNGwp4Bd14Kus9etQMUOSnd6ZjIZHx/n+XgeOKurm8Wa7GyMR1WzCBLfNgeI+GijtIZ/aEmjPIvVMkz1Y73to7Fmajy3gutwF6wHU825MxIMsWXCMFHc87dU8UT6t6U5w27+ZBd7hXekXf7F9hujv6rl+WuDEzgTN8vXnfHngmf9ihVJvdUXeCcTHz79m01NQCx18ti2nWSGE85+ZMrlvPjzh+qk01mjfA8XScj6tTUZCSk34xYwtM+Lkttz1891soPVRxT6ifx2614c0fO/DKY1DRIEhDpXPG4lv0cm09t/QSW2Hp9HLen6sUPen4zIXNikoulfvECxIiysZMmwhen3/O1Pm7ZAoY0WQnqsWSmkdyKu6KydwfylbzrgYA9HbkPdZOQxPm+H0IOCy5Ezk1WDRtzQp7Cbte7c33GKkOZ7ZKnPc5e/VEk0lzHW/lp4gQbH989TYX9YzKCmSHMg/ZFzPuFR3Ta3HVDghG5D2ifi/paPn6T+WGB3MxPDCduqiRWF5tht3Mtt6FWjH42DZFUcLFqMx1sxn+vy8VcszvNQ/XR4tJkRZDtL9HE8jkIxBZMpZ1cS9EqfxT6YPeTb8G7Nhgv1qtffGCCuQdhczFwT3TsAxWze9y0DponNCoVThMFl3v7MH8q81EqzUVW4ZpjBc3bVLfkwLbKXxikPo3yuH1zmeapXDE48QvBaPTAAuOT1vodRMFnzYWOIUFDG5Y3QHJtPHbSH9RyXp8Qi3Iq77Jna9HCJDFuB/NFML4/sSnKshSfNhaP6l0nQjY7w+0eMWMeiWWBtiP/lCPWkdKY9Xz5sysUvKbHPVj1YMYNtxNAjEinnJpDzRFGCU/Hj1ObrpEDSeZPHvVEzb5ArXh6yQ7IaWT1m+rNhagCUROa5Zs+0u6ljm90O6c19OUbIVlumNHdZXiiRfbMH2M2pX4qcv+mKkl9m4rmJI8/FHTDHMPxv6+lRv3eLkzbLVcd6rDX8fttUpTp+EpO8eRuqhobb61tKv4Je5Cxfv5SF403BsT6FgHXFqmLyWrZO251ebt90aauMKxj0uRd9IxPNgL2Lbg+cVxRWLrQYvYJZeaF194xS4XrhL5bhcKdHkJkuJutK4uXoUDpWZ+T7oM5WCRBWWnNg+IvlVTT8S6qg3WZNIP2ZZX8GrwS6R1I23LBXgkewNxBf+DYW6vBoTCN2mlz/ZeLF8VLopoS52+Fy1m3PqyOd14dDHNVGjayi+qiVuW+s1l6jg20/I3f4SHCMsoUUpF/QW+IRqvx8uoEofcFXqZcsr2dTfrGIam3HHsTCOthZ3eB95htCqw4zNhSdgVeoDbUv+v7QqADdLfq4D0QMkZzCY6HM+KSuxLnOZfj5mw9AnZQvurYprLaoRY4iKmJJL+2CxW2szUDTbXRhqj3Nwgdzc9eLpRdxpNcgJdeUGk/TN6xPJLeD5Ni2Xaf2uSCWjNcJ/vB+0Eo2WqHfylrUzOup2+g5vvkZGRAO3CSaQyVt+Wh2a8b7+yNjijlsznvTIyB182reQbQpLWABnJuCVgo0IFUW0vcSn5r7FXg9EkiFZw9IizWKDj/ho+ZnKrUK09AzDgd9ZUdgaI42Y5PPfEso+QN9widh46oaWPKBjcif2aLaa92sGr5+EMu+ylNxBTLgg9mdhaYE7nauhgzuw7NC2YXtsjanimVdH0NTyHDu6RvKKSXMSRLvZA3B7w4ze+TTHKQR0c5RmoB3y6v4HgrJlygarXMh8xMY6CPVD3lJsKx8bwtpL7gsWKCtGZVfnZWOD3TJzVNvrqfgw2sBFGN+QE6M6XT0On7J3guyS1kPmY3maUzjnkLZ0fZRd+w/3dtOYG3qdxoeCR3hhQPP7733x01YXHuEnjhVDYxxu3/fWuMjb478eL+kFpXsiokmHZNzBDRwS+JYDR9fcPF06NXtKNyYvi3/MtWt2gl8N0uyvsNhSoTozFdSNx7r/GgOfEIwGRkSiETs8Oe9b/HJk4aYPXu1GrydoAopcCYNe/j3ys72ak0dy6eKZLH70JZAmIDP7+HjAWlTv/7OTDbTrm4wAgXJizLT/xDeTCWs/t3skc3PdR7K5/94Tm9UsfNXHzlAiXCx6wONI0F/bFIvEx/d0dOwWuhKY7p5sLvGc3z9hR15WZtbJEo14XkZmk4VEMQV46bd2OPhrbVOY7ml0FveMPEahj8fBRedZOC+YNqcOX/Rmpt24VKiUbwthpY4AmtY76M3btQhGE7+0bQ/2p0spZHiJRHePpmOZu2m0vF2CLPDdcBgbjmWnkR54svUg0V7UDx8C2/63HTkZV4ZgHEqmwyhoCVfvDOshl+tFJ/jyTiJflxQPT8Hc/172O8HYezCVdwZI82NHivUoq3+X5waTdqbsvkzpIDbgLMUIcfe/Hd/Yk4hQz2bx0FymfTqbxO8CKTEsuAL4uhUycdsfOJr9cIu8Pm92/NA68zBtKls+aM4qHJp9OLs8y6ukc7F5smiERJkyoKb4GZafX8nztIZOss+fpStYa3Qkn46NfDTvvspLwtg4DNVyT5hBAKsaDlxiJFj2KSsHt2uZ1ytM8nlemOFBfQXZsj8LKWX1REMFyfNIQcX9UMlPvRCuB2d0C1f4vOZwiVCPYxMjWrMZG4Z/3dEbLqjsLuB3CADkkYRvw/74R8pu0/AnYR9AY1Rm7GkyKM5UYu2N9sLNx7uD/Eei9ZOcHbydPf/3KEh3ft/IgRC9jcSM1SbHm0IFaDnoOZG0ULW4lWdHGmdVw20nH9x+sHP9EGo6uTSCRW4LuAp++QRzz9ui3uKvrOhqgkDSzbzcjwi/P8Iq8LYuOeHtn2eSzU1MgWBO4AEe+2iXVU4eDMT3jypxslhp4GvVZ7jNEz7OAcmcRXVQFrYQArlHVcutPVeBtvX8FM0buBEQ47+xzSl1kQxOpPD6RoPrssWB0LHgcJnMPr9fmuaYphP9AebNhmtgV0iJzvR/jFFvfsdBru9bmhNRRh323Moj0ySnjNSedPjqZyD12NmHYjXy6PMBBOpS8PPeLojiKDRclQ5u/wehbOzpr9effasZgGUWJuTqfrgS19Wc845KcV1lNf0auxntVuzlUKGTh5esLTSS+DzggfQY6Wy9uXoI8UU8j071dyQn8lfJm64KLHinitb5sMTLfK8N4sNHnTLYcwxh4vLzAdaaUe7qi5cz3Up4aO6szMgdeD6yKRMQ3lsObAF1+7QSFfP3v+9ZdLNgvSv6fR3LT3LXOIwAbGJwAawNWOC+w/Uh9A7lBRPW3I/hC8oNvCBPwZ1Kd2pBoS0i5kXNeXf98PPxa2uj1/ySPT7ppRUtM65jo9IlyJhHQMt+b1c3nK0+TBvl4xjyvHJMQ1vfoXyTma2VBYwGPhH5vfOwrctj9fsTHtsIkLO9XBcJamvZVtaWqk7XsPRDLVgafDCZO8OJC/e03F7NqIPht7dIydHDl2f6SNlyGpaDpAZjdj1fTXy/DE7Iy/XD6/xD+JJO8/rmUT7mD+U9yds0nMujSvdU1K5bVr/oPm9sxap8Bf/nra+mCKMzq4a5twfpPhrBLgjGiTC9ZZnk5LMSUgZWg5jC4n7jawsrc39opw+++z3ca7ya5GEUHUrdYi2tlWl04uK98ld6oQJhcux/L04Siw0ASp/h+mjiZOQsU+2uyC6hlnH6dbJbhO0StpEpq8CqX0DD39o+m59/F7/HzNzblPW7Jjvz4ZlazmGXhbrVWNtOav7Sr9k940RdnWnP+55++WVs89NNlZqLahiuZwUYmmjuevGbPB13tYXOQ/fhCx5BQNX0V/Bc2GlLi+0FvJc3RqNLWqxTTb6xJR/ayudO9cbyQ7d0hH0lXPH4cz5jtQyL+HuqU9CXW9vUg5sbWoE7n+YMkQwNuxD2PjBhvz0+zLc/A222gb/jW82IwTmoIYht4a10aweVvJNhRv+btgQMgh2pPp+cmTy8EL2pxaOZtNHNcTLtbKyHGwJex9EMPseJAxT2pzLXAVCjey8N7q3a+YJgLM6m4inXlFFsznfdp40nrsrRZxpEgx9rlElI8xfORJru7aohFfPFl/gctEHHP4+JYOkfP2bN9P9uY5SAaDGo5g9+h7bpr/8XN7fbJoM/Tf5zJFn9CKEEWotCqQSP+hDxiM1b0YO5zVI07PtbvRn767dyLVTl3A5eoinwIX////P5ThvbK3Iyal7O4fbqwrJXyazuORDf9ZKNeu4scXdW6BDxMNtVKimDwKx86w6UJ+71OL5jyRgwJ11f+65V/azFatGqZFVAiqmDOPOqqt9TagX65xtp16/RfN1CeeGNoodG6If9vGbLyFlSEW023VotZI23StUopM7srZ6VgrhCZEjIrki+8ctZE/VX2aAwRWArNcJKAO2P2S3Z2KmYeE36i4yN0GYdaD+WC5X5dIT9T0CQ4GCOys2Gf2RxUZ0KWkEi401qzV5XQW8uEBhGG1e/8mvdQvHr+5uaSaj//cSitKyD2R9osqqBT5APCn2EHAHPmQs2q9f6It7QFOk2FrpNgc3cefIh++Kg0gKSOV54vSsbgZFb0swmyoRpkUKEawMcFfe0CkacWMil9Noc8A6cklwHLiwFjn7tcH7iG4PIH5eidIWYYye/h3eSyyYkIM/EFkJTAvOWaonAqz9FvElkKbgyl5ucXDpm+hLbZ7b5ff2/4G9Z4O5u1Nyo6Srd26DUvkDDyHC+Ou9emDPRGCHITshRtnr8s/XrsZoCNI0O24m6JCuc2SYm351iH3WJu92XbpzsXXLzM24Ymd312cV3LmJGb/7vYpD6Mxnz8wYlaxfGueSiOXKLD0pJ6sf/kMVnj75o/hYHPFBr5yCtdc0f5YAtNiYzmL32HZ/QCebndgpegI3oU+nO1etCD/V7YnmIJ9rd6D7sBq4mBI10pyaBU/r2U7TpH61jZDXUEOvyf2ySfzTLecVCFymEDgtTZqLDOujLtgf6XtMdYOZ8vbYpKYP4IVRp19vzt9Y6K8Af0IoapkcySkPGVB+hZ55P22jONLfXFXR2OhNSrILbLnX6P+1W5Lz+w/8K7kuct0zSTW465/OANFRq22DNzb0sFwpDRbspm3jdn6UORBz4MDd1FXHrTZ/QzDeS3mZH67Z3HMlw5MwI+QL7h0OGzHfw9+D5p2trP+ZIvNHFCRFNApv9whn7rhfYIWU/1thkJMMs9B2fjVN313Nd23Zrk1KcXZiu+6QLm0WrIfQR7FXsrQyPVay+5bpYJZwAFsRWa9JGsX7/P1uRyoC3K7qgORd34zl22N2ZiewlQmCOKqDknWXvTf+jiqMu6tgMYVX4CCWGFL4LhiD3qvomxyrFS/miJaBSagN5lfz5/bJhMCmN49M5BnBYgt2s3Ewt4uBkbkfkQcaOQq6Pwo3Hnjbc4edB1cLJRKQvkR4usaXPzItAyODPeSDuue+UCKNvD0nVsS35DRdA598f/+vIrPx0q7qpbgHKGUMUknbQvlvBjq+vIGLv1hNE1yFWbpwvgY8Z8x2Xo8dvs1mVQuW3MzClbheHfs5TZ2rGmzs7PBxdDgEV+oWYTzbvulOh3gVAAHG2yIh8V0rK+L7xYZIdb8qDFe+2qHBNuz1MeU1nrlybMwLXZ2cd5OpL43K2MBW9KKxbyJ/li8KTfXnAhMMyKl1ZpscGfraJmcKsv7E74RP5kqc6Varc97kxPL3td4Ff2IzIHUKJSnocX0+OLwr7mQqtObSzRt+BdlozcxJSE/Px9s9kxDBlsvDDqf3EyGRF04+RMIae+pRct/OVOK+y2+vaxIk1YVP1zemDNjvOQ3Hckp+ITOlZFO3vy9GSgYUr09Uc3hX23UzxgEqZYlRy/SXIoT07gzjDLo4WGCkq//RRQfGmJE35UymW2ic5Z1TmsOuxae+vOSXWMTF3k16PdRFtu0RZzqegzfadCJFVjYvz8gUmKcqkIL/WIExZfkAl94a0szsEkt5Dl473z7aRnV9PLVrdDty0V3HtMd9UileS6tvltAtYsBDXHW25TRVN11dnG5PViC7tiGe7YwjmLz9pKVJWZ/dlWDF+LYxOhzlzNlO0e8kjZ+etsLaTTdixfC7Mi+kbHtNDPVCp2Z38xvlZo7iO79pIUytI6y5NgWPXXsYpY90/75CJDWSQ2pykWTNGTgaLlT05vFBLNhV4UxUBqwy3nkD3Agp1P5wMF6c2nwI6bKwVBc/Rhw04fF2Jlikvcxiuz7hoWRJ+V8815ZdZPSfp81R8tjINbqFAV+wFh/YVsOofis6cCmdtu9nssK8NsfjxysYlj1+E8obT9R3vVtQ2tPZrPLj19mR3I5u7+08oR6MwCZA1/OnmfB1qBb+B2x5aiVap2ixqVEyx29Vb+tS3aXo/yYH9W5y0SM3Y8fOoOX1blUsN0+oVnurBSe5OdxyVkGoKy7W51oUtKhBRvWZTDMwGb02nk01dNjTyBsSPK9y5vKhSC5siRXxKtatyFzyskn1s7wd1MvSOc7M13NF9uOtUNYWBLIJw+wormseuDQc6rvBaqqu+YqKS5k4Mrj+fs336ALJFIPh47G4ipePtgpYvUl24ewtWKXl98L1/onrODZhXc6zt/v/0J4dg97fJ4vFEKWx9RkXBfSM2iyDYoT2dq60w3LJvZ6MpjZXzvxaFLbFv/6XYCablfIngNlgyhQz2MyzriafPPcmE0NBPPyge5G9NozH9vozBc/1HTdG1iSSh+YZiLzt4xJRZEBt1dZMySU+j2UzF9t279PW8Bs/t/DsjG6Y/VmvJb6oCjHXsiZEXEIPvhBcRnk0vTXJBSP/jmYdFN+YgNl2yACV21uqNEWm8Fo9cf61D7OvT/jMUZBTdoYwXxB/15JZmbu7eC8Hd6bc5WM2BDx4vitu02NCCqZxQNLjwVn57yRf33aXA/aEp6szZ/MJp5LoYxgzRNOvvxjCSh5GeDL61BUr//lZ0DG9l/0z+9JVKFra4eT3PZtZp7KGgwmYK4T6dBiO0I19rVHUpw350+Qgu3UAEqZ+mx2feWYJK4SG/IQhpulnnqO+NSxstPGVtMK0nn80LlOeq/guYnBdaNzsV3MKRdyVWxwCJJcpO/6a/YcZ0NmBETgox88CSQXf7NhE+DgdMuxXfu0w4NSm6phzU9LugmcZvzRpLb7rYqMh2vZgShY6z71+6ZAubPhPOd2n1Xk1oFrVB6CQhRdTYLkZ/vcui20flg37e7a6tmVe6hBBv/ryvrMg1LfyELjsk1z+7OAEpl+rkaEi3Nd58Afn9cufpvme13nWlePMV46CcmCSrMTe36+EvrVnjkdlFD2uJzE4Rxsxkzv2ZNepriWM7oCZkbPE4QGawdDaFtz+35RtjEs7lw2ikz3KFycMrO3+79/Os1RM1kJF2upGzUhxEJLF7cWuuKhvfh0qEp/ODXTd2hxeyL/nNv5XsI+16JEA0L8S7Kw7C5KluR2eEvexnhu7fbOqBGd8LNEmlSurg+PYJ5rLA885dgChz4qu7ITHzK2E5ufjaAqOnvy0GV0A9QPpDSeMpTauCT1nv5Qs/qVJlUb9uEYr9gOw9vvSKweb0N4grE288WcGfDfbz/HskXPshgyq8Ovbf80Zy6aji12Y3RLYnE0k/s2cmjeqDRJul2r/55Pu6lqNx+/jL8v7Q3/qMu0tQoO/5BvDwq1WNR9NSPgyVV/OBM70bOZuyJXl+bXS0iwQ8Pesj0ZyWWmGCA2E2ZdwrvnMabW/zLNgx03/sWrVgRjMd2yhxAUg5W2Wa3JZVmC6Fe+R1N1YwVpSqVnedqief/fnTNSZCbLlyepsTiZWvoSqS7Ucmit+4PE2abK3Y9STfh+PK+x4prP7p9NsM+GPVxQjJ9RFIUyP8a95dn0XEVFuZ4MFdqS+g2CKXx0fq4fZu1mzf77ulh3l2MTrCcRuOd9fKMyy/f8lNEfMSA593pzdRa/X7GHK7JESPcnKEmGm7lWmqgOgX300M/uE0mJStwtebQaNulpCr1fDfjHk3EVf4STZuRyOTbUT+g2kuipzf5BT0Suceginb6veKHR9nx/0/8u1TZlf8GVzuiioSAK6JboHrQyPrS84Di1+DKZmCEfuuzF3H7XQQjFzIlyfjiq15/cJWG/KuNQmblbYns0/QlP8HgeLN8WBjapd+PbOSjZJSmx5eYTxj6cKClmv76Hp8jsEQfXOD3vf0+1mGPBy9lVtLT8j23ONbf9EtcXnCmHPuh5eEulT8vHWwMg2O7eIjw+coTISa/t3jAiIxaoj9ZuPlytB6oeZ6bN4QfPn3Y2+SxiuRUYXEA5JIuBs8SD93A30hi0Co5wPOG5kq1S5tNDkpnaivAlN0p6eGqVnc03joshCzY3V8+0gQ5KfPRKYDl7Ca0sZLi8F4MdVQ/bMeEZeeY29eBf0I+hvYjPsbuqp1Mi9CuZEuyjkBtjD5iPngeuIAeDBZBOePfcgw1/bCipcXfQ7l0YyZR2tVojnG9utSUlPIrCjH+EA1zBW2pvb8bophGqC5Sg54Pyt1h6Gm84Tke22Wo10k6oLdDcqTl5NIOTTd66IOYJ6g0Cof3FD1fkb3g5SdvD5y6P4JsMDuowSg/xPh7LUuokqdWBecg0ormOd+lff/y5M+yY3d6ju9be3y/O52VzDIySpdPVYGXoisW562o9CD7HCHGpXl3WzpZz1NxeJT0JM3QQCrnjLJ6uTYMSoUGddCd140HrYmTMoN1xsPLnatG0PLXCSn1kOy9NhnTcWoRb0D5xtGvxCLseiEko65pjIybpe730MlmpMAu9Vmuj4Hyu7CdDptKaHfoJ96cqxzM/Xc5l4BRhG4nYcfb1SKyNLPTZOZvZ3K6N4r7uSSRqH6vYdgLngXweS6Dq4os5m43c6JX7v3HmoIcXVhs++tK0FpJsKzf60iEUSLM2K71FKc00IvSJ2RwlzreeNMFazl5gYpa6UjrpblMlsZm5N2P3l62UK73OmWbuoYSw7cx+8tsaYYsF6vGnMTP2u4six/KADQyuWYRWdiAu5rsaapTX8mWZbvtcy3WfZdZrG3eEFN93JjhWDbbpJFVWkXyYNaJamAvpul/rOmwscqnMNCAJZIpPhhNFOYjMuTwpYneeLwNZHLbpON3oJ6y/YAeQmtjZv3Z5gTnx87MESz81QNMSHfV5meK7rg7msuH7Lzbaaduc5SAIPb07udLVDKf/B42hpB9GURHZIU2NhG3uNZ5AZ6ozwASH0LDmIEAueG3BOMzFKqQwr5Wn1A4DOk1gBvzg0Uqom9Fy/nekqaPWcrGfX9k9OBgmM0j1i4+gi6slv7xTL9JoKhPp/qBqZPKTAUYxyuaMzb1i7OKrz9OtKzGugIyoxCuNEI1MiUdk7igf2lNzptR87DHc+yNelHTWt3Zy6PeI88zN7efTNllJiImg41NGbq3bTJmilyKca4c6/4Zzk82EbzyBkcIAZNgRxKXzBhyrt6rygFV5bMcIkm2HO6jMVGMlFqR15+up+V1wt7jCSjk4aj2hIeeenKmMDkRfcbXBUGPaPEsCBnAB8Mlq5mZz98nbbeD2QLiqGQ9UMFUGUrxoori0bcGkrG7fqQtrfhHK1im7/+9evceTIP11pcoq5+pE7hktka/NX4mbvk4VNX0zhy7wHDzXp/mnv5vr3imdWP4+S2ZF7zDGJTKNRUSR7j8uGVJlxPih6ZT6b8RSXVr350H/DAOhdjmAtkeYpn7WWrIqYbiT/Kro42T2A+dYFjztLBvtqf3L0cmyTv//hasFk3a2BDnOMGmo3b4P+/Nqcqqb37Eml7uRvbQ+Pd2L7lbgca51d79sV16gSVsjSd6TLzn5J6Yktxb1bVu55YP6cU2drpevz2ZoSZsGTlwx+hkiTSZOuMXkmPeepm3uwRKHEjNdg3zlZrrlzv1nC7nZ2fTtqxMHjhDeLE6YcftAPxkfL/uomF6uuyczFYn1GjY68HC9i44PjPqLPwSNr8fVab3CUVS8cUcem1jTDr9/7hirHDFmfEytXHzfl1RNhX/DM7Ntn0NUxm2jqb4NG2TlkHsYI7/Jo8Tkb2msqcn78LbPYKbvM9tVdb4843JTBW0JWPoj2mcoWmzoeyuFsgAF2N7cabdHfesMo02YypYm2NfbZawMzpeJeukL+31/aVm5loPWjcXNoOgdL93//lsrNkY1yLYJLEcvU6iNYSSvm/At6KkAUm0X3DBA6MM7qoAd9WEneuOz7NQnPE0yqXPAnL7DSXu80LrqIiaTXzq7z3toXykJOTdPbD6ev+C7IJy5oHYlBgG1gx6sLKjZ9HzAMIsZ6Ov4M06rh+Vxnah/2fv9O6JCMrZFxaUE51pA3IhMyEvpED2nZmZjsrUK1TPFPcjHTANYENiNLz6n4/h8gm8DnurBZ480Yb5uM3/rQy+qpbyEjS3ehaxmywWVW1HjfUdJ73yrOp0ryLRCN2MfTWPxJRJosbqUN0LvI9QHCyxLoN+/mtHJsmUzni5LfPjZzaZ1z4JKlwebXnezz4q5vm9vmhTXERrv5V8PfFf5RjwF39/PMuyFO9taC1n7VYt8CO9EbZmEJmx2XZ7unQ6mZtZj9GB/ZkwJ9NX9sRR+lMCie5CihH70B3e8I7moxfBqLwRXXn2szgPhn67f1YkD4DdX0ya11wDbnCVr1LZ+Pf/FivlSp/xiOGkYKg7NeTq0ui8jkllw7j1U0+RVvE/sm42Gbd/2g3BuZ+kJ26dpzaKuiEo6WeAKhy/+mNY0Km6wan1PksIHE2/zO/29pTuVy4xJ+cxI9LUjDeam+dDOrXNstuItL4W/D+2SlkomR47a1hwZHJsMp1rF0Cg1wjZtMGmBf4Nbs2WtUtMuQjbtY1OS9IXmbohLiiwwRq01nymHzURzeFetTWfjo/LbqW93kuYcZEoDV4I+DzjvF1N88jnyxVglJG+LXBSr2asivKOae8SludodccuiT+zppxk1xo74eGPfheU9PF9DUOteAkgkpCyR7fj+7Z/1ogakUSysZuwRFzRYLlMuPiW+DbebvknV1ftJiFFlje1ZVfxLTl73aYP87O1Yq7V9Uri/ZrqsrW7MF7sriyChGw6QV9WoOGvB7vtf+stQJQj9NWi5QKLlE6I1VzzWdf7IB2IBFonul3WGnN8jAYot2Hf0MzqRSQX8EW6niBC2hVVhI8RW/KmSzYdBwhGLKLao90QLtradP1Zb573o6H8UnWdXo1wXhoGQkB5b1Bg1jjpjG3Xsz1QhpFdC6JBeTe8kEOCvv76fWetw1lmbe1/XB/ZJmF3uiAm2YtNGBTPLpQoQIHL1tnW2Uv12jrA7aN7S1U1fz3cWIXU9vd/CY8Ob2aAhAxCpQmUmRYVXC67+cQtZ+OylGAd57CqmBJwTC+5IZvCpCUgnI7ODqarwzqtxrgg0Inh2L4cBOtXn1/buy4v5X1mlMHSHqEfQPxZbsZOrFFRL9TTm5wZ1l8n/TEXTVrJkE/LVnV/PvnwrkgRcrEFl9sLZqcJXAKwAP6d+9oZcPrG21UZmZ77GFwjY5rrfmTLMRMues4y01+8SbXzSw3bqZ5mnbHuJmSpneio93pyV2I4I3VwAJb5Yiu4w5XbZmktH60FAD8/D7s967eQPqOVXRxgcv1H5KLXwps6Xffn4Y/n9tcH0fjAuzV8TK/tR+HHoUJJQGOL3cUwjvD2AggTmj+r1NMxzzuNtAHnajJVrqeMlMJufY+YSqKIxanOZJ/TTSaFcBvfsf1ZAu8/akz/GpEAtwSpEAHomKuz1U+G9WBYLOOM1bfYnVVEL0vuW8140mwRp/6dBmc7NWxG87uzhOwwdP4dSeKEz3BchscuqieoCsb+ZlyDWLI0c3+HR+qE60mIkCS2bwBX6swQGhEjoeZRBnTBb7Mrizf7hn/USEKoHFrqV2maSpiNwVM4up/YPOl7N1YydXTviirk+PZ0BTefHV21LbUwcf0erhe3VCJOD+Z4qoJvV51bVWFRxUpkYTmAUjFbKHo8v0LHASdYL6+GBm8qIYm/VoxUXQ5yiUrw4jvzexwz5FVzNovjN29//bEwaxOP3zo/axdItUHJxyh+n3sTvBvPBg/O7+nzucbG6guLM6z9Pu6Fp7BFJiGQ+rFHHSHBQzbiOJoA+rPJq52095z9sM7GlKLmD6/WoCuHEj1OAx62oTbJk++Nye3kpn2j9D1nv7to/o87bpbGZevT1bP2p941q6t5MQbbm1HIEgPA0K9upx+hkLCOHubDEDPPpKsgwbxv+gyGV6kBnG2Gr/AWy9VtMVcp1J5eak7aWRgXjcdHqM3sfBaJVff5TteuaKw7s8HhdfglPqIZhmvMHNST1OFRjqVxmwwQ0Fg/OeCNZuj08udEa5X368cmCkXsErfiqo8io8//L9o5iVMHWPEGVKgcRzHRRIV/B80qnaTJ/eRzPalsTW69QadZmbdHObif0xVRZn0SVunHdH8bKtYu9X4pjsaI7e1tga4JE1FRmCEaxbO4+8V3/dLdw601stOQvMwanTQ+3X69skdyH6Q8btAxMuEAs0z1Jp01PBNEgkDLZPAUVjktzSSPs+2O/vCQUYL7KAC09uIuvCcxUMpB4COgccKV4ivVaGpOcdCsvwmoR9FzcDye6WH/wF5Hy0Wi3YHGZs+YucmFsdD1URTIuCiXD/u8DQMDgza/fl3J4VMJsb0ussnkwHXZ6YzancCDJLMskGwv/pi2Maqr0S0UfuP39b7xlHE5vd2oA+IVwmOajcdE0nz5nNxNF64z74FotA7dy8+hSOYVN7nU5EqocvWKMxRPEpikkFw7tC568fR8IGVDAsu+vyycOGWzNHPGf/8VWKxy1wwgnuHLWRTYygsBMxd22DYLtCqLQERmkHf1iUGxtmtVal0879OunBhTZiA7k/TBHRyzwifNpReOMv3tfRstcYIBy7ZYz/HNJkxOGfQY4SHuVxKZFzSliqPa69hWw5kqa5VZGvnDo6cOh2ebG+j9FYZOdv7vO2Pitx5ipVBQQOCaR3F1lsUkh4eJXLvysOxYXiIVZ+8GFuVs/3TZAdK+XiWbwRU1SKierU3y8Crfln8YYc/zLGzI6Zjb/87raYhH899RE1Zy8hc012KNaMlA+v0/PKnr0VuZWBXMeVBJc7uW/IwrVuxHHb6DVe6xlcoUUYxo1zZsjsdq1EBb+2qSae/fDcSE8fUiZHKxe10txnolIW86Fk82Nj5Bl7VlBwq6VETt4Y3opwZ6tNhM8tHtywkNVsvnF0l80AUxBvEoaA1u613USwVSTVISjA3gXtFHmYNfh/X4s5Ov68hr6BOsfFDOllsVqds68CpulQgBhDi6N/Gh8pYhtX+Ttq/413VyR8NY9Z7CBKIdlWny2hc69QCosfxrE+l6p+W1PXW0Z1Z6Pl67t0JD7fMjh+E5zlwrlI1mzjG7teQ5k1OkXH0thRdh2smV2ScLHelXBavn/IAvGOXupRSNdaiJ+84b7Ju5YONHuNtGTc3+m2lye0qmZh5AooO34nmvJdKOvrOsN97pIP1SeCtvFIFS0SyUnA7ezC+MT4+ELG7AKKXaghzXOmJ5WqtcVuIDfdDYpXoQavZOxrjNEz2lwoh1eAZXSjI3eAKUFVOBoSF2H5WF3/mX+ulyZjZjxY8yFme+yXJcV59b6NV2Gg+2r10Ews5W2at1mqF4olb+V/BErRn747idSueig0gwhuK7m39qRSmL608kvpadWftoC9IKprn7x5CGZxhf1n8nynEjjcSwcfb59D+RW+rpy8Fmx8lFZVPm+WKgODJvjqstH8RVNJyEzxnwQ0Wbk2Wr8TBTG8fkpBbaRPQpnBiA+Ij7835mrRqZ5DEYf1yume9weixHm3v1+yJPEuBXnVouQiaBSus41m0djyf3rw1iqVe1SymCLm56bFrH31/kXdiG1lqceshR6nulQKF1a1dTcA/Yz4pCXxYZ7+YmF/xh2ZWmRz8aXUpWbmW79ToY+FeySOF3PCwni0uaMkOVJde0nWHj5Z7oXbjIFZ+DUXeCKndtTttp6JqUQik3F0UGeGl37SSy46H0j/RbXn63Behy8OjzYJQp1gktu1GrISws7jtel8iqg5EkxtVqHahY3xpHGAzEhEyz48t9+Jtyn8M9EEuoZgkmvAHOF6Za+B63L7MI18ZM1EhJLRKYUY9jM80kykFe7iXwDOdokpp+9Cckx0ALsCL3teJ0O+rtRV9Y8b382gVP/l8uPqLBImnZz6+HNcqTjyhJRaXOg95y0okU+813PA/JNO7lSl4Tz0FWNM00T+G0E8OdlunA4qbPlyuJv/iKUbwAwa2/qeOd0S1qP257dS21cApDg9k2Dpp3hIZOtU7JeXO0SvuNYTDE6V91gK/WGV5ZBFNn5CpcXsxlhy3PR0GnB/qk7s6UaXSCxnXXRUpNiNzU5Ktk8FYERbt/vjXxDKpch02quOXACxVrZMDgLvfasjURBih7leSnles2qYAQupC0GQU8R0915eD4+akyh/RQl5gQBcACxZC3Vbl8DVdf0fEQDzcgPs9k8gmHI9+5Vp/WT41E2Uo4auWrGDQLecc0U8j0VYbOTtGWw5cwR1t1TLkgjp3QkOfgsVojGmtThEfjUfR52sfTqg0OKJuywktH47sXTzlXKIudgq5upCH/1EoNpLgkMCX8GPoqsCEjpia3CKGFdFMsj5HHupSrLOGa7biaRfI3pYyJLmNXBZuX3cmHKtVb+2bTOQUkWjtEZ7x+j2FLh4IaldVC6kwVI6fNjt9d8SpHZvehMC/3eR7X4DS4ZkLD5pO14FCMR+2FOraKwpTQ7LnCmcmBlswESiI4VlGzqeZIcYQ0Qpp7+tui2Eq1s3a0Wq3NtVixoMx33858Omyjh0Wb9P1RfKNszBlRy9L//dgcRtgI/0CwBW3m1FG0FUyY/eN8WUgDer/E/IoBp8BXMlB0SnPht7sVdi3b6dyRI/oWTx4dAqqDVo7mgKG5D+TZ0iubo/k2MXUxrEqLZV0E+Fw7SlTngHmlQpGmZ1vgi1X4u6QlQxvhaxmLdnOehWeTbS8Cvfqxl1gMXiaoXzvYCoyYMVHSC8dWmM5Gy3HdBkbS30VChffrL7vYAwQh7Cq/zJdK1SENofyrFXFb+bkedMqD/N24RB+n4kANnG/u2uasON33b2xmoRq45tqSmWV3vg/GD+hqSE3SiVPNrkHVG5BHE+e4lwktcdZlUffLMjZxtOUxXOpH3WC5VXY3ANVIGBvKPSn8xb5/tAH4ZGjdAO0ByOVhpo+JCkCzN9GvwAqqAHK0SH5gGOnWlJTUT71/OY9bQmrfmCrVwoIWhmVC4SakwU3C3wYqSU+2NTBQ9ZFK4Q9o8B2CB1HT2nekfhx6M0hjjGTaXtfxg3LHBOC8GvFSxaCCeOFuDCufKl1x8XGzvkRYGBp0GK1k4DM8637qPfKrTssgbaF3ess6rjQb67W7/VVa0Eu+7NfGW6zyHCaI2ZtYjit0Ii4klfcjrNKkiumPJF59cAcQl5lfdzU3BFHqOpFUea1Qa2cHL7IcRXNUStN3OVjmKihWaqjfruEzyiMD9fWGUpW22/hRhqloNpG32k4S6ZOtBmjXlrC+iUrfnyftj72QcIfHXk4ol8pxdLoJa7whfsZtjN9VukZr2GsQAyqWBaD28ez37HYMo3Az+GEzqVNi+oNmUpoTCdjHGj61ixICMSVA6t7MQZ9rZ2QNzBYKp7T9H+CGNuZyp/me/OM546M323E9MU0BHGbt37HqtrgH3+xY3KAjzB2tRHsNL22JQDLN1dP4Dta1yubDp4OfIsnJ6M7EQIxQ8V2sHFTFNbwC6ktpegenkMs31caEQ/1lZLKfykSMS1pgAPiendeLr6tKKlKNL4nr6WXVme41lkKIUYTbzQtgzRTHL5RxdFtLKzKoGL375f38WXHTx60pfsG+tRN1fCI+j85ZTFXmBJ8qt5yWw1Lz9nrVm2rubWdRiOef7j0CO5dv8jO3kw4OCKFld+dIgMKFDnkpkIl/JiUUj+u3r8ousMUzkeIfGhvlaocpmqWA/YD5anxYEzfUxux676OW9ux0nLEDKPSNDq1o9BeTMhQyglzKYU4OXlZPqbaxCz2wf3mjLvJUH+2o3zPreL1CovFj9fEKR0YYCELhTmTWFqaPkEgfrMrXaihpozlwBkwpx9PvnWTVRWuFZci3nAco+FEyAu1JHXzJ5rzuBkRUYHZGF63FGtOef01enClUtBp3bSr7x1l9XY5P+ZNEJ02X7R1fJh2L+Zn8EOPXqAeV4fFfX/FJgpPRX2Rr0RuYto9kcN7DlCcDSaDtrjt8Ex7kkkRsRRYctdPcyRHozJuYHscrGckvaWcMl9BALbJP+Yn5Bf0BNZL42591AcGF1HF0T8qI2cvxwrhVvsGQumRuFUWRun2wP5gAUWt/Jjbk9gDuKQIvY8R3NgZmWiF+0Js1vwDT86a3ZrE85X/nZTihbw0/wldMGjlmUzjk2LszBWEWu7OzQI/2Hs5zms5I4oFskfVqdjmcC6uTYyuRuhBEM/W3D+ReFp3Pt/etElk/ry/rBiAi2hqlAztobFTTL4WUDN9BLqg0JxaOda+vYZiKn7471NPqm9LMrY8KtOuBuxbckBZFH+Q7exN+Waw0V7S74lWRdliBu6rdzNFgcFkh1ZtoPf/NY9SlQpNDLUTjXfXLPmorF9fRrHl/1oiHwSlABejFTBGyEQ4PMofyD/gz/4PylUoOwBw864ukvqXeLNT4xi7fPtCy/lHUsI/UjeAOkx19as45WH94cqiK9lddCVePPnv73g+9LlZ/Pn1F4Vt9qVsFwaaSnDqsHJYAuLOQcOkHU+9p41aITdqelveirkcxNbsG9t9zlyiximDHe1AbQ0hRbJndmcrn7Xt6D2Pyf7N+/IzU6StzssC3KRM16vfCkbHSm52Nn+4OLFmQoGZkyr4ATTBSu3NXfKs53FWLfECpH0vRY5SrASq//SdlCLkkDq8BE0+f3a9c6duS69OryajhevHDleuhxaS/Phw1kvG49zncsIKX6uyfyOuo2jz47L7V3fQMJkG6JOcmAjd2c2JYzgyrDDfFhAASsk+OPlh/m84qjRnMa8Xjx9m17XhIi33N8aI3kBlwg+tmsl+a3tFV2clM5uN9KNz0/hOSyPN5JPAeyFgKaPt0ElOW1C0u1h+DRoY/Ie0CfaMHW0jc+bUkUKXcT6r4xTWO0KGvdq58NpfXCeYaSCOr7Ps6R21I0a8uU+T3xI7nD9rrS4u/iS2gKB3V8P1dgekdSfBqt1WmLoZ8mQMzNc2H/yWQVtF1+TJeLBLW1BwH0GCz8gqYf8pbeH3cjPQAJAefqnkWSXSvfWW0yJ/6hXbC9+LFjcaUBJ8n/c9KNGVIaN9GZWW36FjtVe1Cx1CZ128yMAddkqQuL0Ps7lGxgUCe5LVnQnMCtZlmlYBHD34jzJiXMKppfI1LFu5FOsdSJP3ApgEod2tgyERphRj+PuILRfORVu9HawXRlcIfAyPC6NKB1ejtxfzXumAHU9U2egpQ06EdLTQWgW+Bqb17IsTn9dxOvqHe9KpooXLuMq4x/ArMpb78xglMYVw+SPlAsXugANiphQvAhqToX//9ddLy6SVzui3S4g6TtrmTr0jmfZMhhdp3VLtI+XaeitpgNj0qjK603y5lze/N9d1NoIF9eVYw6ZHFITLGCUf3EQmo1DIxDhzTKwfpXNEfA3MXtiWdMVqj2/0ctVkCFhrVqbo77opnqfWOMgZaIYxWZg+cDHe6y1z7wNCMV62zKwbVLz72PsNEbAlFfvtB5bhBkExBvo+tV/2rd1eXF/dOOKU4bIp7wTI57R6xbK5NMmOyogO3XHO2gsRZC9kJxD5kX64p19wCslsP1dfYWqwSBkkw1x3hOqs9J51NtCpFzxc3oTP4R6BvczLt3bM8tpLXlcE8Ax9cEZ4q5MEo4mmyDmzzNUc3errxWlWeSNFqMJf1Ll0PHc9SOmJJmezlGCHJ/RJZ6NupLslOr2thvarG/6/kQ6w0Z8H/fT4QAiUudN5LwuzKQ2JSIY965a8hIe3yz5s+RTXS9XXbmzbkbx9kfRkD1+i6QMhMbmLyqClTectC6AhnDw0c6cfuyrk6/ZjoTcCm9H7tcZJmWz6y1/MDem4f8BR4fBsSn3GNmXa5bYxTWc7YJWmrWTd7jq9NCcJionN3BSdRDFcEOCIDTavmptzOPAZitch+slyjEk1bnjZsd6MZjhc35m1NVzD4256HDqEwuudq76yIxZSjMbynnJgzE5ZoNC3X7YuEteE5zMWKkvjOLa0lGTpUxJjMGm8VGHw9fNti1sm1XQ6zlwvP8MxhmWxXX1RSt3BZShJEzCgStOZPP63ZMzK0Yy4Tu7RWna9lh+vo3IIydH50tD4hLoAxWMJXnIisnOGbYvfEix+3J8/z6bD0qlkHvjvlLWjteOUyQpZR7NLGYHF73KmjhdPs2FItWbcbPj0EkDxDUcbK5d+nTxoVC7WiTFkdudyO/UnMtPD/IA+5dbFFIxShPXK7P4IKtgiaOEO9aWjFl7AYOLnyn/dyEcjWAZSDMBu/maVuLnV1X8PzE2yeRUuhPBp5lixhUOPXN127aREGWYLje1OsX8Z8dTCUn9DNKItw5mZLXsde0E+jUys3p23PaqkGhQaPQ7Fm0VhUM2ksaF8L3/UVxUDvUYwcG8XBlOtC5hmz8uZnPoUyZNR2G+vAnVJpirxxbm0n1HFAi8H/GtrE2NkLHWn5qmZV9vgA5c4S6VV4jQuGGBEtXR9PaYn6Qq8HhrgOPhaKNzJYKjbC83nrbDOrgru48/kjjeZjHv1Shj7Yy1CxErpRewllxgs8dj/7WKBQKHgX+W2FH1srAIodC+dHB/C1+2sMEqTC8PcS5BewaThq57ezpn8yn2Oe+cHR3ucfFlmwaEfmKfpl5+Zi0cnAwF2miZWa3j1eQws53UG/NuloQaZUqVqFSP1wQ7PrYSWTuKcycLnZPxAVAFttZqFbJpC9N0+WkzjzcWxT4z2oLEId5jxFtHJFbOm8+qB8wTaWWL1KusCly/2aYpNiBOEq9RWMsclArpyr1alAZnetvR4vVEOi9WBZ8/L2tgDPD+fbd3qXD8+YVP5WKZ5FSjqKkZrkwvda3milxiDevl0a/aGPY4rTm3IDO0LqJLF+eAIrbw+4WspiANQ/I3UksO1o0/K0Lnuix7qktXAjee81gIp5OOr7/WEs4TSlrSirzGDr/s/61j9aKU/S7gxGy1xVURefQdfOG15lQM24PS5V3obQarOXsLGXaRn1dsXY8q73waKWQp8gIXrjcnc/jFnaEJt+aJcupboC1WXbtKdd27L/DibpQwV2l/gTdXhDxRvTUrB0uJkE6eG+X1+zDrEz58ulqFI0+MvaY3drM1QDBSZQf1UUeCT++vO9IeokVN+5UwHjP2gsRk7M5EFkYsC77CFpvnFJ+M1cq8rHq2OS99H9mg4bvba9DLEkMtHghIrvpHpK3dcfaEP246zrHnhOJXwUdgYD+VZEJC3t1Mk26vQ0jp6BLC6ypF12GRmszOnbdUjT9i9SrRTsv19eu9Uejtb65BVfVs5ZxHOMNPBOjzyd3R9SqL1dt+DzQf1t6mFYJ/vO8TsNlarG5VwaNs6XL8IXzw1liwTq/HWU+qa32jaHnU3Bot+a5e8RnxQxiSTj3guXZfRqgmnW13hzyttxNC20IH8XrihnH3+ODOIheZndmK7H86dKPomlChTHTfraynuLBVw8ixGZmc+GN+P+NqHIpaYY2f9v3e3M9NI/d90MRZFirrYRWqsxi9+Wv8iIezs0otZVXtxLz1aj66gm4g01iUX/kxYZ8fyyaC6QOqVL1RURS8VUR6H3vlHMfTwU+2C1aLj6F1looIq++hbX4vI5N4uQYL86m9pG3nkWNWdJVzzMFwEWr+GjPB5y6qsfa9M+Tjo/c+LpUDjuRqAQF+DtBNarl4jVUZjLkbnbaVByZfZ+tJFCG7ZxnB7DelngtNK0l8c3tF8VpbumNneZ4ZD+ZGmVwdI7MENqgOvL7jaBrTn6r3JtEJ4fHk6fYBZ6qyEX9vNjIA7fJrlIDXz1fflvzTdQcOKt21yfoqFUvKBOEbVz0PJXVpx4e/hcVEMNMUeTI9D1wYcTxIlfdPSMi2S8m22xFYVMEQ7cKL1U+Fm3Kz5C/FX/rU2p4/uIO7HzUmhX0l4+I575FUB2KCFSkhryLoLCqm2zSSa2cr2wq6rquFxLgc78ZqprctjpZ/r7UhMwktB41MucfbwkDXbT8vyXDZL3qW7Fp7eJAc40xtK4+f6/A/O4KXaKCyNW7+dfuY4qag0xhV25owk05G0mY6RjiSsAGLv+EgGRje5pe1yfUcHrMXsoegxF4GgJKqVLtPFOsSgnp58lNpzXm5EPHhKzujCrpHlfE6RTitvoO2qusiu22JHM77ZBDKzjwFbFUKD3c3rmyxCLfshNLsK5DOQP9k/taGmFqonQnKVrilcIiyfLJm/ZSMAHN9Z6vmoyaxoNCC2Qts0b5u+ui2Y9D4SRdrNdiDoaXc6Bjz3ws5SSO+36dagnuWj61zjf58DxlVbw6iGsh72u8J7MmHSua2SPnt0PdCBv47ZYLGr5WAW4HM+h5t39d/drDDHGleWE4ks/rUiw28uxe/Osp2n7n51W5yBITmyslVRqA5N+YPcw8tL7SfWgJL0Hs9swn7PxSZgPZZQrdXZZnxhWqyzKvN4Md2L3eqoKLoA2/hIi+7TzdB2Jl8O7gvhNAWPXsd6uCQs5Y0+JqKGTMkGSSF4QeWfvWSqNZulikcON2x/CX23m4ip9EwZanOuyF+kU4GGhKzgtuymORrjeeg+LQgG9Cq4tb4GgVkSqVnTu5nLc30q1Mfp2qrBonZX9mO4IZ8/9Afyn+dehsmDTYaRyWoKDpyHSTI1Jf1rvHkZIR9CSNPcmnjDrHenYDhJf9Z2E2Mh2Bged/vfi0CdhhVpjsIclqyFVrMDjN8lCWL7Fx3xNA9MhjvVS2aKfmt9NUlemq0FUvWkyMXdLhum85LPbcw3yYhYtR1aGYIvhxpYdQROL83qGClIV3fyt8UEQEO5ZxBklD0vYw36EgU9ubMHhaejb6gsTfpD3/VgBfD708YdiaXPXYiOTsNSrruw97tI2KIQNaV1zz13ZJ5KJ3sPKvE1pF6qcvlvr6yyxGlJkJXhbJUyo1nK1XpLIl1yrDwFz8/5hpz/WXuB8nEfubq42CVXux0KubM+v1qcTUKx3AsmQEsJy8XFv1JPTlqvo+4EvG+M/vVGj1UGTh0vgTZDkBTm17JYlY13lBCbZtWw6iCb54DqDEMj2P+q6doelmMQ3UQUjKaPr7iPB5Quiyt82D/rUj9qnvsSPkyD2KMJT+uD2Iw98bbfOwZ/G0jgK09eB4ToXn7WdHlHVel8iPMnDrPTVsrMse+5FbhtQtsoBnYICjU5mdhatgw8vhWZ5zmre+G7MZzeyEnJ/vyDPs460RCSJykjqGF72yFz5ceVS7jZkmbucqkP4z18ILCrn5da9YD5amg3ye0v6sRtIRhw+hIJvrg96kNCygr7izwf0Yx8K+Gp0xlEExtw7fcUECv9dylqU8pLgd49rqE5ORnL96AoQaxXzfLdPR755zS/UjPGdfdhoxzsnZazxrQYI7QfDDz2aNeitq77IhLLCY2jQIMSN/02wTKNr+y3TZR5ciaysXxtenICukPLmUdQkkwxMWcfQaZUAKgfdYpdkK/fUafN6RcqZRsq/lD+uwXTg0VhA/uKsrNe18XF6OPj3oq88xMUHhPxu0NXRWmg5T1VVGk8HHIhIfWqtW309JCZbTaeGAzh/tew1CiprhzSuLpL7OiuMOGOWMRvBN/L50z8GG/DAJq3ox7TI312evF8ez4oqyv1/VQhMXPK/1UHEw4cQb+dboRF2T3lWJHagnXJFnATgz9+jLHtrZculJkBBSDUyJNsgW4BrbJGtnUhEexpMy9ohhcXR5at9zGJU6M/7Bp8FSHgcaRwfNqiGNGPX3UuRxktvgmtLwSpmTR9Lj3s6LGw1hwMYpAga32WTYV8wNLXPQKj8cojFziXvgVOeAyM3RhPh294YMGzN77TmDT4IPZBHeZ4VgKdO7sP4YyH5RkE31Xs7jEjPRxf9H0v3OUFmA3d4NkvhfvheJLokImqnc54CsYeJE9qlY4DtfuLxIRH74jo6c+njCZulMq0yl+lKJzZORoXQ0BCudGIYMN1qBpePF0A5iledz8DTVxJuOh+9VAXwMbrGzWm+CzZukTmSTs0a9dpmYm0eHpDSF6mzYfDRcBDVs95t/ZNoJ18ISIs6XbPBPHjouMbpcPkcRc3K7mDPDLeT+0I0CXAF2bPNYJqBksJLe4AWNhxOiQkXGWMaajBRmxy5HC2pcJPevifosScSeUpXhDrkwZml+bJQq1/Sz6jBaa+krJ43APT3NJEru59WZpo/l+a/vVXV8iU5KgaJTC61TSOFt9TEvFUNucw6MOya2Wils3zo90xZGsei47k9TD00uh3Iat6qPHIvHQ7u/BKZeE1HT4raCCQuD3j0xErVqQQRfQFr1oG5UZcvh7FI8Ch5U01ouEtuwmwDOY53F9Sr49e7OWPakzvv5/Fh4ZF2kV22uSQVmmZ35CCKMum82NU9A595CKHqf1UAxJuO5/37UDeJNTxxYQkAKs/B31RtfHpBa/ovPcO1uzOzlmbKZWv5TATYUejGVkXwhskTWLdUdii6ciXOpbStYijvYYtlhJQfPSIX0s8kQZjXmmVYU8DbFmKRxehmtZSx0LpoGl2zrm060Pl6oLLWKfN8+8U9VaNzeeusx0P20zHRKlOguDfKFGJ6NSmBmK1dafTiAOdtZv9qb8KTkVLA3RJ5UGHFWmkElbr+38JZ/zqdCjfU+m6tE5aXd+Vjq17FDG0uFcxD4FgaQndTnYhQShGPNXPdx3z7XZ/hmMSp/bFrlULGx+278myxzTG7/ChUQU2Q+8ZpNFkk3ziZX888tSUVkWTbHkVxVphJf4l9/LcqFiOI5m0+nh0aKt0C8ROy7XINzGmhYrLENnOlZD8vlmV7bfNZOUuLEmD/v9XBxL+cWatk8W90JXiZBvVuPKvVtNZ8ffzfKmhQmL36e2WI9kP93HwXD72V5Euwfl9UlTXTus2gnDAo5c9SZeM7lbBbx7d/f3XaDiJY3fQKWcRbIahPIp3C6+LcKFxVQ7cRdiCIM/+wuqvO11XZyPggsP4BnJGIKPcMfwZ2GGrGUmGd0h8qpjY6XTJTW46d1n+Aip7H7C6CJLIO//hM1EQSYg9qIYXPlcCZ2k2IhVytwMw+B8lYhGOusLpOB57FWUjvPLykuesa78oeVZoqeTzbbX2vSevEhI+v1QjfnRyCe8Ga+vgxjuDHP2vlqPddzTiPBZa/PCk7ytdJZt6zLV4weqEDbbo2tds2wrdKQS2qaSpMTb02yeJt5uKCFEPsWKssAdWjuzpHlnoYedHHPcdM+Q0sj1eGucY3HGj5tiRSZlqeWgkfnl2CbM+uB1Bb8oUUiQeLt0JytLGtAJoEu+L3WvB+q1Mh6kXFmY4Kz01/Xrosrjr5wxuWqvLO3D1PrYbRuzajKUYYZRo6nvIc7lANpRLBDYL4LsQSevBWz+NRE+CF4zKNS9e3UD00cxkj4qKNArpT5K4lYIl9tYFuOAuMKYNhqRgB/Lk9EG0VWjzPMEtxxZWup5mKaXUsn2S9QammxqN6qXFvQ3So2tUMvb6DCjg4rhy4LMnIzPbDHCYjkCz/Lb+txm611HCyft12oLBwcw8f2JTteNls7bnHRY0G6hIanY7LZf8nc1OQGuaz9LkbW0j8PXaLZzfdfhpzrS9qzayXUPBK1XgedkxpvYVKvM6Uhrqpfq4slezegKs3128HFWa+OAfMfJ2M1xa6Ta85IFYCeeJT4Xe21KszKl0xLndMUiHYF99Ov/XE10qHunqM28XRU7Lf6WHVQCf2dmevOmEkovRzWCdBe3q60oPM3z19NS4Nt565pEbrn+iy+PsYZymTlv5Y9hQrlP420zOxTXIWKYe+Pu2tH3jzSUjDEZbaY3aZk5rO1ndS3HnXowjjcvz2zmMcOYg+K5ukHrz/VyUXap3l/ZEZQZW3Gf9qVpW9nBamDEHAGMQimZEtXjRALu8Cb9Jo5rP3xKhXwOdcOKqO8VG+rniTRmLVX5p0fy2qktinNpErxb2LvdI3MavmdzZBaQ2b0pHosVxcq8K5/0exSxB99q/pRHVn045WCF/kFexoIEs3adS11HvkoH6ZQnKyLR/pGlJZBrXpWXcD0sfBRHgXvY9f+cVQuBImLftH9jCQqg3UqZETNt8PdCi3hNt3jSLXwLYcrMmpJjtV1Zi0K7NlvIYzcKBktS+QpWJHp2K+G1ZCb2O0awZPnH2iyo9zHL7+kPlKJivVRjQ+pRrlfNPVlfB+4Kl1BhWVTHJK8PgX2hhrBaJvH3vv2VOBmJq9FObIcU+N5DUEKqfSj/UcjWz1gahBA1xKPdqe4+qTHC0C0mSbV716lJG2oC2x/nRVqHflyAFJzMyJ23IahlK852TBWZ5d3rkHHMHL/cunyysLownGzTyttBhYvookCWYxe4vk5EWCnTKRpe3B6q+NWFc18o0n1xCnpw8VKm0TWh/R2yEXilaP/RvlI/2uXhBO+765rILl22eGDCyNYd3C0hJbGU7oI5z+26GBljaVsOT/t/irZVaD0+PTtFaxKqO/sh4ahX4a2MHpc/zRAplCkqnMwFLbcyRmol6+JODc7874fuWaV8Oja1sCIv7gjPWRxmQswrytiKDP9Mf1cigD9bSNdbBOea8TSXmFgJPsjWq7tLGZDLUTMDlXiIX+6k61WqvUdZOzirkeJUjtRuP3VIqcWMeTbalXoxwMyz/WCuVa1EVjvZmyfTjywzSO57r8hFuTAk+/n7u7KiE5Tmbkc8iLlZY8xW/jIXCqQ3XxZFDN7BlDPW7P9QjH0/us8UO2QYs3n0iyzDXShqw3Zoh22rgGXWEXTi/pvBWb0t75dVZZnPotpaDMx8tEDQijf+4ssBrvGZS/7lL4uYTmldWznaKN9H7ejSPLJHrjJochn7ZmW5czfIlijWRaFhfmhE5RUrRcMbiGL+ZidLtbglLAf3kt5TZtt3PJdLt+Pj6p8lTVTq/fVZnHbFtT2bxI0WUZEBYNyO9/3nieqGWsHX6pcJSflZ+VIhGbw4lXya8MNFPV9oLvkF189pUJucX8NHc0rjVAwfkGUmrfBWngfXlSgdmmr+zwPouvK8b6OwDFr0sEfVZB9u98VXgnIppcvTI+wHi+UUmThUzZUW7fAENps20GXNGhJJ9vM7oPlkJo0Or7gTbHRO+Sdgorn2UKF3GwDxnbu2Ba0HOLz3KstfmxhC/8ZejxHfgQftkumwklB7CnH5SCgLkzuvYJN0CXRDNDN1MssPqrUXvzmQKauyrz1tlgFQWwy7GCcrAdcAU++biRIWzYxcwnimX0hORLE6z9/Vk41Y4mMHCyDsyI26yGfB1ZykwCX5DEu7AmuzJ5cfLsINHa+P7/Y9SAHXz1OlSqClHPrfDa0OES27F/bFBK27FhNpbk77WLbHQX47xSa1LQ5b3vKiGtAdaQy4mcC+tCb1K/SHCL5oWVNch/bAh1V0Sszcls2hGqD8LRiiqkxGkWPyxIUYp/c2zF3SCtVLWqFqJldxERs22/eXrqTYA0/OFmF9K0pw2RcZou0/NyzL8YH2XjhB5LC289DFzsuOf8ZF6WFKLYfzoyGycMWLdJYzFm6IQf5JuwFp8HWw8cnPAV2M/Hk4k+86gKZICYnPj1lDeJMJMMaEeSTsStbhdl4zOP/GVGoH88ZYXVt+/39uppvJbHvzxI3vmj0AD8swDjPsIstLEWmubp9NkeFc2YvMm3Sqe8HTm4oaF+eSrUw0Fw4FbV1pB2GvCnmg2eQevznwllwg7F5BXLAD557N4SYlPtb2sLmC+mRUial1nwKpL8E4oFpTtgNybJ8McpO1p8ft80/gylHGWT9cMZqHkBHQA+bFYR823XkXORm9I95pp6Ia9sCwGyl1//FrKMm+muj1sofmaz5UITNLxKpZ9bdtc8oLQOXWs1dU0zQ89MN+Is7Book9n7GYOM3US3H8GrEVO/vFZ4oZ2Oxxu/GVXK4g6UqEF5wWI9kYGRUfr7A+uzvlMt5WxpiCLqJZxrKHENkhx0csfdAfKoUXuLaT3eYiFT/QYQIPUxS/ebByiMoFXsGCcnjRqzkzC1TNEkmcbR5T1ohphPGS46tCZ9nslmpBfRJIYTfsjk/MwnBBz4AyFvvMnvFVj3g+nq+DTS7YyfFfdDbas/ZcdWP9IP6kQD6dVhqUS7SJM28MxvOT/8kl2fJiWkZjJ2WlN7OdLz21/R1TgnBIyBlrYbR1UUr19dYZlKH0C9W/7sml8a4aasCUmfhgZaJlvlRKoro27W4gFcpG5G3UFZp2IBmDyR82BWXlHLpSXP4ZVNDU58RVj1K346+lmdzuBZ6BBdq/6XXb7XVH5f7J6tJS+BcT61Rw6q0hZYRbJZx3h57+WDjEU3aDTUbyo2j/OGYO8/fLXFQwhb2r2qxWTAlos2iFPVkF5R4KmHF9Wpnw1FzSkTfmceOTlJfz2yRRVTIOApVcAOZrgdipOmxcED8/Jg3ucooYeIHI6pjt0UB97PuLmgz0+wvQdSC9yu0SUkoP+REF/2jW54MqweOaHnpfkr2qub1nrX5U2PJLp7yzPHU389g/DCN3Y2DAM3sNtJKFacvTRHX4A+hEqaQ8w+sBlsHo6j3ZRnKWVGKMCpmalStU7HTeA/N8/NHjRnYGMceF1WeL/YO2qtpJe+iQ+DgeciAfAWvz1vahuslkDdP8/F70mIhAKNcLXe33jxwoRXF1I3/8LXvJpt3DSsH8jw8gBM3PhR3NnnzYhoeMIUETCQ2D67hSaBKtWPfOMTj5RJItF/l4IbwzAJlO1CaQN8iOezDk3c2I0HH3pefQjG7WP48yVcqm+NMtJQrhIJREp6dH+mlcr5wP0ZTCXOh01xapA3Tb6EeBLrXT2R++aBMjQF5QGbjmVcDWVVyBx+pTQlxxShczjfzgcDJjhJVwrN9jv4EkNbctCNhofJx0Lu+FgZtV3AfADVUcSaK80X+5eIaYUMI37n5VlsCDhcHss2VeSjO7VZqBZIRJM5pfGl9JgD6uP4nBKxXtCDVbv1ljoVJVGnmMX4hkCcZu4JZl5YUARAo7cRGs0WScN4cL1qVeuTBi5Ybl+mkgoLrKt+tvujfE/aWAKl+preaBPofTZ72PNypBQ0IFrNnfQP6bs6UIJGr7/uc8MfX1SAygaR8CWHj75KOl+DNwM5pcM0XV4cWorq6puyrRvUAmx0q573XnTbrihUu7TDbv9N7SF3MPFRdirKaqzdfMTFjogo1jg9ixnH/qY1Idmbcil5VXaP05cfMAoh/YyfznkmY5fbggO47U9j+IcYOcmHLt8lmOIutzIXbxSBiu+h7lgv9ynv4Vyg4IyuccbbY96gk+Z0GhJedZw5orTdHs6hrUV9gD25nyEQ/bl//5a2tqBR3TVoVSbXOugfBTPgwtQduZhyNiGr8GA1KRQoY1pnY09eXy0Q4Qrb3WaIL3E/F5ie4VgxL6dzzEAWqfSN2cTgx5xFPimCV3MVqJ1VeN5ePbrwpvJSHsCZVMFHO3RU39tNBzpKAgQwoPrhXKwl2HgTugHID4Y6vKwfGRW9ybAC9oOJLka7NpBIkmR7TrQqxh4RbrTKHmf1LQhUEfs+0lBuXLgq19Is0kli/u7ZTvcWqkDjDp+UOGVeJnGb74wStDUEq/PkNrlIO16Q4+LTNApRLrF7q5GwyU34HU40ZNMl/8Bbvwd/fE7Qo8KcPinq0qfdFvlWXx+tqIGcV0karqp8jk9WSVOM8Vb5Dvv6c+7FKM+0YRPOmXgmLUJb6SC0yxdulyPFQ97eMzXc9jNZCGeL69598YdIxmbZSUJQxJuR80vKso9FDxof1RMBcIBIyjnrLEyvcPb29e87SPUfs9KcZDtmg3VpFMqlFf9/d9tDMvAiU/muQzuWXtBCvhpzpZ188bKjzpImG0beGAnshJCwE8Y1tN50IL9XaPkya2jkiP40B3sOvdwIfASPQgw6NNsTlQSfCK5KFvU3drhhF63gJU7D48Th3V4/YO1hbFzuLCeTzNRj1i0UNi4VURiqG7mP3fkeZ9ysXjdrc+SolQKzyN+SefbRX427mcR4BHXhFsHCRXji+DjDIXKE1UvFFIhyJKH12zV9sQu5tnRCAu0e8GIZnar060wv9in46eKsqbcXC/XSE+O5WVqfXq+ffS1OnrZihbTtagkFGKA9agBTmzZeGKM4WInJoCY9W+G1yNFqapStvwBFCkzy+35sat7PkiGc5crWqmTBnYLokywHOHJrPTPa0YTDet59Q2rTgl/v2cKi5Iw9DtKucaYgorP6oS6Eo6c/R40kW4GzBkrjx78Rnj7dE8a8pUCiDsk2PBXEhWMo/pzaG9qBY1vZacFTd9hRxB2qx/gMT4+Uh+HTVOMhI44GoLVzAwMC9IOTLNFSVu81VRtJuui87fIc/zHZpPTQHM5/xk9nQtng9qBQ+gQCQr+luBI1Xv3bVmmwVys2o/s329l+7qOEm59eaJbIRFqu9InjElQTS+KkB44JW8S/AQnuL7jYiMH1wtB8MqqXFqzfcFd28PouTluFhIfJe+imPo0GLStUigcQhN+kS+sWl43k6bSnsPuwPsSSUyWayFqIUSG1Mfh9jtdbnObb0EPEnnQpNkxs/fUs0Mmm1Tk/qtspdrR/RLBFL9iP9LUYtaWveFANIy9Tjsk5mGGG6vj5y1kb8aGd3al7n1GmkKUoS1cu9Bd/aixxSK1uoiom9U/cmwerlT5tjKvQW0iEER0bncqWoAjgUOYw8ebz0JG+qFpy431KBuWLeR4FfLWdDpdEcu35YIImNYlG6aBbC3iYS9+GMgJGNt1JhbGPi2WKZfUCaJ6tEmBYC22Yo9MjZzdgBUR3GzbeirYItj8eJ/0KquZZObquRWuHX91+JgghASRdeQE6HaTVeEGd0lMkY5qO42WVkYc3VAN88RBflHmLvNxMyMqZfL0wcZxrF5NYKwtItDZo8W1SxSBUtiDgtXLsGYTMcCJv0D3Bh4d2mEOg+bLGmhCjqJhUk2LwSo3UklCmsCwsEtR2MkZfNgzsmx5kYqxmyku6Ukq0rLcuilEqgt6U0awJlkihx9HU8w+UBW/aXZ1HHOfXmSivKkprFamwtOLGk/ibFyByX1NZNjjUNTrV4zbcGfCrkLJORoz93KNEEqHgoU1RLUhbfTfn5itlk9m2bhFbOjPJaNwTEHLp1ynWrZ+ZiaWnJMiGsIaGmMPKFoJSxYCn1fjuq0xqwnIcSpdOHc3M1kaWmQRaEWnbnxIyn03x1LnkGPw/SUxOfZegJmCoNtz9CnBc5/xnzG6VokszrwDdhoFNrRF7G0D+Uq5DzLwKduwJSjSPj7VikAd1BRwSVFnkT66qlEkqx1XKVU7SlaV8TsoCs1z4rsUT6+YIDaaM/wtbnwhSB5lmnc80nPt1bo6AlfxB6yYi9LmaJVS1cr5z+ktLCQd318L2lCYJAbL0BlWpBt+EfFgnOHvZ+EJBCc30p8rOrlyTaMYvD0tmft3+ogDcZ0NT8mF4ZC0mcpMfV2eCsawuVrNHE+tIxdXImvX0gU4U/jsv/D9wQ3sxQhXzXOwJtlNYLn05qwE4BZIvhawuKGluuSXgZ9b6dOoS8arEEfcXw4NkEMLGVurJIgZOh52Nom4R9HMpqmdeJvJbl84ujpY2nDMsTUa95zkeJVBSqu0tYaTMLWIblekP774MIrLccyRAP017YSGEylwi+rQ9GAEk6yzWXj2nkgLH3g0owQRlgYIn7J3Rr4AywN+0LBo3mkjn+OJyIOIT6GJWM45q0fqy7TM1gNU8FFMmbG89auhd+fi6tnRB29VuzHj0cF6hGeoXrh4Hb7W1jHrXEO7dkvbL1Ht8TFo3b339rZAtxtEFYg8mXyHAU6ZHikK3bAGdWFBkza6tUyxg8FymVOA1f3IwSy4Tv7FtZzJ2SGh+vI62hKO31r1UtbwYyjwmmoVqXH3QIf7tRnnNKU1u9PjeFIbNSp71jFyEK9aM4KKBwA5y/sT20uydWeAz6C68dc1U2wbdsEydcqy1zXV030uX/UWge2okyWhgFRbGbnpgYk8lkJr1Okun/2HujS1EQe4sNBaW9+s19A+Cc73x7rwVldV3a0YSu7by1y2gEzfA4Qt19s+qT7uGymd+Ara1r2Sev5iauFZsb0+uDic17FHwhpkBpZxTuRTnqAHhxU1Up+/kKRW3PsfdEbun1mSkWmD68exqGtXKuDFPqvSsyTwho3P5So3W47nt4b0M4Hg4rEQCcCNwe6k+QqyhZ8uCyUHzLbUe11J7b4egrCN6KORi+/SrvJRblKlw3inuZLTGrk1OVGMS9xD6omQoJbe1fuGwNse35VljUyyAe4w8llWDjr2XQAGC7KJM24cR8y4FG3Hp871nwdFlr/oUMEP1ka8zwaUhp7iSC4NkxDX5E7AG1iA0E0yYp7SRwuAuwhwyS3ahPhn+5ORKqxoS27jn/IJl9p2ykzwZlhilM9ydzBsp9uV9VC5YYeLuy5Tm4qxR1T9sS9H4WXrm8dZw9Oapw7ySOMauq4HHcfAKWOIKEznVqBhY8/ElSm5YY6lK9iC31aZU9t04rsZqRJapZn/f2KBedBrt/EMah74dkS3wqtBctriijyXdrbB24SMXiHnTaXWHxl+zugUTYrKlvr5VWGSp0l0PTzEe1yZlG7L5XcHH3npgg5XJhv0xGoXvX5aA5C0e2f+tsYI/fk8alplSzzDzLXbtu8itpoxUBItvT+mGym909PhBx80DNBshyAMi7KtElLMXl+KfSYSvL2KPHP1vrWXarkktFatnfyr9udbX64COe0J8tztbKcthQjZMNCWhwnaqQPJjxM4ZPr8yJcHylemVVxBv7F0qj8zmqtvhOzc52aIvk6mK4tZ70Jzrh8F0jKqjULvx6kOmtFc3qWzDJ+3HejNoFualULt3nKRaRlN2XlsY7/5ArSuAdF39Bx7SlrbZcI6X2x6MoYXZiL1XaFvBy2DUweeEAYgxfVqtWuOZx/HvBdbI82Lqh6hDGF0ZmaIqjAa46JWQDZzLU3YzV2f2Zs26bELsPF+66LWmJFVVKrTJsjIp7V5VA/PPkk72XweT372GNcPiXtXSUO/53fcFztkFr38kz/N6qVlkMw62pjnJznKCgknawSQtF6Z/LA2Xd0KP99zzGKJzrbEXaP7UkjxhjAlNL/jQHa7mVmZYxPRKrvA7UVHr9mvB8FVrltfj3pUkf/2kuhiHEjiqV+pt5n9SdyWrFS1dr5fP3uapms74/vgErVfXcby/aOCd5cGDD/XBIuMqQrMMRtgfPYAKsfOaBqMu9s2M5cy/suX4ZKwhRji0nM9y6WYo1s6XTSgFqNLP+xXxZ9qrD+AI7K339pKPthfSEKQBOzTksxEC2UhCl3rdO8Ia1X/0eUw3Pfb6bqpvbt55DHxKFo96Hxaz5EKmnVny7ERvO/o48i4JhJKUfObrzfu4c4VH19vfONZ9tm/Grogxwf+xlSmbQyKgIHuOunA+0WYSXWgeRPqELpyUF/ljs+vpg1Br4vlYTV21ve6cmz4qV9dYIHjuXSKVqtySGgwsWVAba0xsAzjLxFOC02JkGgZbRXsneQHpRv/A70A+HIosyPxtJm6Cz1gz8y/v/yzcTrejTj7a1UZ0wngoXp5sm5Ue31WgEx7MOfMJPNtRlrBy4+a19Uecwnbzb9VYiuzpGdVhLJGHY0CFcKvJMb+fK0lGL9x+33EIh2/rLGJJrtUe6/qEe0Ri45rzt9mpKLvyhancFHzpg3pIHwDk8R872XKEBJczqfzcE0r7Fy2ulHJEX2fddl0XqN3hj+IVtt9SX7iIizzdub45rmQTc/3s7CrWL0h698sCddZD2vzuJcDNsyf9Qyox50y22CRIIBoLell3Dfn6p4tQ/bRARjZGP7C9u01Ca6y7TTHH5EYJNA+vKMnfw6TJtztxJzy1F8hsI2MyP9UB4aPyl9g/z2dDJycPB8Kh4Xsnj7vifjO1wxY+rg+/upoi8lEaivRTFxsLaj7uMoTUOHV7DgL6Ey3jC3kdCXyEfKOr82RYtV14TqI1Y5uuiAhcLbzpvk4zVKTuLrS96gzBI/93+dAbaVSB6BzVE62Z0DdVsCdDaWHxi0oHyypgOMNfC9ODsEAvY7OTR3QS1LiJ3CKSBb54Fla/DbYHn77tH4QVlm0pZ2tKu4uFVfUr/RT3/nMlCPPd436lHdsqySORpld213kV+tZz8pF3f7XkZ3xYRtVtz1Jb6VZq3K7kgbg1TGDxWA3nLnKmg255fTI4tp3K3E3OxfDTI2GqxceE7cpOIGr2F1nWVQEG4wXjCSGn4Qv/MCwttWnmeJI6q9wD9YTiw/3rlb0013PGDXGtgKjbVvRKK74q7GSZKZRLUsFKvxqldlk2kXI7Hz+v3tb4oP9+uJ5WyoIypPFzUDybZ3k9uajbYpjNVLLpC76VkkkceDnZ80ny93nKqImBluxoPt210GMxyHrZg4pXgq6hbyxnTy2iq/b9AsEenYtY/5brNd9zkqXA8TIPxKla7Pe732Sl+pixW0xClMjpPXZ47+EZ5EDjbtq0+goHbdlVR1UvGaf0uXbfmM3kUsZANhBOxmg7Fb35Q4nS6/utfNDrbwNDWqeXj0QXjIdNmGasm8rdlajpE+6vFmnK8XBikomXaG5aFrfE4qbG8wNGplcnRn8aFzBpJbyhHNvPG8Cy4ye7NPVyd1ZeTP1+wSvVOnrYG63EU0hEH/pjuNyVc2CmP1sJVuiq7ZXxnceQF652O73elNd5fx8iedRxvsNo/6baYwSYi7VahZAx2AA0w6cwcnOa1kJ0+hIh5cr/tNQ9aLd2y035jNtaUtdUo3VvD5CzYdyRU2XJ44daZZn/u3i0O6rhtUsg0O3mpEcaYoxhtjasHX1pHM4Aic2HVBfoWd32xBsEHT3oL3pL3xKqlVCQay/3ZRpBnOHF1FUwybnd3aem4r9+OtC47tkBnd+9p9SwOQolxhKhlrNfr7SxLN/l31G4rMFcld7emOb0LkLEqLvjZMe9wFrm7XAmor3EUvZl8yoc7dKLxqEPe0sN0Zl1iG6ELaa4xmrD7kwHaZRvSGGAlOVmqXhobvdnJLFF3uRtDhNyaRYHkZsC1qlppcwVuyCk/3gnjvJry2Xg7Rfzu+eshe+Zq8i5nH4cgmwZcjmODMT39lWevNQu7ypVmbRolZr24753cqR+ZqP0gCUfmT7qrDLU2XdADJ7Fqa2cTlet7do7NV5eRWm+OL1gl16K02iWkNd89uGYti9+/nB5NJdIW3v1wH+uWoCSZaLnmywN34+96pltFqa8VZT59rvqjy+OzB/F8jCD1uP8JYsVNvTRKIiVt0SGfyHyEqmiZ6lN0BdXP0G7HtNw8/lHf19IK+kTakgwOkrFoBBGLpcq/7MPhOJ601z/zYtG/4feGo2Vs848LxUo6BXqsvWNcLPNmNY+UYlV39PTAJKqVCkYSLWyjrmUo9eb60MzhIxTahuCU5p8Dtd2YzJnixF14ihOdSjIfWMziS2f93RqpbR4FgjqA8cTPz0XSml0SpChAfnS3mV2d0+PEasFflNH87BkZO6AUdvdwVKjBaMJ6ZKh60EKRrbUlEH4P/5285BBNQFPfOXHtuJXFXpx3fXvxzlJTupzebpbrVayYOFDIeCt1cuJyhCQwvxZsaDnmeS4U5RrA+c+c4XpNVwsB7JB9GilrqtNJQNLET26uivIsHNqtsoATr/jLHfDrbcjAGKln++m0OghipTVqIF1VDirn0k0wXM93Uggds2U23Jo4SBZ/WuEVXCPdgR+zTvy6MaeMZWPmT+V3+ml1jNkyWqApAGU/hYFT91vp/G7cZlyxnf06FP+bmK4HHqvc6UP/6njGaQIdE66JJ+u3YhY8Tmz/ebguOcd47BfZJit3WE/txGM1YBX+U4ZLiDZWmb0Vm0dCW8tynT2D/tNH8QjLXH+hMuBXVAgdfrBYh25sSB+6injskV0kMge3HCRJt96+fblYqF6XdfP7EMCq8gffescBjGf2/ajuwcPayZfW7APgSygK1/znIry2HzZrB18gXTkzKrPB2t4I92ZXiLNh6M1e1dKu15XrQb/RmD9eHrykl7okXF+2I5NHL06rEJUUe6N/6PdkKS4tDi5zglx5ZjRQW13kdO9aANrEzc9qVboAM1Oi0JQrzTyRvgsuM3gnewpMmYy/hjGdwe7VL++6Lpm23O8CRVmkBtCQBQu4Wz+fv3Z8LbYpAh1jJj0s9xnL/D7rcEyXWlOxBoRc/hgmQwpfqa4P4Mfl7+AMR8wwRSyJ0i4y7vDc1c8/D3UoxHe+0WIreQ7ikShIpSZHHQp/bhRaFMM8Emyr4nb0iXYk++OfCTKJeKqEK8TYM51NTmq6MqLzCLN7GG2mMgd+g7Agb4yETrWnxBnsSSnBxt3dWqrCoQwehXgMzC121oGMnGGF0pk9OXE6PlbKWrdvr3fqoraaer1M9fhrZ69d1VLr+o6AVw8rfgvcCDpSi/zQKpi6KXj8x+f7KQCBAtZKxHIL5zFhfKiWqIIdgdKImEISG+F55d3vMqzZ6efD36/o2tQ7ViIF5tG5TB7QjfH4vXPv+Nlb1RLpQzxWJpwU0K8km48Zx2Eplpjagt/pXtkb94ZLeS/TNBc+gBUKJnnSKQcr7fSXvhyNhDdPXt7Q2tIgDn7LcfUUe0+YvBVu00fXg6ckt5zUh9hyCgK1crY2UT8/Xj+U0h60u+upDJBPbU3dATlkETQvRr9K3QarNPE1wCqWwbBuLq4fdyC2ymfmocdWA7xTJ/JBYqm/Hyd20j/DKgOtmWsdaHZJfUJ24nf+I7fQjjSY3fNpnH62MQmxtaLEcSo72NQwpYkdnwqj2fR0jKfCrbfM1x+OD5rmtvbeFdg+R0tHfKSRMPQd3Cet6wqbpGd1bPrNywKt5FVO+0XNVLRtPWp/TNC27CQRPLFItM6BX9WqiksfmLbQY6+1EYdYXFuewKhVKXfuv5iCfDXtMTog+Kqt2eWM7HfrWKZKIM362I29s1nLbskCOiz0NLr1JdxATsvAyhAkxfaxz/Xt/LzHa8H73Czm2JgJa37x8gw4sh2ZTFj3k9oqa/YqPF/z1YMQ9gFhaxm31V9gq6Xh9PgNUN63/bCUZoC0vA5oAvPNPtXGa7yRiMW/0W8LZjFbJ19cXpvizyOpdO7+5zpQWrOzvvdFSevXhx4hIJbGQTmML+wDJ1SXcxDeHqIeOWwuOhe3kDGwkgfWz2V0Re1MUNuuZG/PGhiGWyLLlEpXPoByPviuUrpC2wsXYHkWjcd823EIK1cUncOpCb6GdrAjI5wZmu/fEdUU/IbH0g08+14kpMdTLfe1hfSdJcOhyoTvsOHY+fy5v3Dm+eJmcKqSe4LY4Pide0MvErwROXOOeOtXccsrFuJhS6ph9/4+LAna7AiR1zH0YmwoZO7z7b3TWePbygm2xFp33qWR/P8fo4zwKX9ToaerluqX89GGu+es1SLww383VAOjYkHviVW3FyZTu9rEsIx12+1o7pu1Wckethr1C0llAu4H//2D3uEGwuWDaOTPC2PsEPcOF8L8a5fhl1p8yexmWMj3OvHVTGlvX/+sd2PT1u6ekK4TSbLUkVRLMc2h7OuR2pZ7rYeyASh3sTQBtoIPnsvMatbo/LJRFPcXmZG7UHteXOmvA3c2wmjdxoXmgT3fJRbMyt9D1x+GZLPppc8nHerrcpQP6QmRyc5PuC+Mc1rtiM8yHR8/vgtovOV4+uHf16VOewPWROSilTaKiWVl1RQc2E7aqTct6YueDtevlJKiBDbP3W+eps3myl1rIu6bO6sHPC0vZcHd/ZJZYZ5Y39MvIMSF078yIW/G/i97BCSjD5ZiZg1q6XyUkfOx/uKlinY4YrLiAyneC7wtVunqwn/kf323642y+6dA+P4BGaXLWpKpdfuvHIjkTa/eeOoLVfCGyKLH5b8bX05RoaRMfz3ZJvHHJD8NRoZY++TkbfzYfg9jerFoFKfCbc/TCa/v47fHhQRWXaQpyG7eqbjZAdv2oOrNEr/fB3MkHIR0z1QiVCohTp83zDvE1DLrwLWntt5miWoibpeDwfLuBKu6GnZTQJqtCPdSztowC3d98EPvSKm4I7DEar7Eos7EhvVKeI7Rb0b4qHG0A2u2ZvexIKbNzkXeUJcZSzDxg4wsy0Emix5UxkIigO4x3w1vfC0uAGlE1q8LGDPIerzgf328lVDzzx8X5e+czNPLMsBlTMKEu72YRY27o0VN2UsPhDR8+agHCmaMT/0JnHRWW6MGF4vydMEobDD2lR5jq5HPRqzecyw9kzWBB8R/UvOwQQVIdWESUQqQalRkLee/+SFZ/mhT4xVMqI4NlnYQLqzww8bQq1X/+BzoDu+ExnxQm0OjJOolH6OM1SK2rMsmnz11YeGo+Hh45XtPhrLG0w8Fn6FrhKNhezGZrrr3rzj5JDorIpHOO+pxTJplCg9o5jyWgpVv2wLRrrb9OgfZ/ezx0TfJckBa6HjS2lOXDufar1Txr6WL40jYVLvP2zqEXteRdq6dGsPp2OnEEXc18yf12yasGSQ1kwVsM3OukXV+ot3v1xPcKxuOMqZ9XIrFOdp7HG2npLW1YR1mqHDOubDvug+cLJOyVP/aaB0rzknqsJHChGLbWsfzejoqJuBancF26pOetfbq/Sl91JOCbN7UqATmKRuHllF5dlIrTt7iTJsCtK8DNa/sVYlVmLBn/oBoI7YANr/BcvQ6CU5lbxxdJHjYca1Pj6rh9akdbfOf0W026nZsnFvCyBgGdnH+sLJjuMb6LFTRhPaL+6HhD6Nk7GeDqJGXvrSTs1G/FRuCLVHpwG1h0J18SY17ExBn0vfTl7a/WYP6gKiNKoA3X6WtN79/LJCONwY87R7RK0DBwzXZbnBBAF5TXM5GM0koG2HZ/zjDTHSCO/eLaDcVnL/u1qLKRciVp2ZgrUxP7MurftfxcSMugHfNcTrOzMNzy5+vF3VlpCOfCA5ASG8mUkJivqUJvc7yLHkiTXkPdASkATc5h1uOoPu6uLDLqX+uIxo5Y2QqyIeKsfYMy+9+NE1jUXqg523KjZZ0l7b7DQZzLa0Hf/qCLez7MUA/DrdaCaFt8W+HvSwG6psDJlK2ShMwAfhK/601XGxLGYqtQoBglM1R+1hl51+3zzt5E+2MfwPR97Uv7JoRi+sj7fNgCqWQbCBscs+Ge8mSScKqt7/7UdlBjnr0dzZfCyNILZXliufSXyAGQdmrB+LQRNduo2kdNYMZGkOvmEW7YmeJmG04uqzm7eX2n8zpqTi1LhjQxTt8Ragn9OyRemEVgwBmd0Ks0cM3XSQHloYj2SKrLzdWlFCCxrPP4hxet3JsMDWKRbqVE8aug7ptan6rwRHfY+aD3FIXv24aCDJUW582V2AeLNSXuQn1jnQZrw+lwbqtGtitpOzVf/WxKCJUQvldCxdENU+WG7F91cnabXKSrUR2I0+4kLA7jxDBKs4LBEvh0HbmVN9PN6LUBqTpAJmcIPVOR9M787vFRsKn5aUsDNcXnK/hCScj56FPP1lQ5qLZR0tHvhlqEhtVWswQfCS/Ke/8vJ5/ZBbT6sVsaIqDi/vbO8qmGhPLnWCdnaNeMCoXOoUI58E+Zj8vTKsY0eAHp3UMdFXP0t+PV9aZ0t+xQKv42xRHh6HIh0R0TkdeujeNTRtXbcSmhgZRFqieP1w6Bs5yp/F2CkWEr+uCRCCMCQblN+PTQNb41TttmenS1WxlzK3ojQjlFpCdzLwxVvWZfS90lnmiaJjXaSKYtei0egfFKnuQC7M31E8vO69VyNJiQ3frbpgrOxLssszPCOB8uxwS7Z1IjqhbbekyRjniUatr8QuY1hHx4IWL2r7WqFps1qakFP/ds7VLd0KcCa3jcOGTMwxNUpb/RFBfp2LHf4tV3ELEipaSXawQJkUy18mhwqIV0sINK/6RZ71qvDxIZ6MTPhn7FqgsAWDJT5MpKRCt6jdeRsd5KXYCRU4M4BTswySGZf84ORAHgLufRFzZLxMjdj6LkjQF7f+0m049QfzICm38qe+1wvrr7ZHPA42oGO6s19Q9yKtIHiMWbB99eifT7tYsnv9G5BvvTjetTV1bZPCPOxtF58+wbMSxAms9xEKGT454q48nPrptBgJ4Kg7AYW8snP2c+Sn1kYTcPURO+DqOugtdXrfV9IZv+5wuRtaRvDuqVaffMjWD6nPQ1xtzCsu5qwAUCfixrslO4zYkrn3P/25gYMlR20225MZTD5iQ6Zd//zpGcmKxhaBpLIbF3ie0fXj8nlr7/eSCQoBlc5eKRPVvFGLDju3/XTm8fMR9/ORuirET79raOxwH+MYILt3LUlJhGWuQsI5DPaSXSNpzu9fjBIr2nedQImzNE7x06PXZdwR0dCo6QbZNf0tGOS+/l4bI8s61/2jG6Jn5cWAU47enTuv6kHtvsdZTp89e7ISX9Z9WKr71qPpDcxUv7X4pZlvycfAzEGtSQoRJrr1ouxd7Eq5XNJpQEh47NN/bVDVAFkH45S/mwDtl/LbuEP2RrnK0AqsrETojNhtLrGnXEFCxeb8wPBGxfiNtv/C0FYrl3niLcEJWtKjQDK9zwMb2ZW1bSPSqDwJEjna2uBq52vgeuucrEa787XEKvFfVgbWUwIpSGMr2NlNRY83R+waxblz6KYu1en6yOKAMMll+hN7V2qdENc4lJQ5p6Mc+0o7jhV7oi9zSM7ueeps/fnX//E92lHOM9zQSJqxeZSXoHgpuzPzGUUCMQScHVLOa3IKdfN1MXieshhkvT8irMm1vltXBEA8ni/jB8tGJ2JFumT9yw3I4szN7b8aj8KXP2j9CkejeTh3EnyOSLRYdp5jIEHQ5Mu65F5AciApmeUmNW12npX+Gm7II9szngtIBML6SndLthVg5oR8CIMhlK3d8HMSgQaSugtUr28V+dNSjnitGCv2XnKTacJgjCDVbOrXMazRLIIuRrfRpuK2Tx8cu6aZ8IibBHwgTVhHMOyLKHct7EiP1tMplUke0DQgnywDiYrOQ1XNwPxcjlunnKxCw3Rb6kiYNk1iURR37w3V8LrdP0Qam3gxHCWn++eXKFT2RVAG/ZmzFJ4mnV4fke1BtXnjIgcjDvd0XKCwMXoF5l6EuL09D28a87r69VxPyJ+uMD9V0CTwGzohrwWOvxCrAQidLwYLLInbOE64fPUqPrrY8NVGwz7u4xNFW2AQ/8XmD1Aym5WQFufyCZqOSdn39cJfrtEjiB1xUfMhUbwXjZrKy69lTbXmKGYfbMEC3sd2ZYF9Pt9+U1y6B1uu+GwOy3XNSYmD3AAmxsgV43nMRxjy5ppBGtdxYWN0A9iRelnShzt9e2ETrH7RgKyVxic/EzjwbIR7pVCpfJy1qHCJQm2Z131+dbIN4Pfbjbt4uVZXMOliwwFDJXny/EsqRaWaAuTtNquxU14uqaw82i2q+evwJiIjwcyifGCDawh+NWYuvQdDOocPtWGTpxXIqMLVUN49A+mRl6/yCUA7eThWqOlaarput0yGcYuhwvLatgXzPkS2hA/vDyVet1tdU+t+BiXLVuFOI8Y1OZHdxTyDjpYJk26dVu+h+8EbWtMnBokM07Ra7e2NYbv4x/TPeJtCYJl6zWHaemcE5f58fATfOCC4Br48/gmmRBAzP86itbnpmcbZVLqkR3blmqME0ZonsL2sc/slTdIT5fd/3+ynDTiffHqtx9Ks1LfbmTGRxNN/AsFSphjRCdPNjTff1ojShnz2fV+wRkElfX1p6TXg8QXROZ/j+6N/0jB91VtOdDVqedW+01SLZ9m2DF1km0ZI3D5ag8cxXGv220aFP4iR5RZeyJMCcHwy1yWXv3YlMXdCvtxJhDNZ/XtSyfAeoiSNmuWgFEzfjQ5EPW+OpTVFvpu/G5kTJntw7VulpIkP/8egNvys/GMUOuXKdnXoB+ERm8DV320qkCs5GPhqb78Cesww2hqa+4khCEJXD06tIK7YjF2d7SZor06a1RxrE9aSMcQqSOTt24HO4E3stlv2wfRzh5uE1oiYv9h8qFBiyh3zxkzCzlxvXQDeZCAH7jZG7fUkJg+YWA5bflQlTD4DF9KYKSDAXstkqybp/5k30k3/iwQdVVnPE/ucjmaviHjsxCzNCKP9WvNrhgBByuFUN827fBAkl5lTh8sxhKD3olaAS3EWC5EviCH4XwH+MG9fSVkwlCAJZbrH5WLm5/+tWKWg1gC1/l3OxtyFlz0VDlYVu+ea/CQzBaaO0kyWUwc6smkvaz0jFrvYKFVfsd5INX8Rq1hOonY92wk/5K8kLj1oLaM2YPl+txpms5ed9Z9KJD2TvnteEgXa4rlMt1SbPg4OtXU92ZJ7sVC2VHIDMHa7BW+77X938UIK9XahSPV6mCzRPRQ/eI57tmzDZnQgJ6CClhL+8axSSftg5OVlEojk6tEuF5CynRy2MGrCaR3tzoiKuZ3gdsNfmwhZGMvSx/9ZvVqtWtztN6CxcttVLuWRdjEctsPMTtc2nGPbLgJvsXUwGq0YZtjkv6SRWh5wWYTl+S8xpTbLLJfsMzHvsyHpMdO+ItuE+j9DcouPP7zzsZ1M0+XRVW0TKiaK3AVe4Wun9unbNRrBCtP9aAVkN2ltpQvIEdZrvDV2Db+5IdPXJAzaYSq1EmsY+6U5uL2YJYkMTVRLMh1vd7Db8WaKdc3f/0IbASUR1zIgIU1Qzxe/zOw6Y1hZdImim1I01Efmo26D7P4KGs8cBQmeQbYqZ9ErzyHLltQKftDXAMvUXNs4g1+NspAXsnZ9+7R1ZCAN/i+jHn1MRqxn3gJWYfXOGVbIdA45jhrzYOi9NVjj9KWFf19IxrrUD6cRqb2XY4kKUBdcdTHsssas1v5N1icnc5sCIxFnrw89DwITLms8bybQwfsw1rBMUzS8daarmYOpOk25YKj3LO6sls58vQp/kNn3QvbwwljMOj30kLsFUe8Cl49COxIdcBa3HPG7CgzqzNjx/+Hkcjumm1yrOZMKr1fI1jywo1T3/ToJylviFk4SgMNIwOQb892azeU18ZoJEpW2/tNd0BRibXLrzeXRf0rEUFzzCbSnu3uupxZdnm+f+ZasJRj7tsZn85mzUqBdoGuWR2+WVSCIIsS4nlivpv3VUpSOXaZfDFaHiSfdbstx2gVlEjTF4BK9+5u/zDM5NM19s0ILB9MmKws/cB+fcqpYAQnttDL0TJOk9Dlg6wWbZiQTL4QhX3TJbdtmh0xkdBve+HNBze6T1j+Cc+t9ZxkpROJzqJ9wDRinXC/E6TnrU0l45v0rALt+Pcx/h1dOuW2+ICOaN9hoXKouO98L1ZYh240seWMEF57fGbA4D/rvQH59ZzTR+0h7r8S4emQbMGYea5LHvKS2EOeOEyNZJ5sYDzrPH1+5QQ8chNXpjp3utP7ortEjYq4saWBxd0ftcgy7tDchGHXRvg6TGFb6+5TUa1ywuxmhyhmdJJaEpR49O3PdJyjJbh3/0RzKy24j2GIpInPxKO5QUc/yt3a5XAYxK1iTfAcMUOTjmSdjqOVo5sq1reWPQHZz8UgEfqUyPnz0ssSjOx3SxEEJXnOoK78T8PN9XjyCv6cu8g0akvO9SHsbLkJvLPLBJbjusUCmGPI4MJmTh0wG4Zsj4l/Z66iS23I5+0lH4A/azJiJ8p61dI8hnrK35sF3FrUDtjZ4nxw3jgm8CyulIaIA1JK/bPD0unty5kBuS/6PMBMik0D6wrXsPC3DzRL6kK3TMQ7nMVcD16urMqm3YdQm0wPVOqJqwC2igpE4QfD9ZIOd44sxtsftfB1SE725uBfe6ZtlC3vs5tnWzdswPLIbib3ZOgaMdl5Co0kUBXeZdFX8oCuxcfz7jpSFu/P1WqycgpKgsorGhIHJW/fCYB2LtSJkxgaz7fdyj1pd3N+5+Glbh7BairjG70xJIlqdAxeIcXHbHKAOk/LN5ee/bHtprQX8zNxpTb1TKDzaVjN5Ei96sXpqjB80bFg0QCY8c9AZ1PvuPzdeyyVPY05Bgydr/z8YNADxBHLaHqbVYIhDsLGSsgCkRGMxQMzj0r8XE8etf1a0uIazoptvr15LZiVXiAb7qPQNuQ+NWchG/Cy5k/F9jNhHd91lJnTQjAvBwZK9GQWxRXSCSbTqUoe4WTUbVygACV5bY9+wCq7m/5//deJyjFP7zqRYqfg0VWh0Zp5gBs+l96o+lWh+/147WnNf9UW3A3tEnA1iQBv4ZqNomrx+lFJEmCbGI3Q3tUVmVl71HalhzBPt1osFsZs/9ctf8OL5YqgFkmw4s3UEJFSfsvS+r1VSaBk4hcVF6rrpr8uo8pOwCwKEkbLzAjI+IF5JRaU7EtclW/+2kBOXVbIBPYeOb6ZzszC9D68NSk6tOHBW1qvxDfECjJcwmx/XzmVM35LWquBGhxXyprTO65PLaD4rZpkGmK0RTsQwzUtG7ZGeZFLG6zWxX5cbQGua9sy8DfjIlzrO3x9piZklvufSV9gDEhGxIQN4b6r/ejt2frU938SS6KPnX3Z4m4K+haz3W4JL5O5BtFjsofzyrs9EqRA5BritCMfp7so2MbrCZuZKo7K9rOo7i9IdpNO07zT0xKZQJM9A42X6ur460aJZqG2sXXmcyFd1+8e+/fNertfa2LCttV/COpZkgmYuEd/Icz/PStOvqrZtDMBdZz/W7wj+lKsJaLLPDWtg9O8fouHTcaq2s+FvyPYHD0UcL3PFcr8cQR3j3IKmUAqeDkL9ZjlomM7hoO1z55QVCfVUYrQ7nXhF5Htua9FcT2XVz5BoZolu7hVJw7d9obD3mOVg5Uu+6h4Nii4sf7LQsNgMYOhZq9vSPx7uYItF0AI7ZxxSctfdTch3dpc9UNhGN67z+nCLDg1B33U6FvxZ//zfuQMnqvperNnaskpLlkkaD5TgPeFw4Ep20rZFXMycIl050ii74RWiNY8LlaZFoEvVRRIpgCVvUbucCA3LVSHwgShtK3w/2F4sK9p/NTXSMZgAn8+n6w6HmDSYFBDye3DI+nE9SiIElRxXUh5pLIeX9bTnP91Kk9PxDnDWP42bDhKUUwbZf1v5FtxIT+QP7CeT6hI/BSMBO7mj1danJbwCJCX0uTaWqZ6a3u5Nn7KxSi+tsFbcPicZlKdp1m/jTdcDjNLTar/MpEb6b5icKzkyVgPU7erVDc5JR91fjQvrCGM04+fHQZllJcaVxv7uYN7+z5nw4n7UZceXeplggQk8DG4pypJxKQqivWdNHsJYWUW3vXmvxbiQ9DrNL1hBtN6X7IocgonbJCFQdYvIGUNl7u/qEmkZfPvZ6IO1m7SaPE+oUGCw+Vy2Nns5GVZhuNnKXxfJgSeAPQChM1azZ/5zvcpusbiFmu1Ss2vV/ma95Tgpb+88iA8tXaF7JmfaCB6yiLaAJknQY3KqMoXwDLSXwGefzpY32SH7/5iLY0ZdpNLpEth2uz3p3NkXONjl2/AkdC5VVVelkV+gQaso8kqB/p2xAYbe7aLti1wftg95sWE39Kheh9b8STldW5VVTAF97gDpioA9W7xQbQ1cJZLrhV/dvF56cS53grrHE8WFtmV1G1iS+ti+edhytAtv2z/I06dzT5bji9N6/YEfsOvZEVpegW8kqganRZg8sROmB+5DqaHxzDdoKnwyvI8aRnotFup+Pup7c1txiF3EwRL5UKxzSvrXnHaBJNIvVLTaF3zN4Nfc9t/qM1iKWdX5rMcEs8YXFEOkAzli94OVQ0hvOdzJKVbpflnmcb1w8PLx47FS9v1dhyi0yskeZ4Ya4zhpftyHeAZI95nNcNbXXSNo4ZoC7ew3sRRjX61GHUy8VtrNqd6bLcfFJvxXXJ/Pm8JTsmOhmnrXBse//+f5EdCGuHlwCdvuOVDzMAHq4QeWJ9Ouqu2oJ1cfZYgHyM6zTAOyB2zt1BjW5x71iUn1c6jHcaLSWafPMm6YXtlIqDfTliFl2CIQK/PkVsphpmxn754j32kEWjzUiOszspODhWyCbaNR2MaGdFHbdVSK7uLh/gJEoywHXaIu0nwwRqtNZlsXsfLtr6xFxuxmnkJmWfqkMFLDjC33901XZmYqfhWfG30gFegcjY2JVuA0D5qAphwcHYoJR9upzaEHuBM6U0RQTO9bniF0+ttQaBFkOg3zC40J5hqhLxYeF7om5GBRqV85/738iEAsF3Prz8dKuKa3yjTyIRtE779tiAqu1qoXBFMK9NcKj0GPh5wuK14iW9yncg19HC/EkTLV8FSvA/eT1bKHafkIwcFqQxxHyA0GCykyOycuTDXIFfp9MQHyZmpljkPM9xL0ykir+gGcGesFXk3rgybZ7NjgyU4h3V0nRfzte2F6oDEe6SRnfiZIwsgcRhahJBSzcDmef7l0nEW0Gz8s/VUvMKlJkS2aAaYelkPso1synqf1M/qR6NXASTfL5J/Q7Igv2ifNoImpoZRGNrBgV5hW78PhBG6WMYo2ciO+XE2fcZvl0KwXHnRGFWbBkZLKh9xvr9bqMJlZw2lutp3Ax9H2prLqnQ1EVsY3ftypQHy2TGZ9NBe1ioZKEoTErDm9n150wAEZY2MYljF23AWetT1nHP4PRV3CoTIkTp7kkd8LG6t2Ib5I2Ippus/H7eiOmWHWSdH98rWNIX3pz1gdLrDlEa0B8F45EBdYKlBBzKE+MAWCCEScwMW1KFLz69MtdC7t0fHdtp1/sclICyot6SHOnnyjNWcke+z/eAnVj5QkmWLZgPyqkBlx5w8KmKM4NV2HuHU+eBMc38twm9QcWWJ2494g8jnGff94fYWDUHTlEUytmz0bWikbBumiyG5JDBLlwNH0jVZDxuVFcaJzlVf8s8yLa3/hOO4pnkZhRxddmbLd4XvWna3aJTz8Tndos2B+Ua6sTT+CMptlGO/cgJoTrVF3kR+WYUKHfBkfr91RrVXmAF6JW2FoQbc6xs3oo2+mkdP1zXquD8alKrDlpPU65P4YiyHZr/DQ3GUqEKuQM5cF/4Cq29Fjg5TqGHZ/gQ5yz1aqpCogO0KKGlbHAgWgq2DfdSRKDoN/TIdRoSojdNpb0X1v1Q/qapWW28HVBdSnntNtG4Siq725RbS16FTq+I6xcrbsVeGckeIrqRw0dg1qV5+0tjdbK1u5OlYYxiJstlYrvaUdh7MJAsvjR3PtmosEE6FpdEmcvgxf7e1tHY5sDnQD262BMV4lNn4Eo6Ow49JQo518nbh5n62j9GHpyXxClDqnjVvtcHW0v/fVw/wFSDzOxdSp7+FkeLK5skby5nn08s3ain8cKagGs+G1tJX3qnSoVxpr5DPXFURvy/AgrdnA1g+wddgp3y1YW5eh+AhC9zRHXxSbmQFmS3+6/ZkDYcuyyFinfHrTVGFuWCBeNn4s/o9QCIDRilgy7tnMTIby4fzv6XQBJc3GzvypbHKWSeVgXhrqeKg42cv5Is5a9SuTFJZafMBwFZE/NiBIyxdhGi63jVERuxFfsmgUfJz8H3a4VTD0D4Sj7SV6xkf71v//cLAFEbR9e78h/XflDcgqPiKUIMPHvFHszvkMyMiG4FiNdnnh/23ZHU2Olpq9UDeMQFtS42KSarm+8b6z2I6Dl0G/RwvWrilGj+f0vlyunKra7ZctRUqqGaqljc5kg69oZ9TowpzIw3ORkT+6bd2Ii4v7d+ZEn7hErlwFKS3w/5KQd3ZMCex1OcAfHVm9mfBCpWcGXLSASBU+Da6/RMNi1/5Xij6v1PpdtHs4mSdM3AuPrBkXnTxd1gD33v+sRWznzB2LStRr9M2Dr2s/rU2BVs8HjFrk/AltcugZkX6dFuvZFIOtKdevfgV1SGLR9gDfV5LkojZslG628C/78m8lllKnicdka+A0eEfSV/8nuX1Qrk+bWfbtVv9X8QnalS8HDzs7ggwp5eq0/47VlxJHrzVeujX+/4Pq81FNePrfa05t4uXZSS4mTYhjh0cORoYLimTUF+u4mg1oL/Pv9VQPVSBPcOptbEgQ2tFTmQKWQsl6qO7ojrHaOvzbq4equD7Elq7vZS3jJDTWzdJNneRfStYVxOKx+WD+BJeopid/ZjbMmtb10ilj0Yev3ybaKrFj/DyMUvQYaJbppJPWO9/L9TDeOKob4g4LYYqGYj+pz65V1L8+A5RS+G44RJ4VIITFOaKlmzF5+DNVbkXTAyqMdX9ndB+TIJrQfYCx5ue47iLS1zVYuHE4sfXxlufmerzPTfD20ySQgyl8aKuEkfP5ysq9HxXr5DdVtdxEK4lkMNJN8VThvS1Vbe3xnsNrexdoBT6vfEg5zhAPrqH8bEaX9VKwgeFPDJcWcubfDCDxl49YoouSs5kQGlLu9xYoC2oup9cfEOvm7yhVWQxGmx+oWcRXehmcLsUgn+THo6tLY8c3W4qRkieRSvq/8EnhhwujOcma0g8tXzxXrjlNzA7B3LHmnKfYE+Ou/68ViUealzJUiAZfWvXlaFBr2rB2J7GdXzg7Du1oFeO9CwdtR/F/2dFXrUIKy8/O9ge8xYbKVEMHKggsK3zM8O2lEfSvZCF9Elkby+OvmH0C1oUn1+SfPDU9iMykGcISY59DMWVqCtKiIkQ25/8qNlbp29/ti1bd7a9FP+zNH1RLZ07JhSzIVLd5S+8frlAxSLgsvbH2ZTw7T9Qv/5dHYlMTUk9dYGfZGDldBckVTsbcFtp5C0yX9rbyYUreRATC1XFzcuECapicH39qW+Um9RksNQQqPbSeE6wTo4WjxURIb1TdXn0kkyhn1qw+sAGLQ3pnBvgY5lod1c1Vjr90Xra68dhr78KpWCWapRE54/U+5G2ageNgFJUDKi6sJs7yKT/Kzu/LXZJpYZbWLAaONztNZ1R55PtB/GUyVnJbsLaNzIoGTnbIRL9knZ/z+4bZpT9DOatOaewNVB4K774MdDa32yvsYQzaeRG+1XWCwaDp8Rr1kORJPHHtT82L1aWjGFivv4bmUWU5struzo2pjK4E3w0a7IiqLh/6T2ZsKltjXymyh3L0jFWJ+vHF+Sn0M2+7ICnIAL9VDat3Qa/GjrfX3ARoGEMtBdDTPkuyit9aus7qBLxVx7Xwuww1PxQtEJzMCTq03TaCP9caCYm8zLcYhL+YyTYZWLyBC5mI320XSsssw8i6CtcpjqwX/vq72zXnRKjew2C7vKUfBS/8rNKWHdvfjD45eX5UKcSGfL/t3U3c+LJi2zZT3H42oYDxVcaPfsd4e+BcngqsZQqqYsgcs11EtVbM0y4/A8+KjLmpZ+zTvQTYrfrFl+ea9WKU1FtBuiVGNdkbTYHRG0nQ2+pT+FVyelK01QvVMsdo4Yw3w0Ped38yKUtaHn21r6w21GA7zUrvEa7hJrFdLBuw9fzi188tsGBqU3aH/LtNxPZzKbFl6rX0k3BgweiA8BvD0fi6SQB34w/KkIlARLgWn/4QWV+B0puOhK11nX9A5sF4z77WaLat+KKQjDIWPbO9JklrgFXhQJX/C4a6OaC9EbW2nlv1SaiLU9D6yP7krgcnp1AxIXNO5I8tmoHX3e/eebmm5bO5hkbbtdRi0aeCtuAZeO96YIWOGWU/U3oncex2kJm4Vf14AYjMa/rubiNpuyuUVC2N6ii+elDbrZpJr1IFGNJ+9qIDLVvNlG34ZrofVNB6YQsmXxLRUIm24XV9fj9+GE9zGdy/DcYtwusAYq3xysNPpp+Q2+81CSbxD8mmWmNTw9RfXvec8gsz1A2uNmw7vPf0KMbU7fyzQZtPgdrdbZtiqLoWhWkM/wsVpUJxHSUcGKAsW5+YWqM3Jc5flrtT1mtgZac8pZxZ+fMAriJrLn+4f8lVbi+DoMESxTiyihHN3/3l+8DEMse58ZbpWVCxN86M1u6p699XTSBQLoW1SP0rsfcOAsHWw+f2nVkDLlLBN6Cntrz6iLJI5EeRk0LVfpXpmOPncHAHYdwpPVVdwwDhN95skfoKuiPBn1rCayamiMSf/8NNcCUyw+Ldoojm9NcbrnLBx87BCWX79kUGY5olqtt7Dm8WglLoKP4VHHIqHbjIn64qFynQY/NgnfeVSdiUcJfKJyh1EjpSV8S7K6+sBufD3Z1QSUE/0RdnpV/Su+0m1eFRvDd732+byToQ9lA+NOWBg/qJT7xEQLmZrjRTqlxzCwDg9v/qPZfAycrwp1hI7w3CZleIi19PL1EZylqX0eNmtEPyfcj2Z1a3PgddosmYOPiNzHNmx6ENG9LCxaMLXv6yUpBbC26mqym3JdZLjLV+AN4mxme0SrqtNOFVCtUIhgXIJgNpK1Ai9UjywkeQgVJQi1vBD+u/OJEuxuV9PJBf9KwLDmke2CwHbNXgRdsc9icA3WtEWF/rExkd24osdX39sm5wBUIoNioSnXRPqcG51xnxTqpZp7eilOY9L+DiP9dMP3mNYIBVOAN3WpPGC5Rp9LOpPNaA/xW+1etcbzjiqGunk/RjANdGr4KWUUIX45+tYkjuTHUjKJmAWXiO0I1ZELJE6gBgjl5USUrUA/Gq7lJhSy331bURA0CyDd6atJEuQz8gzU1zPIj0oCVILUjU65LT6GLwbaVU784dOQR2flp/37QluZSL3tS+h/anEKNlqzMiQBGhSNcvOydk6E9bE7MYwaUPChcOuQNvIcNGd2zxyTJU4e6u1Ji5ndqLZFsdPO0fOLBDng25eKnnHivVgKqHr4EcZPUkuwKwkdvssAKA8HT7Oftq6fSl+pDFw/LxuRznNWTLskCHKI//iF+OaxsEMrSB6qaDh0QXnc8LAwMbx5huisPSWR2+2LepUXSnXJp7205GesqPONfRRMTGI3/9x9Z/KdtjW00VNaQdRhvxoK+uE8ljHRJ6LNmDOouSVDO92JmT6H6S/TOoSGXXCHuP9LFUPJc0yFSnlqRxGSOloOHa9RmjfG0fIQOtfANa2m/mg5r9saBQqLDRRtgrreoegn0VHa4zVdzPYe6Q8rltk5O6fG5z3yYWw+dRgJtT/KDoP7VS5LQoDIthNbyYxJ8lJbyf11D9g76KAKIKANbbYlSa8+s19ATZjz7Xm+ubYjM0oPmYmuFAOqZvja5nn5FrzvoM0xcJAB1rK6a/N40xRSFoOgZQVWM8tMCOETkrYwr8gGhMZRnfO6HQYqHQ+pkwQ+D31pPSgGEjYihR0p+L1WqWXQuvqibAVp+NmObIybCmje28OI+F//1l82yFd4FZe5ViJ0g2dRtLewmbgBbvZ/2jszWNICCGwzUFCx5XCIfIcl7IYtXXW0r0ZJN43CE1u7Kcsy1zYI4YXfKYzz8XS3jY2Mr23m1YQz1FR/3eghF5Co15HmxIqpvkXNwkvmGKm5yM+tLjKgt2i49GpbNoRS9R5h5TC2FW1qGUmMhmc9g6UFcFbYwNN0gJVQZpNUJ3IC7rhxquHUcV17m+Ab9oE6EbnCMdbvjFPXAlRatB3IRJKvGfZw0nVgv57JVkj6Pz1XC8IpJAKDkolmooxJ5O3Co8N6LbXGQbah3SCB4OJjWfZJlCYc/tPozI9C6VxDQ0o0e7YPXz1eXGrj8/r1tH4B1gZK8xFQf6XwVC+s7UqBmfQHAeQAQ+biPrwcY4VEFztXrZR8POlNxwnJ/ntX9qSj9CS91o9jNpCn6X9aCkTLeIHvRSrsa3gztN0BvV+yGAlQjz5D83uRGOCjzezlgC7kk2WiY6seM+PPwVHoj7/SARQjUElNgLi+3eGnBsVmeW6RddCaxYb3AH3oDpOvFK2DBZH9OarAoEeIDahENVxof41mwNkeguDH9BJNUnE2XIDqITWko4Ns5qXkj93yuFcPm/jOcdRZqrMjKgc9CC+yOx8tDWufOF1IRtcVV3+OKRF90iwPO85chIcThzkz/3JsQUJxGx0LPi3BUQwDu8Ry9JRHu4VoGwreBLAWcd1hiiErPDV/syoifODlSuX5EFDA2txlBUNWt3/ALvc3C0K3hDj3jqhY+TMeEhtfu9KeBzO7jD1zGNDmtQbk6klO35LbDRF08KYv8LuRkJYpMq5DoVa77IMCEQPb6xL43qyGEcqUgXNzDay9MenFbHJO4LFV/tBZvLyZCvxU1ugvXH4+cZXlrzuuWYeouR4j77IbMZsZGCZSZSB8ujdlggmLLnT/7R0zRrRT2wVgUMp70Q9FA+EqvKUyMXBfB+suOO0GH+VXTGMR/Z0OZBHhNBxwoxOzqS1cQMucVSl8SScBSl/nw1tBPzjnjftokIF28+3i1lBjx84tunCGIDb6Q2QREpyb4vd85E1UNr9I01EYj3XJXTE/fq+ldcgito9o+1envqM9Nw5crjInBF3FaLpxtsbOxjhTmu6zM9On03nR5QdJ7z3Loq8dUlwG1pQA75G4I8f1AcTrhcXvVZtdV6y1yLgj19AHqYAC/G2aAe8ublbDoADMwn7xTWI8LnLZXRhLbIvjBti67a35pEyxUXH1WuJAzZ7xZwY4ct4KOid2Hc6TA45OKcFl/vcKFnVxPbzQWsZcMtJx9bS7nVXRrAQytEByPIC3PgIahLs3I2iuuM+rrSoeWH78AWQEIfz22va4FdD7DK+N9QslGkD3mITlImW/tTdVv4tO2GhkD2P3LMFIqxRR34MXuXd0QMYLFNL4o2+2NW1urHzQ6vnUtTaxMQN/6UFSPFgXUqRo73ym2TkzNzhMhxDqOmPbMloLJW3JZL+uPOkJ0IUuj9/FZliBfTm59YQ3/AuYwtejZZgurQS81TCH8UdBAU8T58KDCZA3+ZRzF4pLC8oPpBacXubh+NqzVNxA5P1FItn/b17PpjG0AQb0q2e1/drqdMq8QkLEmSeGlywYVKf/UTxQbqozOOymIGjn8V4ftHVhIpzffYyqPVa0u45gjXOhUpN0noBcV/J960fdps0bgH1TERcYRNzo4jcHrk/xImoZwtRED3X+wtsEiZ0sWwZnyd7QLbJJhaIPPk+c8c/Ev6dm/dFomz92LAEuyN74DNfnFQngRlyPDvbWQ8pDcHFfuYJ5xrVnFo3sj//JuhlHFr9A1CjvzmvpEMYWNOMd2m13NfLdQ1RmF7lfq0izSDnys8jyqYlwRf7mGy8DjXTNL+SQShC2ddDYrOspxxFeRl/yvebc+7R+uZIwFZKcFMRAlodfrTosSiPagF/fiWmMrCSPG+6pPRmOdOoaquJ706yVhc/skeZ2PKZUMchTCzm91x0x1czrM1q+ChUdxf3PWLN2Vx/Ovw50istAdoUaO017Sn03L0UzNPezFm5VAcTs+dlg6xYHJ0PrPiyCp25xWVgmbBMAjCVZtMtoIZqg4VtYPsYWhC7eBYoFdeOTBuKlJHv6OVEVxPV45MKWlyvxkOdCk7iXeOEe/DbgoTUeYkMIcL54QjCM0vc/7saQMRmwCOw5KvarTC6LBONykvmj8mOWs32I2OInfyoXdWVvGfzwoFE8tDV1aLpfcMck85Ciqpy6kyFZoZmTPWjsYS7oWm/iwTubjxwjmPV2NXVbCy4uMqiDYeZpoydqj9COebLmo8tEpov9JR6N2fLfq95rNF9xUlAX/nf7SwMlnvNZRJ8mp3Tg5xWKd6NQ3TxstsFEyOne2fLjcJKcc3TglLH+Q9cyveAKmbxCsBBnC+OwrfEvNn/QerTRdGz883vDctDIfinPKS2ekTRyEMzddN6mWbYCUui/HWQN5dXFKMkgI17GcqaSLD+bbWBW/6OvNZP47BXYUbPw9NYDC/C+2/IYomfxPjDRuQ0c4OAsLtgeaPgxuJouFXSF/VGusgj+G5vHZKaBmWBAPrdTbaqtZz3BhBYI5CgjsP2wH5Ihg56ZKU5SIPbLoQZS1aNLtfx8WEB1KPd/OY/Z3rBYMnN1VIoss64UwN+yOUxy213JdyfYxHE0WJGrptCeyoCB1ZlU2hHZc5Nu+HZKU5G1UA/XJLUIxcA9YwaNrCggKTHMxrSXDw8qy9zaFwNE55yVXo0PL1ALpVHuOCt+VYSogtLfQU3JcnacYwpCfrvYqc/SQ/lv28GylOmS5Tysidg5IGks1WVy9MkXM1h5YdkNS5xwPWLpgBTZp4FWmP1QeF6hrEwuAxLGShkziu+7FGHCIP27IiNRI6d4PdlftDht6xDRFjZy4wGh1FOSg65AhBkI9RyUGJmyBzVxxySuPl+5e7Dumg+eaF649w09VbAGHDhhrudM3uzJvqxW5pn+sejFLooe3Yufzpm/Yqw9lSJQF/8N9rPYji16SbpZ5FgmjnhMZkGtaeaoQoHL+/QraIfVpl9KjQrrosdPBgqjKKx+qPwWG6T1gqViNYtvcNUSp900c3Nbx8xCVKJXazpuaRofAHjoYrRcOjsnirtRT/vC+wntj4GDne1la1DNYUvy9HrgmnLoFG+ovC17Jw3iQDdVoz5CCspkMj+l8zHCxj6A/xnwEWrZe0kzWNHBNVITgbWStEs2MHdXK6PqatLX2p2VcQoa+l5S9ncNuB97fZHyMQ2gpWougiPGwqaEf5I7hDQ7FB4358TYpS9C/9z2SzpHINWkhuIab1nhr0W1MsPopoFeNNnYWIWLKkLMAusLbuF6vWuE8TVL3Z83w0S0UdCc6dcLcOz1zrY3vjEm6Kt89qAfER8kGpT4vsT+HNaQhqLNVSvD/zWtVIHq+5WGuJL7tSfztUEJu+UERGcD8fFiNOp7ip0Bccfvi8n8rU6dX9GRriHy62U7DtOexTpZtqktPRj1cLuwdov18UEIxRL8KeKod69zLTuFg+yH8N8Z6vpHmcT+8Vwi+xSch4yuKtfuzYsSuQX34rlGQGkg65UK0gSZvoFu1A+oi4wedkafW6tLocAltwvnBzbCk0u9H6ehplrxTvfwMcmGAhedWJlAHEJm2/5npFcyfXqurma9W2xxfrM8B81Ik1+2sFiX68xa9WPjPWAV2rGzF8CHx7m2jZaLLrW725HIidp327z4oBYrIFZEUwtfcRKpoDFxLGeRTWdMyxTHal9bD6/ncUbAYNa36HR5r+9pdjgpPrwwE+UfcWZMVkGX5dBbfmjHVPo2MPp5T0B9pND+w/XkEHg+GQnF4pm9xrOtDUmTE1f/QeI6PidW+Qg+Pr8/W+1Q8rFHXqocC7BTYZAuCrWGL4NhUclS7GeB3Mt55M4a4Lqv/D3jR6SRamDN/UDQUUd+7LcnldonXTv9pJAKbL7q55xff5npCyF5MP2z3OMrILLvxa/rXWRbQ/LPByo7uPf+rdde1MR6e+5VL9znfiAyoz7z15NLXAykthBhUYCN/GNeiSy08KfCz8wMNf/KJ9EAxHOnimVp1Th8WQDqDG1qtdHBjAHlT1skKN8dLew5YRLMdW0Ln450zT35CrVQi36vwOYAVVh93nd1wRX0kXooGhFl7R56jxTSJta3UMtEZSjsqPgrsVlU28/O6xSf7+AFPMmOrGWA+me9cO/kUT3sXmI5B0VrijfkqM4nXt6O4YJGnXql76gRaYKacYIBqWpRj7lngKZUH0s/GnqhvkADKIQVLgH1XVxWQy/bvlDygscs8ZafG6yZ32zvxkuQwQotGUJzmGOozHrtz3lr8IGdsL3v1Ql8DJyRg413jB5+Nr26yM9IvnpI88Sa6cL7tAhOX6e6L1aBCV/bLaKljzzmZ6JSFGAxO3tR5MBrPnOztAMx22aaXD6Ser4iMDHfHgPJcTR49wx6AgLmkhE6AUk5UWTMkozNpgDvD3DkXxd2dzrBI0Sv7kDTLykZQaGvlIaHLKsOa+5WaUEZc+TJiDAlbJt1wLm//q+plYg4VrNNwH/3KgbLUDf17hC/FrenqJcisb61vkhma6pTv/OIVgpUyZ9aIFq480xvfeBZjlvrYeKaLksybpwu/MZbaeB9Vbj4PjispaQBVx6uYGx/A1DWMMUQ1qo0T34Y2OCQvXk94oALda3kpYwu7rx+8+gUeAd928k8Qkrgpb8StKjg3Rev4+6S41aiNYENLexZg/LFcr32xyNleX8jUqp48wQaC4pjEQoN50ulBOlNJgi8mgx9x/gzBtJ/87JbYaWgk7PJgJANzpeqGBwpFnOHPGeVLxGjflnC8hSm8Nxd4b6n6/u1qmJo/b84F94LsKgaab6M5wx1/K/aIFToSUQoV1ieghqFuWs8OtCAopiLLGCkBSMFcwFX84B5db65yrlYqy+/ZvSXCIfc8t6N2m58f0ZYPgoeOtz48FtagIMAuP83Ji/lX8k2h+l6PI4jPAetBuLE9y979uZY14o6r83mlbiOLw2aGEj8rPOb3p++exIUMAcyzCGvWBSuIT83bqDHYEoHLpcbyHhAyo9DLRalfoAdvSON7MRLRfZ2J+ptu/eJCxE1v6o50NlL8QnN4mq5z1cKCWULyQ58P3orjK9uLDYdGKmFXixO0jJgO4PTz40Zr/uOQkSQbiWlP3FiGwRiyu9MsXFoFKITrKpacFMHE7M6983r6mOiQvPb2JAODfHLmTRN0Azcp8qCHx8zChbLXbh8ZgC7GRs+9N/Kb04hfcfgXDv2V3OfTYAUd8cIaSDWpQiyMaZCo6nz5KNN4Q767nPWyCV4vXGHBXBnk0qK+gym8gB/XKbEUWQOdV4nLtcqyI0kb9+m9mmpVrgEloEQ7d85bAVXEo7suW1sy2l0MK4k+8M1bWjPj89mNtR5RaQKJy8fLWUG5vNROWDZ8wZhGdSaJRNBCzicSvYUl8mabFGbv34/qs0ahjDb7BizvhaMRi31Er1L5rgH/bsZaKpn+xghS0wm7VR8OPq9NKDRUSHmwqYvEuY1xQ0Gp4uczbbcazsU+ytUoMuuj2JhNB0Xu3dOLNlJBRNbqiH6EnONggBpfAnk3ubXmfmMlft3lUnqcGqvARn9FvMd1uZBpPzHxQifNpd2igAITqb0i7cv9heZRE4uOu2AKqQA81i7Pa/jZ0ltux0La/lCf9Q7uTbWamBh93b5A3vIXON/TOoBG89UtMmUvY7D5a4aIEsJzb2q9n7/ByPKIxUz9zgVGibqtPmr+pncGypLL6UO32x3mZgkw1576MyddH6dDEDLBRtjkkXHUpEuDpLKRF38m93qmvCauwrLsTKupJ+E4Hs3bjXo0bNEZUMJwRE6vuHPoxBBV/e/5kYJo1VVP624HIUfXcZSTa23TGharSEwO7IJRxp1AgY8ytFADQvHJX2VPO+n7+UG1NdztBlvXeTZSZ1FAkX5KGzcNvTxs169DopFp3bRb48F2xbZ+e2kUZXPFeKOvVn+5G4ZYoNU439GbK/iDXbO6vQbN59sVPD0eJhFbmdjOal6dsjPJscNO2inJ/z0YwrF7voaWVNN46pOT2+nfaHM/H19G3JxLIi9PtovFDf6lrZj+wtZjtIInu+j38cNpWjxviTpRapQ0viR8G3Yy8LjHUNkaIQXTJFQxHrksFw+mtxBo4hHRqSDcf5iGfnyNV/B88xEqzprxcG03wWM0s8kpuyUeZgeHEgkDoZeS4X5dHWx2gW0jLXF7d5HmGHXhoqhu7cS00s9lOjev2VhqtcCKY2C91g/YPppuWZmb+FnZJGsBa3vQ9Onw2N4xC0Fs5MngaXcp6TpLqvI+PDk7HEqZZH7/nGRGkUxTW0MY6861iwXmVncLUBK2ddTDX97BHmZm0bYztBCMePhxuSzAhs/Ly3DKK9nLo7hVMSFKZFT2wAKPFYQjdni1dPZ0pP3lY39gqWbDW2Sgn1UGEi1nYKA95KN09U+35C5HnM3uFCRLofSEIBx/2/l+3O1yjZ2Bakwal1RppDIyTXQNLunqmlgo06KoDq5MhMw8VZLnR+oOYwmH/YsDaycFRFUzWep2LYy+BYmAX6ZPIZnQw/9zUWy6k3v6GlMq8CEHEu7Q3etc+hHkLRWZjewp8amsmrG0dyOMBt57aBBfAj7wLmo3k+9rpCT0iHmq1UGtZQFRlxOOkX4q0pf6lU3GNyhk2Co033f//KxfAssU+gbdxvjUlGYzSrM7OzLpUNkATj++4w8x/PDklWh8f7dz5FRqrKOiANewdZj7g/WKBkhaWZM8XLpeOZt7kxIl8BLxRsXly64Bw/4XbXj2aVxde+zpNBslLlAh7wIqF8jBuze5kBvAVZ1IO1051fwLbGdqTr25kkbboKOuKqm/ND/Z7Z4AM22OydyXRQzvWyMyLhWttFzGYvqLxvAiQDlPqLymhCl3g3Td6WE2Um2MsRLq6dJ3Nsq4Ik97zdLwRZrp6QNf5omawzi6kk9+bUmNLciXCjlBnl6F4+ZZZbwNGmz7mYK2PHtxV9D90+9FoZkZGA/QU4XRek8FAZ/KJcxc6lbQIHrBeh/V2inI3MfxfNDzA/nE1KoWlvuew/ub0ZTyQUVK7ziDt4O3QtZfno3OF2Bskm57jC2pKjb0R15KtOTYEGfP5RuaUcHtWb/Ny6llqEnbad0z89KSuxG5TETo/rAzVmNKVGHWA4Ry/OmurecWTmGr5hHcI5vUm/nX9gqblyv1sVMkdWGklS5elSGNnJlW5c5koaMvY3WDJox0EZ2b2H2agsJH6uRcmpp1erJQp5oZSpJJSbssjpYPRNhcmEZ2zTWwVo6wxZMpJZIF6swcEdlQtVXAFvNtY7439Mx1qZWyJT0QoQ0mwW4BAYeu/nU7zVcRSFkI0I3yw1IktYaLlHp70RKYC+t6+p5Nk2vXhQoTzfr6mgO2reJPoBkTNcqR2YggPLmT3zS09PCX/r2KK7xPdFIC7mTn6q30w/Vyyt2JtAngbF6caX2eT87vX5t+7Ml6rFN4v95VpF6EargfzN7511Vd+PWNZAhYUGk7k6DdQzVe1ZJ5nPejakbUQ1zA21e0wByKzdbzrKZSP5dKXzny8UAcwiWZSsBe7nj3QvJikzZwdId/3tbmgSsTzqqCiBM859viRENP1Z2HGn66WBe8u2cchjlia/ky9OJlu2LsWAng0rkm2pFoTYMJc8z3v1jEpikyXt1O3hpHVCT4HSOO+EgqWmwO+vbniq87Si3OyCuPIqk0GmP6jn/Nyl67pjt1QiDKDRyPQax+K7y7v9jWMzFhbJTUuQqHyjDCmuGJwc6Hmk69kYB/Xwr9FyObyTVLSOWvzm+yy0NzM2nhkB3j7EgKQ2HmVazDcT2ACsYT74OncxZqE8ET+WNtt/amccoE3LLp7cPV3UsgZWA5V4hlLvMZXXW+aZCv3/h6HVaajMpJrLab5eLySgVqBiGRYBRFyOCjvIj956bchHPiqe+qgYfDcmNbZEbEGmKoJFy8ObXsIOpHJqNiykxB2Ybjt3XXEkMVhzhGXySedqgd3Vq59/27VUAFxJtPayb4Nsqbm0yrXD2sbge5CNSYnZTbVSzJ8UF/Ph8G9heq/iw1nsB0DzURi1h0vRwwMBaXrGFwEmWtU24GgjIu6nGcBJrO8/v3Sgw2D45KZv571yLR2c7inleIWj7QdEAJvuPWBzljgJlotV5tpq1eO5Zn758zqkfT5qpqWSDkwHeIjOvzbsYcuMe6HpSuw7lg0ZHcQHvsQW5iL8+8S6yB+AhTxWioCiVgC9jo5praGh85EQZQoewMpHX+PoRbcg7i/+rYZsxW+FmIWJaksjglzoNizBZenOsYhI3VxuruEx528ItMd6lo/ULhoyL80C08IlgQ3z7/OtrhJNx/wnS0JOCsmpAQjHfzwmZcm36esCHq+85SrWkLu022cyL+p1vB1SFp+vVTUt3yazaCiwarWiQNOVi9p+yazyUlrDM/1wuTSzrsZ/hfKAhTbIgtnvbM2ZmVwC/1z/JkER0/8Resz7hs8Ipjwci4rpTp/J3bHb1jzTpPyn1+2cFGJbu/fvTMBVLfl3ojR6jAG1BTbHcnXf9hexVlolq3S/0DXS3521CBLY9D4PEqE6l96OBLwH2rJ3OIkWayr5gFPauJCrNH6F+fCag9PLDAx5pppKp2vT3URN00HOpWbAACZiDbq0GS602EDnnKnjS+9srEoMcXvxC4/PueXVQ06sF6JBaicykOViBXW+xrAI2Nq7qfWtMaKbYAVh6/n+OqUPis7D1cpecVXqmzWkplsWMmknOVexWqsWSkJ+Es9NrDDl/O5SAybKkiBUC+OnylytaiV23qr7q9dLdxPliw/AOMWitfiewF/a7zeTi9Y0fPNEGkWiRvaLPBIMdHwrCc9+aZotfjgIMapCsZTAOeH3f04C7kciD84oUgaQrBiHDxlLq3CcRYs65EJKuzsyNnVkq9ZS1IHabZraL1rfr5eHkcdGchkuDizQTuRaItsDgIA/6EW0UlsV4oaCWKyuJQhzYWJ/CyLVdyMdqeijSa682K5SsjhJGdBbeFLNbW/RVRG8TZzaEuVe0ppdN8nMZThfSA2zvUl7edP3FMsfzUCAhMCSzUlWwXq1sPl27sYBXNjyLVQrjCayxeZwuaxXICEWHmJ1k2Y0oG4jHETAKhxf6z51MSwS715GseQmZdc+GEb2DwQ7cbYL+ORRZV1lhvPr2ofVkuDcCpq2TqKRK1uezD+3unKoFFlCPfDcAA9oBmnS3wOZdPc5OaeJ5vGTeS+NoH32/vxzQgKqGK0CGI4OcnfOcmUphBO4s5GptU/itr2ETvx3dTuWosvQ3+8kO87gouQbwzgpY38d9pinPCRD1xGoyFqFWLO8686YJ7xsdgzofBTqvQY9kRo2XRi7mYxxL8fjCkjTHCZxq58apdQKP38uhcC0ON97kayeB0qE/XhET+9Ubkvr/kJOQhbrBu7ThPh2ZQ6AXrttOtWH1seNRY07qQ332mp4BIdgsnu09IoTcccTUX3BE6ErBJvw21/fdskCde5pkAxvmcwgMWzNsl88vfimsGK6MvXlGcxxLWURPHj/4vBVmVGJf/AB0fFjqDjItPosW//cNM7rQB5nuo8EySeYtjoPjo7TJ/edBSFLly6u2fP0v8QDJqPiXvMq4d38RJoh3hKPaJ4NdjjtNi62zmZZSRWUF6svABw0pS9XoOqZOuwV7z8qtUhCQYcuLH0jpsGc+Xfz0uSNpdmNwZzJ3HJSk2cOZ3Oz9iqe17tkUQp8jWHVsH92go2Gw7G5zIWQKfrf7SzMuvMVYmOQPVhmJ4DGIIG6Fok6TbLIHQMTASr+SPw0bGOljq681qyzo2HaugONg/1Z0F5Zz3S5IVvy8JXPT1cXj+HUv+w/i0ttLeH73TrudQ6XhbKRns2CClw92gFzAzJ2G5V55kScR9CRO4s8L4u1Wi7hK2F4QSW52BgtV2I1QPkWKcu6KUIFrGC4i3N6Btr3t687IiPT0B0Xb1CGq7dXLOX3W5FH2wU0VXW2eWaW8Q870KsPHT/u0X+JVpgloG1jWrIvP+CQpQzV9ltE2xd2qWCiTeUtoc9HsdKeINeX/kvDXh+Kvwr8rMn0sf5OYzQumpaHkr2kIE3r/kY8GmRs0060aEJfSU7Bw/vhrTM23LtvGBXanVWyn/gxe535ZEfRvfUlynQv+IAlKJ/8XVods7LOBF7oEvRCefF4Y46NN7GNNBlOFqt25KpQ/oorXU8jCB179jbTOqODP565UOkGGrBTfTIohS2vIhnCDKzaOa7Lo66r8hmmc9zh0bdqUCZyW16y3KNY1v1Z7OmAvDhSCj4bOjGyiKUMFr7NOtVWC/rvzDHJ1ZuT53O5UX+1LidVQzKj7dSrbjtQzHTVeG6Si8pTT6hMGq6N02tFCOel/aNMrfEgygN/uRFEffDL9lv3w1rLd//sCOrW4YzVGfzM9/xfJ2CY0LOtBQwdgaIhAiG+yaoX0nntw5Dz0fXqF5VdT3VgahAb59e2GRDEfv8EJck2dUeiy2mzxbdyJoKP5eF850c9lO66ZHdlYSb+O2tVADCI/C7AwSJB0po4koM77LwwOspIecGWsskC49ou9+sGgGxuajhbqAUfdjAdfdMG1qJqyclx9Ju+9bkQ2NkMDRO+zPlYENja3fe3s6EaDpY8p1ptdEd5mkxa5rIc41Wvhfa4mEB+6fhMfvbai2AOeXC9rAMjCLt9RfjApjQCYrCEYBlgg0DMpUUsBFfwIFy5LKfJsu7KLu8oeyjx8Xu1z42u6lOinKqgsFJbzZx+dvL5KXQ0bVbHz5gZnxOr29pem62MCHBHoHpoRB75alEJ6gZu6QcxvsyR2mrEQHuO4edEDcIvS91J9ubF17NUZEqzcnZGNYG+OTzu3m2Um0xJtFZacOY9T+O8/M+OOlLWiTw8pPVm4KZqwzOl6kAIs+vtb/rAj7c6DyDsd28nyyi72PCYcmFORdFdUlEtd2mZFPpappCUc3Qe54zIvPlqZVX8ep4Lwh/cvssOiIT24T7TAqSlIEf5woiQD32nOrkEgRraWTMYpnNYEJr65NR1/j6pf1m/16oEzO2mU1DVsU4NGi/2NVZcEFX6RVkWc//l82U9R3gvjjzxqSW6ArAwbSvkTDmF58VA1Y5/CzEdWB0cOcxZ+2Yx25P1vPvnvy70JeGKp8IM3ns5IdsPk6wvtLm+xuZa2XCAqjbZ4jfXthrivl39gcwQEhLu1g04heaFqJJTUdkHr3wJzNYGws5FXBgZ2662FNQfn61wt5JHrLdUykplzLTAzaPTiCoDLnqQgavixpVjhnk8NVdJnt7/1mCmqeZLP6nJhHNGe2y31QpOl7nNjrurFANm9apJstm3ggsfmQ9/0XesguWT9nwQjoAutriLfaUzX3ANewkpFnjkI/AwIlupuA0sMKGTu+6HBpkrN8qH9UV3BbqTKQJ0cz861Kc7N8GEt6lLMN/XHBO4fuLXbDGqqAx3XyWiQhmJEVMhiopWuMW8ARPr434rHxb0zaDbEpx7d6eoo1WQRxfkzGj8QAvLeEkHZjzjKUPGoKHonRt1oVWEMRkqyHRBRdepQSi5e8KJWSLQbmJfBF3mw1Q6z1TrRP5zvaJEtdXOIqSETl1+05jnI8mH719QfdeaDBNcDRlMQ2fbaIPRBnTqTwcNDTZigQKnJHaB70q51lneUvPYEjWnFVHJKvv7o4ekbylNo1KT6uZbs+/ur+7FHS97X34hU8skbG2E4DQuG6GQxmfhPO/VQB3O+Yl8isvC434VgJjd87MMA9bgNQ+ho/spW1gKQ0ojWKNo6FNU0sX9s1ZjjKWHWGFYO/nv3K3Ik2rZspbSe24GV5okiBNM9V/36cMoRheRy4ZcpS4S8z1JhPLocpurTZPBP3QrauEx934q60H2crR+qs6LfCxKOqC+URClRSFJ7wNbapFrwKv5UCuQm3RrhiaKNbyxIRx36NyA+jLPEJYE8EltnlvzAtcsPg0lXwlaDbsD06E8bWUwc77veh0krWbMuB+NSh/nspZH1O0rp5yxtRK7fzeNYvCy6qzuYlGBzOaO5/aEwVb1Ac25ms47YtooVPmbPUdBXgTkh6fA8OBVWEaS1j2lwurv3dwBF8vXuDVKXzqOF12MnxwkfS/bJSkpO85YNLB5SFDmYnhQnAUvtYest0yxy+v9Jex421rOcSy38m26QPa0SSDXb9DPfRMTDYsXMxvn9t/aKFL86CWokL97H8d12gm8XjppmxsNWJzEzOMej+uCIM5m+OS0jIp5TAxw29wiH3/qszGze+zb2XU3mR3ZA8xC+qpImvK8SFElyVvYNpiINuqdJ1sAcMvniqVJ4ffF7/liYW2lXVqk9a5NF59sSEZ3xpfudSgNDPQ4MOpNPK9cnlAKKw7kbImXEsLlxizJvWiLqQbtVcNZabuf27Axg/oGEYFY2xE7xRqlf4/nfrYjIRXPi4st3VpGiGBtyA0quPlxdNDHF7D/bBgqF79R5Ro/pXb2Woy6yM/Bi9CMzaW4SSPapyyMdSO/7idbh1ydpiSQddM0XIW2H/XaIBKxfHgtDMz+JaeBPZEZBzTCYt/WsRDTiDrLrC/+3zwb1HN+r905BwS++HtlFgD3mQ8+1hIqjUNjO3X7afs4TAR+6KWJl2TLh+HR/u3hUXqeNS17O2Ijf8d9UaKp43DDul3Ixatqrx0mCs3q1o8UYe827ef3/qHcV7C/OUTrXVOJin+61wwsgTPhPsgATTwC4NDQ/EuliZi6mT44GkkDAH7Phegaxc0kqYdZ00b0YrSdGZJIfnYfsqbmzs8PTda/ncJH6yBWRDzPJTV1V8jBvj3JGj6ov1ZXMTdwqKkltqbVPJh6uIy+hwF1aE13W28r8tj7l8XUMkaBzbYO03DWiLUYGbIwfvo6P2CXytX+/mwyGpewi3tzyLxlEyIWVLBRuXK3bds3YavF+NnWa7NvNUlsHHgeEXcHYXE0kynWggUNPywVcMgsuR8IctrNlbW9nQSbM+EYg4yiW9nZFpaoj2aBbV3GQTA/CFtNw+DTGwsYGXCgXXkJsZPiKdkV1OHJ80+LB2DHssU5rmoboRTV01Ol1ubsW87rZ6spTXuhQHW8X/tYTOaevy5obLE0uZdbdmGeLpOtIMJmC+3KiXLe9gDgIvKjFWrJheVYh9hN281GQpq2Y5dPfJE/HSXrSnNQAg9mp+711ERblA6eK7RiP9eYxXRy/exSYjlDpH8BJsl78Y4rNR3qRZ6+U+6WXTmL1RC6hvbTg1IErruT1meGLpejG5uwAjzhBRIfU19eF7alfuwPW0Ip4S3xkalz2Cvy8v2N576wUJHgNydHeNYPh2ipX8PUUugbhyjmaB7nvkf6rEMYS1wsuHo68zkWpdJHxlPimm/DOUU15gehw4BL/LPjrjCdBdlJRUeV/hDvVDhPcylyPc3y4xoCAMq9iDagBlSN4k4RlPgarh3m4mQ+/pgwkjhLv1jQhdaqAoeeVD13OrfPO64QQ/qZ0/IrtN5U7AeXM6Wp+mt9WJ0Cu8+XHNxzNrxH/FQ6ZhdBxVo78MR4j90ZG9uVBce0ZN04n9GSEz3LHP/xNKYyvuLgD5dkfg3kA/k8Fs/w6/mMFybBACPQ87JnkUqOCltr0+eBD3fGXjZbEkdp8ohm0qV8prjeJ/3dOM8Nvic5UtiPdapSzhP797rEUlLtcafALR5TOX0fGVkBrQVM7xfbNZxXL0RdYx96/JKUnm8O0fZCdGArl4UI8ziehsNzuYhwPkhhkgmk9lG8hrjC1hPDHjL86enStpQpjkgTQ613UtLSFd21RAOfjhzsJzuNgGoNWNHhy/+vD0DtKeAirgSdsfsjEPPSh254VrOGtV6UD1iTldBYVLdFbGb/5rQpzdbqqQvMcwiMx6BSGU+AgmQqClNv4JsVD0baJST5GCVTlUotVuxCpw93tlitMeefbq2a1zntT6fwPEu0JxZsPbQc9QpxixqaDG9d0zyE3Ftnf2OikuScD3PrJ19bKGrK3YjGm17tT4aHQXnzAVWZyX+JQpzCVwvfjU9oEZ8+P/f3Midfj5y6ymMzXt30HNdNCNQiFB5S1Uq3JAQcrv/M39Vmfwe5d+T5z+uvKgvitSiKm/7R8SCbGzNmcZybtE8SaTxMkXdXNqFANHO3RFqfnWel8jJP5M3S+Nb8EcpU9YmBoBlJ9mcSHzPlIWaBNH9ZgtK5xdS8LrTdvQnF1KXg9ez7rp5IC18lyvppyJmZSySx/rJkvhpadblzluG64KnHI5VWKxNGXKmP6lwbZTadDfd8bTEGD2r5lbefUts0ibuLMsBcT+PpkpnOAInq+vaZMlhYWdZHhGZCRe4GLQn0xgWrcaR5sO3CaYx29whRCCulGep20Uk9368p+VnalXpzZj8QdeWh+ZOrgJTjlclby26OgAd9oy7PxL8OMkG22YX8Y1RFRWqWsTbp20R1h6WWAvVIpg18H22nazmqIbMRf2BjzzVWS7E7OCLxm7lkvThc/Q786rb0UC22jgaRm+koGKpMD9Q2uzmwCiqrcj7nDJcS8GcfyTm8sV0jDhe4XMbXmx/c7KloCcGwFueHPN7swFaxc5Z6TnM/5Y0GqP5bn6FSkSx33zMz3bwNF8uBSMW60zMvSmuzLHIoIddc3pLawsjDcgR8Um5tzKGm/15zm8xDMzv/7BfGc2lELJ7oRAWKsJZAMRBzFsQ5C+/b/915Sk0o8e9aD+EHFpoalBQox9Uy5vbhMiIufEf7S6tLiJPgAVtwGMDCmsPnN+s0MT2A1RSXnu7WEAJwQG1XAbd/5kaEkXPX7Jao6rn1fWNNaSfyzeKfUI/9THM5qiBQxsx3L0XDWisZqBUOLl4z1WXEcbLv2LH50lIxcIU26QvZFV1aG43yQeCNvVfa1krNb5v3+8AjkRryrau/ENpm+XD56h7DS0fpdoqmohNxCXi3jwKZ0rACne67DPoRdEeT4YPkNVpBalDDw8gEkwiX0S4okCI9PI0DYmLKVveIEtRzHycSs5Z2mbyZZvKHdfDvRZNu5NMjV3NRISp7wUKZDlZaWMBnKYQ+HUIubUlK316dlrJ1z7DswzM58Ag70kqOMD0a+/h5H5tBkWXoNlr1c1bOTjuDtlX0P7OSAnVXiRezvCqibLNRVdTIHbZdmgd7gaqPHTH6reez3pr82PvuN79SeSlYYCTGAfeJGGHwxkKElN+BZUznO6VFREo4tQAUNJDD2T8lVwONJ0YqjYFwrP7JLzI1bnaW8/ITKa1FHSGmOrakO9WDwsmTx24ohSaffraWxTO9zC16+mc5AzwZlzW+QEwX6/Fa3aQKHsxaYhzWo0QCgj6Iq15xQTbcRDc4PNBCEFr6BiXt2WaUbtM04HG3w2jg8e3sV8aSjsNPq37efEf/f48eyjQr5l/t9iDB4oXNH2JEngDOBRymbKvfEbcvtB/+eV63M4CWZNgsM5s2RpnYw2YnGk2UivGetnUsYV1suZL8988IhIrc1rEh4ud9TdxJc7n+ft2deITGjb79wAuDKeqivz2cFBN/vf/FJkZDXHO71cXVHBQZzQzxNLA/svWG1lrFd08HEWqj/WHkpjdX5r8OaCbrq29gXN3WcH0Joc2MUAcmVxSfC/hSq+OvyjtxgPZOYcX9++Qjh9M177FWqW4XHFOa0WkhaSG2Nzi9phnQZh2aDc6HfSkW8oYQzTOZqNq2s1KfPo1lI1Xv65/7iw3luKdGp+b+Y5N3Lbc6AmxtHfx3ehRbWpujnw51Wf1R1/iYkasr4dClcUqPtdYiSCwb/tGFKYDJxMOma8stFou5VYcATHOgnUDgfmMcgXMqhdnLQyF0nQzMPA/YZ9jRvbwz9x15kZl6PJ+VXTtZ1juBFjj+JOGP14PRvEmnbjqpHvO6pVmr87+/r62ZCdnqXpfoYMoyllpIKRhB9peWNtNVEtaoeIeGUMpmzFoodR7enk31Hg/FKX6vch5Nku2g0GxAowx43+kHZIH6GZxz2VWgNFHF03XrLdkJBCpbd2NF96NxbJcrZifMGJ5v6VmFHanHVsxCX9hnsWhow/2M0gmLph++5aYyWrYjNB5qCj7wFj818zPpg4NyZjP/BYFDinH+vduaV5mysP3905o6aMq5wzARUA77LxIZqIQ4ZvDCjxVtC/+YKwT069/BjKobre3bUmGK5HtIy2ShqE4/qw8hMtHsBI6YZmP5YiZpZQj5br6TCYvlY+OoZw5PzM403iryM54+1WzdobEw2w/jUDl+be9HzOWa49eZIozHwf1jzNC3opW9cLUR4fcsb2U21GmF5/tH8Z6sESOx3gi8//GexKZW/OPv7RKenY4kLpg2B63dCGLA3cGiYSpbi0wv/UR1S7EOlP/t7iplOgHe8aR0W8JlrRENRPne+/SOUxdBbM/SsvQ9NPPF6UAmvzmb+Pil6T2Nmsoq1G0U663KDJlt46u7n8i8s7eSq8n0uU4wi8lpHNzM1gwHdXmUtpdtrow5gMacXMXuszfN8ki1946GC7P4uDbXojH6D/IXzC3Go3diXGu8QblSDFfzWDt10CObLsQ6ylzjhOD0eguHRH39pamxpS/lsz9cw8AT7sxtMH2kTjWvYuftkTXaDtpKpSoNfXzK4RoQujstQ5Eu68mMwNoXrSs03yp+pmZXwrFcGOt48c+ymHH9cKfxmZi/tjs+bNM8sr9VUXOZw2Kuq0z+f5D/RNAHmpyKBVfEmZn0OtrhKOgMa+9dLcIrXi80j17AJJYkBpJZKkEqWSqMBiPkcepDY2+Z7JAK/bBOb/NGJF56och581EI6jKTKtfiBoPtYuR4UQhdAfwsXaEdSDeYcHjg1FTjtbinJ6X+VQoBcc8dRjbq258eygYvYpl8NR1cyzOxZoI7i73sdGcNAPl7pUy9d2GpdOAKjvd9M7jPiuBYnKlr0hzOrcddVpTL/UWfaV6HRpbdivn/T1GsvUkLLVLDA/prKTigZTeJz3TmsCeI9Mc5ursj2MbUfOUHrwxsh+AwlQ952Prib6XcU2rzwsE64q8u/Hn3EIOdtve9KY9WIrEzUBvsC7KLbXFYuehapVf2HDRa2MsZlaWwvcwFyxr88/evXrMYL1965188gg/kSCU/CmuBo/ajjy4KVZ8X1QmccHtbMAY/7NpnZQBPxr5sRLqY0KrJBWvaIki3r2Q7P9Kpe2dA1W7apQo0PNha1gpgqDy/d4UX3m2NDDNsCZUjhYsZ3EiwcMD4BUR4O2TaoQbnfPp55PhYFkfZu3FXQ8hccyHWaJBDViTQb3RYVXaUCsLUo6l4h3NvnJwRVECRfz+G94JXODviEW5W98PMoBDKMflSxRKKMCo1mRgB2HP+TxPN8FLeYyqloqfUIQx9GZ4ui5vibbWNhgPc2bTad93J1YLEv/isvhiYm7aet022d0LUGnFZa6FI7Wrdi9F0losT7ajl83CNanai724FIFBsp+TNmAEWmGquIsApOaGJ9NaDDFZhQ09BY6LaNZKP0o785bsS1eXSt5NxPmXBJ4XY1JUa4+jq5+9ghi/xZVeNE7GciYNI5MnvgadtCA3ErsFG5JlLBzIVsTJkgf0PX61cZA3oT90fHeWWXKPaTZxfzrKdfpu2F/Foi1ok4WJOwsgZflTw+jstKtL7CSwnwpMYa6tJcv0GnnbQ4sfTao2JXkWdKG5IdEBvuCvHHX5clQPAouXugFwHrio2jxcZtXrRL+NQ59jbqAcpVSWoqP03B4FjzChAO9AyrnqTNP6xe5/Y87mKglDc2vRJu6daz8qBtV26VnhLX/krbbNxCFeAz6THk7M2O+iPw7tJNF8hrx6bUfNAGHOiIjSXgmkfMNVMtRlInStLrHOex6YAsrnu8Fcka1fJnGbABg0b1iJcIfX45HG823HH5XH4DQdr8l9DrTtHm/H3Vw2JtLEbEp8YcGo2aYSiTUoC36RTEZwKYTEhEAX3ReeTXkbPri83xfDcItlWpeEgPwUiB2YlqJuYDYA3t+ML0nR1/WDqWzFBNIP841+ve6l3Rj9/pqbFlZYtGhnikrhbYwxvNY0JjeWNEyizFimd5Aqk/wL1fASg7s8dLBg+0cjmrBI14I4Fsv0ZYLVW4LMU5RjuEYiVTDBxe3A5twDNUPCINsNkqFswez22GQeIER3KGNG8aQF7vY8vKMOr6sb5kcl/BDqOTMKNDjaQmqVGVK0VzrIeW23lsYgVP5VBn+3Y7WbUXWqvetyhBGQau4Pate1WJhDGWL30aVmNP/QKcrTxcYfVPtP5eBUpK0cwjMwDqs5Sq70Jcz4vW/atdYkNimvd3EGPJ9p0ocGMO5fZioZi7+nrAzMHRpuO80CoDhodpOrOjTIZeDt5PRihtXzoNDwh6bf0KIROvoWUSwYvTKOPpaXFe2DGZLoMCOjmhBZukhltBEK3Y98ixZizJIlfuW/8Ob45E6FboWXCQh5U8wtWyQp0Bgo4KXGxYxuHK5ObGKGU1YOXk/3cFCw3Dh0pu3DJqCQnVXajM+y68K3BtiLLzyNZoLU3zTsOcSu/q8fpApfXr5AK8ZmY6kgFIzQLVPxnuy0Do6LZPCmGNO2/4bpZnSG33//ZbEVt4fFkZpOHuiu9V4waFSj1ziKd+ZKqYm8w0hA9uUCsCVNw9ToRLRGdAJmfWl2jKb5v5Dyq4judXW2UG9Mm9D3M1T6/j1321u7Nxvadsz1oioSVzRsk3HY3o4OIdb/3WDgepK3cOGGlWnkvk9yeUi17Wv1DUC0Yv/gfRefBnCjbhWFQxK6bHpOYnk0vm7q7b3YXe1c6ioCCvXcRQfjrX75f8Mwwz32f6xoYDq4u+PvYAGYnEZDOAW+pm1AZ1xJ7xMGEWO10bAFENr1ZNnVFGoau3mdDwAMFiPAK5MFGEcafq8FmIVH8WAqh1iGtJHTnP++jbwyZgoZ5d5yvOtmOaQGL4cWu5dn7vTkQETpkRopR+T2gsObV576hMMkgjj6b6qbVnbXs3nQXMXi/iwkEHAy5yjHAnB/ZX2hnvrO8wf3XZGvAEUc/6/XhpqBVu5WGv8cBZ/pxUoQiscqdlDfGF/llWa3Z31afE2IkTTauxprGhcWQDrJyP9Xd6B9v2XBR1/YdMWidYYKAUXj9MN+P54sl/3t7f2/y6p6zRw2WLZqshP4aTE8tVMulNmj51IvJpOMh4/G0hdWY//yvtIcRIjvYMolkT9hf1z7KamRpm0Fzd9X+rR23oabnn4Zppz1KVPfOgZkMVju9IKHpjWrUI9zCcVFaRJ53K1Lyim1zWpV7uHNPm7zxpdLRQ8EG2/TdeSNEkJn75mmdHqsEQ7FHusuba8Ka4zan6w44FzO2sZgYODfbgEOQlnKdKBhPTweCWGn8N+MhDB1nyFidpk+uc/vjyhD1Hs3DT/OJ3MAWdShqPiHSim0+jjG+iLjw/AUm9kYt61H/LpcTOnB9s4yDYBpYqKZKYRBjX8HfSbzN7NdvWpzL/pJwBOe+213/zWpabtGnBbE188sJrfRlC6Hdmd9+P9sZTdtbDw0gb2c8Hkssf/nT9xNXR0rqdZNiGicwZUSF8aCgpokSXdJtEmzall0rj91ASCqIOhwWe8vVaG/R+Dj8h6lEv1K4pDrwQdC+OYmHZivYSJfVf60pThTXwo//KZEGzOayMzB8jsYP+3vDSSC8WHeDhzZYDzHnQaCccI90Sh1dRY5/04tgKbhlMx2WPkkDU6zuVaEEbrWf0qDZbVBMaF7MfDOSteACWAfMHnLMEb+JhoY/NFA6oYtEgw3vyKdlwjZH2vfR4qKMgpoJKbz9PPu+U1HHxZMXY1Ui9jBOAwAvuGUlVZDCoWh4z3ZQKuHrxS/8L25tf3qXcBmaHNJgQjKRoBmeSAWoYMWk37NiMD1uPCN9xoWnspwwctxY3YpcbwCbx/kVRUEV9ohmw9Fld1OBjTK/KuxRbKbghtrNGeUg4n5bkBUMKJdNh/gk70D3C4oJSjfePTaZC46hhnnZG26jgE5LJJh4WyWiNBB1/1eLLEBxNmmHKsVFHaCRk62OrgDq9yICGxQHDouY6U3/S+KjcDwHu/D0fVmm8xFGzGTB9xXQxGEsoMIaZ2HwtKfViQOPf1YZ+57CvfyiNJ+97MRTk5rkMQInLFVgF1+skw9nYryrhJWN6sYBuOgAhKh+e4eCgzXztrsg9ZbGVvnF+VpZAqZm6RwsFJ07baTER05/7zYYfUzGb+DAgnRp7SoZUUZ4rMi0TIFgsmfELw9kKYcPUI6NXkOLE4xjUHnnh8w0XiwtNDo9LHFfIqbdD+ZLju0cD/vpzpubCVDYkdvuzkVCqHbnm+CRKwg1S0Sh6EHGVtUWLRWQRmidyXfZDYKincrr5dt7qyoljc8XdRZ8UzktNaxJppLZv4EXWKmmNR5VeRk/ZbKHbPvbD0W3x/IxYtcsJAZkJmEN8TFgKC2dmdt8Vx6B7J0cDY2t9nEn6js9B+8RIIKNEvZ8YbhJzAYNUcDMg/2dQTG2Yg65bNbao+V1Tq18GdiFF3TPQsLE9jSMolt4OZYaY8F5k8DiL2U3gthazspSlF9tQs2pmA7uGpkiX5+/nmI1/9liVT0cRQk6yX5j1hKk7RCTfqCMof9bULFF+PjibZvQ6lVgY5sYegBiuAi55X4hkAY87kS5AIcPTclGVgWzhUoAvr0/cRT32XLo6qJAGy/mkVYauVf0UWDNc5FzYsJ801OtDZOvYitE5W9fvbdKPB0rP76baoWnQQc/6C5nuIScI+5Qsjokdk1VCGbePLY9QuYeVV+8rZTI7deRAu+gZGUmV7Bpy7JDsnra4lpGH010pHIjJqy0ObsGedtWsU3G/+vNoNuKS9EBwieS2lvGtHSAYTCPjoR8N+Pk0agGv5+fo2bzsPDrY1zALwmSiIvWIV3gtoi3vLAqKOknRxaOv434uFL98w96D5oiCnJP1ODoCdKKKNNQbdipfQ8+7vWriMZ6IuZY/NkZrDPobUIzDEgbIxs7Y4YjVj31oBDhpr5AFn/a3WjUjrpnq6qEXm0jKhxbs9t+BgBT0JG9zlRiQD3vTkPF7CRFkfyxjyLC0iZaV5XBc3ocKvm/3fwEvsgqj2Xvl1XyMTCftgQMCDVWH54332jf4Cgg9oUlW0mpOWc/45dvgUVUhpKMWVEfWRta5YVBryVv0BZ2jpiahzbQIsYvhqmULIOHt1MFTC+cPwr1Pc0KZ4VCbFmKNIbXo+dphjOCsycZqvctM0ywTm33+vXSChWYl+xYFjA+CSHRiGBCqk4U3AsI5nr+Ag4C6HNbKS5o+PKfAu5rdGnrbX+Oo3ixnB+7zRVTEKbZrN0+CvG+RDefOyzZCkHkwaodzSvisP7nlqBkoLEtcZxsnqqrG9UkOEppaQuX3Eb/PkSwxeHb37PfA2FgIWwmHgEfxi0sxuWh2f4Ym5qmDK+Jqi9c7sZN8YGdR7cvp39c0yAYda6Vxku4p/1/Hy1W1edmN35oD5jL/Q0u1NM+VxOcMn//d7KS57mGuItBUxMacYrKULUYRenZS+wjUWu99C0hFCpmjMPhUHbdYYzn1Y6csgSnnu0YpkXL0bQhzF/n50qizMP9vNli1pm+DBQLn78PLLSZt1T9zliz4AC707ZWgWIUdFakO0Blb7K17mQajhcvVomGDpweP0XHOtWdbYbJ24QBXaqaq31+RWGv0UmkSgjnUwzLfM6TezLMPfx0CNa6uXH61msGHFrAFC/0gsOtOjPYmen2UTvgmoV1F5RuR2sW0+2nMrYOuMCHqz8jnxfdCr8iQcKvQMvTLwOSq9GtZREb0gNlQk1O3pxHcXWizTb/IxJRF9Lk/Jw1gsZqD7yrXxpZShGnNK5rG1NRTDk/bu3+7EzlkdSjZcVcBqlAVmWQQLtqG74iDpqTj1C56+7R6EQvN7l741pMfuH2rnO8GL8OuvJAUil0avqaTAtjytfbEJeuDOz9rNkXo2/++NsSUgD+YHTHS7s7qywKVZSB698ALhaEcDhyPXcpABjSZksLsfd9e2gpy6tvzpkkuas5S6euCkJ87rSvdQDNDJq2x7pO387jYzUJnC//ppa5AmG+di8hXlPxXZmdKH3C6bYznWK3PPDVaHFGrjo2KWZNbX6ZVWjaPvkA1SwzYQe+srsLUtENbG/fdlTGG2bNehQyl5bTqg9+f9gK0CzeeTEFUgN/UZ5zNEZUZovs3BrP2IcAvMtCruENshMeDu9fpUOZ//9bDzgQQXmFMwp6AK8cLMHOTqVLZBZ1c1VgWIGzD5dM9ubgClEiUOjHVSYgPwhlraJaeW4Pf46fbGXHE0XdjdGV5FNKZQ3F/bpy2uurdvX0rrcw/JCupxu4VeOzr/peUTIt5rELWArqZ+JYlzDy8s/9ROQXtXXneDi15ecLjsSk8r64PtqMTyyluOnKWSVKT5URp8TuaI+txOaj3G8qUoxlC02SiVTSsYPM+2gtorITKpi39ITQu7uFVqPUt+XKkKqp0s5psQaCpHdF9UBPODV0GVgBaKJIZRsxtOHLOogTYffGm+GiSlH6J1aEw6dSDy0EeXl3hvzpw81mHsb3fyyXddtrLs0FNT63+NXKuxAnCRW09NvcgXNuiNit8T+QJ6ZJLE3wDUgXaawyJKAqce5090bT8eShMCzxT4tpKYyPcgWKvnNsp1ZCnewwqQoIHgYcNtL63bZcdRsuzfRz17Xnd9Ynk1qaHWdTxQf37RfX9WzaC63nwVduOK+J0IP/La6kR8LrXX9OfCNpsuJeLioHVHZnp4W06Wj1xUxYKwdAYTWpWr17N6tmZh7+XHcr5Z1ab+Ijy55eLWD2vB3Q+T0oDazCI9ZCIeMvY//t2R5Lwtjn2ogSq/WAZ34owcH+gnP1gDoTr0TbBCkLPFpcMjWD3HqwGExe4k0OtNi/JFZLXz5KBpbVE25vTw+OW8jVah+dPLp3yv78H7fVXLCBzmri0mqh+EEWFU2SFhP19RFJiXGBSdzl8fz602IopEyEx7+7M5dYYus8xoc3sTR2uITylihuKniLzZlUXN4gNNvd5GdUZXn54nImKLnMOgomYIwFvGounVeySXbDuNUSqykY86aigIMBAFQPftiVC36hU+a3Yy0UeHStxCSqe4L+7LvgWGwgwaaKB6FG5z47rWiLb7cXxrI2j9S/XeQrIT8SyIVx2au3GjAGJQrjOXCQHJUjeWqClCcRZ/r0TcUqpLL3NJRGH7lQQ8uENN3XuG17kTE8j7a3aqVAzjtzBX2pZ6/zaha2htsvb1qo/4fQtHQAzVqOBEg6qQvhxlF8N1jNDwDWHvbN3n6Zf7pIS3CVtItz6XQwMgnQNJcLHrkdr7FBRQqHzhHKmFtWZBEqbfm2LnnQgju2nJMviRpgh2qPD5Cq8dRnyGRgLEXgYL2kvYjKHqY9pH8aaV2PFK6urPMobaJUBF4OG0UT6b3eaoZXkcK1c1EB1rlxUFhcrz3MZiBp9rvuARI+quhQG4rKITb9uPwdKCG1Umt7YVImXqY4MSbgvz2PKy7o7Y0fokm/HK4q/qUeo2NhXl5Pc4S02r0qsDX6K0LoZPVMW8BW3j0DftOxMWTOpKIDRAvUqK5n9p9JxQ/Hh9ayuZH9252qo/rJx19DGx+WjF3rqJS9q2Oj5UKhxh3udGZhmJFLOdhJSUWHZ30UIdvbu7OrUXFZlXKnQT1MZzpgxI311aVqGhQD6ZYAxX86Gcy1ObDVYJH5uQeDOKKgCUY3qedWbY9SUcESZxm7t0/MQ9PaxbwYMl5ZlZ4X337p/wUBuDHy+vAgSZi8hdCheeypw2bdVxKp4Zc7F2qz2WVTmZji/ov9kzEZGiNPaFQacD07um8xlwWu+123st5afuUzhzWsb0b5iaUG0T8trrpgiLvrCttNuhcxlTNHzTHLBkJzU6wCpZy4VqaunR3cgQFu/2zCWQ7gV7xqDp9G8qV8YFjPUmmP+8YUb0aoKKD0TLPPSaHeGPkfwSVXIeqm36Y65f9eAGvxOWMmRB5y4V2kLXCUG3AzHCViMcl/cnN5PcbBSidjoUVmPc249pbpIdkyJW1r+5NRkKr/woewcZyVF46V+dfjEbdYoI6MlQoFAXFikIvDQKRQcqmXSWWEjerWwng8/DfrIvXpw68Ddw9w4eS2q1TFrqwgFGFq5YgUupo+5Eoz0z5JBRpZxkmmZ0v1wPZqHTRNITV7qQ6zr9M0Wu+pxsSonacv2gW1+6WRGl4gM/ScGGHbv84uUuVGw4d657bps5WB88UJFVr18AlK6TZsfLhWVkTbcwCRzAHvv8t9z0KlafShOh16I2TYkFxZc6q04TBVV1XddLhJq1yK7iD2oHXHuvWaxswxMsMs0KxtMVZy4YrGk+EbLy3QCzmuvBg6uhRYz6QJnOaU23KFq8azxxmo/q2uVhDT4aocqX8Qr2Gnbj2a3k5r1dAVaxdK1IHVZwSa5brJ9lqeDFADDy6XSwoPfqE8k+VHDOT7aOHl0dW0zRMC/3Br52yZTt3+SEsqN0eANFJHqFVlbeCtIFQuoTxQ5nSKdjpAtub95QA0Kr8I/KBwCYcRVzWOT+psP4054rFyYMVVPCoWTlmRaXzYfL53XucWwVDHu52mODzQa/hUi4eEy0ceOuhmooRCMUG0I8zKMQ6w7l7fd2gzCP5gjixewlW2FDO1aJBP+7OXiVEwcETuokBvRAcGyhSG7VCFaECG//elnpAchGrWYEvZVJu4yPOWOIroSUsI5Ec7zmZIlDdxj1mlu6aGh9ZXOVJAjamcwczS8Ln7a39lD0u7HwljMsrYWgtoATw7lPm0EVB/bhjjMaMOWKRQwcMR6zHnUxPLjHkfC6t1203WOeu0ry9+neHjXiX+vFMVg8/FRD6W1qaNBHNAk4LQlq3/953S6HHoCsTorcTpv4mlgpuOfs1n6DVsNGYLS2UsUx9pVy1ZRxqqMzUJ9H6Umk2xfZn1gU27lZwfZEeAdxNNRnNkBgfiFmK1tuk+2hvVUTSvua8YfC5yj/fKyrtC8sktLzWc4mXPIaPhaDC7/46exjuVw1nZE+qr7JO6E2XzN4dv5znJzIZPzsI4CtL2PTiHK/PkkW3yOxZMBiWfhSoj4kYKZX2d100AGgZQyvqAAwXgBcsXKxGLKsn9z5yv5rFV4NkZvpjjX1eejC5uz8+3c/tydPnnWMsH18A8pOcwkj0S7Gl64Z5mhMFGDBmBH9yoUS4DucPNWYOmCScRLALgSBwgwRVeU3B89pxlKqP9wNWoNIkfhkZGSrpPAlYMnAPR4HOsA0JVFeTLmkIX+PXmuabSqBDGFkeF1kc3J3Id5lbbKmCwEPlGlOzm93GTYKPjLymM+G0WZQxCDeVDGTW4R3zC5i3v/y6/K0FrLfpzXV81nmP9qIFXvGZN8HJuqdCuQTksaA5QNibVDC4+MjvHcfPUKaS+hYAVhlDMniwTFTHsKP44FJdgknICUcixpiUCcH3tav+iXM/L/LUzY04fIHNrHbZE8lWNR34HNA6L7F1jUKR/LY9oUNj899PcZTDL8G921uJhi12Q03pjGd+/ndp8G1au2IVaLAE+hYTil6R+1v/pFfqgmdgIp0a37MR8UCTTsaDF2l5juuYlmHMpRbdjG+fQzvI8tdxqsaBWcV9PBOhZ0Njqyi3W01awjO93pb38kSuo7RO4jE/leHL/2r/cjwQm3wpVcrEDZzMtsJfn/aab3H85A7TIDQdowJ3DdZ2yYMT95ibFfzX54buLykIZmoMl0LTwM0/aXQ2Yk3GeKGSpCs4DZkXEbP8enSsoHDi4cgEhMNKiD8zlqN5WeGy7iu+veGSbVsyzp5QMRPnr3x47Ci3L9R+OL7R2HlJYMViv4YXVZfu2aFSW0uKioygDSmVj+mzb8/MIm7ljeTssUdxNJZVPTWqCuIk5UyDpiAJaO4nwadTRlCxS+/bJfroz0nBqG3OVBWCRD1UJy3CxVf3sMtyGypqkU0st1lpbJAPSyLn1CeTASANY30fw2kFaJ9MDJByOu5/SwNYqbuZKxyYsY7sHbXG/AlxYAVZ3OchDeDj3nKsZt4Yqs0Ad2cS/N4Xa//8Fh1apDsWRrVow+w4eGoQ1GjRtW5fjrD7BV8AY6aeGf1CTH/jyDI2AMuXW4zYlxUXnj0OTh89XyY2HTDD8pzIrd4qcdaiGH/ug0FnRte7PSKiIn64viQ71+WZcsEcWveSh8DnljfVrQQmHdiPRd5GV/r8cTSXa40DviLUHVfYuNdNUpcfKjsvKMACwKa7Lc36lBdxrVHq5jx+xG5HyJHvdLgJ18v2HaXcwh7CUP6/U6wf8ZE84LMhDBbDZjo8A0VzLPVvQYu/EQVXqIeDcgPiI7FT2PiL1UHYRwA7RcPoL1RjiQcUixpy9psLEAA3N0XL7+Mfv3Xi0hKJ33zEhulZIYHwEKxRL/dfxSTerNMpLeNivOTHegVSLp/SvQ7KxArDttWXB+Oqv6ZQWKGuYvUz8mJam0JJ3sONJ4mIyWRJ5+GppGo1yYmndqcny9zJmXgQ0pt/sEbbvcjxWtfCWUJjoOPJdOCrivw6ds/2CPnrGoIb6FKFLKxSfsvXyWRNr9vKlls8nzdDxx6pZraqfOSsUrxxWyzdn43zxG9duFFZaKRgbnkw2SVXN2wSMz7M2+8IlNkj3hfKYDRZCpjUXwg1QPaBGiHRMqwFPG7fBgCzM/D7V7faW1FklyLqfr34qshEKbzjrNvVp7rTAcr1uDhcfk7+X89p4rn6oxTm63THwBvN84HIqNVDgfM/zWvU047V0VXOxMKCAkV0npxzTfywK0d4t6w74kgdZ3wUtL8yTGzdVI5+sjtVSsFrVLu9vO3iOcal9mJvUptd5skzqpsxPTSppS+35DC0M300lYZMs5Yii9kxfLTc4dVRhGAlI3ApF0DFB436HjE3Vwv3TqGK8Vbt4ZOTOj3TsxXPb6Sh4s/g0moN5O0fO1ST14vuVJcqmTtLkymPfayyaNJdh72bEVngogaZ8K7GpM1DqsmODp8rdpXcVJ3ku8P4fXxw9CM5y3soFBnWrU/NVSrW9Bv+SyJa3b0ZfHslv//dmbRWKEPHTO5axbws6cpTGw7XpwtVz8q2wEuLfh4DVOBlzER6gbjwL23QykxJJt6ys9+aqX8yL5ob7EmfTzlbAtGdDurWAu5eGqerG3aVSqvaM+p3dAvTxTL6iNyyFXDhsmjmio5GKL++mmWr5h6cv65Md3z7krg/kziZOgOB3pBsSglOz0TGsHJCdlNMBPyBpbOI5OYHEqfO/n4YuFS0NO6FUS9j/v92twEx5T7TZHOFcUw8c2URhkn0wmvVF3W937rcQkkzmLseF/p2sloIyh60K1ffkcaw512vtG2POoGdNpBSsn/z6OG7zkfBq90On5adguhJhWKJcWz6wVr1ZHKsBn9PSYC8ENThN+nesn4KmMGXzWzbOmBFdHwxlzhLS3slicmUn6U0KDjfa15QyrZfPf58BhuHSRlvfypXgkbjo7o9qQ70DO5Pvedu0FFVgnoEWr+w8USxlL34d6FU3M3kyjZUKNR+qPBOoDVfae/wrqTGd6Pik+Txz554rQnELurrv13JJ4vcNUO5uloeRfUukMd8tMgRbXxaWAcTejgl2u7M0D1Y/P3fd7RAXiPx6jgj6Y2QdUOoM5anPzibrrL4ajHX3Kqjm3U1NnsinVouvWANFKngZaXg+2WZ33zKt4tr8oAB3lot5gf9eGa/otbwy97W9384eh2ExWV53Rb/oa6rPVzI4VHexG/CjWayPx1uEXJs5MNodmGh+6O7EwU5W+j/PvCyf6x2xz1ZCWlZ6BNe76KIMdH8MBa3tninKTLm1uD5Rpeuk945noRAxx63lZUBS/eNb7ltNH/Gl6jVe6gmCHVjFIGrr0qFMIoXpuysUzdKR9iIxEmdTCTlfnUpaochsvZaj+8bzYL6o+G9/3x1hzJTT/lzOZuzW4bi0jDTgWHB+1fOKWCE/8tsK43nCujAsfOTyYeVTZLIsOC9qw8onG4CD7JShNdlpOJLLib5aMPl0tnlJTnBFed/z7napOt5ed66+WhTv8p2xaTFMz04NG9XC9Gr7VmxAg8elGBgZro3dk8m4NMY+10KkgFeWQUpk09wedTzykKSRiys/jPFsZE19HVH/8EBKXFzS0dtbQJA/pyuYr1ajZr542v0o0BQ+ktdZzliYv+qJU99eXDYHXE4KZgeKkgd6ee4vlyvTPu/CoMFE1dXuOQSFE/f90pDnz34cgJ1CIVR5OhsuV/Y5yiVHJXxSrdCE71CwTZElOUTT7uMyX9SLR1eSgVV7Um2d0gyKVPOrWZlAxodZMAEUm/NlW39JlaX1H5nulIyePbkUV6Cqz6+uJ+j0O+iOxOhitBpwPbFQWlkoAP89ieXla84+DjCvjz43j0z/v51PLExvVVfZP9XrRR5+5R/8JdlclE0oTzQ3pj0iZv6+YzZLoixNts8azcV32u4SpmVZCcKo+76aGZHE7Hg2GzYtoJbnLPDf01cPEEG5g9fQrH70hfHVaQQbSuEtbjsVF6dfmhqmmMql2hlOsO8bj365Wl3mf52pFcmrcXhHgQDJNzuXNpJtVrBQb2w6LbxUnJRS+J6886/EyK7/NyPiOh6YBXzsWJ01qrcde3vSLi3iztFytvIOduZ51PbNtTWv8MXK7+2IXD+rj9E6iUVjlQBAnrawlaVdXYvKSPt+in8Z1nlcvcDhcmDy012hp470PCCB6spSFl0821VGpDF4A01iwNxrDeUo9Z/LM9Tr886fu/lqZJJ5sCblMZNU/wFCvBYyT0tP433BeKXw0nR4lPsDDiP6eLlxxrOrTV1Eu3pXzGZ50xKO2/VDXDpd5Lv6fYca8pPXJ6djlBxYGp5Hy0Si2EWl3GW76CD7Q/ZW+19q0j8uYEPvU38Cz5IvW76f8SJuzF8f6tLkdjWMpEuVEB0tnnccgbg6nc826sWIZspTilgy/f1+xiD4kni6adBTqI4KDXYqcry6FTd1dURXlcfxjFpY2xg9JK4yJ1/ptpQmm2uEInonk3zMYOVysuAJPjVtI63KvDQYKPMRwMCGcHpw8FpQxdX09+mE002AUV9YSiW0T910gVBWSsd930YVOPPiXc3C1cfNzc/uQh3PrtFwauEXm6OQumjMkxPnbJNCqvWoBIwIaHGxMEpa5GFnYetBeJ7e+zkTzEcimQmzULdElb3EVxWMFsDU16jnudNeTnNCl7/urP08J1g3j4eVqt9szxvVaXDUKJh6p5Ku1Sexx/Ew1qUmQ4mjPx4urr+oYA5+2gpB+aTRlEkrB5b9GUa0tvFxjIgka6rhOsjmZv7J1ev0Eykb+iibNcIFb1mVl8NK1zCWBOZkuqEh4Mccjdl4SyjEGefD+p+jGS+MkjdXTGN4u3Ig9R49rlHwrXK5j5eN0iFlgQLuE2FpSRZtL6/3LYupPlwHegVgW24vspa8avUzp6UTn6zOyYPjKYYMKUMZO5Uf29Nr0uiNZnvAPlA473nLOZoullrpoxYZi1enNflxUScGJwkHGGza7l1nChFSguD5jGK8Ez23MlR5ElBPvO+rkZFXlQ1zmFmcTpipGsSsB++ErWsNXu9SOPWwzHdbE9Aco3pr4JXRjdTCC/t4VvzixRIUtHqeTZ7OCLBOP5w8PSBFKoSEGW5koA8tKJStTKnsa9S67LgEF9JYXfnu3EbLyhedL1AgfyC4cvogB+e72Pr4pdBhhElwu6y6W3+ZZHnS/KK3z24DtDQcjlFVPk/3cv4IOQIXvMeABgJfm4sYp4fm9/m4CWs6Ph8255Miv3CaZmP+GgdkbeoOLdXRufKlljJZa12OR1b9vjyAIsrnBfRJHRnw7OlYj4QgsSyT+oTq88J7kf0qxmExwUglt9eCLefE7O7NeqbMu+PG2nPfMrzNpWvdSB0xOrPvic09my1a6jzNuVr7OStHlOG3T/99STShs9ezsl3+zk73KpmGGU0UXuVjcoealqueMV/q3m8PJaG6vXlmLk1cOOK9K6n9o9WgvhtETGYSf+05O7g+xmSSDEfbO3HyC2K9299P46K8WHmfZ/byDz7N5vKTbl4ee3AwGBA0fXlOrcL0RZ9AAkLy4L/rOaZUZsntCFz0jlg8HhDZUrhwVb5vF5DePk/QhRpn4srjCv/+6XlFivnAcPd8Rpsv2YVwOM/zJk5H9R99b2hSNxxImVjukBQabUJOOzBv5QLay/WqWfyHkmCClEdoi/fOHw77Qg7bXDNPos4M1cQR5/aG19qeCs757Y9webqF2/PprpQVRRHs71TGIThSIphe0XZSosQ29PR555kv88HomrVm5T6rojAwuGJdCr8xJkSKhTnk56ieaZsFZijEP7793ezSw10hsxVppD+lQWbXEgjNZXnDaWGSDYVYHFfmYZYRCiYYoZwHm2gBgSMnJDvWjouzVSM2EOvl4p3XXplNemzxJY9GEhS1QwDT7fDbVXA5GlKm954l5gZLbsPaKy0OCt/Y25S7RudjuK7QOUu3ZIS1248/n4UIHQ1/bubLTJLJKzWNKYEIDeUcuysaKnWZynKSdzn6HGHG9laVlqYGSuTmuCybdZJAuoeBqFHYoOwVqYHDpCtKVdWdcVuUA8yD7SbJrGbEX0ekUqBK6XCVTYt932xLu87aIqQl90ZNYMaac7EFk8thf8eMRdTp2rEOG6+LgSVvxqcHaYUM/hdm40WkaI9qI7uNKRMktpao74+DJIK46W6nQcvNDNKYQtbNuq10TBaKXKsGmxrBIupMrZqIK3l2ZMzlfMDsq0xMVnc5CGuuRqCJXBd+5Drm4Cz0E21oOS+mUExk/d32KFrCupi2p1sa4XK7/Xt1vB6BCPv7YdquQQtfiuEWz45EYtm5Six9CTZUn+UeCLHhGQSkRGxVmlLQacC0m7XyrYNja7caugKWZRW4fz31EwtroHR7uv9lPpnRgOmVoMoRdEdgFBuJsQcb3IQdnM0y5RD17wfwqNSmjdh1cjlWITAv+vBGPxBWTzr3nXQzFFrZrKxYutOzZCx17PYfUePaEja/SfoXaaQyFTAI77Kzm5Zlv70Ewv7tAxT2WpIIEofBNDyzaw0Odb8umhDlxoytqEsoxNwPyv2BEwprqdeZBe9/GYCItWHo4D9mVQBWT2S14ju1ODgxMzIPkcq1gCmrINpOPOi04DxsjmCxcHTthQmikgqv/0rbSIJpubvWQVSSg7zy9jW2y+zuh2yGFqakJlHm18zrvqdoAYG9vLiibGpPD5rlCHnQJbP7rfgRv888JvCyalm5q0vQdr86U0wNgfv7M8qi33uoomJEPljKoKm04BCE0XIXqX4Busx1YuDTJwzliDEvuJ9EDj4uC0yuOi1O49QDt9XRR7mi6YKlUZUGBfukfrm/2LOpoWJ5e30RBa7MrW7MwvcPVHq9daoSrFQ9uJS5AHUT6lbM8ObVtVVarpyR260yrVLDkVofT4fzVuVJ9S4kXY8dvpL6eHGKKpP6lMj82RoWonzNa4XgQJKZ0OkSTVTaZqt+V3YbC4B9LCzrriNbsYj6z/+B06lZDRd+AqVy2qMv3XJ54A8l1H8Etpey9OSsM2rMjW88Um2ufly4fgP1wNiRxATJA2vsgswMMdEPe/mb3LDJzGYfxSWIfmZb5CjIpVymJDVdEFfvKmo+6ZVWlQKrBI5ge/ldpJPB6a6nIoPyj9KKKQbffq0ctAZUuA9TNjS5WunTuGsxjoXBZ/xujwAlPv8zgMltM59jG4Q1uzlDm8WA/6+5QoSPTB5xNcr1h9HadutX2CF3p9zTYlZtZ3KdIkvu3GydURGrEMu8DZGhDfYgGh0moqHASfkmPqLHjfz7gTDPXNgL8aiV/nlwGVRolb8CZmL1MtfM+cZyf74/x9x4uxyf80nG0VsU/+IJmAe8997lDjQOLM0XLolxg5x71egVC/nIexroz7jC2LfdsB5Rx4JsqlLQ2+P3ZFO2oDlfHuAw1GEtVZEYtBmFAufapIxEOAcJ7PfXW7laSCNd0q23qlic23dIYrEBpxux5crY5WuX9itSmQiYds0GlREzGzBLyfUs/Zyr0Cz6hkVrHDogSzOljhRq7odsvJUmoUntl2EOpTa72RJYdbzMwB0Sskq31KiavWeXC20pF1nBfAysaxObeb+Rd2Ah5waaM9Pg9dHtPVvMRE2PP3Ul5z3MdI9CQSbjGwII3neAZmseyxfk1jk71GFmfd01E+pBTgodq9zITC+xfVPDqq8a3/jiIhiCmcNXWNK7TptztkRv3mePQBlVLO6X5cwKWdIDec5AlgGyFvy+O4bAoz4sm8bCRjk+JnX74/R3GQtqytEPLAHxCpLOR2lmIir+3GkdKBxOZ94UxaVuNa/Wrt3+PXgNsvmogN66rYO3+chqjDMazkS/NzdCFDMwJdzBZTR+ViEjaPHG53rUS9akkUq6gBFl8UJpILQUJKup91X2+eB45qqEsv2/zTRlJtezD2AnoSOhE9o1q/NmWygczi3M3YBLhRvMUXDqv6rP0KTDU4jXqI3XPxoRTkcdV98YpEoA8ZriqgeVWYzKkG2xEjT0SxQdot/GzWEtRN/++SSPQDQc+rZvrtCTTDEfU/JCPpLVQVNuOhkvfx3Mxg63MZrx6LUF/JRLJC850TAVfsSyw3C9VqjFoi/x+0SqGov5fyWG7sxti54YXyg6s2ERBRJvv0+CxJ1SHlLSshCOAvcgfijSlqD/uylQTH1z28x00mqzXFBAkQ6+mEYac15rW1P5KJnrAGu2LTbdPiS5c8Ac2kbTS72NJR/+2hArmArfngZKVdsXfgfyxWlOqttH6ZIXrNvayXm0Arp7iBwSst/+GYCQC/rSN3USeit3p3HcaoU2Y9ss7FP1lcUPJOmJdxOXokQTSF0+FJqDCH22bio37hZUXtIH6KBp2YmzVLHhCuVc+FJGPuJFOQ69xO1nwFFQjmzt8GT5bTJwH4QZfPewYqevBtkkO9q8dS6PZo/b+jC8sN4Yl3hY64yudwMa8c+MV2pg0dOnsPvyTqkjW7FNdAFWPTvOlh12/kjt/8w1LCvO54MB5Dja1VtzFkO6Bg/s+HWzm8jRiSyL3PRAcA5g/7mgFjaxWsktrSFSpQEzcKlWo226mdujcrkLlpJLhCp+tDTAEnJZPHvJdjVc2Tqu6iuMCLiTgdCwEGnw2HkjSDATA11m97OnYjIgFc8i+m25KR+YzPtHQuEcBkYHzKHV04+ttX910UiX2X1l5pLDBDoq7VX2388bxcTxfieu2dN/qjKXHPGIIAJ0Nt0HuAK+/9+8hASuU7Kl01xfX65sZh6q/droFvx+aCjIiOYJD6ATjtpK20TMtGY9MmTayYzLFij9y5kGhzhqe5AO/RuSw10LNIYZH7oxvztc8TlBvJoCamCDAZCJ9H7578Iw4TRx+NET+FOJzyWnFbMpjt2mn7Y6cFivF5a1PvYUcO/x4kncZd5Qa2w7B1lg0UqOGWVgLYamddtgf+Cwusmt/EFYyq31XCWTwttXWsIUMJk8SX5uxRuBwO6qp0e0Oa1cV5WkwGRd0YWrl2mNIlLMnIS1gWIuhsDCfOF/Eb35fAnKV3bdT7bX/VRLSei7Qr67PKDlhuQ72926HuLhBrzHcKsuoGWUdhqVtHT4dB7f8wiWUje/dBlZa6CAatxz8ubIGbIUhdN7qDhN8olQWMyQsUPum714BHJwJWqNmtH5X3ZHiop+2/Khpw2MWMrbIIf+gljenaAk3sAvHev7fSh/5HsulGfyU3dWL0SvdxYXTHmAT96cobDPxYhqvASB4mzpjRPplKLMEu9JpZ/fCNhnVfTPwxL2Rly8+Hk5ZyP+TH/k67q79Aywl/eqHZzc16wVKrM6XQ0DdfLUefNHixMh6PqRkUQutxKo5cgTWxXXmdNdjO7ZE1+8l7E56InYgT42bD89UDCRJ48nqPch0JXIqDaY1CvP6kNdWtSaXUYILoETsN8C2dNd8FCYQ4L6bHexi+ScMRV4a1oo1tDRY65nr2EV1xyJsq/uQIhknuiLMwWCO/6X9RgAMQI38Y3QPpAyqNz5ArO7QQGSkXm6pKVVa/TDuQMk9hFwblpPWypZPCXU3AsA3lLxALiYj3r7/kejpHqtTrFTaACWfz+z0x6LPmZHNp6CyJyorLCKFriaOYOr+t685uyU9xeXXqZgje2E6xZvQykVDwkKQj4CC2gvMwov28HsiAy4ZjyeMoNKP3u87UTM0tn+7woGco723aMSHv8z54aJdBpFhDoVuOIKS9BUvMekVeYC7JubUWv83I5FKh1n/AYzmakpX+GsMbEchq+dXpMcKlfgNVh3q38XTRFms6+X6rRKhGIbJMjXT+qEtWRRRKIFJcvsio9Bcvc5zJZG9kETmbfP8Z2blRAEsG10aEUwwns420vDpc7snqNmcS5UQtwSrKyuXLMxDF4dnhlzAguCa4ALYJJEh+jT3WKhNloLprtKvASWthxjy5i2eaWO9u6ZvpYEObz8PJVnmGmP6FVJl6chr3bAHRnQemPhsaxl9cfRCg9H8avfpmasZBXPto86JAOkV/mAGJqFqX8BC6lrYHjLVK1y/FMGmJONf3d+OA2uOtLv22qg8oefZWSMjOKk6Tr5Gsq2zeGuy+nCJ/f0aF72gQdnF91YJNRed6X30kRJPdwqd0vBJuDB45EdpDomv/PYSH4B2yYTs0ODn1RsFC3aPlRZonIili6FyyF+YgugBw5T2hz5lSf6gb9MosUVzYnro+Q0XA7bvxMEtgmP3WS1ZNllhzs7my371wTf2py6EH6TTgXlFLyuvBljl1j5RWKr9HMI7dXN1gh0pL2SYBqph4RovmCSvOc0X6wxptQjJDaGbfHZVLJBbzQDlwRV8va7WfS/kicMGvm34RFqd+DueN7/brucTihNIf9+Z+MIKPWsCRODmLKuH9rpIV9yBboPLVd9/TqVsZoL2d+SLddY7jbXndmU73zuEfcGJmsUHpuX9yWmBoBtmjFnB9vzQXhRdx6d/cWCX7jr+giXSv/kic4HYubG1uzF+T7TRq4QvNUucHmHm7JL0NGRCrkYHPfZyIK58cfMFlIi5vN2uw4FXelmLtHaDoV5x21yxgYKtkeHY5gAHPGzG0o0WZHtcTQqhWgTtjMHKwBQQfrJuohhm3bMHkAh/Bc8bZhI8fAsXeDhgRpj0m6PsW/Fmtv8vOJWDi/KcIGn03R8Kd3b1a9HcUjpNvNor3zcMKahdKawYM3nfTo3DR6WUueqBPIPmWSQQP+9PhwYcWsy9Q+LgpYPtUOogVUwst+gC1jgCxoghAlaazaQG8cmmtv799RhgtrA51o0zvonAQF2TUdFH84rlwi9v9IUutKvqT9aTmjuRK3Lkwzhpn1vG9Go73GSgEJMQG9kZ5fs9lQs9MpBazVqxe7XAakC8rbz6xHO0J3NvMsANhrZUUyORQkFsgXwMELlwDZRBohixkBBKXSSM7uHC3Tm/2VB5jkIildIJNy3FrMucafYok3hxFtgEm5tz4nWFLLbrY/zGSIuP+9KQIAqYiZqBY4LFSvGeVK9sLZkbtsZVxoMOQ590T/ur3ZWIFS5x41Z8I1xsl13CRYbuKu93grCsUB/YzSy6jbaMcuD97v/7U3ldMz5utWDRZLvjzsyvspT3Wv+pohaGSxmUkVEd84pNBSk/ym/dOLQilwX9FbxW8+IrMhDQ13ooMO3p/M9pL6pIbPRw/qcmfq27P/eNhZlFHozZ4wg5CZluIsWGnz3aeN8pRp5qvZzpNMzwg7QKTMV1x07xMqM7KFsOXgDracrsa9ERjPmnM3EN+Hx3keqwubv3IR9Ch39824Fw+Eq9fhM10seID+sITVfZEHcoMWZx4LCA0/Dmqf+IeVqCTt2ARczGi5Y7n14YfwR62USS5WBU+KL/Xh/mXRxDPzVDoY57i1X1Tvon41YhDrzvbxLHELmeRgeA+nYUXGTwyitoCZNz/k5zFpn+lTOez/3D9FajySvdla2LpkG3DpqcHkE+aNRojSOTiqbFeUo9eSVLFjs9urnzyG7RICcPchqz+KoIWDm/iA1fKbgqrcWhCPmYLa3/qOrzVTyM3Nx8XXXGXbzg48gW+6x0W4IoUADp8fkAUoPF7N8C9LaTKlLaCXXtgOelujdKnpZ39PBFdiAxypZUdhvwg6MJqbWmhmC6p6LtBPV2h/b13ucPB4i/65WgswD4Dw9Yq1Abd+63BokOLdZ3FEsQms705Rivm9vx9/T7V4M3rhXEH5r3CtliXpIO4hi/N7RlycG4XOsBBtCi0LBYfbBpw8R18Ly8dxf5cx1D6nv8Z7onnESfK9JEdeo5qhLsMObQyQnh7l+fk4XacB/RNCHKy/qJDfJKDk9ggjH02G6VWbDr5QxGh0PmtM2++NBsqcj5Ujn9y0h8k4Rg1ZQTPfWqReX0z+sDcKVHUgwV7bLXSO8+hF5PW2KlrDhpgTUsnNIRmoyE8guj+yB3820dWRjLkwa0t9066BUufPaNjc40WBMP/aHqwOwmFdqLFrNZ65mgNCV6iXBgQ2HwzVEXcLLF6fL5C1Bu/RJYWyqM/XSUlaM9MFe6V64hYe2cMkg6EhDpHWyJZdsd9YDXo3omO+RmFpR1U1XCqDgNRpO5C0b0MJfMV+aG+4T29KmOO2btu9txcJaTk6LpjFV46JixjA1/EH//CIM5N2R/evdaIDOjHq2MPL6apyJHM9W/z4Z9Oh8Op/W3QG/jhSh4CUH6KGAvi9hGgOtOubw4nN/uRlvDmjZd9GNGCZEXh5w4BBqjTB9bUUXI3B7axezohvlMh3rPK1dPIrt1bSyd6zUAjvdvJEzN0YHEewd/MYGmiXL1HtAmV07PaS2QOCbi91maVjHdigVCZLWbdMq1KsXWB3wXJYII0J9HR+qeI5W3lpTvI1cbDYNHeKfkqhZvbcm8Lh4KDf2hhssu8vVCsWUTw6owI1djJJO78vVH1F1M9LV+iKhYYY9RC1CxWydhnbeU2OyQZQvoCOk/21llIjoVu47IMEhRj96qwcbHnaOkVgUnsf7wJhOtKsZMVjo1LMlspM5pGf0/fK3I9kLztbue2KUEvPdqUiaDmaZbXHdxDcq0TgBwe7QBW5b5ed3iVeru1yPDN9xzpQ9DrjYA3eaoRrsUfKeIabmWveHE6txj675XHKaPH/8yj7KWv9uDA+7t91ccA8JjVWqQKddMRaOlreOOwt0VPIGKYdMpvZVPNjTmR/ZWb2Y1bZdDVFlo7prq7i5NSyH2NLTCBohzyUJmlL/ro6tdCsnq7/ofijLh9eFuDLmvdkKn2ISOzE5nnUqXBe8BySQADZ++I68lNU02n2zagwuUXtF1CVSR6G1+Y/CMMyYBrdWbbLcJJpQY/JxYztO62Qqfuco4cFvwfVKMCcMIsaXpK9FhSnM+JJTtJt+SE7N5ejVN9+FgwBAbWurW59ejYZsV1AoKSzcxU/Z4Tiy7/tpLc6am0S8Up/dXGtnzAiAIqFNayV8vAcsvkb9eCoIr7ov2Gf3QOo91u0HDvqSkATPfh9a21Sg3Ml5RsbY44ovlUapWIiNz1dwe2mpzaXjRK3G0rQ8qQxPU4qzYMvs6s5fRyn8ccEcliaAx5Iq38/hUEaHqJx1VhiGTHMbZ+TvDqZegi7XTc/b+Fz5huqqbql4G/7CGeswke1KvnmnyeEQavPIMLZ29KkBGkmhZ55V2MC7Y3BVXg0He9UP7l4Ag5I9cjYNzYafXQONxh/p5c2wSeKdF1uVBv2DRC2SE4OVZBCjbQEeGoCLl/9RdB7siXJbFAZUsJtmemImyUzaJJlJnZL5IvYuSlEUEOxJ7KA0gb9+c3+AyCl7rXfxwNl2PIp6TRag+uyPi/18Q7V6j/d0VT/SvVaVZQLzPWDLrHdYmQOjm1Cimn2yMChZPzr7og4r1HvYgzDO5BXojLdqTbpjKrD7SyidMXF+q0QznCMK8JSFXF7ZXZExA2TK4XLSRtUYLraLwBs8O4fmdF+g9v6+DfJoSAGbYuXL15vrzJsQd1/fKrGJjyowhxqAKuNPo7+BNBeg7KwnE4VhqeVTzMbz5Y1jXm1OkZ+rOFlg2yLQ900Bliv4w2vsejXWrnnK0e7aV1au9xYvsV8hT6K+xNPVFth4bLFWVV2MgIT3rug78EaKLFGIyVMXNR/osQX556xFR8f8NPoV6E0esbKcOhRxAC4wTc98q5O3Ram4r7y5MSYI3Vw/v3V6o1ErEvKHATIz1pleoyySKr2yXu+sy/he/7en3fXclxu1ZOQ4bil1Qs86XitNxnxQnbux+C5hJfZw/VZtOqrNDWoqqg1vf2pPxS8eb3oSL1YP1mzCh/jURHfTVkWD53gmtZtzUowL2lYdkQBQHx7GFw+XLyZVrXc9/+hSnQeXeIvuRCVul6WEUjQvdEDoBt2bTxrg4jNNIO6mXYDGQv96o8kewKApjTo2eD+y9KyvtLnZLJxbL1uxzWB0TBrUjxcdmHZ2s838/7t9laxNcKl2JXAk2NZ/vqdBMBk8J73mh2s2xqz6v/NP52opS3H7lxEOlFqu2TyyC1Gc74pymh+9z2zqdlSSw/SoMa/HfD/+XGVdlXD/4bpqxE/KTJgf7NZFNXEfhrMTEWDi37psOL+R6bfVyZ3jpfVZSJzNVh2As/umK7xdHYrhEXgfIfczpJgYfdcZ2rSNPspgxV1Anvp4wpSxzfrEdg1m8oY1BqZ97sSC9ppCBOlTFBklKRYUdvST1a3eDAlT7sCTiNj9XL1cR4qjZJ39V1zveJndKIRg2gTwVgwubpWdJ3Z/10KY6GWr0rAXcTZaAgemNnmO/PzU57LY2WnTbe0iW457GpdP6v5HQoq5z4GZY7BuJ5ut5cDfznBl75mcARdl8yGuzRp381IP5Et78PVgb0lr31e1BQxMP/QOiirR0MidQdJpJhze9icWUQFkzeqOfr3x6AhXWzHxamfWw7xTC9vbBaNItrMqIzpFt23vRIKtZe7WRqQnkgk+PDhtzf9/g6DbZhliDnWqEFOEl9jo+sNLJt6gUxmCl6/uTLrSu3tWA+vJmlS5viYRpDRYW4Y4GxPXHdf16+zCobYszyxnLwDRTDRWdzrNvxrVsDXWCr75BNRT9U9EROqNCuX8G7ZseKa9x4pi6jD1iXHJreK3I4qMoMvf551ue4UtULFyz9bagUkafiumaonYY8+bqBFOStash7sXt2rsojsBh+Iy7tU1qdFBokMDJNzOMAkVIQNf9mbTtaIk9esvZ9v/tJpofewiJELYrSqiRw0i3O7dl11zdaZPK9v7USp9P0pjHMz4wdN6SgD6lwWfswjbcfyt6girRuhmuiJ48GF05+q903srfzgPF431ffW8H6tUkGAQUCBPtY63c2opchi3DfFtSYZb27cZwyhdfDRSE37loftLldRIan9L+QABoNTVxMNpJ944LtzvepJDtO7iIGqQ1sxUNuzZQYKoYprN3a0elbjSCh2Tk5sxNoZQz7ssiS2Jv2xH/byK05npXKe/SWZpiNC3eyaXO8PmuwwU06D5gtl6qKbnuKz+oHhcAw28Ml160l+XrmUsZnP/pcLz7w2/WsDzem/pCLDnGyY4bNfPKhEgQ1XdFgT/tGtfPf1YzL79DPHWgV1e1iKYsTDULX1jn0ux9mrQGDqEu/TCRJePfzZOmpIvnTh5KhnKY905rCVjNbqorFC+uNjodPZLfG7kffWmuu329c2lE7W1SykbUY9xdwjRg42kMCxiYHoz6BZ7XMuRrM/QDSuCItxn7D/NlaNU6WJHi00pNNqso6oJ0L0LY2swkQ6l+rG7MBIu8jQdllb/3P4D4znHZP9blFoedAO9nXG0PIGNSgpCaw0G1pFmWU1xdd7hIKC95//ysqBXNqkWJz8PUkA9r0LTg8SB9RXFBcS155r2wFJ+jDmJzspa8GpoUDbx4lrkGxtCbqlIdSTx7iPdWD3QhchdmCdnKEh5U2oimHs5wKf8rPTpyC79rl6q7odVIczjq77fqjgvRXe/0vV2dY2rdD4t4dr49zaVuuI2ZTp4MjwcRvSBYO9jZf1HGqBmyF4mSVGNx/QgLulu+3ffPMRXzICjFamuqmtwsl4mCQYIDTej7o7GhU6N2jx9MhDh3uTy0P9fRl8s8S+buiYdjQeJlFmzO2LwPeZQPQRaZs8MfeH19wWoHd14CWx/CE1GPL5v9IQV7xwVvPzEPl5eZP/w2BuFWiUtbh/uD0s2/OPo+su3+kJU2vfnRkot6e+1qCZ0lMHk4O3LuNb7VKOvcDO89A3YJmA7293aH4d7evIBqLQi/+DP2ealXjQXdXofCmF03H0/2tYrjKfKptw9Nv/FZ7TzqL5+jy94XznVS8y4+fxj/kM43lEXXe7jtqXNl7YZrdjaXve2j0Lby8Ttrxg6OZ1qaAuRoE+nvnx36hJdZTNH2S5nXc9EcUG5H73uRYpvLO9WccsO+YC8CcYrfGaxIt4ouYUktbYMa/HuwfAJVHemlRefqUc6T4+zhXHXyHffLaZWtHqkek1+2OMlE57lupg7rROqeOw6fGkQRLO0ubqnSU9VTtaHs3a3gN28/wxV3psL5RzDfakfhXm7jsLnZ+AAqi2mUVqwl875ghGqWbnWYIZ718niTDCCJfsipjxUcHsEfvzrNhuK0W788SJ64irs8u2rXKtYJU/NY6VsTonm5fu8GfBUMB4Xj0OA5GxIjnkwMJf17/BAMiI1oMmTL+rPGk0qJH00TU4G0CJnguK3lauLxXQBd9Y8eVfrh8SHM40KXY+1WXU9livVe9x6k225vqCysNP5Hgj56Ggu03o9U2IFIk4BO3HEwWXmt5EfBRCVwZ3VfdFSvihUspsI3tsvcrwsqcenpihtmEyETkYH/gjzxP9Jo1WWG1fLyWnrfE5S/Hx/+8StdgZwxEZoagdaSBGyFp509KVbc8en4FAbHKVtwuaGM1XuxY9/vMzrUscW2SxTKSnEe+COVStEduqn5eOeZYzN5imFxKs+LdASRCx09EXN5JLgySofTwbKWnzUllujPe8P/UqwplopZ4/3atY+XqqJH+zKpd89lbvY8RWAHpB1jA6ZNXqRm0CfYt4vxYUWttRn1tmSpsge8t/5dV2eSswKLFPzq9bbkO1CZfjde047lYZYFgUb4bPY0OwTZQhgNei0KjI3zwc+5xZQBsm3Zb5JSPXT+sbnDx0Sezf9jLugSzXQ5t3W36ch26s17t0gOrtVDJEHZdou1f9RzgOVL6bUuybfazVmQ5HP2l8cvvJimRaDnkST2Py851GZgheGAOl+7q3dXWQeCYGqPhsuQdIp107ozfIayOPRtDq+jfXBQUwS48vRl8FxljI1MYNN0WjVB3oJj/jFdeye1XTTLKxCycKDZOFmGSi0W8YZCEmTNCbkjnSq5N0cz+RJ6fTQ+IuiWEN8zbQs6Z84SWTiM9bfnV8zX1RnZ5DOrSdN3PJMVLXEnPrUI4+6mExfy7MJFwLdA3bRNthc97vrlpDRmNX4js2bxk3DzWYzT//ppwTlEOK3j/MYkaELptWj47VIuKSnNpp4nc7e20tUeDM/jH8gp4e3e/hUn83TxFwNPy1zmMqbTaMlbuIg47cUlAhoRny43087K9zpf3//ulSC6Ryuwws61BWJOU/lOp2Jb+nL0dEhcfi13LJF98OSKpP7yH+3amc4ox+/dd+Uh8PF7lsrT+rj5QZwkRDsklb7DtnFBoA1Zu968L8bg4BRlFr3V2Mss/sGmBrYLo8qfheiDS0mWj9/Hy2ALWVWhmpXZ9DruloyoB8nI7K3Ii9nO/yUpYNWiLkIsqThkrc6SduoNKEqjvrT057FtfWZdgsDKEkYuWQvHBXr8ZHdA+be1SK7tzGtNgcvhT5BLhBkJ0S39e7yGqPT8F2uCtUBO9foVJhBrasuvXJuryI6ciFnoNOLlV+tCy3dmn4c33Th1kqsmswRvXFhXsXEy8hQ7rYP/TN7xfWSbXDN+tba9lGxTtnaqRMRJp51cbasA4ijiHgliK6ruJE8nkcFL2lYn8J48Xq7rNhaMezgdK/DwrG1xl5EMeftMO68f9uaLp0H61ml/P6TLX+S08Wfo3nBEiT1z03caL0mK9F+nYnmg+odGGyxzW565KixyvKqsvhoc+zt6x6YqJX6oSvHrBtqauxhAzRhpnXmLuV4s/XeWFkieNlJ1nBtvpI6mmv9yX789bjgGHzzkfFIa5d0EFMoctlc1sL6cs820URPhuMJ+X5L/eoEK47MFxglYwdhSYl7p4KwU2XrJQhL8KpwZZehHO7FoSh6/N93nxwv8m3ohiUUjx3n+2gTthTleXwF51hBjAXJgSZ4XGR6B3ooOg0/BOmczVGO9s6S/liuSCFQpWQzb/ZYGiXhCzSPGDeKFK8uwdXjL+las6IEKF+/7p2EoUyj1G5xi60pXHAZYx4lUbq9XMG2OsR01f/fkdtW7S0j+KLjP9gtxPZBAtnv5K4qT+9poR0brdWHpdF+a6oYqv27W7EcsV7p6bkb05xmtJwCw8tpkn1o/g7LU9PRuWuxXR5ze9kD1Fv8fexmmkpqhV6qkZ8TNl9doM1YLF7ZOu6FgVlp56mXs2WDrmzSwwB/kZeKiiiOlBuuQYw8lDakAUil0TPfamJL3K29Yx4+N7zNSLaEA1l3GjnN/gF6cPT/jzor8CgZr2OxPd90V+5bC7uxWsO7zmMpp9DMS045njiFikAE4Xlnq17YrS1aZLs5uyk9F94kOHLwy9TDk6+FSF2TntdPvuT7djRzez0irNWOiyDYRp2uTlaI22xxOWzHd2hN1TFAjhvzx8tfHqCPmdRtie/GvgiyenA489NV+4X2+30Kt/iINxFSsiuDKWjrPgTOjZx86FZXNod1/7lDKWWKJa41yJ3565+KWEQP7DTZZRFyjlYM6uJmd9KxxzDstrzo2LsyASWqsBKlnmdbhxyfcOWOWkI3Sqbf0x3Tffn7kEZqyYQbkq3ppq1ltnYXuI2ZHEiVcC40JVEvTBfEi83iBJVvYsGbnCDblIdHlvoMYeMiJC1HkdZohfmu+cC4nby1vPmCK9c3NNa2/etUs4NR8c9OjyodV7kxWwobi85sQwQTw470nnJGFjHLpTtdaNt2ffhvzE5LkWt/e7f+EnNzO7FuITyeXXp+fywUXVf2mvMhcC150UkcvkKuhlM93VjZoevhAyElvyngp2EIAQZq8HvxXtgHClW3LZqaT+bnfs3TEHOUevNLK5sZSVJ1nxZeDmIrhdte2BGn20+JfNgfmnnjMOL+uqekFrASvzqZmehJPDVpUb1kiZyR6+V9uReJFe/gSIwCQLU7n8DBnd2tJIRknMi0zZKTWbc2VLr2ndEztpLKTY1O9ceUn9aPai4H674r/j1lMyyXvCvXmCpSMeSOnULywdrBLNiwWou2XpArDvzlPS+53Su/z/Zzbckt7T74JsZl2avrcTU6ebcDAYT06T1WCe4ngeh/FSIO29kLXfn/wS3L/5yl9MzVYlrBCUjPUjRU29wQW5Ix2mh7jbVLw1tHw35k/7KJ5CA6ukEqppuIdj4MxtGMtI/MrR0OWMg9ytHVQF+5oPR6pzv6iWmOt0uhFa/N9MJoJzJL2Kc04BvjaK5sDwnPSElOb6Q42UiurjlO/Yh9od7bjT7zw6vl93ipPGtwJwukRjuT1TiNISi2kdWA5PJ42/4klZlW9f73jByVlmDbxKyuqGiYfCxgfaVTvYGXJe44NSqTpS/3LjAM22Hs0QElIdInENFBs54wIVsqFd3Sqgqzk2Zj+S/FRdttFa61y2IIK1ef7TAJnoRxosiV/ds7wikbyFDmzM5DJaYWqBT49NKGxwz9o6zFoPyvaBbwdby9BA+O9cMo4IG4Wkq09wpId69Q+dTID3zdG/oTaLaq/aDXnJOBjiV1ksupGKveFs9JTqpG6JV9hhue9zmmUzm76e4HbO396I/tshQOxFyOj91EOcZGwKEjLpGdTxZ1zPVCecpHq8v7zFErF1kAVgRrq9KRls21UJFM7nQ3c3DLhdsyO3CijQAh7sO0vQd//brd4ppz2PaDdPqfSktHk+LsbTL0OruKYrUyF60qcx0MFo0YjXsOrzYDy1apc/jgkxi/LCYtpYpOo8bp5CnhcnTsUEnv7RkEMV6E7ff7IRMHo5Xor5JhYwPwpjRKJsOT/TxJbUAuGWzG1g0y7rtdLLN18jWnP4npciR+97OyoD8NarYjE4bQmV/qj826HFXrrg7AVU5q+eq7Y9V54VyUxXT2ojzDd9bC5RK9tBMEaR5XvjcHSLXytlFChPrTsFJZxi68cGDOzRy885hNIceOIqjq45Gm546Xuwe193w//BDuePm0pcOQ48fLFiQDOZOB7srsmKUqvr0SMC9/0nZtvWBxeJz+CY0wnAhQ9hYAn3l7qYWkR0JEnKwG7blK+DA8BlLTa82ZkKfTXtZGKXtGA5grJnYXOgy918oKuk8kmK43GgX7YWonfDh92aqnMrXowqJVLjpExFS40yc2Dm3LdL60iJCiw4EkGg1T8kY1lnsu26O0SEn134teeXkzQNPt5rfLY1Cz6RWziPSQ5po9TRyGIZAXRmfS5l4gSjkap55SaLLJLsGoQfivjl3WbinrcnSBKbCoSu+Hk65V3/s2hOoMtAS2qXc42UL6WVtp6flzoG4xLTTjInMVdFVM22pIx17YiQSXV51JAnEmL9w9q8yZrPxx8OXP6ddF2rLsB1WwXGQQ3ssUO6Y9zv8ofEPDYQUKlxeCSgb88oJ2XD/Y9/0dqYffkpxr9A+jIuQQ53ChRzQ923g4PCUfPoN6ABiD3RpkuwH/DN8P3x2hY3ACFsrZcqOT12xx7yNwHBMBR4T8EdZyhq3SnFMt9vTWyvQO1doXZL5I3HTG7Wy8WhLb4fVP0ix3SksoyNnta6FR5KOr+0M2KaKbDtDrAdjRQceHJ+3T4na3+sX6rvebLMhcxwoyxYn+LrmDh/adE3sr3fR6FSOxEu7v1iSlHEhHMNI+4vrRRccpRJZ125SZL1Hol/dIyqis9vLYckJIA+QtmM+BG6W7LN7jRUusHsutZTatTGeM7Z/DAWSIJCpnAnpKegZ42wDz6oF3iEjXWC8aDo3syR4b8GHlJboMFeA5S0UYMW/LqRU7xFpvu4N6cgn/lHyVviEQ1arideTWGAA34Y2gEXCBmOT2fzNc6EGPn0jeYmC5ga281emCNqvBT3ark/WuGbuJygOiAxkukqY36W6i4pumlLec+bni/JfsqZHJwI1Bless+UDG3Z2S53vbc7+T8mDYTZioFhzvtiVHJ5JoDeZ+H5K8XM+69WUY/S87qld4PPjPSFFtov5AMM3BA1YYyLvJ0Sw7s7tcyXXFnlbuu0s4dZ4RlyXkct/p95gNDUp74XLsWn1vt4FOVBgnoP63jS0US6R+Nrym5wcI0lhrbftiX1p43ck/0PywcQNVuhpMmEl2b+3TlvtOyTU+w8qfo5L8MbBu//0IeQmalrC1Mpt77m6W0tRgJ79hnc5/7NW60WnH2evJuQ23zOH9jV8nZ58MLIBPq3mRvfb1ib0KyFK7ZWDieNNtVZY4UblK9qZcFiaTLaRrUWAxGyvSSVj7wZW6gjDuauj02vO1Vg/V66ONbEjpk8yynzTOth9broYE7+yQHFbKRHxs1VGX4QJyhv3J1O2GVUB4FF67GWWhSrLw+xjw73GebPF7gsu95F16Cm+g0/TkgK5DuLn7XnzKonMPQHpko3GTNZV3pUOUPIVKzHYmKHmIUbu2mONk8aSZNaKkr2Yo9sNnCgDQhG4u1MIUo7MPO6P6DOIqlqF3/OSSyWjfaQDffdd+ws3W2hfUU1nEnn43X7O8b/bJifN+90DOQeFDX4vqADBQi9Rkn7X3EKnMcg4+0u3CobjN5CrFnuPkCZPwO3uuJtuncrvPrNFENlwGBXprriXMuxkYJzpYYXeOci3Z80AmUvaS45NIJ0Pm/69cs1DNHW73KidRsCl8pTQg5SBfzv+jQzEPfQLLCPLcIelcflIqhpRTrrKPhsq22k8mFFs7msuIbU7eqL9rsUVa8G3DzSaVTOPvrbqNzkzuppdoUYX47Xu7wq2Bqb6Dej/feVYmwBj6uN+up5hCXl+y0sARZlCMwCujmMqgf7Mxh+/VB6btpj9+9WXZxREG+w6D0ePOh9rEcwS3ncOAje15a1aHv/Gz8JAb87MD+8ZlU1KZDuoGL0Lx1pY6hJq7h3qZ69ozp4kyWoVDdx/1UuXuLdcR7R43su8lBV5yBhdJq8xS9FuX87d5nhDs+yQllnYc7k+vWzUMnQI3fMi3vKW1bK5Lb0u4SlJRUvN1C3vdIyJoyASa6hxjc859BhTs7ajt75EjDPeiVM4D4kKhRXQiSmNnMYidfsBCQazWG6TlmPd/DuZtSH7YPDw0kxEtk1onXeI/H1FLLVCDRoerM2r5znY6CagzA9IrE8sl232HrwjWatqynhPIPrnfLQFvlgEtDnyw8V1yq7IL9pmTuZOosXqsfhvahQVFcKv33oK0A8JjW4eAeTQN7w8eOCee0Ha+MnBX8MmZfsWy/da1yHL3HbqpIIR/v5tBTBEASvFWELhsFLp1gLib9BD8gtAYVSh7jpzA+6wl7N+Trt73KoV/wF1QSXfYOVIdi3qar5a5kAiVarZKAw+9HGVEzvT4HPHYwVU7nQ/XMcPo29e9q3tLVEFGNxPSQN0e76TZ9ZdPEcbZsqIvj1GgUuEGMVMQRtTH9L7xI6dau4uQP+xAhQsL4ATL5n7eIDk24dnf2pPwjcM5atFNFUmW96dX2crMEaGDb/YQuPKmtz3VF7/nNxWj6U+PmJiSMzrTi45iYRhpQx/Pag1yxPQStBywtyWtLCcOqN++SZzvRqEdU2HOuJqMDkootVM4YCrLrRjcEZz7ESVN5gV8Gbt1XYbUCNtz21YQV/dWH3FBE9nxM+yjtZfNZpakepEU1bUGO6koyc3Qv8vxIr8P54G5aRUmdQ6WI12Azpe2Ako/RbXmmWxYyZ3jfZx/f7n/4544O/FecJN1+G8EdLcmI0ApOA/yyHwUmxLaWnVWMH3lZX0RLdn9iMp39sXff+MVDveB8rxDN3mOXTfWM6OWnqZxxNbMpw0Qbbi/ZbfUsDYQ4BeE1wsFmqEO6yzRpktsc53NV5qpZFAT91xbg3kzBp1sG3sEZ7x1tp/Ds2hFk9sRw0EvtpGDVCU+SEKN3TshLhZfNnGqtdhwaMaHU96ev5RKCbwQ3qzuz3wHZT3ys/+9G0mIdWnLMwcoxBBS7rh7pXnjzgyZ6N2ZOFHPHGmpYPna/r7j38jbmlNdpEg1fWEZx6WY6Pl293eZVrpx7RNikPCX+Nun4EbBXqJ6PF230MgsfvBZGtoblVq8xRyVP8vdQrzaQb+sF4wCEqsZyUqrrB5EHorlA0GLGomNxTKfesq+icBB4G5PKczCEdRDTHXbCf/Gbs/qO1IfAgFvzR8Lu+A7BQ7XKSBwGLfZioff6k463L6xJ/oxb0cZxuCuogbVNb+DGUFoJP1Eo4mPkNJwZLuZy28g/onpO1DGOBRXy+n8O3cI6XsVZyr3zlYPVWE92x1WDylXfNFkX7aC2TcOW/ysqmX+zCd7973JMCc0iWFODtD4XD0lS+L7Z4adJePE1iNUgVjevF9pItbrTKCYSrfTgWen1tlO3Vnpf2Bo2VdCgJQdOvixATx4rVYVBndC8fKKllN2krmCXuUPChXYifDmZ5m3oi7S70rBmfWAAYxd4yT1q+SFIiXrzXqTm4ae4B5Z+xvK5YkCwJpA9ifoggSHz+X49bnJBOP6vJAoPEaFZLMxLCez5H0NSzfgaNm8nNBI5uk9b9rAg4x6myemiY/jaw4eXehLXpuYJNQiqSJ+gDocmZpHnmBisOXBWirgRh7FN5atP2/W0MB+aWxPtWZsRKZeidOgTxz0O0f25mDtxEUdStLBbdOaheX9+K+fYqxIaHOcbYFRbZt54dbnRmjxPkIm3nj5debpVD32fa/m6Ze0RMBhj4PfIPehWZQb06ZaCjxuO4lO5SCARKDGaf29augVynuyzmBh6dcP0gUT3qEYHHqnozcbOfsCjStTIJmRUAp8ZERn033uvgxRGTWZwSph8IDNZ2sWB07K3ZYzW9Izdhg0HgwsnN2qvusCt3Lr3NMrxly8/x2aBI6jzmgDyksJfgiRwQrx1guNNjCvw5lPWc5uF9nVr0utIRfHHpI0em4nsE5UxOmUceu7TUVq4UXqtpJTMzaX4Ix2D/6qr9nEtJJ5vYjLEXBm9tJw/XO5mwDriRgkBnfsH0t883DphOrhp+LZUaG/nB/4y4tKItCwMDoH60R/EppvBHNzFakDcaW8zBeLRJNevfcvLajOpZ6uTN3xk5hEul6FaO+jVxOH6tNmYv0ENjHGZc7bGcbpPLWcFQ6K2dYr6fqP5TtdrWLJxQ6w5fRZi7bQo0+TWhe7p3LpuVb5pSAUkEyHTwpMte6yGSW1OUvYG6Ef2J/lhGm6uOfw3sR4aC2WkIK4lBcURAhlzd2ejUOOKZHpDfzj1GR1UK7zy043fQtpygxxljVd8D0/XIDv4Vrlp6MEEgeWBWZ9XZrZRh/X71OB2sw8xByVpitfBCb1LJH3b07fIcnjvxiVY9jkY5CtDzUqPbKnKlWgh+xVfzcaDvzVIxyWlO8/oAcQlpbx6A/eNrdPGTxUpQSy3fSDZJB+w/QIInMJ66aWc1RM+EW1SnynZ7P9TggM0vbX550FkpdhbwN7f4Nj7Q1KJ9HF2psVt+H4dxuYT0wb7ucdo7L8xkjQu6a0xKadnf5NkTa8SuwtqyMrmMKsmn3jdukHYZ/b9uNn83D62GCAZl1ISC0doZ3JssrXQuvhNuN1kT4OIP1fT/WZBvTMAuKdkGfQmK0gWGx/VD4CiWyxVNKYGw4B3WvePkQvT/98VRhn12HzbLEf2JcopvR0y4jsyVj5lHfBWnh8MU0Upo9Zvk1Ij1tuywWDYc15raeayKRcg8fFUbLQ89R+9Ad6W9e9UVQdOAaqJqWev7s9oi6ZB7c3mBWxHeZK80SrgxwMyXwZ8jvs5YozOuoYGwRln6uBwtmyIgsg+8fBiQkYTEfbNgekJ4TT2Z5p7NG6vtNj7GnwA3doS2C/6Ubfq7bq7fpAKP4c9qejaNe24JtYrq7V3qtAdy+Byx92txgB0ZtfgRdW1dXEDS1C5S1DK+uVISMlkzfp3BuKcGzwKKaD4pVAKtYO9Of7pZf28fbjLdxWeVU98rZVGS85ckUvmYW2aMEXbs6s55WMpcg3LvAPN/PK0EZFXmKl5kdSiFdj9vj8PLt1iLGdfucqWm1Ywc1yHyq9uBF9iJSXB96jmBC4ia/JrXECE7nPfPjM1OFmJEZYMbB0WK5Xw+8+anc/PPO1seAztTx4HY/oamtCg/0qvEzJW3p1JpBxGHk7nAEa4HYXQt+Wb52ekStEZ/GbKCiRGsNvj2e475jAgbECHekObm1t0K9Kiwuf+XWZ9KLx1b8JAnEhUdGqEzqWDK2O7t89NNzOnlLsXuEU92sO8Cp3sT2dMkzl6aLtAl6MjyEKW1qgO7n5QHb9rTBFPszsez4HmlFhiUS++wEIZO05Tyu6dFcavsHCwBxLFdk6FpYOKXQYTLRB5+obhme4L+ngckQYn/a2JcSIux5X09TleMjO/xWOI03e4GLbUz7kP0nLws7EuW5d9PdEAPRTjcOBjY7uVpkkFt6xF/xwdkxg8YYDWcSXBE/U5tN75MTWT8VQOBikDnsZwxnd4VBtotkg9pbwdRnZvDGFuZSf0XWH6T48kT5sdd1+jYS06E9QG0BeneZy+au3HD1IwZGmr+0tlf+zUh8Aur7yEBo4W4C2Vu50/Q/YVK0LYHGxix/Ptw48Urw9cES7zeKxTB1SS+9184B2CIjwcF+X/Wde1zCO7NYEzUH096ICPGMT18iw9P64kFJths1vPDgzTCIRPQ4tBrapwIZNR7T9hj3Jv9m3cG7Ro8hqT8GHXjzaZm/OAaMMIclf9rIzsEGD/AD1Cb1RPgjmcjoVjxuZaXwwWFOAln1S8v/9JTg7sVYKmu12KW6OZmK4f7s2x7Nwh5PC8ZwLyfHopa/UVdWn4qmUF2WZ+U3spZVT0QAjNR6xapFLbnMEvCkUfKLu+Zj1FFBG68Dv3+fSfFAG7y6A2jiIm/U4vssZG7M7lwsFUKCKnoaVGvUF8NsbHvbpHAKJRNzxgLV74GtFRiP4oJrnFz9VrK4SiQz0Fe0B2P6kqWji68XDby8n60hmhyNMprlmVMNdIIKiV+OVT63NRfntLOdYW2NyGPXxkN16ISKD2CKCUenGFU6Z0bF+IIRwCLxLgep0dvA1u4wVAyPX0la7/HNxSLasxPy2wsaaBGzFg2N9UisAd/TZ59QNZx8OdliyGgtnthNZvfhP4TSa6345j5cNG261/n/8prTv/TkD67OlNSvgcGEmf2FGnIh40q/Klr23nKevxF2hPKx2NLRSIEd52xKG31x89ONkfy6nKjhgfXDEH7/uavP28M1PAyf9VPpwrpe4hEY/+IMskxn03+/lisETHrDcE4HvwR6ZQUjydtPmqG7KmI2r+TqjDuKXrhp8c1d8/wUsGf99Gl1KDmo7NGdLUA3IfivEy98YF54bq20zOfNFdvV+SLKq/uTcKyGs9wPtX1zs7OA9U/DkTmDIvJKmUojP4ZbBZtK+EAiyMfqubrKkw8cLE3vm3H3sZywd3spYu401golEWUekxNdcb5Q+4Dr94Mk2hm1uvGGNbvPo769XOdyMpH648mj3zPA5qgxmqrz30k3U6DIRGV3JVTjgLqaxCXNR9lz0nRKSiCDaIUwxb74B6B0Ze44SYw+KKUzJfoYzGDuf1lDJs7nxeDbRG3DMtV1OF/4l5F2WTibxsC/IbvQW5bCg3SeYnMvFoHHEhIv/nYm81AFebhm28yhYUr9E4zwcs3NfUu4aa++5ZaMrfA3kRE+ycA99e2uVOTUV5BX6UXjrBKXGqNpKvBYfWtlYtFS7luWa+74vTNjOwe65ZEID7SBwJIKdI1yS98ZxuYVWsMyX/a2UHj50xbrlelqesSn0aN/z6o3UzI9/P/I2/T4yVg66Gg8Wq2fhu7GvbJpWRiuzjbu0F1eFUP5s2+OE0/11V02I30CNvBzn69GUCL7j8CTUzFgXb7UQeEHWUvEoVDz2abDUhS8DKCZdcx4mpamxTn0CW4E5V4W6GjZxcNKzp1iLVlbuvmsTO+FYHgJNB+nhnAshl2z4q5NLYWd/qNgj9N6cC83cy/fdhHj9qLe8DbveffxRSsUfp4A9pUlKjPDe4mULUDGl9fCRW7B5ESyrEVvB/2Whii159xmatL6LMtL3OWZKwfvk2az6CbFUAayYneXkyKyiON2foV4a6rjtBEj6YcSFJeAZ09nrvuQuG4N0VH2/mvkWwpbHU490n1Z2DqYRguxf4E2auKOEQwYFa5wKnQpfJa4GCbvrH3uydZgGaywOFvaONEurhz2YOG86baw5UHY7QNqGfNx2PcxMa/s73UjqdCylFQwPfP5/dEbPH23xN5tNqe0WjJjh2IgdkIHBYmos4VPy/y2reGc26y6cXTxNKKqnufcEqLAFMtVgFzO3udnq1FlosF3hI8MuEqmHaR6rsdB/QKAhco3w2mZPjCOssiTwQ9nWmLDLVGcWmvZie+DUjoWsDBtpv+7tG66mMEM829bEeJl9JFNVNFmLDVYogsbig16yTNHdsb2Q4rCda48LSoX5KrsFTEh/CfIOoocoAezkb97WUqIgLhUb//8G0lUdSDY348bXQJfOMjuUo3pwgms6Cw7j4zj7EvmrRBYAEt/x2JnsZolCBfJl/zJg9ew8nnIztdb/z4Kz6A5pMRYL/t3h2SKT8NgKgyzmyqFzhV3dOVuaWIOOQkK6tX84bI/Ln7Px1gx6wYNsr9V4/zUPF3KkyCR7tp/xUE+P6R7hdmew3HG2BW4ZQQtSyLHJ5hp8X5nFvEpd8Z4rExXXSv8Z1hsC2StZt8OOv0Qy9hoCxvxGbzXwRM9jpf5BphyNUA/zWnaxuNk+eDBLRcUKXXI9crXYl7eRKFo7wJ4q0IZrAU6z1aYXHhwGhGgibM99/fWJRQC5etxtJU9aH8gHMaUlNn473DXFN5E0z96GCO5ovQMqDTheQScfcfcPLygxdpkfsyMHy4bJwj6NmdSiV1eO3mGUuWEXLr7zVDx6cSerdDuwXTOnPw5Ro52cwPYdsmBtCYUGFB9tV2JDDzlrfkzhM+rrf1naNHu/znMLI2gj4zoaQxqtIZW9S+Qc7SlR6NGJteuFayJ19v3HNzrAJD/+4bmWcdRmyh9CojQ0Y8dvd0uaYujMV9Oe6JeM935fR/7zHqRUoEI+ENrbYAtbgHFsxuOEfj6/V0YmU48cpTXFdTkEF9XK44W2KXRLydQxRUdtp8Z7nWvLTe2APq887/XfYIv9UWaU+pbTM7H4/dgfpPBWQ1jPkUB2yOGwJPUmiFRhVkZ328NWkvs4o+u+0iZWM+aQz2XMp+ACqoD3NCW5eSOutUr4pDVdn5WieVOJRX3v4Ahzigtsh3/e3PaNIs1YInc55+2k+dF7q8VmC0YuOJ9VpkW3tGq4PvKemCbGt56eDGQOsI3Krz08Pma4ZdeqaUV2EHsV/mw7S2av9VeDgdmnaAMWfvJnZ1c3kM+Y5U8uS37GFTtoUOWJZpy61toNYdBJX1YXQPoKZ5iGGDg880/6ye7SZ+vYCi9t1HqfaZ3p+/znKCgtKw4QpWxzBQ2kgIgs+zceIKOmxfm1LWOX28CnxoeVKCro3Kd6yXBHibG2zFIpPEhcm1U9L/8CKc3WXfygm0npOD/rtdlddI5W7sW6UqehvvVbr0ejd2Fy3uC+5f8gKMTxJdu90TjAw7OqTk2ny4RcSp2RzvBCLn53x4WPLb2hTTw3h69qRav9v7OhXStl+EGM0SLJ5kD0T0vREqu86VetXs1y4L4Y/g7eHvpKkKSTNxsOOnDDKQCbzzewkbIfLleGtKTzD4RISq+UYSrsqQ8yRDnfFI93unzTyXCLeDzfDQxGrjQcQiNl2Xou8Q50k80KvLrpvQngaVYSf69CTuOBMzmYlubR5QQa+s1ly8dmjlom5HK4ak0D/7Et/b+jRsnuhSPwoIz5GK1rFRro8FVbC45ks9T82lzkwKeC27XM/AxA5/0uE83+u8onbff2CaPExNZcF17U4x0VzZHo908MUw7rngTDrqw9f6ERBzjdffC9DQAij7zTTaFeE7+hW1KGVLjek1EZyYjYl5dTLPUvMH1P8mrRo5Zhe+6jziSnVoKl8P76fsoEmPrfZjdvuMKVCQ49/ZgHCFEWHNlNIxU+6TXGbbhCjg5M5sPLOGccsOOp4fI0hJYnkbj3RdvxEgTWvTyRxU8MG1v0zOwNe9CPwNeB0Zbed26XQmV8PcHqDfrx9Q+iqt76R9bPCXiQViQ2iRYwZf4cuAlTe03940bm2c0bS50L4uXrjjGc8jGxeKWZUqmmLDI2B7zo24MasBNpNkrWjxkQA1esRc9aONeVl4rNMMRfx2298BMlTF0oNugO7VfdG6KosCjJzPPVs+XUEWn/8xyeTUxtCm9805C6ByxEPxSiuggK3yxXI9JhYf1br+HVnK3FZCq+XNtCDNqICbuOAi9T0bK9azKy0WpjqndAp3J4eoVC1fGX/gCMwPuv+z5ZMOeiZ3Wh08ftqtShe0gy3PkZeGo01bhZPWPmZe41nZEW5A8PhLxpHMz+OTOyvRBfn1aL7d5yIJZm3nG/FSf5Z4n3ek77ah9BNr6rvrRRduM3EMeUzkQvhpoUiwj4MXWTmnckQw14LPn9a22IWB+hm//8EUGyaaG7UaL5s4bml7nyQB3Irx5A8SDJzt73So+c/lf5HKC0uXX6BX/TJ+RKCQSgYFmyKsIMaEbEnwP/XLTXprFVuaPnrgclapK8eYJDDSEeVb//vyfXkwEQWl0m6db8pGkPDVhu2npctmnrwqO6IPHh76Ez0hoYQqBqExMZmiv3+eRsub04sc4Ut0XJUV+za6eCOm9rkG63A/qI+KKRAjGTSze5lGB+7iSe7Zwz50pWyjelY52suMq8KYiph1/StSBCWPXOb31MvocHWtPe0YaRuT11+S6KXRI9eh+BaYiK1Hri1dXcroUBLXP+PUKwB1yNH83oOHHgPbe+tk07EOZ/ITF8dpgmuxM7fN68wYG4Lv3ZURn2uolrXV4xuhnjAD1X65ZXJ/eas0UaNL1tpkfuwGDZXE6B7K9YEnfBg2lDmC3zppdMrUf8gGRpLjrH117TbFwUz26+BVNTRJk/nneYyo2kEF3JRLja3uY61vYvFNDYSLd433/FUZJarNpdR4Qw3m78wPIx41vZM45Ikd4yNTn4QILOijF/O/vUGvK7bGGi9iN/4ylHHIz95nimJ07NgfTOss1Jz+H2P23Tcm3ePmETnT5iyRrfcL/s3Q4jg6zw59dMj1AzTlK8thYTxX+kNpqaUDW2/bOO9VFJvy0bHLByqSymkzp8f9al/GRS6vILlifrnVNgZSDWrIzpxoBYYEt/m0CfoLKN5EtGS/+zmo9/ugGRywysQrfifTGvO5YuaYVjLtlZXEs+WY9idzsHqqOrlLYdUF9+EPq9KFOW7YPaafpOCrelxsD/oasDcCrYU/zTn7Oz4VQD3TdHjUXpKv9e2pMMMaDg7hS8r6am6RxEWaQBuoD6UjxdU14sXtfmXqDJTG+kaTIp6uPAgeNuevUhZmb18XlCtqq4N9xpK6drG2fOaedj4nnSxZYdsKZyTSKT7yRcP4oAc4POuD9pjDurz7I97jlzEyAcnzbxVNbFzoZ9EgsCNft2q3M639sdsg575Q6OVgbpSZgXM/Dmxokq26p9PyQzfobQJ2xEbk63tdPZdTe1kMSPu2kvEb4el5u6sfoS+B1u7VLs8ZHSbDPTvhSpiJKy17gBIbPP6dM3uBkDqVevqbQN+/5fK9uRlObWrZEdnJiFWHsXL3QHkafGyttHner2y9NcR9mcWtg0HnTrwUVTj+F/zmIzA6754m/5HjnvqqXU7oG73agrm3KiVwrWrFqvj/1F4KLBEJPv5yY3e4krStDBVRfj2anuGy/0GXRQko2FdVyxNFG6/O875J51S6Xi7YSsnE4XgtWF8GWxdubzDnhLi3VPuKoRvq722c9FsauqybfinU0fU2XPin2JXVq0uWH9tICDRjoOBx9mlhB+YrBmG368h6zlQgEWj0eTqt1eIWkD7TLzPSHofxpI8WJ7dNfrgaZjUJHFxcNlQE1BXaH1uZHwqFsaTFszpTWPd+4+b0PWKbFrq3FGFHTp8yj+79EDoVOiiz49TObqjVLRB0C8yWXm+/RXNk8SRoFgpm2xnK4gEGX/7rhmSzJd/3GHx4wHQ5bi00+3j9U8umvb01VcrZ0szXIvXsnVdJ86YAdjNaofOR9nFn9gnDfnbTboGPoy8sfr/CxJHCuhJvDVmX7jHaFt4JcemtQqG+sOFS2DBBcf6ON8rHe2/twPwzy//Ouw92Z3RNaE3E/fH/71Deat47rne7H7fKHJDqWoTpDwaE+rQ4ke9zeTo8BrdgtfRu8Lzl9lsJaYHD7YUeCexofFZUwQop8DuxAyYHLR/2vq0emrQVbh+YbvOOhi8mXw9ZqMdjEhNXsvxSHViuJbYCVMEip7lKgM/ZSg2iY0nD/ZcdVxj/L6tXbIVGiUZ+2x5ShpYlJlEKnU2VhlZi+gh+8N0p55DugQuiR67jywV22/wGOhqJQc1jz2zBwXm1qxjf6cD6voRqmckGtfNrutDxTw8JBHx5uXnb5j3k6aXa77pPqrTCgi9j0NE9GowRJS2E/iOV/EkLZAfIehWAG1HGNHr0gV5qfihgzi1VhtA5wN+EbJHVZiR/cPwY8Qp2bSVdKgv9ScQKvT6UQklnDX04TWENr3LNS0nnwYoFHH/u8wgEACHdpqVYHrQQBvTu2JfYgLZP62+L1EP71eYuyap49PCPPn6nJ7yP3/q1XEK9IYpzvaOaGJdcEXP8XoNqLZX4XL3rq9ypB4yvYn5Mr1ci148xyQNWd7pEWlXAXPYLiv3Bqyi4px7UEqzgczi9FYxu395XMlWsbTV7pe/5Z3FvvjiFFmAXy0lwZR+56wPaVabCBXTxFC8PVCK6WsbeDpBJrVQjJv26hLiQRXWq0/vqUXXp5BGjJQ5vKm/uHx7v+nYeQwMr37wcfmoYHoZXBlwnIalT7P8fygS1Y+qnkLYBmzI5ZXXh49LpCZY0TDMKlaTj40USYervnLXwuLz+KuPQldZe6r+aDeTsipWBSjQPHCdkmMlsQZ2CGmUyUSe3h73p847MngXpqHuGcxJdfal4jjzLnXU7W1zUatXu4A4AEVEZT99lb+atvZKAnN392yVzlLeVty8vjUbq85sKhydath6n181IpFJHPci8HFh6a/1DKSX6OhRRpYlOGs/kgFdsPxupkI2kSr8D3vnmzbvM1mt3vi3nyvKyU19NyqW4tXthznGl774eYwBDnYXSKcII9BzIAkdjQdiT99gURNL1OCsxFWFucUCEbp1TJ8FKkO7L0TR1zcOfAVdje8fNVBOC7qGM+HJGX/98IccYE+0fE4sFttV6ijjcrVFadJz46JLdyoz4shcz3z09pKeQWo6pZp434+bTSBlcfmn3T8s46xy9akezUbWe+YDCfGylFlvT2QxtbYSddklJzTjY8w4Tz+EwnHHNUvG71e9GhpUSlVmapR7Pzja2FZi3fZZx5JAgHOrCatQswB/o+99/5uG8nevEEwi8myco5WtpIVLFtuMydRzCQYQBBgAClGRCID//qSGtvd35l27+x0c/ed9/RvPvLnXF1UFZ566qpQpZYCRZ/L6gbJTNW2WZQgNPcCu+Cr1W6G0WVnaojQ2RxVg4r+4uri3EL7KfqrHYHZDYMz6xlqrvVlXB+943N+faq8HVCeq/fqc62Y08VdgOojJfn+1G+VTFx6BIqtxnOgn4m9554aq5GF9y2zsbA+fBkbld1r+8UgAj/VT7cDXmmv5c7684UmXyejjgcfqSpK1+bViYMFlOu6cxdz8kxny7zunX9Q/YjLYCsUcN8QbPn3Xactd6ngHdyNcDfyDu6qeNVqfrfgxFM50PkhJOXSvnwAbuj1oZLyxbsS1KFFr9tskDT4Fzsb9hFw1Oz04gU0/PgRKSM7iM4eE1PIYHOgw5YaKiMaBzNZFgDMSeTFTR5Fjjar+kDIvZh3dEXnsyedqLdSBsV96V3ZWuIcJHIiQzx5v5igg8DZ4bqc7vReaP3llt9wpA1rMUwoMCv1N2g518sKivTOgGdERza3Cj7NhD99yiIyk7kBeaF2q0saF0QCapbMM4O5ktUUa0U+5sxFwJmWM4DbZgM/2l4IfnR9lfNojzHWu0mkgYAfsUlrG2o45PfsZVtU/NqaEMv4xsM8z5DYCAKTFbB1nbXDT2l/Obtg3HEcVukwXtP2n55r+Uz8KUfXthN7ujKZeLFFZ3sA8BaO9yPP5aCrCMGETotnmuXQ52yffQES/bQ+d5df0xSmJIcuzyFFvXuG5WLTTUuaeOYxrFCggX3aZ6s94jyr+PQr15bjj9FUUldYfiPhwh3fMw9G9QFcMySR2Vwnyr2s3QdIMbk3Qzxp2bu34/naBFUQ256j5bchz1QR8sWGrcHOzPuWSlbNWSgVKr2ke+UnMjo23g4BphB66zO66VsaK7p/5K0M440TKbxmjQD+6Fwo1EzpLZ0wz+99ctlmMCxKXpqFYEAnQnAVGwV5zj3Dna9yUj3fPa8+u1M7OWozQKxbNm80yGwYua4kuZ4hiEqQz1aAQOYrlHerJX9hZU4fIpD1aLsrjFJ2ZS+K8Otg5D6DZq4gmzdb4uLxgbbguotZZa5RPo1qEnpC9tloe+HulxkqwLRA0NHadO6P+lneu2r2e7fmB6srM9HWqPIxG2RLh2KeCpeBh3FqZqVjG+fMwTMVh3+jOGoNfbF0Zz86J9l55mMjh0F53RPwpD5aFYtKJyjb6Z0/bzpy0JlsgjIOeCgVPeUZQwDwHauhDOB65jZNmPlcbTk75uXy+zUCd83as73VjKnMv+iz2hsGgOtN8GI9VbbronAjy+y+2aojFiYkZfMDnWuOgAsmdJh0Nrid509rDqzY9O+6PYA9E+6aQ4xl3mItwvWn4hsLAg+vxfTqCu5rkiXamd8BnUYKTqxo/oaE2N2Wltv5eXW+iMW86HMB1AJ3DBMb+rKF517SgLwTM16vWHk3Q/q76awl6OtczGmtOGyIJvUrLTq3M/QZulifNjNuh2LIVqxChTlGG0A+X+nKYdyUP9gcoauU8ovNUIW3HfnE2jPla/FBMLP2BJAGT3gZI7X6fg5pg6m3S19PALLCBx8f9EAi3lo0QhLnrMWED56LSnrLS/YukhWFsPEzaRpeON1mqoVqiL5eZDeJ2wKqqCEdbK7EKk9l31KeFif3d4uRw5HV463r8x+PyoCQ1uZ3CQtkT6FIoRfLrYvSLHFe4nzN4st11YeWbql2VgJdy2ZW47kg8CHOjmKn+Rm1ocHFGqidxE/Fari2hpqKir5n9Gk5tra9fPg1gUNuZDZFB00ZzENWEAoXfdBXbmchaQzB3aJ37NGzqhIpiHNHD7wl4yg0ww4yI5jQUqKn769UW+J5KeaJiav6EoCnlOcdwuEHOhnj9kMxRzP0dY6q+/eRnLHbIxNuJb5Qnhc5d3M8UWFrPv6NDfGw+M17y0OSX6X4jWIal+xu1J2oUWRDebYKO2vVpiEd3q5WfCO9BzLkPLrT2mdBlODqzXs9trLP8MaoowXwy8AcG1sQSLJdNzRpzGPXFXOiuP35023JI0KlXUjcpK+rEUN5hOlUoXU/d1zX4NiovEs0auJ7eyRcKu0Y3rHhdMpWOZ3FsezbGPaM+0vweMjeDq0+rCUi7Apb1r1szVSNtsbpzal1rujI6hbiLA8agF5jq7JZi3v4eOyogak6WjtJplPkfNcrq+KlS9i2YHZNl90W0vxd6GnTg6s1LV5wuC5YhlNH/kt3swk7wxXdytOG8WKLVU1mw9P8oBwwV3R4DA8NhazvNvym3subdZU8RQ2wYzgfboS/JM6UAZLFkPN9O1N2CLFEiDL04FoDSDvH03xhq+hqxRyur5mZSLO9dLv/xTZWtKLzhkaL8X7FVM+HQsYCeBVerbdR0c0YRzJmyaSim7Q0Z9Ev5sMeXRN06RpMtDx8LpjJZrMKbthX11EcDEKznoLR46AiAk3PuHZmrLQgCb8cVALeA6kvVkur7BCU03PvuypmL24YPCbzzPbbbFJj9j4vWYh6CkPv44Gkck5JNXaVITI1+aZ/x5O1zFZpt1sv5wGgV0fx/UXjxkDU1n36D3iNs1fDKrtaYxF/9Sx7X+lXV0PDu7SmodtDJyTaUkfLK1W2uK53XcCb5lNa44f61XQItO97UsUlq24r64TLbPbNKLLZLMR/2X+XicAV2Qv5EfxNIQkH5aq63IxdZtfA6GgT7h5SVI6NDLqtbnDONvMuBQ3TuWTRKImwPgm7K3wiUF37IlmeltoBK37Cl5tkyhHmNvSOt7uPsuzI6Vbf8paEHc5TWmMV0G8AUWfKn6qkR24Il/V5ax5qjzrp59uxbtRD6PENwoNxn8NoAlbNmS51Kqytx7f8qZB+vUe48r0BWprJn51uRVhTo/x2lkDQa71VmjfD1dBayDBz4o7UfFb+yofjPbtMgELhi/3MTAO1J2m2oLVX8llK1VqMsSaVoaVwVR3RCvduPETDM6wVqXjPPm0cOHFSsyVSWAN/LIf5wOYqumxiL/u32AzniTSSamnryZoPR+ikOW3XP3tRSXf8AW9x6/gIcZdKRXSl+IGKFfogaS4esmImlarIre4GMG6NTNFno5ed8KruvtVhND1S1fHYZdK6OWfKIsUlG1tTXckIUajll1YMUDVQYr1vcMydQ3uMUAaLwXUCguxewRfLr70FS17dIQwhFe50Tdx+YUIYenKUgny7hSf75LYvulWei89USsgm57cgGbkdqUAlA2mfP1mw6Jic/+kGg+Udc8QfGevaqBm8jGT4gUyhT2/4vkPbJkRuxXZlZuSlOlwquhYHJThatTfX/Xq3AdfOsYPGUohLFa8b6TUSKdAiUck68F07jrTyFx9wlHFkM4bqyI17OhV79LqppZ63Sts5dev58VnlkurjwrvNTg2jNrKfFzfm9aWnQsyzZF/QIwtVTzKwHn9bNbg9heeHZ48HelONsOgqDGdLLp9TtxqCYhmqmCwki3AITK7Z9QarzlethJ4fknDkjSWXGj4WoWSvvLWyaDNFlqRYMcn4A7HnEOjhMx2tNtjW8Qh6yAsETYCPVodAMhT9aZsluLGKMj2G4UY9dl/Y7Y3/g+xtUyzLv8L0/qP9/wEcdRpksrcL1n/AHycwN4FJjvhSwIjx6GgMJvAOPLdlao8j881/wPX/JA3x/zxn7einMJL42QOy9O9GHr05/8xaQwxFPs1yIyDfH8MCtrIMrkU7eXxJ3x/DGprLGRbh9Diy1W6dRCYmkQMHlMvEjtOQVOCsNBspjyMXt0eTyNI/5SxP0lBHuN40GOd8/PKbNNqTNLLSkuv4Yvyz0G9y5tLjB+SOUovFcX7kIPWb1ng3iawJQjbdG8NCO9AIhdLZ8QPGjiaRxeY+RfqYa94mj+pvL62OBOUdp/EOK/hmDXGmNzJmGziYR8dpyHgEn/MkoXHkmCS531jlzwI50j8dLYPgYJyGIBQFfyACjZuuKEPeQDHpZ1kxbyXMBt2X8QMy2G/aWR63M5VpBJdgYJyGh+LHD8g5LsrRXGrcGg+/6RSrt8T0JEfVWzS+FXYHll87RZREt1u3OX5APzP6ETnl9+uNw/EDMtfDSdOFLF7QjI1bQ8Ey566vR+O2p4KXHwN+b9bLMwMj0zBtZsDxGpoUlFLpo6CV6xepeFqmbzade+OfZUcfd0eg54Bp8zkywQnDjLVqC1apIYbuUxlSO1Qk2lB//LTEKwJT4x6cipA5lEkIlZXhKErus7sbGl2jO9cUVeBn2xJRb+1fGgyyMsLJT5ckox3r4ko1IALrnvh6fjYc5eFg8cOoaibO8vnCCDREDBvZ/MgfvL9MyezliG80CJk1BBu39vdulnlONS47aWN+RozjXvp0Tsc4SkFz4eMpDnrSXCkx4Ed1ptc8Uk5qct0A1xb8uhT/2OlLAe+R8Xw/BjBV5PiaLsOPjkrVbWppqKmQZ7d5iWwY2kcc0mQRpAilZNslf0srSVA8vUcJfQroOCCqxbPt9LF0Nax19DK6i3NsG5FJ2Zjct+7JS0pC1FsLsNWbYWYybqRZyHVT1yWjpPBKo5vRay3rbJ7kudTVL06nBnizufv7MiGN21kejBpUIIwCrGmAFR2l3gWZqYad6dTIFsh9tW/0RwxH3J41vZ6DBkpKjQZJldTd7n17pDC+zjaIkaKTUVpc4+rUah3/zM1+SmIMu8HL9XYdQ+l25kiEOoIOZXsraq8mX/YHFDEyx9ceYF4zSV8u/F1DMlAuxNMNE1WSHeX36Hg8a8JRRCBKENMjwKZjU69LQ14Z/yUnsLks32c2alUmgDYXE9syxtQx+WDkU9XbvoJqdOqTXemzo2zgwwdTy/tY8xgTCaImDsndsdtUaG8Iv9Q5CqVcbjweJcuF1Qopo85rztxbbxV11wsaIXl0OVe2BAJ+7s5kUNSbBAY2gl9PeJnkJV87ki2k4W2BYYIUY661R/fsNiqzXii6XxJY647YdbPY2ZZqeWE5qn6+zRq1QzLOlNJpWu6Vz8RdWYp6lYgxkiPo+cWYJVe/eeDvFNKYJd580Pk25ja7ckvb1GSTEa7u8hyYKfqzJqRc0sdqRVlns7n0lZdChLm1g0HAXo00vUkY1OqGg6cbPJKlyOEKUApZNisSrM8d2R6PPRbDjHyVNCJgEhoqUYdCUGH6Lvup+UzLYT5XYJ+TetnFzGQd9wd7Uh4w5L7ukbh0UW6beARp6EzE/fNKB/VkINyJhKQXx+IcjrRPLi5OZwoJd/d0r9Xl9al4SyMStaHmsFZ2uKpY0XE2xRfo3GSHzaZ8/la4Awy1qulk1i27U7UEIjdjxKCVvAIgNFYU6+AckXomZwoU6guen8zrrC/jZ/tk622GDlV2FM1kjUyk94XWtRSLF9feiMBzx0Z6KrR4avj4eaiJ4MrRBzYvHTI8FUpDtHusbInTydiobZyTo768LQEU7E6/W6vTjIBml6JFTHMSEjNImQZi0zAZG7DgrW2dSS1W2+t1wGbuaHP7nepNC8j6wSCnX0IoXQn2FrFO9cq7U2exYGhw2SFq7XtVCfLs3bEFZMkgQ0dvSAo5IoaEhNUpqi7sP+33rE2Czp2NauTweigzOe0wMuMY/4yK3j3UGPSqLnIvkAn1RuQLx0l35B6Cy7OpIoTcWzWKrO8c3pzTpDmV37ShhHCY5urNhoMZPdm3xV1UonRk6V2tr1LWOln0p04f160q1aBG6yaa5s4N1toWZC5hW/Yr7N0Q0oXWuKieNnN7SYJD3Tdbpk9S1QzavljiAm8pp2vrBVMv+SIeDc49aYTmoJlgMejabqu5GeHx49e1DtkzSr+cGkqF/Gq53uT1YgXtr1t2o/looLJqFgxcfSEONZjOlv1xIdMqBJO71xWvMVqOYAgAJXxPuUeu1E20G4XOm5CQS+dGdhNRyIZ318NistSJgWYtZOB5GWsFc7kX6oPz07IlEuB7GVMAf16CUxiiP3Ac3Gh0aJ12HQt5Rlcvk0NODkls7Gs2Vu0XeqboXd3Xs2/lOV8hdeg017MpQOOTn2OBas4TNYTsZZZCgXvn5Xy54yksO9d7avg9VMZC7seTx40RVHbzj+8xebDXRJMriWf6eaE5nzD3xAKN9VyA3i1f963WTiW5ryiEj1M2tvYqBGL2RHDFk265G5Xt0UUFYA3u9i7hdbCbpBtlMWhOZpL0aoq9zQTVwpa3r1d7+epwi8hX72rDWh0NzxFr8uhaYUozBb3jy3EcchiLe+lYt3nZcPJledQICuBC+0OlvCVZJFcV4AlnCe3mgEXnzbuqz8xje5ekDnChlUKPBlFM8u/E5n2ZWpUbbGcFH6Ijl4gcd3hp20s0sJF6t10dcVlU5gL8qAEHYzu9XUyEJHy4DaMj7UbrA/XozrEdGP+sSXx6i9LEPd0zyM8yNQqPwNHtcDy5j9Y/sJixrWvPWPRJ28XNcZfC0s2t+Ryut8myNGTSldGa2WmzNqsVOdhY5Jp9+itR4+nm5YPLQVJcjVy/Jgj0MJ32BxCYdJYMh9I16qaZl85nM6nw97IokzO7v2x+0epySvf1kpSYHSLJDbiRS4YyFW0Wpyq+lv/yJdCLWYeJRlgCnRd7cZ/WMT7N9jz1xQQ9HhtcCoZhZ2p/PgFwpOz0ixp/xwg6lrz+ZWZLGBWpwMkui9b3S11viUoPFbz8lbSVyyqDtY9U1qC+G0gjjN6btX9+oZla65MzI7P7OE9E0wQXhFWAupWdpeTYrMgBbQTFtHLOe/PweeVpaygZwvYCW7ZWK+6Etuo2V9wm7DPoKgbrrc/5NYLcc5da0UYyIOj7RrJsvDinRN0WVJDjnliN51vXzytsjslTy8s6oyOc5ROiCZ5dvHCyrdVyypLe8qL3dl2rTYNusKDmiZL0YmrQygKl5xC9+8nS0W07dqwDQGcyLmeLhpzN7COwhMxSG9J+OmNSglxFdBlEnJupz3nV4NbSjBqRqfWGK6+Eau8RkShSppWqYAKXQHcPh42b56S3T5gHcjrn3klvLUb1DsAXNXpA6lZSNV+Tdqbh4HoC8HncjYD/wOAAI5fdYa2KLBm+gEl3ImBe1ae8jejorQdS+vrBfPmmdtrNCwERXRrhjd5J1WGC/Cc3e6f/99ZWPk4de/6qrRDTecdrK/0fwH4V9Gfi48hLHdLr9q8vjv2z9RAR6NwrLLZUg3sLHMOzDMH0epxPXg3qyuM0/Eq1Oh8y+sb+2VIshzLxhXFkocZMIot297d1ijz6NWfx1zRmfqQh/fqArv8by9LBK+xyO8HOGNZtoBPYuUubjV/GMNb4FaaQSWSSZ+cr5XHk2a/K12e/wU9/2jXAzXX9TH8cWcSHPyI3Um6P2zLLCxRIg4+uU7oZDAajiyzB5oKd2JqpP47M3+kusGg2P44cYkn4qwRDdP1mBlgevyuR7uMZgXqOSN7LMnUkI4pvSis9t0JmShcc62N2ebXdabi2tpnffcAvL7vZDsaQCRNT+H+7ov8zsDSBBSYdglJjOMClxvBAJ2e/rQd/A5erDE3vOB8exmOcoj+mfrPuNmHf14Nk+0dkH5Z5UufHAbT6wySNt7hLv9kfp4Ghp8xsFc6MIy8oVU/srWW8oidzj+vCM5RmfXcfFbrnGonjtSbF4jKrT+w2BUimejaCY/un8Wo2wB4aHm1dRTdDr+/78pn98dqq7RW4QVObqZ1A6Yk+H5XZxmJkcck6aQ3XP7fG6urr8n8pBi5trW6BcZVsyhcvS5sbG5VJ01H/3HT/A15fs0vvpGKk0Hm0H37pGcG623Ff05fPsrqhZqQCYg5dbH9a9Za8a62CkGnFbyRx5Onk1nT7DKtJK/drRQN2grSbLRNjNA554GnF265XNP6hUxSoq/6cRprmImcnjoBoWnGdpIkNgE76arwhHUBraW51tUZmmXAcT2PiRVse5xxNv3Z3fSMbX9tcia4urpZFCAjEoC95u+AN5L2DOCMUeveESNTlg0f7RjXrnqmCp2kvOd98EYt9d8rIacf53fjzVtm9lW0FU0ze4TLSG3fzeoO0hcJkAjQWhvdBil/vlctOE+sohdGuB0WiawCl6z5K8Tau7QdmXFWMyQU+HbN5bYdBiAHToN0vzUdypyduMWR8l8oo4mFbmfJ4dq0y5u/jufLT8Rx5GUfe2/z8r+OZU1H+X8fzBhn/H+N5jxS/jecmyF58G8+Ez/freGbjUFYMrH+2B6mbHq16hzLiiYv7LwdDEWOY6Ec9KxA7tICwxP7VpmlQUyg2qzfVah80qQaWEnop5liAUwxQp/EG8KQYlKyNgRBu++pwL5H3Fsv2fKsavJcdwYJu1cSowEJ5N6iJwy32osHr2V8ULWj0XKdP15aMSrX+uF8t1lwI7A4zJbaFEbPd+w0PSLS1K7dkfmv3dZgC8955cCoVq1oDNOINw+1Q9VYQWqIhk90O+oggGAlsYyUWOZUEgpuifJ2NYanKa9/nQXkMj0A18W0e/A38Uh9HNu0lAh4w8Gmb0zFb3+t1mnTk+h/1utfIN0ugaGuP07i/HE3SQKu1b/W6LvQU9aYy48huofsciwEBev8XxfEyqjT0PnOdY+6wtF3FEFdDwPa4+1DCggG5vTrh090pCWtt9DawYUlYmlzAd0UEnbdk3KGQXmfrxVdhD3sJhSRLZxxrZ/bs4yVLKntpXfEqWFW+u60GeRdj5V8az0I9bjyS7yC2QUTQtZpRUh5TQv570xHjpttDW8SF1kfi/0Y7X4/bmZrjn0KR/BgustuvM+wExo1457bnEP6NTnmZRNZdU9/n7torfDkZ/FIPDRbFhvt/392SZxy5KcfcXlOJ3ZcyveoE3h/D0vVQlXjcuflvjI3qJHJGMy6tnI9hD/cKQ6/wxEJ0xcu+xcPVvP/GqJvkLF1DY28R6m0ThtFreXYynl2Lw6ZBQX+5/DfG8/4kclk1Wo3QGPYoyAQWX2F5DI/qN3i1MLqJ/xuDv0FO0oj/0I1PE3hSFx11sUsD12o3/o3X6uMkspsBq6n8GHbvvMKxV3hSule1Vss5C24m/vfv4C4yqZnfmD9+/EfN/Jxoc/u0hAuIvVkPOu56d12uUQ0t3Opjo5fdOICNApX31s8ASvpnTt/5rPiOV9d88TpwumS/lecXxq9jCH1H+QTlUNcr2bBT8/LnUYN/wi/2dTL16B1P1s9iLbsu7PRX0B4bU6BL8F8esD7OmStuuZ8NpbHfMHe5felbzreTnA0ZzqzrjGHgJfr6gM3feUBCp96VRmjlnA5nqvmt/zqr9v9NmJ3AYcQNGNgxfKEVJ7C94AFnfhnDKp47F38Zz40U7domJ5GlV8f4z7rR/p3I9L0PNUmeIQZuKNujNwyqJoT2RWBA9/7ulP8cfv271dtPm9/nQWICWyn12zzYu+eYb/MgK08iE/8U+fA1cuN3IsvZp5Tug+NipwyhADpnpBupGzOAcI2/O+VPwOwEfnAPTd/+DvvaKfnq9Tcvij5/zvvSpjFcZIhJ5MN/ilx7jbz+O5HJutGUywdKLRRqWUg5hz3mSgVCeTyRt8uhvzvlP4TFCfzenvte35Am8NccuDZ+38jeeyw+ePpW3/hHZPKfIg9eI7/8TmSl5uvo3i8McH1OloF1qCaX45m/O+VPwtwENhWzyRl0DB+fmSewsboImV/GMItBWehbva6nTCLv/VN3Yz/3G7XyR6Dmrl/ZLTxnzm6tmrIZmBytHtTKENSKDLeKxr875f8YZiawQsW++Q1ZejWBzPM3v4GebOn+1W/8JnLq534jWalQHh9UJpHcl06+oai+Tufm7075C/yG5dPNd7/x2ilhKvt93f0m8cd+Y+/nfqNTzLOXqxcqBjUQBDTS+b875S/yGzOdme9+g5zAVRb65jewDf3v+A268aO7Oz/1G5QG67S7aAnsQbK9+pxUdciLvoQ8Jh4Oi62UL/93p/zHfmP1YOu73xhNYEALf/cbYN753W9YfvgNqvUjMvpTv6Gqxfzf7TwVvxGj3373G84JDLLJ735DhMA/8hsC8wd+I2BksEw5i1brndLb9QWT4+9O+Wv8RkMZffcbxAQ+k7hvfqOe3/zhNzK/4ze4+h/UN8Z+g09DhkEU/5Kcj6EiILQv4EGdm69rFTjz5ezvTvkP/cb+rem73+AmsKz82Jd7GY/+od9w/txv6IJ51mq72FF98mhS32D+7pS/yG98btLf/cbLBE6K59/rGzEw+Dt+49fIxM/rG8OCKf++XKrQvsa+yZgfnOXK+b875a/wG5uuH/UNfgLb89/rG2g9+Yf1Dfrl5/UNqxdil5byMLEoy61AiqKTssmR/bQVY7OtyCz0d6f8x37DU8r+D78RhX/UN9Dk79Q33v3a3c2f+41ORY9QIWKPg7pNeelwZjuf6tf+7pS/wG90y/7/Ud84rQS++42Z5a//Wt9gkj8il37uN7L4AB6iyQHr+bud/1q/YZp7/O43qAmMlOHv9Y3T8A+/wf+e3zj7qd/QRkCqmly4WOv/3c5/sd+Y9T1/9xvEBPbDb775DfzRoP/uN5jf+3sK9fP6RsSvy90WSBYoJO6a8b875a/zG/oH03e/8WoCs2jqm99oDdLlP/x7CvJr5D31+35R9UcaD6a64tflx7CHZhpCFe7eB3V1rNk9byE+3bXVTf/R3p72YQlAydDCQ/F1v2hCHtFv31udXMMg6m5vWUDaIuyYQAASzfhO5d0NtoHo67eUUfDtediyBp4en6jCqNXFwe97eyLYT1rjVTdWJjmzJ1Nr53PTGN5tTKO79yYwhoxhqjWNgfQ6D9Ym+wq066npxl10/B+cPI3B//rNo2Aaw+r9NF6rV193PdmPxN5MbR68XB3DXGMaUvB1AmMTe0mj01CkV91AJ3VRSp6arxPSY7jTnIaKchMYBcewhk1Dn1/nQXQCM82prVMaE1hDpzGnjCZwMzCGZzamMVu96vPylPX55HK6+tzkp6vP+Gi6+vyhN119Vranq893/HT1+fZxuvrcpKarzxg3XX1WmOnqc2P/b33+I33G6Onq8/qU9fl0+299/luf/9bnv/X5/5/6LE9Zn3VT1ue7KeszP2V9lqasz+dT1md0yvp8+l+uz/yU9bmZmnJ9wztdfcamXN9QvdPVZ7H5363P4MuU9Xlxyvrcnq4+C/h09flenrI+X05Xn4/b09Xnoynrs5Sdrj7LU/bP9Sn7Z2HK/lmdsn8WpqzPan3K+pyYrj7fXv53+2d+yvp8Xvrv1ufTaevzlP8+yPunq8/atPW5MV19lqatz+m/Qp+PfsCGcmPN/GUMM7VGM7rHQb6fRJ74Ovo1jcxUNqhMdEM9mUwT5T8ZmfwBk4DH7TG7e+yBZbLnhGHra0nfTyJPJJfQjSOPnFPZgTOR3G3gxyFsf7l8TSSXFsbwqPonIws/YDXk9sxa53sCbWwECyiKacf9FJHDc0aXQ1VRvLh0jgd/EnkyRGX7OPLh4lQ2L00sxEd2cqx6YSrboiYWgpXGMF2Zyu6siYWgc2N4iExl39freCamPJ7t0x3PhOGvGM+/D08sBDeB6eJU9tdNLAQ5gZ2Zqezcm1gIxTLZXzczlQ2EEwux7xvDXHoqWxMnFkImJjur4T8ZmfwBN5+8zgXjWJFGVv6F8Up0z3ck7/bKeimq7WMkLv/M17UnkUuTyNxU9l6SEzgxgT9PZVcnO4H9E7g+lf2i5AR+vRXicCpizkzg11O5XqYi5q/3TQQmcG8qYv7L6/GbE3g4FTEnJrD39ZyTv0I3/rEv9zL/fV8uyY3ivj+YB1/PgvvT8yDzA1YIz/c7MvA3hRZBnyZK3p9EnpwhuR2ZHBmKTGX/82SfOWGbnAVXmso27Ndz1bQxzAX/ZGT6B6zbj30/j5HfQuOSwD9zWnFw33+nokCLfXoIiag10+tyNu7+VpY6LP2SPfmDeZAoTXceHLWmOw/K5HTnwXfYdOdBhf8r5sHfhydLabo9uWko+Ccj/3rGrxCf+35OYK15qPwkjdczfs8n37VR7T/ZdL+eLwp9wr99B/RBJNSf3WE0+e6YlieRF/9s0Sn6HaZkUAsmJ29KYMQlL60LCZUhjWc3NbputcutpgGs1ealD4rtqcO2rOEUNqpj+T/yG7kp+w3Hf7nfmPkv9xvgX+I3fi11tlLf77cafdrGiT9YdyvCX7HuFn/AQiBSWAB9LP/OOmI58/fzRbWLo7hGXTJdQiNadLONb3cONKVG1NqXP4lMTyJvTNLgpvKhEzGBYxO4NpVPqF7P+DVO4JepfJxFTGDzr4cK/tWDn5zAwARemsoHZa9nVn+ewO2pfKqmTODoBP46lS/m9idwYgIPp/It3uScbSY+gWtTKaJSE3htAnem8v1gewJnJ3B9Kl8mTs6s5tcncHsq3zzKEzg3gTtT+Zry9Z5HwwQe/MnI9I9ztsVU7vtdfqQavXuHgfwV4eahhoGjNPJeuWqP/QY7qW/8JDI3icx7xpF3X6Yx6pgJzE7qdRQ2jVG3M4GV1xVQexqjbjiBuck6ha1PY9TtT2D57RjWsGmMusMJrE7WKQfNaayAXu8tFSbrFLUxjRUQPYH56Bgm5Gm4guHrIWyT+kbnZRqu4PU+oNEEPqhNwxW83imgTHyd+vJX1JFe4a2889v33TWAJU//aJ2y8pesU37dkhECQk+pyQ0Lvpf+fnn+j9bd/b9i3f3r4vEsLH2/i6TVaM3ycU6o07IiVE1/4DeIq+n6jUNiyn7DO2W/sfJX+A3O/x1WpDD47R7eg+V2E9ENbwsA24O63VrL/P6P3sEeNN13sOX7K97B34VHE7g/OTvr0/o0nDk9gVcm7yBTn4Yzd76WOic1RvJmGm/K631AV+kxTDWm8aa8eiQs9Vd4pKMfcE7Wf7sLu4XX2+R+P61166ix+UfzIFaa7jwosNOdB1+wqb2Dvw9P9ouS9Mobj8XbY0am0aRedxFNBjy60jbFGX4De2rjOeXE9f0c15YxLlWTE+WPSUOsUPhHfUP4sTVxlG7dLyXT4zSeX+dBJosdx83x8a/0Y9max/GPc04YZ6KmTW7cU0/22Cp20OoAYK8nk3jzTNxldVC6zFvhJigdtmmKrh/c2k8VCqakT7uU1QciPV5DaGr0wm6wr8v/Jvpa+9rrz333df9S38itcPffW+Nqvb/29pBXGC97dzTvEDDiH3NKa59ZtCNMwzOSubeJsxeh2mCiKZmE5XvZnYfZ+9XVmSTkFcsnoPpUWW8qwRW+mjMqBl3x/kXH1JtyZvzvp2vLINdlP7xZWrbKEJB3fix1oUfzsAI6xq1Ryhx0djtzZIPVtutrJL+vG7czt/e4bhXJxoj4TQ9yXBIlD18+NSUSkQbxdZJlP7QFQiL2ZwCXSPIscfJ6ZjVXbbRHjGfUJm/6l43eiKMCF1i/WXKVOuhT7uundy5JHblTv9xjAfWtpkj+fElTBvAjuj/MpLQ64+K5avhI6evlMBgGD0dsC29/uCYryqWhW5eKqSEq+V21fSnXMRcqQEU0VH6p27IiklkVttRCKS+9/RioVZL4sFhJ9sp9uDLjvPSEPckqDHifQ85bS8wHmd5sfXUlLBgbtZiVcG4Jt9qFusGbYky6qG3lGUWMYX0FlKAlHaKEbbfvNHapBCz7swBLpA4ne6iaXsqzhp5quaCtCXnqSQZEKjcJCASTmQ+yba6UQZPPF47RhtVkhWDJQOpCybtSjoVrbnc9HsC9+Zy1ZJZtu/kdrV/ZrOrO9YFm8t6XN21Aet7Z2bLa7tzjKLXyLGRUE9YZS8Ygw5/w7fFv83a2PhQrwR2sk41hWNrUqM/Y7hIR1cCt2SDck8/1cuZC/t6yq/XTfkXn+OBBjJdQWFqn9HBG8y6MSp3XyE7AkHf9Uun4K7rLrUfQyumL+eP5Mlg3+zlDR19NNwvlfN9pyurR9NoFSIPIUb8KCOxCRL+uCgbMs/oRbTYNUBbB0GHRwOfn2Uwi0kjVCk4A87gcM/2MT85+kg5G/4js18y7+kxKhfx8wmu+LL1lYbMxjdykAr3KTQwCW8n5cdMV1Wd40hr/gDV3yVhzg1bvVQHSo9WYg8Ps6qI2qqngwqdHU6TU04OLdlLXm0l0C6HxyMyjBkvxfKNWTdTcMxG8mFvv1Dwp0BKV9yg3v6x/hBAp+CY7fkDQFMz6C1udRa93rS777EWRLpxaa0gYtSyB71nAncZvD3Ky83IYGcX648g947l8XyrmAh4NQHr+zl2PabHRhYUvjyMRMXnvUgOk+JqGpDWabuRU3Y+xlqS/A6iGAnGdTGsSfr+obKvyJkTfnhD1sg2tl6BWoVqp0wb6CGcBtOPN+jTB+qEXq5HevQ+bQN9k59EZaw6JjdMIeAOqIg9xmD5bV8VWTfuAtbAe6JIBr3AVMG1lthKgd3YN98Amr5r08DUASSCAcM/PZRxQtGAcGSP3hX4jqN5fbG3aqiXYcH6DNeqOUv5ZM5bUdKhxF97hUzoVFub0fjq8HU4nK+GrB3kPqgby+qsPjqRyB+cCuCq6yBZ+37sMz2VIr/tNwVS25Qkq2cA+hA13Q1wyw66cKckfusseaZSJKzXgmLINLSESlwpdLy1FYEc4m5l/3n5Em7pualmfhoFcJaFl9YjQGBqSEdMmgPU9bVOhxLr2hhG8U378evzRaglBhTNXP6k3mzKbIl7POdESaJ0zYYXVEps0GlWXsWSBMGTm7e445xJcmZ/VROq+1UlvANkSWsHmYZOH1DX8vL5J5wrXvm6j1dIvbW3qJBUtv7VUClVn025s6g0Fw1YQslpe4i98aHU3mPYu7mU81XbSFV61jXQ91WOZMSvNUySNLNQ5yrtgAB1v2XI+tFa/MpkHxBbVaQjFZPh+2dLMh8LrSfJpeEK4Ukqo5cY2tPeuuTWLPiE2DkZVFDh2CG590mDbeO8xJ8S8A2QB8y7yVqtm9bAMuRfLh1ElmwVXDXkJ6BtTdnfzNw/ojNXql2XMXGlhZkHls5GHmrURAioHXiqQMee9TVy/cGday5hQvHV+U+CIPZpIztfB8npRf0mscCr1DEDLaV1lEWmjslGzWh/WWOso74/fI7XmreqjeCKYAevNfVcZFqNgc+MoSuqjFq4bqVTWD223Mhbj2PfbigW+92qxsEeVciHjWfvSRweAQO1s2S3BF6w3nxeWPtzUhZdkSNu1JoP4F1OYh/m0O45z1+5FqVNOSRsLgjFXvVbnMmbwMbr/UDQLreCKyetldooZ87ihwOfN8gJXwjq118GPt3qAOyyDlYXI42oRrvn0zzdIi822INibsCv5sHsfsoNSuVT1On2aRr3PZGGMOQi8cwh8HsyF0xUht1t5NnC1hEdfZS3AagxVQpq4BhKEdmEdPpmbydtf3qfE5yoKGjwyugunqqURWa+GzI/i2qpWAfMrBtIx6ma6QtC7cbK4dMzyzBN+ZBCY4SnuARoJE8EnlC3bMSx4iMzC55lA3/rVPVRH2OOD0dLXc3XxaCYlVx6fEWOQQFxlXD3Lr0FV0gBuWdOg234ezbdV6XBp72CU9rvZx3uFx69oTdBarUZTw++7d3wt3JDCJ4WWP71UqVQk/Y11+XzAZVPorKWKFBeS+cBLa1WorPvP6SOOkpD66izDssA1NjLD+bt3B48dZtNExO5R3Hxc5ZmcvhBMxEb3nvN1WYYyCx8lf22YKhONFnjz9fA0XSmr8MWVruy/hLqM4uX1TrxxTOVCgIKGV8CKIjFgtB+pNM/Me499X1ZiH0yYpbKegUtbFSZuhhznKZecMVAZvzPA92WjbHc3kqaP7IHoaYlk+GZNVHRaYST35LguXrvOL22mNDsTjcJB/+KuLVbIMGf397dcheuiO8d5TzOH9lAeRUvkcO0kk+Xj+QCGg6GWv7c15EJY0fB29cvIU1Xk2+PeCLpqDqplQwCS1epCZc3rAsoW2BLkK6NspgZ2R/vX4HEsU/YqtgcKUEwynx57gVLJEzv2nkiDmhHX7kqhfu9dmiMUaPbisy2abQGmmcNy0XSL56niKsQAbSzvia100UATdQRbkqh/6Zaakm3JrO9hqKztrsWayWPAoW/6VVzqQDvqQYAkGT5sz+Y9zHmyihZF2+LxF5HMm6QYiFmGlTJNC3KJI9X8/stZjU4ZhaeF5QLmXPIV+ZLpy+WSgQQN3szDnL+LGPpYrECmicp6cMH6CRVwWVgF9W5K29bIZLOYycsGwKS2CtZrgwGy1iIInEqW1PXmbF8naSmo6Ld5QIPqIO2NoGS42xAsOJnUfbyzN4WkXklHEn1FF0rPIavtDuyBspeeZKD8OAi34Ty4yLy36lqd6Pqx6mEBFTXXAoGg0IDeR1dxDAfcA1eOEgsnFW8+Bc2efXaUy4Afj7wZVXJfwbeGuhfP4Bq+6DEF2lY15z3PF9NPt+Hk05N2adsRRB6vSl6wz8k3zUE5AAdc+XhjKzye62rFVvPGFK93gUG+gnX3r3S71ZKnEZ4/CHnZYxzjeptgxbVuSDkf1mBTrei3lKrlfMqaU/Vi/HhTtuNqCL+6AS3KvT+V9SbQXqicAvv7UQujb3oOWbXFgOFsITVaMi/ondFUKHWazfmcY8tb52GYGnQIe+yspZYwsnkhK8+UvZyC5Y245YBvB1QO33SlPc1kwhoYJFXInRXeh+876bZbYj6WTZQ62ytlzbXr2U86GE34lEugSWUO0bq35pGbPNiyilC2bTRWE3tsQyaPumhtpWs73jV7OoW8bvlakQNzMpdKlGp+ZAE+8F5WHIFmIHDWdBuq63nIM6obHm43Le5muuAD6lXx0j/kPVjIFGoG9iLWeqdSqERvXvy5js6a5fim2WXTCIZ0qz5XgDYvlfOrJU6XTnRw2/OZp4iH+Ny86VmLWqAcXDQtLBn1xXQVlG9P4/r4FV6AQDVtSnv4eOy8ZbfqsWba10oxOmui1PW+2VQeOqVQBD+6lADpMV+i3ITdI/PyWWJHyyGMZeFmpkXYljJwPadcLRnu+nhF4HcelBxpzvYd2YJb56ukT5K3WZb3Rd2zaa2VqVK0iHvv06vvsnytokbf1JLlu4BFz1cNrElzX9bmKpA56ceucwieHD+gMOMzRC9WKINOSkWXCwY5aXeDaMOMxyv27cruS6JRhqRZUqwo5xFvE0tdPu89LmkFSX+91mqDpzyVdiMSLzRzIJwbtEN+1X+i2rmkDUprcnTrzYmVADar8kaaFltJpVPgmiIkgmJesENdKJ3hZo2lTH0x6smYnoAIb6OjAZXZvGYx7E1aJ8bgSi3e3PqQnH/Je/vYxg2OYT3LIFXyolvH8peBVEC9TxBWNm8bupQ3YQrSavo6vSDT6HN1tYibENdl2mlJlU+ubph8eWjUv91LpemkZvevDtOJRkg9UWN41FIWW9t+rVKwQc62lz0z3i9XGlXJcL4Cr5ZOe/bASwGJP69hurmFp3AF0eTzPG6OOO0qwRJvl89sdmse14Vn/RHzVtVWUmh57L6gy2QJL4ZWOTfYkeu5/Xi5G8aST/OixZgtbMxBAx9vQaWyFuzh9S5t6Tq34ri+3LaxSbOYTqda0Vzy88Z6t2SCw0efyxhmR/KrHrwK1FZq57H7ytj+ShpUzpV9H+phFmvN3it7kBmtSro9SlFnVHtTEoo6ZLVxK5z1hFxRiR7YBvnMQj8VwPSXd9ubiRSScp9/pgTMEpTK65JW0a/Ie52l+UoDkwYgUW08XXcqVZE5O2FcNAXqueUUbJEuy220ZBczslDape/jPcRQzb4D6RT11e5tpsD826OLfhWqFBOzoBB0BXppha5nEaXxBQKh8IupngArtJQ4qqSNWf3+u+MHJU3ZSJfJISondrrgh5EisMFWLGWJ9WMiD81ouMtZgJ5a7YWHrS3MqldbrtMSENypv6CVjOpF51snWQBJkQmfZg1Cg3BKhiSaTsd290Yehgte3IFV40KFV+IImlKb4iEJzRdTODX/Dh8AvvVszhDGr5+WZkZaUgUXDbg+eGWMi3iW55w4dItau3RYZ+Le1BuNl4vI2JsVvzpmbtIakyaPb6WqlkGt5U09Wk4/tSxVw7JKKVoMVLeKlCPDpc2+88jCRTJcFn1LR/5SPSmW6nCS1rsRnZ06VUhjyBu2wnE860qHk0nMMr/3Ltz0Q8LCg7/GXwpDar1VqIRQTD90VbgUGRWAiNhPGwoRXkmZYvt7klIpPl3cB6TWjAKoxfSqXCm3Hr2xktwOaINdQkPVwwLWXCHiVr2pjTnM3rloXh9c0JdId2kzN6iPToSzGEYnDVBerw+MU4o3cynT0vZ2u5rt1D/d+pK9+3QJqFR0gBPvQ12QcYfyfPVaGinx92V3VW9emNkwOqIg3gavhZb83uAaD1EcTGwGFshF0V3P5kqmAOArLTFLStj4IX5ustXGovrl3A9CFmOPCpYCDVPFN187cne9oyz+wQvn8uu9mse7Yr192LIgtVLx9rQuhRYrTKUHNJtBPgfKx8tL3nqle50cAJ5suFzOQdZ7SbYYNV/o8qwfMcxLKTC4ipdhxpEpml56SplDb/xbZvuHrCTi8Ny5+LlXKlR89oKWppzKTKDSHHcahF7FPsjAWlGtzEqNkQtS59I24XFzT3M3RJ8JfIfnXZnGczqi5n1Zbu0kfAJlEC0UOyULrfZxIVKy+a8cy4uYV/ShJ2tsPntlevIUxTLt9AbPWSMu1fQ4t1bLNSzWCC0KxFVMWmVhTGjMGQq8+cbTG8K80ZjcSFu7GT6XyzbWCumcjtgnnECuY368/+i0bqZLe0exCGo3kaKaJOtA07/hvnzJ5AwqeInDjZdzl0Xn1mWODi3RMNagv5z1Wf5oWNpcbxVzIw5YYE+946kNCRZkjU3clSqWGr0xc7aiGAM6nfU26RfeZNyBCsU7Te3UAvkORbhkKvbhqWqIIyRpblV35kBdv0DlK7ZLKcLfYhlPKZuPx2uZzOAzLvgyTWmP9/TUGysnGoz3j58+wt5y3Zt12d2meZXC5lVVaXioW/VyLF/1F3YWbWDspWqtw/67o73HXLG6jHzIGnSmdeyliDSzAUImttCS3KsU+Og7AIj1kJce7K0mzbc3TsAEE7M22dPcruo211U6kRIz53J6hahmsdCBCq09XatDpOo78p/uFVV302RzOljDgsI/57AWoJXRSu0uXgYCxtUUHK9k30KiiuM7z/pNR9SbbnsBNANnVgcFlAd0tQQE5BfGLyTVKAE1GeEjahaFqwvLYweBmL2M3gGXA4ZeHi16eqg5nDEv7WJcJJiJGnljgMnnVI5Ho3Pb2ypa83EziwWcyKAZw8DQ8tY4/07XDFZKPix2XfBXI5FKrGQKX3+SDsphbrlzeihI4mxsJG6p5ao2lE2Do03SqpaUrJ6QCvq8wxMV398a5XDAOBP6mi8ihV1e51gnvKCgAWftN7GXMhCqLSgy5FhUE9mcd+Fmw+nC5XrIdzMQWjm3A11PPMefBSHJgbFO2Ohp2ARFJI9HcpX2LhgPdil3ILLiOvWxsXidBv1llUtr2MzSB38EqEjl5eTAn55PdUfRsG3+46mFRJ6Cs6cjX2+m5BwvPYpyyUcsuO/XXbgKC7NNOJW7AF4CreSHT2dbmRG3jDzMEjXSgiNUPVhWx17fufQ+9KzHy6ylLkklRI0yYh2wbiwAllS6u7nAlys7gX5whfFmmirl8Fxqc9mWHz+z0dX6ZiZdqFRvbzcYZ0ljUueLITRzkh3WsvkyLDRw18y7llsXMKx9jMRbjL5Do7D0/hOwMl64pvjsbEsI2gvRhpAwhJRldm6sdp21LKQ82EAsdhx7gbAC8GnmIgUnnqIn8/hTeaEY9sQVIGAaeN6jh02nzogGnEW95Ei7ACoYss8f7C0hOIPYPqCV0FcVwqsjI2waGO9zY9vDIWvF92gy186nwuWCsPhWVJJR/yg18w6Bi+sNzW4q1oaMwm+5HUiRzkQrBkDE3ceaGERXTk/NQLJg18OfIMBdOE7GxBDJuXR+KtU1Ddi1ioq/j2Ilu/PtQMWMF0+8cc6PEabzYkbnthCAGq5wwURC3afsJQ4WDbgN9PtfFtvDRjeatesf2Q6NyfdJKYkAgMuxYKhVvFnppnIlweYgohjgOLT4vm8hjI2z2ZvPaBkqt2aW7VYaLD/XYSkB8wP8MvVmaDNswsK7olh7svIKYQ5/2LfsVjNUsOw7z4eUM00Vc6GUDHr9RxbzGt2wS3y80tTgt32qYWg8nh+8hyp+wTd7IfJFWD9A6nLSpQioU4A6vWKQXnhgY2anLZ8KttE37+0Ghy6fNc2tmDzCEeBMrrcSzaqcNjytivaoXCus4PkUGhGjgGEme3KmZLLBgnL6UdZac1lPeoVKmQUtaRukGjo6m6lsy+Ka3RaxmDjt4O6XxyqTLhreX9CgdwONGZumkgYug/a0texuQsGsOV2upw8dVKSlOVcNNzYPZ4ouZAJu17oI59eJVCz7oiwMlrIzZCPvfYcHfDySrq0GseNfzi+EDFqM3p03xeHFkPCi/ue4QQwesXNMLYrkAoddgzRcHw6tirj7sHZREzU2/95JSlhOkJVlt28jlQ1eQ3M4LWFrkZN8uoUA2WKp6b20H5ufRFxpXdyTQMOCRJqlQLZlDoxF5rxGh1MYf2Lqs2monyW0+v6186KcK3YlnwGT00doBujF1FBcHV15dp+iOGqM50vlnutdtlfj2TdnR8fPSr3iX74QpQDYipBrIwQyFZ4dlUsNK5io5kVzwKOHmREY2kjd1j7LLT/T1JnZbnorM5OqoptK32t663roVIKBVuBQhgaLs3zOFwwl7yUGlnyi++4sKaIpR12SY4wfWMcs3OFGG8U9wbmxYyws9btehbA9rTmGEaYRvjhU2/BBamRXR+pQz4Q+oLn1NhfyoO+TREa31Hc3ytjs0vltsmDSwYuz1e7gNqbrrVIBJunzGLDVXhoFdJ1dtoHyR5irW25lYq6TqqwV/e+NaNm91S/oY1IRJlDSNF7tjdcbVe//IuE8F9rWum4tyb3TO5gACYTe2dkhO7LcjZtkFasXV1zA3Va/9Y/3nAvQDy3NOcZ41tRadyQvxh83uvwAqeSBwx5cY83Ns1BtcSt/jvJ4pVhFdn3vD1ZFC9Y1V7knhlxvTNWo/yE9h7F6rVxxQA2m7IR4RT3YGY6ru9fYc2uIcI5EJA0qvCvk9yqZ49Ot/wS9VaUj2zWmemitxGtDaxFjlb+lS16T4k3tNtCfDU7fxlw5s7my5/GbrJs9KEvJyoZtp2g1tq3Bdfcg2MRS8Qm8KqUT2OqAaBPllcJRBPAGSeHopljR/rrHfHUCfqIZMIou13IohKUeJnJyWIh8WGjds/rrW7liq0zoNppUI2K18Ql4qrFdl9/vrLdbsVbjhyw73ogIAbf2r7K7B7i2M4g/L4N6OmBopdRnMtFIixu9Zzo3DmbqS/JC8N9kR141cXN6vDuWU1pu0xdL1Yvj2oIZkCkBjz6yF3AGKbd2vejHNPja905JlXj8e9FFOGV6+1j2JKlQWHtT2dpwDzqbM1obbk7ih2+MJ+MYlhOmGglMQ4RC+oe3v4laxVOOFbYatp0UU2urm2uzaktT16pfaPbf26Zv3Ni8+m6GFWCYiJzWjMjKTnGyR1mqbejrq8/pIezU9quYbpuPVLg+RI6Dmx6ylh6Qtw/JKuWvAo60ri9mSP7Ft9LkEimDzk0pkCn7GYc/d+dcuLtSfDopk1FCviPb7mIzbtHvg6X53WIA1TvyRdUw2lBEHNGy/+ujf9KNVPXiHzkr8DDHd2v9vFsO4h8bB7rCjjoQxdXer9nY+yRZvnQBA0SJI97HGDN8zH9AVmJHhTpjXgjpvbZAs78kCO4A8x7tBv78/RuoJGiy+0zLqfxe2eRENDZuZPkHqqx/uHsqVyYlNrT8OXx3TJ7Prw+LXsZ6e/4BkdhaPFNlQNC2DWAtchrN4tU0u9zQaxlXMShr8kbm5Ykl0039JmLJ7uNa0JZ2KlLZ3v32sbNfgDg1c60lMTHI9md8HHcBf4NNUVNCNwyX/tbK2DmA40GofE0sr6FDiqEiLWI0PB2EYoHtY+/h42Cah2cIvWvWbrWgzbIS6viqOgrdVt5Dzt1cWo+GvXYvxXFE0LXT9ilx7dpTthcbVFlR6s0YYETP9bu4VZ+3M7e5VloOvWv6ZHER9O68uQvodBNiRJwY8zWeL6U8cvks5/3IKTut1HLZ+UFms+8a3Vhffj0bx20H8rpkwaKTiTc7gsM9SNXLvtOMEZ1M9WKsN/c/hRm4Zp9tHOs+zCNIv1YNy3U0j0kpNbRtZIjNbBmWWu7FgbOlIBuXWUyt7v8IXj+WKlBZ/FJEnTlaiArfM75Ie3zewbjVDg29n02ofuT2s0JLIrke3Ap78KxnzY0O5mdlb13RmSLSbZ5+eqp4u6e2tyZu4Ysdwwwln24G/8DTxQy9puRJb8/KwMa8IJGG+LcEbGWrBvxJdYoye8N1HPEBQd44uhPZE8jeStXEj8kM7pVjFme6Tqxb2WInnO0nGZQ6tGGH5n64+PF9ZJPl7dydMK6dDGqFBSI5wE7issxG2UWV33UPXAh2DgTirbr39ukilJMcORxKp9QzNFIy6U/GVKRABTsocCH39LsDqL3dDkN1atv56ynKxSSieu11GfQaOkq1mnqtpg/xThgmGI7ajziSeug/kcnM4u7Tv9+5ljgjwTWoIvypVy2EasZKFOcLUrwiovDBP1mHaxGSUAL03Fzp2xG75ciU7zRbPRuYE0hh2FnNPFEvP8WveJCDKBScn7KahXJk6MfJZnouiiAV0hJn4hzJNJp0qbTAQ2C8wrNaCfLrIflGmmL17v2tz844RzXn2xbmho8lWfsoL6bVjlmxV3a4moXi+BAAs+HKB+2Cfjz+tWY1i9cuHpXF4El7B/aTUqRZFJbG91yXqMomULUH5PNbjyAyhP/iihwOCHl9G5z2Tg7IhO50z1PG/Md4tV6uUtnc2giLef/GCklkgPsj3984rVv9l6TcFAb157QLdhWV5I/c41tGCeqWl4bKowcrM4+3z33brx9VTdRzD1pduUV8rn3aBjwL5jT4BbzNfDtxBMTjUjCcibcggtw95pKIx7q/RL2SJ91jc3VwErZlVDvrFbNyNv9Im8kxSLbTrHiRf7IzEzZevdiUsOpyKeIqYTM9AtNLbKjeHkINGPVAIlD+lEkwfnrxff1tsuNy3JxVPDWMMQv7IAi6P3qn7aMdb7buaqw3WjLzOvyEYffK3klYJYW96s0XjRFgeYR3DyhXmloExMr+cEgKyp1bdgxPi72Gv318d/oapqs6fXQ3tpgLrVNmG7GGaM0C2bMiteh1uFu/IDPhntl1Bb7d+P3+rOqK72w5WsMwHJi4P6ufpXTwDl03+u28M3VLTVn7Jzl4B/jK2cUTFS1lZV852aJ8/YK0W+s1uAzrzV7v2UQSpi8kI9V58PkYSvfsvnxpm6l1t4o1QXZQ2RqC9VC9M3XkHudj6ACVTvbiU2mtBoNT9e7KcTBNzkgFWlIPKv7CSq3W66WQfdHxFRU7bKhRxdRRS3e89+ZNJBI8u6pksC0CofrQBxWsYqW0QxoQ0woRbMh4AmYDtVkx8uVgVnqAnSlhezyXqg9A1Tk4qncP4vrINSUYCHXWYmZwdLAsxesL3yKM4dUX37+g2AHjVHRzOjNvWUpYsCnd/Y5CxJmEIR548p2uY0IlI6UcFWD7NVxxJ2eyg4CYyLf+x2BLk+tbWtUPugwvjtv0dT0xytyOSAWBKmeO7V5zAEkbfk1v3PLZJBevFAXN6Za3c/Ksl6OLbzbQwcWK3tGIh83f8m5lUju/Y+b4XzAStOUmsWVVL2OXsQ5XkReoXxIqh/Oha4GcY3+iX9IDIPu40zn8WmAj6gIBgedfUG/9f+OQ1jHtzEeoj6/HpsCvrTCSHTYtHxUqc1dmB6uJDsywpXDoop7ZrbR7YQ0Awt+xvjfeuvIZe4w18c9yVeIdhkIrdHNWFqaItcK787O0rRLbUgiJUDrPwOMfv6zXIWGA3ThRS6C89rGTwj9ha6t6HmGbPgmnY7tQou71kW2Fg2/XDA9eTzaYx5AJ1C+kbjItucJKzHR2w3Clg2aFTbhZM28mHXnCYZveRc4QRvOVk5AEbZLvxmewpWBQ4m71OlNE5HljvVUzGKgqS3gzuAR4K7u0uv30E2NTL3CxFQ0mPlDKUcy/JN71pNE4lTFi4tUoRZW8dz9/ag2VVv48VIg8kRi1DFL4XDRTT/hLyqhoPvvcFUP0y2wYgdHITvOwPZp49NKN3ubCn0U8v0AbZI+CuN1opiIkdr28UfE5UTLebET90D+qppKBi1MlHomEMmDDyYgKPSrTvhYz5pL7XnqoGq4ONqjXrrcVj9iITRdntNNJhb/aiqtpjNSGbjHsy9NjjflyPDHofMMyU0fg+ie0V0JG0GAV8EDsIQt7tilPBEQ8uPhzPY9p8/qPRl4JXqDW2On/saHXSuOvcLZMOSvxXK/HdFosXJvm93jMzjONhPo9oeuljb7eAJ23edvJAhbYQJbg8fxxFu59JpFGq9NwkyiCzGuqckvUkszqTGgAyOrN5cUEL5P21WlsrJ5bZVwaABPQXX2Rz2jRVwYtB8szlQI/GLi04+egF4YakpDNVe38vmjPCedXalTYaIDZ7eM4USzXY87qXY2demrne780ZhaH1GxgPBqcAxkHIZYiU9vtzwD7nNsaqb4tpTUlMx8aJ2/+t/XjY/pFbDffXbEUmjSbC9reZ+sU3sWaWofxxtG3mpQVpu+KgIafDxxge+RRQk+613bvbEy6jkmlykuB3MsH6wLc2aVBDA1cVZh4q3y1s6l/TGw2ffPEAvOneYRMCHFjoJkYv9EM+fQGS48kMH7zZiu6sbznOCkpO07r+NYNRE4rH0hVJXlD5XzMCp9hUvLBr7gnUQosFG8l/nz9X5RL1Nyw/9pTZ/aa7TJsfaXRBu0dottqrKBmfG/OBHzxZk414/nX+VkHSJJsHHKKcKRKsbwzmbLN3vGoDKnaiIWWW1Uj7mJ00e858Wz5gzlqFI8+Q+LgT9wU5NEB1chhvj4LfSarUutm+r/fG0Z9DHKDu5dHuUaiYW4+JUAaYPBELSEu1JoJ5L/xGXhBfrEtKvW/9aaxVuDb+fbNuEHisyVn1eZ8C8o2jSAl5+ZPmftMx2fpeQgHinjI4mL8G7AyAT+m5eTkfLMw5flghvtg7aGWSIAFLDPXedYNUbrrk8p9iDSw7Dr+Q7Mxc3q28dUBx2rBblh8fKyC+Hjpw0jjCO5KuJufr/5hZmL+KJ799WFWNwNe2C4jKnySCemLDjvYfe5HPpJjhb2lpj0DPExP5NXbf758sIHmBsEnKQ0BMi40ZK2C5sUn2Tlf5fRFyR1wgn1wo9wQMuFV1xXBAhP0W65acQYRTTvAKUvjC0+Zx1gH2Nll7/d2p6PN0XjsQF6WjkN9Hy42AmgyVX0Wqgyc0ONxWyTKq7QGx9T8veBSSjcWO5Ptk3Dkqd1Kudt/6GKmdKZHpPWQiwhLWKRTwcf1USX9s0WLi0JhuANZ+67dM0SI59TV61aj6k1+9nsHMXMiARUvtmdLON9b5SvUyspMoasONPgbLKlIi/Wv2tnJCumd7IJ23rXjDEi+z8xozG5dEwmlfNbW3BCyt6VA88Zg1i7iCVfsnM02cyFS5PDmM3uaqLh3otpyHMjH70sMgHheX1ynQMXlAlcAiJevVaoxFRkThMdn77uymWoRTY/khMeP3TDhRM/3trZBlO6CfpctKut1oFWTWil+wa2P79fGWHPB30/o3U5w/v5uy8+P6yDNOfXZfxCPbJ+XOdzYkcOGohLkfXqUq3IlXGaSoyAGs/D28SUQ4iWFbWWraAwkQHD2v3GwBjnXsSWLRjUCKU7Ej7aDY7m4fy+rTbw0I4k/KxAwuawybENfmB8N7aR9tJXZBdn5rsQ2uCXbxrQqf7P1fTpeOPz/RcaW6ZR9ID/TqNquDLJfIhMHYmuAq0VnXoKVhMY+/DL3FUct3XjykZ7yVazgVMqQjqdcTmrV7iitWhqLN/OdSFars9v4zz/bYdzS43dLgl33CnPbMpNKzZbuuieprF2fTDBHSotFuR6AcI7IsZ0hGD9zfsnY5gvSdWQTGA+mQDQTnBbB/0mK2PwYY7HeqJmuZI82pk7jTd6qqhNrA9eGlEB+pqrgPvlFklnLYstxwWy7KPIrvxYPvOuZpDslLT3GQC4sZUB86Eq5iqFvHaItMFKM3rDkFH8SmNkWyheOb1CukJWWCCvr3mQAc5FOlvrbnqv2OQfYeCsR0lvV2FOPLHOzzUv3T6NOI/WdSCvmrkjvklobUGSecHa9tZlloAbKt8TIQ6ycqmT+vu49C63qCF+9bbLA7TAL7ScbloRIe71wTnw3se4lKjCk5wsQ6MD+6t8tVOz5zZ9P5RgQibVrSrniUKIkJO/qg3cEa20pmDPjGmJqhSm+7l1lk4tZ23FPKjo4jLgOKGfRw89PyctMflEW3p50yZU9HGuDXNJx/cdjO0eL5vp1Aze/IQzAK71JvRhaC6/gfaSX6a3ijib2NyMkZdb32+0Z1wS/ehkaWYOncSe9cNRU2uIqKIQQcBLmlw2XWfVw+bmhXPzVDS/Auzz5o7QDOvpK8mZa+ixKqG8A7lkqSSbvTXEYqgSzsikFIgcbM6UpDc6cejkdlNBSSnRIH8butf6yl2nD6vb2l2593hG+qbK9+d0z/YgNunPfPwM7X6Q7X9g5tEvp1KNSMQAW9OjHtfK0IGS1eY19+e50B9XkXqt4bHmBF25i7iUXnBspRgYXPcvI1/eKdQHBTqVBGTEDez/WVWpYM552ma9cmQyQ2YYzLR30oszGx3A4MLcvtqrlGmiqg+lgf2frn4mjIG1vXkVn1DfnV51xdArmmk78kffGUDv2HRq6umd9o4Fn/An9iq4Je8jP+zHHhhNEWeZduHs7uRx4+DL6Ycb67QpSNd846B20/r75/tLMQhj/DCbn+Qtx5l5P5F0I3/OYh9KnD4/bN8iiGfTYczHg9O5uArHGThJBImlhsgbYSaG8EMHUjJs+W2E8NV+sTYDkmMpbbwS/EvxP66aEzhBHE2zrzwRuCQnbgyzq19Ta2jtBKx1KFOrxlxIGdDxrV9pWj4He9v9ZZiuem4WU2IvPh1MifyceKu1M8qvt400h5xh9JGbQ+u31dNyI4f7lgPYeOeqLiUQwn+YSMV8knGMBWKLCey2e2DBhZcpGyJ+OT7iG1G+DrfgUtIaJVoKjmA7trVzVKNjSDZRNwG1ixLga48rmjx3yf5OarSDNx91SKZiXv1i+yKzCT1afsYf1JVozguGh5gnEvevnEbEy6QT8a6YyPzPLySImOhJv1Tv7sdVh0+Au4XT1qNeFOi9reBDwfNTTVSpyBpGj83Jf0pxcaiGJD59glhyNzH30jRzEQfBj1nWcek5+xDIi3t0J9RY26vjUxAFYMlLgCbhimB3bqm+7ITkIcGLbiR751n9HFtV65drdH8yPKa+5n2w1PHGJooK8ATAivwWZcP8y7LOE5nrh6Of/G2QcAUSZAuhxy6rkafDLJjKrzfddZ0egyJ7N/C32mCkf3dzfJSynrr9eu3QeNwfkFgCmky0xHDyxI3wVafgD1ODtVviqVtF55nK+N8YJ5SxcY1R3L1aF48Hq7AD2EcSeDnAdZZeVIO/hIMJ6al8EdBWLJz3xC2etEgHoQVPTyIgxJe+611m4Zgq7qFvicseYAieHF4H9wJfPsOOnnw3cc2n12E6Zxqbb1MrkO254PVF4vSnPCR+5mrT2n5cOv1fEZCJ+BdBKikgUWUso0wxnrcnQhMZaivXIJux2lujWme2l5782OmKo3AOGJmtHDR10xxbDBYStd39s27ZTUZwWUHh3kLOEmzv6qeyS7FwxHduNKfrXEYIWSaBpK8TL26/dj4nl2v2uJ2TrZaZjnkBlXbUF46vaM9fS2/6xPgZ780IDsBpntq8zr7AO4iE1NcbYO88s3s6eDk8RRtSN11tUItCETGYWJiDEBkAAQ5jRxNeEuDrcOQ7O8STsSEJHm8MB1t3yoAep+9RIyuJSbZIKAeANjLK6Zj+JkGuwVM2ARnP9TD8bzxPT+DLAvinfnMFk01q42Tq2lzmzvupeXxxzPYOJ5PIIgaIvAXDQbrjYDX8owZxRwqBtOjyDbvwJP3ljbAurO0doExN8wQk95t4CTz2hIYnr1zrOPKYmAMV60iqiQiGKK1ozp5tyzxzM7YLBUXgpadyIUWQILD3WyUnRwqXiZ6GhVdFApsxNEx5pWo7PQv6bwchWzecD89ieIAv02Q8IEzTZLR0km8XZ57SI33SmE1ZorZJBHXPILEnWcvcXr5+ZJiOs3Rge9xfRW01LkgxauvkINMl6Ut67Tcvk57F3WJZpfwjYHvBVh/Dnpt5I3SmRQaYASRw+CAOe936n0Y4ux+v10v1HO/5mE89Hj95cc2rvVanu9rUwEt0DgHZlW99il3vDpoPdwp2ypxbui1NRPFsJ1siG+q5D10y8dmeZwgRMaH2qwhWYlkiF8ObDVrPwHs1YNGA6L92haYXjq7/OCkZtaRGEOA2uGAZ12P+1jTiSsk11Evnxa47nlQ756nTmW+l4PXiFttMvYlzj0+VaWRRB/SxLcIyILBuEPfoJjP+3S7zx+htvDVyti8dFa4wvxslk0jLrCXF9+i/fTjMwf42Jld45/pH1x8HbyfOnDU78EZIRBw9J24ob4xbrxjY7G+ankCDeSX8SiwX9mRG/f5X/c1AmC05o9dFQKa9e0ZoYbQ0+PWuDpUzJZzHKA1+Hess84PQgP/4eH2XqpjLxPnpUnMOrrf0SV53tKKi60kJrMrMOYLVi8akzxob2X8/BRWgBY1TYCcISAE/IfdpNCPvaUuRXFI+bi/yamLYK0cUUBztUcOrtxRaO1v+OQmDX0qdBy3Ytkq3dhp/NvuGc7j1UnYUy6CsLzpbv5WC77JYAeulwwFRPxv2+ZjAT+3+HvvwC52XZdMQxasJHTLteb3o3tWmWljzK5XIlpX47KDRlSIKba9QPzNftxD22urEgioyrsjkwU7d3+6eKb/jW2r4ce6pexo8oB5WUYutueZvozniw8SzEGrP7Fc4eeo5uzW9toprOra/SAvvU6Bs8P7fBdSen3kuEkGTnF0i5MfsJzKWxH/9u3GS/oHle/AEl8cc0yialRUVR6iu5YKy9UIT1x3cj1Q2UMXti3V1f3kxBI928e+GtxDU6MrlxQiBh7a6H8WN9hpZyptWqbWi0JCLYXuBCMMmOXjh0qZVI2RSyZavofp+e5Ty6zHAs8+AneP4RFpr84tL14xTlMRQ/iLCp2AuLY2vWJ2xRxWjv9wSstRql+85Mpm7ee1Wee83o51h9Vo79RBPx8VWyJ9ewScKz4wzNX1LBme54d9B1E9hkCxmHend2A+oEbQ7zAeebwsGTWj0xxJn48JvtXtN9ZZ919ZZXzLsPeDo3z7+/1oJkxbb/dc5hdinW22kmG8OGmrzHrnozg/Xmz6Vqou3BPmN0fP9p93XODaHh/7aUe5jL54qNdaNa024yZ0pXHi9a1Ejpl0FNMEDratW1/mFqbDx0YSTwc/KLVUcVIr61OArc56ZwEJ088Iwz/EAFEoB5vbb5swhLtv6vk5svqGCs+XngXBCfxp11r5RsDU38ZnQghgfDdWPBe33fKRrUlKdLz9Q+aXgZeZh0Dmt5iAyJvUowF/3C7sTslJuXpybwev2N0JNa5jqoEpM7lyy2RmSFNY3TzOkORou7b2XOimfFvK8rxjbOT/ZNweLNv89V1+IF8FeLAlSDWWB5M/PFDfRcOqTSMu6oSvbY+HlzeEEiLaH6dD2D63cSPBIXqFx1V7/5jvY6CXmy+B1XnQYZEDmR5s/OwxyVoBcXlIKJwUFbU5RGjYmHKn1fgsBIaouEBIL65uv70ITn3vgRWey4AlfPOshfueJN2WXbpRwW6r1QCPvpawIkWim6gDkgTV6Wjo5sgpbTPohh5nztQzgYahPnLu/XTyiRFaJa0GSIjotqOx3T6JP/gKSFQLJE6Ap1V7LMabXKFDPg+jtZD84sM77ZqgphL5hlxsmz/449xXeWQf6NUN6mkw4BxIFuN+JfWMpUC6io9XAXE6seAH0GLD/8e7ZFJMGAWoBIs47G5/33PJuXKNfpkOq033tRZV1qBH0k31OgxPOm8zhQkUbbyA/ifXE97HFxLukG9z4i2XLDK5bFzpKZ5KsBvPLWbD6f/onQuDmBVnM9uoLVqqLdKwgoUXd788hcn8uqt+pQOkuhtpVCDt/OLzB3jamFcOdAuwK8B3rqwLN4/7iaXStTVx+xAu4mMzyJeFliDhQv/0QMad79d4MCxtRspjU5I4LrwxVkdy+rgpnc9wAhSKegzQDdSmL/v/dpCdeeztO4ug8AeKxGjniYOe4xn70EPMo9MgNjXPaOp65u7r9vFlCpCqllatoa7oPvo3y6PzISowjJ7jKiwuFALJmEo2PCQZR/5k5/dyUQC/w6r5jcqjMzdzNMawyzHoKlc1LVHX/WjJj/sC04MsgLtvhuzud7qXi5Psbug75FNJRv8ND06HOnWbFGZCaUheRadkRqeHLtZnsbIPFY6+qXucN8cy6c9gIXTT5xMfvJG7UBIDy+V7HhX6bCpuorr+6QNZ8Ywu35zOPGYp3PtVaLExDLt/q8neOhahJwiQUqXIMZynWb3Hz6klx8ckkNyX2fZbKtxqQJLfrn80uD5+qcmtNhmb3EOElqnYWhLXiXboB7DtGdxAe+YZassnsGukRDEzvndO+70yF25W8woxAt8L/L7UnOQQovAaOReE7Hd5IyXeNSIjEgM+9fkC7hfizRLxQ66SoNXl9Eqc4oYUZuG81aMeE3U4WJ2DIde70vHsQL7xpQL6exh0553iKvVy9+oOJoy7/zrGJTH72wUgvmczQxX5VvDS/C4hptEhi/6cMTfOqG/K0Xo7XkfvBwJiu8FeSigyBnHFT3rAtVZEdJGOXzmukaDeO5VHg16OUTVI5+PCwYw9sDlNkVgJTm5taDD1amodeJKgY3hxufMRmpcZe/tyf/f0TCyvObnjDJNmW5YiadM4/tb1YlZe19UDHXJ18BUCVPjk6MqZFAl/7xGGVU9OsKA0Fp27XfW5mwNDtc99CSJFBxqZp2gFFgrT9miWEUM2KSE8nT1fTnh138OJpjmp5skmp52hwObwYRItEIvP76MUq39tSlM11u4YPP3vsciEQWwuuQ/NwcV+ctJ1c3pL+ZmettEH5yvfY7E72xVnHv7F/jDJrOW1QDR32zb0x3PNGnW1vRQeeM4EkXVLldC4FRJa68HOt4irPsL/MvT8B9bUXzI6N5wcFFdGPBEdVPIG0vuf49l0k34lp/cnwhWozgE30T49PVyMd2R2uoPvVRHbfEJyrnCKjumx87nVTJz0VwaxqDJErL0GWsVa/5Kt4DxZGqq66t1py74LMJoLH23X/UpTxO+/ofRuMxrN8vecaRMadtvFVkdRpsUltzpRI8HOUVpB56/vVoIwIhr1IVnL5P2Il8vZKS5pgzBGl8s85nfk0aSX4plhukU/fev69dQByOL4ihVY843/rrQ6XMQMRFz8W1HYNail6o00Ihqx6MHfjNomazDYn4J9QblxwIjC9c7mbSEla7QPujDTfa/nelon2fmLP0fPkC+kYj6ju99DB0Q7meFSOUocG9CxdGqOX3fsLVp+p0yEBVaWHaVzun34j4nAb/XM7xKiAsCnEDKWNw65sIzK0mJ6uP5UphEiEx0Bw+OY9CozlZHu59BxPVp3g/1BPTeWUyRoMPE5+deN8mB0w/Rg5DdebtdNWx300INPSwrNT3Pai/qTnhqUdkTkrueAH9alqXDodG4eI000zs5dTae5Optp/OPPPWhSszgJDJx8JE19XLr5RbcVGPpuPjbdMuyxUF+jcatTRTcZdu0ObiiOJa21+02+jYG+1VlaXYqnAFzJKdn7I6wz341eVzLN0k27/OnY30WWVUplE9RSdq5xLYFTq1+IQGXNGC0zetNvmr9Z9r777ZvFWIuOFYKOEf6x411WgpYNg/UZAF+P7irBXN0yHSlfZ/rDYhFk4YqeMbyCmV2Q8jzg+GhQaIk3cC5/rkW4f+tBzBsI+2P0UUNxc5QFRc91RZwNbxQnDdhstbGbJM5Bc+PDlWHpTWVPvKooPp+DzhvqKJ8qIVpZ3tVBhbkdY/tVFp17XX9sd7LT3Vdb3ZzamTGmUd+sWNfs2NFU2LVqBZoljvsh3ygNGa0ysRyCJKql13ICg9OssGXUkU3Nv6814tVbeRB475dJuRkG4aEz4erGR33icdYGavJL9wSJz7VXMWXA5PsAUwEDe/i67BdW2mFV3Mh741vq6cpWTbGhbPrYrLOojFsvvKV9WdZTRbZFd/gBx0MgnaYlofe7LaeZ7F3+YsuwXRUaXq+2S74wBfeHG0CaHj+XOL1K3zYZyNx4IU0wOO7et5ppFHct5kHbNusyDvl54Dvyw4l1AnyHXzbX+5x7k/55CVhKse9RsznqHs1P/uADKemcQI1Pq/0KHkme2JkV+DVHwF4ebxAxpTJ+jlx79uCTfwg6qbgDQcR8WW8e3R/+zP1basC2cK+SDx8ay3EKBkLbb87kuuunUXdA/X5cI9VanHZ8uXk9PcEFYbr/exkYw6GCec1+MfOWCf9NXGVEMzLxBMenvluwDl2HACLi8/0vl/n5iD6WqtNozFXal4y7Nuk41hdgjVrmRpEHsxRZA3nde7Z15sog/utxkwvYy2OctI1LlGpWwBcqjjQhZYuoVhf8MVOeV88P37pMa0vckZAbgc6wvpgB65DXsS5YyzbMGmFfjSFkPiRq8HUyh/ETaERV9DwuhQ5N2Sj5FEkeX3jEevr2fisGS5NbXMUIPsYK4dXZ1d5MCSI/5U7InWem0GxiyRqrb6AfWoMbJQDXlm+WJFWPl6cya06amJM0qp/hP4ipUoEJPVkietVuHHYoWbMFS6+NtdlGFI77r21bDL3Cu2LWJ+ixXnvT9KH2sXWC6SB3D0Lj23Ytb7707f8O21M6ncoLJqvsbeh3tWbvuLqJ8ajGgmrLhry3NibDT9yNyXxpVqHSDKBRFy5jbWQl1yUXP4XBXi487IxN90p8MhTldH13M4ikymq5MYqPng7pgDK7vfd9uVCmltB8SdyANH9rYL2DzSptfNf3e6Qzm3W3b0KrPoHIFbqeKbGvXX8SQScogH/Hkjlq42y5RhYED78o2uplyd88VAsnxDxtOanT441VLKAGZvYar74f1aHsvRw5Hux6W4QnUWlqdK+O0Cf54vL4gvrfddAM30Al0uhzy18g442XPtRFoZcYUHYMLUonwFsfIUaNoa2wZ8gGWa8pbwirliwp95ZLIuYbWwygc0YDvolqLRw3hiLK590i5heL3162r1K8d2l56DCemUFaFEbGfamkJ4kSpRBOb5CLkUAxOr719F4M1NtDLrIJnAmm5IlxYT+5xPEvZ6f2XVs81wvQl8g+86g2txttvGK0unV6UGOKk/PDq5xgvGNzRsYvGtIjV7YUQmKdRXFZgOncTQJJt5/WfiCc8LNR381Wp+FNOZmRtyop9vwXv+jIkIti9Zdn3kP14nHx5uwW3urlUYdqTnfyctB0iXpZzY6GmlJPdRMXsNF2L9g1ID9qZb5JUveNxXBSCxx674x0QR3Rk6EQOw0pYzlAmYM62gxE+H1njmlYsNVl0r/tgjVI0ks/dqN//HiBRKozxcKrI/srdx2mHO8+v1oDt0pCNMvR1dtaD2KEgqO6G6q7YfJ+U1S2w294aP/pfdPiB67SeCRAIb2lQcII8rTq0vTvTaForYref84rPVAKdJWHDKm8RsQbbVc+bDE3sJhihw27ft355IsO6/+KlZxUi6M4KHiRbWJNyhlRrWUBdbbgNBsZsIzyuTn+Q3RxhPQY2cc+CW/Gh49i4u6hY0Xx1hMlObELEbDxDnlj7KOP/24/LyoFsJlae+k7pJlM23mtuEnHg6eO2/kUJqkMyvsWnUC00VCo0fYZqJJELlOXKej9Mb6WFPzeMlKDGl2uvzbMK1UPFGlChkix+xTmD9u2X5KwIY8G/oBvFkV7C30LxIryub3m+JbmWHM87rQqz6E7Dmkgid/PlP54V04vz4y3tvjEit+b97NFqFJf3+g3fI3vxyV0lj5bntYWj3wbmJTIPpReCRbcFeXgIXAtokxfQtcbegtBLDPuENdOOuEsb2G97bs60+JurKWbggK14hAJiy4MbnBh9+2OrDCdtesUMEQYZ7Tcfw9RoCP4HPXG47UnZPlzjU0yk3cX6C7KkUo44k7/yK1qlgxWorgv4U2g5o84nsKC4LU/hOgVsLqjYol4IcvGvNQBONo9yuTly3V3mlenIAnAwctLZ/tmm42UtEFtbVIZ4oJh959L2/aGDIedeoWwCHp2pN3Hlm9mRgIm/h9UHiEYsX0tgBa+ylnoZrSh4fvmcBVy2/QfHv0P746ve1LkzSe3bO67FUoNlXShoMtlRnMX8X9SGNWK0477sDpyA2HWiPv/7+ascmRgW5T8dV0hUppVNQazgB9n0POuYWdvkl1GCrd1R/gNvAns8cwC2pldskGOvUfGsq5IhGBPapfbgNJuVo766e7H9+C3gzsH+/GImyBGOYOw4zUX+YbcQWcFqudz7c2XJ9btdJbe2d0D8O40yDG1wVXfpcd3XY/atxo3oCzJu5HWQE7jaWw0x+nnLC4okbhPirCvglnufY9iTbwHQwcCwsUldIyVbmNbG0n8cCP1KwWUsqTrng8a19sDBtux9+/0aYmQ1lVxWB3pA6BQ7J65XM7mbfLxWVFhNdrbkKGw5/2ceO0aXrjZFv3jTXqQLCUmZvxjUrseJ2fFOg9EySb1Z9mgNFD9t54M303ToOsFQQM/cvp29FSCizWUvzGB82QJ4milZjri+hZH7sCq66DfZh9+jgU53n7AeasFpAciWmzPPlWpxeD+6mSamJrH+vVvrF01m+nBKff56+SrJH7+ZQFx/ZY6Y7bImLY6we4SMT3MFquyc6LJTXy+GKzfnWL0AlDsrokt8FbYfYtmtfyet8evdOiTQIllWnm2kDjlC5kIzHnX+3L+i2PgicAQOWOGOpmFXFRkzK5vvfPyz3iFcu3cmRuDSZthXt4mrL8NVGQrl4PxfmN422ax0s1LQU+sBcrAVSCpmpaKJkgoZJSI7jk6YZafVz7bP7gdcT1MhEUVsQW8kWVtxdG9dJOXNuOZ3AQUdJDZzFhOdorvdd1Tty2kpRI8KK2ulkv6G8IvmehTSTrUNtd9F9iTHkjD87M1ydBTmpQ9sFYw7SGUSff2JVXF/uL7s3mZhJbO/Vde60pFBw44dr8xvdqsHpg/tWOfUnlbE7fRK1THSt4HfPNVWfkjWU9YkUOYrN+LeLBQalU92NQMyN/Ux4K5TxWUdsLlc61cLNkaNYXfDCCvaeUTjNe7J40kCouf8KOcntazp2oGsSRIhCsPDgHoKwtRYqC86JU0TmaHs529wmF0mZ/vcQzJSfhSFjWalYynIDepn+gOayGqGtlLyilxNp9KHgOPEjSVvLhxrQ9on5xoqleFHqoufWjkra5CS9hHkw0yGgjrpVJE+2pTpotW4CBj8qhpgdZtIPx6iUP3arbM60xtZyIkG0vxGWZruiq3+s1URjtHBsK8o2/hW1eT0YqRBxt3IoCLzhy123ekbVC3YSrPPhdE0nasCetgwkDj6ewE8x3wfjbjlKUjfwZtLNJa++FhLGvWrMnYEOfE5JinXjN0QRGJ5VyPJayxKKW/o5H1aKTlcu9tTqu6WLle6UDpyWXrfmzSTbfTizUtTfRSmfNpOSsQ6/RsL1jKpNDg5d4/SYIvJdfBH4+3heiGv0MPBC4fA9y8KfhSpTgOnj0mpvbpfBz+sW5Fy5HI+6g8nhw8tR3j2E4IP1ssWFpAVmGmUMYnTH+1MGELHO5J+94fTzP6zgNlXPP99MfTx3gN/OdjX6Lyq51lr8Bxczsc5uSoiRY+40m0z7sEEetNXDE487BjUSzqtIlURvzHFjITgZkk8Ss5Wqni7XhXCtFftcDYdxF+q9+X04ysX02tVzquX+WdAr+fFCIaTUY+F+PmyPmm/0KF7PXwFfKRAg8idPM0cyIBY9ANP8ZvjJ9ggjPpT6HrVjznRRUu/SUrRwGVlN6tT1tqbmpiG0sbqGTfPPkxr+iYH7Xz1wIbr3xkTTnC8DUwt+hueawOz9PT/jITzZCHvyNn7BCsIEKiPEHkflVsWBh5bzPkjrM/7SjJDFH8WgnWcB1f3nV9ly3w/7n++ke0xHeXRwlyjMZLdMbe3W3pZF3kmmc4HtvyE474gvfeHD4Cbow9qfeeKDa1z3Kt0+3gTTT2lDngP+bjYGvvx9fBzsOmoe5Byg5CfOLE+1HqInonud/LoqteISvsfWvWvYqNsuBy/+bIQWdBUt/va0Ge+O4aLMsTmaVHjukuZjB5Pa4yQB2ddGRHVJzp3or7mrvzXH8ZDmekVsabuUJzyM4KWwyXRu2JknXhh11nwZVh3+2DJcrKfSbAWXxuP8gwWm2jDDDaKNly8Uy076Nn5ULzKT41CppcyAldcdxV7QyLWbZBPRZk1tNEYUprBo7GXfJnAQedlLR4cePOCWwZ8bf09HniEQD505vZ6bkE9ID9AhOIl6x2Axm62zpUhZEIhIvz9qpI//O3WMiZ5DuonQgrFe6zbXxfn4k6udj8n0h4V2GJRKOCOHxXFqap25Nr93604Vef4hjCPX9TJcdSnmp+pw6iSNxemOsVsGBiY553jEwUUvv4m1xWBYeqSyY36nV95r0nLdcBQ1lPfNrXqvuugZhQeLarrT3PM/AMdPZuwfZxWvHzcrdGc0S1k18wd70Qg3IPQTc4f0kbdiDwY0tqn/sNqgzISfdgfNP+nPWE9Hih6R9ag/2mzTlUgXEYgvHVCzNgoR+V/uEDv8QrkHIaacggS8faCynjTzyD0u8MmOmisKdrpYGM000bxx7V/lgR0SCf8E4/y3EFPL8s5RrSUso1jTh3Nmzompu/HNQIYF3PdbzqN8lW8F/MXgoPmyAA7eQhMgPA+Vg4H9blYz0o9co1l8tHoLPLe/9N8uuGtMOMfNriBtNpixKqp8o+5ZDTzs6slKCvpBxnpweECwqfnT2Z7XeA/m0FJxMCdytq62jD7Lzd2eyhIRjnJoqcqbxuA5pHPbssP/ejCsDPyxh2VZQE+Q9kKvuDRlC/m2uiqz8Kid87itoV4AMx7cf/L6Ou3E1RyQO3c2Hcs2QScoeFR8hw65db6PpJnokirXiaPgjN5PF5fdx6ttNtb8SydlAJTx6k5cte11K9cNrX8lrcTnkvglAgd+ry7leH9TK7m5VHvTKyIOisMP1udO21EPvfScFk+QROwecc8nYsZfkaF7/6kfrgzNZDDXnG6fTFaAtS+AjcvmBXx0UBFYW32hiWH7Sv8g6Hb5/uzCrjcl2+/SE+ZesOP8GOUVjZ+FkTxXIuR2HfOHqEgoOOWkaSDpnlqLeEOB7mPYvHxQkhYzVTWmhXP920GkgVHb17KI+j0YkES0l98vJ8QYYszHpx5lnIwrrW6+Tpeo3tPqWaOSUHnKj5edxH/TMmAOv5X+/gSkA0tHHtwOdmMsfbonqX2tCWJqJrlZg8WY+139sG4HCMf7b7f1Gy1TbxH/OXdjH95+GcYPCvuWyB3b31Ml9wH//txJNyUswsFo7PxADQfdwUD92Ttsl55cGeCD74nxvDMS9iTDYLzVjDAxMRcG8RrIR5f+84TrbLxxfDfEwlfjWpqZxEpV01iPYFolYSQOdrlUH4ayEaBRvjv5zxlSCs5W5qvKixFgQbqZZElqTt3D+zxryMP6oQ7K4F2A9aL798vN59XYDl17+SUeaJxVpQy0DrfWp8vct4WSyI/VKoSG3p+GqxO6enR/4MFNzbm4P44b1cvERwGOoxZi1jeUKxhwfY4lH+sQMkAxh1iz/e+ba2OR9sBZP+jGn/ND96cZ/BL55h9rZVdrsDR+7Pegi8deOOvpRDbOzE4WqdZCfmryuTYmm/v1nt60i3dyCO+OF9PGj7lcAMmwVTeahAu0TG+v2tl8glqloqczmuZHrb15jCrfSxWhgVbdsFb/OAgE5hAPvO2DrAzMqJ9Y6KCyHh/hej6UcrZDkd4mAoCcxW7hgwoTLPkOVIEPHx4rdEppb1w7B5HnSgfOOk2Jr6rg23Uq1GSlEtUoBn33cOFdaK//t30RsgyUXA5U6lPKHJpvpkmVo7tFxJkG0eGw585GG5EItpqh3d8OgtO5XnU4cycxWA5+fknrkKw4zdB15AaPZYLurV9vCyO4+hYx2nPnq2uSzcnYYJUGvGkKNUNGH+Y+kuX7AmhuCoLn7ZKPQn1ypXwgp8lCs/XmU2h7M7RI2MWg1UrSjfh44dg3f+QwNRhTHUAiXc5OvW+NAeoxT3JQnk7cP1oMWgzZI6u2sx/fS0VkvBhRxLlNOYK14H9j1Wo6sLzzrz3PW6wPUtXmlfEm00zoE6JquLK8H0TKccK3IKk371whchoZ2T8su0Nz/85yq+kEFp+zvRTpKLm1C2upqKg7tVQuZ9QXZ0N/Q3deXb1eteOsrv+6ADxuVKFGtbippO2Qr3Q92bRFT/OuZSXe7jgeIysvkf1T4D0YaPtvUlIk5Mo6tAJQWry7TrMvO5Nk31N9cLrm3lDHHmizb6v2fxlPTUYvV2R27uHIEhRHR7JZ4+ZsNOb1SM3NWTkfCAk4HmgfngFa1oq9qX/91DwfIvkdUYnh5E7ysHNIwTCp5Q7fxy4YePPGuylsyfhXVEaeGUK4rekTkqnMjS/X5B340NcDOoBv19lIsr6LCZf1QO69Xw61OaziW6fmIrnR9Nsm6druW9ahsTEx5nIOXoJArHhXxlv71NPmuYcfBTEPRKPl8F8uaCEthG59JtdBPzPny2CjYkWZd2Ex57dzhzvn/4mkIMsrW/Ea/9p4k7WYVpnuDI+I/AQDC+z6EY/1AeKz08pIntvDFl2nArGdnymHdlgJjegdZE63IDBM5oFE3N47InsMsRSRYb3xktj/PdMpW9kOOGOJe8PkU1LaTuPj28qPht/CQX61nnQL3+GuieYim5NJmy/sJf7mYmXPZdxAqw5McRXTfyP4e2G4w0HnMbFGltm5YaFrof0NmNqJ1cPnutU4m9fGbwYQcxVde/zGrjXrOT7u0N24tobFbE7bw46tnDWOO0pbBI6sVfppnbOcpSiwtgkyrG/R5J4d6HxEhdl2g304WPzJGMNq4HYVqVSghJ42hKDJu/OOyFXDb4gwcT/J17OPQNnlbDlOLq7wGY3j0XA0i3HxuSWrO/NBvr7RDtKzXSS6c6ORg8BGyT8FkIfwoZMWKh10L2CM02TSG99qxsdDRi1bv9/VRV1ktgaqUjnqx+i2fL7+NKXxIGs+RkjVvf4VXqYiUJnuG6sf4XagMoH4827Pif3vauB9+KHk3u6+u7nJUVUlTK+FqfS80ZRStUv1316GVGEhoI5C4ct3aizGL1yevemQI9JLRXej5GQ2eu+s5qL3Eo63EwX1SuTkLjD9IM8qEayFv/48fkUczFZyKTC2zKfUkCod0JarMYti4dSMkiEOi8PVoAeesTR3/H3bn2+wIPznlPMVb0y5GhvzoPLWfwLD6cgIarz904JkERcRZkjnwqZzdU53m3ub9pRySIy57iBxE47ykutAdiUl4W6rKKF/VyhYsp7+6jsyE4NJ/3pegtbc1uKDBfP10hTw/dyid2lt656sGthGpI/LHFc6fepHYQd183N3YDkbY3mfCbEtt+MldJbBFwK8+0i2mOxjcIwLWtil2LRk0IHbp8JiG4tNgWaZnguGcWldRlG+qnWuJZ14v6xsJiDqefXPQUgvi9rSMlSnIxK/2IddNdEw8Mx6qhNFRtFAztwNr0xDBo48b0Wdm8Mv7IL+2VW4PWOjmQpxTQ+P3WD5/2PtPbvT1sJuUTV6s+PenTiJe287O86O6MWAhQrqFRA2YJsOQu2vH2e/dZx7P56vjDWescrT5lpiTsYvSRq03PNK6Plym380C2d7gBuX+8OLm/HY/g1YxNKwwsZSdYrmU8/+YXoLUS2oA7e7viZ9f2uuiZq9WQ35bH5tzkNL7sehCO5OYFhVJLTp0RF5CjIlajAceC4Cx7WVVkWb/L1rjwb/xWcuKU0i9LNj9Az1f/Q0/zdT+sX/xZT+P/T1pdHzf+qkPyB/Buf/1Rxv/l+06v9PqOAn/y/Y3fv/PXjU7P6XpsDg6Ouo23/4w88/+TN48j+We/9/OjXjP5b7vTYa96Gd0Xf/fwx+/i9RyG7CvXp0Fj9+c2tX/62TPix1PywHUVAWiA/LS27DLcr+p+6gR51/D1q9Xr9wtzseNy+m0+lL918d3vuXxY6hDnvupe9jGnv/3wU2v06e8Gb3vxYIgdw60tnVmnLtpC13u//qlr78mfPvsjcz/Dw0h2pvCM3ehK+TfStc62qd2+GErn02VX00/rroiz5Js6aZPCtXn46flHUXSZvNrdl1a38YqjMp+77hIWqXNVJtZhbWXKNCsknm8521Hf86HI077gesWBt/bX3vrPjrvcbyx248X5uGMul+PfH/r0PZHU8T1mBSIeuTG/ocAtRhyv3YOsL6Mn2aTgafDkJR44+G0S9mpLifh9O6O2m6sqLuut83HWaSb66Nuq4ZYeypCZ15/t5+q3mowdyJ13yCcNxpi9X3rssH+sEybery1nnz1Tf+gkcVSNk7/37QqylJ/XRf0xVSrGmoKXWUCYe4MYGHm2A+RgMVdcXGpo1RJP/VW0GdpnR5VxPh8DuZ0uW0raAporIgFMynlHoHojBGFB/tceHgW/AG4NxC5v7W475dIYA88aGOtLZzSVYZSYYpeS2UqAdkmYPWtNCjNqJ74/7kj97E2tfZclrx0NlaXp+jsSkXN8FWgcX1p0Dw9Q+t+v3PvRBAe1pb/82U7iYzxOaAIDAvONnmHq/TvC+AxBRKxYhvh9sl1AyOsBBeQ4PeAL3xWmlQGzPBzcVDDWYj61MTfLDKR1+qylzk0HYrGmPdHqfi02NvRyzKlXriX/LzWmACc/mrSnrm/xzDKSUbLB+MXK9MK9Gor04umv6+V/J6/8NyVtKSaP4/SOb/myk9ylXU7CKuEtljxIGzFZ0ER9h9Obz9iqd6m2cTlf/Iev5Ak7n++/YBc0wjEQUa6bpfFpsM91RPiDPSpbJCDYobHjXOB6/5vAX9h2Xeq2PBc4+ZDHodOd9EM8R24r604ZbQCtiiWUwvfmxdWwS/rHzshvwfg8dArNKihVfzX6577NN0XE9UMjeQnWhFGFpIWrHD7VO1/ucDwj+06tR79cl554p/mNJdyBhPyOfascSUW8jTe1VmdwqrZ3mbkXx/FogCLOqMzD4g2uBFyVscAe8yfS1JM8c3jEg5FYsAliY/PSrLQSdOfVjuTTlTH4mQP/dN0CjWWPzzzbYTcigOki/nvt+1RIH7dxrewMAhFY/SYegi4f+RSNQURjtyEGHy+bVdb6awUtiinT5ePQxLbg9xhp4Jx7EMrd9TAZSQnzT3CrJd/NrfS+soFQn+cuKyrSyHWUYMctVBw8OB2pTZc761/xC2b0drNTl/V87N9K3bo93N8YSxc3//hOplX2qA1sDJtLZa3jT3t+mpJrzPq02ktOs6Bs2HV35tt7SmMvoU6hsNqBKbLjpSt66qi28nfJsnPwqknZYmxy/vDM8HCqu7XZBLGhd3ssTing7bHpgWsJo8KkFCpyLjlldOaYN/cNx9blYXD1y8xcGj8qKnbhW6OFTIMAPXGB2//dwU/Z3pYlV0IrnFFitW9cja7U1xg46rDyxnZ2+Arm0wabBCjQH64q1N9GT3LvlWGYBuEGo9zj/BpwKTlVPbl2Dbun4KFHM9jYFSVnnsGRUaPEptqBH3LYZVPuYcXvz6jZA5e/jrqNvgFmsM66QRQMtq3wOX7Gsrjdrnhq63SxPHgMSlO69vYDrTGhlr0KkrQiZ5WmtOF4kda06PbKz7ncspxhTvKPUZrEPIzW2HiM+AgyslX9udRZ+cHpMhqJ2FMAFVSYmrz48a6Vc/PVYVZbMM+V/rJuk9n0fWE1/Caj1BoEzawA8IZNjWGsC6t5vRSisgmHRSB0vu6Gn4qhPnFJtOLU4fZzulhDF2PSvcymrYJzrkIZei/tcC8bGrqjs+SuzeKn6L19IiYJoLbX+RbqYcIWR/AN5INYfpiT/8/O3GH8L2AAy8zdExL1snpsLUOu1cNwuisUPtYeUsehkKPOeg80dt991xZ8HAyZvS2IJwpNNLPjGN+nznKturo/ky5g5E4gRXptb45GJlzeB89uzvH47PGywVG1M8bJMC7A/TdBQAkMKKNUZyS8FhoMsRpdtvDjwMktvRkvT0fb3LNek+rLZ0qnCxVdXTAQX2Jrh2uDhA0Pj8lfXD3EiM7ZNLKq2F5BcsJUHeZLv/r/OPXQ06YspNzI/lmsk6srD00HYUt/6AuLxOpfPw1lgQYnozXAmmPvxAFs7qb3bnCLW7g+rOUeBINCop4gHXRPK2h2Xe6CcrWy4tR0D71Z42steVOsNHBBQ1hS/HHm8UKenExfd61z3WnUYet51UsTq/ElrrAoNp/OtkwoFYm/SkK59/wt5wtknC94cyr3uVcCbbqPLMG3+f2EgGUVnLHreA2QAc8q5e2U0f+lpIUWUevjWVxqWvw2UEwpl2ur84qF2Ie/ncKk1kpc9j0YKzi8HF5VcaD7pnN+gfyn130B649Uay/zVHCy2TqYmYR5Xev/lb6ebzUiAID2oCJ5X8suuI8IuW4T6MZ9L3w+WM2uuBNQhIY/4ToS1ONHzZ89ebQ+vZu92ukUV4l2vbVlFT0PnERkEUas/sJ1pX2vvOpG8TXuQQXBFnWSX2dbQ92eED3FKGzza54mU39BE0YG5nrTkQlPBYFNVCcHsxNKv7mtMELWGDz/ZrYyvlKEOD+B0/SAEpXONuuZRWmn+NW6PE7jp40PFzSWgl6gwqMTtfMknMg9dharK/UUnzfhsAHb4D0s9TpL23FtoX0qyrHF7rtfqd0vmAHmqivrgTMBbIgMnWmzeeiNteqbASkDwo2ZZAvCfdBGBuqwEu7zgs1BP5Jhz/pIfTlq94LmLEcD8S8cGPwCdzl39WkunNL12+e6cxr8/JqaSa1v3bt+IgJ6r6hW8ExmgHwDLw6cbXvXfW1kIXXgqKLduFpkEYa3J9J/CyPosY4GyNmeqvGDz8aAq6N/nb789jM5RaCvEkG4wU3rmp0ugXRl8FqjhLg9ncUW/SEOB2UJp0d5b3/0LrCPu4GtQsGRq+u9JkCMFi5gbLbUd1NS2fC6JV8cQJnMGuIl9CJYEZJXZ8rsf4qr1oDF+roO8qhK/QbUBpTG/4FPW6GH2lc+LSFfTX8N+/5YabcR+hELX/ZNScGxxo5US9Yvn4JlIJVFdkpXnsO/NyuSkiLJ6Noak3mzO94XW30arR1uFbEUqn4oAsYqFvr4Fkq763EozwomR4Q6FXH++XAiKHJd1suuMnDvJAA5FZ3BoXY/QMGDzqod9bp/Sk9ihEqio0PAfMQevJBfoQshRFVqOt7ZQ+Z9bt+O0nhZtUzw72bZRW5EECqIztEJJPQDN+kG4OrlWfUXXex4tAVXOk/UKJ7NnkDnTM5hOzzCXUG4FzavLVkNNMdjv1RxLlT1TwVy1YlYnJsME1F/9Q0iU8yVFwP81P7xkyvDGp0wOrvtS+m74KVm5nru4kx3MT3otadPHvGhlPFpileU2zTz76UM3xQMJsdmAAW2HOitcWp6++ZSzWqa55g9fwTNhgXeH4SjahpaxtcRhrVmuVSi6U6r4o+Pt1FpYBn2rkoa2jZeMh13N9w8PYyOeNWNGwrtiCA3F32Nzzq79KbO7TUxCDxnJyKv8uHN706GIhuIl5UhKCjorPhmmzKFCOfqfe4eaO5ufkmRl4cQyVFcJbN7lKNauGbkpNY0HHsYSWMr0tCmE/u5SQNl+udJWpLRQUvOIeBX/eirJdz26HPnB3xGu9tzAQUMXasvR1vWqk8jnko7HEQkMeSWRvD2yrqtAj63I+Ech+bsYUHvbE2axvyfDkyBmYf7nt6iJJJNvIyF64hr2GT3nk4GXqWasO8/WyPOx2i/TnxIYRMBoV4RwajMKHQ9xVGrvLn3d5xvOSCV2WZzSOhtglePDmcJXCBIrTqKNsRYWUSZ0B7KxZRbZ/buT01Mu//M/6f/I/81wWJfwrzQWn/2eBeCm/WCoqAgOt3S8OniVRyJ1m8/2H9T7PNcFJ890EZjcZG7LsXMyeOfE/DN5B5GFj9ft4JpNQeG6CNSlPoCJMvKwDTYLBo0Qi65hFxEF8vUPGUEidOLBq/Et6wu4cvXFRjEtGtqtjwdAn+2g0macmIrphJKRBhSCeUTsa3DB6vTCO/F4GUXuv0SVWNXsyzaGgdfkvUUAemDaZ3sHLe7yZ/H23t5qrNXT99CvF64A0cRfJWWyc2PiCL1GdSgOd3cY9pS7+NMzRSii27nE8iSa7FM6k+c9uf5oBX6MZvuQl/C9G3I0XfUlRVsK9seuzDzZ+rbpTWIfnw7JDX9ovadcLxzZR6ibyZTUyxcRGUB+99r6GaYKBtw6PDynJbtvHABGoRZ4CJUq3vVm5K7I/KJkkG429R2428ufxpC4tHupITsyAz0ffsXEZCg+V4rtDVhc7iy8XyhtctVJXRmdgRzqA39CAFdhL0WHcOAjtNO3b9Ks4TSEGb2So3LHw0f46bpiZOa0q3WaYzN3BPmg3MlUqEIzUk7/QUWYpMoTG79BF/MsTKqAudTb1TN/vc5rRTd77f2wTjQpOhL/jda9fJfByre/xrs4O6ENuoG6nascemu5Eef9UnC2c7Ny1p55HdWdPGXkxMD8rd9LTJw2/wo/s1xaIZj98o/wKVyJ5lZtbXftWlTHJXrkaBZRrtBtZxMTUNC6B/RWSf4H9m0RN2Oh8FYMeJe77AD0WwAmexzA1s+/kp/rLk1rWSM8BeS/7UTvenmNnOhmZOCYDBj3bFlX9gHhnTFOMLiI8UodrT+V69wj92orkmIR0Rcoje+6tUgXEr1cWxMWJqvzPLpar3w2l6lZXFrxi6qRL1FqSrGhAhZtNkDxRh3wV3/ZyZErK2vkuEGc/9QJpLoyZmmzFctEE4I/4U2FzbLZDODd2vfuffMGRt8omzq9wOnP3Hg7r5LgvTHveyAKX8Hbizom3zFYXK0JuNvIuPqxVxGaTLa/V4tAvfvaEWhIVy7JzRaqFO/2KfiWn0L6vL84kdan0cCAKFlSL3VSbPeQjON0wqQqr/O34VB6BgsbOCQQY33wbVM3HL6c+6F1mu9RWJQ33RWYcbsqNtXGtEg0f1Xvo9OV9nq8DPSzg50LjncVdJJIhJSG0bGICVpI8z+AQzhYcHL/mO2lO5s6C5ji+M2bra9zSUjj63E/Lox8brODEsoF09t3NiI3xJ3Glzo/knrgyxDukfwrwgjZ/vuft5RSG3FvYaVqHcg8TJAGm2s5SbPdthZvkExuhRL30j/gkV0dLqbO1qFRJYIcXlCYH7Df+LS1lX/XsuX+hlR+nuNq1xHKxayFgq1XkbtMiX5jE4z+rvZEoOPmmMJwyrBe9Um+bqCRPi/MFcxy7pgsNnfXPGXsoZ+Ni/jDeiJ2RbXk7nYYMpeRVNwzLRwjOX7OUKcij8sC2kdXffj+asGpbCMutHeKEWZt5YgMaugh+JAT/H6EdbxnJR1GJHrrEwr5nPOkBib+IMZjZBOL8EiwJU4cOzcIZV3d7q3MJxQscUi2RjxPzIf9oMMlq24teEPCqIUHiSlGmaS29RWozeb2ZCgo8796pufpj/WB+PRhtyI1e4ZqVipeY3fTWjHp9Ai49z2/mEhL9HIrXxuKSPYFQEAuHzvHpoO6sQqAJHasFLGkP3KkLX4S49/Yo4n9caDYT8nJr5KSGx1/Dayg9hQsrG3Czd50w+ZSUIOSP0ibeb4XlsX9xDUHC9pmZU3Q5tHPw1xgCPT7yiOXed546zQ0Jrz0tvWG5hYZbV4ccxKaayiEXzquT349fdw1fFw7dnPkGmR27C7+kaxTzVhRad895T7XVuPBlMqU92wSArLe615TyWUVcnK+DbDDdV6aRms0bqWvMG+8F/kMarAKctESBMG4fV4+qdbU5vSvUMrHFRG1om4RvpFEP4hdb4gZ1jrEolve/dA1UB9aD8IhiZ+rxBlxnf7kA2eEaHxMWlsyzIVrYTik/cZGqbvoXWBHAvn39jAMNnF39Zk2mp5wQtkts/YluhqpLDu46lR1oDM6Gd88BQ9D2I3t2zkFraAJ4zRRD8XacgrGYMez9fv4sGtR0uAQ0JhUmGO6pIxL5tBR6n8weE58CTdgXeW3D78nIJLXubsU/bxWaXMG5+WgheiXho+0OIcvb/5h6p504uFRt5QvSZjKm64lumMJsQW+LH6WBABVp8pvPu7nJae5s+JqVMuAVBT9nAYvr5ktKiswii6Ni8sUG0I2QxPU4DydpsufyydgsVQSsDW6U69pn3G8X8O1y9k0JGdSWn3xiM3APmpARCTAyTag6u2nxlYlaDCgv+ulHcaUl4AOMWXd0UCFoD7FGWfSE9DttXJZDp6ZV7TVqvrNYfEYFJ+GBI0e2LLm5my82UZGpMfuzqjWG+9FRrXf5twsSk7jEzy/ptcYFw1Q1fqC/s39uTuLvY7iRxboevXRdy81qzdPH1RDhWPjzxe4r/OStvuOMGkGm69hZy1sHEKDAAWgDM7EAyOcKZOTbzJ+eafbKWbna3wdca2a7lrvq+fKBpZ8qTal1ZrmiInErj0k3un+7auYmPl/ovmo+AdOA2Gp0amyjFsIXss+OlVs9SE5oyaOgNTh5HN1rkgYmGetrY1W/4mjpLaxW1Aa4aHCPCVRHNshexJ3gipYzWre3oVhkOsPlkzlPBvM/dZy1StWsyJ2bha+p5yTEZRdSrjd22m/za9WTzfVdx9WSbNDjJmZ3jY5h9knBqFOXUYLtg+mh810yjdwOUdZndvD8Zm/ikuz07x8+n/Ib70b4Rp94SjiFSWydB21j7cYcWxG6Q6RGs+rZmb/AprBMiYIs89Sbs0aiCzk0tOsP8/0aITZIHZwW/I8Ej8AHl99W40N9tX1eSfkGX3g3kxkywnhDxeVP9rsobcT3XnSpd1kNcgX2+i/771dPauRZWig/KogetVYnQFfdjm/y3AbuPPnFS62LdmLqcEArcz+3/xkWEkpvG6tJnqPpB6rUnbj7KBFvZ9oI1NKFXa3LTS6kNtlNI4/gz0g6IlBzf8HjBMWTQuap6WHEOpW79wq9tHfzRFZS79F+C+WJ4NwD6AcEFgwBDVDCPZSp1XuVV839NNwoK1MiXfS7Y8bBQYMW6ps/viLdiuTLLS3BTefYcSeLqSeLyhoRl2y3UgC3dJTuZJIXtYKuAJsnxkgmkG4o8L1b7VQV/2Cn8voubjlLcX8nDK+LxVgz2yif5+LCwP5++mvNj2PA8KDaoAlIpnnBmRmrbX1u5XAxz5Dqi1fsN9DbKW7Q4ulC8IiNZwGzTJbr9apZnqZYzWMOx/sLSK2dGA7JaxHydJcGaKZbuDv1/4z00qQ0FxrlUqe2SEqJIicnzfvod1NSgefafSUJcL8nb3mWjR5bG7LKVmr+C1wACsCyw5KCyCRStxFCjAScvvdnQqeo27wfTUsnxR3otV4bEgfBjT631Gv1M6YVh+U+ObuSSXpcN8/0UXH6h2S+gFxv799E1BJcOLiUR+5idmC1G9Zwk9UuyTVmwBCy/tO2ZYYwIz5v4Wp1+NMPMIXuQ7Au2ffZN0gfAFYvZXltYPONj9NvJ0AFXgblla5FBPfPIaDPAhbp8aa1SpqUn3px8XVjJ8B+n0Zy/E7nCx73RiN0IQ8lxcV/fqJAus3AQc/I/Z58qjkdUNeXImf5C4Z/AeLi+TQJOED+dYCZ+zsw+CoIzvSx6pm6S3JFoGpESlui5uhF9snt5cXLUdPpk5PEbDSDNw9OKY3Ftu7XpAQd7c+w1bTsDpWN0Ovf9dfAtLfpy7LO62LHWR/E/VfD9YA727R2Fj6w49VUSbilJyZppsMVZDFqqk6DmaoDerETb9rS1V/mGg52IeX25i2eKfQx2VsbxiyLI8c/PmCCypBLGdvzDkSol6l17fkdRAfNIBrD3lRQ7IyhpZTZFFLxQ/EgFxJqIB2qIBvDC6qdDia+nG1/lCQdqwXoMGgGfZ/CJj8EhOcd4e3HC0p36bdPibfEeKFiJNuP8JzPfHMRT3rurgQmqxG0s5jAKhltR5xA7CDP1Nb8L+L46UtLtnM58nHjOORkssJqeODpR0QASs6ctIfNzJcun7UaV12f18Hi+4IQxIbp6FxwZHk9Hvs2GjYYBFvOfuC9CbZIkSowcepo5nEOTykgUHkbNwXx7sttlWcSlc1Ts8b7487MKZkNjzSt2kHRTjeIVFBE0mCQFJ4TvU8rwQ3XNzG9p8Fyt77JjIzVSYKooijGfWoW+Z4Qv9RmyOM9VhoY2fOHxYcWnMpj4CcwkATr6msiAfnevMzJBHhxqxi6hgwBIHe4/NR/Hu6UkAcSHXgzxUOLi0aFIspkYY9vp79Lnmy80B0tt7KZHDNLn7oviVn0b916e3kCxuRut5kOguJwgwcasxR3Ub3fpBHOafmSDRe/zBNo1Vi+tx/cuJvg1/C05aU8M7lta2x2x/uphK29FdiC7ElXy+7diBDNNfFgySx7kBcL/oblbRHjphoIdPXHt31iDn0hKv3tub6r92O46hJm+REYYfW++Vime00FbnSSdE0DyebAa/+gguOOP79i0B07OOUTdAaZ271pe+sv40sYnaVECO88lbZxtVa5G3D5YRyZLWGWJdU8ziOmAte5ozu03qtNn87cNEI1XV9Tk3F1lIIq82bElbn3Gx5X309qcX3rEfIhP7n4BExic9WRAOFiL5XN6FXR6zNz8VcPidLfyDDW36SfzcLa/Mk3mOfXtfpeUH6MCZppL5mvs/o6dYLRaxU0vFFb0ijx8R8r/sg1Dtb1YZAiBeshyo74M/UxvJUiUU99PPd8kh/LCtH56GR8kcsYN6zoZ8EtN+GPq7VikF3H73pEdibIpByXdvD5Db8PSpfva5OKfFsV6lswsny4DQIesBA9fkWGh71Sbw10e6Rp7AnVl75Zoix2LKs4WW3pOXQverIepyrp2ilWE5wj/jm+VUSbFmsJ7EU8oTGcN9JP60zoLQcm06H/UQyxMW2lztQhXpnCdvhr66e3SBikupRJjco7LSlbTyH7/tAjAWHt6/2mgu5E8oCAZonXfNUr+VbHzXU/GnYqdfA0nzC6uXnk5J+2yuhtmKHECqRZ+BCw1fQq+0s9K2g5GTXvlP6Ah62ZimZWTne/zZBhv1C8H3mQWD9Sex68I6CJQfJ9nas0EqmFhA52Pw/N5KT26fx2Nac2RTM4B3advVp+7PKTIif0wsSxiDvNZJo0Kb53FX5ETOt2xVmeuQ5q/k0DA4DCntenw5qbmjW+v311oyRMTH+Yr3jl4q09ZX1bvtnagj3QBoexfmN4yVfJjGAXX7kKwn3qDJvbKo9XUf3td9IdCdbloWcULwx9hdyCsa74FRzQMPUN3+js5AC7w5CpqU/W4XDgxTGBxH0V3hk2ilzicS4pumRzohi1Pl0tmmfWxWNbhpg8k7bN/DZZMmHi4NyBYyg6qv6IptnEYa83a73KMo8KdNWXfc4oA9dv+HA8spxrxH2nh1tTAPD40kcnXT8d7kw9heEQ6r43D0qfqYBPAt4/jcGSDJNtY2vw5eh8swCk0Mc7fOyJncluhn9lk7hDeckV2u9DiLT3sahVfpefSYF6wH+v9nfQUP0QAkzokyN1shyZSm7aS4XzTJdjxNZ53Uo8n2PlZ9hc3D4btRq4Hnwqcxp3iZhFDUyPsk3ot8EJL/KM9i7Z3u7LlQmilcF9ynvU5U1mXPKnXt684/ywbqVEqdVfGOyuzTYgPfvd45V7/0zd2WMTWwX8xUI8noqdDKAGTnThhBPvbMYtKnegP6Me1AKYWgrH/BOxMSEO9tdtsGnrv28VrRbKtvWyjccGVOdcPFKl4YS1FyVUeb0Kv7OA5/P6P8eoD2lkY1eVQR+y/QMD77JDyLntLzgjlhPfvKs7rkKpXZK1gTmgCTrFKni8oKcmJ08oWQSKFLbUnW+DBh5XYfGe61aqu28Ok9YKsQ2wMkw3s5uXVkOIJTtuuRvpxw3nM+HdfJs1cxkPnk4QX3O9YXftsgpvRgOlR/hpnn+BFzB6ymA9TS+MN3kaIusZ4mXPrhfx6+JEThoPqzvHwAusQ+VjKLBFOq7VwrhMuYBFqIWXoNPMty9ULhE4sNQXzFwI//pnmFJwtfhXF+F/y06DmjmxkYsfVi7f/QO8seGlcYpYbq/MmK3ba+/f/zIQbmNKXIk4bThFckVtAvkpIt6j4jPjtq4DlU/LozTQ9i59uwMr4ksoGqkxw/Cw0HnfjncEuYrRi8ZKb8KyMbPxmj8GA8NH73le89GFsIe5/iipUpiJ6u76tJZtKVttskzo1niNcTSTPMxHUH30+THg5rgKhRXmxil0SeG7Lymy8uGYi1ROAaaNxPSvPgT0Pr0Cw7a5dwcc5J8l/fnHIYR7fdVePzd2Jki9THW98WEvMih8SxZ3Jp+DRq4rhOenDtDrJNVtRNeIT08dc2PcYctaAiERbRTYHqLzVFfLEyF6rCej5yDy51Stnb8UDj62AXImI7GB6wlGiVWW19DpHO1yr8vPgZrVvDwOnr4ArKE+hFk0VugPaLckG6OCFptgkJ0QrUlBY2j53l8dMD5xPxZZIGpZYX7BM5mePwHOVLYAtaUJs3vjoy2zpxWWYPHKJ9LMrcGrn2vVulShCgcSocVSfabZd5rYM3Ym+1vPdTthAlpYruGTF0Mzj0/++rsApj5g/tEI1pc8+YGmSpSUBAV+t4B/dN36ddObeoaDr/449Lm0tRhAsdUxSKuSRXQdPDkBYGZ7FMWP20NoPTHd9zSz0/MXkeO8sf39O6wCT9JleKeW8UcIZgol4+lpZHHw037n15spb9CtlG5Hr2jdDhz5Z69cbQwffmdd7bLUUtJph666THWw7kXHHbuwNg7X5IVhh4lnbx62PR2wx2XCLGH49szodrwBlkEveqB6N8cvldzmPD+OjE+VJ0dHLhYMS9iYyaPinkUgS5XlBg8jht1JRx8B0wlw+fIRb6ec36WAZ1ibuxitu31vTV2c7w+e7vFIStquGXotiQe+y3lvZITGEiUUPbSj9eDk8/r+sd8jWMrSXkoqk251Qk68TjVeugt90nmqpzHfq+iMv5tGwQE7X7CHb80kqEELBK2G3ZZnxKZMXnLPYhf6SE1o1JEz1qbLQQDtqtTBZyBRZxPKNtaM14iaoop6o1YzB/9KdfCmUbxi6p3A8jC83Yv7DoLBQhVrqVunVRb1eXPyozZkypvZiopMlPErT37VrUz59LWwPTCpT9BmQUOR0MIV0e4B4QnRcCGlu2OUA2e2gcAb8ROjjuevVJXK1Vb2z5080O0N7peIMbNvge/vRYIWlbcLufoOVtL5NTJYp0jZzXczMJa/XXtHuj5v8JjPaFH7ETYHeNbz4sHfDhnXxJTVCtbNctdVQ521hbuls2jDWxvd3VjGW4jB4WyD8GRdz1JkzWR9TXQSSdWZKZELxeONwsHv09GLpXuWFzJj/dbj2kWBLTa2+aBz0oh8rM2Z19NYf2nQdpv69V8W+NxkRH7u3PlI5nBHpGtGjWmzsbjHcFoz6QP2uRp6n+954YpvXR+NfB4+R7KjF3YfxlgNi5s2zYVylcTAA70I5xlUL8BmNd10/X9PoQmn9IPX86VZQ5RqnWwchtJJhGwXuZny4USfXuyPRFANGt1ZIfrjwMJf4WECnngSm/X8rFVDsxxqblm+XJViNoZ7oiedP+mjJgD/mvtrL0bq7enlHvScPRqDWLEjk9hbZhejGt0ab5CfNIP2n49nwEwNPII3iRq2aq8jFVn1S1y4rPBYrCMjnVx80iAcanmKl/Evk5cXxlr+55fNxT8AevKskSCxtDP58O1itAg9AP6tV/kPxaJaVio0kCcz6tKBuT6RdB75BPBw9sAT8KRhT49D5a0V/xbmMe3JRYFRAge1cSahbD5A29GGz2pCkBwQyPTbsL79UQYbSDC3QFrcrGL9BFlpgBH+fFMh0huxFeOjhOXn7BkV7aBO3Acp8Fr6S6dK+X2159lavaIwlCPGkypVWgFMZAo3oxUZz34BJ42kkoo79njxj0p2a6AnIdZWI0di9LEeX9rYAokELtqH9yWz/gXj3hfJTD3Nm4B0I77INiiuWRUif9+ayAmleuOJjt113ncDNCgTA4CUFRaG7IZKCcsvH/HmvhRGZmd8ywkooUf3b79E9Y8+5+8DmMosV1H+Y4G02lAKUU5d8Q/jiahg1ajPDD/Q4cXjky/txJg2DudEjKVhf9/Q+7yvxVLYgs7pmr/wM/Vml7+Vu9MQsTP/fTGhGLN0bl55LN4/BUpe09Yc0fgdP8tPKvXhRoWFGx+45A2y6cLNQyAym1WJlXt6BFBc9ymbVd+0YWRR3WXE/pN3i5QGdTWWAx4HzP6V99djomt2wZtushJq8EmngpndTO+q419dEDRjc9dMNOmTKAD6ajfne18oSe4j2xF3VN50Xt22mzAsI1MAIbTK2Y7GpGscBeJio5C7jB14C/FaS4xCEdKAsrnOsNQbpJzIXnhhcVjzCO3DpC9VJvKtBpy83jh48McrlvQb6wH1L8xEb0npvk9ET8RYncXDpoL16OLgvMLnk62LbWA7bj6FfGUyNYrdJqogrVdGs6SJvC3FXYqLa7dDMxG5mD4NvCHk59pZwMun9fll989zcHLdYWZlW+SxaGCJ1dj+KlmgMskjovyoGpG7FYRLKGP+8yqNez+lperWMNLnknC4FakNmIl36eYlWXnZdtvTtLlz+PcO/wImE8e3Iudi6Ze0i5SKjZ2yv4DLOZNEX8IKUBlcv7QGQvWquOg4mXSIzuMqAi6XUNVMCVyv3d8bXOfI6cDUg6PmNHoxJhsJKLj65XPeRobEUeUjowXMyaBmWnQ9AX4dBx7bSe+0SdZqrFgqSqSExJ5CkTjhSc5+HKbg7Hc1pyYFRsKhznF3ZeNtLEnZfccxo4sYxuWo2E/fnT9brxYWD+pOfUvIQcl+dcAl7WCwOKNssU8iVC39SJRbjOwBcsHttk+3lIMFaarf8bWnLdNmG97ZXR7roLU40PgLRtDkZkvIGa3T6+CqLNlKdr6CacmQS8vlakROc+ASezAVzNdx84pO0+NP05zHsq8iG78Ek28mjhjdrd2n82kx7TR9W0gkt+8Ipooa381xZhIxLTdEPPzWg7OPkK7dxBKaKFYY0XZn9PCdAB/vqJKLMcJ5faAEPwtFx+BipWlwDPEJu7CnInCBfX1nJvJHuyXtP0aasx0d5RAHS/dwc4YmvZ/O94L9lPUIHS8oFPrLbkn1fhUGtzBC4BRB0fgPW13LlPuEhFEPEeg80gcF7ccGK3agweBpJ5tK2Q4as3cZK9XXUvOrHrd/3aGlhHFZ+nX62gD14OkR2shcwKLTSLlZqcj6qWgm1hBRkYY//KDaKzR09TS293tQoEnsc3i0nriXu6UNpYJqU2Fr4Vs9qKpcMiyEQQcu9Tl4eH4T8oY9qcT04NDU9KVapbfEuboSr1TwQOvdKOnFH7qxEfvEVYGGeL+9/Zdse2vI6cHbJH4gOzN2wtcHpBIr3j2DwBgmg2NtMtjlZJniQ6m1fVvyJkdXy7gubjbeZG1apcbTxPnzz0XW3VbfvXRajkG5VrU3OEjb7oSIbKpLP4vg2lWarzyaKOQURjcJJBnVEbFz0h+99j6bbTBF7l2aa2XkXdBOgqmZfcXP0u1UjWadFPWHqLZeG22e2LONcTiYi39sXfVzsFchcTV4D6Sc+6QqCN7qWtZFbp3DZCFXEgsxFum3/dVJPulufo2FWPnVAe6qeC51iMXYfKbuPj15FtHvO3TKFhI3HtyXewCI7FQvV/ccMY8P0bk7Ng9tGrl6w1Oqm6L3k3axxrGcNKPa5oT4lkvEjbX7dbDWFs1e5ffxIMeGtHB9KSX3ve/QtQ0K7/a681aoaTgZWC66trZwO/JRTFJnYX9Gj+52enZ7NnRhaBAyfBo5meXW5utAvRWJJ8CESv+4gUcgAT/vFNK25yzVcjZeUXpENysrJ1nQdJqZy5FN9e/CfoSQriKrvzQzY0CLCC9kz1MKWSTrXk9KDn5Eiisiw/J8Wni1V8Ytnf7zUnPLVjRv4aDsietkalLMrQ8U2zGiRlAYAYT4DJkZb87nGLNuen/F/RVmrH56+4jJjW6Z+LY5fX/nW80FZT5b1jEys9vXsvJl9Slet+fOTQuPDx1f+Vwn1DMpUnRr7wlPufeQuDecZMN9WdPfpM7ZeKA6o6Pf3369ETjLhG6ghBazcmqm58uMXTnqDzSqqCos0j0pVfb5pVGc/r3/a+cjmvv1yA2ucXtGq2KTgizYzXAlor6yiJ1c0SFt7G9hvj8PGb++5tCPBuos0jfXzuS83mIYMfsCX1NrYoRI57J7VoMiDocg1gYvto+WYg2m2VwNlGUmnCowjop3XIZCHr0Gmp2lZrvkCKotP/NUt/brYejDKnVvYf47ha3RVRvb0eiUpjbPCVJzlGxjGsrUGROftJLGY2jxyyjSSkLIWcB5hnc8+QprWmWkbQPSvEG6/axzLWVGXRIE2gmR+CtsCX1Ip0JXdBu49vREeph5c+yybwHabKlOMxXyIAnglGFnKh/659d6vuWIauALNqsTAsOhaTEji+iec+i4fHrovTeaVgzPlUlzFCn7jwQvorWTh5LP+6kTDXtZS8OG8LVdXUtwVmDDC8Ii9/ACYnRt72GGOL1ZTwiEUI2JRjhA7JeY7NRYqYYVUai3OpRR5oIrPZwKppBPe+cRpeFrPsY+INsfBZxOgjTfVkuw9K0V7lWlAuNpcN15gW3Y9sG2vTzzTPJ8yFP0xOFUX6lBhCpLvc/+BVLeQAwj6IUnpXw5SgcH95FvN6BvWybC8zqQua/31U3Ik6zqDYr8pikJhV2cExuecfA1B4pE8OgBynOmo+2FZYnd0Tsi5EgZS28Gc1ctjKjk9VWwNE6C+GumWimEvacdCNYL0d2Ggq0oymtnW+lEJWDpMbQ28/Tr9C3ZbNhUVTHtinB3ch72wI1eeINzMIQL4WSPlzNLyCFOysQ0npvuZcFSsZJ8y423vt6ebL9sDE1v8KeeZ/YsFNjAeIIhfQ+gZ0ZMvUTByyB8+CTZrra1r5G/bzssbvIrh3WSO+xOuy+wkn7jTICPsrEsrK16CmOPLYUXRGx4drd+7K9mVfUhyEuZeyWHKKw2yOTNgHX79kdmy/jDz9+K4ahCE76z1TV/YCZba1Hd68xrr5amlryGKwsShBL+7UDtr9WEnbzP4YZunRzc+AM5PpQ8mqt7NL9cQ+oNC9TSncVOJFmsV8T2Wd+klB3JWq/W5pf3PVEqrrqLZzovB+P07MUHebm37pZ/oRGZWjt6tG69hpendLfweLYKBHCjpHjBWFwCMDA/4Zof6MmuBGbHYkXqCuiaR43InqlMwsTc/FKk6BGSo+MTSEhg+gx1PVbGU6yFK8FM5ANNrFeEP7fErUK/3r6MbI5eUkqzGQ6zYzGY7juOVJIFaBKm/Kv52kRlfratUr760V20PdDOjVuiqo3G3E0ar1yPVcAb70PRYmUpfM0H0fWJjTCuBAJv5Hi4dRraDr4QlUQ7fwKgo4uqYuc4rAy8IIujaovfSdff8TzH4ueOSEou+LB+0yEqaTg0bzWMs6odH+Fjlms6R88bYg5v9JsHyaQd908GI5bGIqYRE9MN5GmtrL2BxVF9B4oz1VnSK3zaeM8ycH33EcZk3+OTa4s75zt//goBJw5vRMAMqHFkoqabUStx0bltdeqO+XI1lFKta6qvzRKXq9tbhqtjg9Nz7FmGunK98z6zn7ZLQPvk8UW3jdpyUNfGvpcynJxerg9PqeHQp5UwO5u4C9sI58xMtVV+iFx3cgkzR16GRpD/vrBQE6Dbnzu/n/BUlZj3jbxwmW13V0uy3qvXTl99RdYz9NgkjEzx38n2cwhBysHDUkVoBRMnojDYlR+fDM9kUi5W/C0/mgOHyHrFO+omL+S3XCJzsr62z8WRbC/6vTJpbgHPIDRGZW0JQ6QNl6Dik+KRg6ilg0Euk2uGi8DuuwGjicdoRVIXB7nOptlQhQR/nlta8wuumDlOTij6U/V9ECxsre9/pPaKx3o60wFoxe5MO8W4T02ZZ53PjUDcBRvHQYrAw05bM4j9wHAmcr3eaBvogn/ukRq2aeLiprPXWmnKY50oMJYrimE6t26558gt0hYzGr1ybcCT78nXpNMFjFpBrfKnzMgvQ+IiMlXzB+3HzBS5KIE/nutmDXhaUxn2GGWq1vQd9KkePHDEd8eKM4HHRiNCCIVtLiRG/46GzRSOFG7DqCi+uzORnHrHW3EYDYuDJtsXrnG2+bgnvnNI8/YA/HOlLKbOb5v1GsVIni1GYqHm6IKPJGa6YHaOQ2W6AHMC20wTfz8MCQpAffCamOgIxaAk0ZXRmOTIXKglVtWU46vCr5GVAelbk26iR9HoSAGw3L5tgBdIoZuf1iZAB8Dyh2jPJ0+fYskGQu9EJjPegdZHVoKYkgPyjkgYoU7H2xpjRLJWrj6DCakpIe+Ul38N42YcayejK/COmvOMtEPE4DpbcCdS7kt6QnNvI8WZLI2lnWqDpdBtpt9VK4vbBsQ+49BsCXnLafPqbD3lXQcy6+6FuvgezOmt1XkMGQU+OWyfznzZBKzwJD2yzg+oRJkkCXjaUPpqy3MwvkSJQr1uAF2Ket1uGROgt3jxvZbTi1PzcBf46DJ1hthO64Y1QTetCP/upIin62axBCxF39U4WYhZ66pP18jzczvbjMrOxPsBvpqaHvIviBFvr09XEK33/pmp4M/I9d/mX3GqPimcAgpuVmw5peMWOX1rXoLQMEimZyS0yan8Mad9APlLX+C77HGT2t1fGEkjrwMIZXuiWFCDce/ipNlIP64mGt3pfJ9HQzxw9z0mFDzB5F6IMyBKdAiHaSDgavqA2E/mKSDRwBQFK13XIg7hiQV/P6DJuMknMVq1YZNvTLty5W1RiAHUZn/4VHcxe9oETocVvlq4+TGzNLQKi7dXLmmH1McaOstSFUcgZCgR/PNdLtCczSYnJGEmIO/ONhKhBkjmdG42Eb4MlruLT+oWtsbvzU70TqpmQt4Q5MWvcmZfS1zdR2tVdYiSSz9AvYgrETNT/Sj4NAMUD2xyUiUaC4o5alfEfDKeubk+8s8KSrN99eGnbgyJK0bvj8yWFHO/2GjcpF+WceWNWAwspAf60cOZlc+Bf95b003l02xMlmsNb0/zVtzPTs+uSvKNUEcJqa8QhUdk092k+0pltsm+oQnvNGfNZkQxywiIciiU4lmrHq5Q48Jc8XlgbkVidiDfQ62tk6jlkyPDMZlG6SePtOPL+4YyBRHm3mbVpM6WqWmtfVp17l79AwjLXZSJ4rnzEum8027GQn6D1OgZbUpLc1hqY7bsjhuF0GJgZ53nYF07+6YNy4sWyWQ8Hl6o2ZftDZfSI2R6VTE96v5H0Wy2vz6u7tHTbDNbOOaA7pdZH0dfAU1iqnPuNzlfd6h2bKjDpat4dfqRch82zuhaz9NcPKO56Nd1qlkAQXi0oX1/u14TwWYSvYbG/eedckSdIdffDqKlOppvnl/MgCeEDk82gHQGe6r/Kly8hSDZkw3L7rhdHeSUlLb0uPpjRM6yRuRyZ2Jc6y3dqBMc1AGX1LVkYINVNrDhjtmmB+CMY30Ppj3rvzeRAFRpDL5b4DrvTqmx6dvDfogaVNTco7GmB1bEBcegfIXbBzWXmDbOdtPKUwRv42lRGlScOBgAuQAahuSrOiQG/LGV1FboCtcixihcSwfC02eNnj5iI0vBp28NJAo60sjjcFEuMQjdcoaLwAt3m1PLSLzope8SqvmlJNzi8ZgVb5DPx5t5sEvFf8x2GJuegUrm3yeSNh3pS592x4B1/B7YFjnE505qDwC1SrhDl1sD6sgjhFWGbi32+2YbJ0qb/DGE+IQFgbJHg1lGJl2vteEdO7Ph6Lzqwu90AaVqBpj2uTzFNtC/6JovEaiKpUwHUt508By8nr6N6kQhlPVGGM8saAnd0/TDloyEJ83De8JyQt64XsNl0V1yH9TYhuyvMKkoINnOPSeKCvt17eQ7h0O+RGjNq7pL6Z67oXicUd3+mvOoMcQ0du493cRrIC6PwBCyPPpte2ARWrwfsVbFfqxvD/s2lqmeip/KPBH35ecrNQCt9GZ+bguI/XXwnLTio/zdwKRA33g2M1/Nt3ZjIXBqES03oCPpKpLfdlrN0dbt04FL8I1u9wACfQrmAcWipmtEsrI1Pt2OfJwERSTgN2aZYylj7IvebleIVDP74xzLvv/yjLmd4lMz1VFI5bo+bvb46RzkMm97udCQyN6nvEi+D/PE4l0qPiyzNXYxy2ZeV7XvWrWsDdIQ9B2dQH5frCQ66sFf4ZqsAkPtZAnPTH9v8+EEYm4xEH0/uOfo7BjeCE7CXfWiVw0QNeEu7HsjbGPr93GqoXm3S44WduMNs4K9XLhkc2jUlzUKaNGdaDsZn5/b3rbrSTa0Cfgm7wfM80zxzCj2qeinqtpLr5nbnMcIoAzPJhiR/nJ6tvY0g2nk6NsAF/bDsff6bFIWzNr57NSND6287q81gG6+L3fZ562gN/Iswtha4jLZNxbMNv4k4zFxCi3hAWlAytOP1NO0up+5wMAA7k43D0ld9WZyHodQK0YLLfcmAL6aWR5/2xJhT7yxm3fM5aMn3N9thM+/WzhR64MHUWV7sl+NhDek4UeXixWqp1YoxaQTd+MI/2m/5kybLPhj/zjg6cDPMdJiuC+u1RES25xBTgB3kecnaWMV6r9t0NdAQXW657nvgYI2EwrJeQjw0ozgDoFKWl1krtAALT3DIH9RcEwJdgPUGDq5XvslVbLdUQDSXt7nWIs1vSlLRrM7r6ejIj61Oz6bscBTOQw8ysFH6zyUYNvyzl8iObihh0RSq/Sethm/6n8J5tTE/yHsvZ9T15p1XUkIkWE6Gxyn7eWcp8NMa02JDAYsCQVAGSHABJscFNC/frz23uece7+qW/f3oa5uDan7fVWlZ8S/aWLeey8wpbhy8eOf4zQkgKKXdCU5PAIAXIkNqQYS7DNtfT7SP7XouDsjPGks6iICe3a0yovKH0rOCITWT43NXauodlngcddCe/ESJJiKyPbTCWj2O3JmVyQq4fpxzLZzRblQ6eDTAqwOdzhfKY10pL1QWZxgbKaN9fXzM92ypw0usbOSq9HQYFJk4ylbL1eC70fUp8Vx7ZAtFphcdUZpmwo+XYanNbIevabBFy3AvIqjeC2lZQGvvhrFRjKpndmmf5ntBBzlsvsc8VQElhr+8ZbjCVppO3ccSM6s0EAnRDWdKpZ4fpF63u3u2OmDnzeOI4anhiMX1wTlpOJyPyt3ChVMvs7v1wFPoKWHwE7Ovlr2FXXLu75mBmaa07HCsKPFOp6jjORoMYlW2RZiM0kejVJMoxoKyMEGhZ0xlxYnT+DJD3rIAt+cbiEsfFqBDBzwOXepaMXMATNc81yIFQU3/878Mw4mPt3Vqtfqvd7xWdcWPJnbEY5hKvVXTx2swkqDm7CWt4r1iaXV9SFsEyXfllq0WQDvpwa44eLHQpFD0x49juF21fG+3XvllPbvzfPglAnMfFdeox5+Knm4tMgKVMp6VIrlhaVNOtfTRtG/PnyHZOxo131sM/WoI3uwmElrgyb+JqoYhlWecs+fgXerqdXq5xy/85qzvkAmtgCyIollhw8CKUQUpIhzlnSGoW/2z0q+Bm9h38w4GNvtjFQvg6zuG28qrmRv7ovp+Tn1Jmf6dWNiIwR42pHScHbm5sda5Q8QHMRbj9cHNkgzjHjNCLXURVwsx5nRlEo6adqXs01dZqlEGVt8HTGRYW3pH8DV1Jzl0tqJrtThis+xPYlopZK+om/FmIWi75zYoj9933+L+Ii1xPY/oqVKzNfrsdYHNCyVqtp9PYzQ7isMZ4s19UDo9fsbUlua0Y+JX6u9SZX3RjfnkfIqxHGFkQ4lcqkr7zfM0CKO9LmTlF/ybWk48y6Tke/eAczay18CHuffHJ58D4iFsrZ1NEHEsks0Uhf6kJTWlxdNX5bP/PgxrUGQdusRuf5Rv1DPiQ0+Vps8NpfGLXrkqpFmvOElXnCraa4y++N8bbeKUMcYbOKVzHQVDDiC/HCv+DPKLmZE1pmIa6NDDyn1vaHdnT08XWaKha2clQygATXJT+LzJruRp1LuqA2U2IkweX/qTcdZbT3wsC07Eg2eWu+9VbNOwPEp7l+ZUYxcCeRYcUB3LluJBY17ok01+/iyeS02SmPiW7CX0U4Ut15nhjkhFb/b+PlOcx9b5WdMUHrrIU/sU1X+OdqtZID6eK+A6U7BBIpSNSJGE9DXl9NxWsNr20s9wsbhVx86rq+9eL/64Xyd9m3Co+FxUsqn+oBTKlWh6c89c08RuJuXUml9ozSJ9erQyeZpR/2Yj38QAXx6hI84qwPXR++Gm/OWDYhlteMZMpuCXXdMwPcTJxCvf9BwMDhD0PupEKE/wPiwxPq8F+O0OGwlw+0Ey1LTd0qxkN8n32kJkoDLi8bA4EUMleBuI6jKT7mzz003YonjTWXv5bCyIewoGwziemshRinmUhk+iNPzxaA0DO1UDm1gZnEdJAN7DSu9yr9F2jSeXqz305xFLK0MotR1xM5lFwmrKLFIdXm7kmVZ+cysV9kziQO9OpUZ/d3dExpj3FMDU6d+S7b7H/XUvPGI/qWCiQiRPM2yQ/ovkcQU+igcemq74f7i/lCqhKFFjlITvHOwg+/w1/xALE7eQtIWGbr1VGUsTGz9HHEANLJCp3RzvjYNJITXUtmpautisBP0OJTUklPxd76EukgU2Lu4ifhlrFZJL1sLY6dXDNQDnBorWyfBp12yMkVWgTEk9i6N9HSW3vFe/nlzY5ny7lrHia98oFol1UnkkyIFLm/Zaai+syYF8gy8XnizwB1v2MxO0cqL28kr5sacMt86u6EK73rgv2GyM+6ADmsl0ueVxGLz5W7P/mcO5+Pe9evJLnY1kPJ6rNa3GoXC+4FQtgEpQtSrw9IRTkfnxafXUWCR0fHy0pIiOg5nFa4O2lMrgj+iyxjfyNWiBJEYtndR882us/n9/Xapuln828dXa7Q/jdL1j14tWzmfVqr6APLk7mKFQOkPFrDl1OnuyEXO/WbxxiG553cNTHx5rYS5RdkbOKoUwPjn7bQYZRjs+TO47Lvz/eAd/367OOu2HTfolIfMPj/pDO5Qd2nsfBWT3722IuY/Hc60ffK49pW2PjVs+GKgRm+rRoxFrN5iVwEzzgXpdmiZv5zK3uiogI0o9nZj5AIYtFX6AcvJxAWK5YQp9DE3WT4PC1wx0Fpl25PJ2z/DUMOcBE9cT0X3JNX/czdcDIqdl6oYkKbgNnyBk1KatPYMfEr6Z86PaMJrrSSet0ZFEHHd3bxHATIJaHMHvKD1VIHF1yYV9u1tczHvCyeTvDMsHKX/WMNMEqZuVoxFbmn0IaUsOSRbibtgUHihBTTnrE78WJFp1ljx8Dm8BWI1fLq7ZsEYzIdy2UBAF/bAR+BgtYwK2qujYUdj15WFkYWhzOz3SxkYN56zziqw9NH7wHIpGg+DJyC0SUnA2/gmZbAmUBGjCPq86hq9tHR88gW3x+Ej7SXxjqRcpa2te/rLnBETAH8HOaYkATTTUeVo6/TEtvgS9b0sOXv3876ixRhNbebu/cxmzyyq5V/ZhIYt+TbGln3pC1/lGnwle3Y1jA0u827o01DYhdXBQRMSN5pzTwQ28pYVUtEKDx1eGudZI0e0925tzMz2x9I7FhFlFDr8oJtk3DE2DoCOFfpW8EysHWp5NnodaaP+6TkOlkmZMQUHMzfXYKH6IOSSPZ4NwSlkeLuMT9v01cPPc1QC+vAaCzsXN/4JnuOk/qwQuC6sVtsDqd9hoQSiXk6mAjP5HT5Z7TS6wHx7Y293fg2EAluGQxbHBML4TQHSDeoqlsrzdzaQkdKBXw97nWZxc7z3l6xSl7mJtmqUVDLXQHAEcdNIVN8qBfYyHns6jBL0nYmwthF/2YWdOnukl2pSvqYuxhyssCwtqVtr6y9Ff4UBOlrNgE9+7fcNclCO/iW/8Ic1tLGpJnE4HfgDUiOiOrM7t4rT7NwWQ2/JpuP5K9KXkZqRd8eT0M7r8lBBIwuXoO/obDRaUxztC2FsvhAemkSiDj9w8DKoCu3IQ7LJfcmThCFpwYmOXvvdHdKNTd5OkmND3O12y1Nm+WQN6M2jfeByZVLreVxFcwuuowBi0NELDXAD8HtJ2kPlc5tuR5v38Gw+0OMSCwWlNrk9Ev1bcYfuCEvraacIIlJtD8bt2Nt2ZqNULX5JH11NXZgj5XneMkXPwD/QIqMZLSguPryTMTRXNivZLP+7yMz01tLZeD2q9n2xwzOw5rgTcmh1AYYdKZXwEQYm19LlwqKao+hioEqwnp/bAVO0vfNzmJ+l9iaZ+RScF5Fx91C/TI8FjN45HkEg9k/TOy+mgsGLH++jom+4u0qk5tmhrIbBrjkrgMvTSyFLBRZbB/a78kqEBipThZx7jjEtq07H1lZv5Mit6yXJtoE1Be8EYwaf6Oce6lzh9YxnijAk/D6EF/X5diP3V6PiZGCv9ZEXrVekG/IebE6KBPYSHkGzzC1NxpsLX+IUyoh+fGflScdwP9SJRXAyRiMO4OO4/MJJ5utDryJOjgpjmghTm39vk7LcyuIeBzBctcZiGHB8gJB4N31UJ5WPz0msG7LnupQ2XZr71/mNJE5jZahgm0WP/JLbltAPMVkkmsAbS0RF/Qkq+SlnfxCBE8VbZP897fAW91aBeR/uTqhR91PnhEGye7zZjCpw0it9vi7P3ikFCo/nP3QP4DBH5wdjj4gj7GjTP5UBSjihfClAmdbT93AKyKy15JphXJ2dnZDuOCdmfTLQP8Rbcgqz+hoSXx76x1PstZZ1A5+d5EEsSot29sffW0JjMihvegPV6r2aLkk1V8qhTPBpJAsaQCOyEXOg6O/FSo236HAoUo53q/F/TgKiumNkc+UJMOIT7J/3XMXs78IS4cxHufv30QxkffDN/ka55rOXnDGZPcmLILSQ7NBO4hS8RjyyA4itOGE+sO4t8Fh9x3PpC7g1y/gR4CaDkENwrLmmYFUAL9FgjOtzc+jUlVD7NwsdcDZX45fzjTGMArsHdS5ahF+rGoVy8Rfsm76sdUEho5chpy2fV0wKqAdXziM8ACntxxvJziF1iVJIom+Gq4/smhTyUMmPElxCgnlg+iLxZ9e/N7uiXOfT92O1dJPHE52E1lBs59nHVdVN1cDPuMOCcNgfjSinlzw0syV/K3x/A5IOvzM3j9hWGO0EDl7DsRU20ijdSqVS7vKdksrs/c3zPkPxNTz2KJv0baXNv+WdALKVJMakWRYrWuERJVF7w7CdTtGRCasMkGJLP59lrn7z2p1UKUnGK10owFQFSzW4e3HO9S6D3XI6yd+EQ+ybZTU8m7Eq4J9xHx/WIjGL6kjovFGxmdTc11f8UxxPN8rI9v3XPT2hJ8w7b4oM/kkEHCnJrten4MaHb7ySBSneQaOzykorL/PY4+bvEVlD6jx43zBrNJuRtjqJaEFaHLfWM5itNxo31QUd+DYYO6Ou0I3PIRCkKF6dzNLGfoNPjMAUN585KebE9oqKNN7Hxt3stk0bs+rtl+NfZctyRL+fQ0jtd0LQypU556zmv1EnapSdySYOqhWFzWfwnrH8AB61sr1GOvrN0bC+fQz7HGix5Vl3bXyyky7ioAlwjBBk0v4E0D66hiPBOjCp3V4rzY9rUXRm7ShNCPISe/HCACCWvmyNh92Vt4xZowI/vfOme+RlQ09wz/nVaqGJ5Kih0Z0n7zckiy32WhDEF7r3725JUi+CF5Ztlxf68pODg76wLT0zhTu1WU0gThAFex2Fg45EN+A2QRSs8y/7M1FAq1VHuOpY3BqjUtU1VxMGcol93WSzEVsCxBpD/A4QFDA+vLL/2UiNvFOQBHexryk3t8vxC02xiPzVAh9Yg+avBb/V/1pCP+UOtH3h8W0JNSy6Xl0YXxqmlI4w4VIdLGxw06CzaDTdpAE3pfbcNEvM8/MxYKkZ75ejVEUEqDY3Res5W9q7Sa/tcSzDQsiMAYcZPT2qJO5ef55RKj+Y/NjPNcIPWLe0pjmEGCX9Eb5CRa42i2wK8a3CiZ4FxomVu5twtsqK0PqTasQIradFG64dboF9aUJRStnVLC9o7gXxToZzsYAH2MakSMzxADDx4DopRWP+BY6mSwfuI/5DcjCaq1oy+9tWKDaJXaf3t4bqq1C8dTiSi1tJlLaH+sjaBHeCj/Xsm5ndW3lDZ21YH7+NEqcFjzsw1nzDP0wFSp0uPMks0huQCwIJXOkTqdGPnmhInQ34g72mefPw8NuNgNgie6XMqJsZKrYUbSfxAV5wnhcf+IrNvdn3fgkoZMEGy59WkaEzOuXzpbpsr4OZYg00F0S5cWzCm3YVovjHLCIJh8p00l58eZjPJ1SgNLy86b+Zx1LfKEQ+tdIC/lK5XOiOer2waihA76mUQxI7hPfE6pEUmbjyVJzjPbCQiiX7gL1qF4mHj2JabM18Ji1iD950Uh+d3Pt3Q1tlprl77rDAKxBHm3JHUd+SReVqSqSHldQSGM8XijFpXkIZ5+ZjvyrpO6crkt7zL9yphZaAbUnlleX0EKlntE3NJIpnpddY1AKWNm6A6mucuPJHe2NmIQbSXExmFrDf56wScUnfCyWq7/lT/JUV9StP+DxkS6Pql8OCS/LZcuUjKoxSFfR0DndEXkm//so4C4BLCSkwWvjm/y7UAgnIt4QOXceB9eg77OxpqOty8G333eX01FyuRmP0x99HGwkyeHzR6+dwzucY4iEaDwSQvAjTbCnYj7R6CR2FDpKx1Nu+QJEx7u/VX1cdEUst7l3sCKfy71ibqcZL7QYwOtd8FDhoP2JmiT9rhxr64vgm2GilGhXh0jNTR1De+GycPG7VrOU3YDSpzbPzZU1zvt2bhWY96785jTTRru38evrO2n/6/lKEGk4LC5bP0O+vgJ/UHHinQRAMkMlOgjczWPzs+FJsKf6mb3MVZc/QYYFVL725+tyeZqqFtj+h7KHlsjTf+bO/FlL60Cx6DkIqWJ2AtCv6qmIqAq4Jsvxatc4RokoFhtNxGQp4bMd0ULPbmxDuocG4xUKQPm5sc6fz/bems4/VH2FbFk8LJojEXGd/wm0kQc7W9lV5tgNVIjupJGooJpMNvVixorC1geaktmcmplHzYtkLRysu7NOg5obFooEPtykgsYkQdzmOEl0Jec4aATsIdEOutAO+fdjqJsCy8+XXcKIWwKnC9WraSBbZ9BUnCDlzbaOhd/v+t/Ykjl/fj4/ehPrU6X94N96zDm+1ZEjRfHl4Wr2QOmmWL3gHYE350iGSbfwSRr6/phgfsbxmOPgdiTVe1RKqxtFi9KiZjucSBVxy9SVHdqWuo8tXj39TOvuGOB5m9cIe1wd3nNXCa1Lkh8+RfjHQ33G9zUXGuZwWwy/I7rmHqXzudwTqOoKgTlt73VFBWIMeX/yrY6EUn1JIzpn5ml3RsiXGuX/ojfdB/TQULy58ZkCbDRL1eAl05BmtoM0b9mlrzI7OpHKcT3779XiFqrN+6tZXi4Roo+N/dUI5Win8BpbXWg6LWBxoDif50IyiAsB8P3C0Ul1z5CD3EiyFvaDRRk9vtErL9MFHkezqyIaMCt4V7iPSm7oiOzb5Buo735cCFel0NOE4mTeGdMXnW9n8wCSlEgbMSns37Xb2Guc3o19dls9mnyHJnbvz02aypjtw+f1xCkkyHxnkzrVOIJCfzDFEp0KHAOpMvUjP3kR5cUyCA55z6ZOtd7LrHEURZq+y7+w4zEfdiPfCz78QYDQYKDS+puMIDvaTJsWGRKtz0Fmt8x7JkXked3R7Da3AUXMFfjwUkh1UphAaCh9NKpyApCoJChFCT40AjTegpQrHq9eejR4UXQ+OfjTVUqq9fT1UtXWeNaf1WoMYOTc+guVylOorFzpaWJy9+ZJh/IoZbwedqToX+4YgqRNNzdFcLDEL9woyx+erVEVYdsVQdIMEpfGk4InMWBjQE397qx7e11dfx7YDLM2qIe58tbA3MkqPOsJK58sijkH3K2vHA9QBRqPXaN3eYPtsPOVHxyy887Hy2oLN6HjthaeHtzEaLWPnZ9bfeQ/m7K8eo4MqHX+D2pEkQoywc+avWmW8y2tFQ4y3JQJEG9r9n9GCdA0BIEZwn9s/UitIdFdy7Tq+bnzZwWMagRZaNZq+QxU6xvBrD6FxcYCxa09bgiXUlBErqrTewY/Jk1o/XbXUu9mg1MP7PSAKst/nOh8rymVqOUDVPWC/lvZXP9RM7GvZLfBMvbbp2Rb38v/IaXVWAiJbx+60M9r23mLgUPCXGiNy+pmy/wsdkYtNJJbMUkOaoT9tSaJ/wxibGy1tHlsqFRc0iUtVbDf6ASq5ZxCGXgcldu8ulasDwYkgVdlQNrg3fgP5sN+JpoDbosxous7W9yaP5aU0DXV56RQ0GpVbYVx3KI7tf8Ifs9dJeQ+ma8oV1vZnIy62IZpLrUqiiTb2pgVTs7v52BuLFL+FoRAgGTHf2Tr5ktxJUmwkT4SLqXJwZRUKLfRJiq3E+1mxn25wFuu0//ZN+hV083tMx0PGMPkBySVOgm6ZUCOo4WpsSQFtiS41jXqYvJmBonvECrFArcpvd9ahsiUmwRnxxKzYAQPnNW8MUvj7/gYteP1X1u/mXNpOvWxIGHA7GY4KpAwydfp38edm31lxo3ebjrr/iqfm5Wjx9HSPQesV84woVMHnuj16qZZ2NG3rqAdZ/UoksbNRyu3Rl36L9Q7BwAVCehaqsVSytdfLSKu8VtJ2gAXx3Mt1eoQ2T5VmNasoDT5NTOz09+bvt3Enxn/5tpUcsRJqQnXpdQHFjkN3mxaTqG4e0fG6/1BKq66pI27vA2Vt03kK1+fALd62tuSY8IqUroorW91kObr1wGu9/KN7Y9dXPvkX950aRZ3pH+Pe9Kz23zzz+r+47+P/Cz9v/gf8/Pw/4OcP/0FKf/sPkLj8H6R08z+w6up/YNVr/4FVr/0Hg337/4fufjv4f/PMlf9Y3PhcfOb/+n9y1j4jW3L//+Ss/kdk7T9Q8M3/IKVr/3txv6h9plE4KIUc3c/Ftrzle1qXer3e9c3xvt0fTXqfkYfTo95sZEXY6UAe78+/yCYbNZr7Lr1H3LStod2+cR6vLUqdlv39VJqPP9uvVIH0wWJXD4EXejEVUbafJ7oonJXc7lrr/s/XdVrzy0CUZHiTrVIG1imGPwtc7x8k3wYxtnk40Xrru7M5+5nzn9CONRhVpz/+b86fBZrWV/1gZg+ibOOAim5hJ7pnNBwe/94GzT5Znfy4VUajfxePndMpLo9P9OO2Ve6lzduWrLwf9vvStHG67N1lFbKses4mU/msAU7M107JfJ8+sA9tlP2Yxh/ERV5cH5Cywwztzh0dtK9Mr47roHhT/7R9qtr50Aee8s+9Fv8hZIKkGo9B/XcHAwbSp4fTsdAqfnNbvBVMTGTsg3qvNMowu1wtohQR+zIrJ7KrE3cCLzJu8GswlVSnDoiZv55yA2dZk13F1w47CeT89Lyyed0ug8v+TDClvwhk2AKTRVd4Z2XLQRyZs1pzNBqEOo5CMWznUeP/4r7/JaX/rB/z1RgPvvj3OPw5liFWBw6+aGNe3xO6wiPa65cG6fDAoYl7HA5t7f1MU/A87nM6J0DwX1K64e9vp8jnwkrGo8ekXYKAOsIjF7R948LGxW4BJaBxPuCqddaopnOnVBJcu/jT4n9I6d+SnKsDpyfALOUtbF5nFvAIXnI6wP8ipW/9b6w6PRer/x1ZB74uU/8fpPRGrLSruDJX24Nkgto+3hTx9gpj1hDzae33mVnLy+a1Y8gPaSdV2kxMXL3cf5HSJ1MHt/vwL7D9PJe2HePif8HPX/8n8h3RRqOIzIEpFp6QrSCP0KvH8GAY8n7euphJ/TQ+b12pTET+m5T+X4uppOq8ya8U3GR8sX0+imvuJyOj1hv+OLKbKVM88HizwMSLQWm281HJ5e1yaHKG/gvok4m3+NzzO8OBUvHvb64fIDEh6xdr9Xh5m+JK/xYY3OpcpoGdCjbbw+4RkIs9UKQ9Lp7mNw6jgmQt1r0FlQtp9iBXK1U+I0OT26zbPRD5f//Qp/EOCfQdz8HLtTKhyM0HQP4Xfj74rzRqM+UPG7ZbgiRrK0pZnF62LKeQfvpurU/0hryzdturEvRHBm5RM6Qb5fZawThRlhbtY9KgW/7pYrpoQP69zW4ZNuOnXlpUVmfuQY6irFpcgLrOBRlvqLOHuqJ0vHaPon3w9bFqcAnVGwW6HgTueGcfXKLaL3FuP561QE20TvUaIUKl7kQcnV1b4a5GOOe316V/wcs9qj6TSfPD5Y0W+be6GV8s1aHA4CGN4wKwemv9AonFbH641qjh9zxZEai6JHD1p+7TzC3GxA6LJOLTjWlu0Nc8p1/P2hYs1XcvHNTMLTVZFFIb5bXGXX6fUhTC6uAaWQ3uiiKUInyvv78PMBWy/ibNiRNH8+Zrjvm0aRLEX+aYeGTcZjlrMVya4NOi6MnsB2SSoOfp704MPkDf/eFIWeDGtbsBq5aZ0vyFhgJE/pFn5qZOBy7/C34+vz23dc1PeuRZxZjLQnX1/TQmo/XF7EobOts+quiBxMNfzplbK8rclyAnlr2VTB8hpjuxaYDPVMrVPgS9XZqxJEusozNvlD2fN95LEqv9uZoZs21n8aNha7266ViZnFfLPDLbKpTlPYFqjUvl2nEAOuMA/1h/hgC7duqyhCqnAK5XJ2j4kCCNLdY25Qk/PFzvxIfzpXP7nyiUTHqhMwaaXhDthMVTcDSaXw+B2hyezvS1pKtSXDF9M3bu+X8WaNyWbXvbH1erq/ItUcnRNUzbKs3qCcLFeFEbouOXewSfMMW/TwZT87nRbiysmExuRjcE8gOAGkrBufCXc39eN0aj9LnLdV2pS6q6trLX+KDFYk7Ml0eGht11D6obBllEcGs6J86Cg5cGBj8BX1tF0mFvh0vy+LHjYT4YLl5LDQnw9s2N5qIlR1msvdyzxMCLXF3/fuKS0ZHueRzO3pG+278lLfiF4vdLIbHCyy3tPjVrCHesOxOXCmGvwx8tJV9eGNWpk6MmMPLHXbP0nA+ezguqU/vvh/8b3fPE6hdPyNnws+fWvE5CsKnP3jQF48bmouzL3teHchStn89suxXCCdHVDK5t/+wroz74+F13QwHEqLwSVTm+Zly/nnFjoZytb0mpQHMJa9sjrHDxfTc0rVSIrw+sFA8N25VoJzDFt63fINHh6DxaIjfNovTcEWqqfb31/NtuSv3E0wMs8ScDSxbxuhGkZTd2vYoRpJE4U4dkyTe1TbEE5fcDaAq2EjdhGFuE7MVsZNgjy3p/Im4bQBHsq84Up+ZW+RYyA45h/1oAfq3BnkNe0I77nrxdd6rVmXL7+Q5Sk0FxdiAIcXNDHUqt6NO3TeB9CivSOtF1Jq8Xgy6/qCEEy/Hl2zgh1FXhKAnVxZO3LpBm1wqb+wFDru4EbwlApbAWWBnNiimevZeeCuSiltkj1eEkdPshOLKOw2/ugAKbSBS8gF92fjvcg51aPziskk9khBKkyKh9yZgL9KDYK45s+NcRGEBUe7wSLjZ7jx8jbjdulOsyfrpxG01rtv0R0hMzlDJ6Q2vuOV8Em/MoWT7dR4H6Ns/WdVLsj2TCt3gUQhRY4W5dtcQAl17daNu9thvi3FKMviJUFS7K+WF7OOz1G/UHMSxMwblj66FXmXU2PsbC/zlvghTAR1l17ZTI1+0KFGJ0IZg+Hb8QuqdRmHFJnPx8zgGG/f3TTYqp9izvSzQKYJ2ddEzdUBrva9ztGjZRtcxJvcq9fLXn2IT+uvInXEnHgcZe1i6zl4Tl5Kcp3FkhdhZXa4WtXmXrebpgSL/IcFD0cNU1w2qiY/THNzSDtwi6m9YFQEzld5gDujWv9zuHQJxbEEXdKUxv/nxKUoKs6g/3BtR7rL7ZVEN+NTuTW3q1aVZ4oXxgOMjM7SQYBbjLTd+TXc1ZyYi/iAP3nffydiBFOD66fJnOfIxGk8WB6dLHD+2Wqow9AehnrhoxuS80BEbPqxmV/1iUPoTGRffGsMGGgNI8By0vG+lh+HNMeP8it4ixmr6JCej+aw7PghaNUJ9KhtoFSr3W6/eFZHtdlLcR024Kq0izgbGNy8vu8BWusTxqSCkmJz/1vm4B5dIkDVTjLuz+nYAI5OrxT3iUsubW5lEAJf50FziEKfQgJu13QZmRlL1FKNqrZNwhNyoQwoYPCHw6Qch3X3vrn9Q7/e0E+JF8UX0mt8WpSW76zDmNCkt+SlvX7Rd/CHOCuvNqGRrGz0a4E4vW6tHN2gV/WaVpjsaCPMdlrgZT96y0dFM9ccf1seL5H5A49T8gcZfP39Ylo48E5vV661uxh0fbvt/GyJNFUTD8oxdRViMDPV1W7VIWOZFYqVNuvO2s9wsyfoGzDiQa2qr+k/6UA9w24cKcRTnHrC5qJRFNnZJft7rpChhxi0NLCLZfpmPwy5n5mxtZDW/+UeCFI05UW0w/XmuKK+4VU7Ckrcz5KFbv7n5WUoNWvrjM4DApNtfWXCPp63yce+tWgT4PrPTvRTeGkymGlwcc1Adc8/lD3nsBaMSsngluTSprOfcCU2wVXLWfg74cm5VbwhI/GJbuSNaeyU8X+zpK5eOJ3MGWAUBECdjSAlNSY5+LPyIkWuVzYR+DVUIvA9gVXbtH1tBsSUSij3KV5pMdJ1qKvJZUc62dkzpDXE57+wGo4y72bXt28HRzMDHFFhwj4MpgSVlY2jQhNgpTjx6R59oHWrlTB7UOCGREsPH7x/EMs+Bx+/RebbxeNShXMjJLJkoOWA5H3z+NbqSMJFQ8wGxUOS74snnukRKKw7cZwCv3CTKewct20ERvK4+tMkHZuysyXAkw8r8FZp/2f3jBCWP9IHUyCdT5YgF9Hc5T/lXxqyb1A+NNekxr3T8i6iIgesUHDZBiJrpSapiIW7eU94qdHM7lZ69fE1jJXfe1BPHthEljSPpu93rODqbequ+x4y74xUljJ1Gq5lHxMeqqDC2nVDsb0USGXJSLtlS4PfwxrfIofHPY+Rws8EvF6pfKpZk/sBEacX0A2SaswcDetweAEL0+vTZBoixHv3zBF5VLf9uYNeJGcEujGTIaAj43FTC3BlPPMtW24n8/nPwFJG1kvLvWZd5900k9TaHwuyx5seeEmInvNTZlba57qDQWlq5vjkAOQEqII1syPxyJbrVK1RwpmS1QFy9Zh6Ml/FXqVUgopFCyehK5hukSqrb+vgm4WISogKvxfqGm1e56f9VEtRSzwrHK0GAzb6Q+RvLfz2gbMzXfHUBx8Kta7nw4qd4bvNNaSabjKTC91LdyClTIG4aIHEG7nayT9+UvYZ79CjOJugaoJaR0vriVup/zg7svEdz7xsgzKar0ErjHGwvTcXc/T9ae8qFJSYE1KA18iYYrJjuaCY/6JLq4C4RGCHrr2QqlOWYU/c06J7VnOJPqfPirtalxrm/NKkyX29mkKuPMQcgN8tEd5663oPAUGz00bduh2PbOcFZXY0IwsBUvOnrOVWBRDLTdOL0gIOabQ++Jw9m4QBl6MeCQHYbZLyg6EIqSW3bM0VA/hcYC879E39rhq/i210cKo2xgP9msP/HF2OKjUk7VDX7+TW1OFHO2qRnRVuBz5sVs6ufljlsrqezSyaza4akmPIcX7wWputL1CLJpsjIz6TLs11I+M+8//IbGZaNP0j8ZBYit+UMdc4qY/dr0JHq/mMpVIYnQmnPhGAFwNIXkzR90VWnwSzcLSQDjHb/c5zmhU3tiTrb96Xosff0vW2k7hultYj/tvWrFOhn6NyLVcmu5yWen8+9wjYrPvRLt2w3F3hIrvbd1PD1L8+fbRz8WDhNvQufxqvVnOFFiQ6okpdmz6c94K5uzcyzA0SNGZbG55s7/fZiG49p87T4OALfSx2S7galdwb5bXGynCUXIlh1IKnY3tB0x7uuKE1KwUdk4KEsA65cHU6ie+mhQXdIdlDfcI3DrkSoW8QAmTaRpNnLxT0dVHNWH8+6n1omX8NgISDViw69vz1lTKPVjq4u9wATHyZ4TIh6dzgCqOMfrR+NR8KDU6Wg69UFWo0/0VZIWZkXt0AnzhceRwXub/ObljZnR8XD2mK3wh/W2Px0DVL40B4PLixGf1NAQas2WL/pDrvoiMOapb0g4imt4TkuBrgzWniYsc4bD3CnaRsXPBipLNHOXHgPjIrz1925Iw+aO1aVeVfZTL+bcrM3VnYTH9ncwuohs/+KUyucO8ihvEI9/7wlxw1QiDoHrnxJpaYQDdZcQP2giKMM6s41weTB/W15+N2gumNbNvLvncvnYlKL5Rv7pqoOqhkrTU3cx0gE0WXgk6Xpsic+pcf7xeh8eeAL1tBeeM8hvjReVjqWVlcqBGObbFqBT0EjQ1G+kyceij3uW/j6tztLeB8XELgce/xbEVlN0DR5GUr0MyaUDNRZe+IF/fzP3RzbHAq/MG9Bz9y35ZPwPS1kFLnrMLDexRdS7GVWplda8aiV//7J/jV14gloPVtMGosoY/SqW8G1jJwgUuiwwKz/S8KB3H0MjSfM6Xt/vpxy+RhaZaP2j1+5grH0+SOPxgXA615He52hDajIOjqOQHr/zAjc2PzWLe2v/8tKlF24tTtUES3/uLS/0mpWO+UWJVU9HzeGL5Xk+n0crQ11e+2LXButK1xmGmH5ZZkPsJfaeIU0NH2uNFy9WpCfcF7e1Mza7pAtkSTh8jQ34uBjRxLi01nqmu5hqY09jSCmyukdNNv5krf0B8sEL1FI9Ql4YI5EF2IFTmgTn3PaG1nMKHtc4sHzx0RxDrtWT7zdAEU+Z+f2us1CUCRPSME0qVCh2PwvSU6Tl1XNi/ynkzoixG//JtowMyvgGbOP1B3+6UZkxqivNk+5c631mLeowE7BHZCbbTtSD+Z/jzyJw728/WRdYcDm2nZAGs7TzwHchhACYtb2+oWSQhWYm2rhJ/14tsoE3n9fDtj9+Q4tSfTin5DZ+xR5Br8PXmHSmm428qzgxZPnp9GIeQBsNh/ebHTW/CXy55q9Fq6/Vg/L9DsMgUoQYSfHB74EI4c3zW/MoLyELdSdQyFSP60EmJWFSKswvt/B2O56TF8HMHj7bphjUKiI3jw+oZ0EkLxzFiGPVxiRLM2p6tXcr7L+FpqJehaZJuU1Phiqme58u98wUDil/mOi0/+yczktDgw4VWDp6OacFsZg5r1j51kE7ytGu5afLm6qeI4ubhWSVPgqslxc4mCxkzeD7qRWF4/HaPeavLFzq0NmorO/OZlnJGMyeHN10A3aVFlV42LMW72uvdKHrwcF/v5xU5X8ybaWx+PbT3KW5RF/dWdLwBi1kxOhUoiw6d28wVvQNiu8sjQEx5mebw1j2JO/8pwNpqn7pN2MaAcwcM0if6pp0i/8sFLmiOHPIYs1YX3BNBFl9PnmI7un8y1loYOr7VrGEqcmSFS48WT9XcZWhcrBZnoNMsVfhyjdw6IGcWDUhs0m61M9plZB6vWAwJwBvN9vTgcygwalza+Idk7GyTi8vjnDRjBExSLEEBEh/5FLd0far/pD1bb+md+OZv1y0tbydmy7iw429g8O0oSHQyhJdU3GKqgvOOBarBR5yT9OM5SwJd1gDZu/IyazYJuA/rqmng8MrZzYD4fGR+FEsJhV0HMK4taprwMbKzg4a+1Yhyyqxv3USaatgi9q7iC1i1wkUkaQKhr4QXhxpMqwkf8pOwU9fLiusWA+6H87yqoY1/KsDxb6Y+wWrzpXrOfb+026UrT46X+1xgZKrG6yNxIPbsyuSUEby9WPDXXVXFDQd02aKMFsn3Vqx3qUjFxlXYkS/YRXf8Dy3i3CxITJ+fbaj6OO0Z0dUiqfCBaj4WMv2iS1rqR4DYrelYK83PN81t3QdNHqeYHTMkTl8YkvJz05IwMNntfevr7qXaqDnLzZbe6mdL0U86Wl8HlsGuJfq0+INxxJ9zeYat26mMx2IsLSfGOQq0HIANbCD05vj18Eu27q/tkhyVSnqaQRTqR3utkdIYx61qCMiVV3QVDMZ8wE+R4SOfxj43V+fdnNPHrvEjj4qZ+Rb+cc2X9YUNDTTekVguYoy1s4P/19ZozNA7rP/HoYHVVQFm4bAdwMQ/FG/K1BvMb4Kkt7PzBd94tsPl9OwCCe9C727U6uxihTjjJpdcB1hp0aliLHNM+fYOVibNY0xtXF69IuZjYzRfVkeC8clvbqY9a14Aacy4bdhY1DcPOPrVeCA5oBa/Ova44WnOZCVsx9VfHSs5if0dJdKQBUhQ/JDlS8nC0KjwjJMD5aih/4tF6Omeo2l5z5Qu5DVRF0JWHJSv/xsMuSIj40fxlPs/WQ4qbnUr9/9bkm0jOjVZm1e+Wp1h7XdmiHyqaD0tCbNHKBx3TaA9P6yhJUh/82fk56YKo++Mq5x9Ynt9XK1XSLVQl0v/nGRq84z60qh+v7om8/SDOmrBz81CBRbCaQg7KBbQVYRytWIl+HJl6q3ykW3nvm6zH6VgN4sRu593xOSloxC54Xx4qnMay1FNvD6Hv9+lpI8/ezOl5gNYn4qU4HQr5GNBqUMUfrvZTij3ZsFbh6TCRE1DkZ/GStxJc2z5alrRr4NK97a5fqfNZ9VaTHRJRDtHKixADfQC0mzexMKomPWzCJOpch3mYLZCAO/l6Dvb02w93LAON9UAgLhPbTEd0e5kH6hTWm4wZ/Pei5mfeRmoejD9un3ji47aweP/55CpXz0/j2FqrxGXzeZmQkkhi8PUKVjFyc9HUBCF1sq0WJKjsPj1NvwxvKhu6oY/pQwZCES9QzrRnjNFXfwt4q8MON3icetdwPJlr9ezEh5zcYmXOq1UUgxpOehYGK1WgTXpNripDXXX6LuhKFbQ6w8w79XEirZfZnY7FwDXgo3JP4RHFZckXUkAb9cqaPSTLr8OYaG/ZhaPVxSxzSb8xFUhyVmLZPJA+FMloJKRaRfp6+IjbhY9/2KzEOtSrt/+p0B6xsKA+5J0WJRcBRykMoO+6D0zOWkj7MQGInGPFePjYX2IVP+L6JefKIyuU4S6DM5+HfgpukxqRQHybbUIgFMV6in0MNWFeRLi++X701qvScJujIb2fXuesGt6c44sRtIcmXf8+Sj5hsy1z9CQ7gXRb4cCsICSE1j1VfuFdqegILnrVCXkBmCxOaqFGLKCB5aPTA2+napdXH7qauCXQoRGbxaWNjFIM1lGeVtdl93xPUjYuHa2Tn69fvJT+El9tzhUOWQVtHWRoZSSPG0ufxCzXNG5p6tqcWQ6G6HxSP/3hWtJhwxf+jzVfOW0jaHV3LqXLseP2XKZY58PYBJXjlTpgnAt3K7Ocqrctnp+EbGwz6VRJoGMkzQ4PIrlSrWp57ksZx/N3Y9PUoYrn3/7WqxMF/KBQuO3mlHmscqDVlZCzxtXBmVeJSbrisVU74tog6vuLMLhfVM3unwAsxUX5uSMwx1pjAWe8bXtAAog5unmBPOrXaYlwYCfPv6q5xO2M1Df0/pnc5ALgvGnbTd/1sJ5SagSqMHM7RD4pPxVBnxN5v7jM5uz/9cisOY1yqlthLJ+ez9s9ecll49cXG6bEPVrjfNmNZkJ//Hwbk5A84e9OHXO7+hputKHd7u7our21x8Ho+6DVEYuL1+h6O3+vTjpmPq4zb0l+Olg8dFZ47vzN8FY8V3K2T2OmyL9oGwL9h+HVhFx9Zf1+lY48X27G+x9W3Y7pfqrAOpGec5qD5JDBrWtRlNdr/kApmG9yY9cuGgsl3zfnPOnXcKNwiXJWEgGnTTky228lrlGZDm5KodGCeU5+vwFT5hP0V5OP5m4i5gOlapD2oLP/Y91wP9OPCCx+zO9Gup6Wr01379Xi+Lday/d15HJbhCxWWnkJyVJ2tmOvPmIPcqh2MSci/l3XEADv7wIIMtf83n82p4YQ/DyIJqjzetvI9e3so5y2A57HVJbngdw9tZgvz5N2MxhpW+SCTM44+2pMFxZfTRfdI9SZ6ICVMnlZ+wXydUo2ncnvyYvY13k4A7S88W0Miyyp++lJGZQPdTJZGJ+t5Bf87nPct5PRW9Wj9fezWSyuTH2WBRORlUeD4lTilDDQ6OCj2bkhbnVaI8YhfYvMysRs626axIQfgdXhkS8QL5liIXCRv8Ct5/dMv5Vuei/m5m6AyqEkyA8UWqc77Bf7tDNWhZnU1bjGr0q0Qgc1sTF9xgcynJjfOw39hlYOrXxvH4Tccdj5ckpJ/2i1Y6+eqQp427IrM5oSD05VqKBSb7aY8arl359i8AjSPFb7RzFr1bDLhFaqIKRp9qXc2qaEIKB61FYODPLSDAC70c+sowpwmOMxaJucEPZ4uP913iHPH/SE+NKqEBLDJflpqDicGDzO7mCq9nynuXW1zuTilOO1HNlWwUv7YPOibbmdQ2XaaprHTfJom673mkV+dF3/Drr1QEfYrHTJaxeBc/v8cq6Q8noAubNVet++UDm0z0w3Pf8dzjYHpLWdQsFSBMbb+SJaGTOCEuE5kEosX9KKbxZyWl6WgDcf9fQ49U53zhAtB7mnZfU7uEpVjKVZ+KFw1RFLxTJK6DIdMFgb9vR2APSsR734i4p/jgamr8okwWK3ZwDsczqvmml/lZsU/kP0wchS/PbuZvqXl9g44tnOeu3O5OlCWNsj+UgXmP6NBe7ksct+xuUcOYDH8J/9NF1Fbdd6/Xqt967plqGGYtjR4OVtMmoE0KAVcRBS8W/QhcpL45tinCIrCHg/x4saK+O7ZtcDjrkLfvl502O3cny2LJQq9wRZ84icDJKUc5qq789wKCMHaQ+RcANUnVbtJLsUGmn6ric9SYrL8JgmZcvJxHlMZ8sIOvKWn7vDxxdALEfFYNPFCr81fbbyWvFUe14+3bqiO2ygA+lq0Zrgsa3o0zVr8bLwl4ZRVCMCY8WUz62kVG3Ps4w17NKZT9ubfnR3A+ukINx4VQoqskuVQOmHG30o8tQlwM9o5JqSaz/X6jNwbIbbNVIlAO/1KOxqhGZl4mNa6Lzn9vHIezwHCytjrvm80ro4P2HLwf2u+546o3RiTcrKeaUSOqXpGb8avMGU8uGiIPEA2FwD2U/XnJqtcGMshbBTo2FdfqkHVtqZTdq013pIstj1CPc/7ypAaeLIYOgjlZPX6KaopNr/n8KP+IpGcvZUXp1ZmlwcUaqoot68RG8+1vosxB2duXVZ0REov2RbBGcRcwENMrA2Abq6+/XQqZgWuW+0IAhYJzOafSk43IqdVMNSj6OphzJIFGW2wWEzmtHEOqbI0dMRXrloWU7EHh053xVxnrmhuZI/b2x6dMPeFpexMYmsCb/uDzN4iKiax+qY2BGB2Y4qL34vzwoMx+mLGzoxQ1X9Oa8LagV/kdkkpDlgwYM92HyaX0Q4mqRqHVMLRv1v/nNJnBk0ybOYqKw2tdT+6iNYYHA/0SJv2tFTMnufrfnCP3R3Gg8g5vf+zYqfrwakxWXbEanb6VSVRujYmxXuuQAVRTrOPt8M+gxqmuKNuJkOeNXH/GG9FZlVtV3KP0cFTd+dLTusAFn2tEJ9s3hxeePuOjswdQBL2vYPmdSv9jO9YIdplqK7NgYnjcnk7OJq/YqAovhQy+5sqoF7cBVvFAAc1K1IlyVIMNQGMEqfh+v2CVV3g5J7ei117/BYjUDe7RX1v0NipvfSwG9Cuv+fPqc2ljiNX2gjE2ULoHyvoEWnsxnblPOQ5ffZcx7ULuqk2q45pbg5v2UTKNJqZjCJs5zFsRG0/rOyf1GWovsq6fh1a5fqsPkLfcCK/OXCvBJ4icpZCdMOdQ3EFvry5Nr/Lz32QfUKOnLlF1Eo4OK/YIlMFcwkpO6sLikL9/ySkKVRwkY1P/+sZfviap9V+3crWPKwZYxEV5YbV6/kx4s+scOd426g3sZbXQxln0ugDPmqgSVx8OjHHVbfoHhUGJt2dlqHeucVS82bhiuDhGTm1nE6Zz/4zMaK2npDfkjAxH5EgdnYaYWumshehsppqKrqQsDjsweqP/Rd57NimuNN2ikhDeTRsa10C7mXbT3syemd4zgPAeGQRCBk9D040TSEJI+uuHeZ7X7BvnPffE/Xw/EVGRUbEqM2tVLkqRxcSPzxxHbJpaqOf3zaR40UrPfW2VajMtu+DsgC25W/zGE0T1m7kUkdq0P3gapexixnn73otuNpzmioSnjnp5d0nxckXqk2ZqWaVu6ZHYaANW24uQsM+qZwbAFz2CisY3VWDefTAOAEiuSw7ISg+xKbasoxOv0ZVDiK4alKnTHi3FHjtrvmrkSfyVDWCXfTAipiL3Arc2uUm+TkO07WY95pbA0GWdtXFooxyiVY4X1+Wd1PNKjo4aC1evBjT27G6uEb/QP4W4qZ2sZrdKycRdBRwRnQqKpoi79PWum6iJK+dm52S3VZwezgtn5sMMUc2WovdhtgAx7+FcODF2Qt1beru3iQ4RM/QAlHgogf9+T/MnLsHN9fVTM+GEcVpd62vrTjb2PLkSc220n7uT7NLY7mRnkOD6bHRiFNLNOD7rwNxOb9qFogJW6sav3yt+U7KupWCGwLKmfJkFYPzHk6gRcCt7pONA4LKjRFP1dULGe+by12CmFq5I3zT/Yp2nIqtMzfb9xo8OKku85NGD4hb2+r6fkDi4Lzhs31eOCD7wnSh6iCnV7ZUFfm/7cppZ1MudIADVo7hGsQklzlW9YsC+E1vGeZm9l+skc0Whq8w8YPRc2sQGKR07opJ4A9kBBtChlVwvZPardCg617baUNP2CFqleTRzvw+aZyUVsF1QfcSVH0MUsCxEwtzLpCK/NuAoY800en8+b6iyq8t7/a4lrIMk91OsA4DqNNaPcWSVbNy9XXKDMl6Wzj2N/tRuDjNL6eFqf1OQLrnV/QEoJe5GtmY/1yz2V9UXyex/F9mKamIpZXlpS81pDL49/vu1M2+uzN6m4oCAQTdHoYmCxn5N/yzmXrla9GebWr9vj2mMfy09/L5pGaqIevPARVdQ8a3n6/WL1SJG7BjVzBQ1DT9ZKVKwj8dEVrOfX/xljcqdrLtmS3U/LSng7X1NzQQwUEHpsBA2eXALUV2B3JgTjNivQ8fUUOJWHgPJG9DglPXEBUMeocjUaWgqYGHpAQQ6wvlmMYZ+KSgawlAcUc6dczJxb6skRlwEpojCdd3s/wg3cKUQgaN7W6t0tU6A+569VHLe7lq/xQllTzPHhzEtyRQTt62rTg3tlIv3PBfL39Yjc3ricNsACeOg8ONzj5SZBDZN1bo96c+NGBmgFbpOOFc52LYnviLN1tavxc3Ha8WgR0yb4s4B2GJyO9qLq5hT+Frb1MFUaAvXQPv1INPl3l5iZ8ZMRpxov4h4uLjXoZR2Z4XwBfsn8HzflsSb2s91g3JujozOnKSfr48KmSY3+f6ljJOAqMT9DaqndWJn2DMiwXGtXoDiBH1JmQyAFfb4nEN9V14/ugAacbVLtKcIQ+BHxFUyvy7a+XXgO0XB+Yvhe4ekgR3zIb7sdqJXVYjruvTOhtJoNma5d3wKqVijxwTM+iad/mQms30+9NeXz2pmhlTO93KS5u4idaTK9oyQ4ESv+iYph3m2OqFmu1QiYe0NQz9711Olptv9tkp+7JaAlcL/uQ6ePIFnvHNRZZLOaCeXPhxNOFrctQLfhZC8Qn5tcQSy1RlqiJbPtT9qp9H7QVHDK9VLnoRTx9NMukGfplvmD4mbVZ/ulnLBSePs7krtM2GugF8uJqqCtoB4O4LupTD1VbWnDwPgYkbqvN/Y12ahHoGK5WY1Sq5vlo/0vPvniXnaDo30IzLc7ny1fvc6eiumuUMypVqo0Y4Peg0WFGHiHQuUwiqVOABX9tk+VedqVvhUXdnNujfk8q/mYh3qoZXXUp2s9mWXYOjVlpC5UK4YY6O7IbPuxx2Zv77PheZ6+vxINVungmOWQe06bai584BQbONYzFq2E43QeiIbrbDt59FKUMuJnOVDWG2tbfNeWCw7eiXr632AqSrw/kWEnGhXlgFR7T0XAtBMt0bKnvKHujCUZzqlDytgoQYs/WRERviwnY71zHvUOyMCLou8lllUZ/TZ2xHDbnlZG8ATY3f4r0biKb7ZUb9UV6p5b4mv38pHDi2gKAYoun8OdOYvQYL3l2xKm9DvKvWEnVsLYyzbmNsxp8bq3n5fXe85ADC6uHziOnq4VIHEebNaM7QuCXK46PWhxpcMyU25WWVuyJDbl5eKEItUv38hO3WCm3YMERl2FErXA1iIsslWcAuAc2auOmy122dB/TrdZhKTbQuYZa5o1t5d4Q1q1LS+QtU0UpNDX1sasKy0tRWtv93+O/hWo6vRy/tqpHPHvOf//SR3jCANUeJf7QpRopF/Ugku3Lg7/xZgYrIiB3fLidhlWI6ER1PAMJSckx3NYu63u+fGJts+WQo4Vg3tuVcmptnrfzI0OdoUq9Q6FUDbj7QPXn0ZzIz3fKa19NGwaR+RSjuEviibH5T626vphFBlLy4y7McSl14c2JBedFeta6jbsHxbsKt24/bxiy8yL02kQEludHUldJQUbGS7Y4cXJBFOCm2XxYLqK2WbtJwAu+d/qymBX81BfwPVhYqAmq4rLUeuumWuh5wkPR1/Xgto+tdHcxKfn/quXeq6Z7Fcu2Mtr73K2nI9tpbMkdfYI/MRKcvIE9K1v52NRp04VInL+wxT3biObHZYVzytMu80hA3twHwrHfXXxHWtVysXr/901Gw9XlrOOeOMTt0Zpm9JewUZkRGfEtvs9o8yIVHzxGpn2SBKFXpc60Uznr+PLG0718qR6Bt4zVfDGk6qTCfikvSSugizxWNOpHNXJRqjyuVnwJjR2Ijx5SBqUl70WrTBkgqbrpjXPnrRaIjMYzMSa+yDJsVgfah8/bID6I1exIiEySPbsDlUI3hYwwz1Z69EcaYcNIWh0W/HpMqWoJjBM2n0OPXoTtHnHnxvtaCOCuN07GtmJ2XnFLVptUIdszlda1j69u2jdqVTi3Z89n6E2Y2SvbiOJqvhmD21w6w7uKyaqiulCo+WKc577IOO7cuxMXvuXMsJF0nOm74W41nVKzPc9dGtSfjtRKsjj9vNdpzc2f/7uDml5PnLHYFwB6gieGPvmmqoXNmfCbzWGPaqlYgM3NosjfnkXs9fofNaDy6cJ1qShUfqCXge/aAbztlnmdCNk5pVWUkfW6CtyTdMD/s3Ns4efit+mUca+xuNH2nGCmKDcQn3Sq0uCOpTQyrTlmUDYhYXO85fH6ZV1ui2VcXpCS+3dvs2pSWGb0wUPZc75t6FSIaHF6MIbu25zuSzufivi4zasm6qknG10ag6adk8hXK1NtuoPZdligiR2lowntoAMQrGa5Vzz7IefR4LfVxZYWgvvt86b63qJT3zKQt2pqdO8+t0fmg/OFil9IuJ5zMcnrim5Kwxjsc8AnLp/C7kY51Yx9ZPAqN8fthSDIUz/aVZSESk4AULUSZfM65OanRN6ZstWAAVK9047gnLI7S+khfY3svpdTRVZau7t5O24SoyXEa0fDW56AKT648whobabkOipZ2ma6tW+BlVXlJcXJQ8F9VewhFjVFbTJzRa3S1DYY2ZMYHHXlWpPqGvcJ/96v/9OW0GcewB6pn07rbMUaVurD1md6yEWNIEqvbYp9jlJWYNL0ufvj2dusG4YX79OYm2T0C1VF3BCirlQoSpqBG1Jr5bwXLOWxlbEPSF/+yYUQ0Zq8VUyjKMr9xUS7yAixECOx2TKY7tV63NCnsSZhZg9Evw1GEPi0aDzt+jVIeyVCMGhV4Y6q5BqQaWZ8n1XYPSlPKopPbovWe1vQ77YpMX21rS72wy56OmNOtvC9frz/qbngoP7ntNkN4e8jqkcvgfD/EgO/9+iKdgS/35GrytPk/q9FudCvdM3ILQgpYpopa+PkHOYUeAUiVHLNIzxt9nXkHg92s9e/3UM2SNmZgts8am9varpkxuXgLnJYw1pLJbsSxtjY+kwaqic9AsvL5oMXIys95tRyKvOovaWIDW59WP5eu6bfmhjwmzMs/RTE2Z4iJ7Xtnx0wZunbZCduIVYCKzae/Z/eVoKQu45S/nRJaueVoVKzagxXZPBg/MW4qb/nmZxVg8Sk8YUL46CzxXDO1wf3eLWHQKEW2d69Fc/a3vfvfJm00K+B+Vpjg+NA215sJhNxhHS8EQdV72ui1CN4KrjBJH9z/OuIoyacKCVLLEifd9hwmowoxb50wrZRXaeVKaH0dYOP5B+Vgxt7K+wy401lumttblsunM2uwY5iX7qVFqANA0fS/VExi8zmWAmbSOGQy2h2KhPZKU8waHonoMCFNvoPvgVCansmwlkJbsnC+4VklHxxHGMTl80wjR7H9clmsz/XCMraJ3Of6nPIO6SP4bOdObVHTkKsZIOKJc2y/XZXYczl2IWgN3ltBks/7nX+I5onWpR/sEWOB9ofmBj8jOn1chziRNbpp6F2ijlr7RZJgt656PPa8YXEt+d4u4rpQf41ovXlyIqq5CBDaFZdjvxEP+qglsmuD27tXTotYdvVmCVaXPB4xpji9u9quWg2gi7hQTf27/uQ8kTywkXAH29y9bel0vkz2uCGLAuNcKs2VZxyAXZsNoXhvVE8T+vEa4QIWq0yduy42JWzX1e84Eh8C1ZjKpyGssqGytwaoFj6NjL5iI1T/X65XlaivH/12Y6vXVp9OZMDlWhrW3ntQuyJ2rD2cL5+H57sMmWMJlhdRk7GLLGHqn1xX2CVcnQkkrCCIMc+tRj5YOE7aoUunjK9AuP1ActNQdn4nHOyGcZh8/68Pjsynr4xp0wNCEnxpHUVuqgbatVZuAuywTMRA/dPqdUf2MaCPf5ln+U9wWa9un4Zq/dTCyDxemRpXXN/WxrF3BgnTv0RT6slxxQNQMfRh1uxpWDOTUcU+Vd5YPa4XXwv6ffJ8gHxQ02audXOl84KvKQtvHchtxt8yqdww25t3qIVrvOVbN1P7W/mz+VjK3WCb17VpZE+xUaX57zPfHzli4rjI6thJtu9DnAFju1TI21s8OHzZnEVe7sZ2ppYGSXr0cyRXxm6FiyADKB8uWHounPWuvJXm31Cn6YSbfUVq3+ysItlZrhHlBjRHgTFyPPVS3SxXzZ0A9YIa63cQ3Hq6Jt/PIAjLsftN0DAvq4q6rKaHAeVknT4rjZc9+AV5ImH41k/QxA4CEBjVaH9m6/qJoGZ6J3txG9M4z/R6ZnPeUUgh0hY+ISqKTWLh7jI26fTUzkXbg++mBIxGUQci/kMq78WxS7uaSbYK7dTij0ea07SnwDJc2jrQIj/x+/hU0l5tIO3ob7rQeZrStLWudtkocjm5zbxRbHz9kypi2EXwTOnUJP0lhaN5f7gKJVAetIvXuTC3UgiLw5q+ZpKmcfWanHzZuaZat+i33yTHxmtR3/vIspNq3JoMUGmgJkdrbQ4x45xN80kbX3rEdno6R7OH1JcDBsVXyr8+FrridE6e7+DICpum7+o++3aDXKZAlQgPGd06qcnb38eVkFaeQs696mb7qjGxvYK5T68buwru5gR+EowXGTqz0MxZLdH87QQtZF6Ss1Y8BCWA6KqWB+lrcl853brLuSBJhHmqLdf1gXqHZ1OP34LrFaXro0FHolmF2BDeYWE6T40+p+92B2kDFPWhOvJ/JS40RXfaAZTp9H0q7noaP+ntdYV6nHMXsqy63ITKF40zwbF22N/B0OM63ru6059wgmA2U3K0+vaXJtoaedvKq9DIhRZPJrh8aGzWKNPOTZi9xe+PZS6/yTPRaF4fWJX4wl+NyJJ8pFcjtUQkBV/07KMa2cbQip7zgza/HcH1sjF5+ldWZo4raCQbWJRnSmodEob2aqVZJB9t+b9uDUvTk1mxPpZOgWPzUlfVPTWs8taqUGHX6eyNL3WiSiXpacjldxrNkR7wsroOVOhBJXh5FuOm+npbIdtSRdOn3wHtVmHHQ8C6daKLPwlLqQ1t3ynFElgH+x120XTcXh+j+Og4l0vLW+Ic/l7LJ3U/TOFv9811uVCPyymGtWWUaOpdCUuX3HLyi9M0VP2JGpfarYVrLPC6B2JIcZXzLlHs/pCOltYc9sog+9GQZCaaxGt6vNSDLHTniOU0mdfXQ6CVSxBNy+bf+L0sknNH9wBZr9bIvoEmOrrHK6Hh43QBwvNb6Olz4VbNVak6il5+gHyODfqoVjwut2BWXKWVb8cZ4BJRSftHdbBiLhuFMYYNhJt4kCsXAzxSOyKJ1591XPu5nSoNNPWWg8pbSD49bqxretkq1uNOdyVZfE5Yfj32baVLzvri7rdoX0GHLoVhy/boopU88hTWe8ewiekYu58OdlXUv67nYGTBTIlBBtdb2+xhJT+XwKlHPFA8j2Vqc15xAjNy2qGwqmrXGDafvYFcGLKVZv/gUf7Wt5UZrEmXg2jfprdwB4jfabN7+FbFIooxeXttlUmgSv7f61TIQWUJiFWu3eGBX/p7FNVVfJYbtSPoybeuVX69M630N21Du7nErxn7tpnsZINcKD0IP2mkSrSth8bLnpx23auRt1T+4NAPrup2IXumBpe4CEvpt3vChMFHHZCtMMAKyCycVkTMOCBXrW37qAwS9tHpdW319gdCZYy4f2IZk9WZ2Nd55ZTcivSajzdLIjfRL5ZTeWwFim3r+c6IzP64NYrU8IPc6bGinntjowdfC86JWJeG5yjONh6fgixUGoxO7e87QV3x6vF7GZ+vh8kg+GQ5aNtmDdqOTD5OlFhdLu3fBi4wf2td5C7aJcKffW1ZHEbbP57fsQHwIgKvxDhJWwftX66wuMSG3oTg1RLrI1qQiOwWiG8VXCTHXeCKh1BqI9QaPVrSdfXhz9MtV7Czg5cHlv69IlMPoqtXhlTa9T905HMlGt0wL1nSi9oqKzsWqnLn+rs6lTnb6fK4uxZCyvd4tNpOiQbulAdHBKBKz114D5op9ieoMbrPLH13Cs2hqjyIKWPsj0YyTSb2cq2h/eg+g0YRTZ++NHuXITAGNub9/8oNcSQh4YrOZUy/031p8BM2ix9Pyh9DEkoyZGsWVoFVbVckzn9sRNrT59vdSXIvuIKUqoowcbJgzVHakATYhM0ecLVoEzejbkLmIQV+0aZfQWZ7yiZY1xvXijeW8lilvrYFRM7JssXp9LBcJWXI6NmF0g7/rolG25ndBMLBNZ0hhNKKKwfey/cd+PYX2Pgo9vfBmJ00R2LpzfWxuLRtlC/5Th3c3Jdi8X6wnxkhjX90RZqoR953ojCgKkqiEhbe2Xg7CYT29dvhny/V+fAm+wkYnl+1iKNhczqMz5VvJhpl+L4etTXF7uRvKYP2o8aFcx2tXMS0Wx6uM5m+ZGuXqmK7T4iVTzaFXJGXG4udO/6+0oZGUbbcTH3/INmw52CcYEHDHYhatBs5MnCAdATtdsOF2a/vh3MtU8sgy61hEGtsV0t6o1kSJhAgSD1Rm857PPlXn498iV59M3C7QNwpXo9n0T5XvXAQHxnGy0ijhHyc279qeLieGQJkDxZPppMdmD91OcaqPR+ZH1VxXsMYt8ZE4Lq66RhcGeydCv8dblvr15BKbhmXroe+UT0+XTfrhoD4JGOMIFPDxGujSH632WmtI7tAbbkDSOE/PvZ2vwYu9aHcSeb2vLo2Nhy5uSOtrUSITvrbvNiZhiKnu6UY9BzAk0aXmyCy+7zT0C+zuS6MlBhpKucd0Hcu3gtO6vV5vqtxgpqSf0HjVsSklSbfkwLpMo5G9lhcfZu6tGmRLSovnvpW3Bo6uQeoTZcFe2ASRiU+sG1lsQexhwWXrtqIHOkzB68mPdu6jjJsjltQ7JOv4zgoAsmPTUnZknWKjp2+390tyxLmbmOC1fBtl/c3nj58pkpmVyZuWvmxyFYpzC3Dr//Hipt5FbGunlcU+tenxPq1B3XEysGMUTKhCrH5S3U79YJmX+e7T3TlkIVSLnL3Oq1VYqbY4bKNAEX+FSAkFUH7N3da45hoUN7Vo+9Rn/vHGVBl6274mxaONklRq3Wk7YwNyQNIW1oNJXXZEDu1DC5wtg9dmL8MYWuz2sZFA7LE99nWcr/aZxhfu0DsRK0DxNDOHyL0SWiKVsye9H5fZVblwF+2Mf8+mm4ybdwqj95L7K50lc1DqoVcRLTfTQrdChXzSyyCxznovtmIN3YUwrElcXVy/5QtDCyOHZ3zMIAvs5Owti5YjOuPKN2LxRvPwr3ob+R0W+VYPB/La6mr0jWOV5IzB1yNlz/KRFoaLx6tLaJHZMP/Lda+zwgUEdQEAWF7FIOFQQwW81/hkVBIIEcFL+KvuL88vJ54owdsPaJcx+LKtbiTaRwmolHqkJGxZXfxcgHM6PyPqrPHm80sQDbc9cTue6EcYKSN2N9IkuWjcTyxv40ZNp56T/vLHDpuLMFH8+/7TCrGFdQFTAUqic8AY66AzpaWFqC1xCmPxJEzACYVcvMNG/tq38r4O1Zi6/Y2mYlAtt0LkcZwp1r4K14It0+MGnn6eICtOy6Cf+Nt8A6JzWaJ2yAWvy0Sz8KoD4I5e5ZkmtHwrp2SqtT482gLfJ4b19feDU/y1zMe/7/XXI1rNvotrllsnPk5tX7XGPNhPX0Ar3chk01TjEvUcXtcVVKzavc2YdLGqNofdZAfBe+Srax1hSYp5HLCC7bnp6AsbsgtYBjElq4MuKnH+BpjO2+pU03nq9BBrT5OCWLTq6oJy3Vy2JOL099MXK6daytELljSW8s62FNa61VD8y/ickma5zuIendUbLru7yXnh9K4rUgGn3ewZwjrvestVoaF3OGjWmHlugjINh2ryvEyRfKXRTz7Bf4M0D0FZl1eIOwKtMZwABfnd6z/KX/HYoEgVn1qGtnoCLECpfPb17AWUK+wc99hR4gHHisF1EWC58Cd6d+SsRSKUcRhqzu/3aH04St//lLTphEn9rhLQ+KptzvWShhyWKl8Xb/CRUKm4DiAol915Ta9rxO9Y78jW44BVyrQp8J+Q8YiereSPUed0tq1pmp58rXnCJQ1VsvUybL67/J5fRKqAmazodE+AwrlwiKmFN/K/lIyyRq543WQYthJJzwGv+eWH502raNmnPftKPWrbkkh3glBDnX1825kj+ha+C0c6Qxf5ZmCaX3/u8hzcXWCQUzGVgNoSg3gZ7UONSuq6W9nIjIFbX4qX9G3bJFO3fHL9GqmMIOBbvbgTHo2jKbQ7Ud86t7YdqqGttMidBdOqj6QD6CZvvp4cZfoITX76ogrh89rrOBgEY2WKxXfcxR1BJ0avY7Ey8Wh77dXEss343U1QA8XlIDDaOR8uEanT7/VyGe1aqRAz/erAwL4PuGXNDC7uP/deSCixUL7be4B4w6KjbhOuLcfAfp1KvpvWkv9nRoMXLzkJfQu/ODTHaztcj9x4JMBgru3F/CiCOPhZxf0ZKSMrPW4clsq4fkx0edIFX7rMPWBltB3JOtIZbo752lrLhxpHDpdM83qwfaGrzS2n1ghfMt5lfwWj/neLZCfqEd5aobuEDV+IGnSbu8g1O8V24XGQ6w4fsRSgh8q7L3/ZeYBaupwlij6qmHKtRKsQ42x/z49oLGyMEV420Sqe5aRE2Xh8cS2BmWYMP7YaIq3CnCf9E193U/VdDr+0MX9N7RSWTaO1DKQbVXF732OUtZo4/15ea6tQY53IzHqt/VG8RJbDPNZsBU91+ToOge8qOaTRv3eH9DKt3ylM0rm7REMXYOJlMLG2EfZWjRqBH17P+yRLpGWVjt7pg+1UJ8yUnr6FB+UCXFVSURTKv/afils43TYCmXOkUV5eTjMAM9y9vTjV6g2m9XAcT8/2Dcu+H8bY/V3qq/ugVs6s2sp3MFGvX+cbLWBYef78Y8dcgfGH404rDusWKmGcOCg28sJdJZ0QHk0f60ItzpplzTz2gH71geYIIz65iejMqSg5HlS8y8JHRoV2pQHLKnhPqFbKOJpsNG5Pj6zzchSJftPBk4+vQLjXqvVoWszt17cy2LQeCxT4eMsEz4V6I2k51cNTtZJtee+JvnJM2qjVar7WJMOu83Mf66nzAgHDwPq6aGa99FPu7y+TOswbdH44LDv1tng73DRA7fXRMNdC/W05Z61WhL27NK1Cuq2vB2aUmicXnu02rAeiWSpaZqp0GCD5ekZQ+Kl8x/cBxLRk2lXIdW1evafQJvFLXy6NtyEzzLLtqUF7P3I/FOpdDtcwxK4N9tNDsBW9S/+A11LfYjy7g5FCASiJb0B3EQ7pruambo6EZySmF6qR/UgFipYP/uJvKpvjUjm3UGprWzWvG/YR1GeYrZoXX/DJ1zUmtyOEiwMH/XXG4nxsaIYYjPtXr9EQR7IJuJqLVwsE+MC945EySdZQxHqW55pyfPtGsTuMnJ74bYt2YtfFvK2VAEExsLwXrtMjcORn7qJELVJS8YhufmXUH3Lmvr5/bV9hsEso9P16rrqgRff8lCzGu2iiEJvoU1ZtGE9ouyhwVuzWZeS3tUYXz9lxpw61V4l9zk787OXSUypxDiVqHzaihAJQyRJahP1FKvFyRqUKDqCwkhpUzzkKfcJuUoU+F90F0JxM68g3NjDce/b+MIVUTv5ehRrjffXN3sw1y00+CS4Mu+GV2HnT1SiO2gbmAC25vutNlEk0xrerq7ARVhfz1wQeXyXXfxeI/SklAeJflngB0Bc3khT/6oMMFaFHtK8+x3xxt5Zn9vkYU3NJnxZnwZ0ljka/lev9JVEZdtSKwf23Z90dwYGvViornNkbWidu6DK1PlS2M0U4mZG8HFGzssOGiidDJ4e7jkWbmnusy+DUyU5j2WSzjCNwyb6dWgyATODT/gKcHPLSItx1n345tRnauvUOtiLE3xgV+/BBDh1HuaO2YKqv4R5PhV46ftszYpILfRNdjcysrPz6rsoi6LOPA7I8iSWVshsLtVpAuO9Z6HRvZTqHKb1K9uDyHZ5xqQt3ky6XDYrmgRqJ6gh0ya63VZMh4ls1Vq46ms7scnGo/+Yxq3KPstpCnfIuv2oG5K60kic3E+cqHCob951AmJkfF2zzyerWG/K/xkoQi9iaVDlTbnC0Wp8x3U75fc8HVHr14InMsMLZoN7hyieenz/ehkWKLTnyeOQYZximF+Eqvvk382PDnRTKgR2qKwxC5vd113CSNVuW7UkT/G4no4STn45ziXm/sSDO0C15HkJg35NKosg+ySnAEMtd/B4PqxzrvaIoxhQbQz26T8Ed4dC6zZEJrqZ6uFDB4hZe34xx90tLV/GvLUjOprLgJ8NQV3u3FzflraOpd0lgmNZcQKdfMe/lF3DfpRcPBQwlycxdjhO/dsPxAlZr1VtzzEZyaIhWi1biYzThFA2yZP7+cXP+SmtZ+PrnYiIZ6ub4WDfh4g3NkbNncsY2nnlcgkDYaHI23kruHevZelCOwmfeENy+9BUEP6BzAK6WvWGO1+tABjkwQrU8UbCycsJ83fpB0nOd9/fpVF8odfaQbtcuTCGRcRANjEJSkn1NkLM7dBVpNJ33C8mBI5Ge7YhEG7cI0GRltVXOjgz1y+Egquhjd8MJZwpaU0GhZDEd+scaUE0GvIAuqYOR4NvISO03w89ut1/WI8YaPuwbwk98Lt6WgFsJllJwWn9Fcj6Z7mOKX0HanSj5aWRGUlTS3/5qaMLWM3zdrBGlq/2zdL3IYUfPy9TCMMObTTu10Sf9Hf6xZa+p7YHBgsjl3RX9Vur+Dbt/1lkostzdi/c/rpKmeAhCiXeGLKWshXlzSiGuVoPb3h6UW83u403IVNdDFSIKGJGPO8reHq2nRQ0pG9b2gPqKyJ0vnXkncqp9wGoytHvwOMM7OBG6MbR6+zH1fSV32x8yePP2NVAfKgbkIEqTzl1ho9grh78+W+V2JVlFrqtvupf1qo83N4QttHdr7kEtiiJdC6xNzLsEFfPSnwrGU0rfK+nPy7N+Ei+v7Ot3I9t+NYTmWBMTekvC/uZf8EeOcrIXvo59h5oIR8KBy8ggsFFFubZB4Kvd+SFapxdUsR316wq6UTr7hsfCz08nR4wfz7Ze/rwvvG03o8MWOhaVWCXj5SexHpuw8kSp8JlCzdW66+T6sim+JzlzKcE57lrI2KvNJPhPQ2Aj7Sjn/Z5Hvl56v5vOsNTw1n7xV1GFBsoZvOzr7yIaGjB29BKh0uTe2DRIVsUMFYoWyRQggcm/Qz9lk3GFlp0XMa0L9odYei1McWR+jR0kwFlbFF1DWPdGKg0TFDE+KIE60t9PbmXQFnIFY2DGUMtRzX658CnBhng+oBNk1HkE1OBp9/5COqj1S03j4bncQ0mtjRCyWCiq9NH0oTuKvkfqhnRrmdKVh2klU8j7jhWUS3Rwc8dXeo5YxXF7JTuR1dl0Q4j96Sz2meFAe3CUNklv+76Lo1xbWYOZU2nFQhVTry4Jq0Qnt4V9KaSTOnLfH8aqGQxZqRp/Z1H/ntOtfvWebInTsg7Uh3v5XDFMOdNfG5hZYMMudIY6nsuWSMJLmB+luX5ZiUfJREp8Km90j7YuaFrE9LoTI3QqkrjkQeME3TChbm52fg6QGZrhnk6asG53WW2LDUQLazMMN8fyA7izeC6t1lVoWUKnkdPdb+B4wFatZ0BjXtvGhmwnmYxOY1Vip5zJoyNj/7knGZenBXAxfIW9l35LmFpWfxgignrWH3T3lUg7KXMOIZehI+VWzBLr9Img42OO8J/ufoYyNcOA+H5GDxJ/s2+NKNBnS3T/8O0IWaWCdAvDSyHuvpTSZ4iTU0jc4fJd76+/KpR3e2rS7ZOdGd4oXTtOqNVMWaavhn4oZ84Cb6nu1YMOotqlwTzt9XfGWKNQ6pPhHusJf7Vj3Q9aa0KeVQcs7fKv1WrT5T65GUFJspX6VKkFYED0defvY2wN7zdxPteOvPLW1bqGPYOOOPJGm6xH5RU0fLsuEEnvydTcVLC6d9mK3rOG1BSfIEmTUa+tjymlXctexa/3MkuEqH/fsnVL2LxaDAoNqOCZPi/x3agfjSKV/RyVtYCbADPojVlRplGw5XHKzUjgfZBb93LdqSd2RDs8vFJKeG2s/yN8El775tGdvWN+Xu/Jk0vd0ti4Xovi63T+4fjQX1C7ULptkDW7cR0aPopsUiKtqM0+TzTKU8QVbkWPw/WeMB5tONwG7Vi7lKEt+wlLnBkf2Qa+3psu8/PlLdLljPkyElScQbLhiYfBAr7MyPpAKiQYRF2LiFVtaYCwTm+Dl+BrPLFmzLaP18T5iqEYBBEwVf7y+izaFnUWOUea8TyIvW52P2G2/p6mKm9zEJKazKOvwCthDKtSiefIaWGgAiuPv6p/tzrWcqUz/P3jzFPhhCr0yapxLTedQf50QIolCteD7w23ISEmSpmVn/u1TKk90XHzd1tO9Jv6zJONiln5JcZtqnCWZMyAOcPhQbBztp5w7eu8JdJS4RslWIfHeLJoZSljJfcq8Po+Qfckg9n7p2/NWsXDoDKF5h8pQ+XOd7FI6xAhsHXU6aBb8aywmmFlWWG/5A3UK4cB3Cfpff5++Ia3NOPulRVmWL7U/0UspTDWttW8yUQ4lmWubXdaaShq9S1cX1scfwgqjVnvzEfCtLSOBU4bInskYrZeuFNrdBL3uQtDZVCKFUtUDMjuLaak2AezgJSZh6vG/LdqtnDVlfMr3C7IhfhhmEiBvfhavSJt0AznKyXS+vBJUflZsFcOllbBOCY2gmulm1wXqjbu8kMR6vPA3mSx3L4dqHG69ffV+oVFfNFYsSwAuqfcXi9c1autZiEj3SwGvRlaMFT9peand1MtQN08Pn3BavH+0uHpT4hDLaxGEuMYrOmcUXw4GiLa6ramvNOos2KW9F8sC5+ll4uKwQt7RAKM5kR8U897FjPY9ETU4mivT4QxlCFYpa9EgEtJmsQapcjdiQirp7MZk5tE5pPB9KCOhWYmlkweT3OY6bK4VDOdwzMefDMz7cXdKdgJmCvFSIKpOTYUbNpUo++8tiKxSF1U7k1ZIpEBn/Xf0YyyVM7POcKrM6RIvFojIr1S4PVHwFnuqry1bKuL6HRqsOL79ktgFpkNw7++fNSjJ91RPZCso939dxS9LK5Xq57gB0NVKi0o5jBbuvgawOBVv/mCvuuhYz7PEHlDoRiqXxZyrE3y9TN7M0Xasy/JSCviurdpUqNJRZ3X4fZqt1apFoSxAHfDIfdtNWJKIFk40bINg9tU2Js6urFcrkJqGEob3knpCc/X177JBIgavjaeOCLj03uugYK6t4OCTQYnnN8Xr4lku7PrV9+6KD1ANHY0avswXKhrK2mdVoCqwe6EJ4WNCsJ9ZyAo4ZbIbiUvLH6vB8i4z1JlKAHWyJCgWwG8t1oODw5yH6n20hE7W7ythXpk6ywOzU6LkVxPD5H9oWwwu1c180oO7qjvfZyY2bPdoeGGX0X1o0rsR2EebpsjJPfWieBai9Sh3zRKnLWVMtJJlvcL67a1tn//+dnBcLCo8yxa2EVkOWfyHF4MQLfs98Ja6GaimQwLh41VM0fTVxdfrqL6Lt8KfCHqJNFtlHulTf4UWAi8z2H+nDGSgbky8C3f4ini1PJDAiO6iu76+wyZfI2qIC36QHitvzO7pIKaSLStmURuqmdSojjcuQhZ1lqsVvLcY5usq9jfu5jOGF8ZPjmsrwPEXl4cDRfzt22qYrRK5N2ZlEPBZcNx4MdFJ4rZe3VjV6UWGEOp02RXSBkrVLXqFtaLVRnw6q2ZDrpoF86N8+4XaTGp5Zp6STHclu9GToZPJWqGeJj+BapstKMrnIq2eR3Hv+6SSdWEqKNqLzbHe5Pt2na2iUzDiKtpZwd7iHuyjOocIf1UBmXjr8d6NH4wVqd+PRxrIxgQPmQK0Npc+NlexCz4gAb6HUPe9zxLVKsAfjWvATQdUQxCsuQcqfuMPZXvI+uiP9mlCMxG+TjJ9vPLxcg0bXCQ36B3XuMmegSOJ2tcM5Sc/dXMRq1cKKFPbVekaK1eud0V3ZWpIRKoIMGYKTKUCIVEqq92K3+S2klCpIIT+bjtICXQqeqXguHvEVQZtvKlSpV2shi/6r8XxcLKugSQTJxprW5irGGPFdOwVv2tX/ywm2Pphk9fXtetyWo9oIPHbC0J5s/qFpPSkE7RangKlnI4uDjePtwVyrFGvHDXD4OkoaJmcP26r9Yz2Z+GaGvDwGSpSWfune/kG3mxpVcnULz5enRuLPX23jmS7NFFD7U0ofjAsW5W2DtPoa9uAWnMStA2//WsakTA9LkiFrbxvC5NBttxYmlYf9U+ktFZ4EKVMOygUQQtzP3Z6XG90mLwoyc2Agdss6ahCEP7Cwxc4futqqwb3UT7VRM3f6VX3qfs+qxMT9h1/rjdbF310jSzhPptUu9SLSNtqr7iZFnJvwF0pAvPf9tOb946xZnsqsSaTocdjylGXpevgXTtp29FUYm3c3DiFw+r61cvePykme2GigW+3FbFgpPGoLHR6E1qdnsR8NrD08FrNRqG6i/0OFp9K3178plSZFeMfsq1xzpx2N8H4p2PlP7Kcgq1uGAyVZIN023LFOQsxhN7QF7OfPXoVRlQipCRhLuCT6oN878Lrjer2ajlnuCJP1Oxj5uI5Lj+9pOhWyu995xAiNvVLEJwfGK/AZuKl7U3opVg7itNKv1om+PsymFvnZGmWlvvPOfS3m3ByuENm9Lvs5k8lnpj4y3PRaW6Rvec73iTdv1pq2421rL3hT7lsHW3ITXYqybXimPlG49iVJgxNVkOs2KR14B+6+nLi6NbatDWB3CFmdUJ3G3KK+RNuV1ROUo/qbgOyLqt9LztbHl7V1nPEdbyxSZpu43uERRIK/p4T03arxs+3m2MrDwnhG3BmMFyE2KY3cA6lc5HGdtxnxG+0XhJU3yClut8Raneq8SFRlfJNfeWJyZUw2t++hLcoZVqA0eJQfGrzxHpA5NSUgMP2B11p6MYRLhBxYb5j0KkSZ3cr4FGyAe2/49dx/8fLcr/u585vzFWVFFCUHxjnLtO/DH++J+MD7EPsn1kC5e7GkOO1//Xmf8/wfj/q/Ea7OU4U3EynxI/D6+cuveN8VWX/WOMZCa8MFsLG+OxNEX/Y+Yji5SY039mniX/p5mVw9FgupxmzmYLhD8SpYYwOXmxOgZdfkocfVlMiCuhwHeWfHn50XXMjkakvCRHVxv5IR6JxfV8TjyYA5I2xQ0/PiPm3onwr67jnZk2PVGsnbepoEgnsUVTO3mVhEb/4cXpGi/R2fBvLzmZnqINfsyOp70RcVSyjbRUAh0dx8i1eMpM2tD8yiWdSzM7sbIdYOLihJ/0Xhl+ocYUSDJ3Igq/+ritLoSRZT6YcKLtxGaIYPXZdN+hTQSXOmRHKl1LjIS9zBklIdKcOtD6cP50ZYupxIkVfAKmojC3HUz4wllHzDW4tbAipZB0ujap/HT/pt9cCLaGZbIsVx5+2G2bBc4fnzhYOKScqwwPSXl28bTedUm83qzczkIdDBVfs5bAyV9O+2AqTNvXJ4sGc7MUJ+1pJ7J47R0MjrT33nz6+pPvYfL1mwmdNw9csF2htUb7+0Wfqp30zJEmPymspMXp8ptomjbrnuvZ1D64L6waff7kxeNTW/xCPHvE5q1bmOfleb+9fGs9fNyPx73aYPQNKo3Eg3KzN5/8vvCfSv0agv04DWPNbYF6f4vyH8390olaSTVIobIoWRfv6gkrLXnq5avzc5NZz97SN+xk+o1t8+PauNkafZhajpGG14fUMU3M2dPqmInOj+wvV9wsiQKmg8qysMercI3s8NFirSyBITDBi+O90mIZ0TeVSZm+gW3wMlOJTbL6dUMA38fwSBnDWGZZoUuFzTle9R7IVZD+JjtwmjnxqH85p8rGiQdLU+lvvYghQFDQdv264sGIk/hp5i9+uZhcrbjKdAmlAXtJ6i3n98+zWv/LrEzxPAOh3cXX8kVMmms13jJj6qkrcRpT69u/gC/TJF/bLHAhAhccu1Q40LFMqF8GR32txTY/7qsxRbTbhO5cfD47tMsbd/Z/2GOl5olGv0eiyzHVx06I7+HWVIvkbLhQwbGMxIlZw4tRpdnOhHRtAZNqKcjxvSVaW37QltqXERlRa6OLNVsvfEZTq/bcte87kGScje4fURHAwKfUGMUrFBN/lLfpNMdH/LuRhRZ2ZaVZIgznbb/ShvBMKrkTicV2YsGPEuS0OBKvI58yciZhbBwkxb75dDEGEu0vxe+/mtMITKYOxI2Q5VdAlWSFKBfHpJuqMx6du9wasijCVnCiwgXrhdOdgKxz29fJRDhT5Oh6uozEOott4GEgKc0FcSDMctSDGI6WFie3l3A4OV1lnw2LFGHVRJFTc+V5M89kj8hFRpw2UKXQVc6RrH6eYtCAfcl3dPPfDzAxP9HnJZWXe+0AcviOtgdTGF98m60qHyS7HuishhcNQge8Qh9i3QVJRip8yIbgy3bBYD0a0LoyMEKTurJ4tsdC8U24IbsEl2Tqx/VmgdAUAw0irxMl7kT4GbE3p4xnd7gAtwFSUqsM9mJ+cRDsDHbsxCfSTtIZHSQgKTzSAVb3SDCGjZnPcV0IPAVfF/H509MTP+Bz1tj9gS3YC/GDZsDGzwy76K1E1SmIb2RRCzKx5wfcxItbU7b9jCGIL3MZf1TIdBH7qGtwetaTgtvllUK+EHTQ1oX2PjnAIA7SaKvtDvlgL+7W+bw70LavDgW9EV8oU8ANmwD4ITcc8hfL2+6kPpD5t/F+AC/4g96Mb88H+XxeD+TPuHOQOxQM1Ssef9SR3ysEA/9lHNvASIIFXxEy+BBwH4qiO7m60+9L+DL7Ud12uuj0BWJopfXD+X+eeYO5sO//g3knGNMX0J+bmbG0BTdujHUGwJc12LzloD1T+JexHzLu+/176T33HxjWVX+zDk/AXgkFw2hwD/EFfWHA4N9xpqCCMfivmf9tbA3oCnyb1dn28T8wQNo3QHz/O4z/mvn/3Rv/afxfmOX/2fh/97M3Y/3NuxP/Mg4FS+gfY1swzPxj5v/0s8H7Dxj/Nz//z5gRKOCp6za54dsJIUZDIf4nN/6xQOR/yg2vy12B/r3A/8B8mQf/+NkSuPRvjCu2PYy0B71xf2gnQxgKUZ2/vgPY/RwBuEnQmglpiwJqtMS8WIj8w0h1TxCrQgbUak9lK/pghSM90YQzX8wYrTFjkf9BQbZ4KZ+JIkAByeoMCAk76hUSdBUtZgQNVeMVA/Bpo4ZiJTL283ozVgai7orOuUNag/WkLhDhoEJha8P8JLTrLhvsf0gmWQJo6426GQOtdp3BFDaCgG9RtPXKPr/uv4PiRzdasjCArLrPcn+zDk/MTIaSOGkrkn+oQL8bNVr+7EFboohZohUrV6R01tiTkd8fgbY4nvpHUHT7CkqCD0rE9D9jBqMFFHJmMIsNIo3OSNFAFzanVQjT7RYIo30P+Afmps56+QSbenf6bYTTBcP/8nN5d+NTc10H2qPvFeC1C1mfzpXFa0dvad2U7c3Wtn2Pc21ywwF13M5c1mkKVhae/8ZszG8wA7Z2L1vtYDCN1I27f/ysNAjwQTKZu51Atd2Aged3k6nVI2IBz2asD/2nn211Egz0k0Dh1ezdaTSB3bs+vKkKzGCzB9FX3jW4GbPiRqPpXxu2aLSFiZB9hyr/R27oQ9Esus0i+oAus8k6Y/BfvFFHv/j2Nq7DcoAh6ranFFRnSyzKlo4YZot8yhI7h1fn1hhUAZ2VMhTDgsWkP4jEQENhz/mVzBpXGbayLiQdG+Y3KCl3tvdjQ4zx8D8SKQns1xPYjotz+JGoPxNPQNufsg5fLIxVfv7ajEXgzdFmDGz4+R+J5N9JJA0GdwQKFXedQp2BL9xHK4Gqb3ajE/SVrMA/goK3Mhzg53atfnTDz6je23Kme/sFCPLQe3ik/g/MUbcjVd/gS/x38ntj/8QcAT4Vc3ZF0jv/y88cvOt+g23F66IzBtKlyuWR3Y8xxpKRggO6ui2YreuQOA19ymz789G63mBkwBBnsu0gCPzJ+bLKR2N6ZcsBqbRFt+TCQBinPBEjUan+d1CwbZYzenU7Yp9lgERpgxmrl8L1qidM1qFqxWRLZfPmLuXJtFHD9nPW6cOH25mzi80mJuhCBuV0n0h8c9BXddEiVdrRIxt8rCdTroE5GN/ULlzJdHNoj5Os0aGrwYixagsXqwBSRsACa/fsVOqGlBOByuSek+E446fQgZRHq4ak1wbGcBOQI8O6cCzhj7jTRDXzX5hLe//OjcUPPm2Pt7JVlNQVkGLw31wHVAYuaMN1GV8mToGbfI6aY6vtTK/9j9x4J4DUe02HLqrlnYekzd+lvJk2DdDXZRu+osoe/YmNUOqG4Dm94dmSJeIrGaLAP4JSqRjDDp0lZyANhatTcTNm9F5aAV/PCW53k2Cwx3hDTyhpeKVAv2I1/qnMt19xMIH+KS8JQ1If/F9MfWd7m17yNiCKulzkJtlS4jR3x4lL8ouTAOqdDkIg1CXbsnpHQl/9wbv/3Wffctl4OMzcZThnzOAoKxBuKkjERCQfhe17GgMHSjF+v1Z0ZcYaFEVc8cYa/x+sc7niLAuHCgyd5uJmVfCBHZgGtu5Zp68i0cLRZ/M58ih1U0SO7jRXwJSXZsFCZ8KmLztDbAXMxI0CB2RZwLG9PR9nWzkH93cPjYRhLBNLY0RYCOJ7eTqfpLHIE4rpvSIzWQpAdO9w/cO8FsMPeX1M04sVc6BDLJx/UzI+1aIns6b6Eu0nIdWMGcj+1FULQbCJnSgFb8YktJoTkLkoCpODrMPIsYHrhIhNvYorDKZM3LgHgiJ2cIRlUXaPcxAah5GRNLpJAgFTsluqfgrFU5gjbWL0pudqbV4DliCErdMoOs1lUT3NBRbBAlUlWdQQARCPSlwmSQHRYMCAzGur+D6zSPGCHhICeo6H33TdpViwLEZJftljXacr7f8K1lz76v/gBkqA+08ZpfUr+B/uXtjOdvdExXzd5/ee4GvCfuuPYHOP7MTHRfBIjwBnSzSgRDkosU1jC+2PFRSfLYp/ZzkpvYJR20/YOviLqYUR7ORKh/hNh8kXW3B4fGvapa6olpoW4fen5Zh5xkTugqLEDufUXg+dbAf1Fh/tmJY3CWjEilHBfmI315n7nR6dlUAn/5yUmAa2+dqGq/UmytYbvHK+tnJvYN4sI9NvXdJq1Lnwud9m0xgLedqwHG3DWwsIdzWanNNS4ryT6ALMO4zsQkSsk/kzuJndWaaLNUsU/JEhQUsOWM1hmuoEF54Vm/ewCAshcK1oLab3onbuFDNrMG7WYCJZC6FK/RXx1suoeyUfui8DJZAWpv5V7dW2I/bBKHiTPj0rQzpfS0mzGqYUqrC33MDYcYVTfuk27rV8hDQryPRsQq7BZvDrr4DNxjbi5KcSwGAVKz0XMYbXEVD+GQSZEpD/VM26Vg//JqDT/dWkVU7RLndQXGw4lRDvwkHSF/xd8iVa9XQodmOZy9PDpKcMLd9fr056FURcnNLUvBZ07dZFl6+R2fHfkQWolXQFV34HpttOxm1gWbnJWOAXwNmsJXeENXpe7sD5+iLn0XQeRKZ2jm0cIXoDVk0rzS+a3PeDN9IsQR5LBWB+Vxy6JqIzOA6cjWz7KiOj8b2YszYWgGLdcnDnGFXb3OTwKM65AoroSkM8FMClffoNN0YSaPgQ0BWtioBcgxynV6txe53DkVt/DJ0Hozn9SF/VsBJ2asXqT8AsWPHj2CK0s/sEro/OsCt9mozCK3DLYqRR6Akp+RZpTjQrhVuRVsgQIVjPAsctK2+U+QMkYOXmJYi80VMRZhGK+hY5crjMqibDFpKzRHF7lomlLvFUyHSaHvQOiM4Sa9dFljw4ywH9NTKTBtzCEy8URhETkbwwYSG0CWmEib3TB7Bo5CjkjMbnZsy7OhdFK1iRvCLl3CsgYKV9BznDtX4HpOP38SMvafXpsUwyGgGTfZNA+xk3MUfUve8iEKwnd7JVf1BJULaleLAR+HVotZWb0L2wSOnbBi6EjLQ7U86evFV31Ehk/UZ2HjoPjVPrlOoA7sdRI7k++ppdKpdpOVfNzZQVF9sevyGSmRufU2LbCI6S6/h6+/72WpinDfzrvjO2OHTl5lwMHVpStQ036oubbsLUG5hmLfaHccL4Al/9WcWj9AK6KOq53VjvrYGTW8RWh+O31pA25y7yqzQI9HEbtziKnMPEKrZOhfbW8Yhlic/+FXMpcyJ/kQFGB6seI+NMXROAuEiqe/DdWF4m15sn2WX6JDfKvaFoU3QyU7Y6qsPh3E9wEZX59DKPiRaX3vTEXYcN0ORBIFm3ocuQz324MvUz8mRqJBLn7X7aDoUUaIk/pk+Bp6QLWENbxVnuRBuSxbnpu8vTrdT1C86+TnjoxfTdf9b4sjHZcoPuXKg+Tlotg6j7tEfM5r2MXm2lT3rvZKDWi+1c9kln/wORYqcRjLH9Akq9FH3wOU1Sl5mk+JIROgM5dqp7i6MhGSp/SYml5SY4GkSoN7u0/S/r4bWE3f+S8ZBviO/MPucK43XcRfu3YH/FmQklTI3kTUHHSYwCKBeQwXK72iykhXo5T2y8nbquZ62vU/6CXqcLhwa+XAy3AgcIgUHTlOdTFTraRty+FexiIzgEOHZ9GdN3S9mIs9YPgMV50m65uxu3WrBDtGHIEvkcKkg+Uuj05WgW3NVoGCeD2bBzNttI/UvG/zfmPWd5vCVumYrRNyWyvS+5az8YdU0hUzG6ct7dRZRYfHQsFtvmtZ7zYjkgdldmzJhpS/9jl9JxCaGjkHLPu7gwTgkf/jhtHBB+8GLhRXKaEyVXaIGYinE7LXkiUMT3Vlbp/5Pxb3YpYlKtWyDQEBNyv8keU+UKIrBTJmymyjUtXmRr03zACMKmfv0hYIKuZ/fEgXt7jrsK87SbKAeTuav6Mj5rvRxQ7QGBaIPUGjzDRnAbpPOthHcpWQA2BRXeanCFZrMH3gkwD0I3POLS7tNuDleo75VrO6c9A0FHBYwk57gQG2R0vU0ybtOW/jdmOpe0ILE95+IfGbVEcVNerkzZk5L8OJTzSBavaVkSKE4qYjQacW0XMrYwdZj88UdFQmtznWcKsgGlzZgxU5n7P+au0e3o3Lwz8T/ycvHbHRFl1DQIAGnSBJGrwKTgJ3dHH7kU1gAL21FTqjnA7Cre2z380bTzrIpSdzIcuim48YBMimA0dkoU8h46E9GSCC4obHoU6oeZb/PbVBVJ2m/ZCKbtRVMKH5ohlI+5zPBxMhkojbdRgknSEzKCxBjr4pT8/y8FT+HeegE8TJWOCBDN4WFe3qOqmSRsvLWzjtx/79zh2DJp3W7+/5j5hXNDhkxT04CkMwQmUo5QEp2Dmx7ffYo0ElEbDJmSGEzPTRkfLgWJU17Ie5q5cPlbImYZBJPyJEx6s+gswzCA+N0Fhhduy2S1iFmAsAJlbXu+fDzKNPZxS9O2VVgnCOoY+XO1jv+HJnahyf9AgSmv52tuix6mk94JSSKroHsRtEXmUYdb4KPhU8yNlysIyaeB/zFiMD7G7Bk25tgO3o6yS+wwYv05TLg9Roh+asCzbg4D92z7GTKKpT4lXYxI77b5/lHSsR63SiRycLRpxgxiKqvDeqV6JApD/057RDJoPhpV7Vtu2rQn39I/r7ogQbPJLcsitwt1sKI4IMKNoOmAgrmQqItb8DqdPBsQJD4/dP/FiJC4tLyZR5LhQkSZAkN6HN713AZNjIKlyyJorrMzs2ItmzeBe/M5EkT6KkuCx5nkvBOKxcB8hM1sKu5IjPB7tXBE2Y0n4lF87/D2TwJNx4yvewQe82aUPgk6D7iD4A0lQMsQisYdoXUk7ZXcKZy6sj8utuEoIib2BE7yivFAEcDCRJb5mBC6pqsvpYRIEXBnCjxaqRymGl4GofJk+soSBoFcyiLFwsBbEzWzmTfL6q3bY5aVk7KtDvCd+8dlnJBw3C7GcBFGkmF/NAxkpdjV/ze8MYuxFXfjOA4L7/+MpiQZCmxGcXg37Akr4XAorEQ2kpsNggyjyhbBQ6bhdZvm2DSPv3ktgoi7m0a8uOFktYDzba5rD3XE5xrIETEPOZTjlCNDwAW78+J3gjCr2y4SoRiLp8J+KRIT8LA371bjKFVURUEOeyzp5EJTdpwXxwk9TIbsG2FctEaSlmBeXo1CMYw+yI+acMifxCO8YyuVN28I536a1U0QyOM+vqrzxLgRxOehQ3l+ufRnmWUuXP8GUYzEp0cqvNqzjg/bcOAQin8lA6DCjjM+vKBCUsli3xu/APSo6jeiS+J8PI8hKda2CJq5MUraNqBw2GtJxxSL+bqlqNf9hkgSrpyZMcdv+Dgukl7n42Mc5ZTQV2sBXznluBEOx1bgG7XtmD9MkGk2Fo14tlMJ872e/nP3Vx6+NRa85gNshuNv6xyLKhGvsK3klYhuOBRoSNukdV5lj3c+PG6LMlne3VgrkR3Lc8F0QJLUUMHEVYFDaCxLRXtF12khjRCprxsXHlazzIr2DR6P7gREooFxMcEftVdoIklbwjhfthTHf/i9QBhQv5lOMwLhIHUpY0fbkksvMGCIVyxn2S3/VPhvr8A9DanYhv9RV4O5fW7THsLK34uJQES2lAskdFzcVroFM2ZXKELzu28fX9hvm78vVTUyW225I4Zi557zqjEoSv6qJ36y4HBuHfEgupbAJJ5gyx4XaqG18Czv2FALedagC/sWWlpJJdtwp+wIo81DKcIjgJd2ROqa9YvdL+ABTs2ylBZlWcHoqLLYixTgtYPMT98aC7z81mB3+bj/NEOU0A8kT8SwQnwSL0QANmQcyu59QozQcbvaaU7cPb6ihY73fmPTQmRW3thcV9QdY6KpRkWKNvI7/2osiMOjHdPQ5s529QShnJiq+hmkVSEHlxTwDMKdUMw5w8r+bPaBB9a54oF3zaCZPy1yic+3IqA7i1kcsfQGGlkc43GLEgmLy3DBO7STCV0p+o/zYb7jFAY+Wb36c34cR2m1BSEycWQpJLCsGTMTCrOqS3WzBaLjCPFVc53zsjpj94+xF1Um55tmzPJOWFJJztAkv+4RBb9ajPxf5+QClxUy9HcD+9RVIkx9b5NvyDtUSVLTbF6oaPaBLyfqlIJzvZkqHY9d66MXMXx07rShHHZ3nJGgbJVbc1ShTY7CV92feILPK9OzmtzZ+soOFjJ14V2u90jfPvddcvlAGzhZhaCFQR0Eg2QhLjMwF4JRnRFZpa1i4u/N2WlJAQRqj6PFGBMaI/sLCPF4/e+Sp2hB7dJzO8p3xItJR8U0bGP2U1a7xdbur/xL4a8kSfu4UIDwV1viXZZDuOfQeVKUnHuKSPVpmwu6FBYWXsmKohIVOT5iVKU2GM5TmZ/4gK4W9q+a6quC5RSRhTYvd1bp0ivgiN8WWkcftGFjXgTYWjR89uppdpt5fPGgdapde7XbLL59a0Nf6vl5+YML5Do2QHklgEpFqUFn7M9FWQbRiuM5M6NscV0iWcv2b39fAOX55q9hTabMmJtKu7AKv1oH9hyP4OxbzPLgPS3iZcWbatyafA7E0tlpgrfMQ3S9ipGACdHZvZ0iYwnOkZ7fnxJANUBgG3cnBsjUkvbNz2k2p+Lu8D4+Z5Fi9HNqK/0v3PhV7OSrjir/orXgLx8udbHwpF04wbBo7XJtAqBKBZV+5E/jXaXLj10o3eZZpWRiy++N3z8LxXWS2znnzeTn5MK+1C3EFMEx8CXMgm3h50U+7wx2uZd6zfbF5+OeK43izVVTjh43WRCta9DhqkhvPxADuq3us3zBoL7zFTMhr+8dJyW1nRS/A8gavwcn5Ryqm+qpYK7GaJsuIOFrGRqKdqfOKth34Wz+IhRfSMq1CClqPef0BlAZlpYeJxYoWAI1lROEzO7Gbg5Zgw85i07DAZ3PXpVky1mZASplGZilZEp9CDs5TfBjTcCpnHV4uDyHEhDGLfBx4RvbMH+4wbT/G/P3aGVdVfaBprZyALyILfOU1/suPiwVyQwiIUdXSgmvaODRLAxYy56aW1eQ519qmO/ah0OzhsSvX3Ymfg2unFLOQI2jX2uHNMSjTfSi+M9ikpeJihUj5uy1Y1pQD06985+jPBg1tnh0rTxiU22E6errc8Nd+bhmnwdG2C0MFGHviS2uJtCW3VW0AHbu+3WYMr7VUsJTPQPKSp7STyL/15AsAlv3fJyqFf+e7b8bVLki6YYLVHkn7MGkqFiGCuJ73ZfNrhFbDMH0WZx+6gEHYT57+M8e6to/8oh0meWIQunI1OZEWc1mwEqW5NSoB6mq4m66orRC2O5esKxG5Mbmj7yhXjc6eXVRV1aNphmzwS2op+j5qCQNT58ZBF67Eo+HtDYYFd9bzXUWKb5rCFKbmWmP7qtYP1GXR95ZcbX1jS+HS0VqP/i5jDa12dfvGlz+qrnCJRWc98OFjR5MunVVS5/lV3nD7SLqWmvjy/vdoaEtCt/sHbziWtIB3hlroqUaZJdFGhCKqr+WqShWR8tc5zvf/GdbWQulIEPIEj2l2yQHIgwEZYug7OZFzZ/UaTTjlJwGhf+7xzhP2Y8+wUBEKDlwLZI7Gpo1OIID6SBjikAZIMYeV2ZVADYdv0cZi4atL/wSIl4Xhcg+vSx0ogV46Rh1l+p8cZMH+LWzRy8l1frz7EOiKqPsV+vKV/csn8vEutEojvhL+md4zYPTZ/R5OqT/KvN8a37sn1lW0rI23uZVXbPTIPviqyJcecWnDspv/ZcjRI6w/Vs7VUzaXR9vUerJ6PM5YJXvfjP/mjFU80xVuXg5iQiJkRxKTpWCckk7eE0W0svTvj7gnvf84kR2vTpUv7Iu4HwsWeEL2X99TLSA9AIUu2MOPAqffVAXyvP4u2MVNlxguhkGLfXCfgTmf4ZZnOO1bbgKmjy4jK/DZ5nRPxSCExEym/XN+PluIFUPgbOYKkxA3Wr1LeQ3b5U6zSXxg5jXeXEmPEs1EzfKavtzjQWDMyUv1xh6+DHcVwfiweeFAkgmMEqzgv0f97mzuZJV6EorAg/5xKCudOvLJHA/to3yU02TzuRCZODs2Q1JP7z/uMMvFCX26DAGTSeoLMORSkM70L9o54duSZ54MWU91awJF6cAn3fm7wcSivS3TqCq+hiYMCPJKBqNpbN/6WfDq9qRlBhiyT89K//cEu/9XqWY1vm4c6laPviKq2aIkuRO4Rsuh8Yz1QpZLBbC7nVulyX4LPnWf6aw2M6uq9wIunbnvKs+wH0uQaFK2TUa9kHAIlvgp3syvHrbNdSTQGGxTc0DJYrajfqpmAzlqxs0tb8nynrdhg2n1F9Ol/TxFy98ss2Do+mhexKgH40FE+oCtBHWPc7dGv0kzSMno4niCi5VrTCEsrOxZglMxXhyLXbuhxqKjpj87EWxV7yJ0kIIVS39rNN9TQDQKrWLHTw6kBitJN5RWlag+oSXWfZHSfkIRA7WA2a2byoNiv3rABFR2Xj45LUluaIMYuhawgbWyHQwZbsLk3e5cR/CWyGpmjXVl3vPdxTfFCqXBN8eiYenaZh1YDM2AEO0YfSh8rsX+olaxE72m9LwpsvDAL9z+OMus0zvR6zYOsWccq5FLuxq8Dt+j/LOLNo0Ju0VgUXquw0cr5OYMPuRnBIku7UZWZRd0pCbF5fwv7pq9tokyBbR48IyDIK96YhHjx/PYNDG6tEQ1oZBoJCAUu3BUCPXX6h/FEN4jXRtzxN/kXleCKj2xXeMLc0aHG276XmRptbMwdRHG5Whq3wKFeHJPPkzBDC9yzUFWTBw228orXWUvZAw0aB8xWXTxeZHHZaefkkKzYkU2AmLMl8suUNsErw5u00zVWh5bbcwPaXiiAS09XwYXwGFf8acn5kf5uvl6WQPaEUPwhZ40ZQVUAx/YOlxQcBX2j4ewj1Q+xDYqePWRbAgRJgYAKxGMcFw5kbHpuHNC7kkI0Bn/SJY6TPQ/EnnptekKyKSOzdqBh54njQoaQfP7v6qsNSjP0gWTqJc6uoFoZAyT13i8XhvEGNDm3Yao1mtRyCiY8c4da4N8fmUZzQyKJS7IlWooSnsmgcCE4BuJXhBxsG/5WetDu7d/xiROukwvu3P6/0gl56MKjTK1g2+QudxriAFkJdFRr1SXdyiFQx47SCHltGA0yV0P8AiNc6ERPglinU92c506sehZgPYvbKDAcqiMkZ1T8gdHnA3fl+DkdhSYt5FtEPqskMlHEaIDf0ylQzNKA6sz9u/OT6ZPCORX2/zOmCNpSr7eOxgwM23n+iqp2BZQ+y+H7A/5DyIXRRcM8jxhMQmdwfOCbgZe85oBqdJzcw39mfjWZYjNZtS7dPXa5B7Fuj9D7dWDg05jhhXgHIAIBVSUQZOAJYegxaLMBY/fSLE/leP+lRKoh8dpm6E97nc54Gw/jzS0EOI6rAoezE0c8Pm4sc7DqadYVXHC8j93nk46Sk+Tr2jRW20IRqRULdCElnsPAeMKxjz1E3yy7ALsisJUdl07L3nwqLGcqyF1YXZk8FFqSOsqp++unX+aTWcOzSwolk9y6d48iy4s+uEFtVo2iuISHbOgV60lA4HSqIKkm4/GvHBiahTO856fEiM2TcW7uArDIa2jYTH8WrVx22MJHIY6MACioW2JBgKXaTcLiVGoYD//UwdqRYY+szMZ46unWpRGJPNtj+QAO4KidPDbQZ1hRCHTRPAc9ue0cGFl5bV8q8Pc10gVahCTKizW6bX8efXgQK8NKJlBy1SdXIv6Jtn2cETevzFtSaw11lmZ+LLLsbjrYL9iJnkpZyzkBE4SMgr0RD8j/+zrMIx6vFfHxPbhYJKtjF3okJTnlkHZ+qz6+l84IBxJaAg26fjavFtP1Jc8vMVt2viy7vqDdxLOlIboUWRbh6+tbNyiGiQLeDIdr1exAW1lMTaCbelbQzCYKCpTKuwCOFZ01b5do3SKrRVKCAxbjN8/s+2gawd1E0vZMnOC3Civ8hxFdem5yuXJCSZPEd4qZeZMrOY7nrLjZZZXzsujO885CQpjwvGSqQun6mEUEmz4w8psT3kFAdsF6zx35c8khNBh0BBsyDdb3IC2rYkMJcLDcURurjeF5cdD1C22UTFlTg9fk4ILyOXRY4gqAQQ6cqa5xfpvfxHnX6qTPKWUViucoSVU6LM/od3Tg59AvY9E6JrrSa7RCSfdoeRw/R1K2ftj+Wdnl9YPlrzE1JCP+7904FU07XdQq3VXRXEAzh0MCxAQA8MpC1doMisYJfocm7HYsgG9nv+1gaPpXcsRnrPpRbiLrYRCs5+tw6ynhrGib+gxX8/NAdnJ+QzGgM/UHhMfmv8QnUfE0oPv6o0EWfRBfkD7BSk93ySAmTLF9+P1DNWzr93utSOiRvCWE935QiJCu/z8hROJDyrcJsP0BVV1h7Pl78rCiyZ5lF+gV0RqUIQIsZGFxghSCnaFy1e9kjB/S5d0de1bw87V91F8Rn4ibSbmKXdgdU2bGFHwwfx5zMeboOHtidUefnKK9O59D18+7aHqtrwCCR7oPpWJncXoqAUvXd/D1lRSs4Lh6VOyjp9fgFJ28d3doYeQFGfs1IUj9W4+AzgXD5hlpVjR9OUZfTXrJwfcmxiEUttJh/cpkNsAu5TCW3cWHa1xMRH0TK0UYKDk+UisXN/SMyeA8mhlFevhbNjV6RdQAOfWWTE0PbqIf3aRhPLD1kQT5NmDXqp5YDAHPFiC/i7feHghO4oaoHycP4Rq8ZyFTjH1Cu7eeqFZFeTQ2TkKkgcQPLPNT6wvs2wqzkUPG2AzLEzzj3nI21kHcL4PS2vdoXF55XU4U6ULpAU/+awkxLUjQgfTHMrfUDUwhSjC26i+p1y5+yDZT7/c0k6tU9EajyOn58GPnBjpD69c5cG5FfBMdTLyxjK0XugDLWSFiNgweiaxk1HNUsUO1ufLhU0utgVgyjO4G7cR6ERECW97l1TABFyKHuYLeFI2UgtOTT301uG9Lfds8UWfNZ/zVXrIhwKiULmOuLg+8X9HWCF91ihO41yv3/5r0sgzLcufimN/pdCtXrYfS3X8dcPLjNmhK2/7BQ6KO8o2ady69vOZz/HUU/1919fp/LDKzedtgdMfpr/zv18nsjcRP/GTIn05pgchY0N5tcfHiXX2vUVzFdupZeGDlcrFaLxt0RXuacqrj+MO0LZ2hVaWnT74/4Hj9Gg4vuQgB6caXHXv/cEIuyUKrojseLB9csiDfAZt68iUdadM77ZrFRSXxb13k63k98vdgv1cOd44BjZpTC9QKICthaUEtaXL4SjL5VqVw19dUVDcyokz2sIrdAHwW0ynnJaalGRgYMyw2fkapx2/Pmhd+MxBN7yhMOiFYhXovJkSgcQSvnoTXGvCwkApUjhvTXDapbNN3xmsLl8/HkidK06/0o41a7cVB/5T5HKdMiOPmtSlfuYKjQsMTQ3+lJS1yr1yBFsfzMiDRJSF9ZU3upyjQyEMVUK84rqllK3qbbE8z1vx0bXLZc/q5YlVuVhTahkTch1JUHcRXahtaMmTV4fDbxVmTM3P/52bWGjH9+CMGxnUARL/VqoNCtvd9zNLg0FyeShxb+b6Oesq+cb+M8/06RAVJLXJAed1QWoMi9aDjWc2fsie9a5kD9JhCHFWrCTsaLj4Lq6bWirSOhmBpJ3Nasz9Qp76DGiFEHekxyA+b0nxLkLuybsClKws3tgqHDKb3dVjp5XeXVeHWb5GWKr3OpUs6oQlhcJpB87z2xZ4j75fPHnqibs/xio/LfqujSGnZ0qAd48371063kp+RMChc5XtdMcD5Xzd0tWhkjMJaiW0J4UIsphp5yp+e+Zn5GXQmY1v0UbZetjudOsNb+mHYftAmzmxodaVdvNT0sLJkDt71ssJRnak01fcVfD9NWddRIrIkDyeFZY6pCwgwFW5Jblu/XSsMflhkflO31Qf6OJWsUl3/C2Qkt78HmNCiHopRwsh3sukFtEgTAlKcRWerMwjztHY0aYRcANcXsNGWr4hy7CTqAG5rMzAguHog0Lnn/lqu74uxKlrbG4KVspQ0tUtFYE/sdxXplGIq3dh2Kr8MFM2zXT7rlTr98mnikfLzzpO8/VCgFUuzxfs+189HKDxcv4Dn1tlCwl3hnuSkVpWv2iQM8d6VU5RF7QQeJvl3uq13Y++R3PXHXcO30YNEtf8yq3GOrN8ovi7jJTjZFs8bsRFZa4BPc0Wp6fOaBJvdLXrhzFHn4lLqPTARbWG8qO6y5athCJ1AlSi4J7r5r1GUsyH/4C61ge8WAdKHTKWIUFADNEDNyQ3f4pSWBxU7q+7QncTuFw1vN7ocpySjjJ82D5HMihEjoTPQXn754/ITfhcO4ewoUOP5qmwtHTj6uRY4qI4QBPsDQnsMPCfCApOH75cld9rfXis1tJEbsfiEnNIn87+fzYagzr5asvg1rpg/7UiJr2AVlXvnV+rl5Borak7XQpJPbbcrT6/TwYbBeIRenqO7WEv5D91040uiCPYliX1RJ+OLbPp2qwIJSsxKzMxw/3rfFlubl9UW7O7hu2Glp+m7zU2O3+0rJWXxDyIKR/l1VbHFI5dcx+eGhARD5QFFsNRlnTcodYUMIes7amUUf6R7djMdt5N53Wp477k/d2uQHXXz6whlDmCK2LZzLMeg1benyHngdaoY1ZOJq682RJqsLZHj66hTl6tIlMA7iH9FAr4e0fqoUYgtXyvKZN95+kleea7i+GwnFa3+1WUOb550HHMruvLZ3x0qD3qg/+Kr+IilGd5NEaYky/81yrZgHP/CsTc+rFy1uk2vmWT7TfcqOid7DS3WGlNUSSPzW83X1HFFsjDP3ks5uYDVEfnIZYehcpl6LOcrnfnJxwP9MvQLU+u31aVNeBdruZjD3uBq/VFkBXNhCaUm1qtZSEa6VyVnpMcwmRL4bLP3mQWVH/3lmdHL9JCHvs+gdqdDahiY+z6FRUnAl91tRIYNiUVsSSZdMMAa88W7qF0SxLyS0EQwobKpvqa8IX652/bZfG23xBY8fB+0Mn7BO4nJxhV9VXaJZobeRLVeR8tULy8zI2H1c5EIlkQ2w9LzIV3sH2nptC5eFkGeiM14Pm7++DUnXTeC15F+VhqFp+B8RXr7ZqdeaqVyrTh2drflH+ihwGX8eByvTuYx0kf7fXar2OMJVVz+66emLJAtbYJSJE3FsYIjH7N+eBpwDXJCh9168Ob3pCoIKs5WZs8f7pIGpd9WLxj/Uh6QZ292wHiDd18ieJLl6oOOLPQ6BPxbyoKXefGBFEdLu/zKLwYRQ0HmetlKP/kPkNvCjDVTnFlZvY90YbrpZL2Hxe5iYPug3MM/UvEIXpnFZejKXrb95jdxOPUa7jjNX4jSosHzDvtiQZZ6EiyKixuk7Np84diS8omPjl/XxoKIv6XxS1SijsFHJVQOYXhrN0t9aeinj61gI2uqJqpoRwdrJ0DypIqnFKK3qdh59K+rBRUfLzr8bpuq2YS/dl3q7yW1UTnxtf32bdg/pLbe97uSm7TO7u1syyWlY+pOH5SllVj6Rlo+j8+MIIlvI7BPO9xhvN/PZtR7Ucl6zNaRctEsuxsn44EomJlADUebvNKAL4tkV/8Y+pwXk8K5FlSAmxToidF9H8DHLvFjLWBTOmCRTANbFkiT2j2VOdggO0krkqFoEzTbBUNNlyWAhTU5vkCmvz5D0U43nxtWhTjpLWyhGPxpaRELYAmbuSlc6JwCqKZtTkDQeOakDisgS7Xr/bk9AU2v1H/1HhF7X85WVDLp2Xu8OnWtEzW2U3jZuj+KoBRE5LGjJ6YDqlsrQbPlji09pk9Pit/DK6K6qNGRI9mMdWyrOV75e0cOtOMsZPxyPnolU+9KA/E0Q4GbEKwiBsW3LzWLU/U0rOu9e7l1aNGLTtaHVGFe0Tudm72kabniBqPzryZDD2RrU7C23Mk0kBZ0skMIlSFm9WQF2F25Bi8uCG588tz+aXE2+yMYqelW3OZblIrtbaxfZFlFs0CvmLpuZq3XTj3Iv213N9vAAppf/HBoRrtgiuKJABETvFM9ueyFvZovfaMvNv3a9EJBq+xwAPEOZAzXueoeS/iyeF5Pp05yX013GZ6KoEO3I+ddqdd2oZiBx8Ow8evSrdWiNlW9Z7X/SXYnVVHkje+tfOmfEqLWtHB/OmZj01a3BW4g/AfdukXoKyF81R6bjRBtalEtkz+srLfQsfNwr7l+Vy5+lmafQqkvI3eEAtapNm7rpM1L5K67k+bOqVl/TfF6taoKsif5pP518+tp9bdOUw0vgzQXzwEZclQSD5anUWXhE3A+HqlJOAUj0SkNYNLG3NeMLxAueG1hnbigODfhViBNZFrfLA0f/fs42glxpIFGxO5amftz58unTEoVr9px0tH6ggWG9H5ybrOJNt1rs0EA66SNLLoSCXlvG18P3h714pZ69nvWLjYGs2QZTlNFqaFw6f2Hy/hAzqX5tjYnJsnZfy0+ylbbwo9+3j64/9xPwdrC+eZmBtEBmft993Og1Vr/grWZ0VdlsprH9/7nG1klHL8sfGICwChbiBh2MmOpKnE6Chz4vrp4/QvNjWnkgSqfAZL7qMSXM59I4KGVu+3QKOORXMp5/KdLXYQGwmPlMWhVdJFowm9w2oWEk7uGvW/8RS4dJrrT9CZ0eDD89W3cwn5O0EqGtymFlVp7XjK+vjpJaH6AsqzXWtdIIOpKdFI2144hdTAVWieUtikAH+FFziBE2ennr2gloEvj3tgLrXl4aMaGQJpvPX029hseLjAzaAzw+3Ox2erFt/nR9wz93G6PKh3uydN2yZSrlYHK7hndHN0dxar7eFKtwY3tm4eWn6/efhwWDSbEzJr7A+vO8RM6On9+uzxvvnz4lhrYe83DQGs/YHM+am5fv5/t89I2ccnN9poO7pzppH+qyp7i9u2L3Ri9KsG7S4KC2/tp/A0foWPv4yFmkh7sr6Ydzhc9WfANdRhAQ3ensmsoesq9OkM5jadWZYAgF+Hi1BLAKLO1Z0PTglQXYM6ngnsGBUsdKTgXXOiRICx6ZlBYthu/OfI80Si2U8wzyPVpy55GoxqNaqXtcO5LFYIgdeGuvhSG6YsIfPsL9APuZczyBI1nNoYZAuxqoEr423PfRORk8r6slqsGa3ek9jwnF7evxzJDPJ5TWELCsfM9P+DK4PF+jiBr+qtJ/g9Tx/qPd6gQmr9yvvtyqBtggb8SuxPipd6q/C0ayB5nPCIb3d6L59dneGhLUde869jCcXCHqXiupTPndVIum7Sa9cI6OFgiRQe2iAw6ggzq0sVetJIQ8t4/B/DjoldrIMch4qI9ncEnPnYkJSzq9rRaL0iYL014fsKDUE73at1VYNGJRSvwbV4fflc5HnKr2yXuFw+1QYwELtuKcUHHfcwKfge1fj23G0DIrXe8EyKtRyvn0oQFHBebK/48sAMX2BFcH8i7NU8QngB9vFCmx166PTX4MX5lvRWZ4V18uuDiRbDzJQKocC19NXYPKtaFtPmsK3h/myUhSnZ59gy+z9zLGYM4g+WPceVo7yC9AdLj/OB82lvfcMtozbvT/NlzE8r15tGpXq5ryVm4VrFUtg5mQ3S6RGlmJbaKPkEp7YoV7++rVx9Gr0Xyb36LxA2Ae0Rcn5GvuQ38MeoGTCFQns7TNZF5suEvCBYB//01KB/cq2SAeKh8S4e4CX+cyO8M4m158h3ZJjVn7GnllRyEHDFj+54hGc1rJeQQE2VipQqS8L3bUM9+R8xdKNJn/NhbJ8vAv4uOZGEPonxcQmKatfjINZPR0Ta7BO19O78kc+xQzBIjNNi7mPJjDi+N7G+2ubVKtMrg7m9SqnryJP89w6U2ryyWsDAGe1Gl/tFdz3oSe0OqGzwOc+oCeq0EWxBtwVZ6GG0pb0p/HWyLdjXfX7sc+WakjABgwxLzu3sKYQeTVSv02m1D+XBINDQrpaC50QVl+vP2X2s4dpp/Kn4zBA0tTPXmt4/gLeZRkL6eg66FAXYyJTdDMLBpVWMyn9lE05UjT0Ga/f795C7XF0Vt4QanW3sljV+FmvPVj2aPD70WBcBvavm5JR/Wt0VBa8jp/vvCyLT9rhxmwAbwvl2RGtaUCBUSZsec9PBUOMnVkQXo+bhGOe7b33JbldnASYRUS0qmwlqJqidNr+bbustwsgtnxAo3P2Gh8XprHTP8fvBvlibP33K2aMt/BReQnrA0Oe36x8VVP+GrGP6CJbYiYkiS7fuxtH1udVefpPsp5C6QUzbNU0y6gyVXMXs8GoNtrhjGZMuHxORRbSRcbypY/O8/KP7+WX3kNPnc+LM3Cxht8bt9DUXw9C4n4b2wXGKhzDd5JH1iS8MDUS/HbWI5YAUVFByFhIAL6vrBz7LG4jUGgKdG08RwnCwaNz3S+g7ssiPL/JO6lxHmC7hEmg6CHYWmkBFyegVVZ2hA3h8sp7xpm/u7RlXcxKDEsUH3JJ80PXaXszKzQzq9znVKy9Doxa44j95u4X4FiG4D61FaEkrzGgUsV2aBUBwMG7ImFoq8PrfJ0c37ly6/h08+YBJJfpcOTW3kcXTiGpP/VIvToDzl9YYlSNao1jKWxQ55nJeJo69s2vBaKRV+2fGS3K0iKkQnqxs1zfl+1NQizOOUhbZrLu2QInDoDs3bhYC4PR79+ztjCAZUQddiqlw4WjzHhND2uL/YLwYpXLCE2ISO4tLKN6aTDcPU4L2mm5R5a1JbzowHujh5p1levvXDXLmZGz7S43ax+uPz8+NWBI/uBsRJjLsK6ok64EhslN+eDFTOnmAQxg/ldosRdQwpRt4SdXFSRqT8rFpbfCL8NDxggdilZwd2rEC/UWJZYq0+vJEu4bzq3Z4TPMLMr/IMO8+jik2+OBCmk19aLzKcKyy2HJNVcL8bPXMbxqfLUDn5ykkUSdl2rUclZ+k8RFZC6W+fFByWpo4sFFEpZ6QTlnNFD+JnAeX2qT2NdvK2D+Xl0sxJmvohCDh9VN63lcCj9/WGQ6nqvqXgA5yu4/fHb6XzWL24NZWSbscpp1wuaLljPBc5DGinDCrzoXccaWnteAk1zlV8FShqKbv1DfwA2kVxGQWhTfzogJlXYBWM/tqF6iucwwoIHn3j0/LtBA6sYlYwMwMhhO85KyD7UBEoynyBi976V6DfuO2Icp6W0TrxGfVSfOrSFC7A2yGS0cJQA8bE98DGV0ndTtRnhIbNL9oZo8wQ5vR8MiaZygkUUOkobKSDJyHn52X7Y2dLioixfgPJN09ulidP058gclVuqikPIuhvT51ImTEa7PhIxDxaUmMDaZvO0pcPcKL8tj+fGLwyX2RxPjH4kJHDDUk3DoZKtofHnkuAyVQKcw8+PFjuOk/Aosnx9zp2clSM/XUhdZHcuGpPxTe92vH1UuCWtxmJcTFeszNSCKuWkqgp5gzh+joQuq/HkXLA0f1q/56mulPMYFx7OQcvJmXu1r0dmAzaYKKwvw8884C6CVMMdZfBwAy6EWEZuHVeOwa1X1CVP05oU2ZYesyroWpxPBz09IXc5bL9LI7PNoNm2TpeG/55zM9P8MRdEfSoNxaQ3fusHuJIMXvh4XlPUN4prFesgsk0XPlvf8KE9GSp+M6OyZyQwlInwCX/0d5Yv82MJri/oFM8wtgVkurOoeja2Q9VBJ/zDWs7IwpgVtDbmdh24SODyy7YE+MBtIa2ogFi75aIEVUSGM2SAnrGMpNt2iUCF5ODv1NKOi8oHF0erhzM0eERoPV0nQgRUomJqF+ejb+cFX1kx+dxzaZ0EnX7ExUrXkGAptcupkYCLtKW9L6gLADTER8k/gQRo/wHcO3SOCCXCF0D4CRywDIjrukxG9G0LtVLFABEL5YwS3PANMQorkdw5mB8tVeJ60Xq8lYtOgSuFlulqtZyDmvGtV5tWRYzFx0heLsjZOPdrBu7K0lqHg+bQYvm7aus/TZXH5VMZW3gVLWPiIZx4RxMetSkwf0j/ODtoD1ZL/9n2+HkDMbHggFg72UzKt2kjbyscfSPQ8C/xp29bUM/f1wW7n2DpE3lQAj6Pt0FNVhCdeQmBpQ7SGhKn8jhikQeuQ7vHz9z8MFC/Qa2mDnUnuzfkC4RbF2WpVUlZfZ7ZySam6GHngsJTd0wJ29uX4Nx8liKPffqpOMfWCs4rMj9yoxeqQc5N4bL2zQ07bJl2sRHV8vTsLrplhgbj2u4yObWldtgXOaOx0HoSTVpzGE/nLEpTOHCs28qjCHfzdsTWLyMT5Yz1sfhytRvKsn51UJ1sre21R1mciZFmqbbZFCiH9aOsI0AFiXUhtryv03wEBJpdTiH8uXVCfIrnCeliyz1Rn6Dw0J+epLefRXQqpFqr/XIV603tXyOfFWfdhocgBqCggi6VPEixRTyaUxMSK5y03EOqlmPWWeHjjNQVrmoCwgQ4PUE3CEFvB6wiFbV1RDh4UBcH2yRmpF8Cg5xWav9dczpUaQso671j8k3AoTrF21mMLxhXdnwz5x3vPeStqgZc/qAhe8JpquBFaa4zs+j3wFYUJuQxmw1FsthVPWOJrwP5H70bkUOrIE5YAx+uL0Ry5Siuj/jA/Pthr9UOtkx4cMwIys+jZv/8T/KXMpmH+5rheWH9B5GVHIIwc2bmgRX44QOYv1kVep5FZVxebti8/ToVnC6fZvgnNojqZjeTKsDmprLbmx6MM89bqDEGL3XtbelWGNm8Cy/SyYaG5qyx58IBk6jOYeDvzaOmK1VIF5nLfE/isqjm1l5787sFx9/Q8TNm3T9UScaUyi+dcdzAzxO2xbWnyNCxfJObY0/e1UbEs4XP/OGUWFRJg0LV8bRFjGjvNup/adIY72JPpIbTHE6BKd8jl8+gouP4hIoGn/M0v15PKLTrDfaYsQ/GFiUhVkXYBeaaG+p8Su3sxx9F2dlFt/WvUg+QX/z3qIUCwkWzvtvW+3e+P4iTUC8HFL9QcnPH0PfJ5paxT9uvPU/DgYTJj6hlE7PPzh/X7aH6aCaU/l9m8cdtSF/0Xz+3tUXypOIiv1gLZ59amTCsxU2pZcxXPoT0hhPrezqSnE0k3x2m8zXj0+HMK5rYwCHuXd+K5PMAACRQUrH7QMoAS2QIqht7jYLkFbDqu1ukggwlpDPMNXGC6Hvv3ZA9GZvItJmpRf760jdCjAabEZ445P47D6vPqJ7qaDCBwEjnw+fKENjxMbuPFcEwlto3aithh+wnjQHVcN51RsaTY8rVxhKm4on5KzYPPnd3h1zE9JUY1W6U8IP6+GnlU/ADvf+nFi6IOvWtPR5DYn5LcShvEV59XjpreV+fcO241Xbr7VLE+2cpgroUZwIi6KcL976YITBfacJ4c8J3j9ngy6s9MmoCLyNZe6IhLbq1PSBpZGSf0/x1YOCJWjUzRcmfFTLvkbI3ZVbFt3RJbceLoAR5/HqGUCP/8Ol4NPi/lYXcmGrkD7ZQAUusKWWjuTzqr5wdxEK/mr+Hj24kcPaxu2OpN7C9dlQ7TVLdXV6khoOYTcHTHUkGC4+2tFgJWtxlDz7RoiHZ9xKmcWx5ydRbsZXJDCrSHbC29kv00QUtjM5GKcMXDVA7JoE9AuCyTcifrYs4X6qfdBYEHdspWG4u9jQFJuxPs9Ikffvx7dt2f1Aa9R2v9afwxWpp1EK2XW3aOF1fTtSQ/vxw0mv2Xv11juG58+LvvX5umdQGh0qz+kRlOomFjzJFr52qnMbf2B6ZULOBuM4x63JG8/Effxgh45dqA2MEl8LTKg84DKkgJtIAKGhCZIwBFSsykxENLj28+ZmakfXL4tl3nbRpJwOmjLZWey7lbZuDALMWssoK1uDtIqMW/n3bsNvMFh/c9io1yZFw0aUzoznPPVUab6rIeg+DmEB9w8ThL9TYCRwfWUH2Uur/3h8ENVzIWTkdWpUPyNE8VRmqISDulPMg9Cm6LSL93X3ierNVJ5Phdr6JDvZZsDDL0vJu+6Hxcs61hnIRHjZh2/bzixqXHL0gAYIbl6fXbZLHPNdOFjaYdpdn8zZ12ngpAc+5mOsrsy2zZGw7RP04XFwsdWjLZUgRDtSc4Mf+f893ziph/O8N79WyNVGqc7dxrC7+KEPmpCnguFza2vq5OJ+3prYa+zOH6JOKmV03hdk2R1Ni1dY7ggDovH9uNiro5D80O6n3L0EA+lG8PQZkrLj7mAfXJIQ0JAt/+8zCWJYjnyGt4dZBduIsBvb7ENWI3cRKk8/LwGcEmoYkZc1UNqbmjz3s2iohzWRn1ZH1EYDUvWsi5xGa/FFxcLurNwi6XCbnb5TCkOr78d1KND1BW+qhd+8+Uuc5cfIuZGTbaD8vFrDb+snUFL2KNyTB1OY2itz26XemrKlVXtopnnSd1nS9Z59PO6stsHurzH93mnZPgCrFLDJtjAm7Ct4hFIZSmyItyBsVnWTbW5l0WNoGJz85EA1YtOiAkpR6DbOZe09lQ2zJbqXTmPOmwQfwBrP97LkTYyIsHtqCd0+Yx70OIQlygVOEDVKfgpwVcTgmITxxdTZWVdMY6pXEoi1UWI5TAZwmsABc8eAFtZwTJkC0ssNNwg1H9GSJnTfv22G2NUp8dj7vb5eI8tuN+bUrflaXRHiGdQWSO9o7J9USNrT5wWm0ZaHdGyfW3f4LnpelUoR6/z8sDyNXqrZdVUz8rx8/e0lKc9cvcjCpUPVMaAVbW+Lv3+dhyMD18t+5Nz+l0KOWzsHoIU8kv3NvQluqnCrxYPdgm4zKEMtB9Kti0RL9/Q9bcNzjzqqNEpxrEg1023w5FRtkPUxaeHetzYyK/O3F8FPm+iVKnjSJ30SiK9fRMXhni3vjdgelhRf+NpTPv2nmlNW4d+ee/DXnNcI6NIEyc+LpgJYcdDBPT5J4t7zJCVT7fC0Y9e2mxKNuhzVmgOw81zdwg3qYYAb5V2jXPpFClfRNUZxRY9dMYUdh2Z54oCNw7W4PFKhS1eSFfxwY9ib6AT8J8/pu3YUpau1p8w+fu+xegN+Rvf3mO2OaSqz4e18Hmu2av8VSLrsfJ1wvde1QZkaHl/6PrPbsTx7pgYQWQyLgdwASD2+0Ozu5gd5y2QOSohARCgYyxsU0WEhL89Qs989yZd637fvUHLXy0966qo3Oq3g/V5vBmQC/qC+DGPScak9Hk2pNsCTt+0W/4q3CXcxLSGe8u4fK+qSmuORLl9BNV9vOZz1YyRJPLXjbjJ4Td4aeRObkW6ZlrDqy9wOWTMhCeupwzhAWB76dzZUL/bZjzfGPKQ3pSL8wn+vsI+JBLsqZuhu037DC7UBjx8sfbNy9zuWfcoNVGkfZ75GqSIcu5xUcGEiKJud7dt1NKkXQX4suhY+uXOxfjKJsTLqXiNEpV91G68lRuuxo7xQnH64/WRntIgjOjaWNfn/8O6ENnTTmtLCatL309utceSJo+OLac9YvV5nzleRjglEnvJYbjY9/kfQpp8o+eK+m++KY6lJSJ2Fw3rBAhq/csGq9/BTVWCWe8bcj++tyA9LrZmG3u/nfCCVf7gFS7aLr12eqdPoOL+0aA6/etZlwxiST0K+ycDSedxu/P0+XIOXkcPE/oZTv69Ib4tDRSLN222oUlYc1P213gDP3uegBXjw+ez1W6fOck9XKzytUqGOU+D4qThDXrAdpRD+US6zT0Idj5XkEkEQ2dixLgKRaHPhhr5CFnOM0bkxi8an8DnVGBFtxpU/Lk7QqyVwC2sU9EQkWBruf22kYxWA1kvKmkaCKoxRoH89iZxxnyMRlq6l+TrNHwP1aWowmWWb5TgUdtyM5frjuj2b15uKzFtXe2H4DRiBLaTolVCggz7Pbp1XrWEVvenE+kcmEDxqGW8cq1k42iWxdvVzvhOGJ8tQNx818mAM8ABMH7whc8vTth1jhoAp2FlyBwX0J8J/vq90F5PevCFJHd+MmQoUWRMe9Sn2yo/xl/AudfW51y/XVuWBba7wJ7nghd5XxBd3gi/xJWYhRulqDnBTz+WvVa8aHANqfJsjuSRQzzQegOwYxZMOEDcpEETadhJIdpUil58hgQ0mIFy50+SKBgp+1jbX7scThlizGMOz4Pai9XA0mqDaPQ4rm9ff+OLypK8uBamdKPxwVjpvDQlftndjhuRH4fTQeDT0+pTlLXluIkfyz+KFnnrbXuVkpJz4mHNyXM79HL5sNaAdWz53A9J/p7xT1/O+eqd8IA01gLwiZXXnTNyu8X66rxUPps9diXTw0obI5Mu8dDrZVYDCVtOTjmzns9ujHVyeZo1v9iaPe0Fvz21hzhEqvUJ0KrvhBta7fWHMPVXPOgCPge9YoWtkVYcjso9jnTwV8ZWJ+EQzr4ik6Gxjvsg1+KNWJYug+AfxzbYJ5JzE1uOduDudhWeno0zjhKRPqq1oROnzIQgiSBqCyyub2CPT5kQ9tdDl7rY2fsIJuhGt/sDBK1n8GB0IE35wlh9dakscHBq2fZUMZ9m6q0pdcLVZ8Njj/YXHJ7MIpvvZ0N4mczcqIM8+PWfef48fhlzacak8NVkvIQPS+Rit3El98yMLyP2ZkwLZKhaSOMDWV4/SJtPCeYND1ZSswF25lrBvnAvcL30x5APpLFTL9qFiABqSDkP749RVus2guWS3UECCppaUB8Lc6/VLrjdLnw3smZCadQFSH6GXwRSNtVvN5dCLilJqFKPidysczl7du7dFwQopA7SW8uVi839m6QFA8yjpwiJanOfhSK4NujnYgYpQOHezuriirvW0aU8D56b/zjEHu12J0MxlSyfjR6MrRXlDEokTffHO/Vceth8t2T1CbHk77ywmuTaU1/Z3wv0So2jH/gRwJHA/W0OH798+o9EDZQn2U3B258Thz1etEVb//HSaxm4jwneDZUgzxUUM+1apB+doPEG5/AWbtgitDYfPpBPepz9WE98XnWro6PCg5lHD//7nIC7XG96TvJ6/zVrB+ry5OcmnzilPfBRXNgVb61nhP85bNRRtuA81yzJxJAJ7WbAA/cpOaH5AjkwlsHE38lE5k1RHNp40DoAvzmCGH9GXaUoDgYvWkC0QvZ5uBYNFopAK/0774dSjIh9qRjQbucIhcxbYUnXSUhmA8OPChTdsMefC0IfW4ftQbVbCbsDzfMjzN5/v5++I/H73CqjJq/D6fzwfsoP+5Tm3VWT41PB/fKxHg8GslzI8SLozXnv9m9zIdDJpnwFnDg5glDkI13VrFC5EEsa+HofdOCRQBStlsOSuQn67GjVK+nQic4SsHzCNkjAfUlBmzd/19PJ1TLonah+gC/ehtYztAmpsHf6kD0FTkkOfapBqX6hYV9Is5F9aXMVCs9x+BlUr43+U6PSooocOnyImW2xdyYvMQ2N6rJ4pahJtRob9fUjaa8D4Rkwnfc5xcczrWyltPxY/kuVJOU2TKhpwaf9dOFOuxrfWSk6497Y42tLN+d71o1Ttr4Eq8mhfPRZpgrEeJxw0Ufe216yl93p/jiQhgJtZLth+vEgayl4ZZTmY1ehWS/lCPBVoWz93177nrRgh/HkvAsmHEvUxHqk/FtUCti5jOSMNTSYloPLuoNtNI6i/KyAEYmK4vCKfP3tftJc3H4/a1zNO5qtXU9r0aQeTTTE4vBtMBeaFuF4biVbr5dLx0NAj3+fvX5583bitQ18Uf7TTlpwnIqNDe7AcF5wxF6IYwilUKrwM3k/JipygQFdwthv9mec0Fx5igP0jVzhKkFtZs+mWZJ1MqZACwglLb1CuL7+Gr+XS+DiYaXiXAVIsQl/QSEA2WUcnuqRTPJJgullgnY4oDNSaf4z+Zzh5qNvyN/cFBXMrXZupBWh/Luizqcq31kOZpJdys1sWi985vQVXrwODxFqFEL7njwOoAclCT4NOrx5zO8uXxTASJTh2PWsMWFnQ/znXkL8N3ZQYaxA9tcESGWlTXzq1JNngRXUyeKoU1G4buAvhNafaixpuTsA0H0XljiqS0aXaYWcQIV4tHJ9Vcv6EIcStRowYr1oz0VXayp0GT7Q34p3C0fxakY4hOhQHjsCRYWObnyE5QT1RNbwYp1wx+Pf2d1LSraTnkMKESz0HMxAvBY7FKx4SmyJYuWevlZYe4J1li3FWQiqtqgufthlhA/zCS9r1Avgxf61+p1pq5uDK4HU3rwdt6brOfGb8eBOjQm2Q8ID/iQkYKnKlGsKevhHUTmTCTV8WCDGb7nUrIR8yn6e9EDFkozezWoIR+gWVGCtFzMvyjlrpaWmNo82FtpOfG0aqHMU69H9avD1mzwA5n9ISfRxGIWEQwFmm4cvMfj5WHF6PAfDEKSlx+/6GDEEtW7H992xTnaf66UCL3YwuJH3JYcneaYtskcYMEP1knInvQG9Dv7BCeG0NaSaW2tCXE4BEXgMhW0lmQFiLBFikMJG5StwPYUWPi+kOBIsFQ0tXgY4GSwYQjwfFohdqzin/spuwDmFLYyQKz8wAbAnwC7po6MGw51MkmgDc27ijYdbFc3v3k2zpT+sShnG8qXL1aX2h4Px7dHg0HzWCH16TD6MnvufI2Uql4WtvrtSJhPEzlWRn1/zhVUwP3G9V5y+syFhlJws1eA9C3OVLYEO8JxhpXKtm2Zh7iZI32yaoCRSjtjligzmHw2pbkaQvfWfMO3yM4dnHY7rJZsx1ZRGg6hG10jeo0JX7QY5RfLmOyndKFSaEjky0d8FOlWfJkWEq5/YEcYkCAsX944m03B/G0/EVXZRFbgqnoLipZu2Z1ARYohyF40TjKe8uK+8kh/Pfa8lKtay3WVM+vvW7WNU/p0pk/fq7u6MYy2H9806qPF1/5yPG4e3jkOjNGkofzwqCPly2A9vl6q/EslD9U/QvWp6T553hUdxTRpX3VWweuNDxWkpyzsH78v66LXMs/HuulMv9x4KWdqG+8szy0OhBobL+UboLXuL99tQYOI2f2kN6EWxgt9rR/pU0XhWodTod5/Exk2ldrhL/eZZTWsrnYuanrhpKibGkVAad2br19cLxxdFdv2XpNIX7idiZXwtfDthy085IZMgcXMAqdE/SgQY1M12PllD0v40d2P3RiSD6aiurnJfH5/aWcgEogGOIj648dIg+oqCZ7WXH/u8KY+lkGy6nHnswnzVub7QoF5U+NsC4lju9C2n3fSy8Je4OZxTdUQJ1v8IuHrQrr/43V/Zzng5rOY7XpN46fH0fvxS6s1mmWG68nfGoxbvU2mAGjfwr1wEnOkO6cZVItH85eUCJ+qJJhSZQjvPRE5pmC3PrG+y2YZzAGcM9apkvvge+fS/7fpazTct5DGkylaUlDQDYZn8ydAQlWzNnyTr6/a3Tepo6taDGCFTIGeTzI022gLvGmeNHZHJt/LXOgJF3w1Pnc3H+8ryNa304tBxWGnd3cdy+juilFjQCyO++OZPCh447FmB1UhmvUuJUmt29y/btIRhq/s/Sw1hfOyUhFzL3yt1DrRLnvqcDLuX89mf9oqURoe+01uldMH4+B//Pkj2vMUMv44/3d91kyJH3vrtDhnwEBjusNiUAQ8ilqZM/PE3ygmwDmXpBSf5K0VLdDHtCPQC06iemoVvv4KRpdFArxZv8F5mDTUYMggofTCNlg/eTQZ9o9i1fH81UBf1/OanFiX4xa8+nZoDKZfB2XjRXpZtlrICWkpK9XFVD+2dRslm9BYQx60fRwqLWbRhI9aghSVBHAeaWH7YeiV9wtXXTmiAUDggZc1bdVgMBO4U+911Jy4uyxQvs8o4M+sWS4dIiiRqLhLSKBnRcO1Ep23M6DvYlft1gQ4EbOwESRKacX4PlbFQER3u3O9IvqPG7YnXc0gDWLjpTyk89r4h7Xa/E+0wfi4d9rThq1JH5ltxtfiT9X5TQdyzW8yu6gCiqM8SKtRiAYwELi3+5S5aCoHCHBhA+wC1F4P0feqSFURn88FLkcwKKhZhATpkOZtbL7Ro8viLUigAgNIXTiyG7uZsg1MiwY/jcQ4+vQwyPQVHxkKH8uOjlEG04ZNg1YkpWks0j7a24UXvB5dy9KKJttEZ8R48iNgg/K4bb4swvQiP80xrPo2n0Y52pFGLlksxAof9+mIYammYSwZ4+ap6lX+OsZ1R+tZN+NG98xQlYbjL+c2V7G+CXo4/n9HSLSORu3h33kTypnl5KjBd9PwjlvrrfmGTAUXwykus++ifP0hk0AbAQxe/AcHlUzi/+kCWoswbSq02x0I9871kytrOP4N/kmyOP0yHivHS0OsNcbSsql8rSPdCCcrpW/tuZjxTKnSuHZ45fM/P/Qfpxf71Hx6JDuIbIyruxjiQixBvGUB1Au2SELmMvZpjNhy/tJ2GAGoXX6UmQGJeyDfwi+Ymv3PtpTBImQ4S20897ZdIpQ4gNIfgrSZILlUZlCBCvUSUMYTIOWPUMqe4CpxYsAUiTl6FgxIahnx0x+n9C54VgiY3ezms44kTzvrpePe9mVVWavjhdGeH89lfTaGvm2iOoaj+GYXYnWs5YeQ07HuTNJLcJAOO0shL0LWiI2PK8JdnN18m3Cogb2inCGSDNXL+yG6CqZqgP3CL8FkQqE5/vlv56Xyp9zJOx5ylDpgBZ1FPMVeoiWWa8O4CWZPOEJtTDOuyYx2fhzKEq26tzsQ2WNm/CYH4eV2JsWxjlDhjfJeGsxymYk1ZRLE52eIc2lV8ap49drdRJPY9V5swZ3IDm1aXnE1bLklOJWdaowU3AKIiPa0YlTRy/enJmvqaaZsHbXXhdSaDP7dJf4ni6QxnM2/6mvOpbz7FbT+L7gk/myPWGr3+RzeVQP0lMnZLE81fqdlxvng/T+GZnAU/xcH8YS/XXTtG4X/GE4WHJ7bAlBXU+BH/xsaGI7GR5frej5Z4+C6nleDF/yLdpjJ6sMhf65Mk/NjckhrNc+x/WYqqwPEcSVZVteVx8bCFOGZaeQ9wT43ZCbt8yz5jm2naAvN2HdU4zINO0jdwaLTxFWI5RVh3Eck/IT9+egK02H/7qphEgHZ4e/w5L71zG7944ZNmdWLP0u3xsEYUKi59nf4BJpiEzCJe92iLKBA4NfCew/ZY1/3HdzywNkbNmD/Mx+IZrzVbMHiTxRv+C6+6cHZJHO+1oPGeumUb4f0JltnrrxMWtP1Or9Xz4peq38+rxisZIHklNWXsmU+7FMmQmE29WwW8QewmWQhF0eRyueIM05L+7ukgCpbVftKaDOxNXYvEQ688T4D7r+aFkexWyyNX3Ie94lgx2qdIJERgCYjco0p/+vUfsxVljxyfiJKpjN5EOtKOrCIPTmGtknJEEzMtbwkn21NclHBMpbpdJwsP2R/2+OzqpWf6dhSiMRyEYQ6Y3R+NTbsD3mNomcvsmpYt//q1kUAfNz6BjV4UlDklpJsSJnV34U0WM/n/ybg/A8HPyiD7r/ja1kC7fNoqhI3bhDn4unOmhXsKTE4/Z6dr9IrcGMcd1rMQGsc/I/jMe6/TP+tB+vrlbv4Olljo124JZ31F26lV9a6Wxut63mxOx+OqPrjm9jT7D9BPIv1S1F/+2hi+JWSVgyIaeO+89YI6E8gSSknw7WScz+WMCO55TpALAwUsTs9aA3LoO7I+neU5rvRu8jPaAp64kM+pFKpXUyq1QPbTvjQmGZaoO6EgZjmBBV/ComYqVD4NcEhfQGIG3aEZDlCyOBmjrVo3+1RmC17mHC1Qm8SFgg/5jYGm6gOLOxHBcqIrqEFt/o3FxY6t7OYuNz04HL65c/SKQrRmv3JA6oPxn3PcjrVjuZev5CgPjeu7DjURJ0fk6iakZyhNo1EgSxwwwPh/D0NI2+7aNhwOERaQAvh41UuyoCJva+mUhlBttU4Eom9hDH4id69r+csuUrCURvv2pylFvDefmqujOiH6Ser0Rk69NQ82Yc1yZc/oxyBex6oqPYHcUxc5ZTKI3fiNd1MeD3zuO3qVkwZvwdK4UyEZVj3gD2oyo0u9jP6LNW5nHhPG+7tbyZChvXKx9uSADtq3AtClPVBXfyV/hhpLNQy7iRbs8LZ5g0OoA8OZ+/PNsubaW38biLpzxNqNenT/8ldmiXTZ/0UJrDukDEddM125rtPhYwDtjcoOXE1v1HHW35lE7byr6stdmn6/XucTkTU/+Iguq46cuewow8Hw+fD2HQqvdIWg8fJe9sRqnH6ahi0GaOuR9Mne62B1FDGB9z3bqSa1NVDsCUrhw+M8vBwdPXtAzc2ynOPPYHHXudEIwX7GXfTdOLlyxnWhIfexllRtqZcVXl++e00sORYWbqzU4hPjOD1YAQhTOWW2+Fpy3AETVPJAO2Ee7SJIzbncjmEiEdyl2gM3ILyMFKtQsFsnN4hKk6rf90pQATOpQvAsoFRn34uveF1PR9cFPzE5niD3y9NsHWn1N/1e+ul09dSur3ulOKmU84tTnU032cYC5j0fXJuDxvFUBneW4QtHDLhEKvfBIQH2WDGToHJG4/+wcuB+w/reuaqrAN/CZPJZ1RCQce5WjIv0CmZjPat8vQhSxLvbdr3nXhcLb1xm2PE+QIkJsulsOwMnQ5PY2PYnviwv5DY/CNtqj+6tn9Z5J6mll9f1vjV7pgEkSdxWXiuePXDUCFaDGfRbgxkQtZpsgudsF9+p7tPlBA6kSPqjVBjGnLf1IksTxWbsOKqZuab/Nztu53pEfP46frMPhuvYqV1W7GD48lg1qf06SxjvPv/CfBaDpUhBmd4LIk8PRfrkJJzJVdBYK+L4bRxsPF/3jiXbnBww8yN4jJ1Gxin4+gokiiO8vF4J+/JfGCy0WVyL9AyYy6T/OfJ52anWl+MNnlttdLZurSafwZj+3xxlBmuhvWDz9OcibyiDXxe9RQPdDXQhu/PvpoBEX16DMX78Es5hxDFLfwBxhLhgkIoHqCaMSewr+a7rh1neN7DdA3pVzPPhEhxLq7qovQTslnwmQ+qiMD2p5LDckBwnzfWJW3Z9GUngaruuBuTk9B/O6UBS2CYtrrFPzkId2vGGDElcxS8NLPObU4M0R0TEt1xpaprplWDdpnuUNvg4Hhs+2U9U7U/FAIfrN512cmB3w/nyy3SiWYxswONc8FW3gXTJbNvBhTg26ppDgygPZ6DTtUy0hjK8NwQSOUqZ6GLy4OrVRfJfWLsceaBudZ867V/BCzuaVoL1/B4pPxU1nukfeddxjHyl1uOyfof/Eo70GbFVoTfcYFWOXp9I5kPTmhuxRM8t4oDwMA2iawklQH4Stmxk5MwRKfck25fR0vmQoEK+QqYiwqrOYHENJdwJlrZKtS3IkqXvhN6/AI/2bmzpwUdXG678iv5L4edfeTBAXb/fwnVy3V5+P9Ngkssxj/O17QHEebKwxPQaZYRj/6WATLLdM09z3H4USZDryBPGL3JRtU0mbssWEYn+cxTK+fMLTguPPEXpFneME4yXFQJ8oVFxsaeqbDOFsXHu0N8vuEbs5cWO55m6AvNVJhOFbV5NHoaL8CJOs2sPn+7cfbnAsF8PErGFq9Joz6Pqw0kLqP27/uSiWlgW/MEli2NLCUQFy5+r3oJBDQRFyWwZPLnmUC5CvMr8deoqixjlS5XSrdy3I0zz3UOXp00VHEtqY2vCFrKAci2kQQIIRGIuLlSKhOBA9z2fzpla96VZJgV/rY5Da0ZIwHhrhS66/ZAWRS/5ytBCgW2qs4Qs9GDu6lko6P+uJ6u9WBirugTTpnV9OPeUZ8q4eFdU9Pk2L7NO5gUWPjUOHIGcBn9ckJC8x3Opqkvpnk8jbxi0TAIUybkpgIQHtgu1Ovwq53zZS4hIYnUrbmknRRBvF6c14Fy8vV0T0klGrP9ANMP6+4BqfCPls/He7a6jGY/Wqop1c1vtxIvy7bgg25ph+gtgUrXrkVWxB0zKiPZLx7T9wUHSKbsLhqHC+1saONXQHKOjPRPLFHGVM9NCUv6cW7/9Srs4eVOl3t9GYskblckiNUkWF/Kv3auYsN19x6UEqNp7Xih3it/F5Lxn+A/5+N6buhrHNSPXlYTmIUKdqywCvNRIxO5+PXjyrvC5227x6nOg4msys2L8013R7ayg3QiU98nCiq2xw3Skc7hn7v/zqABVRJL01lSAP35/nqdlT/1zNXm/evlaFp4s9BqYvP1r3eIXnc2Z6fQaiod1pbCfdWYLsW52yD0J2HcvGd6z7wiSQP/tHLnOP7LTToyic9mKNmgFlZ114FhUhi7WO35FTyuhb9XAHIOLq3co3wXDN9mtafgLFOAk32SkMv7mro5jwTZUz3SrFFRjk1U3SdcGk3GPBnoX6thuECzcKMaA6LVOJ3fk9wrJO73rqJg7pIF60Sc+tS4BcJG1n5mzyEHGXiTFQUqjf7szz+I1zaTX6HZ3/NJ+8AHoF+beZ4KJu8ccH20BefoCIiNqJC2w5O7BRpdygiAUc8lJcog3EeP2h2wqK38hsZC63lhsPsETSHp1k3kMvQMJkTIQ1DL4q8x0wUm2/tH9lWln9G3S5G6aMN60iS0lOCU4XakdFobNROv5kvJcfNI3rc1R8oWpHoxrfrJYvCQac6A+4gI7Bfhrf4xswNHwdRHHiCHbodYxc033kbXG/1fZFXYNCJ9jXI0ln769Ojet/EVTftSNiJDFyvOy4+vUv79aUdpjO/e0PqmkEb/3ViYivX1atSHc5axhQ4Owunfby1JJzmHzlsDTDSezIVZMhZT2+Hpq3rEUjQ4CFjkQcsgEgX1oOsKjFiSagaHR+kFq+GOXqvoApqFV5mP4Z0SpWcOlSmtH897+mSw/eGf/Y3bd0MWOVek/oMyGa+ep7aH4xcLY4wyqJoH8BPDOa13mZM9u5Ai0AFjjc04WyyHVtlky5RKlHZ86UWYpuRSMtGJ7G5bcLoNbKHuIddXUd+tEGc+x4057+B8+xBxMHPizpVRCplNNJC7JBz+B5n+9OYv10rGTa6dxCYVwqVxib9xcM1yxc2WsheDItldl/JnX/THRGk9oQdWFl7mdpxFlYf8mnkv6vXmoD4eSkBk0CG/vJ/X2fHg+IvjTB3Oau1CIaBWRPpJ8OHVCCLNT1xmGYMda15nJEr27WI1ayOO8t9/8FBI4YqXLREG2iSym2RMLkgmxKuUvfQkhq6a7cLk98q6etAOrhsHWK8itjxbgwp0Oyb48kKuBHX5TrlMjFZdfrK1kpbLL1RjVq/s3YaOHfF25dGz0YNfZSda/+O2GjvSbaKtycLadTzCuylxwqIsGpjDhaRTT3lLJI7TpIsN0E8QAPX/SVWDlztCZCrdLVdVtP1r66/AtLx+lQel7lz666WpLf9sLCib+awm/0uoFuvx9Q5Sh0NtXaJ14OCkFVFDSr5Ueswh1CUHztWkdKMXkvXTDTNPfUCB26qkZ0jwYyFaPsxlkt3cXFiVkuhaD27cSPxXaa5QDooZoVTa/uU4G44nsdXvN+37xeuWdfUy0ddiFD/Xjtb6s8U9vGWSqu5ieWUMfbpx+fLLYdl25uz0no+UEhNa81E417GkP8i5KLI4MANxZ2/P1kuCAM2CFxaaCSZyR+tfs1snwJWZLE8TT5bZj1WUK44fvImAQ/Y6FJUDz+wnq525jBhvHKBf2INzchQmYolAOJxlGlEcWv3BQZYQWMzk23Fp8Bob91MWlkRwsW1IwVAbCCKFHWBvarHQc64ch/OuLQ6w+mIeanJrDYe0xHryT9cNW57oM8q3n82LyqukawVhe1c1Zy5ncrgtKZKL3V3YYkUOdH+fxeN/MQ7NEEB1kQC3eKtPCBNwmq0C4aHJIiQr6Jk7fAtEh7GI9QzXG5fYOJ9pNOrjRNVi2KJ5XTCFP5afV4+O8aIl3Z9evVNfWhJiXNliWtvF2xdJPaZL+8pnyhGeVsB4zf4AqcQVo1QR+bV/93sWXOuUQqYmmk/VlLNKI+5u3SGIP+fWlSHvFyIFSDglXCFhLXi/HhZkR4YtOmqCTlPcSmvLq8Q9baucZG3lpsZX/ikk/T/RultrHCwdTxajlqPtE0vhk5TfvxOOWoon2aQ0YXlvPbWCv369i86KxJqZq9lFeF5cMfPqIr8HX2GX+CjN8i2fndIxqThORdZ6cPpjAs2DZIaurxFWN5R+bTwhJuPXPa65qLfGL4eEPru/my7HEebC9hvVR3NC+/5Fm0225Wl9DrUbiNp847QpKyFfmmYm8nPKnXIT9uyrmxOt0IIM6GvZGcMcaN54wCG5KJSOeHcrMmNhxdcr55rXpaXxMDn+/u5ED5v3lzuUE6HZkCHuE09VCJFsLgTnEE0SuET0f3ltf3AQISJ4PrO5lI6k4M2+6DwUoQpXVWfckHc/krij+NsGJhtZ4eJs5YxVGTMTCIQOWLPHL/udnYrc+uo4XBNXMQwV0s5o0Wv3GjawcHO2yutVxHdm3gT/oUAxBWpagkuER1wqKoGluh0hKYae6QySfB1Yc1HGZNOOSqTxUpq7lrzDUAu12mGOXUR7DSFgFRph6S41LYvyBw8KP1Z1sOZ9RXb4O6JcURo13mh0XakPC9oUWiZfzfsVlth4wa3cx4sgYYJX/CeaE6HTmfyS1CB1tTQB96YwyL/AqQsJIKewfYcGfJnwpeq9d+7Hvr4Cl88eSPQ3sRWwjAMWxb3vYsuY9r1irDYB4ggB/MpanL3xupB+/TdJebwaHi/eI6k1VTugbf0SdjqzpFbYiQnYXabn6Q5UUVDsQ31UrEGLHMOpaz3YiViqKrMNaPmMaRDRy4vg9XtzZC3fsvt2I1Xyqvhi2kfA5MNad7/uF9vGiIcms7Z0rvVam3q2WmXTchAvfh4OoONJgZ8bM4Vsz0riaSwLtVt7hdpoVr5bzjAWeUO9/bUi+Wgy7eXwFktkzUiRnO5nWa/DKz+kkoHwjnn9Un6NxiwyIUO2X2S3WSW/HONA9zhXgqG6AAWnFSL/M+EIcBsr+CokWNKuZTlKW+5+u/+TjuTS5Bh8EJFgwO4J5KNJtBFIwhEX5xLxpLmAfptKusl28GbfwXUY0MOtWW4nsR/+y8tnvTF/oEjZqIBsXlR1NpY5nQR1izOZggtEUiaxnuwLqaRpt4DaeE40Ea0Im5RUS57LocbmTs0law51S6ldtmwW/BJSqdZQNUQx2VwjYqn3OKikR9IeSw3Sfc5jxEX0hGm5uL+q9k8bpdVzW9oE0l2Nv0ZSZENQPnXl2OgLlZrVKnuXgcPRql5+JK5EM34iDwRdWr8MDLQoO+KqHcH95xlCt0sCVQET1O4cpuJw8uA1RU7pAp5F/Qv/C7LLe93n9QpCoH0EzQ9lqvwk3+PXr7ywUq7a0DBVmj5/NEdW/agy+c8G+/P1w3TgMHm8oaUYdJ3tRyxPDWAfNlKLv2YFZ3ZedLG7Ecr9jqnCWkailgW1eIFlETUjBpDbaWKVtb36sJ7G57lJtVFkYwbDeWe+it4ClsjtvD3V399PZ8Ox64v77EmZjUq/1/U8ed+9bz9PWqPZn7h2XZl15eyHDCcNbgbpVcf+7vxdaNZtIrz/pDQiSOaxLCyT0XhoVRIIAawlYN0LIND2adlC0Qee7Oo9+0A0+OI7ozS8q9YqSn3dQaHV7ZDpP+uwuQHj8AL3upXNHuMm51GKm7lXLoiJ7cLb/ztl8QcHI3C8usZBNEfmMmscDLu0E3fcsZ9ylwP1Kk1z+d32E+JuBA7A82QRxVpioRkIADBnRxsHQapx5A77I2Cm0BcP4CfKYcg00C2WxNzeQ4SBYoG9IIcqQcGxbKx53cHuGmfW9YxWTOpfVbeWlcA5gAOC1+xTJiRUuSBRrH6LA9lJFjXNv7se1oLqoiKYq4fyGJtTK2MeAwrPLqXSlDDtmxwbzxzsTk9CTWevkXFTepCv7TGt5uIxA1sxbTEauSJPU+M1KVfWY6VbomfT8qN8+QoEeiApcsXdGg8BQxJGkv0cPeXFnDXjKhXl/ctuBSle5qzxlK0Q+/KaNi2VSiFDiP1Lln3JKeSz1KeOUraJBRCH/H93qK4dlhHlDyasDijaOAMnSNesHriryQttt1AzzPj0KKtG74M8NUvZqE9frwqLHCac7jvoQXCtBRknvSzuSecRAB8BbLi5b49quDzsg74YHHh7tS7b2ew7ImvT4/5qpifUaWc+fF903Kv1yeQZsbeH87Ppsll6OLp0HI0qc169+zptNj/r/UppjVZqlWR3jhONiBDxA7Y8NoTchbZZL33sTHfWosiWehPBVU88tcxUQAlI9+9swINQaswWX3RpSB2TD91qw44um5RgCmJnXBiK0tpU3MeQKlSmbK5zPI1g/EYPxt35f3FwrQex/G4i7tqpR6AylHNFcYJVzAyQUFN7H5UonCMxgJvFxQCogwk1bT+7KVix17invYkwNu074fu1LJXia84vgOST3VIN8Yhgf7+awQTg+2wB/A0vmCnqEAFSocgJxSF9HmQgE0rypdJMxxCSDakf3B0zN/vkncuLg9VLMmeUx1IrfE07mGEFDNRsONmkfmkv8pz+7Jmj/SrQanvPui3+qtOvdDsv/BJZuEYflvRDpxP5sL8UnO4pYcZ19/E3gMJG9UrhVCuvgn3W0RNhepECChPoIBeWgSJnK2D4jlvpiSbgZk8XqKopeeCEQ0zJD6JTqj9cJWLck6v7uJTNnWMSFRzA0JptVclz95pQKY3Vml5GlTsS9yP+qgmszL/8yfKbd6HtFTqKnD2NUmTn0nSJAsm5uHBuFxbFD8mZueBfFGP4Mji1tjELpzEVU9s0IacRCmyGQz5LBC9qMOFVU9C1Pp/oIyUi1AZO9eN9bzr8u54nlwu5NvjD6+T65nTW53H55UB7dGLqzIU1JWF4m3CumuLKy/Wbhjv9wkTxQvbHVaaBsFg2U1gzLbqe9EXwdnFPYTKQJktxsoU+OiH+9QvfbdU+n1o8i2VX0/6yRg2fAAl+pP4CUps9c2vSEeei+7skD80caVcME+n9tR4M4P/BQS4BH8QFGB749kQ0b4EuMJCs74FeI2uDv2/uW2F25rPHUR8FHb0nxol30L3ARYGp3gMOtkjaF4UUuR2NmLgd9wLucyBx8JEiDYpe4GQo4pfgcsvlukjZYqQkMPuw5DipMyaj4UzDPygTKTK5y37TBHApZM8/whYNkzeFhutQ3Br7lmnJ6ZN7yuyruVLnuwym1SoFoCn2TztUvFNfw8O8fPV4Gxk1a6LyqSnFtE9UaqSW934H39XT7bIYupAk04nghFeVVb2eqHJjWzRCRgO4F4nMKVp0c6B+8f0H6OYA/WGLIuoqs7DRfs3Pww3qldtcpzOx9AMkdEXKQ9TF+yrw6uhkUOYpLXibW80hsz7pz3UF60+vJ1bIay0uDsrxVoEPziy6eX7w0TXF6Posu+8eAqUgnIoF/Ll4vJZHqA9cbqJlat8nuaR8jmXxZdZjX+tBeJ6xWS8KVvNRHhiqRUe5HHQcYEe6Op0kJ6dKG1DeSvJ0EN++dv+cjiaNyMc3+P3w3YSdP3Spl8HK5B4fSvRCVsNX6dzwwSY+tWDJGl5CFg6Mtva2SkncY4zMaSTm7krol8Je0L2qM0EoPcbcBMVGki3HtssmwU38IWNttNCDzsuANy8LWL8uRD0+KZMwNdgqSNIeR74nm07Dh+oOz5s56xbElHfhHL7GQTPuJ9l/kme5LTNZKEieSdJ2cGOawt6ks9SAKlE1ImoezI8bEQAJbAN7hnWtB5lKfI67dmxZJHmwnfn2gzPTSiRvkjBgi6PR3aJacFUFNu9M22N+zrfblEHh9jmHL7v0p/c/nCVORAm4bD64YJ2hXh9RxUxemJh84Mof8wNQBEyXyuzYViV2w+9H47qMbt/KpuJdJd3QKnG1EwFNTxZxUZceHv7NfLl3fHhn3mlIiHpqBVJtF7BsJ4GZLrbCp9RpWam+jHUb3q3TVNPLmGYna2pfQIgVnDe1WASNWfG0LMB4qB0G96KusJrav4qT4AxggfW88qa9TdLUMCr204bQN2kErynUEuGerE+WF3m4GvYPa/15HQUVmkVP317dTqPL9Iq5LujyNs4/3efnZaOkocpezpaIGtxVWuWHYd5eT5He3z8mtXmOiN0EktAi6MwuGWdxXijAZ5FL+QkiqUJpn131wflqXCpdfn/rvB9HH2bfD/HW4GAwmOiT1bSTMd7Juw1jVLt/+Bwj9YgkjxqR7On3390eQFKtjJl7rDM5UW8sK30QS1CZ10xuTiLVG5NmmkqAmC2DZxfIT7eICyj0szxPviM4kuFGtdJ86Fx+VrPJFT/fn00VPe3xlswMdbv8PhFhVtj7O1da5gNa9e+YrVQ1u3mvbGLNzHdceSRp3sp2jjKov5nFP7YS4M7Q6si2o65IPSfev99ECib/ZJ95LnFwebDGQfNPdxyJmEOFnBW7wNxYMgqplSgEUG6fILGZPaoKarjDlkMYBPj4ThXvCSRxcA0uyxC4TeOwJpT3Ix/XOMjyJmsWhebwOJghIYw4Kny7sCkMoN5Znmcl68uyFXlByUq3BJROGs9iPK7ZVLFfOh898PPp11d/Xfwvd6knErN7aV/rCuVw1+pElpRa1mIlc1tyhqdUZDp3pg9DpYdyvfppfy7G3MI23SYcaglzbFHvhPR9A9qlCDRM77kLBmwD3l4td/S4yQB9a919VKmP/RRY7CSej2a2SX5CwApJNDHmi2ZsCJXtfXcSDiVmJzTZq+/MPXMmsfl2HD3PXoWWqXmru0/Ulri5uEyTsUszcDtKOcUVCEUXhQ/1ZX6vusxp3CI8da5xsGpw25H1rHOMrKtyi7U2vhQmk9Hsx7fOpHXcNiZRQ+lq9eFB/fpZbs+G+vFgNu1fab3obLCd9tsxE7GofnLM2wtSw81Qc9yqa5WzLBCqTARMM+HxsPsVn2mCnDffuRXG/jhhLRFVdRvKATKslXileyk7lfzD2Jz7Ks9W/c+816iPmXPXm3EzsbLjhRpWLBgEkJKTQDRbJvIg7lrJWGA3Eoe2tzJuBtykMX53/y+N8WCHdxP+nNO34GEg6t2T9Chavcg4qM19q3XVFahvizwatcfO9uCYbwfKITKM5aJ7rROMQaKYc8W5kLDEUYD3EdHh48V3qYcmDw5KC0MgiGo5jLcL6yp22T3TtfZb8zqdlZ35IWtmG9fFadeZTAwQK6uAsd2x+wXrwnIZW7lStjmNEWz0lfmp4kAfmMdsyf71g4cxN7oV+2VN1E2NUjzXqCRYrbynfEw0mrXqhF7KMeGOcqDLqq148L4xXvBI+lqayxdykyiU4/VSvO+YenftCWc8CwOBuYWaZEYgWYh/m9YyjgQDVUikzDpwye83BFOjkAFeIQoLLro2vFSnrty1KlKjfEt/lJZg22+EKJkyfqcT8cuoFtLWCmhhoYs6dx43ctO3AEZ1lGDojbVo4I3UvldNg9QCS2T1nCvfyYnUKTPl9XTNrhW44lUkSy+yYgHUp/Aoa7+7KVhA2JkaLCaTyOoeF0ev9eFEqReOhnhy8laijVnzn/spjcfPh1PdOBQpsjUbiEasujP7GgVqA6H2ZUpQ5d+PLhbBP+/8uijEEws1a0Yx903C1qr6ESDY64enh/s5BK7irxINkX07Ejut+08/9dMaaKp1f0NoXfyFjDt9s0zsQ7kdr2M/T/EIEsDBSNXu2Kmuuaj7l7azxkYutwv717Wx7a9CIV/EH3idLTWomDNhBExhOE9sb87JUKbpj0HSqR+sqy6EU4QNW69zEWigr9yeUAYheJxjo5gLLnKmmPYqC52yZmLBpjNzwlRY/21XpqF5WySUn5jTigOBcrOBCp8wJ0MIBHt16AgYbfDG3QKj4XoRCvtxJhFI3j0QC2sKKyvv6vJydldyMrSwx568TlUacnQb4k0AWG4KaxzkXrClpebeF+8r5tR3Gew+OJtKV5q/u377JtKs9OpXziWhul5m3WQfmwvd0i3lCPeEFanZ0eeATDE0GBO2s992UyiWLmVMc7VypWFg1qgCQTxGK2cFZ82IrnGwBOZI2nLvm8Hb50H6YdSVCqdLduksVtF9ZY4kFgDsZfYEaZ6qrfvJyf22z+p61uNGvgDNaJx8c5zTy1f5Sb2TU00gr/5l+AqZec6QLzJqfxTOsPPsCv5xc5fRckvm874qG+GFoZUSdAeVYMThiQOj1vDxDUOP/jlc+vrXD99qTai0O6s6VqDacHNwYoLttQ61y+lgPOE7++XY/Omz676Kzm6/Tfy1rggzR5crsU+Xs5Cs5KKrNLTTZ5oW3WEte3mEMA6LmU4iavr94ZArOyrid++z0Lf0XyL1RTExaXZL6WPGmE/G6pugE/VIQlRGfTvWRZcSgQSzyy3kJI1tvh0j+B+O9LlXtLQnfKU5yLlOZBZpaKXYgSViIeKVwmU05dpRI05jiINRf4QSfZK75E/t7cYTmxNlrlhZID5d/dpEfaLE9xxCu8sOTKWQeSRjEibufSFKmRonPBCub+q5ZDtD3bezcMWUPLOBzLML3DYyZrJc47TXPC27LDgaDkSfy+Dd8wjkH+mzQzXdquB42P0c61viuRcMQClejCPsTqwurio5twrRzDlRF+bVX1vo26dqfNL1vmrWZLKsSMqyI0K50loPzmkZNpI/B41y8+aemid11/EhSqmkmflIDdDOSd6BFWNofJwreBc/xema6yE3VXAhgxYQwsCtt++XM14yJfNcpYfSlFNoSnxxETPe2EGtUWkqD1vBQKAelGt+cPXxevWtNo5wxOm+QzbWHEmXVGRQrNWuIoA6SCe64W0yOsbMtnHaxlyZfp/qKWfp7/xupDrM1arLtR40DoBXRhSXF8GrSgMRTNWX2nhy/Gt/rTQHyuDH9WBA/tK1yWSgkNhqdlw/eZbx1Yj/Ro0E/UTXqNLckT4yR3qYkXKUO3z0Y2NlwljENI7FPok7wg4SpeXPAJmw5nFhdND4y6VO7Z2cvQ3urAjZthL0FPJSLIVmO3WL5HyoLfs35WF04BpQk+rjh7OzlRdul2L5SwoHt4ppoMxVgXkyRudf/f3teDeIO3pHBaA+i4sX1p9Aqbjmz4GcpfMxB+DFCEiPZWdm4t+TJlEU2bAv255LgZK2m5s/s87s23OBMcYGbyNlSIuV90iWY8t8FbFWYYArDErCZK3xXu+p3++FTT0zZOh5x9Er+0hchpGWy5FqS3CETdPLwsKyh9mSSyC4YzoE6VEd3WZWhnBXfha6Da7yhDxZG0ihhMyq0TO+URkztdKiStu/dt6mNOFB/mh5EnRHnwI6nYrOLuTz/HVk1O3wPq5Wfl5+KjU0o3xeDL51Ks2y6DoRpYNrmYUN0dCxFEuJDEJFIKu2ndai/Z2RVwV9aGAJ6yKSXJ4zGi0RhCEEsCrhrkNn0o/OiAfIlgVFDNmyKt0vNt8f99Phtkhm9uZdE+LXzQjSyTFJPZglGlF9Zi1B3WGet+iYnlJ3ModNzCIbWQuqp0r2UWHdsPkS2c2L9ovSlFql97xqLvl0hWcRNfXKfbYS+BjcvT0c1JTDyXzSHSiL7nP7enS4fp6SnJwp0/bq7ZxeDOJffttcQ01plK4+dKXYeT7DduWJaX6PfX15WxEfqtoegsYbnLdciEW0y/zJKm1tY+CpNwABr/z14p48w0vL5F7Db8j3JFx4x4l9C11+BmHta/67TZlUlMG5jZtFIIcnxMUcbiAdKESv9xSWRxruCLywbf/n1H3U3rjb7BVsO3v1KhzCInuBj1GmOgAdtd6eiQwUpJ6esDVe26bw/2VfOB0qxgJYMgmmeI8rhTMmoiauqy7pPnkioAQIFk9+5JLtbiVzyQrw1j9nIWJygHAjmLuEs75MUwa2LwWbBaNJqxaKxtqrZN7kjFfO6k+oAlArqlm+XDgxR6UhKjRTXW6bmfSIle9OfYejbkO8d/2sLKoIP1rGyi8yga/5s7s7bkgPjS/lan7oYF2rsli4fI1UdFkDzmzPWvOPDXUf06UJcrsJoa3y8b5Zcjoz8BNmYmOf8+B+1bQ06/a9eQQoqBS6Vx8gLoPgBHBuW/olP7pCTIMQRpgGB3DKdUGKJu5+DyX8nUzOGVLL4AJYmUHpZ3Aanmck1iio+CmWxbUYVbDfVO+HWVvqLIfTWzmFfsk5YzrDwauAVFPyFvw0k+SHoUx/kiH/+nEzkVSzMTsLqPicWWRVCHA2Zv3p5WbrftSiH940uOXilTQalUpHv35YlWFrpHzz0LPJgX4/eOmTy2K0foHRmckkPmzYVa32cvxSE6QU8HZhYrSQiOUARzb6F+VqF50LZAE5CxlzEAgbSRmIx2LuO6ouzLi/Pv/yrEZcu/X9e5evndT1OdIa1PRezlM63WfDUKK3DaoBNu+Z4H/2zGF7DGL/PXW/1x5G/jlLbLMQcKVS6iMAYEQsjeVWBlpglrYSxz8OEq6bYQ4qr/Fgg4N5QtrscwVMFR4SdlNOf6NCf1p+d6/kMhIukBD+mnWoBo26XyRwi3cGFD6OlHcewlrxtiBmS8jpxfv5jk4BrPVnQQe/mkGoh3GNqYge1G61hkXs5a7Kz4uytZmvyehW+FCNMFXcF3YvsRfrJmkIwJg1DqLsd0SWVxXNrcY7NF3uVUXgi2cefuBf9Nqr0nqWkNhUUkbdfzJAO1QPXsZciZbsuHiiTaruTNsnFRgmYwQMmFxbZZwwlnGg0oFO7d79zffuZoAxO+U7O4hU0a2d79McJJXEb+9o9eANtYykyORS2KMuOLLSJxGG+wQ7ay+cMqmnyM2eedTI2bFrH+x3H7DcmHfSeqEWKWS3si/JRLSzT0hGRNoEwW9w8PdaD5ITeJtVix/kNRD7Wzk3twoLX4vWhDDrXY+myv2VodUeJ8e2IKJz1GTsOJ4OuudDbXPAu1tuKV8ct/eE0Z/HDolRfu4aUwNT8/pXJ2QRFu1JYYvoFQqio5ONwwemqko9c40o5J+kj4IBNkspVC1jO0r9RpUHCfVdW1EAQhr58rTSVGsH2PEf3/g6U7uoJekR2Jf8sQNr7OflM+oPErnMxqYJyUOpf2+fuWvD5N5H5Q8OgqFGkrKDSzDMrSH/YxQ92MGBdi/q7Ix5x42+68+j/4et9+BOG/u+v1VAdHDBFRsSx4m7nWKnTJKJRO9IQg1VOtjGNr2ooLf+iMx8f5P/Ws87MF5X97P3uWefgzr+qUKs+QsQagNCrxYSyVsc9IKUuAPlS1EAV/GwL4vj9UebjWK/2iMMVd4gZRu749W+ZTuQ+zBQxu5FIjyRwt5SDwk2z7CdVjcFZZAdzT69f71UOc242t456wmATGyfz2hhC68K7aksPImM07edpy3moetZnM/gEqPZHlxfLvfLD8v7yseyKehHVfql3lEgu2VZ6LN4na6Ls+uaYgTOyoP9Bue2wSf1To2Lvn8v222nonsmMmZ7gTR30luVbhx2pn1Rby9XyJOMJ7V5sTiVCSRZ36YiZR7ff0JpQPKXJ/QP6e6gLMx5qngA8y5l8AIk2+9L8PkTgM3q4Aa8zG8j41I1ZmmkdGhT+N5By605fUk385PPhtP1sLD8oB0zylrWCVsc3FmiTG6Y16ROAcneUEBWzW4xy0LK/96zWX5sQbde34Id9RPBswkzezcl+rVZ9Pf4zeWr1fy6WvZ00Eq9vNImzUmV2Lcfl2g9K3lv+tjsS3U2Wla0MhN+lmQ23pPjBLdlc2hO2EJwPMFcftfcSNjs5i7JPrpTZ4SOuiAqdARgvlF8p0HOre+spR8b3RyROLXZVHPUZ0efNkOuvQ/7YOw+7zjc5WAguh4qyIk/0mcJ9923v8bdscXBN3swZd/w3j8deMv14j7hyQgGn/JV77c9zX5Rngbi9n+rED566mcjioCr98puOBYH66Tbv72fQ9RuimZ00aO4C6DOuUttG21HaalwzaPA2n4GNCDJ8rAJonCT8C6Rh4OtDmPLfpxj9HK+thHam4IjG5/eirIm+0InHuocXMzxv6wD7ENIRbLd88sAwNbjXeXGe3bkH+GyYxvibIsvcsM6i4lFZzWQwbn72BQV8ZwXClNfY9SWox/P3v0wa4rDdu5+Hs4DiWEdMy0dP0bOSeZBZw1034MxynbhqW4/rMN+xzcKbtnQ9A5fQUUWB+osD5AxHi+AAhgSnfF3isQ+QyXGFD3Fj1tLT7xFOaI7HWDOUM45NC9pgF7cDlyxk+wiI29qUdj9ChXup1npzPNZ0LAkRp0XyNXbsdLMz/E+7fWM9mVmXogp51lvdHzAe5a/7zqwaNpSaWijAM5OyLnxQsr6hF8cLz6OJyOS7b6qD/raOqn3aeLs11+uwVSaVv/ee8KXX0DJWFYxVZax86er7oNQaE28SgH3ve2XbTl5J3DaicafKPsF7DWRMx+As4ojaj5Ed4h9sTLr8S0OxB2P6wKdkB/eXAC7hjjV07uhxdj0LIlkQpUS03A0u0PXszLILDbtkWQGn8qig/0vfVZpTjCpZUQtDpaANL8VsLcwZ7l7WEk64oE1w+2qTzcSh07LI85S+SC8yk3kIcGIglEhjhe+pLw0i4WyksXBtYJ/X1Twj4fvvK4SYw94TEeULFveSoAXkgStZZ37s6wthbyVQGzi94kIDotnkc8TxyyFbdmjcvKs89I5kIwePxuVl/4O3a7YOViOF0QXN6pYf/Txq4Wf5Rd7u964SHniajn2En/hdxOfymfPT5Ipjd0OZF7eVu8FBLjYCS67woveXFs369LW8kGWlqpkPLQCNXpJofVG6mvUkKqbM2IemzlKgbu0i8XSTk/ZQbMo42sVoPkubXeQ3/c3HSkk7REhrLQd2Ll3gMGT25COxlLGlx1oXwzCUmpi3fHPB9iZRFS6Zt7JfoBZyx3zUT3n3vl8p226Crj4c9vLLjeSok9c1OaFInmJrTZWz/nOHkou0a3cMOPGz2yTz5MsYzPAStHMI7FJKVjGA0ZTPV44eyrbHPS2H4YTeTWCYDawOOhapOb9wTkyn3SQsTbrzgfydDn8ooAtwsCWi0vMLDbePjxlGk0q/ua6Opvy3fdwXLUR0TGkgWreDvVBLQ1VY8CS/ZRLIoWd9EtFcRx9PTXVGDVurn/j6OaHxqxt1nj7IrU8mn0J6vPZIPuK09ntgj+H6Omt33WkMKEUbb3/S5+BnfuY1D3hgRUHrzM8uLFWApaHqzj/X5ZuSngu3sZc7ddR0OLgarIHvBbYtjgYc3CWZyIUj1cyFBuw+WaxmURtrG8djD/7gekThoSfOwpxRjB1XgJCKb+dSKapDTLqsMGn2lcPBzLTSBm/b0Z8TwsqWaKQ3fzH7p3p5AwR+9rkMOIHJax2jq/tvBWUZVUOrkdIbgtW+Pa0zD1RrKdOp5mHPIF+TxIV79kDrcVazi/QAamE61ww2JD062aZD6lK5cCQce1jcjhq8s1sXRbQU7Ju+cRLm+2YJQxe2zgp3/PrFIvqDsZuHuLZypY4ijnonM+mkn0yv5NYja/XzopxKIn6stGa6qpvLCpqDQggjMufbvGrNVshdzHlPi33clj6ogADq9yxCV5G1dI2vh0rPplFytAPgJP7IpaH2MvMKA8CfUwX5wf+GxtWTs1zu45ROrFpqfOwVkoAteKpx+JgpAcjODKZzM/nC3LVQ+X03y/+1xt/MpZXYyFn2nOZHh7pE2Na4z9Mp4Pea3wR1dt0An735Opw8PmXekKxDZ2xLMi1eNFcL1y3ZiA+lrlEzNFdy7kQ9gEs/B0CYlSS27qgl/JPwMM8SMozUmm8f34977XGSD3UTiwM9rFXT2ivd/7yCaZxcEhdKVAMFrzhFA8vKtJ/mZpQ3Ns01sHV+Pq7u2+qJCc99U973ppK+yxdCsWsz6j5uiQYespn7gdtGJwn8hYH2UhA6zAorFNrFMZaHBSSWygSB9Oky4eUaDs+RnHSksRn97QtRblz0FEGQQmhGEwoSLEkgOlB2Tr81QiAzzEjxoTPc4kmfVlQ7HPYcf7th2wL44olL5Wek2ATCMmz/YRge3RF6yFCnpUZyw9ClA8tK7jz+o1/1lOifkDBjFslM13I4KGGLa/vXVHMUBbUJ86ITL3VgipIwU8nb9ya6Ni78QAOzctTerzH6fhe4wz3ZQokPG+T7mbLs4XmUKwN5E6vBYg4YNLZpggAsSxkGBiw23KQEyQFJAfJ/awtDkhrnCcRbxzE9069y3ILCrxt5gJX7VhyXytphVphO3shBOBRpvhtlveiGWzCuROnDs9tjjSy5vpFIRo/srDazic5k055hvtyVi8Z7E02VRxHwGIV0LP7l98Xgyk1+vS7J5DsW8q8af7O8H5s6sNma3k0rJnGidwfWub5a8T1MJ3Blfeehavz2jvvdKV5YzAjftEhWrC11eR3WUxOnGo08UCTVzfjKbCwe25JDiLPRqVFpJToyYZ0qVJZBo0+RC6YRv3x7qk8B4zXmTvbYyy2rF19rTIvkvno6IZje1wwusMwCIn+ztQQ/5ep8U8OrPPSmHotDiJkuJTa31/kAwh8CNoXJQcOC5VGPwZ+NkoWB9eyq5ca1GZxMBoD1lJpmBMScDRXwWc3aCBZi684COZtlM95SJPMsaW+ngiHH+b/zYiByKEZQcXiVnhzTsKV0KPN67/wjmE7gNwYBzrHMcj+K7I7pnqNaV4AUk+xeLHiFTVKUCmHCNHMdtqkrK977406YoWFcuR9jpMeiquggFjmo5Ezgo08iAli6RETS/xXemxZ+S/rDvie70XVza+aphCOiTjmNInj5oHBfpVc5I0srZtK/7ZUmXrw9d0vQYw2lFz+GoIXHtJNhDv5gFYE16I7oU254Exvij7SvxUrCDnP2ubu5ylZgdlPPiTB+Rxgam73qq1D9eqxvBUwS2X2MutNDsP+TWeW8Hz/ayzrMZQ63U3F5pu+2pBOWn7QYj66ZrEvGe3seRgDvWCHaSx+5gD+HmfniWXuhmccbHM+5uXxZNrrH5fOe4uBrnXfO+bT4hdTY9ztV5e7Pm3gMwZeYj4pntZ0aVxeTlRR/eB6ZRoPemNONXsIvS4x3EzY+mvnTSUDxLH8F2CZZ/cN4nl/X4ztqpHeftW0JwkV4ITKHK4ubQT4ZmNr32VZJObv66JeOq/qyfqAiS6ST8zSEzUGrWqwkiALAXjb5doDV3s9cg4VsM5GaFUrWJXgon6Lg2L3pBJgBpkt20HBK2asG+kwK3lc3y02xt1/cNDygyK0xnhDM4azc3ccSKxq5qxkW9s8Wmx2LVv6ZQeg8HVAjNGAWhdC2ubvXggwcR/waHCZngUeET17YZxWu5aC+BxapNn39hmZ1ZdLaWZ+slwboyQyY+8C4tLbzxbn95BNxEMr1JwLsg0pGcRJYRd9ESCKdvmPE6wKPyRpcCn3I1PSNmm7vuyHy3a1IZTKDaXy0bQ4uBBNuSP9KFylvCGtsuetK8bGWZmFTe7yHHnHYmPmIUI/KRPQca8ICIGbUWazIHBMO062vtnRaEO+L2ZW36DWyaKrN3qu2RIpb4nc02K0rQKDbkepB2LkamZ1wwk93efc9gvb5O9hZr57GGDgMXY6GBS2ykOM5oC1LP6AxtgZvdqynf1soCQ1P0gsIbTMqunIWSud+KDHkpNOwY/xAFLz9Rat8Vj/OpyU5yfafdTsQz8A//1k0KdjN7MR/WEwrz7PmlDdUjIvFwnFHFWKO2bBm78w8HG7s/Ux5E6z1GMz6nri2k7qIcqxkO7IwDvgFu+pxSJ7DFNlXXJZTaGt4Ob8bMY97Q7CZ8PEC0W81A9GzVZjy3aqf9wdN3uZ9t00pD5uSYt6cpSN1yf+UCnpPnyLOg43Mb/KYpZGEla1gi3L+zmNtxYHn9b9EpRwb959Hxfnq13YO15W3fDdD3hfa/gfBy0/aMdWmp9UHCnH+vyMl4FdzsMSsWTZUjG7akuxZUjYAygPdpxJUkk56T9z5xF2uZNo//WYJuh0ditUsV0sXhwNdokBqAgavFGzDSfxr/Yqlwk0WMeAcJ78OGMRnPy9+M94V0lTzySfmmPxIOGVRiNWkoJ4JY7b2TpMKL/OD96lZx2u+/WDbAfOlX5YV/iUlox7x66xW5Ns6UvOwCbeqtvkHtc+vEO0qiLa7jxGeuC1/FZWSEBkC98Uv4UrEdzRIOwNzKm4cZuHuyq2/8ZhFEsVs7IMF8sUkH6SITKMMeD3sYeyrvcbAHfMnC9O58NqZnXIRbWq0OeilqM3lyiT0qJq4iWP9F/TgN5PV995MNh/jOXKk+x2xL3iYM59eFrQuZs8X24VfGiH9W6aoWJ0UnLmLm0+5OVNd7EYjehP/u/3w/FQ+3Q0qVp+cGxxcD6YZFvXmi1rDqLG45u4ohvH1edJVgPuwva0XhvCt8RQb7xpcE+Rl2h5qRoBnz+Z07kQZdcIaNsGTsHlYfHj8sSzbKmJvbIdTRafymB+LC5jNHM0/LxwLal2kuqrRT08s/78pff0B0Qa8rj2+mhSW7L72ywP4Whin2Ay9CpTQ1saKdT/r2Z+oAM+HQxUmkaR3J8U9sPWqYMsefnf++D/OLiRgP7OIHhFKmYZ8Xd+MC3EgQMhXp7ZUZ/ZquzZDwhoZqkC52ES3129D5ZS9ttQBWlfCS6mRHmjUha46F2z+XkrtV+u4HbiQ6M6nfGELfKqXqFkR8HOazFESE/j/LJVkaCP9EYes9CmumOmVnYFXhhxHgy/2S7cc/fKvjfO1VzmsI69qM1/eonjY56Hak4RaZE/1Cmnta525ldTvpdcbtCYKf6adpU9WBWfqYXPu90glI4rHVAAxgyzbBwHCfLCWaAWj4B/Mw9HGcmL5zig3EgCxa57T5qTtsaOZbxLn5z5GA6IjmtzGu1BzM2t3Xz+ZJu1zJJ32GFTzHhfZhb5WDsb9zL6OlgJJ4izH9+vPYPCEv+xlyoPDpPCkEqm9GJVvkLXSqPMnGyGlvACtd+PrAvgpgA1Xu6j09HXVxN1+IVZjrPj8ay9mmXx8VGtzQe9V+pw0r0YaNXK+PjS617UqrXJt6/1WdEvTpQirOZRpEOpd+ozqJCt84lkbPzIjIeO+PZmxCwkHQfTyFEoLK4Ds9IiPx9AMv1RCDSxcfl+t4gjdvI9CVZb4y+fIs6STcvQucsCyF3X5vnqOKGaJujZtAs7LhWOsboDC2w+5RADtDRSo/RHzbzoNQYYSNwXJClPAfT+6n0w7y398T74HwfjATRmaX4CBdfIzZAUTSFICIW0stMrtSxLf/dmsTMWE2gehpaUBxZXPYHWedbucLqeFUCzZnOg0fE6yM+zuHf/1EBbPW0ecz7F2y4TZ2Omg+V3EcASgZIcb2DrdoJPX1GZWDm35fvhkGUzKQe/F8rcL5jnZnFKeIo3XMPLJYW2G8lT0JT6cJ+QASNwfAsQ9mmNKwUNLvmuUQYjC/GFr8k/Nj8mByGVt75e2aDOy4P4hP6ZV8+q8fyDsv2lGKbEkr9kIAQohVYr6NK9OBBabDoic+vi1BnQkz1ZftPLNje1T6o5ivXmegfYU8MRrL53XRkPq9WSIQ+sonJuaMnAV+7J7jI970y8UHOCneXB2NZiWIyXRoc50OKg5SYuK0Zh7O1HdXF86P8FRcuxaXr3WysXDRRilV5/3Kn3ptD9+5eS8b+w4bVaAuej2x/OgFIbDRLByxnTOZ4V9W5/Bsmt9g/pLGXYrR/INAbP409OiupODh1vt4gqR9a8QQbRacKfCsai9rYQIgLIQgB8/EvQnFXYy+dp5WHvbNdcZO5tbP2GAI2mX9Oa89F4LjWjZ1hZnvC83ni/eJr06Y2dMJUofzz5FUikFOveQJEYGQP/qJlvdZtRR5qMe6ODNbC4iNvXst8tefnH++B/HKQ5S1uYqQCCMX/kB2UZSLbXaWJCEJif3/OlDFsD9vgvlaxDTYpsos+5CzXWzsRtGVjrpZOdOXQ5a/ToxGMvgjnk50jT73OXmIcwg65nCWH4WmZsNnnrc/hVGsOlqNspYMBHhbE4mEjpGf7Gj8SGGC531poKuPxS9g0bHJGD3w0Si4oG3cjyocVBrqYkjFZKOJi69jaXog29sITKvW+k1Tip/OnEbjl7R+qL86k9g/W0kRBeqnWpGfCtxfMJbdX35SBiFyXc8t2BLBT8R6oF9Yr9oiQiQYSy+fdZFlwfu+JP7YObTt0ufXxw6qBJv6/D1tlY5a0GmcTPWXFujAqJl4f8tilwfCKcluFxPiW8tjg4y55G7HdCdJ4xwYs8SV2XeKRW8C6Xh747SSg+qINB1zpIsfnR/Gn8e4yebzGcUdLno8l4dhwlzZdmfzLhlSv1qKgPyFTxgp80+nfVrFGD1t6fbO3UK4Pu0TsxQxL1vrLLyQkNjRyIF2l/hHU2CDMUmdKkx6xrG5FbI4MNyUopOGLsN1yjbrKN/qLT9g8tzd/u11KXyUWVZIaP9sPlSfjssDQwkcMbyrcEd+CN0qq/Lr5PkAUK0v+rmd/roNtgXJODcRo6WMJMxDp1+4P8H++D/3HwLJdxsJw73b6m7WFaKthWo1ljLMBZeiPaKjNgfuZLxKg9G8BDU2cusEyjZeeb74EQxEGf79q2QKSO+kqaXesrz/5aeuKBppUOUFNA0cZmhrz0q3T6ZjQTxdgPVxxd+Ph0HU0sjXIs8Y7czBNYHEl7pDgiOr3u8u+90ttmVXHYPlsaaR7oedRUYjqXo9gF6eUGHJgx3WJkgZPoVHhMnQUX36b8S7+xTkNL8Ud+rIzzSwWmlhBDdAXZdMzwmi82PSgXHNS8vLu888XLbSTsEaHYB86LTirAopMC1nQgLFVFuLHJONTSL2e+1YEv3m4ZIFOH9E/XRXN4V8oitXySW/IpeLlVoyOFWO4suyDVTT9hi5uOv+5+8bMCiv/YTtX6hz52wTKQUawyl9Hr/UmG4ee7qWbdB6Nuk65YB+nmZdCMD/7abo1+hw35/mDVG3+8OLrX2P7q+hpN5S+m2p+NX9mc58uGjK024Oh1KHzf15p120LBrzJv44PQC1o7QqIp9tZdSAGHr/f8jR0eQ3TwrqAPJIyLxzmgtUgAb9BvKBV7gTqujsIZX8jpsM75vY7Py4Ha7wQ/9KOl6zxY6BnW15qTqUBaSTvKc5mxOOjf3C79UTNPRD/0EyA8QH3p/byfhDCykKeB5H/vg39wMGrzBwTHAv7n/xwjYtA5s7lb6Mo25Ixy+Pw+3wzKIsDbW80imH0P3IDinBsSEQEmuHkEY6p7W9VZyalCuILP/q7NZpzj/Pw1UiEEcrDhTyxlN7UUo3BbSuUlPwu1aWzZSQRiEZHBnxm0HHNvzFVRhvvsNoU98r+Wj/JsWROX1OLfWkEjddocSP2dES4rZmDjFiEWqG5dMqrwwmo4yDVl86Auu93XqUFoXonu6rLxUpDcCevm/X5yM8hKu55TJ0bvOeGNFAqG68Je5IxguKoImIbHgc1xCijyDn3zrTnxkDZ3+4bwtaoslnuJaE+twpbjNirsTzO+aGd3qetF4rkUd+OXdiC4TLFZm+8qNC1us8uCzFocnFgctHewWEqnK7ReADP3mAtX6cTJodO1z0Vhd7/fOdaWzd5iPFu2ptDgqFe6n/7DwdV4ZHmVqXEF7tl+fxQ8m/YhQCd4aVEbORryuv4+qS4a010foatef5WoKeXP7q/XAdXO2l1cNGm/jW2D+3iNdmzJJ4WbZ1p+oXXngzaSPBhKqc3DcGh/VpcX/QvPU8o86Bc797xkSsn4D/zd/mO2NzgsSnCkdJ7x7dth8uOXr4GE5fX+n1pBg4cBT3DL8n5O4SyxejsGZeOP98H/OAij8VRICzCrHirAnPgQjGTxKS85jLutBbRjnUU1wOJGi8CNRAiNJUAk6falBdwW04NZvcg5ZbeeIZSD8JcbrIMIQMRPG8QNVeV2w1IFrMtbo/cpFlNFieWT8fRVOaPGFPfB8Zs0Vq9I7qMyapyXV3VRIVlUuV+jD8m6aWGL1eUn9Bz3ovOKey1w7jUNQTq9kbupNyRTr8q8oKWeil3XuKDK6vOHigDNvH2sxmnB9ydz96wsTj46exnhUxXoiGGlzovFT570grXYjVE6nwicPZXte3Vv5tSm2LxSuZStPjouFMlRKdeQWK1GiVslt0voHnIzzTbOTKNkfHEQPvFjxjIeywdGafr1tJh89sa0UfffPbxDi4PzAsveoBNWzW6/dd9N4A5suo7z9PJNaTYoIQms32tBixO6NpjVem/6LWF5Uryf9xOvLA7W9Omwcfem1R++nunaC+lrDHvlu8H7LDnLT8TLWQ3u+iSj1eR9J6++ohTf1NapCp844zbyGQMHdkveC+dNEEyUhPBNx4yBV76sWqOdt7cBqVsA8UuqiPc/tZ6qiVlrSB0uArn99uN9XI/TqFnsHwxVsjo52KmPuxHEo7uK9pp64CstKF9MLf5RK9jykD2nXOrnPCnSNj7vpSAG9P3xPogF6qG1wHY451DlKJXsKd6zGv2/PY92tSMWgwwPFVdziZEEQCoKK/oS1tmN719nklA+mPNTlMzE39x4XcosF/kot/IXrec6DZWfD2qVGwxE09KL3D5SEqZnO1OZUtL153c/R7QQi1364morwAfaaAJWUmKcrfhnGUpQ47fyM/Hs9mYe5e7Rl+P5Zl2ODW49Bqp5wcdwVo/Xpb3CFX5eX1b0xKPLkVDL5EbXMhOnweDbIa/vVtf9Fgfd8FSJwuOyTcsjJinVJ3lHiBUQYeZkAma8hYdcvyxfKzrwb7KdzBJu9Z5EAkDaAUaB3SlcB4J3TbtPcHhEtmlxMGTkHFrG9F0UdPwolmXvMXbgpxfXQLBYnUajIS7BztV1cNVD5fjr9oZZFDwPf1sfrBqZx+a/Zw0V5WPXTs10aiJ2NBxM5us+S1BV/je9YfDt1WQ2hOyDWY/vjKfN3yur1FSydY9wiyHBSGYGoi5t7/6ajmVbI2fXOlUqLvbqI0Vn0vGgnxUAR8NWD4GhvvR2Wy5jjgvH7l3O9KG2bY/wGPsiDoggXk8Skzo4/dB9nnYmPdboD9ynxgQ20nQa3n2KdDrY2lGsPztobZf2Y61SAHEcAFs1zBnTqUriv1pBHNJYRAVysaKe/CdbWkL9f74P/pMtLVgaKVbevXjlWz3/+79xtvLPf/YdH9IoCPRcewU9YU97UIgYeP0zJGkHHL/UzWjcw/r84P7wSwF8qqLsoJIpbnhu0WeItLXfVp7phjPjpsU5GzpymBXeXttZT+D8FoUmRRhNJfMVd+Y0X1ZekLx3QeDUNlVRurkf6463z0Ji3tz5rlVFItyVm2FNgUXTy/ofFVtbTflBU2Tufo+v991e2gmbw+COynOu4jTxnjhXTHtD/uG+StUgjYveHJA6EW64nAzvCFybeaZs27v5bIsPt+GNcgzAn8U97ErBgwEWXEI2AHXw9MzThTxn5+bXKOkwqCtcrdUpraayTEktFle1AmOYZmkqiM4ipa2BkbSv9g82tFSyMYMvexYHn8x/OJjTI8JeDYsJC7pCmLHC54doqt386X7nXAya+uyA1vuzU0Mju6shmb3JrfDu96x7/d+sdIlc9DdOPYGHQU+rxjbmQ+hQM5hd1c7PtaFP+hZb2qV76rOUoPObk50lzL72j/8qwc0EmGG0Fk3Nc4NK3PLToglT3t08hXDy14lPbnxqDOtQ8urqyw2qTvHknSflmL+zS4v5SG835+pxfx0KJEowxNlCXuUaA6wrd5W3+q9W4Em5iTDvQ7WKd7O7v1+Ixh3Chz/eB//JltrY3xrJA+SfMADFK7sR2LL/lvcLlbwI1iPL067g2Ltb0zokC+6mAwyRS5TDuXgIFyTQ0NfdAjtIswnRCaXghw+ZKCOlLoO2zosY79NBYMRwW3mBmzmUlM4lgxVEzmpoVFyT44mhh02rA9yVhiLMQ/xe8ZRZUf/8RPLUQumNDXnr5UtyAC0qY+9CEvDXBCsuhB8HyNtBpy9o+xfyvPVG7Mdrih7T4k/BsXuvoImL9BUPYJOAr2AIiO37W/uLpcM8259tTuRgfzu8G26J9kYV8aYN3IZaNz+jiz54gNuNKVz8pomwlnnIcf267QKRwUa5gfhrbVq8WUSd0JK9xJaFMTDAXGXb+ofjcdEY9BPOI28cJGfFZG1Q0BqPFgdf8UBzlN7yLAop9wUKKJPs6ZX/s9Btwswhnuf9l+Ni/3Ew9usvk8vRu15pPB7Mb4aTgfFP6B765/qqN368ifUnJyTTesyPOY3ybkxcc291YG/eKc9s9QNRoqXW6fpPlY6m+ENwq8eAdyyoHS68gSirMNMv7ZKDSkjAXOK9jqmgNNO2EvyuDiWazatP7Tpy653OZNIswfT8gA08YkbeZC37XaaPAzuIZf8jrxvF8f9frcBJczoLm9C2jWzG5GlRsRlk4Y/3wX+ypajFtno06L8s0XaUiVlKRgiclVnrBnCmv1p+cLXT1ibz8HmZcDQUEpyzyfLmuuSnFW7vWipCs+tBtLx3GCzq4Yc2gbFBm8ZBBzXKTOO8xWGhrDnQdAZXQrZoAkrvpEeUGA2ev/4xalRi5VOPgBo+vuHIcy+pcmzpfQqMNxeSEr+qPCE9X9WtCprz84k9M5NU4dYDcGMfyI0SensgjxNHOIuOeT1Tczoq87JrYyZoylHw6OeowkcXlkEYEj+GhtQ0fSRy0H5fvQ0HqgsmZDMZRPI+uxI4y7jqF156wSP42zIUIHE3wTI2UtNtIoPsTSMNsHG12uV36xLC9fS2A7wTeD2HrZ9EYwoem+y/RJMDP8c4N4PyeBR1Lo5zLLMMj3uzLOa4uwXJVb/oh90FOzjEBkuW2S8DYopWj5rqsCm039QnfeO4P+3To9ffvHZjOJ6O/kKE+j/DZ/TprN2dvVsIplFn+NrHpbx88BWnObh/+/XtXlVqpJg3waGg2/BMPATG/IAGnEcJSKemkRyMgmrsE5pb2rFg8ORNPdPmHyMM064CDdLbrjeqnaXyy/jQfYot+O7usuPNn5dLdrOGnLh8xmAZXVLFUIzNouXo/1+tIFCI5RE2vZ6tOzEnehArZuW4P/vf++C/2dKVRkpBG07WF6fE8seTN35TEW23HsEWc1h+MCcAh0QUPK/69vIyZeNCGBTJbQckQXKsXR2pEyQZXbqz6GMfafU6+ZenWD/1dND1zzCCs4dcItQpu0abSrT8eeenQ8JSc2FrHVpx8EH+xw/SnsxpXJQSUj5wX3iiLx9mFaR1FVzcTXgQXGycSqr4IzySxm1ThBEd9kIP+H17mvhK6lLfMyHngOnNfHWQi3CtcsTOuZfgEufFpVhJtqUf03Suj8zYCWdnOfqm4YesCzny2sw31Yzn4rPDtAPIxiAOhtv4nnXN4xVPGVnGPsO+XoOeFR9h5sP1711+rHpOLMLzyDxnUkxrgsojsUBByxQz7+2YElCyD7QkVn9l+UEznaxocIWZFpGa/jtTE2BX+UEz6iwt92zj+bC46qHqaCf7Nt+ClfXBat9EB5rOyeZ0jInmcGPxuqcsfvvBacx1p+P9jurdf2t/XFTM6WemNdavGy9elH2qAomngxefWEmgOnQNEf2sUipBjbgFarhXti3RXztwO7W1VKkUWDdINB+svN3tNWV7+33GG+laHDQ5gn1/O8/pJfXw4u1CWZ6Qgv5MPNkICIrs5POB0H5yP3sQhTcy/9UKTCG56iVG8Ncl//59DFpIUfj/eR/8N1sKOP7WLF9pNw4D0NL6t6/0RnjFQQfNcLICm7F1BGtSxLQo2epXAe1bFoV1bouKCDiBT0wpTh2W8vXtmaszI4Ql5FQhjb7cIJQuAG8gDlKBdcEFJMRKcEnH22gyvuJgxi9lNEqUznVRGBUU5jHWdfrMG1ptt7nS2pKDWK2sW2fjhW9LhPsy4SWMSrS8FIHpNeHFx/yPa9cFS+u85L+SZOHyNwd7wDwlsCsO6qKNu+LBxhhk8w4WPMyeBB/4p4m+sR5q0QThtn7MgLUFi4jHsS/b1HncUjike8MvQnraUYKvqxCGPWbtZAcRF4/2zKKGlO+bkdxvjTTmL7VBTNjcxgz7aOODuSjo6EHCedXPaB9GWLK0zFtgyiO9Ez7H6Jnijm5TB3exaU1Pr52FbpTWeNi4vpglpTdjWe/OSEs1T17p/0wxqp7O2hP9eD4ZjujVuhzWGNQTd8dTkj5rZxPtdrQ0v7efP5GSfO/gBPtDY0FvB+gYKmQd34KKo0W474i5M7BWIpFGbYkBIVuwcpmg7dNZjmwVcPaUqrWr+uftkO+3/b85tpn1V6nhVI4th0vL/k9CdWMgqLFiLoJNMr7V2fi3m+UPDtLQqi4avcIELpr0mftrdi1Z+ON98N9sKZQgVXcyhCqW/ee3fMiEsuNdjGJ6nHdTYByGGMx9PacQ9SBZuI4CwFoqA6cVAT4ooWweTLhIPCkwWbNqHBuVe9vI+8W/R6lxLvo6y2HGtcQsnyU+xUfjZckn+SuJaHsXszi4na5wFgevj498GUruZoDKYwoURuK88jKYp8CjR9ceplln45IHEqNA/2UuIGu3b99IqyTXR5dQn8BIYJDQ6wMl2nmteJcGp3daThFpln95psLj737RFx4k+4ckiJR/AvjLRCq37dCIlT5lo7EnM2xr4A6JED2JQ4ph/t2DEAmxMAnXPZrAOuaNsV2sfj4Eq1Uwc1WzLbZPY5PUIivd+W8BE0i6L9lodHkcm3C7qE8d894PRqjIzwrO3LtcyuIgX13kTM/n23F0WULr14RqpOhhddYbV7WhadzpH2Vj0Bz03tTZwfzLP9nSXwd7y+FY7f/13phOoOh0ypPLYWneO9KPuFGGjzfeoqEa/Z6rtvsi8vbYTaoUE3WzQMpPNnwq69gflp9DML+2O81WM/K1LZXAvUw9XRN+upZnVTHeav6EG7PebbvX35u3kWij7/dex72JeSNaqdrKzpvHMj7v3zrMcwbxJeq/81Yk6kf3Y/9xMBR2xOlk0Q4ARgah1I0sdJRG9v97H/w3W4qSsz0uYKbQ0HUlDuU/kr5lu4J/3Dvx0axsuw0kHIebyYAaw+CyGYeK2Y2QxPN2BJZDauyze4qnRdvf51e9WrQl+t8S2OQn1xDTCbhMKKaz7O24KQFFXDFTyga5ghyNeTd/qhUxQdbW1hNtyQ0vSetiJHmpYmO+UTXR7CzcMa1O/1hOBEsp7BzdDTh9PNv4ihjyj+VAGceXynN6APVJ65KZDrNfxxOSZbdlxXEIbZyCpM26RYOsJlTKarknGhIkP5R/ujYnbmhMJH1URTN2vLnwILe+c2rmHTiQzNscCRD6dw8CFVYdz2RDLiOU8g1E+Ror9Tow47g2TvVqCU9/2U2l+oeMZXah8iRac5yUwIgvsZCft9HmALuomRms/triYD8zl+YQJM9Lp0q/sIX7LM1fJ/OvU+pAV7uf8Kfh48WTmly1gJ5D2qA/7p/fDkfE++l83F1Ntb2f+YzbbgnQxy9fWV0sOkdEVVm+Pq6Hy2Cn1fQgNKScSNW8KsTZKDfPzsi0HvMmebIeJVFitSfdbYt/v56JHNI68zyhms8gUhNbQ2sdghePzmpgWTOom4phnx7Iq82sB5/2brzmar7orhcfkuzGPlTi/MT9v7lj6M+aeYxgwKNApAa6L66KrgWTBFsG+n+9xMV/s6XEKjeRiv2TqWlK9lTaCy65bVhsxUG0LYS0nRxdZzCYzrkdeChHTD0JW8oRXHaiCpKaft2A8PKXgW6fO2wIEY2clxmOQONE0h9NxNNXz6Tc3YN92utclMpKQXYWTwVxNp7nuArIcR5fOpXWpqT0HWxwDY9AY+WWP+1fZdINwePsCKZz8buX+MVelYjMeXxA9ytj25AEuGu5NhzwlweeC+8wLDyeHoty6kKp5ttir9xPAMGZs0nPpUX7rfAkTQB3GsQV3+7uSUa2H6g7ITb2TOCxShiDRLAuO73pGmEjImky5ag7lRwPe9Cf+bPdZxAjmtmbeTUvlUZ5GWrl1Zh6kAN7RZ2DK5V+KCpQQLF8ONrwg07UqE2yTniQoR0GyiiL0mpf2+nOFZXjh5mtQLVICKdPSn/UP/ZHXOhgOUh4z2YVacvE9NVYyMFzjLZIWBvMBtl3w7IxfEPUGlP+MuwICJJR7fhuZAY+LzmNZWXWe46ArMRyD9JLCNvE5ElMEUhXXcx+MgDQhdqUNNdTsZ12MdUWRZ7DQgB7q5Ndm6IRSL1uvpo8TCDH+bd338d81W6sU0O1RRdmtSzUkoYZDXpwBovMvit3lYMj/8sd/1/NfBeOx4NQyaCh/WVxK5LN0pwnBSX+r5c46Tayq10kq9yEi8UUDkdr8h6eikJcdStwGSvb1SZGJfmkH2aziJH2ZOB3PQTHsPx1UoGKAwFpsFo+zuX9epCetaV4kdxtV0YegUEHgjsHHbPEsiIVPnIY6+Uzq6YagxeTtoxPHCVSWB5QBGjoy/jbrIwzOyc+80nubnyxoHmneKe60hNaKWFt4or6dWmlkQSLg1V6LjyyH87faFPpce8bArSXXp3rZ8HlGB93roi/0EGlV3lwPTR03JXvV6TWqy1bqF8xcuDu57z4/MkcUnmIg2M5hiiciD7aYPeyDQLJn+NeakozcfXMtWQfgMDmExD90HASpbot2ljawO4ndpLUstXAJO8V3hSz++7Uzlr9ryzkTeCZbNSlvouCtW6Bofr04qcZ2mK0vJO9yaTgWQRkplni7taExgwKa6um9NG7pqvZ7fSbY569WIaK48F48fwq3hpq6+RwNGq8/uH16SNpWP/1Sqj1D0HRMBnSMrLIeY/sPQCJmvpugeK1nWFZE6gtb1stxfabCPUWDOfB6fa+EAWiu5OiRLCV8SiFdpxz0oG+ITyZ2AP769WeS21VK9dZbdIoL/F+bD5oBMwZXbxmBaQ1PswOuEH/DVCMHx7u2CZnOwlLFfiZ0B81c0jfAOxG1IFG6crBHAvAShox7P/XS2xxMLXaRbLKTQAHShzfBDGfaWD7NkKBxIOMb59ScObkp3X/Re23ZMoWZWox3PqOY5gIFrseS29omSLTVzhf4Z4aJakff8NvRrOy1PVDPDrwC95wlqcGchQ6T2+GHisJLR5E6QS7zUkoughuHDlMIWFX1gLLOutKDNuYSVXF3caX33tqwEzT+SAZOOmZVKTJ1dbirXVe5PmGX9KVn16QbHktoRSaQt73XXyhhXJ0f1r23Zm4rKi+jbALX9TH/MfPowoEDAm9Eca5Gs0cPXyb91ylBOeJ2VHjx+999GvfLpYgIzrYTwhg7sFIoabZvOLzge/nE5nhuzZX6Rb26c9MNqCnzZ2//vqlj6Ke9tcdOA1vsh6vpb4CWMnxrrRmGOl592EPrQ6xLWXVS3xq+/uvccYnqTCkhYsi1LCJ8+jvge33H1taytd4fAUPJ90bY5GcLU72nasZC9rAu633iVcjldxrTQmuNjgRoIeHcnX+DMXVKpPpOiWz4/KdXFcfYF4rfOMd5cMY/2TY0DaKkJLno7DjhEITO+TrT8J+d1yKrp2/23IPyxLj/sZhxC/bS2dRrfQ7bDlyv9eltKlNuJy1oKmXAWochH86OF2q0X4X33Hk/NlF8Xfu+AD6o2beiMIiXQRS06TkObwL0GXO4Q/8T32hEDri4aLFQWmVm9iJ/pOpafG2teKrxUxO2lnL/i/FrdWMhd9ztrWfON7IikAotmYnyDIp6o0cxiaO90piC46uO54o3RXHyzFLUFVCMy9Lq5QCz3KBBUanHaKFtrLbqy0pJT7m3OcJLLmy/6G2XHminjzDjQn10G4kv+5WZV9kTMrAwpc5diu2tiZ8/DyrmJ9HBJ/WxZfki/hjSKf7oJcKfwEJPSMrVduhdZ79F+xsRiGX51JXuZKq9a6kG8ME4B14xqOBdP/IMfxz6ceLT6uqO9fqTQUquR+ucZxlGdSQ9vDB7z0I3ivoGSRIFU8xdSckVAEPZ3Hw4BHUNB28LBpFqTaPyk/DooaA69ntrSLpcAlwFo5lzw1Ub48P/TcutMxqud3NeU6DdXSeMgp05zmP8Eg436gteq/G03L1taY0x/3jDOi//70J7mSWpN/9Ho8cfZmvZiy8e5nUpmz0cjp94l5jbHcivPIC72qOZrt5e1t/LP9CTCDXwxdCaObOUVA/6yVTlQYfmjGTnf09u78IX3czSfnQCTQoYav+UA4DYcLcLfx0vS09Twpz81aFVdIFTFsV+8Xfk+8znnQYYCWyHL7ChtVsU8UrrC/b29uSIqgDKf5ZM79TN7uynaVCPlaN+PJIDFCp1CrtTnGrF+j9bY8WsjjoWeUmAto3RgaSD2s0EYvi6FNi31KBIMe7/YiSc+B8jGKqXOCslLelqK3c13eUjThAc5CjmaT6ir6wqexLaOBLH2cpNM5I5yQnBK7oNG7wnvTtNY3hsZg7mECNjwrzghC80UTjtplfGs0IaTfICObSz/rQZuWyBJzUkAUvQZdSt3YmDWyhcm9haaRr3dN8mUm2+CltjOZwLTOiQbxwFqzD+GMy6uAdE1/vYZbV1aXULJwRLDrgQOLepdIGQT4sWKn1LrQ0AlQ9J1+HfFVJEh7ycurJEVtUqel6wreaE3g9KwPTI8LlxFuU6ybkipcf4ajnCZ47qi7vvZZPYI3idvGcFkg9vXXtQZllOR+A9+I7JfWboE/j7pvjPEkdFcZPDwUfp1PeyDIky/OCc/I2js5NStpp8dnbH97vNW0wxD69avUnJ01+1GuOR+Pe05EaHC8H0ZUfbA2N4/GjBcKjv+9cL7MZV/7hbKHah5631TWH1cGM+UHvHMqL6SK1zpcTwsc5ph+2CNK12MkS/UNqJ2aLZp9iyXgYBUk2GZzdpizDybTWPThCOF6cyUPj9f4C0pygMT2qaHX/zgIH5UWJnOpF2vWZzjfM2v07WzTklLfHSfte1j05/7Nmzop7OBvz58hDIF8rIDgjMfp/M/cSh86ixcHkahcJUExlAIStwPNWgpTApJ8uoaGgJIAbAOOPx0XcufXKb8YSbr8n7oh5BJ93nwX9u/WC28l0nrh5d/J5IgmeT2zduiOud3/+8DckyYEjAj7w8pZ5jFOlqGJ6CV9oxgrYsydGa/J24KWiRG1v3/x8ZPnoIuJ7cqheQJ3He5whR4nX5LnppwTpxaliM9n6yRWt9mZra6mzArS3SVdm+BUWwMOFMLHs+CAv8ijDjmGCjs7lfmRMrDh4vO/G79sDKs1O2Od1WHzSsBekpFVf+c8iUrZlq79lEfXpvScfZkGRPJ/P5pIj6fpud1IfbYCQtzj4FMEDVTLTM/PO2HkmFZpFsoyWM3/++qq9pDGbEttJOvxrrDLlk61Rqdo7QtcWy3SS6eyi0QVmr/XTJnVkv96tp7VHCvz2pM2Ox+pU9zWH0/H0ePGuqQ+S6ss2PpvKW1O9SvR/PzSzpNn3rpJc7+f6rFkdNlFxHrhn6yQ4aDx+f+g1Hrekarov4H/tvMlg9oT78IM93t4IK75wM7bnD2oRigjqaowU6RQzsig9orkHl+vGA6aZSfbztTzPXyi9fHvKFxfLGDR4L6N6abL1cYoOpuycqE9nx+HTv3Zc5U7ud60ANv6omV/IvlA5uvXBLHiV81hgPx4jQ67/Zu6hr6P+sMXB8moXSXEjJDGcPX0nQJjb450pmA1YZWrICpI69IP73A40jUUBVU2GIptphtOtCxP6lE2o4rnx0H18ePf3yY9Zl4vlIgFIlbaoByVKDWVO1ALpU5XCLMm+RlaEDM6xWNkI+H6clRVqXglSUJfH80RlF8UFaKkFBtbdYhMX8a/yqMx4VAmSPVDmFMEX6owunc+YlzdemX+EcUjvkoSazvXjkPV/GhDC8rXsSSDUj2vPMSsteMR9KtotDvaXvTIS2M05DgMWgGBmJn1/sBuB943AEtaZ4Pxbj3aw3GsSRXBCtTiILkhbI/nDfaUIMMHPyqnks1OpPYGE/cw2MaeZJK3Bld4QJVEvtk+BqIaENsfuSCm2GNOXnWE+a9NRElcPwr+AqPE0zn0OLNMaPHQyrTrin+Qmx8K7F0XRxvqGOl1lapRkfXq77/KVyvPpKHY1rY6Ox91md9z8rb6WJz2gNqrv+RZSCjt9Ku9XK4enoVd5jnqcFx1PlleFp3EZQvqFIBMAPsV2lnYdKh7I+cDGdi+NCVm/9pNBKZ3f+IrpilsLMCgQexaTodunb62HEZiuv8WFEXpSup9Ani/rgfDj2A4tfxHAfPia2y6X7D7U5L13/f0/auYH4CyccG9++K7ujPOew19bcG0Ygf6b+lIS6pa+T4RXu0hyv3e7p35uL86ycSDZ9jCaUsHDgryr1gSIk7eBLaNg8zJ1Ri+mAnBNhpmHk/zf4YAhwenTz3iO+BHvVmZULQmqknuYzlreDxMB3uLga4VxKOLWZ+gkozniqHuNxwBnIhOvE3yqGudviG+xGlSTZs6q/BT4UmbjKk+s2Y5rWp9Ss9myzB79q5EmWV3cQSYuBwN3aKbX3gAGFMSIvtyFTQxJaj9t18UxpA+H8V5cV/boa5xt7DCCHUIezIlCbyzYh+7Gnul+aMgDc93ea9jPhTycNlY7GAkmn094Ewt+78bGIJJT8MSnj+zerys3pTThCNzJ0ZE56itNC4nGc5R08wKP2BK13YMojJIFwRgkpDPnrUAOc+abd3kXd50HSxYHRZ1KeQb7VX/IQT/jndbk/g1mLAcJ6K+A7344rjfev43Zl8fjqnk/BhejnmJxMDoaruqiFDBU/fPHWV9yfrh10XpNBS/cYq3xqVN9Ql9Q8gVtuepEKhNdOunLgwawfeTdyTGDrEedbCZbUSSy60up3nw6/kBVXuyG7KZfp6v1/APGsb2h+fqJco6MQHgJamx8mc4xmuB43XG9PL40x5NWi3raMXZCvhBEeLBkTlH+n5p5wLqto+S+gW7FnkogQm4FkD+mvvzLQcsP5le73YvZHg8VBRbgrDNDlnhi8wvmCwnR/WsgD4m2ArB/KDMh8MhHQ0nkDm5kQLb5NNvi2kKNLf/IXCeHEi7t7jIC/eBMj8Ro7Prg+MiHlMXy7WbCUfYKDUc8AQMxEfJSXlFjBJSyi6aGOxuEIEadF68RTZfE2g8nAM+9PDfIPkml8iTySrkQl5yuBm2PiQnhauzQov7/UfVejWmrXdOwuui424ANiZ3imt7jJEKiF6EuVEB0MMb0Ktpf/yD7/p693wOfcWDEpTUz61prRjxB793C0ygcuApZ+bs5xY5yMNM5CcDysyb3AM/Dl8NRrouvGFQbwfSvej4PnMgxK8Jlz/LF/uN03h1W0V0SCOxzGSz+PQsERqBzMtMw2vd6raslyH4IoxbmFz4xJjibLZ9FE2NPgV5klplXyWjL3HEFMZLB77+9eYSC02j62FHtnUnFhRB5WtF5+jK4k1zFpouqjyAnNMqPk/ZVYCewzbQVlr89y+Vkb8vMK+tt3sRr4rpmRv/OEq96jdfdeXcweI2e3i1jlccRLOrTzCdtoA8j89yyVrD2P5udvsqPnDZ9GfssuGrJMIYjCx2P2EIWrhpN6d5MxuMkCMXPfF7u+DpCliDwXJsdAm1QbeYZz8GqxNaz3ft3BSl1k1HRUnfomsoa/WBZzwsotXirGtKQ7R37N5gaOgPieLX+//bMOTnK5VKqcx2NHR4AYUjfSf3r+vL/u59t9KAph2CeJcDrluNkg3lo7HseDDzZHGmZRGj8+zwNb7Mp9yFBd2OTTAQMCvWzqMOBzHjBrIm7ksY2HI71oz61HJybj1ur4V0XxPztmZOrcV6ZBJwy1OaC0QG1i4pK/G7M5nnDsje3G/l1YXkksNXcobkBzdBMXwU2OGhrGIbej3HgIOeETWM6GsAvn8/yD/2+fPgVEVZnDqNV9zNoBuN+6b6YFHJIVPaEawXjeUdtKLJf7C97ykDALl/pja7Oyjkvv4xgGWw39fNRUMpDmi2syRU3VhVs+X5v+r2ggSerU86JaWzQ1jkN8i1UaX204qMOGORM1jatUCg1jNli5+jvN6to9MTmktMIwelWIkNgVBjqnSV/PgaX0YmoKKu06ugRZK13Fl7hGX5pJk7cJrq+7W0Oktmt1NaTveLrVuZ/iahV6cPSIP/mD7pm2qArbi+alfcDs5tYpl1MJfdOuloViVkifF4opkYfxKbIm1+l63VwqqBV16FEnAUcRv6wqrlmZ1Pu+KN3P8DnT5XTSsiObv6/qQffO149Kcto6Lmjn2/J4eTTWcRbK9HAFfnmZKIGe6WXAlhp3ZoNLQdefbd8HsRW8plA41bic9pl+jP/7tRse+YcAc9tO+CkSKKJ79/NCacg/7q+/J/7mZAlSThMubczVP/4yfzamcPSXz9GORgNc2aGPPT2QmBJPXYeLXmUDcx80WlPsi+ked2+4z+AG3q4UDkSsMcIz8hhvZbLRgXdFr+NysG+RO1Kkta/Y2IMFbV9sW0JsprznkeCwDW3/bCxWCzz9673kdhgrk3OFzmAeZaXxyv1TnK/7MXXWhNO8DOYZ3rhA+aphcXxs2OUCg656UlCVFM21LbfFR/P72/OCZzP2QVchYeOjrlMYA4Ps70f/DlxiFjMh1acEU3oMI/G9Obji3ubEWSDMcX3CNJFEcjKeWgmt5nJTdwm8I3A21wRnXxoWdelmhg6C5AWbJWkjmd/M22lmpcyyQCJu2QlkRhGizunqZn2LKhpsyR2jP7jsXD4giKFy9Sw10lJRDlAfE2fq7PZ1kGlyxcXL+jk/xJRR7NxSPn4jBoOX5CFxQYHF2P16dPyQ96YpoH4VWKm9t1DaVkr525fHfVq5Qf+/EsIZO7ne3qdyYfCqcAeeBje7tRAPnniexD3jqMgSt+9/eH2YXmY+kITC/qJX5QdTNYIMOdWy2i1WpUaN6XKxLoz4SrJdeDTJ6gVmpSyGbmSzNGzp0pJ4lcnGPmL1Er2sFP6v52abc/casJkCDodb2eJSZ7Y7h3/x/XlXxyM41HdloSuRZRQtrPEOnCtJQGMVwHOiHATjwFI1agXCeew8U7CvRKYQPgCS005bPZHYLjsTp8D9E5WHobUA8WVi9cNo84zamjPHR+UNJ1BLi+Uel5vpHFtjsBqvx/WgIxEgaeK68QlbgTCe2UZHjmk/bWWk9+/QB8HXHP03bocuODFqpvQHABLDl7kb4JOERMCKED4DDFtF0GJPTn85hKXsu3sO+hn7AjI+OEhuz4IQEVbiTEGluTVSVfvXk3zEI4CL6+W+rSc5O9f5xqFZ/6WZgZxaj1FQBLw7xc29flKxtgRaNONJrwbOFymuPJ2txSx1N6jCW85MyXm8gzf+jEOKFyQIhFsb2eUxkKrg+TPYWuSZpofTqLU+kx66ImSscwUps+CO6njqJRfc4vWuPN1uJoMgm/+XG+H8ZqLPxjfn7zoLoeJ7t/8wVczfrmIDQttrDbtz1+vF12sdv529qofz2uzP5cb4nnReywHhSetqLGs8ibUixfzNYcdMV1293EROUuEV2d0wH8qgIIzWjuFU5DoZFLGqSwf70xc65zRkWQMFN5bxuX6xPr75BUQncbF+G1hSF0ZC3DRnY/qp7LUflexzIp4jT6FQXD/iLYuz/5vp+ZvzxzIJKCYl3QHi1E+5zTc4n9uav6Dg4jfHcJnbs3hT6p/Z4lpadeby2/9GINQgDp05UdRFH7/Y6UmeHxDZtFF6DURr1c2UpMdKqcre27CZ9GAk1yXWWt2ouWQN96LWVBUt/7tbS9nC7W13BpuqXUFli9rrLEOmzZMLHJ8WzVIBDs6rw8VNbLaF+d99pcD4EeIn4E7TkBye/Obsxhzo2O+53fkHiIosP9rlIcRgL34CQjZQyCHTXApOwuwdzEhZicc8vDDmNdW56xcPpPtztpNcT7RsPcS87AQmV7QkPEIZ6J68Z1MzGTM+Ikx0kpKqxwmfz5YjewyZot5GSdfENhkJ8BurXhaHy1qsZGQEsUTOz0IHmqrCOHJWcxfrojUPXPdDULUsXeRzj8NMqaxOgO+tjNUcSpAj2MKdCxocjw79ZxdSQOwP/hxNO2z95PtMF6PNkvjvaeXHaP6l1CNqMSnxQwtjaEju5so1nvhLze9eNi5IBaJRS2MLgu54w/TZqM0Vuysmh44C8GSPnPEv8LDKCSaMbri99ygIy/kxWCXVtlzp6ppzJ/PSQtf2rXnWpNT5Mqzfpbm+rLi/ZLlq+8cc3OGDGuDCHTJnYtjFRmuXyyZmf2CGWfDkoMrlY8Ly4jt7Ir4j/+GCtP2He8EpizLuyg0Nw7BfBVG/+P68i8O6lnf3C2LJc4AfEkHFsgnWd1NIZ5997xOk/AJ6pSDGp1zZMnAHOPRg/yXzG5dmuf0EgSGgvxb/Wk7Q+Wcf5fza1Q82NmOCqxUbQJzitTm7U42ITf9/P92S3kZ7/HWr64DHh0X8++RVq6F1PlWdqZ3Ki3W/r9IFP9Bn1OD2wEVm3DnHF1LMVDW92Xugeb4HnDIasOThHZzjFXHMamuHDIL0w7ZdEgG6d/XU9PHmbNvuBoGYQ3wJxf1M55wHqnM2tHMWs9gkOE7TmtwoXR3XPBcjU3jpcRbVUR1r44p0EYPRsvC+CNts0abgbdsCc19aZJWcH0a/gkSlDxMnFz7ouYOmJajEzLEKWE8nhJH3CBG26epaPGCBoqTBBaw/9QW/RABPkuTzCfcueHmw0n3gc81nqnGrNdv3HV5vvdymlxNyq5vDufDoicE789H5OoFp9Yeh2ClF0Yc/WeV3CRVzL5RNp/4OF89GgXHi2dHtICBtQNYmuN0T9rUjZT7RAskSLx9HPBaMJxFHEfXVmBFGIzlz09QeopibnxJLi5gYxkmhHbvRLrQ36yfzEExisHzLs1NFgWkJH51+VuCvMomsUGlnfAeQSLEm7TP96//hn3uS7NjMoyePUfNKzrkLI9twvz/bmr+i4P/zhLLgj1Wu47hJhLe9kXB60wSxqiIi5PzfP4mvvkysj8bFBGXXZ2U6pGPtG+aN+CV8e6cNYAPWnwdYNRlN6QdrO1UCZLydV7UxD4kx3DGeLtzeRGL8zpyaVEf+fdKuV8wFmeVSOhVxzK0LXREfy20QiBQdFpkHUzfnDutDJDPIGoYBZa5TAZ3pLhqis/d5DaPSQ/gzcnE+N2hecO+G7hwBXmsGDtxt1H+F2tnhuMB2zlxwAUVy+U7vuSVhsryLaEZ3TD4+flSGSPccucZXERk0irJ0ww3mKG7HBQAYRYu7zdR5uGTHaQasB442SBDEQ4Kb+kFcZUZys10pD3U4FP3UWYeo5ZNgYjM3Ttga5xgf3369KcxSjPMvUeu9s8ivYk47YNEIfLJevRoGZCj1kWIqq1fNB5Gg+DlH8fr4aBSG/2xPq2G0NAcJ8DZsNYavDbOO4uS1Kx67NzSvGB6sbJ+efWjPkmE+4X4a/5hG/a9WE0joZMVAOQ32koiLMvPeMBHiw3a7zn7vL8aHUvY1psFDhE2YLykMb9AehmLw+lpI61aGWKVlPqBE6bFsejCX8Ym1TibfEtHPJ/GnH/arQ8GoeWvbXawhUnIyknkX/+Nbc+ciQdTiC/ihouUYzkLI4L8703Nf3CQkW7O/2Y0+90qcgarbkamnDyiwMDWVy0SxZLvw8C8t+dIjUTsZj+wGJU5qZDcq9a5/VwBLuXXmTwF8uz2C6rzpkUXJ4Yl7hIN/CBw8WugqeTI72jXChbYbFGrvhpNDXBBxoZZUCnbHuZ18dbczlBdHiDefXkx7Z1xoaQghV0MxaIiMgfA7ntRneSIDFcFGds7W35m9wCZ4SI37YSYeybFtd9mVKyclnqQIH8AdzKF+kTxXGz04N5royAmhLtU6aaLArL5nWvDi12pnYsIBVVapTEbkjkuZSzQm7iz+ySn8xy4CATWUKGMyvo543woieyyeuaY1dI0fRXU5HUswj0eBQOOzaNLEaicsJi/Z+Ho6QTea00yl9Ht/eCSdo8meyOwk1lWe1llskZySF6JlIcv7k+RRalSnVy7+oPJ/XwxJDflq72YbHdLZ0ZttGA3ONh4PZ3lG/PX4Td2c6OvtYOjdXWuV/n8SaXLgoveGYPW4wBpzcB4sCXyOkegSw4Z/pDwObwSaDIJ6NRT6tCESBBT7U5sySLMNCwuurzN2Eupehe7fj7T62VjefUSAJanqKUqR4AaHl5+Jt8/NEe5+eIDLvdzliOX/0zhfJ7/9go2P3OVgM/CiuNa2vPmp2lMkWrQnNoFc/4Imvj8YzgJbHAwtnXiPYDHPAUzKdIbCMRFzB6G1tS/py505xp9pzlAXB2JXLWw7+B7MWRB1uZtl+YojdRFeOom5zkJH0v5KQLszZ9L+U5BOt5lhezbkhZKjcNRsMTalMuYHKwZBnASUuPvzTzkGbm+ek84ol/Iv/9Qza5fQ2yrtCFolIf51dTi9hIijtBIuxUXVRGJMNLX5ZsOSrAj+IRFpyzbG4jsE4fEW04HVtVBCe4ccEooiRRNUAKt0vVFZ8QDJI20RBDGHED8aZ5iq6V99dOp3BiMI19r4GriYB1xSX+fvjppxp2nDTgrySjo5TBlWU25Hqri+PXCssTWcnZSoROnoyCpm2f+MxeNwyD59QsSCl+n6Zl3nA6zj1SudSNo3EbifR9RkaPzzRkcJS6v8C+ahMLQwctJd/KiNx9OB0PXqjO6nbxuyYteL/+qz0efLhrFTXU9+u646U16fdvlq3q3/SzdEKoTNDKdOfiRp2UtFqzDT3lxItwJzuSCQDLDdR4h6gadIKPuzxrgldmx58TroGnwDIj0whttFQL3fvOObUv5xHptt3o32H7AycVdplWg5aXBnM7dqRfzR0t0Ln/s14yh8fQUXtfevfuGMIp66hFoWAgFoL3/9AqgbgwKG7tIpZtixzSJysdHq+90xBk2XXIgSuaqS2qDgyRQorf+/BLqz+clCd7UtWQa84AH/2FfcQDAEmBWC2EhiA8AqBkHW0bxU5GTC3dN8ZFv2h3+1xIaahq2D7rROmXlsCBoi0gsdDD5EXT6BEO/5rKg2y0pKzWHfHlx7lRqQu7di1wD+JovwHNlvaxHl44V4idwJh/m5VbNCssMJJvOzBs7gbHAwgEt5jiwXGfiyzkhUn1Rv+mkuKe+CA1BSn2zzvAAfHx66Mrwy14s4M5a+V/4lPeHca4zD2IS7tcgRzjDY5QsP0spumTc32wXAki4Fvu+gs6OWasj00HmJxP8hvvuGeNlsPy+gDDLK0qDljH9++lihG+z/G5S1vZzUvNjJHzmyk4t4F6x4yOpzFVyVln4E9IkHPz88/PbQYC0N+89s+XozElND0NTddwa3S4+LAajSa9wXorOlyDd74vBt38czuWwYp9/x/htTvp00uJm/Wqj9No4iI3UQrDyoderLC8SI3VY+xXHPAkOmscCMAO43YKNqeYBijXgREuC8hasqNEnvkpSABrLMLpD/zFzkoJ7vloBoQ9hABTfSE41MHNkbMEM3qopX+t5JHnLWEelGhY79eiTCjT98rk/WN/UpNCI9+IuSLUAHx/+2yvIWJfoQfLyC20hECqNkGGA1tLOZTUNTqkQT79W3b4NDiLxKDze+SejWfr62yXyJOq8IjFeCroYfxDa4KDjurDnTeeDSP7lJO3gr4O9Ajx8vut/Iw8qOf4brBJLq+qAJ0pYVnIrvmPJPXJqM4tQYUyyOzoNBd8JvJoNWHXa23GtYoIFiJUi4XFZrYf/iFf6RhvWF3YzvGKsaZfQlGTPodcmYCMowLVjguygJf+AEgonFGb/nNXyHYj+AkWl3rO0MlZJZOf5cyUXJJhbJsJo1oyqdShptdWDTTlm11F+9Dohlh2nucI8zN79vHhjbyJs1X7AjGn7U8vxUO0pYFDep+WDfBa0Zr4BJtmW06QARODrBTQsZojYV59zVNngoClPqSVNcxcZrXkcibDCMaKAmbt2MMqa5+jvk3lsyprw7aJPXz6Z1GG1S5tN397oZ40Ug/nORuL151+X8/hg8foWAFb94bJ36lr3J5cbEj9djetCc/Ridvkws9RH4qdqf6x+XrPT3PTVp2enLQ1fKMcYsykMRCIzR+b9qey8euIOaAn0ZVxowGdNG3b/ArriSj9IzBGuQcocI3m/rJ0wVQPOLiC76tXheWTGR1qE46ZZFMG86/LkvldCk5VLtmqdiYNBcQpUK3q89p4/9z5kqRCGr31giqX/n5658JLAeXfURT0E4bO05gCOj305mLSUfCQU3ODgxB/dnOdtFkkU9Vh3oY1Ih3WegBkPfcgmthnNFLSWt/eDHPuwyKPL9z9/DFtmajo8v64rlT9PqX6kQ3BqPQjI0EY8hibhXa6sC7fmg04t8f25L0Z0QP5IDDxm3wqt7IRoZaGAbI8/S4qo0KTkiqHGj3NysFpzvZhD3IxYiwcXDqENYvoyGJbRmSjKzC69zmpN4mdOLAf3sx0gwX4IfXvbXZHsKOBsw5y1JYQNuQQHM4qQBEyQFCbhfVYdU5DMwKyh2948t8aZOUmjuALgT2uUziJRsek8014eLNfoCLqFoSlxadMgzwqmr+Y65AiysbdkBb+pNtF4b4OD1bqYerve1KOFsJdbpNQvcxpD0MPE5SK98AejHm4cF3/1aGk5SIvzFoW1XqqJwDh6eH1KTl0XxIaLLvfuIafJr7vqj88TafJi8tiddYeY+VC1rbY7NZMifdMdzaYXQa0xVF0e24tReJl89F7WG9RNpuWfZcseVQ9wtJZ8ACJ41bOqVKxQsQRFS5Yk9IO2VnN2wcf0PQkI9Gsy6gpu58wPc07fk+o5WOvAhM3ZLERDDr322VYZFv7icdT69+lGuZ4TMm5j/SrJrttmp3r2c17qT14+WPKDIHy8LO+TBOL5T6+AAYPeuVsSs24K9vk9tkohw6QaxobXWU3YHdvoQeeGfZHbLBKvmfk7Q+Xc4iCR15TwgnRd/V9Gs4xS81DmjUQgl70lelgHzEoLuO8+xwyEeKB2E6zqfsnHcIM8+Dp/KaNwJf/ewekRnhcAQlLl6VLhBxhRCpbUk+uaIpo2yRmrKMzO5Xm/Xs/ie2+M+fJ9voBXci2jn1SdFoAaJwS4wzLlkIQUx2pj9HX3+LlOCHnYDZeDCqKtMbqUzj4RjL30qS6z2ZACV1KRrDigGaNhPbV9ooXlAxb4voqIUifDjoJ+piM6YftVVsmFw/QrKNRe+Y0H7fHs09XBs0cEm4GfP5eQ6b5kI4o6xoUnyM3i/Vlqu1PzvY44nz5YNf86eeTGPwGNXohhElG8dxrRBCw6o9zq7P3yIN8dpJfLi7Cju/Srje6mMN7/fJMOpO3orq8+nTyrTFudoTobJJ5ezM6nD+P6bPkyOZqbr4fbnZq7747Fwyg9rv565qisnOp4Herm54MEcM0/LxamoWZeKa/poaUftBLz03d/QNK6rAIBKY9Qm7rhnQFexu2v7h/HoAaJW5d3IThoO3Dn5DxGv38xzQ0ZYGH9hnpNEJ/wE9yRLZxCVsvnaRFeDRrsakIlbijnsg4L7/xLoVqdVL6dl0eZBM9nDk3qP72CxAYHSdWxL6dwT2g3fHNA4owi0G8iJHiN0U6oR4Kn/8trW2dCf3ld6vfWf4Pi7OgPt0gFEeY4gp/tR91MMg1xwSgMzDfcaI5XEyI3VzqnhqO00N9cP/s1qBs64t1Qwt6vrAOOZ8NGh1g5NFfFtVSwpjPbxjiLI87kH/kvr+87oor2LuxgrWMJC6UIYJZzFeiLcNUcZpe+KpYLpbX36QRvVjY4iNGc1ot5X2WDsiWcFALBjKieqve294aWc5ATR1UVVxBXqjVyyI+X56V6HWRvPeojskvmlnOMRYuC/KstZQorQPTvYmwrvZvtrA327ubTm86YYPPut3Www81MR0Z1EiuBOS5wcSkLCsYXcLYRHpNhZcMyXy8uCzVkudpmGC1PJWOgOvueoKFYUrs1axhWTrcmmcGb3izCll7ZzdVx1Pk4dtx2uwSXAsl8puCK0MXNQWqti5Fh59lqPGp8HS6VSen57exsEVWH3R/PuqPhbXE1bj0th8Ji8MpwNucjabr6FqqUJkeGDCvRo4Dt5zDfDREMTXHMzdYJAXEQrCeAyyJ2DPglP71EpkfxDInbQ++REewOwSf6ocAWtxE/nJ+lWtiBdG/D5W32WckTXoj0nTB6nMzPLi3flgUjdHbFokJVDGrlGUfVKmSVP04Zx4WZ8Z9eAcGdrH47fTKF3mxwkNonXH5/CORFA76md7354QYH6f/ltSUj6E7it5lrGEjUuQuFwH1Ij+owEYr4gsdxMWvPbfQghM3VzmHWhSm9o2/gMzPMN6PXTshUDuFUllz789kchAhXtaYGiEMnNS8JR+2uMu3h+3hAy4e52rEQfsgxtWL2xC+pbUy0lGwTEQ01IkK3mncyfaYx9DhfuKfaJB1kbrOg2NMjWukkKCBRXZRTuykxq7IBJioqZXtW3Bbzj6+PxKz2sE3L1VVbR6iH2L47Oil/jAPVNsA25j5mMbbAbWtSNg/jV+c6IgFdNzwAgtjTOkIvB6F2MPT10bLIrPA44Vnll5Yb2wSICF/T338/AOy6lngrPeC63EaUp9o2w+g06awSfLWvScg4ou3b0huBueu+35pk9kLUVTdi8s5MpNglXcMNCLhULcnVIOwm0qWmr6dMZf7PMF51NRlYridd9k2vgdYnFbbfrr1TXq6L4lKpwOMaZb1kiuq8eOmCnnWGITIKH0j+4b6sZzSZAIOFxV1Q8xegORkXpYLiSGdoS0nXua+X84AXsTHHEuja76WgGBWGT0d5Nv0x5Fhh3LaXi+eQSXChl2WPGbD5NAJKAyNuwEwf0fK4jo9GJbF5Y1p5eDm9GI7mWtx57Ifw//TMIS+6C6fkIGymUG/ALUgYHYLE0S7C4jFGT5C20nP7hn2FtlkkEotRnCkrHsIbBrObx3QkxzCC1OVIJOzeTxLIkrHEoWs2Jkv5Q95YjZ4hFEMSnazUVg5LMUI2Qyy102WU8tWQQY2C1bn1rA5V1YNXMxU+Lwvh2FSHC0kNmSBUCWLydUst2zYvuT7TVO4dvtcytBSw+2f8VH7NFOeq9FSA4woj/AiUjM74wM0NdOne3tYeK2cHtz4iJD92oZ/Ymr0vPWqTbD0oVMf76qec3MyiuW+Qky+/twQ5fRHw22YbHDQSATdh4e05J/MXB9fhPx23qtU74shpE0vi/eO4NPE4XZ5TejWbJ74cmzExIVnYUQGZlqfoTevnKSiVgTy9SkeTt0HgYRzGpdpPBXNEiNjLCIbwVGL2QM48YxWmwSOve4uDz8IRaG9HO57CUuLn2YuZOeznPj0bRQYbiddvc4XJqDV7ZX6IDPpksXYhAEz3RethoorYtx837WWxadyfpMzWL2EQLcBeQtSBneERlOFnA/FWMZHJ+dgWDkmSBL52hvkgKnwG/UwOa1Beh9+j+J1ww3s4CQQxzJ0D2Se3MzcSQBB/u9reaS5uPiILz/UGB+eoY1WXo4ILfzSgKaD8rNHZx49PzmljaEtDP9uGV2QEaZ7MctUl4SOMsDsWOXbfygmMUInN2YhsOFIKi6IWunZC+szNE6K7EZDesK/Y352a8F9fYvGJ8h0oYThznnKvSnlGuvjlCkcplIE5yM11rI4mke6MI0sXg8aL64Gmf6C0VQyNx7yV7D0SeB4fSNnc0XV2TiGKJKwVoFoi2gdt54lYyROp78ZqMnY62Ea+8eX1hTnhFdPzyf4UWjta7mJw4V8YZOlU+9nZjozI6BClVLFj5arw4YtnrvxDtmqcM06lY2EzLFWOdJBHYiMew6WJEprwD9l2G4orcIL4tfvyupTr6MyFE+HaXwEdC2fYVTHASIIYs8dSQhXFGXV9mO3M1cfzny8O26BQq3/ZG2QLWGhPXqDzWvFsFiiI5UIVtRY/Q6ZUlAG1ArGJd5/+SKM0s/WhGp/tyzE8DwkAWQtY0mB2PyoVGp5VPUDfPK3jwdoL+29Ai8rI0IFyTPSVOh2rw8mAaK1eZLY+VPlh69l4MMlbu6Ykzi5uZ8Cyz8nzb7ft8RASVvWEvKjyJZ7vHOTVOhQqfgEJWGBS7uQgjN3ZPwH5WXzx9gsmpiBwTyYhxpPGKoH9u7Ohzytpgs3XovKZRRSV953TekEDI+Yp54RE2ZEsnbLFEh7vfiaPi48AO12zy241w2YfajH7i7uvR2wDifK3TGkydSyAleYNe05mPn7iUbc+s973kzC0d5pweYkcY/nza5vvh/q5IMJxnIufpZ21juq4Pt6wLziCl9wUxPJW90TW0Wv3uZnGSSQKOsGQfgDvURscbOsn8188o3C1KHvqnk9Ko/vtYNv0zeGvI9umPGi7DrBWsgJ2nVyHyvpJDpO+B0a5NTZ0zhRZ4N2lXIO/3zkOPKjAonks1KvqVjQMQ9PcslRwFb0LnhibCbE7YnqfCM2YxsDPvh9aow6x8WzkEfmqF0rlbEdbxloCaEt1rBTbvMk+KXOgIIpB9nz3150YirDVxIFYx++f7B1C6ONwfPE6iFMCwjZysrRoW1F5FWHBj/HLAz0h5yNuQKkbv5B0a14u1yoy5Rg4Zz1wzpWP7ZW69bDYBhalL+nvp//bLV0UU5dUP114GtDmcryfYA9SeD+RvYvg0aSwl1mYvT2/a4ODs2745GoSCV876OhskA6vk7id/9wyi4P++rY74rsXpmEtTj7FUYs5qo0H1Mf+AHrXC0qRVW0uNMb3xVcbFKxNgoyyVtz7LhELoW/w70AHJtZG+kie9c8kYy04M2VMUTHH7VLETFhTTvOOI0duvmE4nHRzbbV41+FUAqcAgBeB0iwHzSBGGh+mrKGn6ll2XqVBdkguwGUgXDqzrJ5kyJZYMeVP+aYRH7YQalF9J1+OZsOoFfJBgXlyz7WPUQhg/2amIxFk6dyBVsKG9kQNyExRXjbAyTEp6pRmsr3SzWzYVxhdBvbmMEfAEmGTg8kobyaJQxMKb2eo3Lf+FG5GYsIirzqhTBtkRpe3L2+C9SepsnMJVbL8SsvWU4oS9YmWvisjNXGBusmXs/FjQzBHhv2r/0DCVtstMNFYHBR4oFlUIoWV8efxU7hXHign19Vsu/+VK/VXopQaXReymNy8YpmHliTZ6qeb94hKDT6moIAQlCeKu5kFc7+Fvt4APh5uTV9bw+kxMAhG8T6QprUBIZolrPOpIzZL2SwKmEHNMrCJoMScoJcWvmSLeK5qACfl7FLAERG7G87f9qU6NaU5+4SZ6+muzeA2dN1vIraVNoQDnwsgeVWzzEdlhKuv6dw2w6gyiNGfJ5TkNuhhNhy8Ohn+UCPD0PrjBbU80wmQb5AzxLXRg12fV0kgS/kOc8ju19OZMBm4Ll3O4rynTS5fpDj5BafOt7f//XDx4wJRC/PiiHrVe3pafUqk6lh03wUG7KHoNGzZr8fD+MoazDAgZVYnZyOwEqQyq9O3bBsfn/POUDbCcWfT4wIIlJ2S0+uxYwC/TDlnJwpES86TXEVHYi9FnKEQe4qvwDd3gcUoYMbX4C29SF1mhlgF8a8EOfKl/0NwyNOasltDQsU34nKmhhLHtW+JECShbjlAhXh/MvpPryBvcd1SG44UMaQFTf/dOz4b72/nZHD/hn0hNPmPP380Ck79UT5t1d3bPv+bYATWN6dOiBGS9PqXQ+ALsROEZqovpGbJt9RapKkgaxvhDPL53KaMgcJvsVSqGX+Qw1fFcD1P7jnCj5mvygCOZtdRYfMfKe7KfjlPlD5k25OGc5uknOOvXk335/nZ6MbyND+DwTUU03IoT7Wl3M3EJjytNCBfymnP4xIzyttfPJ8ZDQQTzr+YWuu8LHaadaOjPurI+ljV4Hk084rKlS1HbKm2MPCX8E+1no6whz8BDr3Z3g9mJHQmyvYxT9vHBNf0kG1ljhbXk3zjGeoK8LPINAudk9H+Hp4uxgG2XToj7pp8fFhBVrMPsOwbnw7Jbabttx/DtY9iPbG96Rjan8VwTYY9RGGSoEF5FXVOoGP7ohtEU/bQonmVunq2Pxz2Rx88T4vu60V7ILaqQ4KuXGTOm4v+sNiwNtuTPPe0zj5G3/z58bqfmJhs+hyKCNs5c1MJAxEjerzhCqoIhjP7Xcrx9JzQousYeOVd6QkO93hcsOAJ+B8y2Bw1TyFu36lChYQz8nCMsGSc3yuoWPTOuxrZedxG3DJM9e+dphzs1dJ5+k0QiHbBKfzosRVk67WDYIZ25Oa5bVJBlsMPJzgKJrwchEF/c0v5tFN3+TKULxHUwJRDcgk6xUs///ztizqvaIxyk6AJERCF5OHrvGPrz4+XuCg8T1rdaSyM7uB/5hN4ez+4D4XMYziXmSLz/ppCLgdXp1ar0VzZc22IOxq4xBwpn1zMXHx2VryygwJnBYllFNBb0ZqI8FcrNR9mJ+4HSBb5/oP66Lk+Pq83VBUs7bqgsvrWHOsVuKpn9T4kf6rkG8HtyBzO2FxOffNs8B8vXxfra6F5J3APqrVQwMt6qzgKtT/ozskGepvmR+UJKx9phUGIOT98ftiOsU3gCn/SI/9zD3an4/hXC15tg9sALxZz0ugKDDHVM+tbX0x9GkX2f2J17l3BUpsWI+w0EBSdsegjyJAms5xWKWP5AEql9+nvSCMRARbwbWtCX1bnlIFDZLi0kc0uMc7pqHaHjCj1fEpbzfGZ/9CS4fynUat7GecOoD7XGo5pfN51PkBV06j1E8/641T3bmFyjPk6/gJrzrhZwfJpUA7+WVtZzYCpUy1ybdnV2XwIw46CsGjbH21wcCVLP4atcdpOfPHJWHlTvSWPWdXAEr4PpKJAwBDadBiH9wDDaj1b7SVq6wTGiJuTM1WgG28OK1MCTo2KInizIC1Q+Qw6NdOgo0eEa/P98KHHHjJWYQ9SesQvSu3yY7ZuMAV+X4pB+QWBYcdRmE3a3eloEL2235sTTsM8m19QCG04UpGE/QRx4Huf0JaLCBT2HiJzOsakEv/LaCaD8IJwKXMszPupoJfZ1LpY3u2KRVWIDcyPQERffpzHpTlw6cTrBgFzwuHWFOtNiVMneEt9Kkm2PjvlzZJAAF0+67gqiEG5bvn66Y2Arv7nUbZj8qBvZqwjxfzh5HPEOVipQ3mlA+3nTBewyb8868tCE5fB5z4JJu2d1Zrq9Kf6RPlo/GyO9U5ubW2WS9Kf9kp5ND7u3a6suQ5IWgFFUe/xATMslY3CKWopvQgnuVJMgeY1UH+Ts4nNxan/2YjmcFvU4wCj3N3mIc+Rp6J2UP5jw9fNKmepf6hp5RjL2i21hmA9DFiWW3VM10HyrmKdQmYmXH7860O1oTPhzJc4Ace4ZLwERzjH8OdoOgkxsWepBXOXHo4PCKcwFoi7gjNh9IZR8t1YHzWfsw+FXvn23nEml3u9+fnVGGRuN4yxnpJq4xZ/37UGbZTsO91H01rizp2iiNGp67buCM/yqPMO8hO56iKdN1Yp01sRxuDEvu6pJwcKAR99cR4XMfDTdqcmoAH2s/dp6ywRdPspDeDLIQBYoP4NlYQUuIqaD5+sI/8Suvl+9iUJb+80X6es6DsEWNZJhznNrj7uY9V+vgg+vjAn02zckEDUs+82r+wEsCCsGz0Y4gk+e7L52/pQuY4McaMHo3K5gLi+LDOYZ/OqXX5J4gwQTL2hKYCmEnDWCIHbPv9kd1PrqKDvDZsFxzuyfR2Tzk6B5UIJ5+QPr0q5Fi/IQiqrRchkaDtLPJhIuTpQUdcrUHDqbO6t4+q5UxT0BvQhO+f/KPF+2QBm8zDwoWfNzdc6ol9qWm7sjE9K2vz07vVhrs8DdhLBcwi4fETjyw4mmOhhiZ3zLK6TQB4lsu87zGNVtWz0INvMzsQLJyq3zsNpwVTUFhpX/nTeR4v1en74VX566sii+tCN4j+mPzfYGGdjb+m/OKjV01J2KTN3fTZuQ7n6o1MqY4+2zlPFU3pv+2Z/rGWJxcV3JCx8RBPe0gY0p2fMBgfLi0LGAr1Iyq3FLrj2hpjTzO/fjygRLLoPpjq4L7v9WhQbEvnp84xWnEel4fJInrbT4qLbHSgX95+drWF6tf6GGWYfco57LbLezZDinamFFlmUb2MwWRReTuOLInLgePY7FgwRROqcpOTTSDoaAwmBPCRx9ytRk9bxQ65MO5/e2/WkiNGB83kukDkpgQkTNGmvQZ04vO30IfmcFmI0AfhGNjy4yIuAnQPsx9eLy1YFlcc3vig0DUiuquzo1dM0fB3cKc4BolDzRQvVDG6uhXHeefLqrEF5T3US8RHADpSCY9UQcLrBwf1d0hmWcycJRdtmuwPREiV5Sn/cPiNk+0QHMUqKuEyI2uIgtJPY905IFctKIThIHbnT1NZr6Pl0nwuiC+dPhCD1bkOp5sBZn4KQkjsX18Km8C0PzXlreZ/P41/ePL8XBY0CAu6QV7SvhRa50pncRjyKV6XRRq7MLM3yhLXamxoWvT448K2URWKxe5lb6Cy+5kc5nFkrAFi4E7T8HKS5XlRsQ0JJHwq/MvZnpfpaat6+1R6RC6bQL6udLpQqfyTsk04sypo/jXa5bCmv1wZ//tPnFdBO00icSDB9JAsdUsjCdLzldOH+Esg25ry0yMbRXjvSGAq+Y0TQSvnu2afsoHOlT1sFbZzB49MPVnw7SwyXffKiZoWWD0nb2eetP39sWu469zE/yY3poBd3UqLg3FfFA3oRQsW9+ohMslNiwZ+dBg4hEpFOBtfP1t3Ji8p6w83HwdCy78x8f3iYlSehZ+oyN7T3HyIN8/XR6lJRoHjwiFWJKkP0a7lodEkbEJ/ZyH8wSMaESCQI+oeFWZLd//h1tKgiUf1EnBc13rRRh17DdRJlXh0f+t0+XjpVTqdpED5K4R7dHvt2wiHEXIgd4hyyqxWQg6cC5ipWxVGqRFLYUr6Nz+jhhjEuYmvBtULJ0NMy8v4k+1Bw9kxEzno98xy8c2zxTWAeK9n17c/tnmgRZCfwenM2Qogc2wG9bQusQ+K/OzXuDQ7691E2L/C6lMM9nH1+xYUAaSP/g7zG+A3eaxoioqzfjA9IN/sUL7rRuizcCnpwZtj2fq3aOpCv7uyuG9k/40b+hNCVp9TM1hczoinUgj8rLWVgLwtIsezee4GxSGqlZRxLaQ2YfCvUzUFkO3e//yYhEaA42sUZdbKrdcIUf+7882ZNaE3gu+upTuKtdjnYyub1EaozPwIrSciVN8WcKbxf60EeYGxv7E5SqCSOv2Fi7tcgzpt4PSwRK6DI5jJcicgBQB8w3ogEUyX3/LYjlc1CYY8jq7csbP7pNN0q9DrmFxJ/GBbzIi2F60j6zSNp1Ueip+S3hGYF6IQ2k/PAko48TEgBPAxeKVx2GHducDARnLpeZ9ywPcRx7p/JSjdk+3pBcv070qVnpTQ2b6Vu9VctR733Vzwik/O8Yz0OP3sJvjAm/W74/iX9SFlXZkSblbCQd7Cf2BMS5ArK7iODdIJtWsKMzFi2d0DT+hBW1GUK8zaQstxBpw95Jo1qgFREMBrGqxkW2PfroO47+wxElmHUfxxCzvC801/MYW4gjt8kvgfG0j+zPebyC7VNUr7EgS+jxPSvHlzrXzO5Ko2xq76ysvS/rzJINlJNoE5czOtuwrZ0b3sFxtZlTppTGmM+ZX1EJgxmOavziEpZzP/slsrgcfLbq60vMUUjXBSkNQnK8hp8mlSZfSvpCMvKqYIGn4LWXOvBGDliL65EVlB1O8/lF7wsdlYFJZIfZt/O3wVjcT4/cVSyK+aP6BSa+cNT37P+xFRze1c6yr/VC9lqrtU9TS7opY0MmrmH2oWgiX13oemXwcP4JVICpFzXBZcVBSmx2qS/zkuBtrPomsjN7CoPDGv5sj0nNoAGdP38hdrI9oRzh5lryazYCqzDHbWTv1/h844+FyYOOf9ktwVVHQ9hn+2ftMYAYG8FUlx9pLIlhZB6UK79oe0a2sZ8/RStF3vA28mjpM/e/dicjWEvGTy7o7nsMzS3XKHBVV2WAyPf4bBH8s1EeBq27WkKEkUtme+AaKWCAHUcnU32pNHWLHpE0NOLoIBlyEWt/Uqgyt0Xw+YkMbj+fj18HE9Kxd8vl+L6y7Q7bLXm/fSaOhzueVJkKJGXhlQkFkjG8WTk2FH7lCRNOPL1Cx4SdhwZ50M3LbL1dM7+8WzcKEFxnwDONavreAZ5PtuHkGXhPxWcgtPfDjgzMxHyo2EfC4tSqbGR5xACMHRWyHEPsPT+avltUczY0U8+efOm/JMpME8X6M9BLToA5tyIsUcqaV4ki/niKXfzRoH5cDRG5/PAtSHBJUMFplqI2f/5v73joAqmgJhbOPvPbulxGOfdWQczy8OUSMGJxZ4vh4ex2LYvKh+5c0UZ0E9qLzhktTS+vTLmS0RzEEq4QxWC4E7eUVdKeXMF5J8CC0c8Jxr49d2re7aQfyheOFZCwQXoxWiL6Rpk7g0jh3pZsN7G5pDJ/9l7VPHeW+8MnsvqYnL6fcP87R0LO6pnRGVTnDrHuRK0VW1QRGwfJRRYyiKZq1dFqJxv3L5laoWPT8X+o9HCoeTTh75t2LYyzWCWaaHBD612vVaV3z47WpdCzAg+ZmacLLWDlJyFg/TiLQn4xyFp+njMlWv8/aqtPlaYU9+yWSknwraP9GL2uZNyihGtSx9IXzMA9ACw04XPjs+oG2MeWZuv7X8+g+HZIubeVxDqinFTRQKmAKi3N7ppZyzVgXp34iQ1JiWZvdL979+eVbz7OPyOVQesrb7ORVqDfC3U/2p8aT0sK8OVVdPk3suUuxQO4r9//o7HoyRl24swwH5EW8nBWRVTYIv7MHPcSy9HVwmZnJwCizpst3tmV608vDiDsxUNTBRzY4jCwNMkJwCpYtDCBBT5RFUd+08cGjVh+vtag4K5x0S2VcH0WQMteM1UyD8LjDwFcpn5i4Pp4UYPLkrD03DpwEpFh9HzC4mfur3gHAJgsi5C15zDN9kolZL9Hx+q7d7xjvuXOZFUNBr7725p1jffnOdYSwN9mgOtdIMbPRhFl9udmkQQlvRj3tRau32abA4GZL5eBmN7qTzRgeY2jGUlpt1W8dmXo1/ukbIglzvfAgv9bb9tTMYFFYoVXT22zM1Cs9CluspJeJfNJxfuvTUkoP21Rp9Xs8qXroHlIB7FTqVfTT7erSHC6CvELjoBTQQijPTn95s1SLDVY9tTreV4EpFEqzTkzP7H1ud5Sm7VO5amYm7tZLMbPXhyaAP5AjS8+6IM1D+lSW7SZ6PiqC9q7EG8iTdJACTCWQHYlJvuaWD9jH/Al/nnr/pCUchtpHQBm5XO0q8ZLpHgjaq4NzHR3PmEJM/K4rsStHn287Dl5Tgi8M4MRKQi5jQQ3EYpucNAuLjfT0WXL+jkshe+koY/1HpaJ2/xLDQRujSYGeTqTw3+qPGyU2wMYhFgmNKY541iadoVjl8BHTga7ME7EE4dC0RUD4Ui4Rq2kxCaQWoj/w9ZFkyx9uPIunaBjs6HCem0nDjMM+jOUoRLGuViZwB9zPsfIpAVo3O40/hCAFEzxJ38vHf65CzG3OmQm2Ntc6ODT9k5etN4dzYeVjeFcUlv3hRqlFz/g4ObwsgK1+lF6AbdaHJc0lwUtqOr0HHOKVJf0WBeYsZcHtni4BVnACfCgTw3IjzDh30MFQZi/+6WCiec4tgvCohcO4rVzgkLE6aoNzgJXlMxOGaoMBUti6670TAxiCcvyaeQm5HFIMJbY5dvJAJmFBppadCHHr9OmbrC1Yw/ys9gbFDUc0jFeCLe6t1YV70/sd/Ig5WKxd8b89HWj/GR0Tggiesg4icgthFn2HKJQG1jUDI/pq4OGFDK4264bAki/Xgk01fU9txpLX4+1Rt4P/m9Ckrtd/F8wxjCL9YY+1AaaRsc1NsCwj6dsuUilmPvxW28SD2X4qmQ2LYl1RpuID+en5dyLMHee0iuyITL/bXSQnrJ1sfYz3m7tKxE2JPppGXp22NB6Chpfk9K1YQNfENbPZ8zKlZIO82xKp/vHxb30UgQO4lKon1fS2NRxpH8Aao9kll9O5K87h2njhuwrof1PtM4PzRHueL8lVZtr1zc07A7+fPJemFd1cbT+88ypnDMXqSWTW/ICXGsePPx7YX+ToKIxNLBJLWEdt9712mOsIWol724CK8Jp7+KTtkhph/bTtJqCIeu4EAlY0wsS88ZbJ+OjhsZe+irB/aix9vZS8Cs5T1MIsfESRYXot8hpvAkpReFmI378PXt5k1Zxb74Zn9xsC9EvJX0IX5JAtUFxK59J9GBlt8znHgU3Y1/+yFjppLbRhj/i4NRjZ9Yc64wtcHB+H92S2/OnT5+I75wFePdIZAvRmDP4B+voW1+d+yugkz3nj8uyqusTTo5j4tqjnxnVZEMrg2yMyPcaxMaPUM9LilrNm+z7SBjHaTreRK4fo7Nl/qjRFq12MwBZseRhX+WqygXhhPryUtBgADdYVgsTrE5PQus7yX+aZQ4ca9iojTPyGYw3ELj6h/be0qp57Thl1FObL9ji+OFcp9xPytCA7VxhGYbqiC1kZxQwjPx9oUTH9pMuR54XSiV4mC5kyOYc+vFoWDlHqruI7HGWTtt1pCxbjRT1tOQWcptc/EeUVR739Fr5crhNex2Dk1NfY9HosWAbPcL06i50d2fyR3vODGV2kerxThzQOyHmOWZywxYqKiEOO+COMV5FyS9HAeFtnPHvQcl2GxQv+vqbMvZmHWx6vnb5WFPWUjDa3Y+Ht0q61xC6G80k87F1WxiTlKpEyUi2veSChwhkMzv3wpGEcw7H7GsCkFX1kvJnrE4+9X10vQqY334BjK0we3lg4gngQ5POdxbl77RJATSvIEcemcZd8y3+3cHgahExciCs+3ZNDiyTUk8eAIc63Ly1rdKHWHDTCEzTZnyXxwMLo2ZsLfBwcT/x9V7dqfNbW3b6nRwxxSbJE5xjbsdXymW6B0BaiAkkESxqaaDaH/9Fc61772f92vi4THAc83jPNeaxQYY5gcj9+GZQU9UUfhuO7mODZsaysNTwatx0KJxUNNIpgLoKRpsQghHT03P/9NbaoRHvACTXMiVZliaH0QhmnWgHm94va8Nc9yfPF42RLamu4FBtWNc1gu+FcdygkdHP+ElPg/NLb50NZ0p1IsvIWTj91NBDIBp+6ZSy1+qdXE8WhQ5rGZlw1USOVyFjsVetrtlEaewCdg+WQkwADFhFMl0Cwlh0fEyXSvPaKI9vuIC6TrKtXIrs2LMiY2b568XHU6sD5/07dEcarbHsSbXzI2Vo9xdQ64oo/GPcm7EXZt6fF0kN/c/1F9bYNkI9yOhZ27GqAhQaHmqQOfezWQwNf9T9BP8dYQlK0GrluuKL7kYeW70V2QbCNamaGCm40bbo8daKsuuv2c1GU2PvJmwumU1WFMZ2BSKI4gXvEGjlAvFKRTz6ohwnp+MQ8mvbu9kfS+qFn073z8dddXsrP/P/VyxmhcNS2guBCovIyj9bT6dzUD8iJhAlt2eNUz4djZ+6ayBEOqwbENO3L404UWol/I7a3QcDFsCEATtLUs9QmQHsfTBXQr+wyNqrZDY8YassGQ5hFCsRjgtSbvlEGQqkV37zAsXNiIWJ5lLM+BnkwFiwfvtNjzRsv9sUUUn/UVyz3bBat4vWnIt3zk4KlbDmAl+iAXn/tAdg/sdpzxQGYSmbQ6b2bNMWPN+q5AVnYlMNq7Fc8humdTymq77z73of3tLrZhvnXKL7L6XsMEpwuAA9wLH/0QwlRZT0UkueVy1curqrbNoLwyROy9Tl7OFn2ibU+4lulGsWx+x/Szek3LJh1YROM1QK1nR5OCkSPYfiV66mR/srwSe/CCa1SlvNOs+s6sBXbQ70q9Bmun2D1isBEV0lwQ2UEMstLOTVtAosiTxLHBgti9HbGfA7PxU+ulnnVkcIgTVmVnATibSqSL+6A9xRLZZulQrl3+fun7wVYSnP1lAtmnIKbLbLDbzMxGhnwKlaiA9/AYxUuawJRV0Ad2p5yg/RrzZ8028gTznSrpGppXH1Kp1dL708jppmeYrLd8XwnY4igrb4AOvUyNE+DxuUD978z3MN+WRHHNjtKdm3qDm2/wTD7DB2/vvtcQzAiVQn31rsuR2qHArOcos35YVQ8/YlKejSvRbbNp+u2nKq3rRbL08wQMw6NMzK9FvP0yFnCNvYFaP7+WcuShxGBa35wg+vDYmsiHTdsBgwLPZacyXKYMTE2UkX0XgICDC0bcs9hI0Lw8u3C6XMb0lsrDp/unnLAGH0NCuFVxWzaDgDGPpeNujwp1MrlRBltM72DKpM8K8BM0/Xjw+25YaB9f7U6aeoPHdDyZ3g+v3wW44ONtxMBPz1slrVseCmkbapzA1XUxGNQ4CoTCItfKAm13XUBWsLizg3AGCUJyO2pZ+b/bm7JPGxhBqZXDdgT2/9oOgbX+A7L185sPV1go/ZTm/ycaGqXIBce9+yo0F4QUy+MXQg/b/AW5+sPAvAWpbML7yRPwyB846xkinkqtn/3yZRBaFevbZwFf7EDh6CzQ7UPaQJAVS0Gt5g0UbMpK/1kcaRWbHY7zTNPVrwWmOix22T1OeNN/UDsevZSYl1frc4NFIaiKPL8ET9jbuupCqZrYStbSrOjLTVgKykufDLbZgGqx6Yrq+KbT7gknprPJ1Kny8s/RTjeGTmXl9M3Sojo+Sg8E4diT+bJA1WWjYKmi7eZsxTErjcwTUL185snC7HeK17zm7YhlfT1fSnacobDsYckE7RC2ROG0bvAhC6y/vgeDU3TVvJWc+e9Xqk6qZAIDnDb3jGTUOuuq3uoRKWgSVMU6+/fpueqskgnSS9QXUB108tPSGWDQfsq92BSudJ+IbeHBl2o7m5bDmBx9/RNNYkLRyXsPyayLKVuJMvHpg+d3I5JI0FqhYUMJFFF8z2EEV/CMrdsOhuxDmMhUic2glXIehICiXbOa9iggTcDK7EJv6It8GmOpVHHY3AWJWil2+leKCc5RKYhNsut6fQil//WBgkojq+8Q8vHJf7R5aApigO4R55ECXM+MxDvClNQ4yW65EKYfJ2wREsHpbIrSuJX5St70BlF1vYyRNwNa6Tgb1OWfbEVrL5qBLQiD8bXHIr4aV8nPkw14nk58C55Z2WDCtbGl8NZoI+7Nr6mTZKnTouO11RTP2ZU7wFsFNu6vFA4PFFp1bFH4dvhQd8ZUIuyYW8wUkTghd7CkEptk9I1+NErrTyVN+nBNffj3mSWnXz8mRXEcqCm39Eh0YOb7uQYstbAa1DQhTvzXsOJc9tVw2QQqQR1rUKtxSkrTK7eZ/Nto1uUoj9X4v/dxWmQZgsJ27CnxnMN/60QPYG2WsqAoituptk2wdM+keJwCiH+dMDaE6ePl1+vGDXEUqpcvPhXH1wVtYTgBnSG2DB8PdqpeqyNSWW/PdD5OkDznYjv6ax7xVKOj4TnhBvWalKafXH4R8e7MwF4GyRAGgeHiUiPZynGwJfAa9WXwa2Pg+7vf3VP3KxS9DYH7CmuzOSDSEUbv4ZIbv9ggvPnUbni80DhLD2BY8Su5B61EPHEikXN9SG6lV2CKW0ouybNgq8lDwwBL+8Sepz9YwMolAtW3nnjPmA2z7Q0QYx7l1v4ELyXHg6IE0rw5YxnG0a1xmy7DtSQYy1yWDWaqimdUKOZvfsjHdLBr5IifN1hMfr/lBTAfcA95lNL17ljSgH71CN2hRubzDc08xmCgAgZRNO+oRMh7N60I2y98dRhoH17XEZMq/T7Z4iMus1zFEsMNojmGSQdt2jEEWsiU1cA9DlnneSaKG/HO1yY11VL61pI1yOkmho5n/OFjm+hevGWSRNbqdx0w9nhGTD1IevpEyc8+0kMvXirurmxAbWHEOYC4A3LeCiYaZi/Ds2FRFyIpt3W9l6pg6oaZiEwfYoybV6vmm0NHXOQt/TRtyjcrlzs7HJdOqBD1PcqR5m1vNloggSY22rpRuFF8UMPJUidPtD0KjVg5Cnz8YxZe+kT166BVZfYBpqqtiJ99hbg3X83aVyI0fXost0y9WhvMCcvrxdx5CCo0o1a7lH9eav6n0raXalZ6pqXxnVf4yDkyyH/ChT4GOTfA9wLyte2q8voMsMVweEKyUKAZPzWsr7fNJx4GJYty20lDQmPnz/LtfCE2yH6/GYvOimiGqcXHa7UgH8mm96YXSu3srDInZbbg3i9htoEnvn04C+otxyJ89jIcKh3EvvUzs5a8O47oC9l4LEX1Y4l5q4rk17BuoSgO8ZzJoVheyOivoYZXYUelBHLLDkCumgyzlxYY1AeHIxvanqfAi6kK3Ol0ARHSa5UHMZMmN69qZSLOMGqQbGJ83mIFdChOZ8wVoX6VwUPOD2MTD+KaUJbTAk5nL1CbUh52DPBssiebtLLOuMw9Xv7IYSfiSCKPJHv59HQPgPiQyCbJoDbTW74N+KL4Rs1I4rjnNP9YA79WR9wXIZirjTGWc00EBbieiaaQcJdRuqrm27RcdVhfc7s35JzNW4XRbaB5BdHnFPxEBthMEkkOjNz0RkMJ3bpHoWS2NPj37+vwF7blIgYmicyWu0yX8cU4odHDVJlm12MiFkw9QnJWu9PzrIPjr1HTcriCL8oVFLZeoHN9qJNg2v5/+3bYP2tVZZvbYLSmmz4WO4E3/3hwcdwqdWvkCZV75bxkJ2WfkPJ9s6WXLmB4V6vVbvimnr9rtCP1ys/vrgi7wmaH21x+JRqqtBDu9Ej9AydydO56WR7PbmoT3HnxsZFi6vf6KbUe8+PIfx5Ttui2xBc1Mx4QTiiY2l4R/WnNvoVgifhq2+lH0m6adrUEoGNXDuSBPyjiys1RKqaB8pJqj3ciEb+hxS8tsIuLeCrTpgZ4iMxInDJ9wHHAnEtNlKuh/o0PfrfZiP+LzOR+gULDHxgecLmRH5J/8vBsjHCeJTPwOBVoT3QxNO2YnDI3Zw+ZSiHGXSDWyZ9c7DkzJ933H++/1dcGsynPvvaWKCzbaizKUzg9JI6Pot95rXK8TT0ADSM8UMOdaYmfd15QIzTQ/OPPESI2Dvjm1pbzFB3+6hL6aFvbV3+tdfjrrfQ7xwe9jqGFf2gcm/9ZQYZw9BBPWLdu2z4sAtr81VI7NTciP2+E474XJtuhQmZJDFLv4644uA42TRnPutTgBzj7+ilC51+mdyb9kjX6uSXSqndwYQqgnTzsP9IdmLF0lDdQq18he2hF1zua7joMn1Emmx1ukrxOn3/aJ59XHSGkE0MNvRVbRG0ttoVy7/elxtMBZrRa9lcpKYVZH6YnUT7WrV+HbiaHerM3QV4UjIGkZIOsGh8dhKDDl8slPRUiCrU5AVfpJRpUNuZ+qmpMLkbsKF08/Uz2uAdxu7ixVSgbf3E9Yv/CsI3xxWcgx9YIx9zlCvvZ6QWBQEKQPtKxx8OpYvxhI3VD/VM+q3etDKSQuxj6AHR8MLWVczw7z8L7Ha7UbYj4J1mLjOZYhsZBjwxJUgUM8CHVDwCQoZN50+7ZwfN68G7zFRaSropTqDu8fyzXYv3Qy+GK67bf5OYL1JYuBjdiGNI4Gve09AoKidlsCJ5anqac/4yihSeKdoN+2NRl26QnbTe3mj/UXi3WRWJiez0XbiS9poKppRp6bJJ/7gNJ5EVu0ZbDIThzM8IGsYPBZAi3esTPL6jQ3YQy8tyPtGAzvHJSAyb30l4P9ebIwv2EBnRpNan7QvHfii0Gr8LEJugMy08jq4HPc396FCikvQFK5fULH0HIGhwNFK+ZhqOzWemaI3aae2AIQ4zcyM8ibITU/eOhc18nsWPd8LHr44s8YYVYvWt+CUybqPqplCCD6sneWfuUvOZ4fU7XC0lPT9/aSkTqshDbn7Xx/W8qKjqr+290epY7mfErfz3Ue3sRmfZzpDJoZZvtbzFRIZdZ3BRyAdKhGo2LY3HW2l7VaLnpeKuvuJAOgSCW4NukWBtcHBbXKEyfzJKjeGXCpVr68cnxYVpQi8+kRDXRu+2Nlptk8yV147tiEXE3hYk9DrtlhE8UXGP51ZnLKLzkj9Sm75DrrtcueWabN55jfnRNvfhzA4w883zZBVG40p39t2D+URrV65behWXs7Ultv9KjcVw/6n1NXkXAODElZd5zNfnxfNIxdm/+JuuDQ8iqNZyWP3zry4NMixE+Slp3kCiX0r2dRz5xm3orC33mMReWNrx2eCTnW4q+n8hDuD0iKJ0pTUW9o5t5djfEYohLerGPD9msZ91JRwnDRB70ZyhB0UoCPLpi3Y9/a+KI1prfoZXL8qWWg61mGQb9YVnwIpU4QZ3XbPEYlp9OBOD2wmNl5Gfh0XGatn9c9CEUdcLHuLWVAkwXAaO6XblwcImZKcpPXrYzyUkb9lVtYfXvROLgME8zVIzQvpUzo/fp9kA7G5iwTGhO7zVPTeTGO4nMfE2Ry5sR6DhW+Ezs+pVEyLSSiOhxIYnGIw0KA9xD/21vq8/7l4E7EuqR4xr+8NBqySmz/+6yB3nTClJrh58FB7jIC+GRM4ctZhWtTz3SkwOaMjPNTL9LhdMcPuUZKx/VluZhHVD8PLBDveCi8qp9oHW4B2DBAAoa9nY+q2KwEPz5wAfamLygT0TxRgpa71sPOSEH9yj3Uq7Vu010Zgk++G4ZTCX2dHd9xs8pVYCy5xzVF6pRu2/eTVmFVUx9fFZn+VeoIUeb3z6fvHZAg63ZKfM1bWu3cfraFDGPNI1w36NQDLzOSaWJ9i0LnfFn95qeLFcW9FmFLU4DNzY6wkBGvpvkt7QdCzUiA8kFJLvgvi3axgOsz/wyYRYIkbx3mbG9ranNyoWrKJylUjOZSfjbn2FlpRuyMshJZ9DhxOatTA7j/zwd2NYQGi1EeTFe7EcGaP3Zq4IcLLJoI9chElASC9uvPD1EMDhBXbMgXymrpoe0NqgMa1wlkLq9ggeIG4mX2PieB10F0z4Pe89EybDp6wAIOCxiXBAh3pHbKNlt8Wug7PRC378obi8VmEHVkDLPavztAiddCGu9mDmcpCs0Fn/9uM2dUMtSU9MetFmhaPiRO9K/AbCyDW/Aqfpz63/fBCrHAJjyk1AjgE2VbVunsxcFHSyBbeN/l5zPlzfg0B0+JHLSRtGvyksCw7RCc9u2877RNeo5UwetH2QOzTo/qdIBviE78b2H0DNisbufyuAsW27m8PrJN5YTk7ddfCZb3+bQPR9K7y3on1FHb+X0IpJ/iTa5JV011SNU4OM/NKkfO3V/eDL+IOsw4wX5Ks4xKFNvYTvr3cjtWquZqs28VRVkdN5p5eH69adpvV8wTaYOrVoTdfkOMLGqY9Fqx4hfTrKFSPiCXpd7qurPslypHfpdzuZQqoglp1TLPrfY42sp5W3HlrHBHGNhmrYGUUbJ93QELWZjatbvCXgoUdwGMCCGywI05JdSecYh0V8tXcmD4qYgy7Q9KqwbpPt8sDPapV+3fWWchfK/Vj4tSP2kLzQ+GH7Ckzg+I2yUU50/CUayCbUY/z5Le0DL2iFiC8FlllmkOxuNCc/h5+qlNDjtLz0YjAGdPkzknHDq5mT7bZqkQeZjBF90swY+4EHzgL9DJ1IbUjxJzlcSDimXL2gGD6E7sx8zo8ZLyb0co2z2wsJODWaWE5byweU+iMFzH5+gSsBUxmEr+g2jm7B+LwdmAfN9dfhD4963NneLS25cB8xKiDi8DbWwMtI0rrk4ZLp2GpVSCbBe1da+HgfiXg4Lt/P+5Fx2GprG9beR+oHuD2bN9yxKHgK1W6H2XX3qbpcNJH7TiN9f3omQhir/XEp94vTBD2amZxJOHrN+F8xzEeW+N5zEaTROQBaz6NGimCd3wavP3iSwEvBoHV4rw3GvlxgUqHypkjNbjJDXVlQhqP82ZP75kRWRuu/uBpafkgE59s1DLx3h+0QmyXYxjbvCteKeQr3secy1lBkjtwEvlaPP77kqd1MSnGwl4u5My5lK1pEVO9/nt8cVQknj6WEZ64xsDuJJym5euD/VXGcqf3HNj6boESLNcjuo04oD0uUG+IH71cTDKaJq/8CqaoNOPv3I1LTWdW/yFpn7dNzErdtAIj6xH/9Vmmh+cZlrLc7ENml5u4/ZdLdfVy3+4ckU46I+rZaU8HsmFE/tXeuBdAqV9t5flL5MDvzGU2b/7YxujOP5jL4QVBdzKVxPT7nQ43lt9ar6uB1wfdSuS+m32ir0I7u2nPwRArBbQVnBE7C1teFFTuYECtBGlsZSPnR3srhQiejoyBMjFlu35wugPZQDbNg377DjoSzkHBCV13UOH7PV3K57LHK0rfMpYnDghuA6W20HMPY9duA4dDLSVjSHmap+HN0ybroSYx2SdCKZf172l7HtvaSHfgoKbP973pwjSBCXU8gF+0sjmBhomKlfw1DVyR9eVe56rR/D9ffBx3+ybu5nsgrb4ZITL2G3nWs4jxRzDZAq27VgUW/h3YtApi6mCL7HjXc9YiMIYz8PeYZFMoII1EML3o+kgtvWdMQUK0kbE81VIq0VvIpsW5jctqsOxXDA4454794RckwvC93q+vYXSFlURnze+f+rlSpz36lJ8SX0vlMi6wOts4eYtAdTBAAXRu2nMEkfauC8L7FrsS7nQKQ8OnnpC80ZJMBNlPFUm8bNmpjMuvxUqt1x7Ub/qN8ri5O7k611fFvnJSVqeykf9eXWCzCq6XOW2fTJtV9OvM/JVUeitfGkczd6cfTkrgQBb/+0gX0ta+lJyrKzzpZRbClIN4fQLQRXoPm3nOrniy83l6U7bUKiL0ScFEG8UvTAsibryhDt6vQqlvIuc49O4q4Ibgm0SW2Wu/hm8TRKII26f+NE9/1YiN1WT/lQtmwQpq5+t8dY6as5fm61UATna+fRlSs+Z5QaFiQG7f09LBalAoBrfG3ygY5leWIQH8RD/kYj5tFQQhR5imWUk+HiT9Po/xaOhJUKAeReRiVD8AHKGSidv8Wn2zBfDFHi94TcOZ7DFwQYsLT3mVGjHmcoMIFcUDEMMbGame4gHTpBbUQJZ2LYnT6X8e28pvu4tZZtuM9tBlcyNwT7UrFFpmjaWS4biaxMMLh8TsP4lGkTmIKRbxTFsvL4Xjav8uve/5tWnxvlcWgJTD3ErRQqZm+Uvy8qHo3euoC4LczY1FNBOShE+fZ/H6P8bz7zeJrzXEn9QEwMeM11+j2PzA/ZNl/fDUkgLwLa1FsmuLyRFf4AzKelaTvfp8uOUyOReh5cWv47SJHEHX8mV9/1W//hXXLPqRAROJ+gb3gwAb3iWVjzbM4acXwvimoPrgcAdaZ+5WeqGmqkpT42+Zc2QbTTL0enD8ReswRMracMwVzDLqi7W+jWs1aha8Zv5YrlQXgzTkjy77lB0vXx763EsKbkifnxQxkFdS2/+z71o/cFNZlrVfaiMctyflYVpAP+ZJxM0AkpO+KWYyYE8K7YbKNLOjDsVFK3dw+CsdZvZXsRqNz/++TZVm8jCct6cx7FiN56kDn0ABW/ajtdjE0CR0Y67ldxKYD50w3Y+j3ux9bDoXphmJoRFevNSyUMtFaRzNgX1OU+jIUbdjNo0SZy5eXy2rdDQ8tgVwhbuYKzKBkPdlLjuqXHOIkTGzwSCHuvG0OgMrC7+/DNoTlNL9C6tVjrsLJZ2qBIHcskDIJ6yerL6w6uAy7UHpCz6gzodgJSEjgz4EogowkmWBrF1b6lz3Vs6Ni6zNS3XNdEE0jGsqjXq1uHQOFiF7zUOZj6WfRanmgqsJ+NpHIyt/WBmmTCnLvD4UI5h/wzuCgxnYuObgHNpgF6nIqSifpfHRL+/D9LFDdTz/lrqQ0KmLQ0+ArBfMP7dWxojHWS3nCiNLTmLK+33ExHbFJPoPYoveh3w9kQVxED0xf6zvxR2C3luvCznIVfRJN/N6Lq/FvwRXAkl25J8kUbwl3lNFBETG97824Mg7wQppBto6XvGgXFZfJ1xrILSfzpUrVE23Lr3s6Bay8HaBwx+r2YIqVaaDOfdo8X1Qbhf44mzUtc/us2EF9Xx5sOhIzwvQaWLR1mpXL0BzVluVpZn6k3ni7vwomgnqkIqrQ+zdhXWwV8+3hVfe0Pu40O7yH5aZTtqOs+WAhoH7wMl0MwNsov1G5DUGb+Urn/Ch63ReFHa3EqMKh+qk0FnngOV18Sx94Idit1gccdEwAVPzDaCgrqbxx/RgDOAg0deLEXiPPYan5BDbnJq2NsdjEO6KhmcpA07NkJLBafInz+rUHC1ANdDMvegUSoHUTqfNHPHwLrJz87yW6sVmkgvicAyu64l3g5OoyZL7q1HCJV5vJRS475XiR0Z4ia6y+9HiZC5+GDaDoEHZwlQsXswxHGgQ/XVjz4rfhiCfTkvdCpa94XSureUee8tLfB1eNO+swAz8npuPLqSr5CxpGV+WePgxWu2ZF+lfM7v68l47r/Bf/t46Z3HTfijCx+qW5bhgiVSPMB5zeZznx47DIrM3Os3J3j27273f2Lr19JE1IsDG3wE4LIBwPu+t1RY70E42J1Agsk2ii66Bf23wwsKLaQLpmhWnCezbMDDcvPySiQ7T7hFUArCfs7fNl3RPe5FPGd0X7p0j5/dfcq+eoUsa4ayLS8YnluMuorq7UAz7P09ZX2PJG56nIt4Wq7kj+7QRvNGy6/TUuAv6PVEV3njKrfVar9+q38pjUvn3/XHb4oITd/9IE0Mq8HETOnWpNvl9bQDCpXJZ2NZ6pwrHSGYvol/dLUrCaX828K+5kmyJDcyze4w2vqk6obGUbFev+VaWGJP6YyZ+lH4dGeJd8piFFLGZURedWbKm201L50zX/Js963mu/ZPy2/uqGmq/b2jP4EEHNTO1+6kmtoLtSE+pAP9qfFWbDNuDU7hl71VLhlFuO0IWcyawKUtMC1FNUkcC9iXRFAaJQJ0Pb6X/6xxkIRz22UkZL0gEotseM9jfIh7C0Awrgf8lB6OhzxmX6Df8QnNr/QwP4mKjIyuSxPjEK07df2avUxSRr+Bc8UyX517zp1DJ4fsZK5TFGbzw67iWj+z2XiJf+8t/bHuLV3Py81qua4ou4mWginv+1Pa68aQdGhSNRwvXmIEeq8bKi9Ri1sGcy5JC/5xqpSaJm1slebJesrX7bm/B5JwHKEtTs6b1T8+W10hH3K33uVnD1lVVrMeRBFKJjdd2xkeC2//rRctZKvw2bXjuVT3CVOjgUeQW17Bk7x/SHqXScEyTtRz+PKuuFQko1l4KXpZ56e97Qw31STxsjezgIVeYK4OyPKILlgIK81zB5BQ0Dg4TpDFsu3bhz2qvqbV1+qLdBvgZSLXKhX2SzdtV6pdQaZLY2hSyxiXr+Cke3dssr7ytYH0vOUqYWfjV7QzqvT8u5UPhcvpwt9TXhyyhHY0DhKN8u2je1+PqpXBx58K4H1W9Mqi1J9Lau9A+KdeEDvCzPjaV7MaB9lG5Wh3xwgWqTKzqek69rdCUKqSIDvu+K9WpjNURLxyVfNBb4/Jlzfl7avusrYdskRWZgZz+jJxK+Fc+gLr95TBBzYxj+s4eOALDe8tiSwLbV5/qCV1OBB0PA1D6o03BsmAjyofhDJ9p5jve33rVUrM8jCaHwFBu3v+I69oHDzM4tn1tCjqEGd5iGP0lr0UbfB5oQ/+UHl+mG9OwqvMzQJqvuoWuIeeVbgs7kvsOllgP2ZmXnchuycb3OfcTQQ82UtgrKafj7+y6GH6veYEOoPWvaUdZBpTtFw3NPjZqvuypmgcbGsGoUIZQI+e6sphHzMDJx/LhtlrGZ2s/aD9nOVhzQ9uTxIh44Mv5hv4BZdrOo7iKHtkAf3rXX6YxsEC50rbIzTm9cEufhuZvXOwoHOYzO97S0MHn7IWfuqmGnwA6vn56thCnXDF4nLst756SPY8XMoLjvu9yZd8ITCQ7WcQz5H+NjfGOwLsmphZqE6+qv3oidHFGq8sQlGEsdPJugfBT+5t5hu8hVe4mahJlYBC4cBwicsV99GqxPWvOu3xXLJatA9Y6MlcipnxAaGSBbGKRACL9wfQlK4yiGYXIr64b5KjUg18cHzoVZRKWeNgo3Tb75enKKD9uB/r2AKdCqKu7irVlmRaaXoqb3Q7P4TTcpf+9LDMdY4AoeWZcc2uu31DucKlUSAzfIy1JAPbfwUH/Xvdp+Uw4q12zefDMbd+mDucx1XQ5c0keM5Gx73Or3BoZduK5kldSOcyP9nSuiC5R4bU4hY+9B+E/KGQGEhGt+KJoKaRtFQww3djqyCxPNWth2QGkQW4y1R1myFOl4NIzJeimTgVN/in9OHOKgfF0zgYwg8+G7+7F2EmPYbOk8v4ZrepU4oUmnktktubIsBUIMwOuFTD6Z79EESTrrMFWOoGUGsmuL5HsqkxDsjW1r2l2HtvacTUQPHssx7MVmDwZH8R1zgYdDygAeoBTSzm6MQxYfGPr1llLqHL1ytYfXvVOLjS/ODFHTgYpVj5Mj097G8H2exupeKDsZLJune4riX2svN8wLadiml+0L62HjoSCCZ3MgSw8b63lEInqbQ7Go6XsMWoSKNpvpRosfiCM8aMp4yK18UbdsLPTylmpc4K87eY/9n6GJRzpLB/Oi0A1Me0JI/oX8/yKUMBtJrMpaeTbYoi1kbMH8d2qad6j2uBbk0/W4p/9IZGDSKvD7/F59Io+nDfjSwe0MhqJVmAKWv5Vv86XslvQ+hqJC/qR4NtTVV+u3AcgRL6OjpLtycVGmiUiFVVxhryrcGktker+ZSstJurLaUNMLWrH5ODdgHJV+y75CtyVFR6s2KnWwm22CU6bFNpjYO0wiXg0hLIVgyWXUcWbFZz8FltoAnXhVKdJJRac/iZ3i0KWCKrMkF2rOnnBET4kuiTzuoLTRyxnQml2w4VEiJL2ogUoflBj8UHjT32lSbudlUw4EN2tVTg1X44qr8Yw147ZSKKlM4bkJHNAXSYmHOoyJQBIma3xLOL8Ob1+TQ5h3oBB+sKzi66xGTYS8yEkqafb9yjfBPKZShwVrRbX6Zh07ZtoHipkfuA4jyHHGMuSnnoEPS5PPYwLWdEIDA0rXtLM6M5CwYzjiXk1XIddU7irwo1G1YPiKlmpScPhotpEyDm77OGNA6+gvPRneYHX6MWLfih5Dy15xukSr5lSk0tDvizJu5vCbvJcQjcMsdsy0Ixqz/6tO43RQ63Q1g2g1vJ9b62jlfj4PZ65D4WSQoJFnfz8lLAs27PVwvE5nV7KK8udv3meDkHSJUQkGzYBDototWnIjhrmizbS2628fD5KLHIFKY/MF4dQvnePDAvlMVDPy38rEXT2NIND2ROMa1ytXLp15cVJNUU38vFo1opfQi8VV+QqtIjRmdeV/MlirpWd7FedX63eM0P+ndPi+FLHtxfg34p7x2+iLNFtV/sVKyjLyt9Yam4L0uSvLprUqta+ej20EEtlYq4/SQD4i+5kxvLijc9VnajkFpnmwXhrtxXmWc6rJlHan/3g4VpgYPtJ5RQrhCFmoqBuTJbPjT0Zf1KWoSP/MM31eSTxAXLmr7vDIIQiNi2Z5HAycgUdB16vbOwbjMPeeJeCsptZzDCardpHAQ2bc55fF6Fg483SED9nkqwKkJQEypk7ztEm4L4UwCIBznq7wX7zvRpkNP0/BZNLIqaXfI7fdOUjQ99nLtKpWFisdbPrjorZBrgPOOcPuWLcDAM51xZIKrl8rnP6diPeUkwPtTrVQ/HMN6ADc6yiIM0RKoAiahjOszBFAqm8lqua+l8KZkaPS71/qlysLuqIYmbpl4vS7QDPdAvuzJ0/6XyzsEJVEkFECV5nLxc34tGRNMszrIXBD8cAqf2P6rA8Chr2YIp/y6wxeLAIRd0zpgExZm8MB0yYkQ+TBbWfRPwzuo559ES5+FmABasgSXpa8J0fl+5pul4RljlxmYMW3NQLniHx3s600uhs69s0tiimMYHxXK1m4arI0j60BThgCHwY4iyEmTLw3kf8o/te2kscHW7pVUtUZl6rkG18r5VlVbPVq3qXDmwvM2SwKdGttaX6UfjYavalXP/RMsVIqP6vLuVLmFbvEHW24naLwPKFxmpru4MpCpBB9cO51LjYOn4rqcoa1Mz6ytSaVb41flC5F8U1P9zQPIKNRZfhxPw1HWXrsvDtMbBv++D+Ixtd3PNq2x+1R7V5KkRmpWaxuUwlo5e/Nq3TLsT2bd/UUID8CDOtM24n2FDutlOLrry+aQbAIfb/8aGe/UjSsBBcovGMZYleE0SsxKWY268dqkDEV41jcOKfiuWg0JLc/jpTw4iiGxkN0hCG1MS5KYFyCsJZAIs2AJQZNeehkdJUVpG0tU1NF8AotGIoEkKOp1SsBwKWtMLLJkkoREw9UBJAPYUAT0ojfwZ/XJdc1JA7nQ5JHtfsJCvGXCyrwW/CTjUch24A5dRsnVrAKUqVLhwzMGSAs0v77Xgf0SF7hyd9aoHqsbByFxK6bV4ZnVD98CkcdD+eD94WaBk0bcT4jtZNRZy4VkeDHt3rFiMRnFGYIPrWmdjTOcoGCM/3BR6KHgT3zM5+Lg4D/m4bgiUeaN8NWHVwzJxVq6KZhMVJpCy3mzVxMnoVbz+OuWbN3JmVW+JzYEsnie+h7pQj/PevGXn5mLxjYCZ35uTS5OKMUVY36rBv5VOLiIjYmnWO2vev8QlBcz9rHYl4H5eGJUgyz8HD+FRdRS9upXeDu7RRncuDhy1qS/zYnBsl4oIdl1DwJE5uS2FjcmLr4cLucTOju/8ixotvCqNTknpud/9YAucKRNLsSXrIaU0euN+bei+SMKKb5wfiS/8kbD2gy1k4W/pl6ZBZyTUGrukwjUem8uxlr6+eTx6blkb7bBqb/V9vV10sCCnOLljc5S8XZ+3kAlNVsQun4vh6NfE00wA/40NRNNIMMdyWmykmfim3xyYrt8HBSBx2jYGUJY1XHpMgWleZ90OrAvbjISTxLxAWLeRt+4nMhzKwSJI8Fquw2LGbc9KSWWlYVT/1IsFtGNllhTdJJfUbcz/9tQsTiIWb6y456W7B9HMoGYXMSN1uQc7wU14KyTAaiG3T/zOsNwbC65edVrwC/TY+wLM4dP5j1IFWVS/k2pF42CrpPnBEqaUr/V26RWYDeZ/OTisg8xI84OaCJwAc3BLt0hhxWUq0p0SM3bsTnzzacGP73+fFaC4nrX4yUJ2//mP1ZXC0bttHjm4ECz4MA9n0wS6saLofk/kpU+Uf7l1TeXUfPHcfPixFxG9vrvHIiHp+Ag8FsGDWWiJpM3jhlpQ69c5PjG0WQjtDwf8PP0E6kkhTyHNGga2GmikNRY66gjqZAi+2q/OHiuy1DT25Vp5oFk8o2Y2sMXlXXxRpid7tYkwlXtE917j4Otw3J1/7g4r8zXo//rBl7y5p3z/NpQKVPcFXfVrQqtS+7D8umyh5crsSJHQ8W1nuZJqt89/3wfLJqwF5J/lDhFu6sTAALtlnuoq3YJqaENG839WcU247u7vfFQzSnF+eSfT1C0KLKf9cbcaCm0ukZdpN9PFdqdjIAoVO0HSkTGo7xoJ0LOeoPdEi43UWiPFsc0o5ElkCgh3kQeIIfw+nmLD9ktdrwAIPZpBvwroEtB6/sb6zjzBchrzApJeR0zWo3hwJGTX7FKUgIIopBl2IOkdTF8SQeqNDmXGDtGuIFToJ6DCYiaeF5GQBx0qecxJG8NX3kNHNJsCdpwtzCa7NmwYH8HIvJfaZzhLYkiiixGUHMwEOB1JRy7FV90m20G0VK6bTiWNgxPDkq250YaEAA91/Wqk0LeGNQdLkO2kCs6iFV/wcPZ+L3ocPWGHwVVEtE/joeGJfrsSRDdsXydjbwBzOMygk9uB474ipOKhfY8uzSr2HODyWXSsTtrOz2ov3g3rkTqjOB+wafX7y/rOVtYLF4q8kL6httUWD8yWZh/dZs5Nda7hu7d/uu/nml5NFeSm4q/+FukTdGnEjepMH1m+hvgG2SlPtz9zHWFSu41/vOgUcvVy9Nu08nakdJRVufQ2lGtW+etqob4pLxropca31ybSV6yXRs+i8CaN7z9VyoPPFUOtURObb6vupXozWfbL/L8cnI8Gpdzm+f5ClUtQ6fsd169evQGVSX8lldzor3ZmXKpxPRwoq5xCNYqvosn85eOi8NIPZc8fObKtX4myu6Mlg0D1hrLPWqNxeXonW9RZZj5dbxe9OwASXqwW0l8MQ6oZiUJynPBP+NBJg8zZajp/8T8aicJCJ+8aCfjvomH8EJ/yIBfUm+3Oznr+RiY4yZm3h2lU42DkB5DGcMKX2Animl0KQxwU1zS/pnL513mYYdZrtma+XesLGKz/Sp08CJqtLSa+B71WuGI65DHnRCe5onbSuc1kwZ3rsReO0zGrvyBkb84+WuhKHjv8kkUnUS34DxlsIgzQQv7OXSiv58ZXUPL9tbQOFzzOhfZvsOn5Cln17lDtOKPm6n/uRZcpH3QdCemGnqh9Fk2bzheX0b4Pr57SMyiVwVm/i8yua4l3rXu+CHYYLLDzDGeGFwV0QZoiT/+MI9B+eOsJE4LZUZEf64QcWCeNufMwVadYAZgU8oqtlSWkut58d0rVl3M++YnmVxurNBheFFZipWBsfIyVcJDyfjOyWGIrTyO5tN7y+7sRLZTLnvOSMHgo6WvTEupdTHtn8t2LZSgN99cLYuZ3c3lUqj0/OL6B8xo8eb6V6MV1CShroB9Wp+bkyyPdVUq4dMNxi4alPyvl5h/PF9BcRqX+mXE0lo/6Q01QlUrSqnq1cClNsF9e10I06UNO84MvN/H5V0noaxx8331WKMkdslVKJZWjOKBScrnS+KZqbPzToZRqjUbNcOZV6AX++TAKjpO6mH8nBfkH+QlrsRcb0aAu7iLgsWHLKgDrxr3/00gwpWkkCuBCfsBbDGQTmwVrgCWc9lUCju9QhgCZZQ3qF3OAFXVWOIf4dJz5f5foJedxA7+Nurzgpxk+J2fuq2+I1wfNw94LGZ6YGCP+WgB8QgG+f3PsJL1mD4u+uVx7xS17ETTBJ//MtnXE+16PZcEExNd1BUvSMfsoasFPYUv2B6hm2myiVIbnOo2D+RoSIs+zKtumCElxz6SaTnm701+8ahwsT9PGyd8ZOMTBXQJQRhELMYdy+VlK8L0lklUnoR6KgniW0zScuL+TzkOFnYiVwn1Z/Tctnot50JPkEG9GNk0qCx71xoNIzugLQ5mi65TOt21WVl5KBeT7tyNrnyp6jx9zM5+V64/mxXyq7FvouyZvYyhM1W98q6aCXYOOVUHmbKfuZwRv7Ge+5n/WEcFx35yWGupD676jMc8wuRtZpLYxPSyN4bvj/WlXFn2L73foQr5ddUpBYCbL++Vrw8dVqxJQl59fexXD+awxEJfXP+7BBhCYlWLofF040RBXo3LP2qzQhZNVFq9U3D8rEto/bVGzSpk6czjaIFNe+0Eh87tJI+NWb84P5IPMP/iSaRVouMzh+Wt9Qa7CR8cuowbNkenysbeq3nUZuDpgxqOm7/NsS7XhwUl1z9S3xHcKhsBSYq2zWso/ZUAbTP/PXUFctzHQZI/X/69GMpkTWR+6fb0aJuc4+vfOXMMExP13fH00YglK+ybvBBdTg7DJr4vJ/wCDgZ+4PEnMufP4AJJTQUfZTdpkUrGxYCBlRYkkIe7ldQeUkHT/Y/c4aX+Sc71igrqHO0lfCAyLRks4RSGH83/3tVkFiAljKfhr6e+83FJV42AbeX92D7UoEFQNlFQ5uBxXkPGnF42DNer2wKP3L2TogSlrflDjIDuNBxA5IZQ+0ENGDhdtXdTD7trGPq8u6fkw3Rb96GJ3A/JzRiAuFUAzmtmf/eazXF+fUjt7RHDGGsxWWvA97Bz9Mi65KbKGZla/2krjAUrha8pt5h+uLgCRqck3nqcN9RkjTD86p5452zKaDjXdSTJmM3Po75P5fd9z5yORqwlEKhvyt9sfCqVxkNSd2vab4Kxc23BUayWw1BLdVUXnm0lH6r26rFerxM+K3OvfNRf6Wo16dO9nw9NSznNcyyePpfm6EMg7WyK7/asJ1S1XahoHVfWxOZpWxbNT14d6WRq+nT9wgfaVaFZmSqddmnFIx1rLVftcCBgsaclo5quw+Pvso5N8VYzZi29qVdKvOrWD1VzGFOl2cYO9lger5oflsDf5MjHMpMJ24MCa9PqBoOMGCfhPfdHpEiPAkge359K5aFrj4IPGwUJW00jovxxc3xVoHESSvphOy0ghLSO5wd2U1fXf8fURg3/pDvwECL1vFfPZGd3BtmUxyDPTt9SueEkAobGWGBfpULNlgnwCuljqY9CfmD6rAKRddzihp3tOCIMO0jG08HJJAyun3/k9ENCMIWWhZD69bzgzUaE06GEYeKIFv/aLEButopsaB+MZGcxpfhDnr/Vrebl5fTgvDMoRY/w7upKv0cR0ha73LoWYoaOUnMV9/51wFU0zl3ff7WMsULUzaShPksaQQ83mobC4Z8N8NEpOojQL06bjsB1AY+e7uvuwb5nJ7/6E8sFsVeRcvQLXchV35XCKrnMZ35lXEs0ejmoM5+atz2ixWFX51P6E61jMBe1bJtspKPtr9TEq9ZxMxaKj+5Fdjq5xLzeOL7u0WqgPbA8SPLe09Ehc7jeliVR4eZi1qyV+/6bWJbv3erVSg2/PHQaLooH+an1nfiUCqqaRhsqM/NXMRpYyylVuYXJZZ/Qvcu3l67ke65YR6e3kDi8p1OpFIlZVLfhrV9TJsgmYFdUs5Vr0oVDSPNDNT03XgQRbt1PreTLVthIplfKLiUxRRrU9qtYam9VSf4zWvS/cANpa724YrFakK+d1fEoNdQe+EE9wE7PJnmoARCZMByeC5V+NpHFQQNYzq3eCYev2FLfw07j1/zgYIrAdRADjadwSWGPieT2+3otoflDns/vXBVcWfObxbEfjzdRiOqDPG/PEQN/zzkGZdhw4DYYig91dFHVTe9Dqq6TMeGDH5Sl8gOweswuyAZZMywOKQz8K6J7VRJ7HQkcmwL+EwDEW12l5w2OxacHPvOqWsQcIZzQO5qtw8L8cJN8fjLq1g4mzmsiVrvT59Qz2wdyFw6oP9Q3CRvx/JlzlJUzAFl4RoiC300cWqOA7B5EGD4/oiMUv59M3hlOTH6NjvihHdQA+5qcEHnaHAt8FE26pMeLYTPpXbZDt4Y3ipdn+odev5TDorICynwSm2ijMQ3N/C1ihvvUuP4GjgZ4V6FqcVIGKHn80BJmyzvgTEzQvPIundILQqrf18t0q86oYIk/Dttz5oOSqInN95oJeyyKmXDwWXhQaGJWIWk3mI81b6nrZqs4qU2NsUmoWXxvroa/H97pGJTeRokeqLIC9+hutlvvTWsmg3kyzYU0jHcklBDhpUY1y+XbzeKddrzQGNkAZi88yTYzlXJBRe8+tB7eFao1ycKOHFv6sCuXKgDrc/0ZKEkcnTgv5xefB5K05WqKBcfITvuHZ9rPQ4XY6DSTS3FojMXpQ00jTPGa9EFCvnTTiEgf4AgXz9sC5q2kkPX/hhYiY/d0Pbkd/TBMZ3BRyAJDfr3Hwf9e4rO+5pKzRG9yKJIfDbkA4Md0B+VWUCF8m9ctrRMgOMLwn7s9sEUq2hS2eFOvOmI2PKfvhAbUdHiglwBJQzYwHCmQPY/n9QzYPYxOL+fy1ABHBSCbkbZm2YjI8537H38uw05Xo+4PRfziYUmjwcqmnuhKbc2tWWvODAXU9Awf2+rBl+ME++Z8JV+Xk2fyc4svdsHJRNBNGiyWRFXTJLx/VcZRAWQcG0A4QE5xRcFYd+HM7w41iv8jXXXoflKP05rRSnOx8+fB7XMhPEaelLUuGQL3qB/2ropf+RLL+FQfmynqV7om0eZutRwuuqWlGt3zGA5vFSf5GfOlhJ0WhNK4zbufytRw3NE9z7fYVJRdK3K+zwXEHDJD1KMdU30CqjURqpbdWuHlUuJosVaU6u31VesptZ6msYwN065fl8mBdkDq5k5qBcvVNlGa9o/HVATWp5XeOpKJ/cDOPz2rjwo3Dgc+rnFeTaivpRhGqU4Vg3+9F73N8rU/NHodVuWNUOjU4/3zq+lyq5tjyBYnm2ob+snZAzMpCif6W+tRUQ4M6ccoUvdE/49Qia9p0/1gk5iQYdDxgAdAMxFkcwKn8PqETSE7zfu915n81ktF/gqj/XSZ7IOC8f9fHhpD/rrf+70i6EMr6f/6xerzL0dOeufJ2EMyuqKBvksi9PRguUhKU1kXpYIm3bfsSBkpmmZ8r+xJdHVBJHXYAZ/XmxTRhnUB4ZrxbsK6ywj6iCEDhk2iicZJxqN+Ny1AG8JhagE0n64nUe4n+/8vB1o0BXJQg8Mm9GJUlOPh4u/aDKfB9Juq/kz3+djTHzGLfPTAtosTFr8WTGLEw/o2Mh9U4mA06SZ6H5QlgyA9zkJmRd2dgkN4ppIiJA9r65ckWAyhp38Qo/tmvySMdybfkqjV8Ncnio1JoXUNl2R6QKKtatpz6YrHvpsLRIdP53hWxfWdm9dbMMAY+wnAANTwKMfmZoWRAyAqFft9Z9QqvwwtLCx7AzRUQaeneikPZUPqJ97Klyv5DAwX5K3pULouWb05jWylV5heafi49iKv+JCfIZaJ91XrYHygiXr2D1FLz1txTarPkuR5aKW+8ekL2SjINDKoHgWWlJ8yuDKbU+nCqlmJL6ezlSzWxfnsG77cLuXTt4lKpvlnkJtJoKflisknhD9PlqFQ9yEG9yvzbZAqqw98Pn//kM91I+or2LhbGoJVzEBCL5mCzZa8Y+c+KH42DNBLCN6L/p5Em/+UgISU/J8GCNchCzl0kYU6d4kBoGRNM4LqPPmq0XCScuP1wz1tajAn/tHvAo2XC55uzW+4KkvgjGVcFNn0DfrOuQvh6nrket5v3UpGR07G/44ky5I5YjutjXwLvPQgJvqDb+PJtkphkdPMwgOk1KgLFuI7g/p2xoDHPn/r/c7CCLOTLND4t07NW6cA8regi737wJWrRKS7yfyZcwcgowggrEAqOksetEcb5cGCyyJPCT69theH7O+OiLhoZ6ml1uh37oRdnvYjPecOJwNc0BVDZPDsg/JdGwNtzdcQxIong/8fZe3+nrXZb2xJFdNwLxoYkTuIW99hODx3TJRAIJIQaIEzvRRLSv/5JdvZO9nn2M8753l9JRgaBxX2tuXTPueS77OOQL1kLwDuMVPCW5325sXifpYe9bHswjgP32rB6ThqSRyjucOoZVq26W9sH2RcugIXdz6NW9CdnLs9YUgUQvMJ8bFUanPZYJ9npXfnhp/H87MymzZGCzfOHboNB+QbTSPH0gK/e53a4zlTh5m+tNdqSm7WrJvbq052+M51JzOrDjIGOZg2jOOI5RmFuhdtFzihW57cCXZz9ZJSR2oitbbrlMtaqpnUcmb3h8qV0p1QpTNhy5av4+MSC/s/VYah4Ze7yaj3fgF8Tg3FodvcmNapZ9D6ciASHgYz/IHYpO8NYybOl9Uibj87QXz3SomJybvgh30kSDDJJtUdC/+Bg3B4kUPVEMrhW42/H6mu20MOuPSrsOzIL1BEU0luBnY0kPpnPopXzSRIjLp/z+Y+z+1KZZkFpCzCFhnZgSpV1ApjZcpucyQSgr0Z06f1swE5t06A1dG4VeFtQv+vbRL05HPFMSJcwyBpLAdC2QzA6f2D2nLGwTvSACHzzHxyMdWjTYsnnk2dzi1zjDrZEVQ9etFQ9yHqdgu6PhCvMXNiTk+EwnyzjR8WJxBmgnRDoZawrs0TEAHjPFmW9ErKCH4K53Cbl8FDR0LJE6m5gJ1lqEH7ZEQiTlHm0ka8EzGfvjRuq/B/c2YhHxdGezuLtYR92KW+p066A4eKTpYkskWxRKbaoc+3yUr7zBHhOyiBqDj9iNTHc6/MRk3UlXtIZHtPZhT/fvYKZmQlVOXjRBfmn5vkaU6Vv0S5XQjp9SlD754dFB1VqrVuaZnonPUuLZZxJlzfnk+mS/prh5xeMBLAMHVAUVTzezIdjfiIe8QbHk3qYM/z46Nq1nNa4SXXvc7HUuzUgPcEAwD0xaXi+dV8KTe4nxXzXmmd4fcRwajvWnnfnLo6mtdo+Lo3bkeGkvhW4Y7Z9eRO1wAsBfXRos6WgoGn1+u0iFfgrpkmLK/SpPVJgK3BixYnx37MCKoPrbSFTZvyFmHkiRl1cuy8aJEybQczwEqaUsVqCWW8xXHDP18b9Ydh/9/nuEp8nZd+De6Gr58UJve+nMOOmXmffXmCQL14s5avQ+qp1R9HJ8SyrrLhzeX3geh5znu6ldGwwBMwTJZi8DdnzA8xj9BdMJEJYFV8Ocx1tWSxYVdvUCQT+g4McGLtTP7rJnXlaq+vWrr3SdFzXF26v0hbXaSb+O+EqV+ozmSBxGrenmTUnaU4U7tyCvlIGCkVzAaGIAswU8pHlPFVRyPhnoRQMxRKrWZEq5FYYMhB1rH84Ryu9ALb1Nc+T8LRV2ZVFqiv3dTQOVVQhGHdO3FkMnlNGZup4e2xCqKKAb170C6VDT5mIGWA5ugvfgGtJ6yOBCGuBPEfauLwhXvh+tLywlitPtWuoU1f1oEKKWqSGwFrYj+K02QE3gRrLdq/algVTuXzntjhU4BeOb6j84taISHK/tOTE6UPnnTb7MjI39XK/URiJtI4+vHz/asQZE9IlPKXZ21Gb1hZZaj2/xTTu1VP58VFQM4NzXaDK3555dzVPYfX7A1en1xBmRPZYujNp3zKbvcVAmEoIwtPJy9hjMRE/vhe/jGehCOzE/DkKUXukl3sF831gi1HPqECxEJ5DwGrC/3tW8PemTueU0Gbme95yCnRvRKIQtOPXeTObKxtRnyFt+ykuonOxb1+vTtLH2CBJq9QUPGJ+erawoLmmWnUIMD3NOmWfP2sz3oORqPUANM48rrh9fS8I2WEOteulrT0yHoWKNhL0M3ZHapGHztIfZFAPg7Y1AApr3tKcdnFCy1j4Fw5+P5Z0Dc4YrV8gjmUtjyyrB/5F1cT1tSy4P5xcSyWBHJyaTsydWEEc6Ep6MVnOYMBjBwfnnhCc3IrYltjowMhJSeJ1t7CsRWyJTyeYHy1RaUOHklbJguJrExHjhIKV68gjV8erX/ezuD1F2YdT/MNP9pR+tKPi8fuckflQdiSZcjsLJKQDAPLAOqRBlvIS7DfIvlALPAofu30EStJmvUmBIDZVmZhIXAW9k8nusvyoKdzXwCzzKt+oT/qOU2mvXTNg7PHbJM9YkAanLR0bzqQr2cZrE1f5Y3BB553d7my8vP70HWrW+Bm3ejngSLDfomNKHYKWzCv4fL40ypz/sMoayR89C4k0sZ9b7q4PrY7Pr2hSD7E9ZMJy6ex8CJJffHKOA0XHEwSiJxWiP0h8PDPJwpjKJrwb0eV4NepLlXU+Z2CvhKQufSuRRWxrR3npkVQOZtUeSf26jVqPZHnhoN7jC7u9G5o5K+Axq7p6EiB21tNBg0tLW00H9LshC+bVwjrS86dZICw+JY/bb/Oq9ottuZdp3/KjBXxqAqDtQkmNy9BybVUvgweObcy9l3MapEB8J5lIG+3eCWILSGlk3RYwuHZW5ydtHCxMD7L+CVzwWzGvn+gZuMg3C662l3ZcgKPaz+o/OMibzpiOsbSoQounWn56JJnlAfPXXPQfTq77HeUxbJN8c0pO5slqksTfusmIzwQV/DqRsjimOlQPXbAfiXCntPBshHyUNVREo7gCIIH8Ke0k/dmSsX5dCpW6jpjIFMWbb++M6rcqMD8sS3asX5Jgoi3IlSp5idjLw5KENCwtB1i+iAGYECi7DxcqB5mQ670DyJ0rWNtLBlFDLwgphTJL8pHk+wHWth3nWTKOfP8qndCgHa3Hj9i6Ce21+36Ww5k54wQvZIs8ZyNfFdpgP23mSIF2uqBddFitzwIXNG46ZqReq2qUxhL1sLyZy2OeKF3VhvDTbU/tu2db164jH8NRce+9Mc/elsiOMEJopiXfdFfEXt3gS3+uTNV6TuFPtb79nfQRaVD12ZdDajZfoTPtQFkkpKTuAHiFJSQ5pvVIgYkXTC8Tf9TG7x7JF4rsBU78OKEZkvd2rQH78m2amIzCx5/tXyfjcdiXige07RsJXTswV3+bi9eLTcbpDpqfXoWwueCJV+YJZOPq4XKFMWLsOeyg0ILozLp8TAkspleB5MLmDuqhS/3cvR2zruyhKBo6AHxmYT+SvAj49KudLAgts0bnXq4AojGrJdr0XsbymrfUEkZbqOXSbQn9CwdB+v4ApOtA6Zw2+CZ3luSS05193lc5WNX/vZPrmYNqx7gz3EtnxWQweBZfZAeeuK0GYjbj5POKH8DAvZxjOdwoTIZ+0FOMJEeOwrqQpUKjxArkzaHfkqqYIK63DXyPwI3S2nF4DCPlARlgB0ixOdHZX29WDHUh5AwsSXpniDSIieOjx1GZp3bRR1hfKJ0OKsSmDjEy2l6P1VlPKCG1o3AeIjVFT+Wws2NVD5aykx1TG1jRd8z2RMcgMUJxjb1rgBJXn6n9c5m5yrMyw/+880gWSe1/rm4GeeW+Yq/OR7M6dwCete/zCkvL3au6rHJw9uy7uXi/bFRLA+birU+s5Q0zWkQKXabUvpU/T3r1cFOEGZ7Jv2p1eKl68/X1KV1OIc3vaK5BPJCcidZN/exj/zqB0XlOxslN3BedplI4C0VNhskXLbNf1pVeakMPBaPAXxw0B6VyIaJPAauEcy9kTGe//tC2tYBftheT2fp8OcYXv50C0fm4vS33J+kzYSNq1O4SG8RoBBF0H/Bl8hiaGrklY8oluhjoerQrC8J94Y/qM/cW0OOzxXdOVna8e1YXumIyw9dJMPcU1OVSlG4VX9md0aSBSxcAYVtvLUdzALhzISc1b6nrM6SgN4aXC4R/cvCzysEeNmvXdLZrlYPt53syiDDh86LKQXEwT6VNZ1qQeLygVzkYUHxb2PDR6rswXLwfPDoKkGM9jYFxJgkUF5jJmamur+xtJhcmmcTwHMF5ywXTIG97FC/zRh9CpVc7ZPuimsVV9dSLVMsfxJPQAOljgcP9LNF8gwyKUulDAnw3INXPfvu4XKm9Viu3nQWl3UfgQjS4RoNcpYSiuNFsZOQYDMCmy9flYgfsr36FSuXvJXM5OfSH1IbK+Zw1ZFDLvTrF2gXztDqeX5/Zthm+FEUuYJmlb0laFbwiO/Qv7zs7bKc+YlQ9KNJZbNYaF8YfU6aVJ4Cf0j8uZzT0MGwZ8wI90tX5q8fzBTpl+X0Xwg17V105XGjeru26ugJfr36/Y/nKz07ekO6MTNkxd5n7IpSJGuZ6L5bL4kmuSxFQevdQHHmDSi69E9n7Y1bwUhvPPRICOTIGGxiFgaxZuAMimNHlKFWHfmi6Hsz4dH7habI+OWpnllM3sWH0BhLwejowHa1fWRyZ5WAYSqYnEfF8mo4shyknyafIwDmWHPPA5ucWBGeM1tSEMJ3ufBNnpoyVPcDcmK5Qzezp9nI+3ab7u5kg+lGd27Nu9EbQXLlNQNhrt/xZKkBR0JXzUb2CmNC8pQy0Wbmx7Ghjluw/OJjRn9Kgv6U9H6xB5VrHuFljIOdvDmLrv9wNAePS65FB9dczT5jd80fnjuIrRCUfmGoY0u213Y1xRV+y1dP2LpVkH0eE4fTNt1G+XGk4DYR4ABZj5cciQHR9sqFl2VWW5cXjMb7ML5391iQPXfw43VLGpIDdWUPywo7DSggPSZVq/lUF3t3BcL5hIot26sK/gpYrBddiG8hBS8PB5+Jj3gzEek2l3O7PIj/z7+KMDvEl3wc121eOmdmw719Mr+iafVE/f6hV+4f1tkHssP2FwFkcxoncrNcaqMxTsbOOZcbwt1/3d80WQcuT4avZN3y21+T7c5WDl9L1nBWYye4HmikPb9oOrlq17O/tletcDd/9bDRgt5zCiiWOYfZDEL1Swhsj8PHTeEjSr/xIo647/blyRDGZIrDn9CtFgxwMUiEoCEDuP2YFL7XxP3skYd+eUdueoHPUDW733xArkCeSfjcMLpZH6clkFNpJ1L/EIU/Yl3wVlIZvA+PBCwexc3FzqzFJBRPHcSww3sdXVHlydyZNClloadzP+2ulnC/o29pjjPuEKT3NMepRpd+L57NG4H7isywP1uK6LzGjr1XKxKWCsayrQComDE6qi01dSc1bur+V7/z21PzJwZW2ignWkO3NDWD/+qA854HYCWsQlg+W6YTTHT+7G4SYtjkrAJ5l8AyTdIRUPah+GpWCkFxO3oSwSi9bxikDdu2RwB0h6GcuoaWpuBWaEoEe3C7xXn3hc5mpAH7RschzWW2HkYgdbr05UTAoYTvIjyaVb+ggO5aH5U6dX2GgKvIUEkOf8FF5kAMqlcnYcTcWVA4asUOLKW8EAcIU9sMy5CnYBC2KRz3ljRQ2SllpK1dpvHn4cW4tF5vAd0ObN630egapXhp3hCHYufcPOW4qHvNsnb4yDxWmcnap9kgSU+trlsDqFSfWFkaAZefgccus/uWK/HRVlActBzLkSpXji+XbPkdrelDmaUuvx7W4NgPtYzfda7lb7tVFB5ZvKzmuR8ax7xnbW4Ycwa3ty+kYgXp9YwMSBsY6uRVbL6249SFq1erX/z0zn7zUxl890jMH94nI87Njr9YjhSO67V+zgm9fQGkQkKdftueaHtR2cukPfHT/bebiafHMQViapStPy5gCnxuAN+P4HFgmLqWaCcxxps0MrJszVG62VlmJ1IDNtN/hzumEHc+BLZ09VMACE7cevAtAOW90xZcpAQs+DJztQK6pF9bHdrIQnDPakpq31LslT//21PzJQRaJZZ8MFlUPwr9aiJcrRoxxOT1VOVj3OrZrmGOvntpy/8oGjzNuWNuRkRk9+svnRsAsxBAyELjQ+4zl2jRJJSNEES3sjI4fsWao6VuLw3gMJQuiq+n8WN9Fhem89GZzUOhdTCudzZdnx0jpJITNZsXxJkt1fBfwoLwgrKuGtxg3QwX4TbmBvcr20Ua2o3eqehA0eYZRhOq+KeBTn9HaBBEKtu8o0zA6bmx/5UTYYIrhM1ZEen4jxLxtqQeKIHweCznmFdnlx9WbC7eT5ksYc4mAPIfOZswcqHIER1+hJ0pnqrZMD8sa3V4ftvDA9OO2xkFOZH7cSixnGbYq/nmdzLDM4fBqjgpsfV+7Atq7bVtEWj3rXHvdYq+m39G19X17G1UF77Adlcvbs7PQk1vE95FSp8RtESlPFDYkvgLIHzPzl9p47pFQaCeic+t2DF5HZnNlJ6JMj6yX8kbEMRvYS+2Z/3gwD9CDsV/oPutB9VxzE+uzSXD8Zp6RVA56wJWMmZnGdz+PYs4VxefAxExgpBjK9FdvOVLQF9/hoJjbcc6gR9udW+QqBogNoWk35oPt250DR1D27XkLiTwUJ4H8wmZC+lQ+qXlqCl7lU+EJWvo0bymD2nN/X6T/k4O2dYzVS6j2fLAF+BUmsTVnobVBw8gN/kMPpsHYNJAFVT0o6AK5jPppbCixsH6ULtQEAEZwPbhzg6rvhCLjtZCy7sRKAly+NFy+dsTg8uKboTgPXlB2WZXqgJIwbTkhVb3B2qwAUBSnAxnnoZv795CiaP28mfBJdqnYD7XRIVUlTxDMNyuB+SdIdLgrF/aNQgs72TQuAyj0pNu9d4TRN6k01iQJrB+jvvVsQVUPlsZHVuRX/oamB18x9VTreY7UP+owpU2MwzsTFu1eLczGWk08qzPG2V27O+P4w1vvbi4kMbrX7+vV+fvq0qGr9sdjhXEMrufdRR2IHdNUcnaTBZna+OfJ7t7zfdHjj+ysemXotQWO6/VaDjuD8EjTNPQBRQOy9KhfQrFw6P6un5A6yejYIHW+E739j5n5S21oPVL8V22oPZL62n4o+G4ayZ/M1M9ZC7juBknpDa5qvyj9bhiIrKQycZMrtBN/1oMh5afKQeF9AKw1UoVuPx/VD/bS6WUmt3elh6s9DCjkXjw1bc1T4yy5a8Z00OrhjAvXrs6U3TAmLJaalC9Jbp/zJBMzRJvOWN1A6e0GzVOTN5SjnInLoJq3FE0axyrzVA4i3D85+MfzQXFBG+bc3HjWvjlQtd+z5eQvDr7owZrKwUu1BzjNxCFVD/okNLoycdEtSwoldmyIqbw/xsf+wKrn9XkvigcGNie4lzUDj1gwJOOlmfIBxrxPJZBnLKLPSF60AtlmnHQf8oK2w2gjn59S8LRTGeslqltW7Iy1CS+0S2KFOTV63crNAVGXHvMVzUSRuVeKvcNMkcirx3WGzGOOzYyiMs/rCORHLRvX44qtm59nm2ixU9PrLZ3yGOyY/QJdGtfE4c/p/T7a5Ka929qw3L3NgnJdf3jitjarNDU/+Tgc8deVlKTQmjEEPnx6cK0oDOa6qtelVqEns7PIm8v3xyobVQ4+lHnuyjBm/ApHEzP2FjUl6SlQE+FErmM7hpmyBH873TH1B4Gn+WVex+puejnAnfSF0h5fduf1HzPzykttaD2S6VdtqD3SROWgQ+uRTkR3hZ4EzLVXYb02M5f6YeX1ty+Apgdf5qLPenA+mKkcfJ9ZXS4f542my1eQfGfYOKGApym9oQ0i+Uas+OypyWqeGtC/NJR31jZ3cGSkS+87vNtmK4jVdWTW+GUlH9Q86bgh+J1y+GpZaJ7KQGvavjb8f9yh0iIIsiworX1WOXhrmDEqB7vsvnDXypUqqh6c3Ol981YhNVZZeXKx/DT+i4N8fu4UsIhukaroTwMXnlk8oqd3fZWq+p6nERg+C5+ZA8bI/gLcgEqhXLIQrtdL0UKxbXY8RjFoiPrQMV2MXbeQRt8ApneWavsGFh4tSbR3KiE4O87pslXSar2NPHIcsXtBU52VU3gAK8VviYP3dkgsidYPlYrhQ87awykJm8SJm6Vx0o1iFR4rcI64Ufb5GsDD9s5r2N+rVle/jpTyN9OoIJTC+W5TtjN3YrfO1YUHCm53X8XKT9XKx8ulVRO8/PlDOdc9VJr0rztU37smSf0DZfEx2q9LV3ITr6octDkacXCf+3HW50Y/5Q69L/PkgubzyQ/z7nDBHqA0W0R+drsArp51m5u9ablJff/I6SM7jDBWhhQPSSy8Yd6NZSMBORcphJ0bifhLbWg90h/Pjn/VhtYjidGI1N32zWfpreVC5eBbK2BeRCPKwL4+H/q3F1KKZvppYTE4UPVg2qSedfq4PTn+ofgCqLB/dWT056LK46529/KEMSOJnmnF8Aicjs27qUDERLyLOaoUvF0xgtxGluUqEcB6cIg4mPqBbh2i9HC5uOs1oRg0LoIypgMdgaLayTT+xx0qBn02lFE9aFPloGnRUTkowkuatqxPVD3Y1DLY/+DgovkHB9lAUKe86MH9maoHJe/VT/U9L8THIADGsvEgABNMMhzYChlSa+VYqUTNdrN4aN1ZiA0L1M9dz5FD4UutvVfZBY4gVsQDdwIrj+2cZKvORuTi8Qwn/DO7XWFLpouL99sKQ5lcZ7aOiXf25GoUN8mVavgCxngwj4sNS1OcUBcpZ35iO9jd+uTPstao694XxDB/HJvwSdRIFrV8/l6dfBIeolhbWWd6M7xxc/bO3S0btHx+tsqhco8TOQ6nku1Dy70os3S9dVtnh9zHztIvM84tm8fc7LOlH+kqYXpbbY96VVqbix5J1wdJqU7E3qp6sH+jCHR95jhxLx8RdoK7PhdF+oazk2OTSPV8wjrxfis7nRkOPhRlHPk2LVV8tYL5UpuZgza7Thr5oaUYSC/Hv2cFgwH+4VePFJAH6061RwouhuH7d5OI+HqcnjMvHNRCqybV/iN9N00uOkfp8d5BaCcz/jKhBwnl8CgZgM+TY6KedBjnmEM96zfphgkljIC/D+emuM+4zFonXFvvCYPwpWHpiu9ZdVAuZ3IuaS8A6ZKQpxLApGzJrn9CjNgUTOvvcZ3f34gZ/3mHCk2CgsrBJ+9lXuXgj7ZFUTnocrnMlgX9nME+v37JntWu2q6Nrw6SvzkYTEDLx+egLdM8hqh6MJu8SI7rUMDhEolIdlQg+iFTDjsNRXjKsoL4gov3b99/7xF40LVrl2HaogxrIRCeIB5jlnT4HXniETKZlD5yORQKEHG6ubib4u1ddvVsVCO3pk8VXmAJGao5Hz8stHsy4U/ZUblgkuFG1aBbf2utNEhD/nAtmTNa7KRp04cZJ3nMNt1L00NdvnYbyY9mes1N2Ty0fHCj5V61ogKANBk4Mx/ulCK0CvqOenzxHBj+WjUm8as8W69Wfp66X7Eco9ff3VEx+aNR5eDA4ZxjUbJh7olsn+1exwz2J8esz/KV88v3HontE9LFW6PAHPrJTqvUYZg8e2vZeWR4kZi9J6Kw9aozGpGqeJxbCYOeofY2gRC6rz1PGQed/FOQbBzhAD34VRuH/kmtH4buVr4S81kIeXgTDKg9UnzRDRTkCY6dq4K3PwoEmTeh6FxYi7fHcUW7dd+eBODplx29qgcx6wwvLIa+LfrQB0SHsUiEc/vcNcv6UxewlU3pE5Ey+HgqtZkOOe9qFrsuaneRsVl8J7m54SX0mybeYN++yKyg2l6PozcO9dOCnCc5XaCAWEUCMwXC/3qXWNWIWyoHNW+pqge7V4ZZTTY+c1DLnm1XjSEtg33eVDn4Ww/Kxo/uKLTwRlQOziGVg6Zj/2p0EC1ItBtWHOljqgAVDh5MwBuJVOKEDSPxIuzDwslhgeg8chb2SkEM7DCxonMgjNVBPgWs+nWnFTaUx/jNvUKUMDGHuwWqtL8s/hx9iA501fLMzFCh6W1+KDOlb896cERA2+fZyuKcLIygrLSYxqQjh9GDPmK6TRcmdW26wTCCCEfmS7V1QceFta8jjvpe8hcmHIB0fbKDfhfuNgzGzP1E42C+rerB76eq/OdHDH9+VK/Sh3ybayk8Byn89fIz16pV3ct3enetYwGextLgzvRGmY3xXS7xdcmOHLNGvzViRuqv+7asm3Qfe7y4leeGeQOTnxUbby6/X9CoqcaYTcqjbo0ZmBZUL+crzs0rW9TOICDp3iYWtOQZa7Xx/evdJT1Nwc3v29HlZD0ymeKRxcRXmas9EvMHBydixC+/t/4A1NeUmf4DPdZu3afoxcyPdt0bK3lIm4HiOqUfBG/6/qxP9nqEfbO84PVeU1e/UoAdAlMBguGKfkNybTYKem8iD9QC27HtStRki79bThp0yuB63NChZSuwjvlBj0C5hCwJx2w5k4UA/v0uMdFD7SoHEYZT9eDtr4yFhcrB5+xZoCDfP2ewaxy87NPQ2bMeFJKhPdGbQFUOZmSVg0J6vNk3S+j0IPzTljFrc9MCDjg3hum/l7u1zORIzJG79lYRLN/lMLSPnjvEE1vThJW9eURnimcdZZpSZXeoszq1jJ0KRbmvSyDXtBdiYlFMqxwcVUsL5tIamtZX2ugoLKFKJVA6hE+ToxKOtCGgaKQuAEcWlNY9hx4r2lmEXM+Ze6UYKoRDPeMM/ylnkz0QKI7ty0qnlyt2gQjy/Uy67JXJan3nkOf7D3S71NL8g9Lz1RdZ4GviZY0xmC86S3LMXf20eMwEJBUT6WoijM1zhd0aPR4qBsvoZr7w8pPSdX3gaF31ULhWWXNvvkIRVhf3fOIU8luRNMZGdFhBo6vTFZ9MgLHxuiFvSm5q2SyGshHYVXtqXquNiZ+sLV8c+sxsPXHZVZk3wteVWTB+KvzBwb626CESPpmmtdAqkWskj7Ucquo0WjkZBOfrsUxiMlLPOudXgO7Hla3TlMV4mgEGstHe7XnhjTJclEqAklk1iPp0Zbutc4UKBb009u7tg8l4FjOVa53MFrwXACHc6tRyXGE6lC/0s397asb/epe4g02NKgc7tf1LVQ+SWsaCzOQtB7sWmanpvfrf2bOBkWQ4k571YLxSkNJR54nKQeURUjlIxOW49PAhaUFVdlO8URj693zZ0VaGBCOiz0yGdJSlqBTKpv3914tejSoHf5hwvxGESEOswxmyNV+aOpUHeBtizAIpw1nflGi57rZNtjbRNsrrTr9StnoaFVJgyGi36nS8opEFOgvnK1WSvhtkKy5BH/NOKouZtXB4q8t3bw041PKhhmg5b0YdszxLPe3DeJdTvvW6pUILe3i3JRuRVjUOcIAJeM7n76fn8+FZ+37uWDKqQOApcHqTVTvV2dqV68gh8sXA9S3F9R8q+QVLRVb4RRCePtAOJQO2r559Ez2R5umTYxvUVIu/9uGo3OqalSIrlnoMtJ/7hmYjhJ6r1y1lamHZziD+AWeL65ZJU9EWcmGOaP5ukHYsBwGNg2qPhCcktTbOZ0H705s0wEzD5LXzq/payK9y0FJ/HQBrTwFHfYxHT8TNyljl4OLvsy5svfvx5aeqNJWDz9vYcrju6IzyBUpKVwJngVXdE+CnRdiKF6w6J2WM1s2JT/cpc43TBdIRs2sFEfZ0e/aD3aCpXHk4ALzLyJ4hHNJN7VqWexExG8/s8l4eXMnCurn3X+8SQ0Luh8rBqv7sRNWDDZVxZ1rAyL0RYOYGBKV/Z88yV88Z7NpcVHkJnNTc7u6F7nknFxqhlik68MG3qrG7ukD3+7jFsGIOycud9blAVBSwuIkpBQJmn8qu0BIx7IJg4Ror6xH940nUm6NP+kglOne83TNmF8U5kclV8fYFo3KwRunVlvinch7VIhZnb6RKV7jPMaEF8W3V9J4Ja88HT3LGyfssLTRgaGyKS+iKyTONYDNyFeGSjya5S7RqR95NN1tia9W9TyOl8p1LoRN2RvX2jabeu1mvXmrSdzqZ6b1SZqy+/xyVVhsNuIuPRrF2lZoxjZJSY8PSQ+e68QSMBku3yS7mHI5GDTr4eOw1tAj/gl69HLKmw3q7slvn6I7I3qKA0C2ydb8x22YBPWfLm6r2tx6bBFKE6dN1SSBQ36S4FYwMp/g8rvVIw0CudqjdK1iLj4dh/8kPrUdKyfUfrkXtDw7Sr3wXC/Vcqzb+4OCrf551C7XnH4z9K8vBAfG16TPnFqjOP0/jyJNZkeuo62zbaoGePTWGoOapecrY64jbrbfDUtq7503sQA43UwAaTNyYTv8USByHXC4HsCc4wOkgDtnBrAf2Ev9+lzj7ZLCqHIRrnKoHNW8payrNH8w7TBtEsgJsnfOqHmyBEZWD+ucMdk7l4EvgZEWnchATXnZyRRe4jhRTIDDwS8Tjeujhy0ooKIausKhveZrFACgXjhZ8xJb/KoRxy+L4bBfBe168T5owm6V+xnDDEqk7zlEHR+XYsFaWoosoeNFZGceWlJF9oEIIY+9b5SKUvjna8i8pIXFvWz6KK1JxHpGSQ2TifU19kQdFqFwyCtygchEL5CgtQeVbDGGJ8mt7l+yauURvH0C7xljlm7wz6U1Txdl9LccpH546fKNxvWZzdUGErydcfBW/rLdLfJ3GczJ9pc0KplUu4ljUDa23T+2wQF99ZPc1wxb/+VVtLL3iLWGG6VcGCnXQvN+fstx09lAvDjtXefipWn0427Mm8+1KJGhiC+TrmTiKKTBHkt79JFoEIo7507YqfNNnf88K/qqNXz3Sy6zgDw4OkuMbySfVZwdXvzkYE6/7/vmi/8LBhnrWzcdR+k67S3zhBwgxcbwB3QF6IWb7eWMwd7+bSG1fo+apMWmemqjDu8juBkzrx5ax5+CgEK+fVkA7J+tLoieQFTIht5AjdI9Vux16IrV9bdll4GUjaqH4LfnvHFT1oJaxwKgc5Bnj7Kb9K3vWaw4tfmWwf/97N+VfHFT14F8cVPWg2/gRwCWV3WdpS/G7g+pkArpMMKjc+Nfro2LJ37SQYIp2ODYUtPXm85mC6nPCGIU6cl+7S5wA2QEVyB/CGPpESBBnE1JCblto4o3Jw7aBn+HtALezxjHUt/JQ1YM0WXQvVthXLGJAR/Hj+aDseLeEFyYQSu+IhH4WgbcOA7ABDBZNYQJlCH/HPLTMejL51DwqdTjFSXfNSO3W9XqrG1KPrw1dZ6bKfzMy4QxtZl687d5HLGId2L+us/XelXaHqnL4cd/SVGi96fZqMBt/rGhBAfOVeqP+oXUfkxhart3oQ6NWwd6pVsf3x68hbfZFHDqKPI0a8qgvhedLinC4uJ+xBrYWXcsGfMNrML0EXBsrrCOz/JXYptaG1iP9mhW8/2NWoOnBWfz4xPxRfS2hXL5NSuyr1JhppObsML+4Xrpp9Vxbqhy0F2QP3lDPunNVD9KzlA+92V0EBe/cWjsQlzWIa3+3moiy3jPWPDWlZ08Ny+ZD7A/QS2EDNO02H8QJqz3BJJ3IUyBLuihnmKrsbrYqQPKiYgsbCwXXw4XVogW2r3T0c/1/8dQQt+ZpjVc5uLucVlUOvmTPGlML+VcGu7aLhDOiT1cx+9/Zs785GIWU/XlOQueElE7jR76dvQxkbzQ2giU4tu0rUYEcsLHzmSZA42L9xDtEkJkTnpimsL7bdwyunqi5Zxg+xuekY2eIVFzsSqy+nzV4uMrrizqhy9WySrNa0VcVEslfRFQ9SOyechVQvs3ZH4U8cm95i5WmhHiSVkGfh2U/hS3HpjQEY4DX4evpYtbm0If/6DnQ54wyeVhqT2yez2ws/7M4KoiGnvY85Wc3q7RqJXZyX2Pb3StV7unH18eSp8ePMP7io4OpXfFKPWJYVMvc7GPnja4BzIaSlVmqncykNa4OHlJ3oPoPLPkdVTziZ3SPm7EdOjhhb8vguFfHszVHrFbLXoxswrj088uHHyukMSzHioHgQTwwHvxRG+O/ZwUvevBlVvCLg6ODeaf/vNGJ/s1Bl0wP/GedZUypqxy8UB4L/Mxemg/Vs05JVbBlRogq+4CLC1gG7MEWzxoBM2HLH+Q1T40jrHlq3qXNdb1+O+eCqr5dnVufLmzuNIxm4iSk91q31LrT9nq8nm9IpElCDaawEYJmwYzJH+p4hRX6v3hq+H9kDYmqHuToK8s5o2o/SUaiKgc162VE0DL3fnlLtZt7f3FwT9wnHLw/RwiojpSDk9W+A4Op/fi3dxgCw2WrgSzrzWwW90pkb97NIbPXCfpxDwvGh7nO8F2FGR2gyI3pvWMk4K29C0pcXpVGskSFc2ykk5tadpVqqSnclIjw2MGRy6I2F4WUWgkafDQTsHrWlZWwxI4QD6y+Da6ADEN5I8kGi6g91qKqliOrs6wKXuTwASz03oyybb8d6TK75W/5zyG6TjaEoyjcVpzNNm5ibr7eebt1pMZrepC+1GqDoyGn+mkkTxRzc8hGvs75QettYzmb0q9cpt2Opcrr9Oc1PHvGWAwqB/XzhfGwdddin9hpWAtFoa/NWvYsnL24z8jLaSBoWZp61qhgz0dNK35KF89cPAl/1IYUsbKvrZN9Ker4Tw4eTB4aviUzyX/g/+Cgy+L7fdYN/YWJykGt51f1IJEdPm6pJ380cxYkPJwOvN5dlgs90PZoAmTNU4Npnhrflvva9kjY3CLApPfdJmeKqgA29sQ40e+EdFLIiokYAcNqSwwPEMOmG7CZPIReDCRzWKVjpv6Lp6b0Z9bQ3xxsmsOaHgS1jAVG5z15ztwLFjxiJm/g0pDtJYP9WQ9mTn2J4DwB7RjuJ4FxOHLo0uexdLhYLxP6QYQMbTJml1MkKfkNQXASWBD7efL02+mWMsw2J5+hpTxygL6qFjBCzmZXaOGxQ0g62QopfPab0CBMzPX295UG0aOba2u/5qKzerVcRGWHXbsnw07jWQjAbFQSr6v9yzvbPTEz4K3vxXKLsOBcaRPuEJNIFys7Zz0B5vdd+e6ItNIo0Kiirh03qvbU+u+3DND+VrcAEt03CYviZeO+Na3RYO+SNhinN214ws0uv7qOkgu+Xr29oWLSvdFcm/ftC24ufGjftdQDNVS/KfqE9qtRl9fjN2fSK7zB6QpqPQfg85GiHIySsL5ZtcYQNJ3zuYmNXXdwfCFmAv9RG3/0SO3/fxxM/+LgoqrqQXoa9+s/fgTjUkYGzxBhUUNFpuNFglkD1Nc8NflnTw1XNQCxBOgpFt5nWQ5075FgwEQ/OvWDjO4xEwUCURxOfY3aw0vMdTHLmgCEtOUfc5jlr72l/+qpoUHurm4UOv/g4K/AyXuVg8uMw8U/Z+7RO3TGrLuO2d1Pf3BQzsCPD7tRSuWgel5FBpJu2d9JFFDS1wsnnU/+fD43nRVJ4nxr8b1fbEuzjWN+jCCCkA3IU0TPzh32q2ZWmNLRY7BWHOkZVBxI9pi4i/pYhsgYBCLyhs6Hk3QlIs2LP0fnISws4i5MJgn0ErGj4zzytX5SYH3ZsteV11d2MNRebHMr2TH3M6ZlKnfqedMTV8S+yc1Ss7rm3Xo9JduUzXU/5Llbrledl7gus8/ed96T01rfQt/owfpLbRRuj187G7U+ND95OxxWr0iZn/Oj2rAk3C9XmPZE21idkPg21uqQfeX+0zuoBRhYfueW5U2WAmNqke2+M5q3TdcWAUsPq+3OinkfmsKDs9BOgf06mc9C/of/3iP9PRf9v3Lw6RcHd2W15x/r1wuLzDE1TG5lRPWLqOeTD6LFQmQ9xv2c5qlxhDRPjeUepHPGg4O8ifbF97ZzBGB39Q7sG/3NvQ19BII2yqCXsDo2ljh0evduPhvngEjSCIVDP5/3tf03T430+y7xbw6+ZM+qerAVL+jZ5zn/H9mzwNzwewHBlrabkpL3J1ZVoUHT/GXL556ckAVfDjYnoMu8wDLFN5tzQsFEuC2MSF2lVv5Gvg0zXL84BsQKAL9DBo906VtCdzQUaWp+dVWpUMeVkbCgcGoY6mxOzbtIs7SAbiiZb6wUelMcwq7ezmML0pT7DhGjA33HD2VMpB71Jq0lZz6ZHfqCX8f1EmebUU/6wPfTV1b0iUsQb46MOQZNldstoMAwIn/VfS2pcoEXHEGOkTxPHZKuX6fmBx1QrNXOXcgTfYC1DT2xTlLN+lX3lZST+2zjYVJnkMtmh1yoh7mq6ENzXn99S1crF/VsiqVHfU4cWvCvIlhs8y1LduRLfcs3hWbTUjg6V6I+RXP5eWbr88EUj9SGf9RGywW3h37jc1bnn7OC/ysH++HgtXrWfR/5I+pZl883k2T2FE1E5vF0mjXAk1tzGWsA5fSZWhtlaOnSPDXrjm3G4wka9znDyU5Sp9KtkICt1bm/Mt0JG5cbdlFfIYECu55HJhQCD7Ie+17OUIoYrKYoA9qz/8VTQ1dNZ0z7n5l7zK/s2dOmOfCovMz5B8yjuSA+Z0hG/thFkhzX4pWsksJyF5kEo3Lw3KZUSo5yIGUuiUFbeFRXqHZ0GQJyTXM1NSMp3zneyU9WCuQUJ4H7t3PrPGsiThzdobQCrteioKdOurzHCFYeldpaxoJ/CV/aOqSpdr9jEBq4VJhtfEIEyhoakS7NN9FzADb3JtmYUZmc+kuxvvLj9UrUsHryujRDiq1vlxhv2ipzbK/XMeli7cPHz0K3iPLiV54ZmE+bOTNdPTza25OntXr15IEB9cdMT+2nRnRhwsLkVxFm64T/kqdCykcLuqzPtr7s7zqEer1yfUOFxWtOEeVKimfn4EXnXa9ZK8nzhxrb7V7F8KeqSfd2zxPLDaO5i1zdQl16klGKmfnD0cn65KyXCdbG/6gN56XNF8TGcbP+/4mDgYgwUs862V3B1bNu8j4Rzfa94/jyUSmcL3V9zrBsHubgaLbgWWqeGuLZU3O7NFv2ApvpEjzbjm2DewflQuhs12/OzUJJQzoIrFIYUOxQukAth6Quw3ZlUPBsGfJQykxbFbT2Xzw12h2q+32VeX9yUKdlDb0EL5+nLMmzTEqV0oXk74yF37tIOJ0Sv/04LixStvIPVzQxWZ0n8GI4yRHV8EdMV3/C22TNYvJXs9vDSYnMnexsfldwPD7fyCNi+YN+RI5ZEdeFRMfwFZt9Si6jn4w1ivYqlPpbtr9V9MhCmBRt922yBCgw6BuSSoEnPyAnoUFe803sIqY8QhXC8dzN5eEFXddjQNqer7edPTRcQYuVyLh4QH72oTgLahc1k8VrpVurjcHjXZdDqk8Llx+Ls+oVp9TnRkCrjcumOTZk+yj3UQertZHHqzx+eez2TFluWf1wBNdqeQmoH/jlWrm0uM7hYhsoiQt4UuXNV90u2WjeJk82e1NtdO/QdjRjxc4s2cYzeRIe7ZSc4eAjbYaCi+XbdGI5/WdtoG9Scaz5nNX5/8TBeXfbVx36t4i+ysFD44+LfmxeWuhKaSVZHrSMJYYzOYOFQjkZ1zw1u5uap+ZNEGRQQ9y9UJ4iOuvB2Q64V9ebwGAtoDswVHTp+LqbxAnj410J8C8Ba1IHA2sbm8o0joERy1dIu2I0o8Ymsdz1Cqbef9WDz88HGTZvVzmIdOjfmXtjlYN6LUNylvAbfy8g+GBSOQiNkxWCzwiEvAGsSenssOhHQRLn9L28OFisPHjcuUWZL91sSqWSeZ4Di8Oyss+WPyjvw0xexsn3PAU2r2AG5ctbq7p3feMeSh6fkJXMWaVA6rLtaC2yXG1YXE6JNAjv8eVIWaFjc5xUO5lDwZQTbbARMlOGTsuR6CCBjs9nZZ2xGFIsRoCxDDO2UVbloNrGL8lGSYd8gMstxhLm2FaPZgZi/bqzwbcIPzf/CGm7SEatqo27Op6bWjUDW/uBylXiiGwPdgW6P2D5/OP5vBNaVBvwkh6kTjtmM1t3JvUqrbC6buWU4SvqD5YUOEOanLFlFqzJMVSnrOZBBdkCx5Ow//rHV3A8CvjkT9qz44MIMcxHsEGmUnjjW80oj5Gsdr9upNaGEvPDb9TaUF9DJmqPNE1vY3Kqgg3ToX/l4OTAc7Cinn+TuFnt+fOmod8RlZJhP52Gdm4OyhINxkxPkMMKOGa1iim98VMkvQHbwWXWGzWmRcsC2sslASi7YsOJ8aND0W0ZxMAjnCxUTK7v2wt+jEFWozfnCLYxMVjw2qOYNlJ+2VuKj3PLCvdfMxZe5qL033rQ+HfmHud1CvrnDMl/cDBcT5GBS5QoDGOVk0lQjx36cDhS3jr98Mbhp4um9VvSaLgqxaZ8pX0ghAjzyFK1MmXKd1FainNnnxQJCLs5OnTKlJC7scqC4AAflVC7KFXGpUvki3tYbPtlhwANkcvySO35X+1t8csiGJDXPyHjygdBzHkAD6zE0oZ8Nl+e84+Z+2Cka/uYZcs49fPL63e9Mgm3vh3lnvoH6n+QRFk8mm4fJj+L6FSoto443oC8buVaAnO1ZvCYUYnmbc+Ze/WsX+L6+EiiUOJzy1Fnyr0rnvINb/KyyOjQc5dkker1wNWNITa/rgBVgVOEqn9607vzM3VOFj5PjN3eNZLI1Rp27+I74l+UpvZ1aezP6oRAZTH1h7Rnx2BTZd4sv46MknGD7AvAkz84OIqF1dqIZIbPC48g+l2eaIwe05//nYOB7utAfPGUKqBqz/9dcVcqi+SSOo8tTE+FWZ/VS9/fKcdpFNqdrqIIFsl5rMGtWg1y6iLlHUtM9Ab1W/F9HABihN+CTjfix/dxyOfX8sxJ/WkNBrk92Jgj8ljZkrbJQcS7RXagmV3lYLGF3R5t/au3dI2+e95QpmXP/taDL95S6eeVQQJPM3EtQxKcY89ZyivaTq7jOIYPvXhlFleyXz7+zHuTsCG1GnrkzD0fG+kNu+UxdJorCE8l3L20laFF7jI5JsXE5Y7htYC1C4t1Z0opf/ANy+PikipCig77uEQFgY1+Ckhl+mSINKK05dEDVSr6Pp7ZnJd0h44KKA9JXeEpd25JxjFlVpg4TIg08xD5cCBntqi/FLTcrN05uvWqrWNGFpzBpJ4bMPFRZOtcPfapyhbpK3OTrvNrty7L40LTejcDvv9gRGTZaFjUD7oXrVxpVh+VJx+LRqH9atau8vq7Y/NizBkh5vitj+EsylP9gFzWhuTi2vJO7oAkt3gbrTLmb12aDzRvvn4+puv+UiPmKMHyJppasJ6UqLTVHumNdocqunWtPTt+7U/kJvFtr/VjIjtM+F3vk4E/OBg1qbWBz1LPC4+qyzWwMQlb7z7/OwcLhxmCEaOORlPVg88cfFSKF4bJ/TRun9GJLZo3lQkCiu1l9fMJniO3SiveQXzzOq9zU1nrU9Roi59/XWzQOdDqOAlCB4XIiocK6XNkEATaFldqnNOXsgjkw35apwmVgys7spbZL619euEg9m8ZC21M/ehe9CBdN2BaxoLKwRdvqZY9+7xBMh4x/YODhosfo5jDL+rX23TmWDcObGWqPimEWR7XM2hzWPWj8yo1OmnnGsByZb1+kDWYFMJ2odbGplIBBbHci9CVb87z6CDGl1yrUmVZvMwO6/XSh4zhLSOOcXH9rOIfnJGDZIOUsGV0udo3eEBvztA8zJtCZr1DmebBtcyxwacrgCbbVyhfMrBAaGwalTVvKb1Souscmv401sJ1uVZ1PL89tVnb9dFT89zB8qwTmP1S9PJ9zs22wRkzf/uk0Oqn0Zk14G9rc3e71psw2jdIloWmsVSjIYphDtXDfBmSVA5KzFC56cl8k8+H9LvosF4b2z6zPP2to9jDbbYdzpjs0/WM06z2z6/C9ra8hv/RI/ngb8/7jv93Doq/7xL/qx4cJfF7IRNgxwdOVQ/m1LMuaFs+hjfmwYKuasyKcyNY+ewF9TkDe0eBXmzTSXrC1viJzKf1nqXuIe7GklkPRXnsQSGzJcaTKJv268NBJ+RtZ7Pr2v73rEuZxJum5eOuykEMQ3Jtr7YOmHvm4H94S585KPJ8/PJZD6oc/Ctr6A9PzV/e0n9w0DvX5qJJZ6maJKWz/Ip+GMtcBHHwUYeptVHZ2t89ehSZounbdcV48LHCTVlKCvKh5c3IGiDFCiWc4ATUcHAKVyHt397NrSJZzt2bgbL8kjVUHsAu8RV82topgXwbEnhVD5YXWBl4u7eAVtAOcbCfHxqy3xFnwaMEULxE/Oxd4yUdh8/un4od83G3x6v/wbXvahtfqvHn2szcwfVK4R5LUxPWqXa5HXBebWzNeSZ13MkZJCbvOHB1ZZ7XBe648codkw1XmVE7KxvQxsM8uaSnyinPTtXDXFCYysOx29qscRP64sHY4q5ouzAfiXW2NX3oZMOVJxMb1JOpagFpghEEfmX7yan1MvtjVqD1SJnRwf+Bg//r88FEYxDyP7xLZlFVD3bUsw6W0cXO2EXbaKNcu9EJbQYl03nQ9Xp7flLx6XdBR6nKQOW9hF1HIZNdwkRuJIN2y14WLeX7Aac+GDdFfVsJ3SlqFDgic+lGjdqj1RhVMC5UDiYdz2s9vZelZw7+p7dU4+CSMa7wC0O58eCdFlgwpkWU/+GpmfztLf2Tg1NXWuMgdqpycOmNp0cJZDX5DdrIEcHopTVUpC29JhMBVLk0Gz3kTqEGjkOcrUxKuUvboBiYvN8ynIzxcJ9e/Trq5z4Mh6QHAJBifabDjrsUJc/jWUiPWFERnkcHwN3OmKKEQX4LdRR6dqnSISG4CG0h31kkZhumcsGzcB7i7IRCUo2bo9dbXVCojVeMHJm9VQtpwo3mnMg62C+CUOhMw3e8wTi4k1CRmf38tH8kj/kifnPLiLMrQ4+bVwCR2xc+tMylSXU0FO71oUXHYZ7UquObk/eT53sylwj49OItFRmO8OdvundSuzyrikdYoa1gFbYcCfw8fc1hUnk3Gnw3iISyM9886Unle61fPdIfy5H/Nw42xgHz8l3IXl3+ux4kRrhjMfFttd+ovxRZPetqu3JF8VWC04Rt+pD6vNsF7ST8aHQX9KcdTP8Y9IO7T+lyw+jeKYB6acfgcD+t2jcYFCBtxq8rbshngDfCptwKYYcXFBgcJUxrNtCbrLT1nFvlYOKbbUq0AG1H8zMH/8NbqnGQ+32XONvQR76fLD9Jvz014vK3p+YPDvoqGS1z78IAnE4f7TNOX9IzQUOdLJLJNrnsti2sTkCbAhdZk1jK/m6WnQOs8wgCs8KQwzP3ckF500dAn1Lu4dVswfouNBgC+fGbYW4pv61gav0gD+yJLeRBIc957qlSyBUUCO6k9TF8X7ZWZQOin8EYXnboBnICAS+Nl7LFj1ara59KHPmNizFzrofRYv2hsyJ26qO68JxRho7gJ33k9tj8acD1qcWxtTzmr0F77f9j7D3b2kbbrm3JvRNCx2AnkIQOoU8mJLjibiSr2pZkFdsy7r3Jkv76K0MmIddk3uf+Oh9m24aRz/1oa61Kr1ekpPZVI6c2SoCkXGk1EnZcbdD92c1fXlN9AMjl75Ao5s7EhnFL4swdhdudno+b03LJfwTXeYe5brEIxd3F/RUbT1cH5w5c1JvhhUYtOTEs5MZpcHklPvJZfoVCxv3mv6/vtbrp/83B56t74+myMt8d/2EuWvUhpV7urdBNxrV+MKO9deE9oz8YVKLr6RKYOWB/aGoSwGF9YX2JiZij6ZDD3cDepnUbM+y8LDBx3Tq6mHFGptvO4WZWN/U9uP12AjexedDNmQCnnkaBeA2YeT0aB2EzQe4g03yLkJ45+C9t6ZyDzzdUL7fEldhZRjRRcuVx+Ze29Jem5jUHC5OEZUmJSua2/6GkJsNqMWXu2X3RLEr112VSqZ5jTq1Gur9Zf+cUSjmT66xQm1wwvaHEzNj1eOPT1BAY9TOF6ru8LPYcTtRC0J/uD1fU3kteW7evq0ub8To/o4vldOEw2cZNVULPJNMFq7qQoXCvVzE5sIbs9y6UYyih/VJ8DqiZX6bv0My4Pmw9TW85iVXfcQ1xVro4+jK/Bs+U1px1sb0nVY3r82NoVnw33BECoRG/vahxkD6uWmIT1rVnXm92S+X+wQ1XxNLlmV/g2PRkTILNmwfnrAysX5Q4qndttXJi8exgxT4lGwP26IoXy5dCCpXajjI/dd7VYS8SH3tby3P/DWOjH/NR/zEr+L9xUOsH/zwXTTwNw6vn1qt8RusHd7W3DjpO9iPc49gobk9Pahnhh6bG284gFOM3bOD2wVYFcGz5AmkGG8SDNqdpM69z6fAtwPiUNkPxAvHwEFo4KKAGmXfEdBZG7zfg0bO0xsEINz/iNSM/NTWvtaWv8ruvOWB8zj5rSxdgyUC1L4m8/pe2dPBTU/Oagz899zbYyigllz7GJz3LamypwpiXt97f9aaFJ/m9A/RxVpVkH2ZJmQn497GDaS3fGglWatSFz4azrEScrhlOZmSdGXpvnAnErpfp4rTDNMNewL5ahye+SXi/PaJY86wwCQDA9TeJrohxOHozJMhFPZUPJ4kmsgERTusAm+ae/CsEJgAWzhrTQO90ryOhsch8uxVova6B+UdaP4hK5GX2yj9kuRL9iePK6lWD22R1K1feWZLlyAetH4yVz42W8lgYibw0/dxcUGultnV2WwrBjV3HU7E4vtl3u4ZFxsaeQnyZxVJcfTrieZNWW6EnI25oEKeOUppDdK50BlLf/L477mnfhpyU6GJqP3OIDnKz2DwflkDO/IDGQdNH2xXAKHGbcz81o7Rvo1BMjikFc2gcTP+f5qJt7a078Z9GBnHcLMPEmLXs51k9HgLTZQNs9GGBlFYxufSToENG9BvwhvkqjS6vsUGj6RwzOR5P0wuboB/B77+5sAJt9lwzxuD7jM2xCZkyqbQZTH/ZAuc3VOZ/aUufPRZ+5Xf/o6kpGRT5Wu/UOEi3hVceC780Na85+NNzLzjT+pR3xsH3STDEkCuLJpQ8g2pZGhVyssK6ovsKMtHLIQyUtH5wCI9LfecHs8A8DQf5ZaKUm+05C7NqD2l28pAdysUdYocInA4yZgvDcKSSvzvijzpSB62mcfiJxXBCxXB+IRCtg1azBzXClZr2SwllvmNRqKSHPmwqVLCue9i57ljEc6N/PDFo9bMfMrMfs3zZMBzcDMo899nBFUX98ZlFpwjt4HDf2S0J863Hg0EtmsPTz8p7vjFwqBObaZ7f3WgU7fJ50rvCDgwz8duRWMztivVerSy0uYGwi55IzShRrqAy121dNls9vHi58uGkYdCj8P2+IdP9n7sCjXmWyH58wrS9/cw4oS7cXN3jk6SCahwszF5u1RAlzTLH2rfRiY1zxXUlo3GQ+2d3/P+/H9Rpbx3oaAdmoOwNGb0WK1fUBxZwXSZOO32PeT3iz+rj7c2VtaLJnc+sTw2D1CqTMG7o15RBepayy+iKXvEt65P5AOBpUhvegwIhrGGmkEcHTB/mMYhlvX1h79/a0rnHwq/87p+amln5KqU3aBwUtH7wp6am+EtT85qDvzz3wkGzEsVw6VHvLeTqW4ncSuwmEg3X8+s7QqFZ/Y4Q5hl597i9x6tijr5OI5XSO7qt1KhZvp0wOwNmT6pPM9galDNa9M7RMCft3B2uTN0INbizNChFn3d4Eg3tFS0lifwVlkLlMqaXhv68pWfDwOK2xyZHq+YSduzkUc7qSBA+keAExn0rm8X6UBUnzg7HW2xsEyiWL47erzfAcKb4bXfC927bNWN2WhZcUx4dnigNdCJUvk7ZeW6pbJHLn63gugxKZTFwyhb1N0KLFjhDvzg2HtVupGFRGM591UjysjUUi8WzC88MLbO63PYXvta667bKai44eEy7936/K+DUmB89NgCftO8lK+mOmfHjaqSXZAuyxsHJFrAo+izEEDvOyqm+o+2fkc8ZRhoHB/+3OxntrUvgs7gKnqUDG7fGVGls8EMNrxNniGifBtzBJQPs9jOPFdC+vRbiP1G9zTAYjLsLOmozn1xBOj4gml5zrRaipinuR2dF2nkgM7oH41xbyuskrBQnGchA/Utb+j8eC784+EtTI/3U1AAs/uqW+CcHX3nu8Qoa8VYRzkZnq8mvDBhuOtt+PltLn3xazcL5YOfQDmyWXepU1DioMsXwPkz42tlZtmaSqGD+dEEi6Ye4Z/dkhjYehksusQ3hwCoSNGzCTaXrxN0rNBM2JQ507kxnP5WfMHbwzew+S4cj8O5RADLuhYSuUGjk5GLZNTwYW3mVG+8npmnHTg3x88V3Ie+mgtaLfe+X+rAPCupI4YzMTCnMxbPzX7d6JBqVp+v6wMPpnF89VivPFvqH1wZAujGmxhPWURbGxsPGR6FRZKzqla7M1olevahnL4/e77NijyieQtOi4DK02THANTvr2IXtgGaH01ION/T84G93BQOtRprNr+5948jshYPxfTSfm0VX9P1UJHHsG+SnWj9ouB7Mb7YXnzmYArV+EP8/3cm0tZpfRscFKZXWX1vMXB2UMgOECEC2VAc2RNCVRFlNWxA1GjjPmDf0oK2Y1zk2xDyYrhi9wIMc2YwDEd3b5agLJSlofeOTI9xBwQAO6zJe3A5HGoYA3Dctpv+QU/OKg2H0FQe1flCo8EZ58/Snpmb2/vUt8S8Osun9wOk8LTdeXVdyE+vbqYupGW4Wx1+ytFosL7q8Ag2hHDki2ZzMi64OJmQmvlnka58r4F6lUJl0nFfHpszE3J/PzAnj7mPBFPbQ6nxmDiYTLOjESxvrSL7FFNp+A2E39g/t0Ud4EMBgXXGNULJBtPtAjroUcyV1WS6fxpVRAzmRJyEpTi/rLdGuOJzf1wGlz4ZWYyqECdbv07EfxVGpDdYuy2SxTtSeeB3+4VjeHxTZSP/wKjkuuugRK/WKAtcqalXBfC7KTmCbxFo+1Bo5u/B50bvRHEqieLKncfCIa/VUgme1f/0u9XmCRGdFyYnVs5JdsAKlwv5p/yoe//2+DkfbmGOhs8lmJkn5mYNdbxzXOKh/6Qft5MU6EZRfOFhQXzioddoPlf+5Jf4PDua1mt9SmBDHgJQGTqsWS7mEhnZP7ehm3uTS58zIkt+1WUo6NwSPd8keFSwzjzfhNngzCAak5bjtMPNFGj2EjJEVF7jZdIFvJ3FQ2sh4fHgeEuLV55waJyP8IadG42ChseVAmqblzDfryTzytTjWONiwFOb6mu0j8y9NDftLU/Oag/+kI0VV7X22++XN2UN6naVmBEKEUTz/UJTIley1vyuJ1AgokUr3BnJQ/Rxs8b7r9roYFUhnCsAezYYEKlfqxc3bPqDEuzOF6R6aH0mujtODgtuJI6M6Qmgz9GzsKftNaT4VQAfdVd6VJapdJfLXwMe3iNGQF8X4hdVokx/L5uuLSEDyGqblSnhWNMfkS+VcalJ0VWt4Rd5y91SnZ9z5Xwdgg4KL4uliV+jddqvMcpETtE4Ugw4msnVaHJMzrSo4qCsa/i6/zj+kuR/jZ04cfxZawpg1tEtj/qw291V7/sGSJHveQmdsduXjsg0kWsX26TXItd86Xf9zVzD3ZsnIviOkE1XJFw4++McaBydaPzhLpQn5ES2MvQNr0S8XJugLBztaP9j/v92Lcu/9CUJK7Jv1NwmvqH84ujKGoXszYEqA0DS37rXH0eha1Pkgwzb3AxBDqO52CA+XBdzg2IJ02czAl4GCEbcv8gDyGavzWIYN034iE9FDtv0gpbdTLzk1jj9pasBXc9GfmpoNK8qVdYGDEijFi1bpqWgc92aG/YVXt8Q/OfgzHSk9Cx0HwBKX1JWaPjANO8TUE2l0fy2AYs3Z6xWZyunBe1OrxFQNNxaZnC3M3o7DMgBqHz9NQ1kXltO1zJJ3QH2v2bI14mTFoDXpdaaztK9x8ESvUh5PHyb5oR5fW6cYMfaI6MKYckdw+jb6LXm93CiHM6WTy2Kph5ZaBlFkhWBFvKx+VNCuWHxYnIrd3vVztrt15XhdQ5uYjV9zufQV21IVll2YKoXtzvkYUlmqdVYugN3ruk8tj1ZuPRuoxA3t+7ddib/s1dixVsbzte5583rUKgv8eH6597Lkqpg/zq7YsiGRP70KySzqoBs1gBb4kLQ9AFXtJ/z6rqC/7TozvFafvfZ/xgBc6wft0xRBnGkc1L6NtWcOJmwbnzS0/F/uRYcpH3S5PslLXtxV2oYnvEnAf2hqxiH0IRNaSNnSVlTxhrYPXV7EDB6u6S0b10GHR0bMLn8pmFmCGJc74ncbsjmQukAcoSGGh6YHdvQRAhcyGLDwbS5H+pOm5vzVXPSnpsYw6qhGeFrcdl43EGHup/A015b+SVMz+ZmOxKYPfPmnSWxMo06Tl8ZXfY1chbtbHOuH2VxcXAEklYKmrSxdLtNyc+og3rKwAeo/Hkx0CG7uQAzH6pbuXJBBXEd33qikethn6lGJzjJF6mRpJ9Tt9YnATZ+SJYjG/UbCvvf1BKMiVSZgrItms4D1+o2eHpe6t7m/tyiey2N7ggFqXdfBolY/X3pmSY7T2w+vtFLr0lBrSUZgKmwnd1vXo2qRDbHXhWGpejnSCG0+Op15KoIxqJx9CE2K70RV3A5PBU7gLpXraZMSi2PnQOTV+Q1VUZzfUDWpVql4clsuc3twS1Dhlhnh2UvKNEXROizdSrRjsBPs636/K8igOynwZVaATp45OPd/1jiYUTzxtJzw26+v79lhUtE4OMn/0C4hnUem/h+amv/hYJrophcisncA8QGrLGyTovBDU6Nh4mzHhQUjRvQgZd04N70NejySSdK543bUxOAGq3wdcwQ6b1wpnd/wZmlnMh8RbdxaXvLaNqMmfxL1Oteyz36M/3lD9aMf/KmpmXOQVeDI7PdbYofAgtl5fne+/ysVAmL9lvwY0wltQx+QA2p5shwrv8OrUIbePMVy6laDCFNTqt5+JO/n6RtqMddfnjKKcpHhfG305Gh8SPSGeTp2TdcGRxkuu4nIhUGivgLai9k+wtDpvCxJoDMm5EyGL4fLoPazamsPtOHR1BXyab5HNWrO+9bHdUQ0lGdXuhDCfgayRV1g50x+13v2KLsKDYuf6UF52zH3KBMulLVJHQCE6W2QFa0fug2gOLsyT/r1gX/MvVmZ746FOpvtikKB5d5bULnBS6UxNOVJ9aih9Ipz3cSGxVouFvVfOXDhkrcYRoIwK07JxfxXCSTqonhT6vLkvQpWxL7zo3u15w0okcBqRO5ujxu955l5WuMg8KgxL1PdsDOyz5joxfxzr85PXY2DfUd21n/cD/ZSK7/moq84qPWD6GDbtfJfHPzwvANaWVDSRGLfSk34KHWi1c8/NDXo1AK8zRd00MbjSuDaktPFrZu52M6W2w2kVnGdHT1PDYR+VLduXMCl4AMyLWTXp6WCnnzOa2P0fvMPbamGidl/3lD96Ad/05aWMSvosSgdXnf98VlTYx3rSo8ugE+b7CfEq1SI50Sn1QXTdT7QTcDO86A5f57r+fpky4D4wU+VBTr1xBRMVwyINW3CiM9KyMXHFVguUMC5yWxZABotMAGWu1BfOsgcCiAx666YJNANn1EqQSF7K8sHMjFr99+6sD5sG71FgoAHNoQNoP2EyjJqOP3JFm4qx0QWsCOXX90nLOggivEzqSRAUpWJTTjaJYiu6MlYBstlv7HI8/RdqylwGui3vEhZEfXXlyKYOSlnHPOcmrmZ0uCmYp2KeemA5Xydq3pzWtbvffbKSlEYaC9SV2Avez1xnG01OX/5vPURy4u98vi2ZIQ5VIIrAGs9dK82xZ4OP96bZjg0xKbYRvH5hgq4rfiQ+cy8pnHwu+Kf+bRv48jol/PjxHxm7tI4iM85iFWSJuYQS7Cv9oO/OKj1gwfJALr7nxyMs6O4X397C9qlR2J64HZ4+Hn9/KKpmTmcq4moyaPPZ7FxGrgpuDyoCT/+Kqx5kbA5kK6DC9clnzO66QMzRBihrUEnxuU2ltWXvDaLkcAvb09tocgTcG3/k6bmdT/4m7bUYJneGOnOzDi3K5xraoSZ/Ch7TmMRdwXv/0qFSPpCty8eC6tt7CE/fdwM27AlMkcD4aRTe/iw42qLNhN3b75946gwy735OmLpu9Bg7rHAKDWvo50hqIpnkPjCOSmn1g8ypZE+LTmhCTnO7a6kyNayCtdbHkQ3q1LHvZ0EbvTggTMDZKa9JEY/QBfRv06wcuGpsOZsjB7utXcj1uixwpg8atyMo0NusHxZ7oCjS3XIiXrwo9vWLQql2fGtsVY8Z/1jqSeWhAfffmMh/FRqW4XroU+tOmM9Xswdn8n77VK2I59BXa6EwSNBMsCsqVb+bMkpWskujJ1cXWi9pVsAXrxcfK/9YFN4NbZHV3Joq5UdtXhzpF/f9YG+fKYLsCftYORp1z94mu+O7RoHewn/4qH2bTz7nCQfQi9enSw+z4c9SkTqHU+80o7b9NfXfWacsqOvOFhQH1fwHR/wXxyE+3odPnk0PY6SjEk0oboiBoIDmxJBPMsjGnhrIFxo6CGTMV4DXg7YcGa8qulgc3XTo/NA8Jbzur6xkh4HzWTGp/MTVsfSU9aUPv/wktc215YmTWYgkjTDVPPPOTWvOPibtrR4Y1krzW+JZ7Dcfubgq1viV6kQL6k9803NI1JgCV0/FVp4T+JQh7A4j92oERKz728IZka0UDXKMg9ttbBSu35wmFSyv7eVyUc/Unioh+FR5cCBSTnp+ICa6NOZ9rRKg8X1KPCmZyvWuoje9C4nwzMQV9uYtIvv7/BxgsmtfRWyWUMXnkfMP+DVsp79SGfnhpO3g265/lnqCzrz7ZHdNBKMCfnMqYjsO0efGwNjIR+uf0Y/Si1Qq5E+mCSupcvXi2b5PDXW10upKfdmQ/trLKo1g8qx7EBmXcmDSRNFKrUjhTW2blpNf0VEv24uKyBUYxZueJExC6owFQw5fGrcLnytQWWhHAZqXYg77+UGYf9W6O/7fj+llL89747xRnu+GEjPd8f5SCeGB8ovXp1IN+r3HRgHy0rUifUdOmb8uF9oJ9nC7HEakbd+9oNYLxn//idt6ZyD3RTWqiZp/JTIByQgdiCknU9a/VxAwKPMx3GKJU0bK0t6dGPb+VjadmyGXDoGlJK6NavHG8zYMqyVWe3HjBsZ61Qf9+ln6JrWrRRg33NeG2TI6jVa5bM6P9NHZPz/cUv8m7aUNaQO53ltAnZp3X7h4Imo9YNSUOtTnivzlwmVFGfXJqlJ/p1/wKk6+rH/PQtn6eCdPe83GEjBN2LAbT6I7dAukRazVeWaBMW6xkEub3JcfxzTnYxkD2gfv0uft88idapXKCoZBjJNiNnoyWoOq3DmOb/70+bOlx4JFodbmDSA7IALHozmgaG5e9sCk9PQkb4hyEaLEFpiAP72dU1fA1Jy+XSjVDRflhvtWE+kgzz3GTxTLagqVFCRKzj261a/XHaFPJtKmS3r1k5Yun/LtkZymU2LY/Ls6XYcVTlg+Uzs+PoXrW6l2r8/99imsDAIbH/hMe7CrEIDgwPVOPittSA0ykK1f1MK4awNyIoMe3H4fsKKPaai17Ez3/5kGljh2ml0XiN9rfjkxgg99mvfBqDVSNRka747tmj94Prc//l86B9HlKSEvdoPav3gBPmnHzReJTK9//RYCA72EpHMPAN0GsVPzm77a0VDhNpEnDoY9j0x6z7kATSZlwAjF7CWcHcaA8yVN6trHjQEhfhli7UkJIIGdwgEHqP6aCGvz0wYOHX2ktdGGmDzaCtvC/sqxOXen3NqfnHwN23pDJyV9fj953luqXH0zEF+23lS2Uinp0n5V3531I+fX53lBgGfcuf2ybNFPUUHUKVAUqoTx9Esraoz5yQMowhZpyvIt8XxSSMPgi9T4pVhDQ5mdYgqpEG7ewUqhAbx/fEQtiGrjM68oYv95YWf+A62c9HLtg4nUD3ay+jGTwisfgi3oyBWOvM1sqpDsAFhyGI9XGl18WJ/SdcYtu/ZmZ/lDO3ShDxr3mxbx2JJPRI55/A6Q0240fblxobWLZHMzYUhVr7swY0xk5KF2vCmkRErRSYkXA0Utm6TtCIwfnQqv9OgOage35Ilfj5ElbJ4M79OfFPwMDsE8MHeE8urd6z2PUPftNaDG/Xy1TUnJ7IrSNOAIXlXStRqmXe5BNuOsl/mNZL2Gyz146trJu3bkLUa6SgVCO2k4ojWD5IzNHIuLafrk6SlML/Z7nlzuJSA7VdXYGbyTz+47cx3Mfy/PBagXePpaTuGx2a6t2bBZNp8Mi4TLUOQgOHR2YMTIxi3IezTr576AE8ZTNsVcQhMtrbRjH4T0huA0uTR6VPz+jf2N+4UkzOavpCAd7DwkteW2VeTcRy0WwETRt39Iafmdw7+pi19Km/7ZfGVpmYGE+1SkLENEmroVX53evZIz/dWiPyo9YNv4+/iWJWiAkdxOB89yaM1RCuTPRoH0XL2/LRB6bfqmFp9uUQ99p+F7FEADV7qoHoLpzrDEWq3LBw5hg60tv8RqcjHBdxXzdQ73XD+cGLfaPUzleU0ZvaOF9qQB51SiVP7kKz3WTuQrcEXQgqfCq1my1d2sNexZjlbla7IULH1uVUrifH900+Taqmtm+zDSYH/nG2XH1LjkqlVPLeej1pDVR7vTTi+tf9Uy+HK+V+zrcZwxJcTG8WSaVuuGbEyP28eL1Hd1Ariot+ZqZOAnlOycBVNrmyg3WKRsevrol5Xb/bidb6NSuQt/9UfRevS01ncNxsvxvuDuHr+9XlmDpW/bxCIujW/oXIW1HT64dT35rEdG+fEdd+D7Dc+yVF1noPwvaf1gxPd24fp7xw0Vn3Bxn95LPRi2Leu3xkcP2JhwQC2LwmQ5XXZNcLs7Tgc9FPhh6YmZQ8dwU5PSHvE4Obm5obL5Lbbc4k64PRyGwavPgUP436DrF8c6ytZ8EFZmmMC97twjxQkjNncne3k8c+3xD85+Ju2dGIJTfh/8tqeOfj5VhfQCuZoMF16ld/Npei0xkG9FGfsk+RDchl1TvnA/ePK+5hUYAJ/XZE17jPjUCYMaCj6mgjtomusxsGLbD4rA0RKQqnb5JHBqSfoWdBsprX/KVQ3MZvOmL64VyCilexMalmnwrBwNpQIUJ9ZV/5awMDiYPsgtIlYgDQx9fuwVit0h54MWhRdnhvHNdAPFKtv45dJs71eFqvFtUuNQ9vFVk8oav2gymHWQ8WqoKLfWuOM0nXLSotldG/ZraCcODp5JxYfTsvWFM8ZF0pj49HofJufsWUaqPW62F1zilSL4L5bdpKNEn5yQxqQi54qTXqtJlsjzezHLbpCTiNfChDXfGdplfsJ0HB6Ogw71Y4jy/bTpvkNVaOdng56W4NF7dtAtBqJVlPzGyorKW157s0BuTCIr5tnMem94nsozPNhy6nV3zh46k8g/f/0WIh8U9wMM9V6q8MYNKttgWsl/cOaV9lfI8H16irq/6GpQSZJl5xB1owbdi7o1aWxAAjEOIuF57fC+0LKDMWCKQNT0AMcApITSpd5mue1Re0hHeo5i+Gm1DJrw55zS91W5Y8cPN8GKw1w+YtogApaP/j0nFv6Or/b2N/kHx9+z+9+fp/jcTlhexP9G1iK5ibEjqOpxyxhqO5TyTpJpz5nHN5KXh1NnUFMwFbJFk0b9pcnyigLlra3M0YT9M3xFgq2klCzpddzphJToKbzOxkGR0cQg0wdVx9McEHrj3Z2vYSyAlCz5ggxInn82xAf2YdJePo10OzC91xLImuXxuVNGxrODM4Bnn7QaUXWhM2OeYkEezfSdFKmYvoSZ+xdz3ylInN26X7Hi0KhoqGtVvzcBiTFmFVL2+BRzRLuCkbj7LbQZKt4Teb1s/uPqgcWDU+l4z2yzO628o0tB8TlMeQOe5+eZ+5O9wrYS96EHbr4erDSGop88c0KU3DZlfTD3JtFq59XGe3bKLajaX0/6UB+m5n/sztO9oPl5AOpYhGzssHgw5TFcx534G1vn9Fejm9/XYOv7kX/6LGA9/wM0onCvlPzd+EJgAUxbsQrBjBIm0xyQT9+/KGpkWPLZhh0P8VWh6CyHc8o0hKO6OxH12mr7yTo8nke9MFsAEyzlo2lGWUgD9DnvLakiQBB86kCBtB5RvM8t9SQ4v7IQRyoiHr825E8qGj9YFXjoNZK+/8nv/vBLPy4oXrJ7wb+7r+8zznpcZ93hdY9BPlQpWxdLI1Pk2jw6zqUdayRmL9Qte5tbqJVvsS8v2FzKjFFQO+MVmVd5sS2E2eNTmSwaIdnyXdQZzrJ2yzAR4d/ljcd71EVYofG0So1K7TDjUPJUJwaIb0fhrOgVa8hHZ3e2s/eNyuNgXnpL5NA3/NCKEnCMFtr3rMLUqOUHapXhTJf24112Sx7vS9PKsV2RD6FmiXe2moK/tYL2qxfpAaochPYNGVnb7s1MD47Xx1v1UvZAZsg6yK7SLHZZa1zc8UEK/VlgA0zFf8KUTdJAKfQ1dLuypob9RG1vt7eGKVNjZZhJGRZ8VFdGL3cMU60+hnvePuZuS/x39f3zOT3mfk/u+NIN4Yz8xuqmZ+xdWN+ct/8/e+57niqf4uP0vvcq3vRP3os2LX3b5q4WVCj4UzJKpU4w7g1NR3hoIfy0gbTNfNDUxO3LX1URSa+uRX17rg9G5RnNe9xILx5xX3gQ00LIZ1aWDRKGQwZVkhT5GBlop/ntRk9GZ9ufumEev2FujH7cK9xsPFnDtaKCVIrISjtr5FtCBoHWQw8e5XfvVMJWOd5bf/klj7nd0tBnJgkMbqUpPp7BdeIYMo7ZAirLuDdTYw+/XvtvdOUocYpfdZf+pztlcdzR01f86Yy9yWmDKGPWL0ZNNqGMQg8Sh+oVX2miny35ENTRw6Vw7Npu9AXdqFDRSbAMGeh6BlsbcpYtYJ63g0e0UZwYwnzT2B7yt+qAg9EW8oaWm6t4Q1Tg9sSy1vethrAmP381e5tACmh/MaqFNnLcp1dljizPM8tfeXPT39voWJZtH7d8lqic4XRsQjOOegvl5mF1oA84v+uDnN1neqodo35780pWeujGyubVrQxeNi4IbOtCyGGTg0prOkdmtiP67RoQJVbCTZYjoJSdD5HOj1Vo86spD9mR+nVed7x/84KXmbmPutzdoPJj+SVxLpZibrwyfxOJuWaa0vrn7BE5p+56J89FuJEKTmmZDSyNtpYnvFG6+RW52MEFLATJuJ6dfzlh6YmI5upIOHUbTqN5bw7vmbMO62blW1SKKZA/WrKRESXE/ufcCMkko/LY1IHdOZ5bZAxuAnhw43H+QzUa/RjJtrRfPbn/7fHQsOQEVUDWLneAiv/eCxcvMrvLupV9DQdMP6TW/rCwZUFJWkJHiQi9eHbBalSqCx7d09a+Vygs+VSh4w1DKG+MKQ9Bdg5gvP1PDA/p0wJSCapvfyRs+Udkz1jTgQ3P/HGjFYB48GsB1ZCsoN7W4Yn0Ci0n5tRTq15r5TGjg8fNDTzg9zlIogql0ZaHoF01iiRUOsyzMZUonTpb5rgVe1hpGrznEeU50vFg2uOnp0LqjBhDe3xvB+89iscl986FQ3O4SszJY4d2q+uudj0xhgbT7KjsjAmT+qW9VExO5x+6Q/rTVRCaoWKZU91UZWeDtvZM9aaVkOO94eJZmercaEsJFuUHxnsmXBBdZEtIFc8X/T2U2hjHL4xz71Zuv6HxCw536eY5rvjf80KfnDw+c78LBmPzHPxZJR4zsWbJOXEJ+3vPPP0X+km/uix8Kh9u7niOvSgBldWn0Cc/5w8OOV0cBiPxmd5/SHxQ1NTSlEMuL7GbnoFWHW7VzHXEoHqqZONG+BBDhtdmYg5aM85PAMG3JZCwJu24TmvLYvjZihotINBBDhaOlaSTF33cPYnTY1osA6u9dCsQdBM6afXEPEqv1vqlFOM/ujHDdWPTc3qKAGHzoyDUyWKxpFVYpTJn5FQbuSByIYXtjs305hvqoTQtkDOTwUkTrTeek7RJ/M4v/xGzj7sqAWT3wSTHJE5oTbSbDeAlixtSiaPIcf8MsRh+kj4577ER7QxckrhpKhxsBPPUYDJEzXAhuqHHCi1nKxtljWBsbP3UT9axJe/di3EpaHFjrMwx/n5i9ZHOlcyzn2ofOPGZ6laHJn3T9ff9YvPwr2uIFz2alrDOylRtHLTWODqJYfGwYRcxj4M6329cKnVSCzlyFWOjdlaZxdvZv14I6cb8ZdWYGr1oZUahAtd+K6J+qHqrnHfbSVbRb0e4HOBWyjfUFO6DfWHN8s4KUc+JCZ15TnvWF34bVbwg4Mvd+ZAoRdzMuV1e0DxGRN97a9xYvx+OveheqWb+KPXkOILoNLW512zP6gTdNcHLDD+xtu1ns2UWQ8D6brrh6Ym4Qhw6Fsmsb3t3XAJa17H+vZKxknwmHN1guk8YHBTWotiPEMBqmwx+8dwZjjPa5u3S3bEJGu9ki9fJ/yJllcihD9paoCH6mWqP3fi1Ti4UiyZj7iWIUb80JYeveSWZg1SOrf1alPzKEfX3eMotiD7dV6SjIwD+TO/IdB1w/T6MpxTfAt4dLNE3lk23jthvhDYvCH9xAUZ4+XCLDgL5w9lo/ZtQAyWxXOhoMGmPEADNHW0vNSjqcKtXY7OHLnoJDIzT+iA9zpDmCo50MTbp3SHsXYnxDSHbOzuLxGysb2ElU3YBeDHPaM5B5k77CDeogRYaxDwOvouw4v64udFr3euzyt+uxRLglOuMuu//PnlHxdlnP+ogRjm/hugV0anbHbpiBX7Vxyqhut8MTvK7uWvatQTDy4binyZ1JqaTLU45yD0xJe0/0BjDLvLAvCA7BWaNeNh/coUj49zzXUf2/Eb82rMRh4/e5Q95x3/eWaOZbGZxsGeP0NJW2EF8CPIJHpjl2Muc9ePT9rPHgur2luXyPzZa8i/caDV/PO3jn90dEvbzvNmJpupmq0esxkuZpDkD03NYR90hKlg2m01XgVXN3VIUO/S1THwUvZbIC+J4+nwgh7BtbdlIfYXABug0TyvDTUu6miT8EgYgoUGQS0mbWhBfPbn/3duKQu+3MlorbSkGKj6zRaV4TUOigbf4OoltzSju0nof7qAzjmYdM7z2tZ62osE5qZRSzBkotZIiaAqb7zvJn6ENHbeLijTsjVsb/laZD03yt5jXyg2D4xm9io8LFhidozKwRtGmw8mg4l1JBnOfMu6kEC3wyhKx8npSvCTT4mg2oeCQ8OMce49+5cBmpSl3PKegzCehUk+zKBGBMV3oLUYTj1mqotBzAR485gAV3eT+yutcgimvrjq9APQUIVpI/uATbu7vc9ja/GVP79azkIXG3tOldOND68LYfmGxdSJ0T8rbnUvmx9rUMVgDH1lmkjTJrDlotnx4b3MlQ0FeBcZEs1LP8vXsiiXzxLf1IPEPPm8jwxgvk6gRIZSti6tVp/c6MctZjk636fgj/O84/+YmS+Zr/PzG6rtg6TVd/jYL1STuFFBJ3p1nteWkl/pB/+oqSE6jytaza+9dfEH7wwmipxFl+d+aGoyxilMpQyBMBiXfY4EAWyIOveR5Uy35jWZTWbM6Hy6CAKRaShjUe5d4Txlhr4UjNsH1DyvDRyvR82LCyYPFcd1y0sZ05Qw25OFmn7x4PUt8U8ObkPXzcwyUzZaS5dzTBB0rqy3n+/Lg75gJH7klj64pB83VD9uiRlxzu55imswULh6M1aatB7MLR/pMPIsSecDnnpWNgku/uoR84Vg32IAy8bWcliNKFn3XMZCITnFHnedqLIXInmRxElO+31ARBQPOfABZIeB6Qe4A03IY3zrI0erOdp2SBuDJxlnt0LVI50EsGj/4lMyQhlbymSbqIGAzHAJtJ7tdI1IjVn4izRAd3wr9GgSjQ1/6KK1EK6Uer7EXwOj0HD6q6LOfHjwaTIqMiZ5H/bJz9OesYEV+C31RraLNVBiJ84JVrcQJEs/QHd/r+1w5XkI9QpS4+5prqc2Gp1BqLHr000VsiX6F+F6169rojRStYYO3GhIqlac+2krqHGAq6UeUBWdLMhulh095x3/0tS85uB06yGhYs75nQx+EMh72lGc4dcVZvasLVXLr/SDf9TUjLC3mFbzW7r+gJHHLo3rVqVRBK5/aGo8ExLYzhb0wJp7JV0xuxPuLXea/ri65rFvxJeUAVM02rdvN/Sb4KJuGKH1Uyi/Ll3DBNknQfXJDPj0FJayZ8DZ0pb6VwAx23ybCJRv/dLUvObgT03N56R+vfHLY6FUNWblomnCiRi1NwtYdOqrTY3k9dxbfRbT4OH9G8oPAAyujz7k9YFBARpd+7phlHGf5rMgqsOjVKWwYjnYiboRagzpSYN8ROHUEyIXfen6mV8rTvzEuLaWyToX9ETUjNY+3R3t+PQIhXy2NNCOE7RPIzn9mNnInkCEt56foTqzZHRQGJ3S+njTx807Pz6bDT2Zrh/D4QV4asjXjbTf0DKTdMWge3Q8ZRuW1VqdnlXuDr1HTUotiQloHnhUbDCYKpobE9aVPJugU6E0RlW247ityxauaF1c27SSRK3wxd6kGHvdAiR5Q07r/tD8ldQk68Ot+S2xcI6BRG2wt7lsV0i+lNu9NdKZO74mTvlhN8D444+nv3THaaYhx+C5pmZH+2eYpDvOTR9XI90kE1EeQwXVm4BYjXmDXFZ9rakx/nMvGgvrZ75xopuSpH84+D86erfhOv/wkn1m6d4aAU4y+H2oZ4ozBD8jgXBi0eg1PzKFfsLO6xP8oUNfDG+j6UxET21yxuVS6XEh6n6zYCJiJigXRHGWcS4N5nltunRfon9oSxHDYiRnEoKoIRhsEMM/aWrO/q0tfcktvd1OzkRA+MgafJ1b68AjR1d/bWpS1uRZKhfhA6iBDaqHqIOSsuGqSccoQt0Ww5CCOa21eH44nxl4F5pRzK76CB9AtvLr4g1y6Naa9KrJQId01Hc4BZWY5T23zMBdW3h9ATJB3wwgUuzKhWZo5ui4yrAhqUT+io/p2PsqwmyMdUvfFGZssOPR3QjCUQZKzjoQReOgvYklWJ9W7Cz6saxgI+2CDtq5PVtWfM+3xEKZtbXU7FgwsONxd+/pdts6K5diZ89Vbt3JiuL2jccKSdxQ+2uQI/YyWxOmQgpu+sou/kONFg3R5E3JB3OEn3/Sm82H7n22bMjju04n0broQXWvRLU665m71om/SYWRhB6Tkv2bV7rjxiC+Pr+h0ss/tKViajW+jyYCSoxZGj9ravJ5KU67bb/PRf+5FzW3N9nMOBWc7PyHjl7ZGhOTl+wz95WG3AYIZ0ZI5EVTY9yA7In9v5PmTSkRTLO67SXTW2l7srmx7tGnGeMWyHLxlTUpoE9icVeIoiF8Zc/hnuTmeW3GcRyy+V+0pSYqrvMM44Quu/RkmiJ/0tRc/FtbOrnSTdk6DvR5Hf7+WP6rzxvl4ZE7Yvq1qWH1B758YhQn6LAtSGfwNYUuVAz6pbX3LBXGK6toisjee2hy3ZzROAjb+dUkVqWEh8WxWIidVJGarDqvFkSG8ZugY2u2ZthrNLutENGUPZmTpXdxx6idLVr6VAM6RLhNljk73HwXFVnSfHfJGCPvERwq0uB4IWYGHcZB0gBXhHUop9j1BLhJTHetZ/Zmtg7mFgBTr3lukIoT1j/m/ZCO/9BqlrLl8XVpWJz7b/BZ5vjMst8vGjr82Yf5vaigimNYLZn908/NE2X+P6V/00EaaoFiaT1+kXx/xo3UfHUNJco5J9/Kjnje/BirE4p1pJbzVd9lriGoC6yVromWxJebQab9yn+jlHJC7ed9yj/aUuKh643Hpwn/2s3VffxHdkNB3nr4bS76Q1vKPM/MYzbone2/dPSAVfRbnrPPiobRacOqVktoaO/Ejm7mzFdfsoZte8QF6VJOn7jtjMdzugw69OrSNq+bwACmpLPFz6+lJbPfIFsXdQpkBYalEOibFjak9wyUXfihLQ2QaCqQAexrW+p+5unf2tI5B39qav6HgwKXWJmxpqNJ1RjrFJMLm9KvTU2slIobupZZIWyN6lZwrf2n0utYQY8Q6Lwy16djuZUlY5DXQcw6geeaPiPq9CHZlRvPHj8SycrdZ5qZpZFO2IuT6ezIZM1cbVnpui68DJmbDoCVujnp4q/D3d6YMkeubQrPWQGoHmkpWoktnKMH0ybVkspmuhzMYy1Lhuq/9RhtflTOz0vLKHqRpRreHknkYtBlA+frpZQ8ue2wXOuuXu8/CJ/3v2zXAUB5CWY9mjWyAsfRSKuENT+oDb4rjKExS/Yu61axUp1nNDejeK2YNtfptKGh9PwtfgwNyG3+uR8c+oFa1wnfKXyhVtrdXJFBot5vb94Wshn7w9yb5Zf/RgzPFTfs9bln9Q9t6c6v3bHGwRQz39FHlK38YvH3W+IXDr7MzM29mHTwy3PvNw4Wznz5yEv2GdgX9fazW2N4nlPzGAc9zey6Xx/FTPYHJ865bcXMQqzg0AmheIY/TBsdW9UEWeQeaWjVtwk9RsAoY3eaJhmDbzbPa0Oe89petKXz3FI4ehaADIt51iz8UVv6S1PzOwc5Y0BSDUezz9vJcRFg07N05NemZjZgujEV3Q1LE0O+54mElQns031inCN/hjSiOhrU0RZhiaACxNa7uxSSnwCehRDKWVtDMQLqx3Sf3mO+atwyW3MASIZYG8xXigHdlu2veEbu6Lex3gC2DSU6EOoWFFJydT+oyJOvHFyMc4WYHUYMHOu4/vJ3dtQiK7GNZMZ4FsibxCSscNvETtQ1UIxU1eukG7z/vKXMs93vt9eR8oTVvd/nxOI1OwPYMvMgTTpo+/PWtMiWsjtCZ9q51n67rA493ZCHFX6Qe/9F6EHfshZ80DNAzeoQbC1gUJWv+v8ClQz3eX7sEb8/fH/FPPFc4T3kyzQtI1jjINPksspl9Lbpl5FX/huU9m0c2eY19Q9tqfprd/zMQTWWtk+TjsL7P+8Hn2fmKhY5l3557v3GwXFSof65yy1uwyXBFMMvrblg3jBl/eg6nlvQPyZN29OtML9udweBjWt47NmIm1yeBGJYECdpOn2UXwibgu5lOg++/Z5xbCr5H3ltOLjwQ1vqKKD/r/zuX5qa3zlotHIXeqhdwVP9ucfCye39wq9NzdglY06dHHSrF8TbJlNABb8rqEPw47dMIQCAS6YFigZAdPmrdz4XJTUOQiTYhCxO1xQxeJTIPigjzvdj5gmPgm/Gd3w5q3LfSaySX/STZiwJKdq/DK59CnPZcX50WCbn7sFdhWfu37g/cbRUkK4+UcYZhDdTBd7cDqfN4HwgGSV02AqcNcbuWmC2Mrh/u6Y0841S4PiWF/lzY6qjsOFOUZp+ayDZLs/wlUuSHNdwrF8aBXaOrfJMYHXq/geSZdEW2ZAM2mO+Tn9r4lFWNyL6nwZMHVvNs/oZc/+3e48rO4jqCQSVzdswZ64VWh3usX6hWEYYmqt697SOljx4TATlVz5UB0krpHGwUfupLU3HpWSwcBiP/MPB+Q0Vo3Hwj/vB55n5hh3vpP/Le3aloD4uPGefyRZFLm6d1QQj4CDt2HYeulh573Tn/UZPOmn1XRuBzYJjk0Ka7vhazrTGmKyJa73DPfC4lkwPxsOFb9MRnjXJRxYg9JzXljD5wR/a0jRsDs3zux9IlM78R373a03Naw7yN6kvhidAUrmEsc0mad3w1aam7AvmVQwwZnLkAoTXgNzKje6IkLp5enMnU6gTNNGi8Jw8S2ShFBicb0tFhMiF7Aa0W+ayx7jpg0MdotpDBj2xiy20NxbZtjrmFzGdD/Xj+iyKyvBAe/mVbGXZ+24Se8o+TQ7sMjTSzaq9eCOlh/u9PRoaBRCy69fTPEBbemlsYLbtqXcJmCQK7xGIbhFqpiUBKJsfNS6tB+wTkJ2qH56KXJ2Qn0o646F5vFAd9DrCfdbN9naHFTY85XpIkdtFdYNWFxG3Fom6MaVnW0K2snN7uNq0osWi3tSg2q46Ooo1enOJK0p/3Zr784v2WheE7+3NXA3Y9a69axYzBv77uuOVD1W6vju/oYo68R/aUqIX9ftODd9fbqj0bzPz7IZeMh35837weWZ+ZPfJk397zz5zEJ/F0mtKmnAdBMEBq6MO3HKSQX9oahaAJELrPUb/SuYgkJMZ0ya+keED7tVYIW2wb39L9bcqMSe+7cLhRASBkPw6xFF6cjzPayvoHeboD21pTv/gM6X1f2d1froWO/tjfvf/5rX9w0EWDByIVumpbAyoM8P+2jGReKWpGSBKlP57Zyc7ClEB29ecT3bkut1wLiQXAgpCOWhblTRV7TQYLlgcLqxgXt57t+pCSVNh19nkeWe9t5kwORYypelS9oMKlRmqdJ0N9eoEzD0NKm/Xl+39fGvMrR0JPL3SfQniaYrJe3XNBOlToegXowZ6xEk9sfOcGpnSt/TwijFQM1yG8zwWIrhgoIGCpr6q4GLtsiiQscsGIk3Z8zDvQdChUF5GpgMRLslO97TTMglpdHZOgGOulP3EFZzCdxXEq8zKh813VrjBzFaAXo266wqZaVb7ufideu6qpfWDvtFNKZThUKlQGbSdH9x3uUrWRuzukU/CRa/BlSAyGJq88qES5pqajlYjjX9oS+d+X2o0vPbjhkp6Su4zB8RAP/3zfvB5Zn6SinPNf3vPPnNwklDt57egXX30bR/CECegcJ7wSI8vOTWmR9wEPWTxrVkKjDXsmyEwfSkDa95NwAiZM8DCNRd05uUgGPBEkJQz4HQ38htxlZ7ntTnUbQK3Tg/sId0zB/WZJdjm0MHmhWzStIj//ezH+Ft+98n2jMJbOvz+Nw5uOw9qSOxZW3oei+hHv21qFPKzO0L6rQAaCuq7BVI0gcS+Ahda7uhC0Evha1OeCsqWpfG3HKMac8tvRkjuvpvPi74GTZpEK7dZLBi6/Tg28MKddwQnmvGLxVN1mKsb2LXbAsJdPhbqzTalTjYyJ+jGo82aRINOADLTmUJnOMjfOWwfOrCMgktrOGVexDsqhprrgT7p5P6uVnFBJ9mrpjJ6pzprRf3tqVtrHsv6Xuqck3pXjyAgFHF5rsKe7azUOpm88ikuh0c7sU5JjO+cyYNqsZcgd/Z4sUn0SL7mh7QaCfvWeh/gxREydRYwwe5COX0b//b1yylH9zCtH8xUuLMsZ1inGmZO4S+mhkEDbNDZczEVye+kAUSK0x8XvibYXsI2zzsG95M5pJTEk2PUsdTbTGvMQwav5qLP/aCU9Pk+u4nEdAsv9LBxSeNgRqv5B3J0/Mt7Ngqju7bBlhJ10gN9lpEe6cfRY7YjmoIyjyaNfZvynFNDAW8vMk4UDSC48jfAlvR2dMnpocDh6qbO4dnIepz6OrKyNkuZTXhELyVWF0YEYz48+TBOzWizfG82h0GDORVJmv0h3Ouz56DYGm5C819B39xrKPP0OwcJHpMGvFdqFH/nYFG0vu08a0vNA2kUx19vah5njyFPby1qS8b8ChlEjZl89z1MmCeYPSodEtIQLZwbMszDVgsFKDwf6Sdy97G//Tym/cAvRFKhbiAHOsjB6/YjnHyES0vOOpC5lZA2o1Am44xz8l+CCghV1gmo0V0FOigAg7u255m5mbuz5suCa2Yfh8AWiHrADOVUAxkz9XBToPiWDcs/MXb73qYHrZIccXxD0a1deChui52isJE+m96UJp3+sPmOUoaVW0VideLJd+Bu0Ge22AQk8cIi1xJaaL2tG/O7VuO0GdVahD2snlWdbNOCl1Dr6bKtm60CX4wCkLvnW45oQ3voBjzE/L3lgxsUdlUmKfTe4uRKlYXP81lBwM7frU+I9tuHQRvDETXNPBz43wQ7sfF8d5yZvXgsUGevvIZezUWJyVbCWfIFuYHGwZlW86vP/vw/PffMsxj2refHE3IqDBdTpvQpkTcXgdiJaITy3+3D/EtODc0yJnl3QYf6FnWrHcJRgkBdBrZf5LWnCs+jNnfdWniqRG1E3DI9CPj1OLmCwiUK9g1+5LXpAdtaQWNeIIlEHjB7wab1g6D58cv3rA7O1uLk7xzEwKOJFUXK2yu/cXDdEppwz9pSKT4NPnh+29REVxbGQSx6h7qoAn3mON3NChSN7NvztW0gH9Mnci2E94WQrGvkh7V+0Eg3dQWtTi8VKssf3t9lKwxluLUAUclRF5xRWUzjXuWy/qnukodIaJ+dkO1r0MVl2YPTdZcsZGX8/Y0vgp2YVUYMIWSEEuzRt1rNrx8nvpR0kPIW0zqq0ud9r7E+SI3L386aovlWrAu1UpnmVO5dAS/X5LCsfMh0Ssyu9JRTp1t/fTD4CvU+azEppGlLaoRbovGhNC6glestqCiAWaDULZPfVQipFnZXVt45ydYg8P6G92PfzD2mb+4h7BZ51/oYzv/gIM697/EiE7g/sq9SMCkTp85UOb3f6aaYUicdisy282dPPrkxfr4lnu9TrKHJlmdv7lktJdaXxonXXkO/5qJKypE49gPzW+I1wxWg1fzw3J//p/dsByP0bfcKM0whjwfxSW6w1bcrutnJqTxgRYON3HnJqekU1qdcTmfKrS2YdI+WzaInHjZ7R/hgzbMNZvCjQ6u1JEaDa7MI+MYU15P5nH5rUICXzkLPeW1nW7A5BVP2sPGZgzbrIwR6M4RuvITa/cG6eQz/ri2FGhdW8KmoPzr5PbcUmCj/H1vX2Z021m4lIRDVJHHHNqTHLXYSt2ScTOjNFHWhDhK92nRE++tXwp4Zz3vne7JWgJOzn/2cXczYylta3ZXci+xzT83SdHM1TYi5ELzxou1pW8NDLhjxc7Fyz0Sv+0QpXEm5ahGUJFKyjMDgOnIlSKb7+fZJgOI3ySZbWZSE9l5p7cFTRGsjc4aAZLXzutnqU7snf779cM/0F33TK1GTIfF+mDFX7gtRmm58CseXtLRD1HLt4Q3x0DigmfCvjXZ9WoCO3hbvAsnirNcsZd2DmbTlOGMekmOVW5ukW9ibxkNpcHd4aL0cVGb3UPqLFDy4ytoANSuBk5qcqV1XFqpkW14PhLwx1xWLxW8nb7ztSo+vf3bl9LmJzSv7QLPwEKB/tbmITkFzA9cdpXa2cvlKktD/8Of8EGZLyVuqzIGM2g2IrXwpIePrHHmHP8Q2TVrKWXjylu7pM1J1ngyAp+kg+u6Zvu5Z1tC/9qJaapG72I0ROh+U9Zm/ZeTz/509u+Vozvxm5j6BKW/Ng4/dhCsxAzfvVcvLUgdmiSY8WfXURJx7BX4HpsLQKyoLFBRIwH8Ptjns/oDMuDy7DgtATMyu3Sllyri3PaNgxKIgMjituV1po6/tx8kyhaBANAXrOAhY9AvRMvVTXs0nYKyRNRT78W9vabUEM/VzzFXK/7u3dN4AAuOVtzQkrY3usPhzT80kaymHONGPR6N+3OZ6FUtMF7h4PBM4JyrQ8G7Q4Xp9xNRNVPDLN0maMTQJkLRkkhLcb+om+rBX5IKEKocXh+gDMmDoix9b9iHd6JtMSjGSGdel2CSLAbMH1/23do2bqUXXOPNg/ZMCc9XB7xfbb5QgKdHr17nl5Ou9dTaTRoNStfymZQ1ohXuteZ4EzP0rW3L+ELDfrG1iOmkN3ewNYmW3eU2LcVBZ3d27JK4aNWA5XLw3Om2ZfrPSL3677R93hp168Ww3X+ROlA48UpT7Ql8nNX9oCz9aCWxiT61qbIO5Pdxog1hDCsLNURBpLYG7DmyiBzmU/0OLC60ydd2Yp8GXXHIYsV/9cQnqdwlaN7yliwOXvPJ3Zza5t/4zufe4F6V7z7KGnu1FeZ0PyrOM+26m80EdB43Mvcqz7NkDu9/KT5KhH/er90GaH2cpYAaD/Zt9AW9BquOxp0YssMjxh3eaGA3AB7/3XAWU8Migtxja3YHwdRcH5QFnfr7jwPZSmBD0w4x7fXzU5MDowuhrw2jnGuoLxBiz0de2LYsmLJpavQH9d393HU4QqmVNP1P/7u9uWSOL/MpbOvfM4lZ88sxTk09t0W/lLoTJwrXEL+JmmlV4Af7j+K3LggqTn9bI9ADh4kqEW5R4cXmMukQdB+txQGyn2678eiFnyXz++LNTkpHQsXWWsFi6znCqF6A6U7+Og0WgpIYj34tKNOe4B5e8CNz6bLXBQx263puDY1/wVaXa6VVUCTkJOlJtsFLRUDveJA/zzX50fr39x486P7Mrv6m9grLlGRYyzooYqxa/tD8sifp9IcbaS4XOeb1FaQUqDuwudMJb/HWjjjio2Yn0FbU4HZs/NS6nqYqO6reNrkv4c5kiG8UD76bHRigyd3rbW0q/YCcxQEZoJ2C2rDw1SC75Q9KkAtlLVE0m6NjxWQu72InpVXGQ2ZIfVtksf+USE8z4cUb6sx+w+ccHkXO7/3nW0D970X/pZB6zZ418/r8z2N+l9Zk/7UJ1HDTeB+mZkVdg0mZ1GsgbWZ3vH3tqtJfktMShXibmQT0BN5Sn1ze96wvzDMrsI6ZXgGyzKmVf5BbOIH4gkN7gJFOmhYOWibDqaxum4o5wDPNtBihLeiPnsIIos7vKVfvP/u4DodoE2c8K7JL/3VvquPkGUytv6TwbBSfPPTWJCd17ERdRIXS99fbXkuZDu/tr1JBwRByozgfFWKpioSiFkjvQndvck2i0K8nj0LcX278KwnJc3r5dKiKK8rlRWZNzUx9Au336cJIboDqmLNfUjpAPWP6Y/eBNI4FI3GKV3kGvmm8a1WDeKbU4WRDdeyV68VB66JzmOpRAWOO3Z0sBL5reXBU45I1mcxYqUnM+eTjofRkL4woQOSoUJq4jAuwXWOFszwaqail/dNmdFr7CPXWqTpVCIPe1g++wFTXev4LKxabdKlZMVfDY8V2ssjH0nbOLFkhYbE0jrTzXIH7Z8ES+bHhLYzoO2nMdICn/vO2/VspOunp6Kza4TY0zQZNUhKqFRO6YAqrzv3UFvJHH+MGxyurENp/yGIlnWUP/7EV1KvKkk/kre7Zm5PP/k8HO3y3idLWx68CN98Fu3B4/QX5Y60BALSY38Sp8suqpEaH9iYyKZnFtzxLd/KrCrq0NYJunH5K4Mlj38YDj4Aq27R6l17yeADSJiNCx5N4Z5QU495kHpkZfm4UBXyYPH3GQNFusuVWu2n/3d88qAG06vxlUa//uLS2VEHa28pYmXYiyhz731FwvEwzIbp1AYvTci3HCEMvRbdnR9WRobMiJL2iCVbeJeGBX/7lfHzKYIouZJCrO4BbVUQq5WWaa+y2CIZelyQfPHox8fvlejaHMy+M9W1zChKMtbBIlsYJ4wHTdwZTlt3gVdU0rQOC8bM7JPxeCWpRe+jyeFEsWkzaATYRgpIOP1Uq7MHad14nEg3LfbV4MhUX9ndgvjej3n3egXtFsWZ6/NxfUi2leCaQ7+UIlf0Fwi3ZZ1QlvrZ3v/OQ7lSD569bnaQpLqvHZ1qxxJ622GlBUjs8oNhQctEG6MjXTTSWAtMkIVr9wbXtsdaVk2gZagMnUaasJBXZHU70D/kud8qes8sews7jw9aXRKn/jN2fg4NddZ2nwKtqak3TrPivh54EXfP/p7djI3Hu2F6U0EyuNsxb+r+zZ7iqf/+8MduuDH1eGB94Ty+p9cGd7ckfhRRtWKMA4NbCc4I89NfGvOXBasLrFWNSc/KH/3LRpn8zipdhu0iOHdpyeNrJRvArw8e0IRDEvzJjEEEKTt8S+Gn1tLEg/RhDQgTXMO80y5g0EcGx7OSiQzBB2nQ9CRMEUzX1LHe20QOx5xsK8YiEKFQq8mNjCBfXA6GsTj6vW2cHct7YAg3PL0hBOgBHHyB8t+3NNKRreDCDBBMX7y28pfiHAdE+Rg2d/HL6JJ1BhjEL68GHle0Kc68BkcA70rZVOLadpV7nwY9wKGzw7/GTuImhDipubVOinjimjLhsjS+lTzKmCNKd54alg5l8760qlen70xsvVugX5FAXptn5vNOvTFMOpMtxx3LUrSyl1PWnmcaba6NPaTfrIUedVLf/ioquoB1pL2i8rhUG0/bYLD0ghX9q/KSnd5d9C+l2yrs9167fNCn6iWjuayuItzXzAXgXq1ZbYMRd7KPOTbPMN+XxzY29BKxD99gerKhesDtswxnS0havwYUOo9sKpKzAnt1xOjFuip1bt4yQ+Hg3BZ1mdWXfs4RV/Ug3MQyMSiix1HHwIBIXx/totFAx5lLh1bxmnVllDs38y2PH/6iJ59j4YK6dcKY1h8BGh3qtm28DI6syRQNDoqdmc/NAxjQ676b1JVvS0LJaQ5WByME5up7zuPYLez6n5DPjiIWOJgVt3398yZm+DzSbH3KqvLTdfRRCsvKVklvBtRlCdD4p2qx+jL24/28N8HbhabwHBX3nr9F+ZexWA/ZyH/YMrG0hUoJdX+7PhuGya/f6aCYIn2X52nh2HJzof7O3lk71YXbgVoApvjS/F4OTtzjttSfHmycs1SMfBpRsNAV6CHQXgxLqFlSJ7I1eInRDEsGN02m4h+s/d6Rs9Nar40z8nBmkTDi8RS2db4EbOWBaf+8S8kT0716CE1yqP2Uj1c06u5g9aTbZTKsCTSPOdcqXZySDmN8ttS2JL7fRE4u3u+z0bqd8bSZMCzI4Ls4CBg8uFLDSvpu2qoSsomlPinx0bWjSB7z32tvLkLS1csKqqsRG10Mh9a7o3dMwD49/7C7ltp5Raaez84Ngi6t05//Z6yLSZKd6p9zDDpPyt7R51hAA5uIGY5pIxvNLUz5Mf39khVih9+9G9W/v14B+HPSGq8iyrc11LTQYfAgN9xt5aB6+M/A277TgdDJ+lOL6SokGNjDkes4bmf2ew/2cXybP3Qf1ei+b3Fsg09GpeB6PKRerHcQEKRDCjpwYCJiRg4WMgDqXEzMUB6IvZIAcz2ttKAOteART2dmeAb3JnRmm/ZbIdcWt3LDCphMFjo69tJsLKhydvKYSBJ+7zpaDjIO0CEB0QkXRspA8ntE9D2rjaLD/PWICiR2fz733VHFucotq8SE3nlYPAQyW9aToOAswAoJHyjj+j+SWmH50Alhc/HagYMVPG23Hu3EtEyprAtiyYjoNhpu6lQrcgxsVJjIIBzHaztkP4taKUAfI8xBTxZbsozfoz+XT9PFKYjuiQC2KQ6Tp3r5roz7ezY0Yccw3PoTSGTwRXroHPM1B8dhK/DdQX5VLCeBTIf126ZBS4eXXusIVIMOkyN3sxuItFUt1OitLKSPtDZ1SUysWr0qLZZqxio9S3HDsOCxUYok/RMN62pdv5aYQs8CL1jVxPtYdsbfzpQVWsr/mOKFW/nfw4zAuRWunzLl7Luwp5pYE379fumjaXbUQJXL3+iWtZpnDHFqAazO/zDdKMNkw6Fxz2baSjc5c3Sxk+tr7ck5LjUDCXfJbVeXPVz/eDjvrFDkPM9l13XYom5ul88Cxwps9I47yyt4guHrOGcn9nsP93F8kznUzQv/AZeQUhSIF8n/MAjrQcU5mxjI2emnv7TpqOWCx4xIkP9oEqAx+YEouDjM+zT7pIl7dNOWsl0oXuBj2YL0HFcQmgJg4kkDf62nIW5o3nyVvqw7U7hnHaUW/AQprZjMXOySyEcX0iJqlWqNUC6OcZC4a31NBQzStIaLLSElvJSeHgdH+aSVL94FJR9o0suFB2dmcjInJ0H2ciAsabwAz7OwGLrCrLoyTNhV8BicSCEn7Dh+9607CIbJlYeHIpJTT9xmEKgcXbmm13PS/Dlq8s4Gs484kp34B/Hr4Bg2Qx6IIQNQW2HL2wPthIQcsx/gfZY5ti2SrmEPGNk6lKJuTMYRfq3RL/DnUJJC3a6TqcItoV0HL/Zl80RUxxvMA3O5eN1qi//HJydJYfwlTj1Jar5kkd6PeJVj6baL3tmqe24TNBbAMt2W4PPKS/WTK9uVFGxQvVKmYUtVmYKhftq/pi1e1e7w2l320lRAC/NzfnIKdA+bff2Qp6gYi5UfdxL6pgS7Teq218D+jnwPwwjS7Mn8xn/2R1Zg+JpY6DvYw71tvnN8v+UGtMvoqM00mr4S0d+NZukACxyhqa/5PBTv2XlvjZ+6B+19lSh1kOUszTRfHA9auDb+AYYmOMnhoMT3EyzKzbNPU+4dovx5NB6ODEPPBAHgu4f4eT+tgTtIbGPB1FYu51hoF362uJMkCs+to2ZjR0/OQtJRiGSW0mjIwFXy7AIKMXOXtEaDAXvzdt4VbZdPXjf/q7q48aKtVUXmmJh5MCdPLj4PoOmSaW4BU8S31Oc7JqpgmTaGioduwEr+3BEsjythzLCAhh4CAXGRMv1xYmyhHWBLETznNi+hf5I9zgAXXqCunE8KdW48YPl1uIuyasFAq+pXw6tTJ+LMfAKgA4fnjkmjKKUNJYcqH9VSeXy2tFa2ifeudKoZbNfL6b4JsclGE+J17fORQ/Wdq5x5o9n1Do9khHanm21JhifxtQgAzUsgZGrZ4bH+SMbnc/oYA75gbbJf60omqp+LdD/92PnDX/RcXQAZsm8wHhZ+dK5Oo9W/9SHubbdgCvAjOdpHuJeg/iPR9zXNsWUZv7kULe3JF+Lb6GFLHCDlCIVsk1rDCMcpcvpz+yVmYYtm3sJdZ8z7I6Jf1sVHv62ZimYsyx38jfEN3IFR+cJJbxc33eOEwl+cesocnfGez/2cn1TCczz0jBw+CZd5QM9JdYrKhYX8n6/By2ZI70uRNdypkkFwIBT8DFl8zuHdmVxJH2ts9js2RExCV/swHeRRKnte/uZSwEXyI5eHIlODWjr20aAY5nT95SHEW0O9guGBkLjtNn/d0wMmKmsE6l/52x0GzSwH0+bsePZ9BKS3yE+QcVn2tNY+jsFEncHweAwTI5HddeBXUQ3XolykgMXB9rghQey5snaTJHdFFur/yIgwoWpwPdWuAkirHObYGA5xXbp1MdJoQ86ziucNGzMh6JF6Tlvn6m7IfJ+1wIL30yE60OKj90h5x9B/7QXelFv+WmzM+cGh6xHNCLz85pSCOlzmj6EuPar9buNQAFT+JHy7oh1Ewjs3jfNG8ERojKtfxDt/Jho1OCycRNqd1sf6GUcp82fXgzF2s9S+MMFaqFd6IObWIz/7AhfiO/pgqjEa65eFU//IW2iWN/vTzaaUO9YCNxLjce9OkrN6KbhUKg9Y68nHaGTHnfxjTNiS+FNkw23t583OqUI7XB1Q4t9l0cR8yz0Ymbm5h6z7I6n58NLeXw/9xlmPn+mFkwY0sZUWfHwTO5+5g1JP2dwf7fnVzPdDKvAuNMf38UDJpVahfcsZFMQ5+faWhMEy6tJAAhTIQyjs1NaZa1zRHzHu6iqhnvwYHJMR5sV8125WTHSe6+gISsYEIFdgf7ijO5ptHXZkWwe+nJW7q7gIIYYgeNjAWSCTzr796OdUBMp9LM//aWqvm7U9MCeVlYaYl1PliiBiklGLLMmVO4BPf3H/zBsLp+d3nMBMqkkD5ry8yZTIfrciSaifPwyBaM76GSyFAc6IZIlz8nb+4fvesmaGH86nsuUPjC9pQp29F/lPZqyq1KMvmZbfmGznzby9TByPG7zgivD77b5uTM2USL0U63JOxMvxJUW7/39JGnTj1ItuU6qc32dxffrVQLMvuOhgn8c8+GeTEEh0UX5HzjEaqjcIoISe32Jd/qI6VfqdlZZ9gpln69ZHQcJNssRSv3JSO94Q/NgLYqibbMgS/tNsCUbC83PW0lXyq+gZqiCdFx8K6j9NG+eo7/qLeFltiw183mvH5E6boJ3d306MxeDu7+YHvC7xwWGSmqQHkXv/PHcXs8ijS2/ff3GfOzrE5aPxssrp+N1iKVCS0y4cFs/+5lORCKzUg2Ms4k97sBfJU1ZP4ngx35Ly3xM52M23IFJFeeGni5uDYDLQ126vOzyyegllkOjGTdZiyYxrbu4/aDr5nyH469qWlBZvYgMEPI8EapkHLzs3X3lvfO4peC5E5TdqUHxKqv7Tssw9qTtxTMcggbwoyMBQZ8+ay/eyNvi9Qr5MXm84wFHSYGBTO1o2RA7voRB4/ysDa/Dt1ZZvFDBLwGx1pyuXucsWQ3+dwiwJEDzr9giHWhw0emKVigKuRWd0pIyIb33a8pzU/k05egqekILzC/wQcr7DeCLuvcD/sna6ixe7r59sOAa4IPB3jKg9nLc7yP9qR2fOl+2KrgE2QZo3am0v16h6jejZ2utQ16ElbZzMclnSMhbq7CWHvO0bTmiRd6fcrrshNA95N8T92h316+3qQUsQSZPivC7GXH6uyrcFAesefCZUOoK0LkppgL574anVzS5qVnr0uoJXr32lIRf+amOg46UbWhwR13olVm/YkfJRDPf+1hVaDv/uSx8JUe03h7rXEdG8C1pk68c98Qf1Kfo8rQmRs4Gb+6PMxSocXolVtzZWex51mdPcNbmhLzH6k7aZKQTIOU8+7YD4TGSdHInkXGyYCxF82d/eOpcS//S0v8zD84349mxytPDXt/Y92et8EArc/PQcYObclmZmGNl98mEXQ/Gdougu5kDPDEsOHuDuTKbLu8IF0ANjPLlOkVlnYvciJKn79xUYUccmn0tR2JLq325C11AN5hkjapezoOGnErz/u7D67NkfYX2Ojvxh41VDofLJrDhQuTdt8ytMQ6Dn67ObwvmBcHV3uTO83nCi1Il0XLbi710X1BB0j1zm1eCjSiyTKya3p1aiL8ixm5RYpk7rfOjkcmnI2RqCNOJShzuOZ/iVdk9apDTgdVW/zUY3SZ8hlrU5x9HKMz7R5dTHYFe+B9sjAqcMXrvrQYXuBO/5Q/hXdfP+zN5OrhhSRljwRXaiw1sw/J2UsXon9ArDrCmdkwCTNaHANv0mfLXp8QaRDiemG4m46lukudILR/Ku8bUk1RAt/BLtW2p6XGIA8dzyyFai9UObvRygUbW1ADnVahIJa/LdzjdjlNTtE51VoS+TbgCP58gawsro2tkwj6cCEU4B2slZczrW/ttdFyiNa0T3yrC5jbbbZaZ34fbbTNagHZfJsJtg+zSaYYjJYfjByqjc2+joMD/Wzg9z4jf8Puvrw8T071s/F1JxbSfGP9e47G9BkpehZ48benZh44kbvxZfmN+exZJ5fho8/EFln36tVD1blf/uB8VIHT182Vp8b2+8yxsFCWyyMRDpkibq835EKnjOtKoiAJthT4zP4eniWA7RrkuPp82Rd9fpgB16AFagVSrSigKUZfG8bEdex79JaK1CiIgzOfV8dBwvLv/u62haUvbJ8nOverPmmoWi3QsbhOH1lrQGCZvzu/L6S2oKo579FSYa/+b9bH11BoTrLYKNj1EXGU5x2u6aEOAJT45aMoxY5l2lTG+WgwxZ0HkFB8j5CNvehSW6O7CCajL/Y+KaO8HDy9Wq2GEqgmAQ/FaPisZgumNRGesjTfW4J0b5izbNx+eBcoSPXdL9Y5qa0ttUmE88/lXfU1erxY8DNLxQKAoGjtJAhw9mrf7qUw/iGy82NxR9EVGz5IIxSsppCOW58YA+IAjTFNxxqtmKqscTby5QBWP/0k1pCXrTa8gSn3BU21xX9MbXWlvO/Cm2zDXrD35Kr1dmOjbSPLbPBH06TDMbkMN3MzKaW6yD/8GtUq78MNywL/uRiyjcHN1saim2vJSR0Hl+JPZSlrUhqI5Ivv/S8W7ig9q+2idC9grum8p/xOn5GMHCp9RsL1s8F3U5I8y5Lych/Y1b/n2FSfkZbp5MYzb2lherfjeIiu/XrWyWXsRaVFQtp+TBLj9V9Z+LE/S80K0Mzw1JAwAmQTFm9X3g0gNBXPhCFfacexl7ensw7PDDrCFdWBeCkymSuWUmLoIeTxWyKgIjlcW1nSrBWjq7629QdZn7EfvaVYAtPZBG4+yXIWNfuv/u79nE6lxW9NWwQtPmmodD74tQIGPxdt00LFjPdmGXH79GDgKyUlep5hQkd+QJ7ED932W46NCJNLFz/Ngvr8nOHDA1FcfiOce0uKr/vMYps19qKsOCZ23/7qcZx5vu4GkfYaoFUCS7TAV5ZfyPW4/t+eGjg0qKT/KFV+Kl9vbl6uM81+/+X39FTCcn05iCzkdrznfHhVRuXFLLzGzQTadK8D0MKVQAbiWE1UT3dDaP6gmVeoFJ17oBjHEE/QIEAOzk2MBdjMdQLB6kX4aIMayvjA4WyKnKW56CUUNkoOcgfsbQNkWiB7W8yZc187QrkogZ88r/25Zinq+d61Ni/gBDm9h8eFqdlZWKtgtZwW/i4JnPp1hNZMJvCTHcJq3Qfq7fVCaH5TiaZ/ROhXFA8vr/zsaFQcvZg+pMAXy7TF/PAqsml4S0cRq46DlD4juWIzfUYq6WfjiLwLzhJ59zgdy56EBqHJqgfhLrh45i2tpl25BTW5Wjzr5DL2otO7wPbXR10ueLkX81aoqVF7UTA8Nd/s2zxvwnxJih6zzjSTtDAHB5HbfavNE3CQDrS7m/QAXoi3uLEJLG6fU+49KOw5Y3nwFUy6yFXixEdnZMJbLj88eUu9tGWcziAnwb9w8Fl/955nnqrmIaO/m3rUUOl8UD3wH9UJdaY89dRU98Htv3pqFlnU/22Hic0P6AUsRhAst+NDKFrgpKXlbg1fSonPXVFAQpb1X5W8GNnJbTA9kl/xwdVeFNUxb0Zo5WqALOZzCYdKwkTJlrg0EfVFPrexMeeg315J/8GF6CwvYoHPMQaasEXrVODbr7EHrcf/3DC/Z6gZJ66dipL8mrBHfFgXz40s5/ytX4hiY3UHbS5sEIPCtHCTPnrbjjPFvk4QrMw3NU1MWUDs7CuXbfcOUWVz2vUgTLW/OMWalISP33znK6xc/+xq1woXkXarEcirlkjzy+LDpAX2CtNPFrZFnqIFYczrd52R9JhrbL3DaoXfcgFmydY9FGl/q9v7nS5eq78zwhvtKhXIFZnr94Yn/c4ffx8Klg0NVSPo0rrU5Jc+I0n62dBnJKd+Nrikdrd031z+Ts6yi/gXHQf1GelOx8F/vKXxMV3ZWeTvA+ZnnVwGDkJRLSuudLnTVNhTpIafFtZwqbTy1KQ3eMcSJLFv5g+uCBGCUTxoQ4+yQOnOyCf2lta3U5AUBWzQD5OrWPOBojdmBpC32ojOWWLv7OBCMfrawiDaRZ+8paRlwUCAluH+wsFn/d1tMsCr+9OC0Vv6pKEqjjH7uGKD5rU7x1NPzXQ6A1+ZFqu+ts3sIqvFlvv8TfPOouAhZoazTp9AG/V8ruUhjS1I4c0LSjAROAUIBAeMI9xm2hzsjUS5kmRYEL3Au8OKtLm/81oRMSl4+kVuTG6kxGKh09xFhH+hmXfFhQD7vul8sOq6X5vzDesfH951+nj94Q9Lq7e76i0FuwP95j/DjtV1qlUPfh+gzQIpJgktbwC9lWzVQJ+7fIf/why0Hyb0+Rn7RrozecBZG6CQUqDsaEE01S9OjnT6jzGlpE2tcGCz3dPZJdLSFNLw1CyEyv5LqpkTLzrtSrFoc73/vNSEuvzV2hJ0HHRUAh2lKA9yJPnH1F9VhQik4yD2J2XD60XUs+1ApaaUd3w3s5w9WrinJl7Avzl+4weyyzidb+8u8t3AJn+vn4235j+P9bMhTqBXxttxrJvazI6NjIUnPvjMW1rWDL1o1tp61sll4CBbTm9lHpPEMvQs45rf2FLzsunE8NTgJOgAzYin6wJTTMiE+kOevc8BHmqavFFvcg6PtxJbDssuaUr195tJV0Rz0QEoQmgEv+NnOEjJr6362vzjJDV78pbScUvGdM2bpn/hYCiHsHwTnsRaJAhqNrJQ2t/ElCcNlc4HD3zW8FyBruninftN0YaVytkprGa23BcM2J8kMoiWZoi3WfeClYk/P77rJjARQWGukbXknP47PpKl/OC+4BIpnA/UbcICEq3uKSsSH3feWdIYG5oc2cGystapd0KdcFEsWm7IH0qdAxNla13syjatzzXgky1Yq/EzcLr+nRpjmLLEvU4PltMeIOdhU550e0kqOhZd2wt5EgV/v3xjapWBEHF6kcLNFxZhnkCwdusA/awwCccwVvPdyK2c1VywT8uli/CJTnjFmil5q1TyP5WOqLVUqThWTtpXgTamlBPXpRyqfqVsfMN04N3YW+CtQVK/zBP4L2Qq9HNLue1f6DjYwFbeUtnF5MkpV+5z8IfXa2gVviNOXSmm823KdLSRwNwvKQvrqvvnxJDXZ9EQ+OfCH6wPX63tGlrifjJk5G8gc/1sLFORiD4j0YfkXXSczK8yFj7773Qc/Mdb+j5ly52m+6XGs04uAwdPkrHo4FGXS+uYsl0wzxeHmKtkeGoUXyBEwYk9yGkpUGavJNP0ng7HNav1wC/gnw6nPs++A81wkNtUsLmgSRrc9/jxkS3o2mPEHXiVvEQ4wwsO+2Z78pYaWmIfbZ8yf+Eg6EsFO5DqqFu0VS5xxXTi88yFRw2VeWlYLydL87Q7ZmLJ2uq9O8ScJhjTcB+Y5e/s7j+u+vQkCMPgy3Zc2iQXaHDpJ9lK2kL/8AliJJJwhyCUOU3x8hgA1scVWV6M+Q1myrO/vQIv5vJiTD/8D5RKauFqjApqsvOqjkuhsTMxPTCGE34jOc6xzJTgyC5hNncEe+9jpKB/mN3rpTRPnWJO/Re075s/PIhLvh4k0TJuUpbGHikvZrlzh8XrN2PVCs402y5TQYkRpZsX23sLQpFN+9e5CPVLdRL9bq9QaJS/6WN8vtwzDy6HrkrHrrbKkvTr5M1WvqKGSu8+pWp5EhCMHKr2w4bws01n9CGQ7Tsnoo6DcqFcFH6/MB3njYyFJIpVH07YPNLAFJ2htKx168hexms+l9Rsdq0ZoDaPb312rDw1gd1PIZv2Ot1v1dNR1MjfWO5t6meDkI/1GWmV/xxf+v721OzEnvXU5PHzwNlkFqf/1sk84uDZn72Ea6XLXeqYUjOrD2VLaF4gh7eaLRzDvecADgzPUFf4yVNDTxKOE8Top7FUQ5DHgwZ2XMk8sVHNp6zxTNSEhWzuESMjLz6skpdWfW1kF3rylhJezcejqs79nnCQBJIoQLvfLyG8CsfQz6hWKpCBwpOGKv/FyhUaANaf7aGmaUh+aIBR5QgBrodJ50i9g6LjzBZxn97UvMGZhtoTUIyZdvUZSaI5NS0xDYZwfCqf0H5/TXAQjDxjUHpRliIM7Q/DDXuQ7THC6Dgv869OMMZTl35mLR9dWJm12I/EMfyVdXkbeJOYRQCgbw+mJ3g1glPz6XTtnh2Qlo9Xn95hY1HrkwgH77pm7XmEm7r1D7jFYhFSn58Dt2AqJZw5t0kw/2p3sWWn5jKw60TZjrUnqvtqq8DvU98Wjmx+GKmOXQMje5ZrAzPq2617vwVijeLnl+0K8lvpwAFS5SwJ9SLu6JNxrTQ10+2e6sovpzoc37zfpDShIf9ytU24u2VNxww+OOpd0JCmcM3hvrmuKvRPkpQb8o37dE/jWLiQ2okJwEvX4IGiDW9p8aP/bLKIR/HSKn9jUzY8NWfwn/qMRAcmEJuZPcsaeuYtrczSnHOWtdX/lTUUnzoW/ij/6E+xuE91TCkC7OeKWWt9saYIAhCQo+V6X0Riu0+emjnp8iiwJUivfz7o+zw+L72D41a51ryzhz87tB+OkCnqd+hXQQ7188Kuf47p8zjg2HryljIZxn4Y4qHZCgdZyJnAErloFXkp5+ENRkGISeFZxkLBPLquWyOaSl2APiv5oMRD9PQugmuhqEfLRoBy5jD5nuSTo5CwwXORupVeWwjS+f722y6EieM1gG3EoEicvMstAdIPEvi60OGiU+1WokbGXrQija/1q2A6wevElatNqmuRejPQNC0lHQeJY999rrls2zRsSZy3p4wQxHbMr9co7r6/vlbpYnZtJhRz9+hSGLiY0yIKL/oR6sFMO14l2HI0AB9vv+aqKkBfnMDk4gDhWhUEK0D+9jsQ0hZCp7x/UVCUNFCwRUoV2+72xsKMNvrbP4yQTNVaWeThfHmFg/sk3hqOrktmv/x76a8Wi5t7G28WbKdPu01qIvdTdeJ9pCK0G2ak4xa5OjLMXstmIU/2qEZp5nz/GiLruRr3jlAipLWidna63pQ77lofvIay83mfgqh5moOfZQ0xf/mO7wPRFQ5W0of/pK0+85ZaL3mj2/3gU2oWPn/s5EqNdRzseiR9vl/pcpHhfnLb6MI+n3+vluEY+Zbwxyga28J30Qn/5KnxW0P5g9x+1LXlFKfegwOBVt46bEQFCmXGCTADpSElFgbwGI+ug36d++V2z0Y4ksaevKWLc4fO2sCrvRUOOgK8joOBlOWEe/KW/iibtWcZC//k81+b0/OZebyr4yA+2pXcy2zIc5Z0IgMvmFxG/Meud5MAG8EH+y+XXcKxjJN+ACHYSgSmXy1IeRlIOC0RlEZ0aCNk5zqikX5Tn9h6iVW430pdLpILcZ5S15j4kjCXlzpJ12T1w0g2T3rQ5ZoVlYV76gI1kbkDrzSr94ROtCScNj7c5eMmMnQB4q1eQnKO7KT9Qjm8X/hxeX2tbZoBHRLexyz5dKLpciGhYUJnSy9r6pD/QrXLRckwDbVriiydXsrW9rdegtFgtlAYm2/a7kS7rOayq/fB1xRX6ye/HTu+C1U1RpzeoLg+I6FNrZJrcoEovPwaLkAq13c+oM2ll8uXae5b6tdhobLkqqcXUpU/l9XuVGhx2Qj1jYSnNg0KbF6NgrH5m8xg8BARPxg5VN1nWUP1v33Hee4RBxmp/4+H91lPzbhgdLsvspn8WQBYdXLl9/yP3ZRxu6HLXQ6T0X3F6MK2gJMWnGBa8EQfo4bonXM5Z3c2njw1zCIufD7RtmkQUF2ZPS+6DgCegdlZrpBOYHvLIybDlpxbgKayw5me8xbgx/ESRNAnbyloGWUzlmmKfMTBJK7joAn0S+0nb+nJDGo+y1h4ls+/XagD0/58z6/j4Oba6LGvbTlKjtkl+KoCxjaGIrdHCmw0Fd5U9IvInKOCt2ZG54MS43+gHTevN/XBkBPfMJI0y8hxMk6wsX4293t0E2X2xtzOcSm30A6JgqeQs1vBj/FeiRV/ZHAZyeD3ixphMbnjyMt1ONjoi7L/kARGY7AQB7CBgBxu+PdQwJQ2z6hdU6tjSijOCO1HXfn3kTQ5J33mRhvgqIYVHwStnzxbXBmeF87QxaJEGpbAaVntbhQvSKTfGWJlHQe1QudLoQ1I9M+Tv4RAu0wl/xIvwAFVRULZJlO39qmhXNfeyRSbtqkdVW5Yb082SDNRH/xytioZpEX2wk0lL/Qt59gfvrpg7L4abBn/s9PO08Sv75fn+XHWP/yxFSvcH0Tl2d868xf/ZO4FNlvLRxx8+5BwRRYQG5xnxdCz7NmbhtHtTrGNB0MnY3Ry+b5oT92U25O7qdEw6imZx70lfHL/5QCsKuCGA7e4QpB9fcBZXviePDUXO06vQnuzFsvUrO1Ae7Q7fieBzvxkzxGcZbGUIwjHtl1TEy4BUfSVEV+PTbdQr//RW+pAGJ37JTP4fIWDrMkRt2T7fxbAwJO3FCw0n2UsPMvnP65bqaHqi2imYEhHT+sKB6chF7PMTneq/jO7LdjDIv7UNyG8XECkkiME+M/jt/EELVbTCD/N/s71wnFOx8Fg5KPk3GMF3h+2SuC05nROCzmR+PzRMs3LAnziAJCxu+kuxTjTCC25khLT1phm1wIDOVA+c0/o6fy1x/zdQVpkh/eoDKH23iu0FHHhcAM20dyuVBWTmY+WaJt8neBqYwDMHC0EkY1iP3flauEi1lZHhTxSWuTXyOsx2S0V9z9VFKXzZdVb+iUM7baVVrHvu22WZ2Crk84qbLSlKRfij7pWzg9H5ga7IH+Sw1wDuPBsv/GHyWL+1Xd2Kv3sAXhfmYotzcjn38BqSjf6HVwI+a89vNF3WI5nE6wGW6qnbozP6INzMEMMA+H5w8Hg9pnO/F84OExaHYt4ZHu56u/+K2voH0/NuwBvdLvvOS4HweVjJ1fq+KmbcspMfDqmbOfNCyPH9b5Bp6sVU9T0fvk9Q1iYg30Km/NPnpqMmy9SYEoGfTLZzuzvuV4lGIeVLFMRBfAjXjiaOov6AUCmAQuTg4IFARt9unOEoSdvKcXp2ITRFzcrHATc24/e0mn2yVuav94fPust/Sefv2yKXnyBZ7vH2SSkZKPgIw7m3fPUnD8LmyoJWy+QCxJnm7+2xFouFNtxL+KUfbmqnqFYYQRS62FDS5xwmisCQ7hlabwLvkLe1FgwOnv5Pa3J9vBAFocVse2bup1xRb85l0kq/yDcX811HHyArq7GggmzMBtvR3SbtHCWJUK0Q5uEXfwYp7suOuRKorz2XqArd6g19f2sI7B4yfiATRorTMMdJMr22XcMuJ+qqULieyk3HFx0tEW5+OnQ4/GX8tD46PLBWv4Ki01NxfL6XwHyVxRXYXODG7ndLDgaUqV//+3Dco3Aurz0ligLzW+RFOMXhTa/L/20H0UKlSk/up4TzQ6DFYQ++TOLvC+MRnxj61ysFj6JancpthA5l8OD73NuDIptfh2lJq3XAb42eJY19A8OjskFyRj5z/izrKF/smfTi7rR7b44oFsLkl51ch0GXzx2U+44MpPQ5lYVnGk36R9ADcCW5aSZrsEnMd6iWghoXBLR9JOnBllmXDXjNFjAS4eibtMhi4P8AVvLVykQhfwQkRagF7Rzb0TnzLnPHIDNQTtoYZ68pRgwAyFkmbI84mDY8JZyGItXnrylHWbUfNZb+iyfPzApIur9VfCFZ5SMIsojDt4N4gH0HAEcARmQSpsnPoLfNNXZUY7OxXyMNY4lmcCQ8JNJjHP6chS8Szlc3z8wdS8tvCEwOUq0jJIm/dsoi3bxQ8QJVXjx41gKLy4JJj7L2XeMXcGMF08/CNVZBmUwLzrne5H5ybql1DahUoCmgOkMsLcjpPgpcvSW6uJTzgqojRycS3MjRWRpv4sSXGqm3i0bb8dy7quTL0sSfDx73yj2HpRzO5jPvxP5fKBXVJCN0hfyc79TFnUcnLf0GcnQEjcuUtt7nTJMlZI3hXJewNVuJNKBWyHKir7I2uO5WgNl2hadD9qXuerbk/cbNpCoy1cW/a5zNZfOu2b3XhqpF4Shk+lUprd4uwfscyNrJPAsszr2LGvobxws1ncW3NK/yTzEMeEcPnvb1W/+f96OH/Wi8wPgthoI8atOrkwfe+qmvAWDc48CXR1VwOBVwTYtlc3ujmYWcMgHJjGT5QMPBPgnT83VZX+7aNkJx5MaqCU9WxaPl0AtG8WvQZ6/j0IR7ytzIJpAh/o0EkM2Jj/uGXB+4MUDj95SL5alYHXVsm3gYIqwZxiHfFcAok/eUqxSedZb+iyff7Ly1GRAbBgMmue+tRUOandW5CGxtuG5My0Y1mROcr8DsN8VYcSdDZRrOxC6V2aFTefp296UEMcJC984sPA9b5gzPRB+cENcG/UMLfE5x0O9tfvOPGfJXLw3r62WIY65Z+GcxRfhJtpDg9Rr+WQfoFt7HYvW3RMo1UqBUWxnMdim5zLidVvuUQe7hpfSKdJMhWFqj2V1Cjq6rkUZ5jLDmpDgz6z7g1LpSKXkS6qMHHSaebaS760ZW+KL8ULHwSipFnLq786iUqnYfnv32jbDKw2pQBBWqEBKUfGOphyIt76hTIqBNdxiphEyFagO3m1uO+L+Dlh8afQu/VQBdGA4ExtmZ+GyI1WRbuS7pLCqo0M0BkXHe/uPeiyALU2n3OgvT03AnX2WNfQ3Do4O1j5ZjD36v3fmf2ew38eN/fNEfh0YhMY6H0Su7pLaUzflUbafnZmni9KB/6qJG29t4fkN5MfzZDqDg3TSMznqi8COYKMxb0YM1cwbnph7J4Z+3E5B4J5H8uaoPAwmBn7LrvllEvozYUFZMZOk9TtrgoHKA2EOeZ68pRbCe55gkNH+CgcZ262OgyEcuDI9eUsHeXj8rLf0n3z+wspTM/BpiUDqLBMEVziYjgoPXOzXw2bKHuTqe/YQNEW33CIvBK3vX/9cY3KT3a2XkS5j7cSlYMeE5oQlRP/QeD/J+t0WscAQqTaHzK+3Jz8a3Kw4evU9PZdP0SFbKZdkE1l0MZYKJudGSeq+J9x/nupDkeb88GsqVtUwGj9H9NG4L88jAM6GPDgNUnGHDcQHNsPMon/AXrT69ubT5/wwi8nrOF0eQ02HGmvBnD4j6R+woWl5ofGlUvDfX+LtQpklv+3Y6zXF5Dg2cPALnBYGLEB0AiCQd+/wlZ4yvTa63e1WDB0EN/Zfz7P1HC++cWq5plXnBD6Rbd6rOg7qtFQccX3igWmRr+W8iJA/j5FPj++DJ7kG/IkjJt5KWotCKX36ogbFBx0H/9dv9YiDM/I0xcXKKfpfO/O/s4aSy19XOg6O02j5yw7DL/fpuzETfeym1Oetgc6tllhsnLcetmogvfiaOjrLQ9OA8dUx0PEcBXJEBNj3BkXpnAHzhAVCEKSUTWxtM2FEwDdnYL6UtHszAQvh49zaXQ4IdaKPnpoxYWiJn7ylNHiCnOlMk37EwTCi42AWCQjP+9ouIZRuM2JTgWb/5PPvOO+mPnqreDCdP2tSzs93FlLFKrVTQvAOejX14TJ5L2+QPpxHEYkTEZqHBMrq8iQMJ2ToNl/OOdMco5WEzU9TD6GlatKbj1P925iis9xYhGYdAVs7jbqwAleEJ9L81TXh9Mx4+479xNn18I3EF1Gav8ELzg1innHfNV1u826vj1d3WBoYzcFCCiYbRn/3MNSRZuvfVUr4PV/0kxYsRvvb+r2hYlU4nPw+cKFtu9gsVoLHh2+gWhF+KJ+7FuWCLZBT9ytqnh81vy3co45YwXU+2NRnJL41yqM/j32fClAvV01sRlF+M8ApI47k5WjLWl9LUblcXbvItVUVyC97XIM5/7jVDqP10i+kaZrZFCsQ7ih5aZB72bwNpdlQ6O5zwjnWXib73Yj9qbf0md/qH9/x04z0fGcO/I+GyuCDbn68f/eyYvRvMRAwyfRfDAK2+NLn1THF9qCYrq4UQ3vpmMZayDiSQDJ9646I85b4dsy09+ADt0vg7nqmDFlnnv2DOO1jUNJZKzCu0CLgCdB3lKJzv0jWpdMpw1PDgg58d2GaMRa72Yujd5TONGnvdIWDsJ1jeMgZ7P+rr820YfS1Ve427//J59eMLQSpBK2e/LPUl97B2jvASg73Q2/gtjwjCCbio/no/h2HriGhboSQxB2MBf0mxmXig79pzycXSwihQ2fYP0fYe29WP/x0ADwb2XcTc3nif08C4sjpXKo50Xn1ybLMy8jupaPlX7q4xX0EFO7R3d4n2dnQMS/sgYEUKPxJrZGgKekxHwLM3IL43IIF/RWxMr5IrmOuyL+XCCWa0snUdUlsLd5jeSBY+nUyO8wPI43irxOtmL9QmnCloOYfxuo7P6LZckopcF5Su2lTfjliSuTm9p4tThb7Vz/0GcnWIdVYs1vMpVRbAgx1uY4YcdbZIfpzQUpV+WZr29EWmsX+us4HhZ/ICO0rOvXQumsKvoPWu2Tott/Fcg7VJmPDUwcIP8Sj2BRiua7/8H/9Vn/h4F/93c935v8PBw2dzOTxfTC2iFv+SlBxnWZmZh1TPDoOKso+ihiemhpCyiYA3cPwVFVAdh1u7Wg77oood7m9kDupkyXI43HvQxwNmidWq2dG0Tsm/9oRwcC7qDV+uPPoqTHvGVpiCVQ9qDnkZejhbkbnfisctKRf6DgYJpiL531tX1VrIKvC4+nsWT6/mnFuHYXunrbxT6/SoVV/SrYcWsRa/vC+6NpZI3ktbBKhnmRVscrq7XjLTnFjYy+KStZOjgwu0FwstQSoo0VdjEDJtRDUws9TA74BnG2+/dzlZtHly0N2Ip+aWnLQVBJyvrHzwdLGaibtDuch3PV5KslJGFj/pYmSCNEXtxC9PAHlWbtPLHgv9jlOJxwLP1Y/J1u9xgZ3P40QzObxBgmiDZPppjCSfitUZKTCeWVivilcNpSSKkQuS7kw92cn1ShCwvmeh6SaIL1x3U1gP3uB5hTGOnnf0KZgEboO22K3oMDnvlr9Vblo/WRfk2rdefAN0eY6hrdUM6qiK6IRWlUYVfT/JHOp3V7DCqaqCP+x/bFQSXPYlw8VOEiXAq6yJ0hRxdTR9n90N6xw8K/+7mf5/P8fB3U+eHXVx7WUI361xzxPUMmc6NyqquPgGJ031ZWnZmZ4apaSyTviMht4AMhYsq67SdZduYOSEuOtRT0+CImArq0/bWBBuRN3lB9uKivAlwgLh35Jj56a5Z2hJd4d9XUcpJknLTH2iINBRsdBkyUiPO9ra+EJHQfJyTfT83z+w1kh6wCv9yaxiS+6pjFRaJJmZzfBs8EiPqnE1vCeSG8PMSk0saxvV2QJAImt4yXLnntlrtwVcnML4Yi/GtHYQhSBMcY6HXlqCjD267VD0tyd5TYYLadfvujMPxSXeEW0B05jTmjKBZm5CJDn6EN4yZ/e9o8LvXtSCLKYzKFoQfRiPA7dtT7OzMHlQKxVkjSSs0KFehwtgZubHj/PFB32W7aS+wU7MX1GYpSD1Nf2h1G+DNenN0NXXqf/7Uq/+PNk71CpsLHq6SdUyb/DuGa9wjGFAK7PSKN2GcMHN3apTdrjrBDM/X7x5qcidgT05wWLPvwW8t0KSz4QgRbTtfXtCluvX7AtdQoW7DpWWk/eb3YWuXrpq12/xdaaZC/Z4gdtDkUEdHN7mbJm34Un49l/dDc84uBTf/ezfP7/xMGMhXlIZULTVBga7wOb+eDceOHVMYXTuZV1qJIXux793mgAVw4UwnGju4GwHFAhCMhse7bHKSt0BfiC9vTIOj84SGa0ikTDduV8zxlbrOvDn2TSBHYngJBGdSO4V7ABLpNIDWe0joM7i8NHLTGurXCQ9DmzlHkj+vNffW2HBaOv7Uv6h/VZPv/c0BJPUxoz9t3pOBiClswrWMtwL7rBYCxuvfZ+ZCwLo5ZICszPCKZDYjzQD/Pw1Bxa64myeP24NlzrsuJv+uitoZOBv1u4QOgX21sspRkwic1f9Ox9doBWfe85wFdzu7BZbsp8+7QZmAp1+Kuthc6cnPAQ4ZQ+FkoRoku0U604ZKn3BjKuTejp4P3e5ms7bnkI717n+PZFhO/U09FmviP+pox+K6Mid64Vlq9b7VGx8iVlglpltVhJnuQrHNhq9yJNQ0OlXsTBAdUV9LNBtdQl3FmoaIO5fb/VISO47F6nhMxLkuzEOl2cTbEHiR/+ukiOEs5ab4H+Jod8tWRoiRdMc+A4+M6qsn6e8X5uhLW1hcEH5VpOOIBFzS/YHPZEFP2FAI71GP0f3Q0rHPyrv/v/99T8Gwfz7ylAmiQztKrj4HFocDeLbyV1HDTp3Ir8Ahs5riJjeGraXpQWV90NNshp8XF3mLCdsIev0n01afOw9PfMnted8TCWDaJgcUPjA3fck0I0Lkju0KzT1Hr01ByphpaYyp7rOPjS8qQlZlY4aA+HdByMUJbR8762QknHQQUYHxWf5fNfMIBPS0rGNn7rOgR4lbiIH1wN+y0wCl4G/AMnp3oTfAfG9cNPuHYCOI/V7QI1EqyqnRQnbw/fWDrVXA3YXwvHKSvgx0KmhZCrpH8RdLvKAT3FirAL1IbOGIEjPPCHEcdJo1dUeinYTSNhN1yUF+UHd/d1HoXDk8j3gQ8veEFxEutBCe+aJAV2mLjZQuV+p3hkJ0DCfGDVb2XXIph2wbfYjj2/iFRL7z559amgVC5+/VYQ7y8Lnd5UZcfFsfmCuwzE68ow8r1kNot/dlxk3STsbexphDIovv3eawi/u51cqhsJU3XzOv9+n6kr5SBQTPn5NxjVAIw3IAirKQPeED12mCXa1Hpi21yRDJ2MzgeZ/if7//H1nl9to+v3tyTLkisOYKrBTggJLYRACKSQwXK3cVHvxZYrruDe/a8/MplzJjm/eb7vZrJmZcFYvj/X1n3tvcm6RVNzfTYBvtqbPHWewELMokXC63P/MPgv3Q0vHBz/elcQ+Jeemj84+OwFycmDzff59sLgoD/0ZblLbHBwYjClhOafPlnPe60XT81s6amxqdBO3xn7ehpDvEAoiA4fXF8o1+4DiJQxyJNQN7ZBXwNwX+ZTDjmedNExZRkU6Aw3/vbUnFPLXWJw1DE46EL/9NQEcYODF/Ok+Htf2xAmDA7ilzXqt3z+l7cQGHl+213ufb30tZWZ4Upjjy0hYQ+yEYN0TW3F4y7zQGY/rClaBQDXf5YVdRHBN84gjr8I5fmBn+CjHs7eJmKs2csGzhKskDfVqQq8cF2/tuMwP2E+Oz3cfGOXEPm5AkVy6oeVD9FcfCQWHF25wX/AOf+M/+C2nGWtXkZOJEjNJFPPmIdsiJmMeIQBVWeUUwRHFelrfzFWoVK8X13Ozy3N/uGaHxQuzZbxCB6U9YrzrP7e3Sh3+PFtr9nIXk7Ux0ICeWefSZXOA/v2FqSbVoek1wRjoCor94vLiF5uaUlHNMzmDpOCKYChmXc/xUFYrdz9CNWkz1pWb5H13CzcuJrbusxce/Sd8U2hBuSaFkMP3r7bWLSVqvbFwWpZd6lKho1fEOk13BmP+6nwL90NvzjoeHlXMP+Xnpo/OcgqvzL3Xu4Ho6MkvVtklklilMEUflA0D65axrlR5T4fbRpnCQfiJ4p5H5VcuIRBOwvakajjxrjsne+f73k8NmJN5Uz2Lye33fQwCEdja9BctgNJDvvbU4PjbheNLB4Rg4Myo/zhqdmlnA8M53io/9HXNqkYHKznrGuzf/L5h+EF+AHNIWfPNXP+uYCMHosv+8+oSc84thdSbIuN4SPRtge9ZvxJRtk9wOU6THALnuYjgbQIt+zBWJxQB9uEGFoD2U6bky8s7jcxiFADxxfKMHiuPNEFRTKZwyhuQ4MrQxmmz0QpNXCwtqmEAJdHZtlHybkbWwNdFhAMEjNvj/CGWPnHwMGItBtSwaDysYYx4+7W0Wvj3OBn9MH7ufhSEzDOE3mZGV7OPLm65MgND23jsnWz2lQC+NVyl9j4MSp3Z1Tl+a3S7GC0jmZidRqEJtYqWx1bhXq+5cwv8mqFW73btPn9hDGLcFrdQs/DgVZ7Kg+Ez9R3v8G8Qc1SQ5YZC32x0vu8ujXHlbr6tP6jUxMNPah10bzEVv2Mcs1Uszlq92OpxJPEQx8k/qW74YWDD7O9nrOEBf/fnpo/OSiNkivhUgphTxhAXMQ3yDw8fj4L9qBZbJPcmy5zXFnj3LDIdzCgJRFiR92e/GRYhA1ADLRjDxSs2mbCss+Df+nf7RbvnpzhPRSi7PZSu14oAOjo5grywJjxip+ZPpG2tRXZUG1Q3GRwEAMM1RbB4dUojwpR2uAgyyVXB7a59mdf287OjsU6ykKu8zIYOClZsdxyh0pPb7pe8vnjqiuH4M/vHmKxZ5yL6a9XFEKpxGER2zdJrnZINI2UAPQRX5cXFO+nYaWZwq3xeEGm9hxvEYyWHuF9F9QmLK0Y7W8t43yJU+PhX+fEcgWptp2yJbXF1rqJDfhnxeDgeO0r0iN+OtbIgm5AMzZ3OHZLeMWBxr89IsTzJqhqdtC03jX0oGObja2iZG5VyHb22GU2S/OAXk22qsYv+LmY1/OnlfkiW2JCezvWar1QWL/Rlfq9boEzOhxhevkj8lt1zjb6gqmW71N39r5CFe83tjwg3wJF48fAooZ4DCXRVIj1y3aBEOKEzgd/qHo4T9fwSq/rOrLPFEMPqrvvQ8HWwYSq17B6Lieo9wwazcqAlKSQCMtdp1oguvj845u7OTDRiW22HAF9T/7h6CnzW/7Gb/n8/3hqsH/lYCcVDJ49OMj23rKjmVj/fNub6pm5oQejSImZzAr7xEhH4uxP27lXNmHL7gYP6VjXYugOuB4+AwLWIgPTKACV1yFgdxYE9ssPiFz5TAPMbngXjvtNfQvnDFVV3GI9s1t32WUusXn0xuDgLoEMU0lkNQH5kgEaEjw44nxA7bJU+7OvbektLc7N2Liw7z+pUUI3v9yhikdN/b2EKw8tyKvpcbYdGsEfrfXwiqNFC8GWiRIUCGDXEUJbQBkHglDsVhP/5akZSyqwXXtFY2rkns/yZbklRXnW4lxJMmb/I3b2NFad9ik+5CbOQ8SlqmEz/ZZ20tDplKr7Fgok5pU74SiRW/a1uUeKlDzFc6UObbcOj9kSysqpt6RafE3lMIiaFUxx8SwN+XClpQzsVaHEGc8GVymsXuzM+sUcz95cacriJouNh09wScdKn5tfFo1y3p/+pvaVLF3TKl078O5NT3vUJf7Ne1lsWjoPdZ8Qqj8twrDtC6Yrij/p0KSmfTMulET5/pXntaAoWi1+pr5kLOgTtfU8ihp60DVg5nh5b4dtIHlL1mqhKwfOn5u2mBnv/fymK0Ok0VISlCnn2h/dbHnSajc1k37j4G+9pf/11ET/lYNxTD6Bl/3dTszQg5FZEln6NDNDg4MTH3g0tcxn+X3+padm6alh2ZB+5mA4BfZu+ZGd8yS4O0K8fhgZM90YpCYgz4MdcAYae2B6FDK/Sv81URJhZGfHCdK087+7xMQbzeAgg9AcBPojPJ1K4EBky+BgmkCjsjFe/tHXtvSW1gFsOieiw7J1rVcDX3aoJoNEBJ49XEyzyU1oEd7hC3KTH7qc13HOb2KCq2ZCjOOyoVxr1lvvBku0eeXSzWr1NM4tfJwQGSYlavIDczJ1ZeAgBTAJc23U4OArzxGHDA3xeK6o3HuSA7bxWQSIicDEHohP5cfQmQggPddTqyvWgFtDD07lKvUXIvW7JimOxBFsBw+UPxLfa+vcLLYPT3BE+djJUIB944WD6DN1flOq6SvhfnbSGRd1bHZrsZdqADyYX9tyOnNdrQOVys9T+5E+mIjVLZ6q5N6SOXhbMGYkrGFNmpMtGiOrP1QGSdmyzGLJwZ/nC158BHyOppxdac3DSgvNSoP8PfvNr8utwcJ4nufkHS0rtS5uzPxVuaVm17/m88K9PgjFZ2XB0IMu4Xo7XkHz1Vf2QDutSvMIoX/8jYO/9Xf/11Mz+XcOro8emK122jlqv3hqFPtyl3iYyJLTdHTz1trvZaHVc88sydZB1mpCGeP5SBb9gJcP7xIJvyRVAIdP4/dUfBzP2K07+/Z4Ny8Czr25ifUhAXJsi3hwSoJidYtjs4jDE98DGTVRzuPNZT6/MY79JUAYRi2vG8xnGcngYAseRf/sa1Ou6hbLPMdYQZ8l9MLB33aJhVlaaTFau7QrlU+LwtwPsMKYlnH2+MCYkZRKChJq1E8+n4yJYYAJztOaU8Fo3hz6piwGir2TouTh3s7buxVWHPbWVpooZ221R4Y6HioF5Y12tr1CI7QHBkKAel994ifaB7f7TV8A1cnasTCWP3gHcoB+Ikz6E+Q4bmmj/nPiuNtWnOszrZJ7Mg6ZkTIkIGLjLVbLXeC5/B6d76yk9U/WixHdLxf2+XxWc5w0rJ187pMV2mnOs8XuyRcdQF0v78zzAaqHvNV+YMnHBiiYq0JbvG8mMRzA17bm/mBLHa7+EJQQ2saiA74lNca6Vb+exAwOBoCubBxuE62iTa1Hrw+5ZV/bAe5kmlyHbFXzasuc1+5b3yKCmocy77kQa+cwSR5WUSdSzlDcOLF98hRj/snf+K2/+x9Pzeb/9rX9zcGor+NR64PkTDtNONLdPdE1jy0MPXjvyr5oK3ym04TU8E2olllATY7NEW32swq3jQZAoBew6DRFng3tuSBspy8D8P4Xyu6YFZMrJISRyo7gWkjqtrvGgwYmHPSYMc66E8fimQFdLA4NfbQd02g0EDY4GAB8oMHBuL36Z1/b0lt6dgWHxzfm1OiFg7/tEp+Y/B1g05EqC8NX3rebxigUmL1aWbRxe9hFBBdJTij7nNw3RFKWO1RLDt6tSRr6gP6tB6nNVYziL1BFkktqZFoiLO3j2Uu3+7H6TD1TxhBYAID1aU81nhfGfTPjW44ZPg1N5VYgr+KT85BD6HA7758paX5AOOShaLvVzzhlLk2uj2XNtdSDO0TbZHzmtHBdw6t6P/+xxPcfPy/m2VJ54+P267bxXC13qIDxzVN+OsovcnqthOauF9Qj3x/cQGYi9ymeLXfFz6e7K3iFL4Z334OhOkekuDEh1M1KFGVESYQMwjoehSYNcbpJVODTN3dCWZFqHwwO5u6lPLxN1qVePE9b4cFC16rVW63ZGWzlbXGAtSQPzm2gVgW2rPogvReStGIy0uwwL93u/8nf+K2/+7+emuD/9rW9cHDTTs79Zu0pRoAncO97LzFc3vCmpwYH+xn3UlsVywz4Y2y1ahXfBYaja6ekk8ZlavvHV5dvlrDRX9BdP+sdmHPeXTy16zORuDtdyFikk7AJs22sKA8BNO0zvrCk9h9PDbL2nEAcIOnFfRIhJAg0pAEGB0VmkDY4aD9cQH/0tS29pToqDG8sW7naCwd/3yX+5u6HFtu4GyjzAtx/eWcugCXZ1o7F2bGf8P8AlVAMxdmaxlpiX084bM5oqQNWm31UaMDPCvXshN9QvvvbAqkl3zMCyF9TOf+Ut1nsZ1lPl6naSWIUSFNcCqKk/U5o5n62d2t9BfafC5Kv4npS+uLkgjw7sHrIavHKMsN7JnA8C9VLHXXZTYm7QaYx1370nGzztZIrqern4+1ZpdjpZS9soZG+4qhka4Ox3haGt9TBbqXXGY9sSEm3eNVcqSu+3A+WsMdC4ke9nLUqWb7Fs1JRZrjmSqZlFonxapRFJ6viwiJXuJ2D85YcIrUvzqZJ3aCbSpDWRWGQP8N/7IFkw6Bire1X7udVqabdrm/NqxwNihZzvRyGjRNpoE8i7HgM5ThPPMYmii8ZC/90+f12d/xPf/f/9rX94iBow2bS5OFma/LHTc2xwcEHXwHIv8vB/sdPlqQxnYDLrE6fgkbPHOAuvwXJu4wzWELdni0wGZU7uxGvsO0RndqmCNr2T8zjsisETUELR3ASjuf47XFRNvFTp+PDo2Zw0Jj5Uc52/CCYIn542VNjmsRxg4M1+Ez7s6+NzhX3+UUZTp1WLeEXDv6zSxz4WcyEYoQYZSMCvszfQCh1OyFK4THA6TFK24CP3woLTV5yEI6ikmsclYAg5Z+/Ihxlocj759dak2naHERFDQBHr++Yshp8PrWF+hPndNwPi3SXKPoV9Uyxs1JsA6kqQ/yiOhcU6cJ98K0riMP++nG5g9sFG9WDnfhizwNxnx6Jx1AvwbDPZPbdUIUSJvTUc5YrAXj1nMZLT8uemtakpEjl8or/fGSxjgsV56T83Dp6nAZ28isXpm3rWC+oCaRRKrjqCyCtwwG6x2/I331tpg5tw495nLprWqPGL+i68DjD3DJnu6NEYD4VMcQj0fTrduHQgJbuV4CurmZfA8pj8clx6BnJFXSkHjjaCnclkA2/InCtPIy2tiQdgiOZG1uSYTQLS86ne94j84u39O8uv9/ujn/r7/7fvrYXDr5NdqPllJOe0w72P1n35/FRemBoqxw0Xd61dQswh7+lxktPjY3yep9ViCc3VmLetIWacnyehDYBpz0bMsvk/nenp8gAgctCbAXYTUKxDAYOgyKeMkbicO5XX5t8oDrmfZq1jo/t8wwJuNYZU2DL4CDHoi6DgyD5/b89NS8cXHpLz73T5LRkity+cPC3XeKmR7YR0mRs18BFy57HaDmwt3cw7vASAuw4QjJuBwwOtky4sB2GGRYh/fNOxhHMN9g7V1VCpbtXW28EBYgQG8dITsHpnLCtZ8VZMufKfWrhBgdDxz0n+bxplzSTGVhbgQlYHkhXljkvWKaEOPGSi2GF+unH03YzQPn4B2I2vyAcsYX44bv17InfpSffEsSoa6vbFWzpxeu2N5pfsOqi1FscZnPmvvFX6eUyvux2H5b57NdPucHgMmspDoUW3fLNt4TDhVYRzImvhRKVvWwRj70n9+kCoYwZKbJDhTDOgiVoX1ismzFDD3oEUXFEeo5n9YWDpSl/lzEZM39eq5zzSu35TFneD7Zys3DzKrY2mIPq4/jHA95xrItWxU9YNl5/bNH6I3rxOh3wf0yKjX88Nepvd8f/9NT811PzBwcBqR+PkI87OLl8s917WIQMDt70Eiw8A/mn5V1b1exu6OhKFGdlOrbs7fMmCBGSX6Vc3vGDQu4s1iPI9vTh3OPdYaE16gF2lPKcY/1pYzdliqD6VgAiNLtDKUrIqy+nw77vV08Nk0RQIJpEsCTrw105Ip6gkLlkcFDM0gOyYrKjp9PjenGpB3HnY55x9HL72KyMxoefrIC3Agx9+WWWsp+IMdoQdq6h8w4vktMtGmEkqq3wCioLUV/d7txNssRcCtKBFz34krHgWDlmqnRRTbsJxQTUOeMz4k3ksoAACOpYXekmpmrDf0zF2lnxbs/gYAhgwXSaHEUUkqWrSl2ahoBXz/YiaGVVheVEHDTZqjArX6DHG7Ws8Dh64wRiz06Q7z6A9Az3ljaEQwGk9Rj2tQgyLSfQKJfRtx+2NwdFoVi6OGz2C4zSK0WUdqFdHlxT3+atfotOUojYpK+JLIAyd698Z7nyQqh8+CHiz29Fvp1XaSmIsVcxV88KKsSY55sC4+ZtmFz5HHq3YauKpGZ/lZe79uXgyjW65ECg4999Y4VTyq5H3qnd2XGJ6tHWD3PQRHQjb77lFxG0bYkm8+NyJh04zEjR+T+eGqn/sPCfmz8Co4gzPjB9SE/Tx7nuP56aPzj47A/g471P9yAWDC5iN+T4l7aCCubhYg6vTi/3k9k8KKBVxJ8x22QvgwCXr0frahTm6B1HtMl5tQy0myG7kCcBxiDW5GBHhN0zxIg1V9g887km31gViFRfMdhMJcYzyotBFCygiP1cMrQfmqaiYsN+zAkG0ZZ9bTo0EWrxC7KErjbqcH6UQ0e9Otd3Ji3Wkf6SnQVc9QPWfd3nne9ZZkl78HKbkes3YxUstdVpOhJy12xBZ5zS5I+s0Fwz006TpODsh4MYgiuBFCxigFWMo10hTDX8INx0Kcswf/lWm5dz9njK4CD84Wi4MtfGwLUdoJ+d9X4/0XC48GKSlXFhnUWQmnV5P7j0loJdYnvDa2EaUsL3bR6if44nqmIKhsAQYe+8TlNwaRRa6aWXgWZSP8D/THZPsn2hVDj/PM7nb0d1uFzOKcFS9rX/Yjgzz/V9Y2yALW8b9CJXPLh4u9EqqVXtp7UhD1fq80G4rk+VLnKLQ1VcqCvYahXhubv5mK30NuwfPMkQp5qsP5AyD+upSBIVpEa1uSEeCsxj3pq46Tn5LIcJlR7rPFpsqo9tLvDmvY5xV60H1tsRW+aJBLfQaBbEHsPrtWmyezrLWH/zlm5/ay8zFjDnwzA1yRszUv0991tPze8cfLDtvE9a5Y+ZrlRORvwTbsT2DW2VzVgfP5vwYYVVukUTi75bQAkSmYH7zMT4Svu1sMeL+F0PQxrcCAK+XYv3U9jj2QQyTst+lQnt72EWfC+ahNMBIB2NAwgnmIY5hVCOEnYrxHg3YBwd7Em2sJ9jP99vLrOpAJeHM7kMDhLROjpUeuZV8ctev1AGhMvS0pZrl4slCPy2N5WnORNBf0yT4BezMmpiNEf75zd9e2DQl81JJBgmGKtrwSnUqfvtXZyVHh+8y54aS9iFB8O/3ovGGF1RwszYGSRyzIdmThs+3G0OPVllwVa3VvO6grcfte5SHftmztxxjdD4TmzlGeJsr4MyJILQIWQnRnKPyRyl6Lk1I0oDM/cMCQyHr8ZiHUUtc4QheAHGIU+ku6PeR4YOE0WfvQ64nHX7IqHnSePb4ny+nbR7xUJCyD3znWurdZyF7r/s2Oalsgk9vtZrxN0yfwMti41xyfWSQ6X3l/uiZNZOsJVi13L0eoWutmf8mxsc47hUkvMOgvQTJtzb1nlp4AgMqFyYbXLxnBKpXJ2dHOeUAVE8p7VKDuSz7ZpIS41Q09K0DxgrVh2bZaajOHPGP9ZY98mPXuQ5bLv9zVuqtxnu74wFQw8mopG5N5H4r6fmTw5SzxmV/IC94p5iTrG8jUeGftVmaKv965QJrgKTSe6Br5dQWeNRd4Yw7z3KRAoMrjDB0G56knJqsGMrt79/lgLzWz4E3tlHzZbSZQYMFoNQEFZNp+k1j8Ly5tgXEcCeQWff+6unRk6woN0KoGGDhYrWRYkQ7R2vC4TAPqLz6FfI+bJLXACmrncGB/Nmbnz+K5//ubSPjUqpNPrFgj5WgqZwyDUK18l7f19Ci+j6xK6q9JR3v1rwwgUqSYqJ4sEmaW+vxdj/vBeNvZMZWCouc4kp87xscJBVTB91OuzPqiZ2ol3UbiPP0EjYcS9koBMnnk0L5udZ6dje9hvDNkMMn98oWbpKgt29uLgPoMU2yCqKg+zw9F1zvSOMjx5ONyZdeVwIWma1HQQl1AGaijTG4xWdwLhqPtS97bUnVQPM4yfs05froX2R8++cEe1u8XWqksUGpezzpPnTdhLNKh3j8eD4hv01p8sF/u7UdWo8/HIlfkTVcp+pPDoQWpIWaF4Zh3krFiR9OMboDhe/gMM4Z/652eJDj8AXY+YfAnU6j9X1rpzsvGW/+ccCrTCuKtIk7+fNEK7du93zptJSC6tfxU7YOcoVGAjq/OYtLW371SlmbkwimHxu7h20Y05m+Mcu8T8cHDJrxDTVdXeXHNwPHyEYZbB0m5w8rCQK1slj2RwoT8yr6ndfMsKa4mkaIHp2x7rmNwPkl266gm7TYNrzQL7f3dx1e3d52E1eWiSoG4M8uxvwJP2AJ1kNjf7cHH3r8uC0v0/6EYrFbKx3EuTMggmxbQVz0ERNkrM0a1970E0v4+Xpyy5x4oJ8RFdzjWUuMRrsZX/l88/y3Fp4DA8Oun4UCNhipQumWsoJdoDR6hTBtXyyCBSi0oUN9DuRl3cF4jwJczGUkzcejg0O6lrgwy2PcXd8ZzxXAYrxg0DNpdhI1V/9qs4HdadjsjCGwMvDofBMjUefLHUgDTRqwQxSBogi8l7jxnN+2t6AldRA/UhYGHm4cWjzMtX2s7j7HuS5g5ak+zGvNp/3QJsnklPy/sx7TWjSK1wOsFOfkx53U3I8TU3Q89MAaT0l1cxQpqESY70azqz5InZW1M2MOTuPc7Wrizebi7FCAvbVpinrqjcHIbpNat08yH4f+/0tJb5KdtrS/byvUQBtvbAnqXq3YDNUWxRu16SkrhhnnbyZW1kwVb6E/QB5OW/P4xUg8mpv9zhW5Ufa9knb3+LKNF0NhzhRge6fDoMBKthhhH+8pXvet2a/pdEPBy+nMcZucDC4WGbP/vZe9L8cTCg+2zUgzuOLJQfxD0lRKmWGyRHHkZUd9zRnpnNfIJzN0YMEBU5Zz8j0JAAR2s75IL9iCGl3UFrZhhzs4wa05aMi2/xeHQZuHjErt/8qcXzzgHixQDphHAWnIxyMPZPmlV2CTdLxpfbzbWAEOnDnl1Y1znp7YbNGScBnb5iGrsavXeL8bOmV3usvvdJoATaQEQR7eWiZS5ycFh/mK5sRnIL4OD1SWxQbDFGK0zNQJaRkk0NI3t5h6BcObsYJHoG9rhBK2Q0ORoBxVlKUe2ZdbsiLctc1SjVIile1QO92HZ3XJUOIr35dviVGn0mvd6DOyxDCfqGl4cT88A1ykOy7sWaedUzv7pz448TMvr0N1lAZz+WFehZZyWZXGu7iZD6lAu42gXa28q2yTFnMB5stXat27dd5oP5JX8C9ckZRm9Th7IhpiJNChcrD8uNnS7VYKOOftm3zbBYK7N6YAfxOXyhdPRVm/bxdv16Qjzod+AqWIjydT+HFrGXv9WuiDNukN46QQSss1vITUt084O9sJ9pyc2VwMxMY+pDIlYbSXcZ3lBu01NqHz34KXg1J7bDWMs/22Svrq6TNHyaqZoVAJi7yoTdPKFu/eUvnRwGwYUyW/gkT3ep4VHFicPD3XeLfOMg9L330dCQzz2yoFxigdePOSM4zT4+DGytLb+mNcY61QIdAxfk0Y04/E8Y3UQJIyU9undEgy5mhyz3P2Hq6ueUFzWnP2QzM5uI250kACbKRlbEUMlGEcRTUbTupIQnn0yzqXzHZ5AcCkF0fFsmE8XesfkWYEIIMgkkU45u+sStHul92ia/jUY8x11UKxlx3OP1a183z/TOPA5rtOWY5jksGIx7BxX4LNeWw4F9dFnjhYzZYAZxrE5cutwrVDWChCDia5Qd+nI96CHuMMTgoV/2rEU7srEs0VixanJMTxq8XlN2Dkhg9UOlFs6gJ5qx6t/I55FDa3M5bGyEqeyK7ADi7dXT8VAWY2t07yjw7JLP6Iz6bpjOdM/za+L9VAhLpmVKsHw1HVHns/nR2QMe5QsJiygNhWM8Lg46jpfv7V3VyoT0KfO4y+zyaHaV7o5jAfN45WtezUPnDkTwv0oNKad/RyuXCjavmVjw36PiTN9JSD5I505MMn3oORNMAw+9uyYpkxXjjTKJzQYG9SjoGTCxELN+Z5xUrz4SDFcuP080FT9XUNNooTR3GWedvoVM5I75NQj6/VlcG21wHxGC7H6tot273gU7lgQfX9ij4u6fmMAPk5jFnwHg2sqPgWWP2sIi9/ldPzTg63X8Ai9gsOqMhZZECX3UDJDjaC/8AAxQyjbnelcDAl7wFe6ijASyNglvwjjLlzYgLMxGbXjD9COyYUD0foPt7+zTv8/KsQ8vtO3fHmV0fmaT1QMAUDroQrE6Sya6AzN545l9dDBIFt8lxlOOwFdaHSS1zXoTt55wIYcZ4OVMNPai97BInTR+bv/L5PXP4jKqb07vFpAsa7kkbC+vMb1JePRFix9VkJjD/6vL4Jl71coFPbladnVIMUCoJdXMo5B4AmFPgVIVjxZDLZHCQVj7+tewtZdWA95swyZgkh78n0CMt0vxIrZVTWU3zfRAaUOWlt7R2v7xMtLLA9AGeYhCip/xpSdnRCsw5zjVnXKMqmVSZzL+uTXPC8P3VyrTz3G3PTlYWNG+HHUSxk2KEchK1kbKgCHLvluN161ol1w9oP88sNwt+Onw6WQEX7Q/B7nP4KZuVYjnGeTO0gOVKzVrT9dZfTatFqliODA4aZ512iTRNooXOLfY5VMXHvBwHqk6NM7V28DwYu2u2sQrweXPrTTJGFKZbP/IT46zLR7v8AG+OS1b9MK9VeTr0owAmpctUoqY9Wb1mKEm2g8qbm5LU4iZpHev4hfFosQb85qkBgeW7gu6+d8MamGX6iRvPKP6vnhr7OOmQ3mCAtMz4Bb8Aickyn/9vb2k+EwFL+/hJnYyLFXSumYAxqpH9Jx6NmpyTsj3iZOYJPqCtJHZBZBqEXNuzAL7++cFmLWZpgfVgK6ZgHOV4e+x4m4T9ZenXLvGuanCQMlNSk+ubf8vndywt2zXu89HGH/n8jkze7JosYFC83pMrWcB9mU1HV26tkoz6Py5zqAYFZbgGRIO9zXCsH5NCPTUwT8vOMkZLSBNSwh3KGl+ntCFlfCitqjQCfC6oL2/M+0qw5SflnfAJfSLnJNMgsTLyEdydX1Iqudut0bgv1s3TNUYYqoQ+pIqYExe2HcDTJS1XvM+xb5Gp4kS7pKruA+88d60yuD283ylnu7bnSaDO0ia1jNvjrx+eaJQp/ggz9dorvsUEKM56527KetFkN9cHAXuW7HqGyUWhmVLoM+MnzpUGP2q8WfxrkXwsl/c/bFuds5xWWQPMcfm+A+BdtGOMjXOrcK3EiHbV/0NtCsaMxNQ0cWPv9Z3xZ4/Czo1frS+zhvwLov6khO8Xb0K60uJ7tza+aT+W9VJBg7+/+SlAWBiP46GaBPpFVPFzMJXMWavfxosqRQzYSSqqfcCkWT+xuQ7/T8bCv/R3/xsHpWWezIJ2IqPUxjJjAXoEhj6dmE3LVi3XAuzG/HzyXTZ5J3z6I6sBQDAFQbPkyvYITadxpA+MPBAaN/k0hw2MlmKK3fzdFUb88IpLgvd/qk5vTgWDL7vE5p1BlzQJJIH4qfs/8/kNDi6WVrX/empalLtShOejawivtww9WITsJxezi62cmetfucMx0RqWRyHAz/CZ1GqcSRLawpNYIQfk8tnQKjvQGrq8O07gG2cpRrrXm7yC4nzDQ9qE4zBrThJ+ulDkOz6ZmfQoi/PuI2NO4vLlTU5spcdU3TeWoUhZ+aC8S7BWJ9uj98h6nFGeYs/MT9jxzgG1RSR1So1EX2sx3Bvm0t1C8HB0lhiNyhptEaapmetpDBHgbfIEngNsN2E1CZYAjE7YCdxqZTH5qkUx49yz5j8MaaGnQ1KbQuzl2fRaLAta7fwQnOkGB7O1TsP4j1W4tYXp5bC/6ygKTHMzrstT8e6V6ZfvOH4WweElrRSxBQdl5kBeGdj4cHX8Q2sgk5X8SyBDzOBgVasBJ7ZmP2unaVjikG4giThjoLeqGqyCy7nS85VlXit3HTdfQbGfxPGvm45lt/v/ZCw4xcI2Hln8n95SQw8aHCxgVHDGrcGjdJcZBAL7eeaz1bvMKja5UGN+tnM2AlLA/bwfTLOru4ovZZEuTU7Pg7ZJMs/76+leeUsFbfs7hMM73ofWIAEah6KeiYlm9YoALHK/donXXjw1O4teoor+mc9vcFC9s51H//HU/NY/CDjyuQfzNJtUdmtmd7GYZvwRG4cUlYo/i716coZjdi6Gz0R7rHTGmlHj2aBIdfaRosNJnZ+mY+I9c405w7iqbHPLvjYuZjKk9Kvd17GwIlfWLvlJ7kpw8EkeyCz72irWgG2uaaFjsSE8rbC1Hi3L5NnCacEV6S/rrLPvrK+Nw2JopBTmlPTF3SvKxeFpAh4Oj4bVLJKzrR94xmI98uwj23HynHASvYXBwYkZaZFYrh+uTJyP5ayFajUHavHaPXvfaTur42N6UHi6p5uCUs9nn/Nlenw7oelG2XekNjupjbyNiVDcxd25LRQle1/Q+sC09NFjdePIzOTplCF4g7SCGXpQZtF5LIAX6VcbMz/b6rL2H52BwcGB0EUHYtPXduqHWJpCrZLJwCB/6QhQYNZ3OJuNcubo/OJQn5FwcJ7aiLYx16yz1zPX/sxYoCd7n96iWPD/8pYu9aD00d/T5rHjNHQDoMOEzfkRZkrXZmU0ggm6ZczPOuG2syAzsyEYGcfX7FEbfYJ291Rkl0FinwKIK1HMAEiRgldmhT0AgVIonpA5VhUdpgZpjpYcv3aJ95jYhon5e4fqj3x+34XwwsF/PDVcFnJd5oDhT92CveTzz9KK68N+kszGtQQUAuMpbQGEpfuPp987jBSEvU7J3wPEjjcuLTJUEHqvOAfximCO/VBBhLc5GEZGKe/bTRstPT4s7wdpy0Kmg2G0KSvMT5qNvUSzGh93iSJdfakGv3XD3zrClOytM50OcTdYo3qYSTXVHCYOyhNwaRxlzG3y+bVSK3X4Q/PB3YzrdonLjxjWWnUQU0+HnGsc97NPxO1VmA467QTaWuWZPFv8vLO9M4vJtW5glSmnT0szll+UWpkpf5T9UbPSemnxqWzu1y9bTrYKHG1tvbZKLbW7BnQYAtbj0SSvKM2a2ZS7XrBVVA9/A5PR5W0pDqi2vd1Dtso/yrs3oXD9MyzWfYpUf8ovvaXRHLTgk45HpW4/ZMTRkx89nf7UIQIj7niUlvazFW1vUMrnatmDlIvrRUaxZdZQVHuD9f7IWDgx1PFFMhH9v7ylf3NQ/rQdjU58k+cx7ZSmqfjws+W8WAMclTFuM+ZnKCNDO2NXDPrIIng4kkxPYyuJnM0rId4hmvMl1J3ddVYzubfKaUfmY8YVAjHK8vat09PgEfxcMwdfdokpcAjHUXC5QxXh/szn33L/4uB/PTVLDub2xpf15S6xmS5+ijs8/b1UpWZanCbvkZU5XmPt0MzUsnFJQQnhUjQ5gVimqaqteNr16KPou5jBwQd4deiRlLCKbyzz+XGTLA38nBSVGXtsbUKP9bLx7cbF/DrPTKiy9XZ3h3r0TvkDaiK0LBNqGuooglijiHnyIRsyMd0jGEf9BwRXGkgbf+29e26jVSFom8UYuDvs+vHQPiqHPk7sBWZIDRmWnepL05CZBZ1h46xDiNqT7SsP0FedQXHcWWSNLyzYcu1V9AzguTSF9CYH4BXVdHX8BmqV84jwxqGL9SsiXx9PqKZ5wv9kzjEdEvwDqmh8KNec0Bfl+++mO0EJY9SmVajlNsQ8n5fruedQk2ubuwwfqk5oqSEYX9jWQKpxsbvNuZWqar51Y+bfopstjG6npYx4m7wePoLDXiKd1ee4JWEfxRaur9+72WEK1//MWNhY3h1rnf/LW/qrp8b4doe0pbd0EQgGxzQElM3KQc0S1gu09WzDNpcI0JeWzfuXvMMbjELUNuNYr1DurYDDFzU/eQI2dW1LQ+wJ36y7NU3BO8kN0zy0YepTGDAuqduTk1+7xJ7H/798fkN6vHDwH08NJvbwaD1rXXt+BO36TeoEfkw493LxjQ4c/diuUeOy0MzKQ6u+JsUwWlZOp6oUO1dZGCDst4tTbiwTsu2A0qZAljPOJIl7Col4yh50QuyvrKE1M+McZwV8z/227VnqwWsN630WOu2ZJsKjqAT3LN2VIQmPT8UZMwZyNMRWP8dP4KaFUoBvloapuCLGOg88wIxp7n7qqVgYKCyvjAZT6kO1IoxVxTOfOehGzuQleZhivUOqFzbTYly9o8VMq9/KDW81vD4/ZHOKqXyZ6u5kBx26cndLlLNv802BIVu5XHSZv9FbzIVH/0WAyQ9M2VZZMYbAg5cjV3vjaMqknZ4LCs0vd6hu41C1KdT723BNGOP3dh2jemcet70v18Hu/td8PgS3a2S3vZDYanNDIBTjXOM1oACmRbvSzJayF1fvX1dLi8nQKZgmaSS3SKm5/p8ZC8ws1bW0scD/5S1dcvA/ezIP50EAWTwodmgqZwsm9vaLmaF/ogNtgDrMxA7xhWJ51W/yeLfs5DCoParoPk2k9767rLv5UDpR4GC5+JjcwHeDQCztXkEMxuGFKBPJKr92ifehTPc/SQjoH/n8XN/6q6fmH09NYempsc5zZSjwTQeGX3JWrGhwUNCj97br8AIslfbMUS20TC7ll93u797G87w8xM3iJANKLkMPhgEyGNoTV5QUwZs9Fhn0SZvtDidX9nbe/pwY0HzYdYKlnBWItfwLOi8rnWv627wqgkjeXoVmFFV9FJDeG7f727NxuAHbrnaEOR/YqWAKIWbVgrX9IUs8EmiS4qaLxh0WRzjBcnhtI6t0kc+86rHQ2a7ciEPkHPHgLC0mDAlPB4/8TJ6x5lsTrvjZebrRBBVSW3c2ymm4Me9gDXQo9/SLwZda8u/9uqR8z1jFCnC7emH3yw21uwV0sCjcVsIDfkI0q2OLoQfjBBozng1c4N8odAUYLnOJyar+uNyhEuu0g2r5y2RTrPF3zLtwTpkoyZtgiM0dZsR+wI+un3wRTZ0E9fP2uazTo0Z23knS23pqM/uekcinaPqPjAXzl564SGDW/8tbuuTg7O89mUkSj914OGjkc8yWuT1F1F2/sooGjolInNyeqo4TiUW50GpChzHLbhnEt9DdITNa233IQPtEFJXTtxwQmUV23UAUSlpY525VIFjwyBF+2SUmzcN1zu7gWIQ0OPhHPj91/4uD/3hqYOY//YO4oQd/Nsl8pWAOFX/EmVTTYbOKhQLtPvupxKIYYFuFxrjdNBfkeR8XBst8fkTzzycxRzDMcltzUUYfTGsTk6qECrz7DGF4dx/nt72yEPU0rbHr0TJMJLLaLWkdg7eVnZnrcGEiqu2CcAD0WMFhiPSyiYVXjFPUvxHL9SG68L6qNZtXVC62YNij/QsuXFT9X7cEGL7W8vpEBqP5UMOyMAdxM6kJaVZs2k229Sdm7EQv3ljDnJqwfTOHyTt00hrrHanhLzmyRIsiOmD4q+YvVLmFUCpEkFPPZqssINSBQxdaXDjWqg60uoiF4RaKCeU8a4gastm0JcQSGkVPv/wUyi2tcveZr0nOcF6PS/VsMN28ciJdGy1U9nCpycfhHDPRqGWG5FPbjIPf3Cz0hHPzRYRrRxrz/Nnsdj9jJand93FHZOHtZgdh25s/Mxac1JRmo7P/01u65OAye3Yz2jE4OE+OX3pqZoHQs76/kdfNKSBrW8g4u6MfOjw5FcVdEYRKpMDgzOzYCbs9Lvk1tOVzeCAX4CQbLLg1S5jTiW+TQSJqjm64wFBzBUyOwuC4TXj9pIIL9r93qH7L5/+61IP82793if/21ATurVuzZS7xFLdNx8G1Xv0Bk+/Q8U9CEkfKBYUMFLyfje7KAWEaU2xx24BG2xX/qlmRXG80Fh8x9qOv5+zYRGtvLIw6u9LocBWXgCkWcisOuQ0RqudUEEPNYyaGV9WNU+/RM1LXJvipomZuhadkXhP3R6HG1cQeaHUoE0Nzor4CPK90GAT+cogMmBApbduk3bJr6sr5FyjBe8owzY6bMkDM7bIyJazys1BFid0D05wXC8/7rmSAOe+kOG/Zbwhe+SftiefKLf/41iY07deUbkoo9xn7br2XKtR+/qiXnqytZieuN6RRsGlp2wctP1/1OQ0O5l3ZuSDgV9Z3bhufIYv2V2wffWV8Yf0tfah2hTP6GwbKNKTYqp0+dU+3pUrvzO32jKU6OFz7iuQluO3wZ3Q4zPr8bvFQoCp6X/kBmZUs15oWajMa/fhXJzYCniAoj6SPG8/JrDZL06N/y9zr7a28hY0/m/w//d2KwUEpMH/JKxgFl92UOnT24qlpQJHVH4jFbALlYgTw41GPj01LD13I4Quye6TDdpvZ8u7T67FuPmvIf2OSJLxBEg9GPN5oBEJYq/NDjoDxboK0mYi/vaXLHSqDg2EqviFW4LMoj8a1OrqS+d1TUzenlj01epneufAFgrvZZWC7KexA46KAtfindBiOI8EVRZMGDkFi2lbaSUfle/jjgY5Q8ugOEWEAlPJoTAIyrD9EkQ4FK0lVxBIMK9xmrCUow/TGwd1KRX3UDpwgnl8B2uVIeF40OPiF/E53BTCesxj/QtzTz4IyO/K8vXaxErKzzywG2p2/KiVxcdlNadNjCQ4bi4EzMyd0LmsURlUsR4fbJBwaiwdHELM4eCbqyQ7Jr2xwP6s7GeMBoPzWANNpOfILBsO5o7uPrZBQLV46m/0nND91TPNCujnWN8TrvWXGgtv+iDTx+2YTqxUv3O43c66hJfZ/5DHhDh2E0nw4ZDwbm+LhXvIRHYe/Ftpy1j6QKxprOfTM5AqsEQfvS3KdazGt6kRuiXntnrELYjkVSFLBENNce8gBlfJVcvhRh1Ji6SMPBl1v5v7I2BtglFrguP6OAcRpbONb/18z9wKhixTIVVPO/+3vXnZTsuMHzG5wMD3P+M1nHmfvxVOz5+Ba5ngAtMeKpHlMBjk24F+JP2OWEI2z+mJrbl7s02kU2TdRFscsl1nBigEyhauuRRDzwIwAyle4IzRmiM/6yXKHFPT92qGyTTgODYQHyBkJ+ZJqHcqjhd89NVMwWzJFzm7NFvmzeZmdhY1LHJ5YbCWVTr2iIw+jRdAaXyHFInBuzEhCKAi8fQX1cQtAt4J02xhcIRN33NTUMPLgejQ+OnysyGgUWJucxPymrGTnJixP9TVeoXEJCukrzk8TWkN1bFWta1n7jFC1iTP+ASZG/FzKvJoJws2zCuoDygzW5bv4h0gM0/zyjRY2zbceOmg0SO2dHrTjLQ3dRENjzsp35jkFLHYf6pYRHKgNlMdymqnjDqjpjHNj0HLhSWotULSZxE4ARYHoQO+ozT3wvvmuXC8J1fENlMRzNof82I1Ah4tN+hEdqbvvx3zrs0MzPhSSe4rz94svAXHgCCapaIShl97SLnP33XX2kkv84bNYk87IbLtW1+FnP3Mgu7o2XXv0nwnNTt7K28JB6mp1OfOHiN7lRVFUL/P2ssjls4su9Ka6m04Pg5bi8UMEnXpFdfiwMP34Av7OQW3GOKl5ZoP8iAEPi1iE/d/+7mU35RBai/TTitTLpHfLSAgq/vLUUGXfhcKixjjo2C1pOPv2Lxez+2BzmtBdfN2xmYn3d3e23b4Ei7vVgtkCnT+YfCtrK4MHP/xq/e0oVVHR6K0VmLdNSAqKIZj57x2qAIVaNQDE1SydStRedqi+/u6pyb3k8yP5+pVFzFUBYjonuCcqCDd1ugifWv7yObRwd7ru4Efqhl8VZYNGbIiyO4kMY0a5wI8ILrVPKA7b4WwPK8fsGGWU3feMFj0VY3RSloCAX7qwIYYe5LQBV+Xn7c+M0z8T7ve2Xjs7UxqxHcuV4muFDWW1aXAaajie7AFhpIxaCQbId52dRUkepnd/olg8POQs66Z22D1vyoFQKRLeHazGv80HPJivWeX8s0bOZ0Kt+GbXPHIyUi6yQ8pm5gqL0VVC4rJCFF7Yg3p5Ig7eF+s5kqs0gUD10+rwNDfoSLWfPFHJnan59kJt5SiNudItg0VJJPy00sh3rFLLoMeB9e68xS/14HJf1FW3T0J1XYwkkQ3um09X64Oyg+zg1F8tWqwBxlk3ryp0N2AH8gJ/j+b5TKMjFqINvPZlkSXa5sGlCZkEN7hejBgfmXsfR7FhbQx9UEeGHvwta+i3XeKE5dcu8f/2dzsNDjLh0otvAjCNl/l18PjFU1M1rW5tzUEThXJnNjCEb5jWEMlJjc1uj92VfABMhQiU3iMDDm0za8j/L3DvZCsMsTEL5wtGcK8kbI9Hmin2BNnFXcWEofG/d6gkaBqCM98OctAEo+JmtYLK3O+emqRtzhX2NyYlWPlYtVj0HGPd37FaTBgdO5hhoZsUKzJOAoaGE1sHDAiDkLbtVsW5HWCFPi1fWC4OhI4WHF1bRbToEjtoWgrNxOA8Ta7LgiRWkbVgyCda8iu0PDrYfo3U8sKI27WF5sbgNB+HwNBY7TKv8e+xjlgPL/vajBmpOecV7r1nZF+Ii272FZ0vixshNVz24wIYCrsFBOMwPaCuk8lQnK6TKjdwHn6w4UNTm8nctIXF2115hmW4Z8iLs+NXmUUoRPhXMQbJOwwRylY/J092LOZhqbtuyg+mpvp8Ea2jU7yHnBHf/X25pQycRN7P3tEyhvdw+9Z8zNMF1PoDMfSgTkgDPq80qi+eGraq6yqgLr2lBFvThitHr4+Zx/xD5c3yrLNMyJZfCXFZTLq3oX5dXZiSRAge168r9TKK/UzZbTiFjGPbnqfIBJ2lI7/3d/83a+i3XeLA4tcu8f/2dy+7KYOniWj6ny6S3vTFU4M7qRZHZAivdyZDOmtfQaSkofpoPkyCa3Hb1gKaJ0h94fJQjClwmX1YWZ9lIB6JgEMpTClmv5PJCTvuCQUM4rI9bObYnV87VOAXD2sKbLXskyiNBoQucqZe/+6psfWDVdPZl71pv1s0Rd5ew+HxJxiMNnnUlPFDacoxaHVZZfIjm/bNLK4aG6Tg7Z93KVokZ6tLgWBfuMhAaKxESxNX7HiOGxyMvhr5KBZtEyrVgxx3HkUBEuzGWZiWcLmlbpfyYlQvrzwzOunv56LHkYWStXcINTp3xF+bca00YNzumdA6fcKndFGYDufa/eJTxJmnleUdUNNu5toxOgDD3+5iylgdfjqXzcX3VE5wU+DsOSzdTOCibCbK2zvstJk05+ZxoifbL944sVYv8faWL+uf8ovCCF7kshP5Z+6wRjyi89DXQt/A8YSoaaLlyLZLVdsz4c0NrnJXZaLuE6J1c1m8t33z6+W8PHifE5YzklCqCPDSIzZYCLXNt2Tl+a1mnHVaHS5GG5a2dbCoioRvI/DyfsPGQNxVzGeq04Ns2fSVKalnpadZIeXcGTLcm7lnw1AO1MNxYkQaevCfrKHlbek2p033WG5Osy+7xBd/9Hf/6qa8gP/6a5CIAAvwQ2Cc2dyt/PLUPOS5vjNjp3f5nURZANcsDy56P6HYLxbrbNC2D5oH3p2EY203iDjw/L4j0fXsrqMYqnswCOMsjtSjgLy6fDccdKkXT03Y/PcOVZL2ObcEIk4+oiHtBzhWc5wxJv6Tz2/oQTxXZLBejsNGOSQ+vLWiwXZo0d6xkhN//GKtwwGm+xPLrC7Ms/IGR2jCR1wTS33qJZ/fGXtgzV5eOSUlKXbJxcbPtO3h8D2H9VnZnpDVKCxzS5vmVBwL98QPLJbPScr7vAqs3ZDtfk4gHvbfOzxjYbJ5rJqBYzmLV0jx+YWDtkJ8qlVD37RmueHMrk9V9Ork/V2nIAS5HQcYw20LfzbaGpfUgPJW+6FY2Jmnaa0ybZVc2GlQZXbm1w7ypb+7H6UtqQe6OmjkkYX+yfpm3gDzxSGea9ZbmvqyX3fqOtXLC6b2wRwyZiQih7bkl5d7lrltsKDFqv+IayADZ35RVitXR4ebCz5KAuu2hiy6Gq1Uos4/kV3kQvvhGwutwcBWReb4vb0qLz01F/ZkgFZVO4QKwc/q1Dn7/+h676+20fZ5WJJlyd0UgwEDTkhC6CQEQrIhG7l3W70XW664go1xt//1r0x2n/C87+f5dU8O56x0+5qZW9fMaI6RPp572xbFHhmyM2LO9gOn2iKxqJ/DwOFDnK2+yhr6x1v6krEg/d4lFl/3d//upowz3jnmlEa5SWaZov9l7/nFU9MwY9SdHYRoBDg/HGXYiHk77nVwY86xKe3sUC54Gkx606ms2eHvE7ZSCVNlb9jM+V2TahIDtnAvPZlpBD4j9x1LT40J/GeHKkvOgox9jSuYphicOz4sgA6i/DqfH3EVqgx4O7ZakNIuT1RhBZYsY2Dmvr17m0CALebLRqSkgIVikxfD0V0sctFzKsIEVxQHIbbXXJwT5ZSLq4OfiZ7B4PYt0nhki8THcR4IUUHmK+VYpjSP+e88uPSWClUheHj1/l0gr4Zml7bwc9XVeS5EDQDSlMktydGPfHPRsdSFBW5NP/FIDFn5+aEgA6Xi6ulgLp9hA1XBOR7im9ZlnsyYHkUYcqo8fFpTRsltaG3Hjt+PH7gvuJNu7z7JSCdGwzmV4WjnoNNtlifvykU+8atJN2qlL7/8vs4z3gB+Wlryg6lFdyIt/kFICyDxo+EUOtWBs44sd4lf7sy3duZzvqlOV34IDf4n2uPTuiC1A85V3e1R79F64FsJjBTfOKT7JxR66e/mjVnnkMO0Bc5w9UCMExpmtI02askgPLqOtZmF61Ec02PmixnOzQrjZOimm3C5pwFn/+FV5t5/7syxVGj4e5dYfd3f/U83pb23o6rDNCVdJpzTxi4wffHUTPviPcqF/aR/JONjSfLhoSAATXfBjZTTt2OCLk1D/yYQcu/QPBv+sRW0hCbhtAcNAicaB/BLT81II9YvI3YrRO9fTCgUYCQbw9c566+Xz+6/vaV2g16mdDj4f+bz0ykF9U2fWdwUuL4lzYUTqRfukJIYzRXlztf9TiUSbK/IkQVpdXdEpZbderfpYkRk2++KyJEN01xUTLTI+xZO7hhRDRyMu0MITlN2ddlTs+I91uVIqeSlmeLrW2JHYbNImo1zdbRV0Fj8Uav1++7rb6jxUkbSwcpQjlo6dCdeVubBDmVrnMT0SUsZHOb5eX1ZzDrhbTD8vlDsScg6S6qjc4VdbOCzfCDXvHSb++0QPZjYyCKYuVukIH1w+8Vno6lW+en0RrPoV0VAe+I70dbEieavGwGC7+a+QmaywDnUmjZ1v7fPRGMwKjuOitC8yqjN8UTgHpQY+vBWEgeCOqA4sWU/IwrPD8s9meX3QaWR+BKmCk4hX/SQHQmhGUt8NbdMKMToJCdYgFbraa/ocu7vMM98GViDMox8k3kKlYLDcI/hTN2drPoctIzepzh2vg+S/8NT82dPJhENVraw6ALbSD3GCewYvZjUgCGcT5qbZUSmeLQocWYKkon1W8zpk4I78G7akfvbvs7F95LosdsbRezbtBuwbKNmcKeQgfYAwXRCOrbWyaWnhgcn926nvM+BIHoyfEYJ0G79hizCMJqJGTi4vGbx6kSRrMFh49FhbPs3Dv7J5ydjsaEx71r77L5LKhVvmWOkwErWfQB4TrffdOwKTK07zlACm09Fz6mf5qlnQpRpITpNS57ep0ic0MXgyhMpJmiNRR8Zu3NxwWD8vWZfactTuEgvsSpqHP4z21mMQ8ZikJuqkv2IKqAznmD3PnCQgYNrh0otd6M98GUFlMYxEMi7BgGar9dP6NbzJsBO+iJi+fLxbqKr94/LTq6JwwCfSJOek/vIR/xkPmGRRAdW2qBmcVipvsnzcbFJ3fe0ysn7yrj4rljQG8RQR4rtn523kUK1Jw2+jvCiRSNFk8rfnZiW3e50Y/OL8JLHKCSoDkzFWlfPxqyraPf+L1obYVYlJhGkDrbfbdoMPVg+trUrpI2bw1rH4PyDHsj85Z9zzepgnRDCcdRuqLYybjletEOt5+D3T5ow/AR38EGxSGrq9HMQKD/GncPCNt6cBlTtIUHU35gBzyIeZSb/w1Pz6l5UHu7uv0MMNBilvroXcRc7Djnux2ayM4Hl2g9/WuxAHpIBiHunI8MF4Wz2x5M6hW3hDcG372JLOcizU8YgpGSyibNawslAHpjIsvizKi89NUNTUwSj4z0Sg5iXvjYixJkTKmzzaoKBgy/XLHaIKgB2/Cr9b9XdBvsnn38kjfzg7cxqjY3V1YeRGH+r0aMkDJ5Mv8qVQJ3LOsRQzKGwprksRc0JcWPdpvQIKSBvBcKRZzfrmksK/PfRgZ7gFPibddlTw/f0vhApF6Phi6ZliylrGn3Bz/wDZ2+SF4aHZ4fIpKiOgVsLEB+5ps+LWOR5pJQyp5QD6Rl4WbEbHIjZpFWD7plWDr4/cBJk3jv29zQC62slU1WBxmOHw1XH7yv9yPeUg+QyQ602enRc2yeKKYMQd1ZDWqzK7V6jXED7c91KQ2OabxV3T4l2j1hmlIkNy+2pp23WyH5ypW1SvVw7EGzyJTFd3EgY/1hsQgv7C0ei02oD+LjMoVI4ELUu7wrgLhHIdSNRdhzeFK+ZNNmtJ7+XnbIhPfBaeWrdtb1JEHwssH1oDtN2IkRPiF5Fb0w/W29GHahTG34VkSzIDDGy/rgbOYUxqtVPbqHTxORzLxDNzf7/O1T/eGpe7cmkrfh5BqTKGedyX3T9eVv1FnLh8i2El1ockKwB7Pr2vPogAlPcoMSxILnzmPZQnGlr5ks+U4V1P5XcSTIqCqy0gtbweD35bZFCxoL8Yq87KZAgMlLMrh2cfabjdjpH+XlDSmc8vC2CUb9xUKoDN+hyl1i3BHK/cfBPPn89iz9+CaWpRgT2gIeuoqw2gkn8frhCFDpZXdqj5MUu40gPlncFqBKGNCs/EIOjFduvc0GIkNqqK/JM2CN2FgP2CV5emJj1cUNZEHPb2F8mqbouIrEzz8F8IDa39FXGX5CJ/XtBGY81Prxwx9+UyNF+IfYtOdF6H+5JFZ651yp7NEaTyg4cDgAnLL2oj+SFWlB/Tc5ij5GhuHVR/qe/+5mx3faXF79M49t7WS0Z/yudXZYPSrkinfirUc/nwcAyj9E4G2O6/gT6PW9xrANO94xhrt51F2qaByKsP7wqElvxuj6O/SjhYZ4OpBpAHnpvg5i6PgvsHM6Z9sGAoetAgDMHJHjhVkQFWN6LxliaYgU5qN39mB4v519j81JrFL7wPK/EDLQSWItzI8fQTT22aS/Bls9NayDUeBPf/ruPVsK2dx9DJH+ZAVv3QWd7QXOfZ76sOMhY/tcu8f/VyUUu90WHIbOrBi7Mt+ljTxNwMFTiUqQMYCNApMCbdkNRUkkzQLQFIWjC5wtBY28MtGXJd0PQz5ls9Hka2SMDrnFMBPaW9jpjFAzyMpzIsigegmwyRICn9ss5GKTBqBVAIi84OEAncudVT42Bg3/y+aegu2y2x89wViac4hofEvdneH/sF53FYLUYaLtIIZo4H1OB4bZrbektjZjpDW6gGX+Zi6RlLMrOVVviTYrFUC548kSJy2Ip49FZb5F9CquUtLcnQwGyDKkm/WcTVScKBmiOFcl9Szrnef7Mgx46ixMBvf7KB0Y3WjE84E19UV7AxLo8YHgsDChzKG9L9ObLDPZDs8FY69xPROptm1oZIN4KbOPb7ayCD4KU1FWBki4WbUCh0n+wnby9Vg2qJr7DzXLTUiSXsZCd/EC7s30OCRAQzTlSMbZNxQuASbw7QQ/1KhGiNm+Ve/ijwHcDIl0oJJtfnLb0AgyQ9dUQ02O8PAMEKM55d26LB+raucsAeqhJV5dmcHlQ/EJ/H8cDNGSgVRFMo3YwViudftvbwgbFcn7HhET0r4Br6B9Ki9zG9F0ASM1jznxj2y4+Bk4Li0SA/l+7xP/398HlvqgFmcaDHyYg+bNodcxaaFAZILLdvK3kVTOPhiC/bQVUZyb7+nq/6LUgejjN+woYvn9P+R3lSnaDSGboeFAzLVKOpaeGem5KSOzcN/9m/+98fkN6mIXobxwkxCfc9qqn5vvF63z+Z1goj9BQJWN1vF8kx6Zx5Nsoy9n3c+IgX3N+3fmZIOZ0cOeKCMS+yhzgI6QmmJIo43X3hEjA95WXoC5o6EFWuWSP3jqVpobuAEKDegnJFCJUKTbz9K1Pgemr5CVdmHCf3w8DC3XEndmk+MLRGbdiwLwgVhWDixucvwMlV0lCe+loDvWda3cmSgWSDe/pYGHowa4cDE/VdsNveiA3FFVAUt+eHsjCmlMeDZPIjftDQekx9c3TMIXe6u0iw+qo1GcPaGufjhP39Uu13RtYDL4fpbjw30tRcw98B1qVB6g570U7PIk/FU/p75iM0cueGqSL39HxCN5fdZ7ZcYxWo26TgVSwnojm9J7I1mVrgVgwRJcO/HiqCEWaSOBa1ECrWYbkbcD+9zmruybDcqDTLHQamauWq5ybSzN6TRmkn4BHAwef9vYNHJwV+kmLafq/dolf78lcA+wsZdszcHC5Lxoq5qLbFQ47b5OJWgm2at9APKgwaw8SOkPXJ8fZMLQ7hniSMiXLmztF82hvK5Ul180xuzVU4oTINOhat6UMlmuPf7ugzeOqkEsOBbMMKUgx9G8+f8J4TIR/418clBvcl9NXPTUGDv7J5z/jQLaQEEx6dGbJ0E+yLN395T7Kz8Okdn6pqwV72C0nxXlBDjEXuKO6zkhI2xpiJtQmT6jB0IX34OeClULAtgNaZizIegAIM5JCLHeJ2xIwGRvzc0KejZ/5BnziPRgPRNE8e3Fk2Ez32vZ+SYlVym4uPmLGeDVwOs3zPbTAYY+0zXF2F0cqrPLpRAvMThR23qakZnRsDJmjMBeYC09fH8kpo2kPy4tf89MJGzdx8s8NxpRd7dCLVAudigPkV/56kqZaz4Gv5Z6O/82k8Xr53abHN+Y7YNL9AxmEYJSJpHlBadd19+/uBh37rurGGywSjT67ubt4w9ZRTtn5imHclcLSWCBKi7tRmFnXxCogp79CsZddiGcU+5Xzf9SVSIzaXI0aaBWQ+K0cPo+JTcb5YRrkW9VdK8bxzFteQAopxQ5cS6VeilieDfxdRizUMiz9wDj+1y7xn++Duyy3oFlpms2Ky33RpySLzoi5qWKBCk3QTsM504FoInbFXDIvm7JSCorvZFyBPpJVtyFvkuhBXsDh37Q4wX0cUkjw2u2DYuZruwTvobwDH6nAqBoGQC+yLyc5yOPF0bHNwMEQBay6z+bpFxz8YbzBn696agwcfJ3P761BNu/J7ZgZUKO9v9da8YFJUsxpnSBKk+q7BMSzKuALrI4yBLdpVzS473Ke/aQ1eqrYTnq4cLm/3CVexlPIdt02pMw4FTydFniHu0BP+rr1I7JH1cd5/sBSFqeHJXLRLqkLsaDerV9Fu70yv72V59v1L0ycZ7SNr6ZDfULLo2urNC5vxLqYIi32FCUCE04lw0hmBFbDxXvHAzOWFMuPEzgNUw1T0GC5IIBkwIS0CLfGc7d+zdA1wWpwpC6bf7sgatoDcmLfMcA/RL376OSb72Cl5S/GOLHaRjvrIWEQCKUdnNSmj4jC81D4tfp0J5l6av2c18j2R0zqBqROoawxFtqR7mBRsv8uwhYDG1LHEqEs8b8uGF6r979vsbLqatoJle1GowZRSYFjZ4RVJ757s/54Sz4C5Sf65MzurJWg2d6WQxr7o1pPdLbmxtk4x4DZLD6s1bcx8n/tEr/6PvhP9uxaYPGyL2oFZ/6w1WShW2Uo+LlpCro7dsc+BVLVKLiirvvWTSFL6hxyBjl102sFi+vJp2ItCmzpe5SzUNl1yjs8hKejPsLNsnFD+0Ve5fNHye05FCTRGLZDGeDLBVIGDv6HyRSgyXKXmNUtR61X+fzwCDSrJHKMJVVsLOTA+gK0uWVBqWLpjyNG6R+njLkh2VKuS6a+zOc/obTmipag02J4RmLhX+vmYK+3zFiQpLn8ldR5XLWxWx+dxaYaXPuiwIVPan5f15rAMDzL5t1bvbmGtW/4ln/gyK8XBWTl6/vhellAykfOMJ63RuQOBqBKLF20xCEd1+ZVbGUoRJaxkDIKO9d+ztvilByufSP6uD0AUk/FHaozAIC83a8OBSDniEUYeg0vyFPh11++t7ohGupnVvH+wUq2hCLXlCiFucLX0h1auMfesc0i4eE7jQDBxT9u2MZkvf/TyTwHLfRcCbeK7lgWWU1AdV3uKJFVUjBn0HlXosDb9MViHOFKdhOE9kJol5EGKMGzxqzT30eSBIoFTZNnWLmYpPB+cnXbfBQv5UzoEa7j7auMg65lBjKtTfZStJ61SEMGKj6kRaD3qr97nNz6/Jhw2buB4ewxM+mUM0fs8X91kQAvGQuWH6nlvqjzMhvcvjYPZnOzo53fdS4zyrI04ivbkQnL4XI2Yt47h59ORPNOcY++hGd7SSoEIZRmdkl5P7BRzqKYSeWiouTIFCizcYr+5PObln1tIuqJ0XBIY7j0anpJF/711Cy9pXT40melCxXTzU0eDB5XrZP7Qo6BJ8imjQo5xjiWX5EUcWCTbHAQt4TPNpwDLEhdG7Kz7JSK6YRk6uMhkJId6Z4UIZbQtpAtCRsj17j9d4itoiH9A/ecL1sXz/kAwLflp8AtdYIMjEe2sMlImdwc93lk+/Om114TwS195Udvptmwe2GAF5UYz1idhqI3h0llhVzanxkOHQkbu0fvEhNcDe4AmhqlaCaiVzTBXJXPxvGUYzBgy2YIRxlSYQWA4MLfz21Y2BC8tvZzydVpF2Otokkc6LT0V0AmWtWG7b6ok2ibDlBl59qSI3FPwU1AHETu9IH8pPe01pj36u+X2bPjgGnSjfH2DlkDal7/m1GG7HLC26/hMGcRuA7WETmRySALUtZfsmdDQos+owU5GkJPht9FyBHFN/EgZf4C8kJzf6wg/eY762qCoUf5EGfOjrhzrN8fJpUP1h9AbZYk/vR3p1m6x3Durm+jOcxYXrpIFvvi6y4S+nfGwrC/3BcdZ7KmG8v5vaFQ8xM8Ri4zykSI3XMmKluMeV/B0rAv4Vpv2fdTuZ3tTGKQzOIb634J9mQJ2LF5EnDvmKPk1a8714LS0OvPyqt8/viyr23/OUpDwjqJYCnUnjZw8D+emiWTwa/gTGsIT3R9z3ncoBLTAjovX5ow8slTnKcalPf254YTpIEHJ1CEsSu0nVdMuhyrMBZu3YdrCyThvodI9mxNU0Mjx9qZ2+DUILFJCzURxyXhab8qzfi2tftpRJn1+8Dq01Bl6QGpbhest2d71Mg0FHOWkrLIlslOvap2dmfqXeAiqhNNWbmgxTb9ienSlAx7fv5MBCIh+MwWHheWMSBYhC5HlDCVt2w1qnx9/klsVSdgfvBEj52ZY1g245OaCRIHWRQNhNPd4jKHylUgimRd78a/gWMyb3CkWvkBem9z4fd8QX3rMHj4AZCmMSDaNAcCcFuMLQ1lg8P7MGOIt4KppMArbw8EReEbm5cS1f6YlvQI34ElY9bVl8v/ah0zEAVdrPOMINcsH7+dL8bKfdm+xo4e1rl2QON0dy7bfGdD6nS+LAoXpW5aRB/rWoXfWz+4JPMZ+/yXcTYe9oatHuPUXt0VqPXteXOGbWizeEA+M/c9s5hz8bqLZPY7Y+G2vcyZpQVgkgUOahZmXqG3Lz0vGWVBkjRTN6oDS0VMe7DkMD2Rnqzq9EMCUA66tM1aDN2+8S36tXzaztEeE532mGQtBOC6sh34k88PYCaFMWQ1EPXuLr4ZY/gFB//jqVni4E+rN9cGJ6UhPitVXzw1U+wT+gTnk3R0uE35wSyFN6lyJkTnBxI8P4+Tk66gnLBS2H2sxscj2n57fcRN5pKBg6oaO6C4iA+XptEnHu/chHShIG0Bdb7d/UI6xxV142T38NFXFpTMZ60x+mSIuYLc1KaxVvbZurUoqeb6Z6EFDRyJXk0LOk7fjQL3wj2144bmMY8Ji8omXojJhC0BYXHMVI2ukoMWaXXXxGDhyjs6nnDN4fMuKQOMfWLD+wRMP2yFkPxbQagu+7vLWnt+RBXkGm9Ij/cFpRiqJb5Q93mayqOTZYdRtG0xcNAgoCRmVhhBMeWZZbf7x4PzDoaR5bcutpJ1teaTaEcnYwZHSgN1WuxUBS9RlOnlngwF0PYLOxgxZp0NECJhsGuRBroSZPaf10XXVprUzbwJeA4pFx2mzCPkxdtNocrfQ9sfWztFGzWBVe0pR6cMjvRj6S0dvrorGO1FNuwBKmbgoH2WcKHdgHFQ/6uTa+MlY+FdNiUNU5t209eUv2SafrmCLe0rGFhmlGHUvv+cZHVRNTHSBuybYpomwnt6kjRNn3w7TDydJCWzHGrlNkIzDODRTdemMUD3a1Fma/gqn3+y7GsjEvyfnhoDB//jqVnioBmA21amUqW/bG9ZwqMCdPPB0IM3VcuQDiuFnCfgNYQ2iyzo8keljXS+tgs8p8AnB3euqirDOzZpAiNS/DkSmZeNH+xXwtCDrGT2Q2pYadviE1IbXh0djhbLrM4TW1svuqZYPgp0K0oQuiE5uSdOkZldDsyoX2t1EZ3dekfzewMHq5s/MriIywVBwWlhmo54XDtqkkgH5BM2EnGvpxLGE9n4uDB4HV0V3h4Ys457UKf1R7Lt8uPnz2T8QUbo+gZmQOA6b2PU2sHl4eZCV+/7x872sr+73VFoPq/0zXvyX5gc/CcpnbuzyxquyWteH660wOHqj15DgJc9NXpRYfvPa8L7jnSv8zz0BIaL9gRdK5dW99+5UkRXw7a/OhOMfRGnMSH8cp5ZOy0OApHs91GGofezkjaMoH/9/CYOB6na35v+QvFLpd1LaET7MVn+VPcIaXUS2/D1DY50EQCofhL5s0ucscoHGTBWMHCwy4x+/rND9bqTy2ToQXWQmc+vtrjQ2M+6ynuTxxIqlL5YvallRlmO5HyyM9Ni4G3ZmzwqYpZQA8DR7P62nxjvSIhzbysEyF5wD/CP4jtJGDM9exKuOa3iV3sfXuXz48u+NmQYeNVTY+Dgfzw1SxxkdSj67tq80D+ZgdHcTHQrnNOtU1l7PzLqOMShH7M50yZJ3ksYjDFQLD2eGnOD3zDVNWVO//aWsoiqmqrYapDRWO942deGrAzfFmSApTd+CBUF7zbUql6RTUjVFX9TpLFKMcaYx2oe7xIqkLfeIiCu7ReFt4cVsbPEwXZVaAYTAk7cBroErVW+BqNM3JPqxbGQx/PuZyISC8Kb7vB4hEpFU5wHqGJ0fvEEb/eelfsOx07bFsgWR1n5cunCDtGq6P3Rm2h3aEMd6B2pjbUtBVcxQXbl2LcyiBfoRpwqoyv+neskwWvBAyod4w4mdAfryR2zMZ+ZdVmoAOwTpRli5006XxmGkBv7N914UbWzW4l6lEOSnojQMCSxnHMzzWBhwo9HOLHBiDZLmLB/ubmw0TG8fo5zlaCdmwd4Vi9Vp/Dp/OsuXm0Oi777wsz1dzxfggKmzzdgfpie81+2ufKrO/PsJbYSe0oOg+VNrPQYMGvLb8evO7lGhh58XPoHc+PQYtcAraD1sbBnXuTNhjh6ySgLz08cxoREXWgY3WMNKlyAHZiw4UsC+DSLOvwzL+IvaTRQK6RsAPltoiTDZm7VDdK6G0z/yefHBTeNzDnTq54aAwfJe3T2H29pazfA5ZFi/pP1fNYAAsMpMRcZ28bmJFJj6ffe3V54oY62jtpW6gDIcbtwWAJ1wdO7TrLIWFOAEh/unqtsI8VvLHtL6/u4lrW0FBPQYoBlxoLa538NbgM6o0tBbqrNu7eUPs4LZyx06OxV+UbmXA3MPmtObKE296oxIFu3DAa6iqUhJZwpOhMdXBl9Xb9DjRcVjFlXIjy/QfPSyy6E4gcYlpbURaBvQ3pVnOQfpEns45b52sW0YvZ9sp1grhxJut5Z9noQP20fYnqVwNJORGTa17Qoo/JdDn1fGCx46m41QEm08QaNGSO6ZNYiWwcMrd6PLw0czHh4RmFqB6u/zm1xDC+fO5hK1EO3FayDRkO53gYHvdyZb3nxHphE7WAYLxuqzQfG2MaDE5ousqhOxHK6I2vwvVWB2E1Rs7lyW8FGdY4Qq6ppxb+ARnN1qwCZ8+MsUl5kNqRF1t1/eHVnPsqIwEPACi5x0PaSPWtBp8sM9n+7SJaeGgYgH2KqfZSJ5Y5Cqf0idHqzPwVrOmRfZpRhILI2iwFjWvAR62kaekg42By9W/JtHlmfdvZof7JyQpockQooBEcYidmiPkwSIKTpcsQLr/L5XQrExpHc05+eGgMH82hR+4+31GrlqrvmasE8WHpq5nnmi9VuX8xmsR3HiHo8JCwxv6LBuzXc/ryWY7sk6TtUIwvcycVNfAi+enuXIAxSmgAk/NEp9vazfMeYG+BJy11tVIR65UZrV5u2RIJWgxdXHzcnuoYC13bJNHID83ygI5fUoHBDsXpdAgYzex0pkXfPTTE4+7mOVmUlMq1vrFS1KKVT4QofjkUxcUP4tFxvEIKnZlYo2vN0oFBwfXTtUTA64j+flFgzuK+1GAfF53a587ovbau/eBCaXQuYZxoKxZkvNm1hnhz/9LYreVfTPol1unlxgIAcVMc1ehCByB7I/aJ1taa92/TO08YbDNoBtJdD+aI80CNB1o8bnH8QJ1BMNE+exbx9wFLyw+62eR8j+ZRpi3wOc1zEwMFMlO50MqjNHpaqjnCaimGs7U1O1KYAevrd3wJ7XD35g8GlVepeK84UpjfMeL0fGYldJLJoP+T446n52g8aehC8zCzvzEWtnGH1nuhAX3WRLD016nNycXx9fZmc5nDzKTHul5jAfXE3QC0zylA7CuHwfgmjt8Soy7SJWcN1jj396vXnuEc667PsJSWbI1Uwu7YKaXKdFtyLWMAHCxK4BtPO8Jxjt6zvHXMEB298nIGDrG3yb09NEtp/DjZBj6lkdlKvempKeZP99gpmutfmJ2gOOyklKZ4mXYVFLKIFfKwoWw3dLVdLu5/vzg0hZp6trDCoZuus4aHIvsrLRSd7TCsqAOWc95My9QsbiMP+zabX35Ej+fwqXSwptmWHkTwz5kzP0X0zpOD9SfibulCceI1SAd04GyYSGzfkzxZdnu6yDFDX+SYYDl90LEF30RzaOcDC0DPIJirBELVyeBAPUEpt86sGP96qve5Ua0oPSVFeN5cxFFcDDIfiiV8WK1crW1c8OzrTKZV2v+sW+RcayGR1IMz6004DB+k6yssA6AxKdksKB4Ibuzs2guzGxINDHGPYYqozVqKcuar9snkFQZnQg68FpUUf0YJsUtAP/rlkGkSIO3OIaZ/CcmuAdaQQg9tlMruIo3T/NPLyRSzfC+NX5m+XeR2tgzsfCdPDSX4RyeaLTeqpeev8K/ZcKPdpLxAzdfaf8gZH+vn9r1/TXsYe/rzpGD3sRv/k8+ek1BIHS9sY233ZJSawC7j/siez9NTMckdSN72BjNOu+zIjX46sNFcz+HMbARjNQesCbjm9c/mQiG3vPGupmEyb1DZSwrYgnynLerw1s3X2OekgNtddSioEr6wfjAcsj8S2LWjEDIHyYwKZpOn9sYGDxeC/PTUGDgZxYGo6mX5T71/11OR3J+UyKkyvLeezPET0dtwNMJzfxFwh+PFoa95302gquuPUOdlDGxKvoghsOmJLvE+y5n0uCAzD4R7NMw2u6rrd2aJG6Jy3H1TE6UGFBPSK2nwaavjiS6wQmAolx0iR7NdkwZgtZxbkAxcYGnz8TIX7N1oenQsRTo+CsORUEhXe7EdkqGpIvB4WCnncv1CbQag0z2pE12z0XDFESlsaVD/Rx+OmFOkVLbLSJS4nXk5Oklsb7+1UN6UskxCaBwuxWS/yzYei+mvxWRGrMGYwc7E9v2Z0WQzCKwZ/rmYC1OZqGC+c4nldwOhHTWR/tsm0rRIj/bzcFhrOIsMoNW7j3WZHF+4B+xojo7/vCpBhNCt+wYDyc7SjCB5c1O3mZbcz+M5+6UsHDbT65/tgBst2iygeCjuaFFOvFSvZb30wqBjgUEiZLlb+3pol2eoywWiQPSqPgxvUPDceDfYk56t8fvghEMSGu59Of3tLv9rn8YjXwMHU9KWvbZM8plPRSVLN6vD48cYK3pdNssGf5SgBbH+xg3PabpJDArQzz274Ptvjkt03AQrZXR/qymgqYNc/o/2/HqKG1rNwgVCUGlPSFsZJJsEEOs7KmolIZpct27ajkPRvT42Bg0RiQ71HV7kCWnzVUzMvlPY2FhV4cNBxMOaBx+kb5p9lOZU+5ETB0dVaSpAtQIPWxsSm9KqaupUUwlDXxXZ3aOXir/d3Qo/W0J1bg6d/UR3PRWPEV6Ltk4ZlMCmoBg7y4KLmYANjqeEkP7yzGTgYu7JK6NABxhdhERsrJeiadPB9aVFc2EY9nabsojyEobU7P43RJcF2QshRis9ENT0YA3Xc4oxHE8vvgz/yBb5oytOTQsX1vmIi79NP4tVFn2uvAvJsgLIwgrUsXcvT3ErdY7dqC5k4ioyiNLhfJxsML5Jl7+oLR7JHZFoX+XQPpP/C2mHOEDX49NluttMKPr40X9pxsQU+bJrERQjVM5G0LsSW3lLBlTBmnXnPNBnDkj2Twp/sm/6dUZbkIWzH4QzTB8sPGZkAbd6KvXB+KKMljhG0vXj/WFeSjbsVY4rUJkJ9FQmWhMMAFrh/yEyKjTSSf8+kSrPfOFh4nc8/TxJ7hy/fjkVuuUM1pzl7z7fcJZ7FTpNc9MEvJmdxgjyfQVPdHNPPcYwz+DPH7RM7qgnJG48ulERxPyNESjCQSIH7PHtI6kXQt6OAQTQPupKjAIRAAXCoRSjFGnT6OGXLsyBQ+YBwLECC/XJ7aZ/nDBz8t6dGo5Fh5Mksi9e7oPiqp6ZcheTP+1P5qWTavoQwOHRCLCbzwAQ2Y+2rmq3sRFm1uFkq9p6tfEMOjg52DsaCKAb7u67Fs2YDsGZgUWmLA+WK/q7fi82EbpyNAmldM5Tm9tdV1H4vguBizSUMl+FgWlB+VOfxstuxUyFG+DB8lJyoTvpFD7puXX66Lt9rn2FcAw7URDgcCYenfAQW3IorEghVVgSxnQYSPb6mXe763nSLRS14faUFZgYOPk9l0cBB4COIhGiAMCW897oTv7PPyXJpz+t926WaYM3zQxhQP9HFciE2xmLhDeE6whFdPvgDxEUDBzMUgHp2be+zFI8Ihh5M0Fwg0Rn3lCbcARD2gygqmWDaEYow9v2EbhKjyMrNjQQZIHDnpAziGub1BN+RChJrsa7kOuYg1f+S4MTJisTAMcr+ZXLU0Ut6PPut+Jy36HbBTxch80x/l7d4anqG6r9PjZrLXeJBMmC6ubnMDzL2P7vEHCs95PLsWWBFe/hPxsJSD/7+PthNDJURJKDztPxYMydGBZTKNQ3+PLBZEXYbLmqg8ehcO2BY8YFfwTxl3ttj0DyW3NmkJMCx3dlz3tR2NhQ/hsZ9QSjAWd0DTjPU8ftF2kSi3C8zukgjyCCXNXBwuUss/O5r4wBwTLa5jFr746nBL/Dx0lPzWNqbjCg0nflEuDxPRS4f9oyKFfzXwsuNp37/dFMS6KFqzA1R8FS4SGUsC2xdsbk+ZZmxXsF+RBmh97lFDYGF2+nap8zdqfE0JmLzpEyJ/uHvPMbeaZhjBuz21VBrrZ0aor4v2nbBwwIyEif75yr8+Fko6kMVmJWw8IriSAuBWLBNYIsAbXU3tBDlWft5PjCGzGjNHY43rZHnSrQzr8ol/w3JITURTFQs4+KzZgm4qPHDnt8GGYNZE97hYaZ5QJAtf1Hk8gPlbnEceFmIXZ6Nto3TTawC//XhnTBwpIgzGqMerTyvM2Lz8VFmr2h3ehEO1/3OCN5s7IrsIIwvO22ZcBAvB9fYimmDsw2MH+xTIN3D02A9HaCrERcuzgPmx3GcAG/Ri4NunH2yu03FBAJIA2WkTt367tih3+ymGaRbO+crj/2/W0/G2Tg3X2zN4lFhaBLYQRahHjNq69Uu8c5YFBbTTNLzECD/9dRQo3+zhgLO2CIdCRSzm96rvedhBfB8X/LnX3Y5xoLZm4+jASmZOeeGaX++69ws7O+HzLtF+NibhuzoPpvCbaV8SM09xMwx1jX5nsRMU0NyG+qYCLiI7fGMgBNZxH5u4OEkmX3ZJV576WtDct8P82CAqCcu/+Op0dHRKM+kLxeW+WNt9+yJ5/N39H1q29A63zbJ+wXM5N6hDP8x357qSoQTlTA8sCiJqqr5TkQJqtvYuKmhbmxtvOkOijz67VIdAtdq8fmfHKrsvfXJNpNh+WSZx+h+EPrM5PDbe/P6QkalO2ur8ugAsUlYpB/UUuaaYtNtqemb2UYRhjtbI7ERsOaYvGWXK6A2DpGjHpyLpMckH23jljg0ourPhRhjnrx8A6oBI8f7I5umOmz0nXEGJFDL8wupI42Srau6c2CrC3W/1cDB5Q6VoFBXqz/PO1j4Hlh3MRXRQ9MBjOuaIrnpxxyE1dXOs8dOLgNU7fEEUd5zXHq6CRaYQlAPCMN6I5xtTbIMll7Vr4UU0cVoCATTomVgIcHhmn++aaWQUWqLrAAcl8lwGBzlxEAMZH10vhx4WnycVZr0NSFp9uTN3zf2uiCIMYt9HHeZHrLO0XKXuBFS8qe0xD682iWepY4+W25SpnmKsJ5mSPksA1L1dJSf0SP3g29DHKUp7TzBme7ZwbQIRW9Ol/wZncnbJL6vEvstfmtfCgNx3x6wMbNYd4KerIAPNhOb4M6ezIZPtyyWnUUynTRFwJNY3BTXRNNuTsAzl3E788hvXwIcOtgV7Yu4gYN/PDXQ0Nu0OHI67Fb+eGqEmwrs7N9Y5X4RObLc3nWV5xK/wksR7DycwEtKM7ZINVeDNxPlUQpU3CGoSlj5nhIcnXgOfg6kyD2845zPi9ZFtxzojKvKU+aEOq4/i6Jvahv7J4YeXPqtLjyet12hyT6tfyNG6tnzQCvxM9VgMk7HWp4c8c+RI3ahJD406cnjzHULHS93SOXMhYhxJ2qCjkfCgJkPU4pLSRRlrZrEBRD/RDrnFQH/y//x0TcWGtCZbObeGf+tSSGmYFr4RX0f67IheJF6FxT/prtaQ7td9dq7El1CV370qhLcZcJpXogaOOhd5m8Y/44HnviQZNCpRrnk3rX1k/fd+5j/eB7iDjIhbn+QYYRGALa5A0IVDhvvMMrSRwmhktfQdfff4sCRYDfMMFnAEUUqZth5X+Su8LXcwhwiMeN3OiUSIq2M80z8bNsal+vg2ywDBuzjxaJTXGCzvRjZ9WWfnjJU7jTFDaf+p+QoYvuzS+wbUf29qK1Ms7NZVhXPAhfLjIVgZQtXZwFVWsQXsqEHF4OkY1BMmYdlFFzyZ60Du/ZJQvkSdUYozJcEgg7tJAQWaDjpGy3uozu7e3te0LL90wyUZ2kntcWbgOCaL6OKiI6qYEBy29IQgwDfjxfPSXbZiGrg4CtPjV8giqrxNFLf/nhq0KMpVCuaY+MTYqLNPaY6kRKeshV5ClhXfYzcqU7t9blPsSl5dhgyOREfvtwltq8UJcEzpyJpuiCb/BNXHFrmMZaiR+BITXxoEGpKd3207ZKj8ELKLUttLAu8Ge4pHVFXz7ps2BGY8tvAkwzg59RjfCKeXdk+FKpDPnj9SYVHPyPdeUrq5Mjg4oJaTytYOCCvBpkIu8n3jCFz4X2DKFVhVDg3GPFLnkwMNA2VUvGNxlXG3LQLmZ/MfPEtEW882T+d2O/y5eKodnDrFDqWHtH0R4KdfFX91UGDghLA0o7Ycpc4J5qicST34a0AKVzj7FZswHRO6nliLF8Q21zbm2BAjCp/TLFCZpNfKErt6vbw3N6V7wG/tSWL3o59EeJa00y2t8eh++0EB72kzMXhx3GKHZ+aL+xphGwMz748KoW7YpF74otmoq5fzX1bzfLD8/7mrFnBNgqTaKDyDv7bM445lblJGL7aJZa6aynz1ELJPloILDIiMMeC9fmu6xeCWZadXEs9uD75T1+bnF/y5yaU8HKo/9HhGFAyDNi/T7zDtH3vkvTHzNmJdYTsUGkAId12UWomndGyFw6gSTzNquj2z81R9UkAo+NdZrxPsQEXvr+M0vBE/8tTY9EKHVM0/Cv9/bDwu69NraGnj03Uw43SIa65ltiJExBcWljAIqq4XVxD4t3xoy0VArTyxUorEFsxoCat8tHdiORpWIKuybLfqq624oaG2yFUgkXfOwIlbfjtixYYfRJ645E8LfcjUrZpeQqM5VH6HTNFZu58p0crhz8+DJ+tZD12bQXksquJz8KiSZcGxU8U08Y1UzGwOpwoLN7F1VDB5kaqSS08jFo5QoxtVJ41paIrsTHnin/qM2Najx2JXTl/YyhwEwz8Nfx76V6l7i6Je5Fm20KkVURbcusdjqTZbqSGbSgtHgCLi0iYuAr/Ol/UJbLvXWOeSS87B6I6/yCmhdU4VI+HaEXYINDnrHkOAkSZdl0ejBPGE3cDiCDeoQ1h0F3gHezZKri2iKUeNDe60SLdIxtacGX/3Y6NlGagnxzHaM5BsWUh2H7sFH4y35MF0MEk3JCqNy6zxmDXb/1zpwFAT/GvsC/O/NklTh+JLzlUiax9kYmlzn5/H/xgvpGiI0MPfsxOl92UVD3D6nPGYXrcyWYXL31tWKmz5M/AdN0379tpkK1s0n4tTOKbmY0QZ95NBWXvdmLiD5k2krsiACQki3VvvpesTNLoOBDMXJCK6aSMg/xIgYb3JJtedlMi1P5l5P/jqaHKJvc6a7D55ZXysq/tCTkVP+0+q3pSOGezJsxCF6pK9c37m0PwqZKaf4NFNXQtFxStCZe6UegkuS4vRLEuIzKzoAyBwCs1Q4ctvx2PyieOMF51gPFRDJjn5SB0TDj4gQhGSlZUGVKX8cclDm54XF5OJMfrRxNDPPJjqjSfy/Nx1+FwdbT78TDMbFU1x02eacQI+8frCyYwFhTbBY/NdkMZeoyHZ2BI/JW5jjl8eXlwmBfC9U9MHK8KdznkfYHoSpOfAg7l17h2RKZRUe4jX4gfDfxelz2We6Sr/GrThia7XPO+feaapZLd1LMEYV7hB6gS+91pOyHv9efIjxIfLto7DN4Pev07/RzVtYW33M9h2uLIsv1BmHsYCEtPjbDsqXHMlBa9vPtSY8iN+9fL98GENYLDNCa9FKVRHMuBnlx+DhO726Vmr2PNM1WpYV/VN+dac877D6spGAoZAJQZ8g/Sf+0SL72l6jBFvOQxjl++D8ao+Z7zZZd4ntvIv8NWUt1ENJrfmpNT7JR7eulrOwaaILHkzypllncUJD5TTcFUmFrHJYAdQZ6sYvJpqu0+ZrYnz3+M1vMUaD/9nLFSScyFc2ETpYRAoGndzkxlOP6BRp0uky2NsOApevnPLvG/npo+TNCs32nvEEXypa8NHKt5btC8N7HH70e/Oknx/in97THxeApyA9oJDWIDxZhBEyfFh9NX4wgX9+KaFoTBNcROaKap5Dn1k8Kv/YIw4JtKK11wFeLGXzYZim06lPPHU2IYm7vfL1BcGw/EK89YEla6KjifvehBInOSZBNdYdvzJM/4d1rh+VE82wI/dqsttWaDxMCeSUqgMTE8k5WIJbWqNUSeqGwEQahjdzR0FYXPDjeJOj+iLmzh7sjdbHcjIN0n9ytr0rUnRXZB7YdqzI1PlkKlZLf539z99uJ9NUeaBxOqiU2EpjkShRl7SFcILX2L8Ax9p+XlUvTXyYe/BYjQamfmf88GxhUgiTuf+7ILK1b3X9LtXmBV6igh6mrjzeZiLtc17wojRzc69CT88iFDsBqzDo+xpgSFC86cuSADRB/c8Nj1EA3mN34IzB7EN9iy9gBXohqhgFITGE7r2/jD613ibmJIPJkgdZZGlnmM2jTrTvV2JWcZs1BDGlIe0yL8GCCxuf/TRxizaKNUiC2Bw/OK1dFf8ucnRPaa92WTYtZNCkTk1lzeUcq+7htWvaadGXSb9HFpcl/T9h0hPbMRPM/SvD1kioRciL9JkmtLSny+M4K8DBIz75N4iuEcqf/y1ICO2pgyhLpljSr87mszcJAgSklz89580gViSnrEIJHF16arbAhHnVkRm8vOUdxc20NPr90UosvKW4pUgUOFDVdkcbqbEKiFHXMqrKKcVDXw+YZ8RBcS/nXvg0PoSsjaiTKEr2XnBCJFahEGsjVriZlo4/qFKDFT0Ll4EBXH7YehMFDG/c+WGb1wgGv5AIB3RAUB2HWfrM0H4dUhE47j2LKQzuFGxqxGT/HN0wwuXlZ4qRpuKVC75OaYBg7Lw6Q7lGYfj7IGY4yhfx0fGnODLSe3FVySVV7fjXWkcpC9mtufmLlWr3/RmJ5iWTaG1Ljtt5s2Wqhr52v4s7jJ2QG5wzd5AwfTIOYMcwNhlWjOQ+a2oS3LTq/H3g6zpeTmd6Sn/ep2DBys8i1MX+4EUvXlTeCToczoRIKs57ntDVuGmo1Q/yGILTuauXpG4PIBDHKch9s6GMz7UsNyx49ZmPHD3qcNl3E2/uQSO2O9oKtazh55j//01OQMHLx/Sirr4Nd+9Pe9KKkv9WApzWJDzvm2Tgm1ypI/g+OgxgB2BuE+rwyrbBBi90wGMzBnqZwDyhH9LQlV1tMhh3WH3BN2h2lXxpVGZthGCjqhzeOilPMMBejkUUMECDeH9jn2eSP9354aukRbf13YaK4O3Lz0tRk4GGrCweIYWbUDgitC8/5VvQJnSVwajeLI17sDl0Jp6KZJM5dYkjUZQmxGBReA5kj3BLGOmFVQ0Ky9RE0eei4ON3slFRmd2mfY1AG6S9Hm/kQNVi9IBz/nRCKPoMqYItcGYq1wtel572Wk6MP6d+cOcVZZkNvzR3kuT52F67IxNSaxo62KgYMtCgY421foTRyRZTlzJWEzRyRu4iNiE4yIOPFXKI6wSvWqoALuY4LD++LZr9FlB8zh/eQGK2ftTQsQbxVNS096/BqbG3pQ+NYoVrRfc0Myapdez1xXOmpt80exKMN6j+13JzFmbLYK10yizs9jP56w6EsCYT+48XExC1KoDduhzIYeLLLG2eA7j7vE3eI4XFB63NPhI9mav2GE52AIzn3/ZvxewsSXU5jhT0OSITyI9iPPsnNfbkGH7/3mIAu0PxRaIjv8Gpluz/VxiACvQsbZCILcq1zi7Mg4kB9Sjuz9n4wFdprG6Z/bHDfddYZGdNTAQbX5xtCDD4mhWvBhvrIV6jcBFv9pzA3R5Nhl4/BUNK1QCROChFxEwRhfzh0v6zRNvbDTd7/iWC/QgHy+dwMwO1Hzvi+CUm7JgY80MDQJA8AU3gdR3CSwHDoOwS+7xH88Nd/NDA2jgDRGJ/JLX9syYwGlUzcQli2yUk/VJu82/B+700ldorcd2tMmjQUUeh6N+hZ3FNuuK/Qi5r6HNBadEyr1CK4Mf3bURbS6Qis1ZWPeUrfmVZmnh07H5oLG8HLMFe0qD+t9Qg0t3Il9MzlaOssumkrzYKotg7M72hb+E08n86CTe7p6oKYOTXtI2KUzh+ljd1Lg0etvQgCGxPg4KpoeQyq0S65XFC0c0BEZ6kl294KWaysf3iKTuTamfiJAzwUig0xWd0SYutmruxpirQemvpXmWvHtgMUB0fFhAbH3PRv37hZkO5YJ3fETfDNfJX8y5+mWXKUHX8tys/2G1J8f2J8ry7uCTAy/2wjjj2BARBox+jEkMhzmzXUw4X5Cy22k4y5YE1T5S/rYw3S1e82+1pZJG20HRFYaZhLNLwEQs8aJYcdrcP4ATONSTcW9Z/b1PqXV7k4HtciFsJAWQOsBVfPnwYvc/FUucTe+wN+ZLw6fkiwxNgnqMIdI3XRWmhk4ODVwsGYwZgMHA8Pssr/byg93I+Ndy3yWh4Lfi4DbmBsOiEJIOAKeiE6fEg2g0HHSGdSoNS+0N2U+V4pqEtqiV0lnTPc7czMJwsxhX8DOsUheAn0FCxqYquTAa5wfcmt+9M/P6j+emhiHeJpXNq+kG0/n6XdfG1UApvKvtOlEAlkyaj+tIHl/1F3lKoMgA813xZ3tFGHMcVMwGHHjNANLjC3+zcMEupKyc0hqU0+TWYSLWic74n8tvkadk5K4zS3/8lcyPq8IZznwsBBZiEjmk2qGj7U8WpCnsWpgtrwXVR4prXJMT8Mu10PdyiGXqaMFZsEBNWcG5LE70s0HInRB3mJgFmprKuBLrpghgcVxTg1xpvUzu6Z0gszGD4SRcLzxcvc175iAB9Qvq4Nw2hGKMu1rrVC1sz9/TE/1KhHDN3kMh61hHm1QOiqlm5aue2Djxbr/C2MofLQ9r5bK76xHHjpO3vePLa3nBzdtX7qigtF07xcHhrrRDjRZwxE9Az3O1Ub/o+fCbtWa4MPed7Nl+Q1IG+gdga3P3fr7RJxAQd480c2iMevIemlt3zZK1tGy8PZrt9G2FDNkSCjrSj5wPGYLUml/IG0Uexng4AGb/snnX3pLEy73Aotq3UyEKGWO2CM6xc7+H1vf2dY2ukWrYkvuhI5pDmnUUEKAZEIG917UZVvFsuSGey+yLf31KzNn5sy993zlMcbAq73Wevfea8XSa7MUW7j2jV5HBg4iD0B8kbAdnaUI70UG6OlmX6V46IWNupFmEOuxGcUlitxgAmY2bh79kYeP6aA/naZH8YDNiexzkAtiaCBZ9KLHaI5ZhINr5wXKtJQdsR8AZlInVHQbpszrSB5RAv/eqTFwkJbNqS3ORmNveW02g1YAD3dt2P+7ZZvX94PsUMesM1JZLjP0wTs05RydZNawaETw2H/GxXF4dvYrjy5fRKUfylM9LAAeymt7g4r4Gj3PatWaLdZQsojxzh9dFREZfbcvgwZajdVg01vi3Z4bcrNeyzWrDUtgopHkuJ5tFE+2t7Rltgnqhz+hMcHkQPLYcUya+DHkgCrEDNYj60MpN/DwjA/ALQnbJ8YnJ7y2LwIPWzC2E21ycDqW37b9DLOhftZ9v4cvFIrv+iIku/77K50tNAq7tmZVfGnZ8VwHbfKTwSXxh6rmW6Dws9RPYs8U5iPL4O72e6yiFOKHP2W6+FtuCJOVL7HKr7LdV9PgK3/+bPYOMF4rrXnMOyKxfI2eOEGmyQKJjmdeaOaFyHPnPGygqTD5UiRb7StSHpcKL+mVifEggn08RYjsR5+i7OFNExeT75O2TK+PKj5rTxWsdw1pgVLomvthBBfj+OW//Pnl7l8+VIyBg5kvCUe+74mnJ3Gb/e77kJmmsOjTXqSgHYWLXWpKamkpf/6W14YvZhjLNI26kYfsR2D6zESavbQ/FUcjLnhmlC8OcuPb6Pc0tbUrBczIHY04Xx+9AHUUIfaefrvogoAeP4jmwAlhc+xjCJFK/29/fvT6zWOBWf9h4OA3E8AlUZ9X8WC/J7jxaHp9dXsWcY6flo79BWjKPL3s6kkdSO/ORpN3kJoLBJMFgz9booynYSiZqXOGMwxab+cF9/d19FziV/4bLkhbJcHxfrQqQHLJwSJDsgBL4fXukuyu9TBzwWAFZxbsFa2I38gBAz0ORVA5xrPlPfKrvJ1mJzp7vA6SeZ8oOiq9/HPm6IsDKWXRDTM3LzxnY963HTFBI2XXgZ7nvF6z0EY4m0NfcHPg56VuRXGga4NylshLdrLKds+259lvnc+5fBXVEo+QF5feA3x1uLg7W+xL1VyEX+XUdCwDseVRyCJH8y+drwl5MshOvhQitN1mFMshj6btL7IQEmqx7RTd/hiWsr5sq4v4abbunOh9vKZ+zLaRgVOhc6t70YtrvULWy2t72GyxgdsEmkUkOLb4aAd8zlmVpw/Kilp4sbkGZAlPHu1xoj7Jf38yeyOsj1Np5/Lf/htlAwc1rxgYJfD/mdc2TquRqWe0bdR/dkLncstUfqv/ltfmPnJbKXbVT2GgwFfRgWU4mPTl4Hh3f0skAM8yfaiaRqkdMWF2w7vaKF3K2IP3u3DQvAMnOT9w3DZKwXmBVQztFzx+y6n5x5//bLWyzZ+QWIFm5hnqr9xS4vdfeRPiBIukW1YoQYLYDNz8MEuUzOXJ+Wc1EEYhPSmNM17gAF6PRf2savygX2YsH/O0yXm5ZnvcP2G9ybp//wPDLxwtAmiXxMVwKeKuq0gxp+WHcVnkvBdEETXUceLIwMEph9x+JM3l9wQjN4hWGE2jWzNkFEWw6Zxk8qDFRIFmqu7MnG15IVww/YG2+vrbTWCoX8zvQQhzvpoljsXWiAnOXq181Uzo5nSVP8goGy68j9lzNqzcSVK5ht9ks3vlakecOHq0bHFxHcBP/f518lWqmIhS/F6u5sFmWxGoVjeTUazYrzlVJ2qNdbaVMzgS7eNrlu2f1zZz5BXYfMdU1nY61MTbfOP89/gvT93XAfdMr0iWfKbqTL105N42uH8TlN79GuiFZ3lADOVqmFaTuzxGu0jZemgG1FD2Tm8oOdF0uPjO1NCl+/CLXFFPRGBKgUAJzSnb/C/Nv2R79EZomgLfjXzWoPbmQxWI6InA7v/Ma4umYTXFJq68I87AwQPTAydqcV/yzqRrd6ZJS33rpzgJjJElATgIbJrwA5+YkWA35SHkR36wHwID8YMCxO9z5u39WRpAYIOFF6KGzPZRi5LgPF+KUNgMpuHHf/nzBzh0K8CaXBzDjN0ZAwfrbzOBgkWy6VSdCp6e2YIsizw6OD7s6CumjlZBIm3WpFNUUtJC0ge7V086WWcU48k/P39whlqF2tlD1pSBOEPXFUKBtg+08M49Fyl6K/fZ9uTVwbimXGPr7nTbpRdQ94UdiC4ci+g83AwOcf/kPeaI9rNg/xgagknBMsmQfJfeM7930EgZ8qxpfvpryMJ6HCjZmYBQESrjM68ephg6H6MEZh7BVtmUTP2Y4e+2VnMyAqNTcgESawQTJdOMjFKj+yCDWLayHV+AZE8vDqhspwSv/VKq4rNMpzKKMpTnWWv+VyP5qoD6Q8Ws1u9pTSkPwdPtkzHXLMPvfsgW8aWviEOjQFHl8Zb8eYvH0Xr8Z8HJS+8dDFbIOz/ZjqlXBWE/OkGqbQUKTXVAtpEt0sDBoSRUhYmjnG2zLhcPw17kM/pDHoeW0rW5VJF4Pqts8YQ+CkmPHLvwmxB9lu0WtZ3HQCKihnY84AMQnsVtzq8pq/c8CUYqSeatd/w/PBY2H992auzZb24Hqx9OWY0KB2apre6TJT9rg2/9FD/uhFuUKUJtJyp62kLqsH83b3XHnbYSBzncVQ5M18weUCrHtk2HPpg/jLqoLI/tub84Qj0K9DM4RKxmif/x5weOx3EGVg4wQw+a7aChB0FDSr/h4NGjOdT+hgpcEpybB4L2rmX2aHpxdHhRQXPiZqrLwhob/fnVJeZfgT0H1CcsIa/gDx1TuUnoG8lUWjwgzG3IvEkZGpSvFe92pqsZKvNi3YUsCnhyUtgbl/PLaNXRO4EK3vEi5CppopR6JUyj4lrsc5WvTRLYszVEZO+TXIsGsGyEpj942YyND5GjmyCLpmJiTx1xNub4fX8l/21AzhdAc7FkiAMi7YB+TTh4ncoVDowqVgEgtg8yIJi+0cDQX24kJuF5EOuophQrNfjnzgPNV3Oa8jTCmOKtJVctTR/PTpBm2bSsXGPjcvEewJo+B9PpHTK/NSYhVUJCkoS4pmVHKFbiwvP69EyC9Bz57DQe2I+CpOzJcjeQaH3rW4d0HzNqHd5UdEe7MyjUvr1c7nSCGXbkX2vDa+8obT4rmRdTVd5u/6FiVLNQ/9gwFVLnxGh/MT4LedwuMqNFH/Ycr4t/+fNf+q/ZYYzJl9z2/5nXpiXPCnpKai3f5mQ4Z8VnWeWWHpZNwmPTSmOrfsq1PbTMosdwHiU3fa79ctKB0XsHD7tJxbI49iQOTB6CpIF0OWrbfPg1T8Fhc2TbBe63XeDGLA7O3cSxl1nNEv/jz/93XpsG+UlkGTT0YKHD/oWDbSTH3Fu/zjrQ8SKzM61ixJ+CLOfC5zcnkI/XADWe80WDpmQsxKtENuLBXT1IZnG0EHgnCXkHJbBYmd92IOeMmq1kvz0WhcV1lQQ9Ux42RPyV62ukiKhZd7ye5byfCt3oKP98CJ7KVSnbiN0VGssn3llFcHktkkT4NKSORWqyhWEDLAq1k/la+chypTkNHBT9SAtbrjXXSuGOKuWrIYT5qeYLOjJxzBBx1R8s1MiL7Rk6zC4joIfgzQTryBi1LkDl97zP1nymw6dI1cnSCr0jSEK4cncJ73cqvtfS149qWeBLTaVaVLplqXiPoSOrmal6fuVaA92pdOZU7cPply2tIjeATWsTSD8rllC0mW3yQ+QS/+XzkjJIm+qDvvinxUnVS9un+++thvSY7v5SBvRzP4WmW3qAUc009z0mlqV65bGksU3WR72Wl6f7+66h3kMGD3sRo8oPXrPbgTkye9UPgf/686fzh0OflTf04OX/zGtL7/gvaK40WO2Wplj2qxeI6NGz+NFiPC1Ci4+Pb/0UAAoBaju/57HHqehu1BkekXtEeicW4PtHQSZUURiT4xBL5A6WaeLY5dtXI2FQJqzOqyVuUocJIgJjq1ni//rzh7BY1m9IqgCHKBnW0IPtt5lAinv13NBNM2BqWSzePBX//oU2+SLVP3/psvBUyXfqIT+hv77NXg7mhLjHMrnlxFPoU4HATWL/xDXn/LMrNIfOnJzjOJoNzWZh8LpuddsW/GvwNrv0GDho07Mq++N0R5f4evEHshwPHCHtL1/iMsgXHMFRnqOOoJLTl7U3xDJkfz61nRH1rE38iDn51R0jU3ckCZNn4mRtVfw1qIUvpVYu5unQbzj444yd9znhbk8xyngXA+fHmDlygK84f7fvJzyYj84NgLY1xNTv1/e32kGqBMO/iiD6JNHzmSTBC9300r2tRZdFvnNf7feLd/Tbuuj29nsv3SwtNn/mFPG3IiiqrIfbquaUCJp/zdZDP8tmQbqNFSuAtPKezVVM5erHUy/Z/mgycHCeb0oN7Df9kxLgKhQ7H5kNEkg282Ht/sL+XgI7pdrVZY7NruOtougo85RfW7P+Me2H9bjytZpyZN7+g1FkxWRWOGi9SBHZm/+d1+bvv+3UrOZkbuLzpP2fvLbqkaMoIW/9FE4wYSUfFSaCaylb2kppVPDXB8CzbwcvdmGL+yHgOF6S6Fp1mRKEZHaNzqx2avIgv7LtHdNMUD23U6tZ4n/8+TsokZsgIPPTw8cZaGuTQDDyxQKydeByd1fjRQwKXwIoPWLzA7ndFInBrEfpD4HcayRQvAvSAmN12F7FmunwI9LpM/Pik0vHeKuOYf5gn+aEwRO5qhvUPOp4NUQPYR9k5+TH/Q+eXn6x8qHyjXCbqvF+rybC/NI4Gwo5O9YjrlcnbsNUbLqAwfTnZV7As434k1ru3lMGfyZaeXLYZDVk2OFDxOjGTADjj3iRmnO2zNFpVFHE6f5jbp5Z9QcTHABQPvDLwO4ee8hpLks3s3aTTY3hZX5tV2tnW4X43s8s0LxXLNQ8pxSLjfFZ68vWWDFnG7ewNqkxna6ci1+cL0fNiomtXDvbWNEqFOW5iWhzdPa5zcRWXvzDxzJHUxAu8d3ct+TudnEyaZR+r+MV1Ck1c1VJkbhM85tqH9IqX1c/Yk2lsSF0cxDDXD4ZcomrRL/lpEnY0bQ40ko/H06i276Ho0R0DjQ+agLpuLfMG3Gf/Wp5Q0wyXvP3gwgy84Rdq97xMi36z33c/8xr01bzotBG3tCDkX5yOzBNUsdzTyK5sFDl8qEZX/VTOHtQzWF7Nx9cdCBips5TFgwFdsrQ/hyZIwewn0LEPGLlHmIOf++dKwX5Vjs1s82aiLqfEEB3A0gKWc0S/9ef/z+9Y2pCGDi4eaj/YF7RZf0K867KcILdwyOKOeY/T5xThib1tm8rYLl+O7DwMyBtAn/jfkpqrP/I6fkXb1E4FlCx5c3vDlxeVvXWvb/CbEE5MUhgoOHa+H5EmFCd+wb0GPM9LDaD80LOLBVsVDJR1Be50iORXXqvSKMe5LZXJBCaUeDXd2xBFDDNEehk8wHVhNUew6Ak8aFvlWw2f9fx5muFbfOZydYn+OU3S8urri3sagQISrxAA+wmkhM7UMyB4BXyBndRap48+DhzUaht5c8fZL8pWHMOMO3iHvatfRfrjPXi9LSnVq2FYaNU6n3/OVJeueqweO2el6SbakeJSdLANVUsKjLq9HN43VxoI5M1hQ4FGvfrZ9u2Ol8qPTzIgvhkUKeEokyZmYka3h45SzK/92M1xPvcrnONwqln3+b0MYIEQ00lgyJ6WO12KbUWRIqft8RXpZKFSiDKvdf788rw47l7kdCkyHI3VxonEWjh/5c//6pPTEGhVbb7v/z5/4uD6fBskXSliimEOKMS4WlcIhbpiOvROp5V4MvP+2/9FHvSCmptC7DBFSDMndn2/7ZFE37Pfjz24dCPgqkdxmw/QlMjZRiF9sxrzHy1U1PI7anlAix3YfvuPg/P4//ZLc3k4DD1/OarNo8x0Zs0aVqPKKhSWOVNtNixc2IL7lcP43MhzZ2T5Ixh73/ZwQbgwNg7RyASugCi+eiS1/1ajmxseItZb738DgtpGxZGhim/ae/0g5zriCgE5Uzcs+gYF4X8Yi+RZ+fmEWUVCtkLDgxNwJ5txAlbfxh6sCiqkd/WZXax1mlTAd04G/4xzn2ijfIeDPwog3Tn/XwsQ/6nswNbszqAsieYV6CZ1AZZ9kFi1mtU/g2JrMtSeF2SswM0z2Imv805v6a8Y53eupgwGgbxy0nKkEt55kN0I6PX83UfVZGKjoe2Vi1WrTdu9zJark5OPpbKPqHcSjWrEtHTi+DgKtxfFMHGUyMn4y923ksC2xuGkmc7Yn77FxLyvfQb4jA7IaTDLNJZC0kVEzV5LGByk510KiXx5fT9DlWXy6v8brrD5hKU15ckdSGJSg9bXGUBFR8Cs6b2ncnxcfb3O/gPXggtFzefvMskBE8K6WM5l95Og4tblhv+y5//n52aRQI/ujT04Mp7dpkJm+cUC+sH6fw0SRYu4iyheeLpZVRn7p9e1vSMbXyOO8sS5Qvgx759Ec6WXM6dRBQ5hrkcPUWAGLt2TNmYq19z0FMOodgdAa89lL3O6L4XJNjVTk3ASRfz7q0JiQI4b6ejOGNVz+xaBgfWNlvw1E7ZfRyDTFNphI9DHj7f/AsHC3eW5CsLr3s+TzkoyftPCBnMf6haUzMle1Tlp5vz3QNhWXg9uC+AELE76Mzw8kv6BB0woens0EVrgi2oEn79mDDw64782Z7kmjJiashpnqYdFG863f9gf801R0fGi6eFq+xQrPbnIpw0cBAxOBI/idMjgKV2Vh6//MsfJydFEFjdI0ll5WjaylVbra4r3WKTW2mmAjKlDxO+1T7BouM6hyc8p9GJJNZSLs5kesk5KjLfLPZDy+uZuUzB2DREYjlz7NnOU3UY+7Rn9epSIX/zYDJVb7uOmS4qwyprEmqnR0BRqpfuje9oOfVeGV4YtGdG1tBR9uSxLXTYAdZU9RwrhQrPWj5erA6yw1MEa3Y2pHZ1uLz78dPd4idydfdGKqEUXhzQTIsbhWTKax/aVBE//hhjcr7jPK1M9bsbh7ttzr0Cu+/aqx6QTS8o0gBQ0hBwNWuhVf7gPuidNtlUd/JPpq3X+3gwS8w908CUnRYWKQk19GCgFw+j0p49v8qp0WM2/tr054fum8dCjnjrD2bE/RJCLosUD6btFMS4TboIjk2siwqGCcL8AIZJxE0RBzpyfrxDstAxJhw7N5vu7fQ0gGYJ72qnxrH5mkPSdxfTsQcDwlEI1UEAETJp1BFkPKpdxnNxArWyEKD6s1SKqQELwq2PmJqJlc8I72sRV3tTMahJ1JHz0+uX+biS0wSrf4KmTW08719+e7f7UCjAkrTxMxsinoNcPjnmwwuZtw3OwizeZwPr4WZ28HVMTLkx/HDwRw6eg+y92URrL6C4qPSIXLfN46mvPjmGC8KjVNCwW6IIT/O2C8t5V/Yaf41NutLcpjQl2Mr5W3OTs3d3xM+LoPL4qvAJUxsEqMZT/HJrNUpJXjqBrLqW3yiHQzyRraZ+U+dyPb+gqxYV74sWh4GDdn7PDKXwfpH76sQqiss0Ks4nsiLntEfyoNjgBv3F9/5BKUBsjBPhwfcd2NYom2aV3ftWpbuNS0qsKUvcRKbaj6o126p5fwlNs+JQ9IZAftv+sGOtSBX451V1WDotLkxKUYKnM/Np8XuDrykrn+1+O/tnB2QbgNXQsNYwK9au7wQz8KQ0yEm/k2XqQWsR96XxnLd4W+l3a4eMpZizAzt/HjYBR1WBobCa2TE4koGDSZWdeUZuyb/MLNgrYJ6O04YeNC88t78Q35JceSysdkt1n3PlsYC/ee5RCbQMKOdVs1q8s4MJBnz38/M0JWUR9/YmTLmPnBn2+Jj0uqA0OE9ydsuxJ0DbDhiruDOMmd2EVYVXOzXULjUvFnB1SR77IMKkpAH77jEHz8NJMpL/e6cGNdREHvL5arEbkTBfRhTTFiuhs+MiJZzG/Yt+NkRys0pzZ9KaSDX0+/5F0n8c508em3yYJRmtTYgdsIZ/FU59MQUvHJgKedDuijm9GH+TOf/QD1G5BnTBi0MS703yOJc3Z3LWOFDWUGGmfqRauYYjFsv7Zx8O3s86VDZAntlbfM/ZEszpvi/XqvdhidjjqyZ+/h3qaw2moyk5/+WZ7ZjBs4mI5zw1wn4DBg6i4wIkLxwOekmqaj2wHm9lB+ctchWcHfuBYqbqIRt1eqjsk5+TfWKz25oXafBaI4PT8hE2r/SUm/qSnij0veuoaTlWioGD+ShHlIlqtZjrSmrfKn+fU1qxTF9JhWz3uxVbVkvW/a33INEEpZ1VC/tFbuia6FNLYf7jK6l0FTMoP0Basc3GcpWSH/l8MhJq2V7+5Es2SFt8XvxYF8opf+Ci9VWTJjo3cXARug1F8+Na/fH8wdkYibbFS7Za6cQn1unxPBnSK6mduMGRVtnu//XnX3nPPo7i07jNefU2SxznDD1I6RS7O9hPi5NkgPsam6GTw/iaFrWf3LxJj0jQTagIhmMjfs9LhkEE3QTMRZt1X9xP0w609s4FHstBjDm6sFnLSiJgOgiCQGa1U8PBxEzEU6dxuxWij80xFk3hgl2PYqu7r39yaggPY3cUKJRYzRITf3jGBg4qdsystgAbEAwJX0/P9rQ+VSrdXbdey2d5Tj2IdAJFX9DCOw/mbF5Nfs+1KiCoTHievNj8vbNJ5QnWvabB5Js/P3g8E0qhrwVsCyS57L5ZTBo0XiEJoXeyb1ob8E2Qsb/Tmdw22iz40VlB00awtEtxE5MwcrJSsXPbbgu16u3ZFGyWfTMpYdZkhOoUs3qe4qAj/Fl/H5fMTsb9qAtL7yMhqyX++o/zE7kqFWpnt+I0cM4zfINooUB0cZkE69ZAB6pCJblS+9ZMzosT/tHjHo+r2dLLfU+fPBQZRCmW0rNXFp88HWqKaF58h9rNjm1QM3jdzc1yR5Ol8uT6NMkaDx7faQBYG9ljv1Go2uBCc+072y9bb1yvYFi5XffsSHwKK8fXmVeJJ6Rsg2wWWyL7u74VZfvIa9hlV9PDQt1KMw3L6e+vtDeCl2GrBA4OVaJTKWcU10y2vB4o3WXSEvgQj4T7nnhcNXDwX/78hcVfOTXcIr1t6MF3hX6MEetue173brPdmM97bho9juOMaQluHEgIWG6aYqwhoziMSZ2GHDQrHphCXnjn2gtGKDRNaMoYmO0dHR3A+9gaAgRmGadX5+B39nernRozYqhmzwh0jo9ZcD19rY9RDGBACLEETcgkkEF9wZYHW+MwJY2jBiUGVabNAkQNYHYP9VGthETMt5vQIPm7m6qMcqlSae5kybN2IqDRE+eMblHkBu4jSWR9ig7ZfFexX0yy4WsVz1c0MQfKgq2PJ1c+VOGzuMY7UQ0rMCjw2fNnETTh5aunNNXePjYIficILoTglm8zICvV/NAx5Jf1j3m7EsU+PO3ua0Z5KHl+yEDpqUjri6IUNr6yPvo+d3LURNhiF9kdUBp0qfrh88VUWBSQ0ZkzCBfsQLLlC2ESP0Su8ItgN9tUIbQh+7P2VIYoxy2fF8+tcte2OLO1l+X3il496vQqaM1zsbjIDhVzSD6ADRwsLBvAqtE83Gvz1WXxz6xaHmxrdTE3lbqIv0XJ96ou86/eS66ZTb10qGqx8v507bAZgBaTu2t5UvrW0vSJPCA6Rq3L/6prpFzJWQkFzECGTmHLl7dHj4mYCovXj8ggv/JVy/SBSOfI+WV8GprJvQh1PW5j9HZCStjAM/Offw5iYd8M2girybPMMCNlpgYOaocjc90bIA096NNT8a2+z++dHbkuV/3BWTwAD2IheOmdBvRkCFiaLrtPh2Pj8Yht4qjqApyTWQFNb77MBU/KbpQvD+vl9wN4ez9gXkMO7I48lAecnqLb5IFT+DjuMy3h9Slcy4GL8RHhRQhDE2LHPoQ2KX6TbZflIIc/SbJiy3YWyBs4+JKBv8gQLjRiN8Qrygfq5i0EyzAIAdHn5To/Kc2+F8qMtJll0Blrebo6oFUv50+xKXEBVMmmbghMc5jbmtv9LoUvVL5lOUiDqShVFV/+RC/tB0NKOGcxqLRBUfqoaF7rDJF1L+Lv6PlFhfTT1dTWYJPMCS/xcz3WF8SwCxqExG+KIs8HHbbTSL60H6qdN1PuMa/XWaVoaCv00/uljVoW3EeEGcG+wgu+lFSFpcbYcu/TtEpVfWcrU8EHHasVe9DDcM5PTCHmozmJSetKy3xYlgaZUvU9f6m1govibLtbkpqbfR8YX9w+WY+X6rhYjT9IpfSFZMHnRUmaaSZr73aa1IqgDjRkbPLQ0bC6yB9sL52kXBCvvhdzk4uCCMiFUFeey3ettRhv6EH1qdButW2pQkUsffusnyWI1tJ09LOSk09Ap1obTKWiQLzodj4nhHwTctQqNu83Jlwuer7rcUoqqcEBZhZ1wZo3XNCSoZCBg/5rdoV50oGWnmVufABr4CCKPhjYGPdZL1JW6msyv+oPYl06gnYPtgnV0IPXMWe3wQDNKhxeO9V/pCkkcnRI+dgweWwLbJMzkwvKE7vmbXsxgG6lFT+48ViwWWT5MHSmpFAsFkiZxAIMFEkw2yPMrn2c4d1pexCijm9iDJLa+gsH3afbVmsGA/wrHFxr2vBjFiXwVe4SeJRc4HDaEc6Dg50aQQ8keh05ovVBFr36kWuQz9kBn87DGSQLfWhb/b4xWYj+CEADwbLWKQgoe/xxZ5PNz9yeNQ2rOls+JLr0HeFleTP/yYeVxXrpoYCRWUtbzdbKdsfu56YYApWN86AgvQc6TW9KKhYP6Vtyt9IA51XVCWEK/dxqCwv5ceezqTHKDaU/3zuLyDalZIWUAUDbuD1KGUJMz7nJYq69BrJ94zzfPMKfe4MJJXz/TJp7nwg2RzFIGEgj6+2no6jB+Rt3kqmtPSy8erH6Puo5ncHT6iB+15uPvpsHw6VZX8o181lzTZcrZnPjPit3a86JLufi59dfPmlyl9Wvv3t12TppSDWHKqO+0UXzj70a17Vop0WluGAbbcBf+3b5eacDmphG3K1UTachLrvnx1exArcspSz7y/LcijdzAxvXCQk1y+WXbXrcKkYP3dN+7rBs4WdJvLI0zsZ8XzS0X6BwYeDgv/z5d7Wknb/bc0CVN3/+cEQ1cPCDlwsYdU0su73hqVcMjBO4+QL9U3kFcKUaNxt6DIxwSAwioWkmTwrbuTXPMra1S4OeHXpnDGru+MHTfJMpAHbnQ9rq/RpweY/DEJkylKNkc489K47OoF6b2Wa8M8CvXWn8my/xLyQURP/jsfAfryHxFdUCMKCmBSq+q4Dur7d//s4pnZwQ+z6YKw/SREiAyVK+ioA0VCFF4EDY0CcMdeMACbV89e63SnqpYdZ2MW+Et7SCgYMEt2yraz1XvSA6rIlzyINrLCtP8rOnHbu9XZ0n8neA6GseTnGQH+NaZj5/r/0canyl7MPYYjF2Vm9a1OJt1L1P1YuVycmlNEx/VOtm3zg1aJUmkOXbkdOEwYdxehF0Qs75hBPYr1+eBZJD3EdrbV5ey0fVyCLbwwJOQXB0HOSyfwSJGNZ0OnpKjvlwY7GpssSOLz97B+X3jvksOOUXw2H2+8LhrgGh5eKArVQMHGxWu6OL9TV7rUSEZj9oSE/a4HG3MTVOTlK65a9nJDUuhqlFpds8HjfNZvk2ubXf7hfLwzu0Ocm/yBbfUJGHqywSGvJaIxQcfM/2s/OzQMG7rL7cHpzU/RSQt/1STEkUBdCksoDnbXK99rhVF/DpctcuTX3bO+Ooj/pgHv05+h85NX/ntf3VH4xbdK8VNIrMjdm35KYJy+4sMSfK1nm5aJp2VGQ9DRzzxtmIfhVBD7vlEo7jts3PelWM7x9GPR8OImbheIdzO/YpdPvg3Esha0FI596ZcYImNoY5ZHlyoP1Yo/7KqYmwrI/9y5c4FjbZ8n95LPzHa6hoIIgp8/MP42s+JWGGmSQqM4Ta6apiOHTdAPaKr8FX36+FnFU2ecaXyG8nbPsGWs7Z7Y/m7MLCMLDK5wExnL/ZRAK5iVgQ3lULmvpIFr1q/urR/snRzxCFh+9lUCHU5nzRao1GofY30VVKop1KM7so8KTJAo50aWPL7EyMewnBcytZj76LdHmqDCpKDfs0Oa3F1QxVfxrJasvmSzD1OHOsHVspjhhs/gjpPKYVuaqXybY8jNV5tiAKSTXkmh0QvR2Ar6Bh5I/paQcwzaTrp6UsWJevZqVfRYqvZfr1XdU3E2bUJ7xPxl/6iwUov78Bj5darzh5ZKbRztVk2qxOSpNxp7zTOX/tjyXuKK0JRf7rst2tlFxx6Mssr08mgbsiPbuVAGmkpKR2w/zSecjlKyY5/bPsFBTK4qXVErn3flaUe1ng8VNfl28Bqemt5tvcYdak33nzpkFgZrEXJ/i6pemTddp1CvrJ8jL6uKlF56tZ4v8/p+YfPfh2LwrrCd/6Vdrv/ZocFqrJcHDOzjwT99ZCNltnT5A3zNETO4ssv25Nf4peeA905oilQXtYJ7TvNFc4mN+955wHZcaTVUopEN5JIWx0tVPDmLFGLhPvMmYe4pFYZpVTw7DJ9clfvsQCjaTe5e16EGODv65t1gAOPKy1Yf8ua3ewlNk/T6P8nOHXqmFOvUWX1aZH6fEB7wuz9WEwoET/DhBUC8+EDW0SSzET40wdV0Xn8z7ZFQh6FHvMlvWTF56TnbksBmbn9havrXXUaXyJBzpT79XkdtsiifzoVwlMc7f0Uu810IvttVexWZTu7nvU4sui2QsRhujfbr5Xr0OjvGOkOpfLUuvFMk6Iykv6YSZDOsx9YCd0kc/wyxxE6FJFfN689TljTWGyyu+O/kkXUZ17PnRd2KMwU3/YZsboVrOTWxS7RFfrWbt3M4enxMW+SgV5+r5B5mYcvWE+fh32c5PExaSUfOr5enrBH+7SreflSU2apiL650S5t/xOxJWS33S+HK7Nxyp39wFAF4eM2O+YU9W+rt6RB0qn2uHUx5GB3Qa0CUzl2+Xvs6IgGLzOMqLMl/m2GAZmGagp3TqvVF3jXr2nBRqJ2RQb2qO+BQ+RjIXS4B/XyZD6YAahZjLsVdnZ5mBfEv81Q8XME7j96fsNo/4rv3tKMaShB9Fz33WkF2P8lT17ehbY3nkFGaOKnl/nIEeMica7Oegdy8LRgA/cK6d4EdzblfY9Cq57DgqHrk02C/J29yMQXobMLiJiOoKzDm8mC5CdOHC5ixwn4bcZKsSZQO38my+xAcZ+FliAf++WJlFf9m+vIQK1zh5ADG29W9v0+sj08eetzWLeHEjuMJpoD445Xyjb5vYQB8VObMzSum+e0z3iuV3wkTOHc36O84Cfsl9UWe5GHfBuVOXb/AByXFXx2cASeyxLxSWTGXHhwdPZg7s+XISVmGnJs9domppzmm+tqJ+MGGUe8em1M0ivpM0jMkdhH04v91vBfhFauy4LxBZl130YMOpFFSoGBCgUe22f5jnk1RkTiIL/cO/jzEVkZ+R3+5LvQRzgjHJCkvaYd3LfG/lqTla+VbB+7UN6V4vm0jdfnjUpqfJPBy3z9BFkZq+5blUY+i+bTKUFTj2l93Z5iRGxQV/IfX0ZPQ8GU0J9uZEavRc4O5gv5+X+cPA4s5QwC6eHzdOKyfLUpEKF2kfnxVbb2ynB9p/yxA+27HOBRUqmOLqdgRqgPo8NcbmHdR8s41JFfHFf2cEQVRKtQLPSh9HOdDbwEXy6e+HPzyaRab5ygMGqd7ug/WuG6k0P/n0v+k9+tyWiUlBomopbur4FPzt0/QL9S0iBHs4lYPpbfuunEHtxABi69jbFCBpNJxz+IrUhJo6OPG6Xkoade0fbtPOYop07Mxo6BgP7c5hhsnkBCI2c6LxboFNr9F8zVGkcjfB/+RLjCcrjyND/5LX5/Jl/vIaY4O8kfJ0HnSVom9X5CDG2B9KzbnqeDa20FaVWXn0/wgvB6ekJM/cYTp8b1S9ZEW5Nosh+42J6FstHpvHcduNbnNW72eG3HpH3EQXGgjK/Xy72rMVjPfuNKY1wptpaFCrNUZr1OhK7ST6iRaYXc6noPF+OfNPop5D7dBnWJtMnYBEy+IZAzk2DeSkSPG0QVbmOCGUAbIsKBVjp+vLT9tbvcR6Y1rcvPUzO1C9k9zCJz1Kakz2HxGnIFFubBZi2jZSEcOlu57e5Xu7alBckueC3JzVzDVZlzKOevOLykh/ItfWKkqXvOp1JruJw7dtxEpjGEz97ufnavGWmlqm5qA8+JsA6VujwU1pNBvCvasKr5z4+Hu85Nbns3/+ZNTV/51JNVfHR0rztLH5XKFw2KClgBoUTB17OVteu9567spQonj1w1hJVzRsvznWQrRDsiCqFGjpKX+adqeHW2L+ozA9dGuwnI/OVP/8/M1RvevDve9G/+4OFWUKwow+cfxbX1y9T/uB5ZpiRM45++ch51yaMuoFoxyg6X2BkUvSZ3Ix9dDEEHSE+kD6wmr8HXA6oHIAPlwQL3i99FsyTZZj0aqeGMbF1V6xiKcAOExs1pwnzZYZDc5HOX77EzqQtGCCPb4TVLLGySpNh7n9dv0XdeewMTPwu2vHCzEsPPWHTJp7LCXio6IDDtHeH6mnL3LNzdm2vOOm66yMvdhmcPa7ktGVYoL8Qm8kJncdlqwgqdSfTGdLCKXG55bUIauEeRX3oS67TWlYMzssWDoc2gxtnq4kN80SL7lKjcl7/8uvTbL7k+9WX9yZSPXFaFvS0pPNVBpBQKjcOzZefi4Oy9ftY4mEY+MN+kq/NUXZ7G2b0bxrZRCo5OB3itiZWfz/W5IesJrSynwv2mIlhTpc3HTBfB35+k/Lhm4o1ValmXLBUxX1XM3BQim/TusCyF2S9VKze3G2Z1Bhbru09FiXh/RCUlWRTGeYLjwNLyaklI/HLrKFF7DEWK5QuHh+sPbUSDN8e9I5LtKIqDQcjcaH2vXVz2OYFcuRM0C37d0LmxTDygC6Fmi9Rv4bMS+ljqSVtkXg746nQ0bOZRmVxjzVM5+cpnK2Msl+3bv7gmH5ctxpnw3uWGQYqySn2rxkq7mvc4R95wPQyYdu8+z5ML5L24DdDD6qHTEFnV96z6fC1j2NH8bBngbOlogXicrA9CqYrFszkxfmUyR8C40vjqWYBdxU6uLTcILtMBkXQHOrMfAsAETVIWLQX10EkgGI/RXPgK+GcQxjiN612agAP6Keg2NtOzbM9GcDAS/RfOTVJBAUMHMT5tse52SFjImVeUG4/hMc3Ei5LxHuR/onavKFX8jeysJhMWR+S4FIw7lbT/C/VIKnV8KYhD5ivY7wwdUObu1+bfMhfWadDE9ymLYVhdlrIVg9g6TxcLDnzpQMVmi/va/MBytg9Z3+whBygEu+ro/Kn1FCID4eTcXP0qYgpjUBn1MmO24vBMUc36tLd1bNnWdfK5fNNmpeclK1zgC0JVxz4otn8Nkn0RiEhNMGsawOGn259OzXTE0KwB0x5BTF+wdCkP8HkWvKm8UiPS93C/nWONA0dtTVp0v301QpG1XE9cG6TJ2UrHsPcONKUp/yX2bWsR8FiE+mPRvOP9GjUSFxtOfROFQDIuFtbTvDhtHLk1zIyP6exM1UzYxXfzatiFu46mlKvf3u52KLHQh04ecdAU4Pcok3WNAFkiZ88+rRisxDcCnKq9a7JF2tlzHF+4gziDX/axA0yltnO3OBIy5SInvneBQzMEyv/mqE6Q986NTEdvDLO03/uRdNr3NwzstZ9JGLoQUFPxd8N/QuzTN+b96xaqwSs7bIQESecWDELHOUKMLB7sJ2uoQeJg8ODtPB5Jw3Z3PHN2WiXMNuPntzwPrgOjRER9mKc23cisvKCQYL75tVODT1JY0DY/kmHDNXGevdJ4/n5V04NaP/K5v/KLfWzlo1lBwrP0hbwIOWFp1nb5sQc2O3zojCeF/SqzxA1h/hrchT7GTnA2TNLoWaqbzvmHxgvzAkn79hC0yLROi/kF/6ZeIWfR3pmhD5eh7A8fajYgNHcGfrjkByPZe7xSa1wdxEuyefkeb4zsolnbCLXK4pf+4HR4sZLiiPp07bbwDNqWNt8KhDAWZE41hS80D5M3rdxJUVk6z7YAHv8JTrm0NnvTfQ3X9AWuS12wPK25EDw6/uYLgQQ6XNOFibU6JStSoudUSOfH16iD85aqQkvX2iPhLxMJryY1QvyUdmFXU16oUigdNObkNMPg6aZnWxs2Jyz3mCcONzSGOjjson7OrnqYYWHap+CCWg+8KMzyTu51ayFchW73n4Pviqj6dmTGSg8Z+f4KDvIG2KVEbDKjEWDjatqstR8LzQkKL/hAFSXkGW7F0881/5mSuGl8ZAw6YBJvu9YLMbZyE5K6fxWz+unZp5/zVD9PbGQmaek9Nnf96KwnnbYjPpUWBp6cHUvOjNO3XXa0jc+SnFu8gXpY5UxzkY3B4QS62YPmhELQ8AetIdkBYBLoSMqTURgfr9o3iqXM2vRg3drCBtDsHyAYiTRubksQHYzkD5/5GCfiTFwkDTx/+TU0GzSvPIXpTxZoYkAW5I1RJGMW96xaWQZ8p+XE6DJGwsmw5FIPmKwrw2/rCzYEdVoohvOmGN/zNle1Iuu2UyU/emsr2iLOOBYqGPKv+XUJOcM520/iJpPcjKpMc1T0bOtpJkp+R0PVX/h3DzoJMWmS4+XURksy14H5H+n0Sz+J2WjsoOvL4e/tN7YC363FCr6+1wGG6VM7YE7eUFuNtvVUEDFE5pE7+QluOQDH35XsRmmZz/EJT6c5mJBVTT4VZDbjj0FHfSAHTnj7EI/zuuxQuM+ue+2WNVq1f6plFf4qddJzzOhtYUkAPevCXgWC29qYnB53xaGhSlvOrK0gyHzNPVULU0+DafDZqq77OkOqHsrWeTu6OiyZyL7n61peTLHbp/21TLaq105g2T7HuBbhxOliBxiv+lz78oIbEi+htnemVWE4uLdzjnanAymld+Xk1KOhWw4H2G65Urxg4xMaLMXV50JHOhvBIDjefTM7vhXRXrIgJCSmXoXFPvfWeLYLD3yxOPzhL72n7y2VW4ppx8yCY1yGqdOPPhuQZctECeGJOvHbKkeYVpi9sTZH0l0f57wo4zJ/bC/Mz+a7bv3juG0aD4EpWJ8e3fuh5N03BXkBYzZPnUczCjkIY1Dfmblz99BCWG08iX+J6fGm3i28xEM4O27Gh/+K/o8ZIbRFDc0OajiofoIrE9cTBA/cIhcrmVRYpNazhXbnoojAEvsW1v7Q7jlOI7JQoSczG9jN/WCGKym1wklF0MNEmsU553f9lp+kR8eEk6UsHec+LHuayI18Hy+hRRfdV61e1u95RVDRMZHm0/zaUpDDrM7ULKPr/6DHVVCgtTgsH+RYTUYb3w6nEsOQ/6bSqXbqMmz9FKN0U8H8yoJpFOuFppHFZ/2rrCRpAshn4wI7ZTidKZm+cbH6LWuRVkQtv8aTMh706Q8E03L8qvzQ8069S4z5P7dJACNPxBOPTrYffhkZhaFSNVzFoyyH0MisYf2i2ia/DT70Jz1hnrto1ruTtelYRlhP9zsfe3HpT3l6+V4mbGhDZPeWRmJNz960VEbbFXnzoYsC7BkG9CND/cfryUNZfk02wLRq+LCEa10/dVF/0vvnbgQgIUSr5h44VYbg5RqTZ5/oCs+2/hhjz2ebTj/W5HeesdTpu72NjWvme1Hcf7GdP04ijl9M8hQJRkhMEpuB2aZNW55OHJWfIHAkr0ylUyT65ZVr5dZ42PYqX0OwR5ypiN7xIVBKae34/HA/iTkp8YeKG3zHLA0IJYhW/zuYb6J+kxL6zqkYVZgXA6Cah8/9hL8mz8/FfgBOVe+xH/n1MRx1BZc7ZY2WUeG8uBv96KI/U0PihOSzbcDeDsnzEbrjjkscYsivE8GY+R5eQgtewPe5NGcxbPXAuwLJR3mciFqD7BoL2dxIO+jSFYQ0iwjwI9lLB8dCB2mTfzGsGg3i1L1J6bYTW8NrfCUZaP7YMY0HEd/OrnG7Jq35yKseQ5Vy/Tsgz7Kl8pNcsY7vHc2q5WcCMSRxXFQrsDfbguD0ZMYmxraCmupZkq8aHdz+QPdFqAxZpeKeknOtfn7pM0DU33jrNol7UqAUU35plQln7W1aWtk0jRbeVwhRfuorAMXP7+okyGDLsENZFF4zvfH8UAJdR3R3+THRWs8lWdX0CAgfZjOuoPxaWzbMiv2utIjMOp27nQyVJUGi55UEaj7+RhXwENzQ06ubBMM1r/+ae8UVOTSm8dC4QV1mKNL4Yj0Oc8bj1uNmuRVvlf6ZRHjdyF3/db2+zlR69mGZ7iz3P6QcoSlYjkTLFRpDlzNUBlnw6hIQ8vAR2TVo9CN3WcJrHZLp1HXpoGDnJYM5Uqps/QNBYRnse1dPTUjr7yJgBY9Q6FHcFiF7TdP5hD/ggJIAsQq/J4PjtKIPexkigbtyYOxHQBSgnFCvkibHYf1RLZUzAjYjncfy0TAqGh3IjPC5B3GCRuM26AA97Zbev6Yhxz/5NQYOIiwJjLRZPntmI3i6h6zj0EntPSWu+R++WoLLcd8xtLN6u+mvCxIFYlEwnz3nTspzvxDK4Qts+9xNjthmaefX+RBKEJeWYINDgr1+UKQKpPetkVaq871QuHgLt9SpkAvamZA0HV1oC6mXf83uFUFkGwXevUvpv0af/u6f9TtDWfRy24R0z8RKYnDwV9rbkbuz+CrTxw6PWHA8mtOLylu+KH1ILfHSk0lZyGWtW3g04TickJbjK9S8NtMOREmm3RHrRQ6b7ulWKw7jtS9l1RL0U0darCovLfajixFx3L8x86Mmx+qLcaj9nyHy67LfvXaCs+G1Q+VgVY8ny+7PQnaAz3L14GM/P5QKfEfStZ+079SE63b4RelUcmNpbNigBg6HVgNhuHPJzN+ldF89RTEila8qcxDZGe1bGhDRU5U0MRaka0SO40WAC9u1z3WlggTkccDFSTPlUTIV5AH7f0yq58JADGPSz9VE7a8DowSevQvZj6P4dF/MfN/JvcWyUDhMj4Te8egOIvb4IeHoYGNmPd2z2Gwr/BO6QgvK0iMMT4Gx8PH0wi1YPJrcCaJHKmHwctrp6d8ePSAT4/dccR1nCBNa9VZWkhfcmshJHCwJXDgxp+EY1+j8Xv53B5c5dSsdksZxu7g/smpMXAQh7bWGmYna7LxbAMA1240MMxCYfej2YI9o5NC1BwJ4KHmUxqoy2GygFjCWJc/HMbHwdm3u0tTrE/URy/W1txkyntLPCtzWZ42MXSF9lF00IHgVYJsdwR/8XFn66TLIhC4R/TDlAUvSBEwMOWjUydLjwq8FK9Yx6GZ78UoBXPmamvrY99Q8DPwKjKuQuogI+6r/JhS7zhWJoB9/RXrl9K+07q1qlSt7rOdlfE8snFVmC/vcg44nNd6oh/6ILj2aEV8PbikUNAFs+0oNgJ3tw60XKvMXDz0YupjtzORM4vAXAPWB+6Fd5EZHd7EWqbJN8Kl90K2O6vZv6xUij/ec8XBl6m4pM1Kv7KtvM9YDBzsjgw9WFAXO1lpMjg6M5s+T8Bqlnz+JbyiGFZUcpSc5zSZcppGVJSpeZ+yLWRiz9KWBPU7+v3AEpxVhr9/VoXh99ICYIVOsnfovDN0dzfrnVNADqwmPMKuErWt/Xx4sWup1b7V7P9i5oaiP/5nYiFwGRhFbd5r0/X/67HAaZkgZ5w6amnRlqXDm4aCTCycnT7K44z7xHnA+czH6aTV+xvdINn9/STZPojv5pFdEbEmHmDHwejYtYmEzRdrv9UJk0OWlxZA68NICoq9+fNj9iKxtfIl/junxsBB++bpm8eCLXhFqga9nwdYj2+1sk2scks7cdwfJrCcOYpFU2Emuhmq/CGCTlxKwNU58SwXyJEJJrP1Hkh/VwgEiwsX03xewUQWLWbtzvcHuAmVcydfSpy+vS82Gw68h/C0hULm1ooqsT9ArOk9Z3L9Ye3+dt/WKGv9weP7bjd3NUnnl91UVSmPdmYnoQS/7B3Z9XRg5zxQsCqc6//w9ebvSevR9nASQsJY7NxCC9Za7VztYPWoR+YZmokEMhPGMs9TIPzrb6iee/R8731/9fHpo7C71177s9da+vwMmEpZ9uwhO85/Vwr+GJLURL/nkdxM6k2yn3AEIIz55uU4tPuw9QYB6QVk2CPtgQZTIRs+W6PQy0w+mRylZzYM5PdQ7xIzPvWjuHR9/ff3fh8ElRscnfOnSKdyKI/wWWP4dnrReg5ovfjb3rA0ea8X/3RmSz0emLxKUfx+PFUyW0XrmGN6E2ygUPxXdaUtzRkqxpb4TRsxteLhzpbWY9ti2AYBvTEC+2bTDrwohJXTullY1hQksmN1Fa0b5DNgLX9/+qJjilqRE5foJI2QveQ2929HevHfyCxSrI6DK4+F0FdAx0Et+ml3GQ1Z596JW33KwIWViz411NmJuLnUq+4sAA5liD9zLZJsG7RGUYAqrwFJUjC4jb5t4szMcrTJ6dkmFL9rJyalYevh99TgoBqz04drNJ6IkBjJ7WF53qBji5V1CqucGjLCtqynkgzo0Pcrp2blsVBfaUvRLa6NkokMPcLSFjP303tWsOXN/myNvDJ/XluSAeT+gYUJQjHTUAHxyxxp7b/15/EOPbR1hHnGRtp7ku/6r5PvuTEm+FMwW498y8V6C2nOLUPNWw11rw0IMefC+vbU3xmlXqps0JAZy+C10oOVW8KgLDqrg0FrkOn+HImLTPFYGQ4n7+M5tVuxf3y82ZWlWvyTtemfeWSweJhTFaSev20f8ZzB2w19Fmei7aSRQbuixa7uUEae4G+ZErvcGkmLjBtvlRjmjdc2Xs6Iivpeq8Cpq9qi3l8cfbgHfBFWSyQcWq9gXs46/EQKrSmiZfPjsxRaRBt6IXU1vZB6/dDp3za7Pq1TyOElXCjfdWzFSSc0mDARvnnfTuEwOH0sGVdG4tzzwACeuNxKFe3Sl4/ZeusOlhpeIUC0+REkPySaJXg2x6G5TGyv1Qyd7FZcLXhDXS6xT/ejjoeGdQJ1vSFfPn1qvaYS8dK/HSkxiO94jA/Dlf/G9sWLtpTlKjoOqlRkt6fzweVTwHkdixhGB3Hip/fsQJ/IvIfnuN5BKZxrePAAASNzh/3yiUawcI4+mKcAgLO7lcP43QLY9TgBI4YSgOMhH7BziwDod0fIlN1vdzW5/fiSBMYx3hpa5dSstKUIBvh3/yenRsfBIQKmUfeK+219qSNei8EyClSRlRXPTz74MU0EL5Nx5xCZzXDP7GiwH5Mpb2B6GtL/v2v5WDGn/iBOJqCnHeier2dQzEJFpUAIzbBC7jul9w0eROrIbNzB/y7sZuuRNy+HEyiDH9uTcsXhj5a97VVnbJkVIsePOmbtDhv28Pf9WTijvr+E1+Y9NjddvxkqPO5+zg+8y6eyTz0aOheLaLPsuygrRp+dk/VmfnltPLFBpSxqQcMzBsjZZpMcwE3D2rsBPPSaSMMSYxrlNEq1cvXi9s2+OTkvG8QPd50wdKH/3LIURlVNsvRfT4gpz3GXHSAwOlanMkQf3779SqvCrPL9uIlp7+XBqO03yJ06f6udTBsAbSq4ELWhQToNFiePp4OrdjlElOIY/szyTL5w0C50FhO9ff01s4xCZGCrR3J9Sm6pc9kT3d+jamUll7Y0jQBhZBE5RVNNxmadbW9XVSP1dBb3dpr0wK9BFs+HR1CvDb0jvWTaTiwzxu58yWt7eTvWcXDPGl56jWQ36tNx8Oe9qI6D7OxpJ6BPX1AJmZZkavR1ZtE4wm084IGNW8ru5L3EnnIPhJvg/qHL5U6Co52A2+7ez+3b4yy5vTtPoQgdMaiJHceYEdHzq7eT8YAEwsnfc2r+yWsjEY2Bfu5F//FY+Od9MMAwONk4sDH53/K7BzofbJqkfB3Es2/NyJHEg0Z1Y72i4pfUBNO5KDsv57bX1sK02mP1GVNibdYWKcIqdPJ9wYljgNlmRnSLh/hFBaG7w0HB3DotqHBoPnnPkSB2i+X7Rpqx7x82Suii/Nfmspdbn5orAwUe6F/KhuU0+Oyb5tKoKuZ3Hgj7Il+hbpyWGk4BEzvEGtQXjwUAY3KVFJw5C8r8PFaz8sgSN/d3mZk/s6dN/c85iXK+N5IypT7nqz5NUdKei8a7zGjQCMgPNeN0tq2T9GXu+nqojVkWWSQeyxX2uPfcHY+mT0pW9ZgySmOa1MLvF3nJdFRbTKyF12aXi/IWSqLna2M0WGtnfIMCnBYHiv35Ue2VZc73Nt9tPX9or9Jb7tJnE0uXGbIf7vL1+cdOar4U8XmhCt3F1qEBYCtWtry/OtI/k/l/dubJ6fPsILFd8AcC05988GDgn0d/05bSWixjUPUm00uqQiW1E79hhvFZfOskD9ubH0xJrgrw6YuJIItI5HAdcho37dL0wBbIOiCXYL3lHGanzFF7RcIqPVejFiZump35fQY6u03hJR73Lgi3DSJ/z6khFul/NDU6Dq68hnQ2cfPH+2CGSdoHFo2sHGz/m9/N3L1f7UXLkOOkH6HeiRTr6mLGg0n229pdnA5p2T04G8xkzTEF5QTy/Og4CjWlyedroVp6S+Z9TobroDHUbkVLvSBeXa7VesbmfaOLLLmM8fC9uaqIAzvKVcAfuTox6MP5Qjh7UycP2tVCtvJxTIKjN5P4LJFxPD6aAVnMT6/f9/LKXUpu1kKpzDI5tOehIjHrlb3rcTrXR1uUb7q029cMuKT0mKjRSGgXT9ncXlORoYFi7l1qZLanTG56alp2D+v+wOTT2l+gCrBT7o150Rs7tJkxM3mqOJbw4eDj4ahfKMVey0o5/3Hp7cgV7MK1nzBNxoj/I5wrfM8uCRVu5/M+HpYf9pRKIRj9PASbDTo2Lo4Nlzfv3g5LBYZ1EjOIvMoOiRrMKHxs/mlByHXAt5jeIyW8b137eVfw/ldH+s9k/j87c5eSZhLnAQ7REr9V3b+ee/yUYtDuvuyYp0wveW1DD6hXnS9+uTitlmAGe0NiEYJ2d6W9GZMFo/51R7LkM5PEXrrgco3p4aabihL0xTurOVCJBnbnEfAVEjdkOdZwMJTwzZu4TXNm3Nu/59Q83vz0Y3zxJV55Db1oS/94H1ztRUdczbDu+S2/+4UPzmBVK1OTtG9znJmTokpILQ9nsddQrk66v39vc8EJebAW0nhLaIPyLXslYd/3RrK1N+ksLxmAMsr/HVvLgPtHruPTVBXu1q7f5o0zm0gtIwOnbMwAYIbwCRM8niSnTMGkf92DpfXi7+urRbGR0E43pEnyZlHvtAdluTTIZ5LWoWZmCfcFQrK2mGjLznPbB1tHCp5fZZEIYv5BkrPPZFNE042LJ8jTYpoj4WvJqDRvzcmJXLknDj+ZELUDbZ8K8/CZNPGWk+GQtgTQ5UcRU0dA+LwyhMc2YlPOoWdn8298GS5V7+9H09KHomMShEfFnq/yfXkSl3mYnNmlViGzwbaAMPXt68N2C8Sn+cS2VkDMswZcaDe4p0P8iqJDVmPguX6zrHSFi2bTVKjcfT3YX+L5kMV+EiCCH/+zK/ifDdVLR1p6PixAq5q0gvd7Nu63qmNvfEBgpampuDR27jU+jaKW7A18reOgXa86yJBHLhZNuNBU4GmApvlkyObKC3txIWzgYz4gUgPSrsfCbhzvHNoJm3PfCgLOJ6N9X80Y0o5d59gfQhRUAtVnh308pMD1+O85NToOcmMUzzZ1Pqj8iYP/vA/GcZTJvsHsZP63/O7vZjYhg7g8d1n9ndRuVGCFIu/6fsYLIXHocXiKuWssw7owLhfWp9zY6zRlnOV9XyczoXM2ESUDD58/fOUngpXaetPLtoGBkPVhbbg7kF8vGLkORxbPkLXUrZ83FuNu4WjjEfB3k/Ps36+W2bWdhW8iLvlCtlzZAB7DyqgCHDwWFaz5g5rR1dI6fHrcM5H88LupGZ06QtlyBDSUhUHuNf5XcMEsovvG+swmHPmiWIm2nVg/5yqF5/yNJTgprhUWJUZMzgZx7qxxfTiMz4GCSZEWuMh3lbr38hp+181N+OX6mlFD7OVmV3xSJS+rf91OpUmVywfGus4lv7XNda5+++Niy9ITauIR1BQc32RTYSx3DDMtvz36dMCXlEplA0NbFsjeQ/Dhxcn+e2pSHoUv7rPL0ocO4A/QUulpu3hj+k3d8L/i4EV3nBQDajLILX6ruv/R1BysfUV9JLdMBDZX2tKp187ofBBQ0vz84yFYLIA56zNitwB2IZ9DX7m+zzYNASv1iNkjWcG5Y3cXA+AaVNy0RxciZJMXe1bclcR5vxdmHJuTswYLhkcHhB0haTxA/8s0GRayhZ9Ii5+2Sv861eg4iMW2w3X4QsqiOa4BTxMFKvlbfndKx8FQOZ/5MDOmUU3grcAsBx00CNalCMYulb1W7UJuyXld5zkupBkoe7aSw67d72wxjRV2zrHnyQZDwRzdnK8l5utr6MwstisZR92IVW/nycWSwzeNbu553sGpD3l1/JA3jZd52jtvcQej1ywxFbjk+bhpq9oznVJxfnvhOuWee0PujW3my9C+DaKodcRsdG5n7jVCCs6Ca/45aT9SpSlqAdLfp9IEj5AxyldH+ZUmvV1gu3Llg/102YABbXoZn3Qm9Lgxj84/Ot8AjaF/kni1OcmGtpd1e3qRxH3lVMZ/+TwVtOKcnIvAziNhpzHgbmvbyRdlST7+YoTJ71mVH/faefnAjrRO2vVyjpo+GJJq40NbrgxE24FmMVPN0r77HcjlX9t6lcPCXOm2yx+arCLMoOEhBE9ToOlXR3r8v3DwllndS6XpZeq3qvsfTY0/eJOMB/JJOjunbLsD57ZfeyJXfNBVpYVq0UCjb5enaQrZm61TKpklsSef07l4WkvQ2O4dtKsZ50g6kzZsAKTVFCx7Ql/hNOoFfKktVjSkmwSITAloCuF0Ektb9Z/svon9gYM/c0v/ye9maNQRSiIg8dcv79m60cv9sI6YkmH9ZG8xqhZWOAgT+xd+jgpkgVIpwr2qOfyZsSjFdvEmxO5E22xgCjvfzPoMF0g4ba1sca2tlX1LqsHuLU8lTPATqJlDAR4WTOMUyc933x8N8yV4mr/Gy/2pp5jUWkVhiLHq0fMreaHI3sox2ur57mr6x4xd7VodNa6tlr8/Ys+ymZKzOaHNSd4MzbOJbqGXK77SqdvoLdENrnzVjG/zmjvDp+OEZEiTjI+hUDaUzN2J974kofDjDzKMjR6IpnuRhWKQA4hNYuraVcX8dC11AKU796uRxW7/w5wfpcjYKSuJnZO5jonV65vFvV4vTP3SnmRad7mmXF+2W8hqc2JNyiNbVsWklpJ5PWoIndqHnYmhWS6UildGpt6lngQdJrBsXmoet17mukJ1fSEb1ftG21kII5uexWgw/89k/v/gID2wzhIW+vZ+QPxWdU9Tyh6YvWhLr7lRzC6W9rD0RK+6UcJnfECHahVQ1XL8plGGLzgOiTkF6GCaw/Qp3ZFxRrd364hHOtjZTdDduFUbbHo41EoZYPP+WWrN7fRB05AAnYuOvbGO9MpJBvWuQStNDXiBXv/Ewf/JqUn+yQc5APSyMjX+6T07H7IVdJE9xrwrutSUD/CmjG7Nz/0g4hOBcd7E+yb4jjbITqZv3NuGDm+QResrQchuaThbMegI68JfRuJar+i7KCqi/d7BTycQeDJZ8JOQEY8+2jHOLuZhQZHRblK5m91OmmBnSZ1mF0kQ1WYiM7Snrs1SftDt2/Yn3ORteS6U5b5IDxUe+zKLBhvQwQ7e0HZAxjJgka2799uxiTADbhFg1LM3aqN4ozfGSva0aD+wkFlQ+Aq2RPmDSXg2oPCFadovyonlqQUblj1Gy+yZfpoV/eEz3MSOBh1fZc9gXHrXEzof5G6u3/3o9/2g8oNaVDoX5QasKoU+VM7f1e5VbZavqFmioOB/t805skStu/ab5lIl57iQi+HL/HI5KxTm1KCw7UNKUQQTQ3vPRm/9dk6p+dz6x/19sFAo0bumybCbUZuVl7uC3yfz/+KgOp5DG/5lcifQ+d+rDhj6/VH1cO0YWv1ZdI8uJhxHs4DtuWJ0FFTjOvHFAxpIOPoxC/qkHccmFLQYPs6Hq0/pMECUIiDvfA7suUuYcav44OOiuyEow7wy4iJD8g0OiRw5taEjgzArTU0iQ6svOLi6ofpmuYrkoX81NSscRJ++/K1Aau6X9yzZgnNSA117KlD848Ss5csHN4VSOn4wT9b3Fdv9W4Co8ovc0Zt8rvUIifp8HooQQvDGZ/Hn+qToesNxQepvglll+X1ynNFlLzH0bDLP8gFF+Tw46vBF+4dJsBblm3xMZ/TY+LbdqlZy67f775ODWa6SuBEGoVOeaNRH86fK4eiq8UmHn0Iw+GWYxbNHgD4EVg/2Nbc922BWfjIzHhuN+P3sRDTUXRDz4VmSqFE8M3QRefcaL8lx9PzkSBHauerl12yVXS80OgeVgiypcoZ/PV8Mncvp28hEnph6PlCa2UPfoAZjL0QD8WJxcKQufIt2FhXV7I3wUI3O8uD4S0ny1j8usWJFfDzZOpplFEg8+qQIzAdjSpuKwLxUnb1/NvnqZbi8/Fxs+YSMb5cBUdptcctFMTA5tdg15QNcLag5utGi0AMguTQtkP9M5v8PDhafMqF8GnHcUP971fXiFuomaW7dPMX1qqPBVU7N8764mzdSi3sIo2VKSOt06Wp3YtAxjQ46aNf0iSc5ACo596eHk/SukXG4SNadDclp8FU3jUTAncTnN4zRvdLUTGjowskjOYQ2Tn9qSy3mCH6QFWhUyHCWDPUHDhocu5QVjzSQSW5m5GnoACz+lt9N1g3gl32918lB7H49OwVucnLbLcyftDhws4sM1sqsym/5ljhmKeCUEDjfOp5astkZ/MnK+Q4Rbhwa9itK3pdF2bWDJIEoTmSmQfy1PrvX9l9vWT6TlY5lfm0P0koGGJYn7U4FLcwf55xzzIY98wfLPP+iTwnj316hb/NChddnpDCZvQB5JANhWQghL8cnIZugcX5bj2hqx6Ktp+PgreOcjhro+vcMbXBQuKUv0FlDbqAcKvd1Ptsshx7K2Vn7o87nZejH54M9m2nKCtvnYzFyParalCfWMIkY3z+Tsa5iLNceSjxfs/ueiwb5w+mRpVkqDEvHNo3Jm1NC0wevSE3pkbTmG/xYW1pGaHF+P26N6ertufWIFQsoHX1MEcb3bMu4NS/3I5XKh+id2tL/GTVYzWGLKxvnzkd34tCnBDqL+ZLXaT94/hSHlKfw/80Hf1Yd+LjHMNoB/aRSNDdPi6tbYq6/8p7d8xoqJmhRA8PKXfLLud5LBCxqdOWgdJ4CEC4CElBSSIPuTTpghlzM2PWUATfdPMITN3PAM00YMdqLTHdDjlkiB0wrQeB8bnQnUdxQcNEoZjFawQgJrLt2NdCAg9btL3/uRTdzeI5+RjXmK+QlClRKLP6W331Jzp7LGZXLU0zSn923k9hZS2XmeNHM51Ts2loVqvsWx+UD49U67NarZS677S2we8EyD7WmkIy62cqSGL7rSq2WO8XyaBDZPFM5wzKIXdqzVfg4K/d95TzaVQuvozdT0lwqhvcnsuS7qpGxQvFu2+M0G/la6QvS5IltRrNl6GbHm0SoJ7TEGzGRP6GAynxNzo1YgXk4hzf7Qm3xF9IcDaCGNtZxcEgMexu8PebDkV4OKCqCbO3jVdGKnLtO22WYmd+81fngB3VWnIqwWtwOnPleBVakS7YqqBpg5jWQVR93zsDmcDnMX1PlInpRbvcrlQL7lGgc8/eqmVLK1eyyks8cVRt+g3aw8w4gygPZ8KC3L9nWtgIH2IJA0ixogg7sSpkTLmU4279tjyrFwbHnFGm7UpHyo2v64sc4Y8LQNCUazv2vnOOVD9X/yQd/Tl/TJ0dAO+DseZ8JWjIbsJoGY8961WkvmpqAU4E8VzJAoM0Xr04HnACAqmkvRYcQhAjZiCEF7ErGQ0NIO0yjtgPFTnnyGGN7LlF2bN/vxD2xTJQQgczUivo6YgZwUCDtcWun1n99ifEnHQcDDWPhj70obd1IKIZ5Fnk6u5Yh3FeL/5HfnVA8ALX0ESjKv+oUcfpqJIncxL7hNFBGbZT7+An3RV5FolQ0G2ImcRZbQwKxCsbvfSpJTSEldQr+6pv3P67pHlEDrkyNcdjQbgDLQoGlZ1m7/JdHyyh87L6c7XUfGma5MuY/uBczOV9Gzx97QuZ7dikO0DHWmpUt7EXBlmnWMgZR76Im1Z8B/cIWfNbJssXxQUYd4XhvJhSVLr7c80Dd0yomYdO4IwIzOqPnDGgQffXwdw5KRbCdG7HKHWMt2NcsyNNFJYOda01vPz/dQdTOai/68mj7AM2fQa38JltMIEKpaWsXjY3FtEuNHid2fSpo35cU7fluOcuXK9tfD96BvVKlbj+vFPnLp9RYgwuMfBD8prwNpakF5V7tN/gjAKuM42dne4t+QY4o14+jZcHEt4PbZCdJSaonQSn+wK/aiOMjv9+4+P/hgy/TVyztWKZsT+deTlL+7XXRG73XXSTBSNGoasVD+/c2sUU8oxRnBDxzkhyxEsxsmmeFTswWotJxF7R/YRy6IfIJPEiINLg99ZsCE44OoxHHJsPA+ytNDSDB6gET3UZXO3MW3QpQMBloMvx6cqUj9WwLf+5FzREC8Fib0MSqmGz633UUfsvvPikZscWjOcFbgqTt5HXH1cmqG2eCMXAp9RVVahzmA5nb2Ho55mWRGiy0POSOI8UL1YOD1zvtpYBO0gbEF0QVwD/Mqmz7QHloEr5OQQa1T0Mjr5MBrApMgHMrMi6K0PzmHtSUjK0u63+o9A6KH7TNtDzKVVQsQbasO0nueaLPSF8euOo4Qd/ZPXQbWODsrC8si8/k5fJ13FbpM/vvD8iF9gbPUxPOclc+69RAuna1x0wHm4xlzOq9jhsjduaLd0YUwD2glLePbzNaKZ/78feBeboK+47dyPLPVpBshGYMiY33t1SlU67fZbF5nS5ohUr18nrvdUeRoV8zv98xeZ7Ak1Tc8GC6khv8sjx7L7UKLSjBTWUQTLvm4kQI1a9uJopwWGx2fMt8H5Ir5p7V2x9MwltfVl6dZ4EEsvgTB/9vPvgTBw2P9wPrymPhbs8WmR2EV7ml0jy9bbj3c+5+TB0s8UhRMW1IK006mj4rYLC7IqXjbAAEnD47xyCHOGeP+9HWbhgxIWkBsO/AZsCtxQl69tmxjATgezQLTx94++yZRPxA7OfOPExBMUcNmT2h1qRUBdYdN3/uRQMrbWnLM/MoRE6socHE/W/53XeLoVyAF9mzfRrlrO2xM94wzLEidEecz3rcUi1YECSXuLLGvWTevvn9gZeCrM/KVHJZDC2I++4FBi996NIl5QQgmrZBYmPplpRyp/7hdHLQ5AvF0vd1uoIea3U51CuuHkDNLWhqMqrFCTbXebfevpb5yvHd5faSZ4nh7it6ZNjEmcIh3hTX4tytCvv7A2Gqveca0AS014cZ4frvE2N9KMzy383Nch9a+AxRLmckAzrhtVe8BGrMAQOvPjHGyOciu/bW+q1VgvOly/vgtPi6olUmc+c0pf+iE9fcoB+OyK4aqi42ZvWh5fD+s9VUK+GzwvVNryD86Nc7y2lZIKulIxun+KQnOfw4W4X21kw+Nf/a7HZpYASvfcdXp7Z4PnfA9B1FTTIPPoXNs/Iwd1PpBpt/y5v1hO/o/MWr819f4n9w8P/mgz9xcPqEBPRJJrBMO5jpAbBe8S2kSeYyM0kDb6p+P1jI7IN7ZoqpAw/WlsFBk3ZsIQIBXIDS1u1tcY6aIQfsIsBMVYevwwfrpFKlUYtysWej9l9B/BNvwPjcHv6RYLJzBjE7YQD7N6dmPhRJ1LJ6O5aoX3zw372ozz8mFyJjhTjZQHtX2tLVS2gpvk2Xk+C0aYwxNDxzAdbo/UIwBCchx16F7R/NpCq3sL23nMVwdyiQgkO+yBucAjwEG6F9weu+0WvPFNjBo5FB1Vfc0gfQ3+/+ul5SfB348rnCQbgaCCOVjtxZSo/Tu2cyOC0c7sy7s9GHpr1TgH580nm3Ig8n14+9Qvs7WggmFSFHe+wefUayZhbeLaRW6Usm2y6tDt85p4Ypw8rdQwLq4Di1FAblEd6qDe35y4ZY9SHRLxKM5T+YOd7qg189fGEhwFf9TmXq3Irw+toKGyhU1vhzjQzOlemGUZVlz7BOS8uP9w9AnQsts7f4bNjGSoRaKouD3ouOPoypZS70XpGGO58CQELJme/c+61xuRx/vJVipe+9Qvgpa0uTJYXh7WMLmfVG77PeSdNSryoV9uzs3XRUygWMr2jDOLnDjJ5EaJYMOv/Ewf+bD77gYAqhf94Spx0yjC0+BRIJLSGcWB64eMkw/3EHL7VPRqA5g218y4Nt8hjSYYHlk8OI+1P4TidqDRqi5YLVoxo0LE0kwDRJIluBfNLBzTcdO+4E4hX91F5DsqeGknF+CKS/LFf+G2TMyFZRnmwhsUAbXUu0GPDPvajF5CVXXkNWjSsa/A59HPuomHxPCuzP6Dg4/3SY8OShLYfiBZMPpDWEsN/2jK/tiMwhp29JsfTAOVAmTEV4IXQu2ccpkqu5LIFMgTT3fXWpev3x/I0XwerVhJHtB9Ee4BvAoUoxvCBG+3GHLDHum8o0NbANTLN86PDWPF0UOrzlwqKNSmvws1xfKvm8PlstzwJ5qCA9vbOksPy3AP/MWgwxi0MSbQfUNmVnWod2EZz1CS2yR1jG7+M2dcwMjg8IIPtatJosjNU8PO2UEQY8cjF6r2OsthylFIkZckf+5ZllmqMcUMpqo1sC1PIQEoXeMYgaW9qvKkTkbESIpRSIzZjF4dAsW5cSsPfRoPTrxyuvoerry/eDTdk47F7gfKHwwdfJ15fNfDdHfLNYJbY6jqYdeSPGfLPyzxPvt6+uw+ZILVX+XtdKnfflRk7F2waZgpFcktExLy7S/8HB/+di4T846B962JXHwubHxXCgPFnBT3u2gI6DK00NUkYLnUfT7qIF+ugBuWBpC7SDGffLpmj5TRzFDuKBXRo6NAQAJ4OP9n1uW3rXvg96GGA7vUwaNvCUQ/P6yduL1/ZliUXuTwjIT+AWlaFQf26AXIj6jGRgoBhaR7Cn/+xF7QASyn5Dx09j2Ic1PV5Dk8jp3C/49EnHwSYjdOZRq+PkUU1RuefFX+iCV9f0eczXMCywgPCegFrpYEQV1gI+miK9vARPHRuqK6PzQXxnPVThcX5O7M/GGHwAo52jPaGSogd2S0aZS8N6MWc43Zr+3Y+Bsfmrx2WRtbfbuboqd7pT5U5Z5VvJlfo+0+j5QNmc00l68v7GOgrg4EeCmB6+JS2GFtF0rEVZuwUd5CZCdY9gUGQOWEB3Rn337dyojgW+9AWdh9YM3BiOLnIG0l32cF/baaJHRb5AKw/JOlEtoui5a5orFxb567fe6dRj3ClWB7apEJeu/dcHw5xfqliDwNRLRPtKzn+Gbg2rrB8u/H3XkRXB9pzfGhWRkqwctz6omZmvWs9mW0jBkdeEOG69W5zKNXRVz3R5/q2wLAwKucFck6j6Q71FNHgX4MPS81crr04fcfsfHPx/Lxb+xMFRzC7MDDl2kUScoyd5hYNPvQyXzPtISWUu4RIsnDfNGaz2cnNiRjKI+6MEBwwhh9sdsGOqxx6nKUg0IXkufeAinkhg9xmybD78pW4awsZ98xqkYSYg2QwDsx7mthMCFvOTv7SlHJWKrzwWPMtT4hm2/LsXPbCtNDV+HQfdK02NXs9EYZXfDVix2+TZXhP0FQrgdkfRqfROpBIs863k3KHc53FvTw6dzieEneKj3hJnOYBeM8iI4T+SpMjcZmPBZI4FOgl2O/YQjvanjJvsYWifEG0VGLu7293S+KJc8ZzKA+J9qQnU87lic6bY8/dqMtMEfJflLMb9vfSSxQHo3rKOuPZgbjIUTGkEaSPRRf+JHPKEyNRUZt5b+Wwj0o2m0Ugn7po65tnmXnfzc2Go42CfdNucuNYaQvmTbbGagmNneZDIk3aurPPBp8kPBSpkqzvmbLWzzbTlvWm+j8iVDH+k+CX7kvkcnKTSu0PVHNcOLF9QtRTUuk+mXhZfV5thpJQXjMvu4+wywqHlUeWm1DNSqDXK1w2Yc0tr8e3B4NCIFp70fzMaW/R6+FCztR5W74Pa4taQXTZeC2xBFPH1bw+OKO1TwI304mknMnyS/8VBXyCiUhsvfowjPxFcvR1D/sBvOEi7J8m1XDEpiKc6Dq78+RfplccCoFcdsup1nqKBvrg3ZqhvqBCIIW5N2FNROhNNByFPac/iJ2ypHat7Dp0RSsGKujNUPFtcpIXZjs85C0RARbTad54o46wYzyxcuGXDwkHzn9rSF03NKqdm5c8f41ZeQww92tdxUHr2GH0ZBNBxMOSt6vW8ZQ6u8rvRAuD/LpvUhD4u781hsHPL5WI0L5xrYmt0S+YNlZxly3piC8kC7H4V8ka2Qj0txAEAHoDekZvlthDCNROf6fNWWwyTJtd3J5OZEVPDTwaknoVRHzfMCS25ar9vPhTkCtoLfiphSvv1uFEZFD9dWE9z1f5L9lmu8UaIUp5QiGK3Aoh8dchX2/HYGQMR8slMMk670MPDVJBGQ3brdkwv343w+dhNQESRt9TfBrtjHQff9MiFzsZsvQ71fV07o0E3XXvYYZ47m0zLJ1C9cChZeBS/+qiSDC7vy3lweE/0+oWsEAU+5WPTuMV2OQbD1yOZzT81kEUm8mr4OLEtu8/UVYzzVO8mm/K4enFmtchVpUsdvw9mWqYx3vD2ifYyBiP01QEvVqJRgvE12x+eG8Bk/in1HW2M+sXS7gWRabwJp2nn6nMupIS4Xhvx33AwME3sOJDV23HMF7168d9god9wkJ799NzzDw9Avdfhm5/uf9Bq0hvUqw5a9brSobpQkELj1nIVYA24J5TZk3O2FBNHmMPD0Ndrq4sMWSkX1tuPOwE3xCEOfJoSxPecI/Pkd23lOHADpuxUOYffms+tQYgBH1y/tKUrTc0qpyYO6XyQ+SevTcfBOgBuXmrJMPPyPpjhv8EAs8rvbh940RZRaNRgqvTBgM3HnkQqwFe3Tt7t9KtiDT6zadjENo/KvlCSDT2NX8UyNVwKLoNrUw9Goz3SR5JmO+Khvdogs3WBPAuWZJ9wp5AMuxdBM7TOAeFn/ZtW8xmIlQEUv113HDYAW6FydZOvsD+UNhximvJajrbOnHrxJ8nhRZxh+57VMoS2bqvnHdeIUy/fkMbpW73Gq3yD6caBaxXeb49JSbvKNUPdNTo3yCDnP85h0EXyi2+mRXlsaPr0ATSEUu5yhlvb8hJZMGsAwWDhY196LhqAE+tpvdRBtFNLdlD+SO/MIg3jpF/0XeMmYTCQUcVklWaLO9OoVEic/j2dVgF8mU/YNYU9zrdzoZWmZpC5pWzJJR8kahjIoEuPQGcMuPVicW0pU2XDx4fKgL3Oz21LGZbbw/6r5eb2QIHNzx9jTHp1X7f8DQcfX3YF9tXbMTRJb6925u7xbzi4jK1uqFa+xL6lDObQxRNCakkxMtWrbvYy85u7ymG2ohhTtoLFBFL43uF7e4gMwBjhN2NnKOAMQE7M4S5t7iYhMQyYoS8Gm7+7vrYJ+eC0481sTGeRyLEF1HoQAkBRBE9Sv7SlBBqUvoCzlRWPn3jZi77ktUX3SOyf/O4AY8yx3yxXifYqvxuz0AUT1Gwawthj6uygFgtPEMtXhORues+5orvINvnWGuMskzXtWTjfS4UcZyLjzYvbB8g5PXNzQupTzheBcwktKHGG9FDEM9eRfKibCXw1Eohtq0DB9eLdhdOlefG6aPicBx3XZTM8LxTC+CCL8V9VM9Me+zboedZmyFMwM7M/nb1pgbg6hyDWBxoWG+M4qHSxgXok2ZFpdi7UzbVKF7+pabna/pvd745xrlEcbK5lBjje3yGHaF9qeaZ22wkkwmNT9IwB8O4Hrz4/B9G09Ss7zonVy7uszgfpdm4pFzqLReVDl102hzadiBln8pwaz2VQObIswXkJXmT3KJULCZVGbiHn5uWpRCn3apRoVtqm5749peOgHwMvkmdbvQgtVJ+M7BIBm3Wdp/ja+cPsWeOh/VzqGOUHqEdIaG83aok+pgB1tSuYg5BBS+5AP/ngv5P5koFCK/+Nsd//Lx9MfLK+3FCt3geNKrDqdefUUO9r23rVMate5y5A4NXegicaIG03ok7NAYyYgAHzBpyuKx/LiUa3x51ewJOd2I4V2acMSZ1yRu3zQwetRiLkjOT2vAwLKTJku4IEg8+QJhY/taUGqxdODt7lITyER29+7kWRwspzj/snv7vm2fa1kLEtbw6t8rsvXOZgs2x42MyDkzPFbI/aw5FiMvcjdxVc5dcK8HNOyz5iDCpLW68Wn/s+kifv7UFv3sHZ0ARLTTkhBGc2kzGBrSGQqPWHtoIqczMqenHcQnHRav2aK/DfsqZwUsGFlkefN4hQrqqMvAAIrgRlSaJGC07jcJNuJixuwmsm6ZANK+EwsVzaDJ1MQ5LKo9BaZ8x3LndE43QAxdxmbFoesbfXwxxEVshGsKPjYIn/Nj6Kd4zurP/VXGxixyIz61BW8+xcBgGm5sGZkeOQbgEShbLZZGGb/ktN1hQ+97kMG/v35uRUHl989ewvXBWD6r8WxbWHbhouPPnGpUnwvPlQeS6KRuXBAKovmhppYvVYhlStN+WO3mEBylrx0aUlSq5wUL5i2EqFVDFGzS8vm80iOnnccYH5qSYEA1/GoP+qFKB/3dftOC5/8sHfJvOdNPjiv4En/+CDlG3lz09Mf9uLzhK+Tb3qrKted4HPpgql5hWPjldwzGW3RacZo1uUaNqVBF9xVicV5InHU9XjPLBiaRZyGPJee6IbAAkmTKbMfruLEfbgigSM3kjWkJGm7x5/aUtXmhpr24rrH53D97Tai/6TW4rYf+1FL356z0LW/U/Ikv8OpxgVVpX2YYRo4DF57FW9RimIt20dYcKtHv+RekXkI+f20CiwzrS8gqEsRJKFNSZTkyRKDa8TmWzsqkaI1X37hmoQBWBS3D1FetiVYSYM+pD+OSM6GB5yAhB4+jJEcOZDgJM6IeQEfdDZZwg/fgSZVnokLrZsZAuCyCswmpCjUCZgR4i5KSXZRl328nrtbRfvULN0mhSH7wl7uUqA3VGcA0Zmf2xEwMo7jivMQfuyn1E/Pbw9jo0JNP8NaZgODWBvnGgKIOnWDjl7wUcgGmsoGn3ckUBUSxPbydHbVrnAVK7fGpdKxjYo18eTIl91PZjOnsdxYDh9P20UTO5WcyDOPp3ODxpgjijFsxKWp/yF3lJsc5JE34L76aU5SQXsKFbwbXDLOl48/nqwT2lyafDxYwUUj2UquQhPysvM7KFGyo7Vfd3Hn3qrFz742+s/Mjmwv+wKpr/xQcWFpSdeI7ny57/WcXC48ueHNsILverGL71u7bmcAR9Vc1CqebIAAfCfCHuQ8pO09hdAT0Er5TC4MQGp6jDoxHx79rhMbqcnfhQhvJAnYXaMGQl9dfJuOh4QgDUJo5kk8ktbmvF4d1l868Wf/yuI/a6p0bEx4j0iZ9wv71kyj+TEl1hPEC9OMMw1NUtPcszIgOuotc0DneX6mq/EfnM/54TyRIh4+e21DTGO9kThlSxy0SuSQfO57YPL11FV44SjOCFGYC6mtZrZBrs6pF9d4Cyzg08qz6mYYK1Hcfpicp7vLznk9DXxnCYwS+UAR1gwym7brcV+lzQgxxRQUEF52cnMeOJi6TWRdZRCmrOhHYxOg43ZGN/v8aKtpTJsD0Fr6hwzUxotTI+2Yc8iO5dHBxm1j+PKghj0dBwsj6DuaV2fCtH4lwSK5b/ZeahoBR4MD5y4eu/ejmDcHZnPFkKNztNAMSsPkyY4LVYxrSLh13VTRqvc7d+4zN5GqeI/rwCd78oSTzeVgTBGzHFwxksUtLePsfrgyswiOP8jegorQabo3/jU608+5vrlCVwpKAfaY/1BsAnT+fOe1y+bNxbjX/d143h4ld3wGw6u+CC3vfLf0JiNf19qDkJfUZ0jThJ7jhWjX3ksTJNroXJK0KuOW/W6tAJjz3cmntTnZ+vZcnMiIYt9B0R516GdBWULYBDionevDgcep8dN7xGESXoexCyLuHlmSPsM8+w25SNZbNYk9lUnCedQxHr1S1tqCWd+4iD/7clw/pumBtFxMLDS1DR+ec9WD7bxJjJexXrWKtTdIeQzlzBgD0aEHKlmQnxBDMt5CRvfBO2VAjs+r7OaF6b7USAA7707zvX5wNSp4yBjCmVnIc4wlXQ+iNsESy074418ppIxR9WqWD0/f72D5/la/gfCjcbQfDaINJJzaT/zBrNFu7lGSDaheEf80VrQwvD9NnzWY8D5qjaGOK6uYe6UDcshQyjvXJBTdBJf64xwxr0jVQeHhodvZgzmB5nj+IiGzrv4XOsIbblO4OpRwgoNsv6tDtnUjnEb1qEuD2xn1qwhM3NQ/NSB4/m2G+eK6TT7Pval1grhgmCvG5PZDyZtWciZb1zOmlzOsqeP2RD5PZfJT+FCUakrBn2gwp9RJQCI3oiO3WJVonc8r4cpojkN7hM9SP/LVtrd97URX/mDdrJo6txPfWRaBcLNCzAX2Vz7cWjWpko0QKsv93Vh5+wp9DsOrvig5fzFfwOJ/3axgF0lB1z+aWKcHmJX1f10epYyJVZ8UK8666rXXS2gThFe1C5f3lPwHWHfnecghN11IJDXFCDc8YzfvnMgqO7DQ55W3ljNZCURQDsREHhKGLKREDBJZLHxXVAnvLR7G8b+vCWWaoBnM2NweGiLz4kjk9QTsh7XcTBMQbnV++BP71kD73FqI7YJhfcf9c5/i46bS6Nv1hND13XzOFeRpi4DByDZnf5mITu5Pn2N+GiWINc2oGh4W9MEvwGLRPiKjYFaKxwUNyc5iSE3KG+AWdu4tBJeqpjb/urDOAzN5oo6aLYQ1ZFfZRhRFR9F5CU6NSLhRX7trYpisKJxbz6N6OV5D2uUx0R70CYt9ZNEV11k/e/3yGbtnOxGNe7yrrzaFVD1+xPy2cDzMvVMNLrdIMdULQPNRUyVEwrILNc67RFbv6HPt/t9Ai19M3MZEJrXRlFEWMMCRr2CfLbMgnfBAJbiPvqSxGz+yuP8nHkJHbNnn+Xj8ShfTU0K3RDx3bw5a49S8sTOYQ0Tybb5QfbH+dlxbiwI1W9fgxh8GMz2xn66tWCw7woWXZp9+OyGUYzj+8YiNCnfvb9xacq0PHSehwLJSyO4uqECJ0yEGO+Ljt90x//sRX97qbFbphTNzVJpl46D3Mqfv7j3n72o3uuUxE1HS/LdunErX0ADkdV7SsKWKXF7W5kgtJF5AhgNSbt+qLs0CBTsaZcb2wQA59Bo9y5ZQ9r6yrXpDyJRqwDiTZs9NcyAfPx0yf/+dvw0QNWVL/HmKqeGQM3S11VuqY6DJBDefb+EiF/aUiav97sXbSkSkz+YdT4I2IiBa5nCiRtHjheAm5033wccECdfnaYKwjYmsMkZF8zUIlsxKMwgZV5gCImLHukj8ZDbTpweMciIDXwggz5Ax0FDNBta+PUxPvaKX6sQwthUfHkisSslEdvbem2vyFn/xuecSt6JtFuR2MAyDpwvrPuxifCsHGdQcAewYM4Mcvvl/Dg352fcrWmB9SF26Y7Ptb5UXL4Vbd5ulsVrpppvRhKUyiDDI+cUnTLzwWjztNLDv2kzYr/cEVvJvqETbYiiD4kSkJ3obtiEZxYFTo6WnKEfxI8vYJKjItneklRQaVw4XtFSnqnW3mdbiGCTNRNVuku+3clkuefSg7VVblgoTQi0s3IumTtMQB5Koif1PQxVrJAFC2Ml8+62ky/JWfThwbhsfC+Y6GlODXJ54sqPllY3VIrLa1AD22srHDxH//4DB397qdEnNFNgTuWAmY6DQ5/fOzn48B/9IK33Okd/nt7ZvT3kZRmMGWov7ymb0yx67jmeCWEffHi358lnSfcOgqjG2R7koh3RhAja5Py+VXWl8FHaC0esG5OKzIF72kFm5iZpn+X3t2MOUtkxGQnTltOAYqD5b8nB6u04hseyYQwGJfmXtrRBJcFf2tJ63jg+X+EgRpv3zfTUXeD16SvXNs2weVbJNuYF0bJ5H4gVsr7yVii8TO5G+1hOID+9/tZXBX762cx5F2uh3izEGiI+PrOVWE/6vCGf8sq/xGNbPZ/on147j7+latkp98bW8lImIEl5l1iRF5afyL/0Ypy7CqYa3seJ6CCLSMfO7YUjw0mgOzMeipfYQCxSfVHTuvY8VJKetWHoc7FL0kddfBLQVukbOGyYZp7ejXPLTyMeOXAS7ckziY9fx23LTrb4abgKGeD1D4q6smvnnShE87sUPhVp3NL24E0ZiTXep8BaVKLGobUaouE/Wj22KoGmG2vUR4ns+he9McG9VDiJ5nJNL2bJ3YfomqJ4v4LZMHeUimN859B9DJkpjkH2bKCvbU7Jhbo6LXTHme8aHVRKtkKSEkbwAO+93FCtzQz+ADSPmnQcDBF/4uC/LzXnXuBFFQU+AKu8tlV+N3/55/ugzv0C0AfD1PBMjzslw/z7+RKiCYQ53Mx4ShzmZiJOzJl2cCK2uc2BHolqpQ9c9o0YYzVR5YPQhSmNYjFvaivsA85JnZGWeGjyTNBJKvanpiZbf/Gh+i2nxmRL0MjEl0TW6b88o5/aUqOd+/hLW+pajIr5FQ4iIeMnf7S3lNpcJrL41DUPBDU7Qz7nON/YUtjU5yiTQ//JwcgksrWeGWHbwRrvp0Z4Nrm0RU9nhI6DgVfGTCiB63QXztvsiFWSgkXeet4Xw1sziRt7GS7cIi3919GMMVuNfDYWpf7JiKgmCo6NexR/Di6zt68WufaxW1rkIFIDGySeO4tEx/Os/7pLNkdHWFcZs9/OrW/zhQ6FOM/FKnDKy5jCN0r90OJ2AQfWesJ0dkJxywVorw9Y9dPnE2O7jwHVKDoHIIRLQYmFDySGPM3bY/YM5903Aq00+9EUx6T4K7dxLU30JGFlHEeZBLI9y4XayIH4Y/nFn6sIwviTFMxQOzHFIGe/PXmOFEgIkDvrAaJ18yQ0xwimldjMbQ+YaTV9Rj8mGorPKLczhcqb872vo4ma+OOW+H/DwX8vFpJY8MFlc+t8kJkwk8AiLbKXvj/fB180NSmDaRy3jeVEVq6g61IB3UJIiFhIWMoorLmQ8Da6BDzS1toug4D3VqWwSwcQK/UFNnuv/Gtud9hwGOIhgLDvCUUJzp5QqH3NYOF/fzsGPyPLLIymAmm92ZHumYfFc3H9148xgN5wgRoTv7SlYgWO/NSWUvhKUyPl0a3GrW/dG+VAYWpHkTn5I9rhqvumzV1Hn20XKesrwRchX5z/wxF6Jlj6Og76eoz/fCAEswYmig0pi835NqYaQgHLrSACr9gYFQ1GFn5/CBZMfgWhxcqeEIRaNsYerIk/zp2v7bmm5L98kCaHF1LHm+fBp06oeT6DB8s+ISXfUoCqOeTUnENsn8+3NrsEv/hubip9+7zWDzXdPbGYusBtyTnL+urmWmaO32jLrABcb8OOKcMWxzoODsTL8mK15yeXGTtoPXEJhpQ5cRZAMWbNJkhhGDg5W/CiGsK+rYfJPObn0IMIleeEjCnpGCxnLO4xs61cYWUkLlVvb75dZYIRouSxt0Yde4NSfW1UjKTnxz7A3YJwQ4jEClnsowl7LkI/Lp1Ob00Zhg8es6qwNg0UGXvg91vi/w0Hf7tY0DkeBRV1PlhZ5ZZSGz5tdezxx53M3svMXwyEoaKRqEyMIPuXhw/jBuQsB6qcySFEwsb4w32lKhr2DqPxGTiLO3cQp5vEkK3imZdTdn/m1PhYmtyQWWT/zDmFdjNIBPxdU5MxFsQfll2J/ZnfbcAsp0+swRpFngZ/5yA8V/+lLc3DOeaXtvTrxKyRzwdGtQyzZ754vaSu2d8eErPelPv4jvQ1XpWJOaJwkaI3dJ3almJI2MebRH2+ssb6M3Z1MnccK3D+6aWZ9R3aOQeVi1CkoH8p6Q2XIAZ91KY/k2N2sn2aR9OubyguhCbdPZuGyeZQVvG1Z0W+CJ0Tf3mGOdBXNs8qHZGoLbNq4GHrjWuRZcWpPn1NxW+aShRHA7GljaH82xY2LXjia8RSsFuXkhGY2mOnRnxa7nJvmAqXu3NKoNLT+WCVvxy/jzMzJ13ahnFWoPmOz0pZk+qptWzLzKwUBjUovNs+pLOOwFN/Pf7Fq4jUWJ8i57042lIkUqLMN1Z7kBmELUA/l4WV2CpQI9z0rPz563itR/EGdZRkTWNzhqfxPSMSey5E6pfvs/OCWeAUtZAvIKEGbL/fMmml4h+3xP8bDv57sTCNbb+oos5Xb8cJwYE8cOx/9INGvdfFn0nZIRu10gM0a7SoMU2CdHx7WmkIwB5vpnF3Wu+mABIIOPYi2LvdJAS6nKI7m5FTILBII8z/R9h3v6WxRt3ODMMMHQs2UDjRFGNLN8mJiZShSpneCx0FBOkwtH/9DppzknO/fPf+midP1Piy115777VWYufmy48EojNq9qLMG1RaQ4yX8mt3vMJB4R5RPLzN8u8t8R0QcHPQeJO2hyJNdPykLd0HyeJPbelby7BSAU5f7M/k/jBI2T4pDQoSnP6lLErVYMvSsOwmS4I5YJUhIrPFb0YjEWDtu86EouHChovpEja6S4ZNtMgrASfHtNgwBgXXyVDmZoemVLhgcZ6ZkqEFKXi4qRi7WFCiT1d4KMC6nGcTKjhcYIz6mMxCmCNjx8fnsIE8U+nQo4vC2oMKJibaMmbwwdHLaGc54vrvH6iZI6N29BFDnMAvuOhCnPrfKKp2JrN8g2xWprE5NzP3p0NFS7+S5rU5yPZ6DHJKHh/KJrwhZtCm5QBAFHPqHgCowWouWgtTSPEAUrph6V2bblTYrYBtECR5W9xLySp9PgqyOhDjxJAEL9GwoIQiaSqCtVofyWKVDa52QNLtMskefUPphTXHGy1IMS+li1b5b53GiuWxeVZs6nDu5qYIIX/S1PyOg7/dEhPsoz9/DgeNzjw+349xM/q/dzIlo9aVrcfz0Y19+DnT322BIeE2yaMcBFRIgKeiwL4/rKhv9jbZOAqhKFrJJbd3OAyVya0ZEJtjZpyMowc7mBuPSwBVigNrM9gPorgp+e/umHjy51dpMOY0+CAGo4q28iXO/4OD6CL+U1uqVk2xJ20pzFUvcJzLM9NBleGqktzPgMnXgTsRTFbtdyMd3x6SylhCNqd2JhyfRa2AosRg+SYu06oQqxs90nOMMftF5WSmYF2j88P3YgYf/JYJV6MRLyAGOQefMMliFGAj0QsGiBR9iiafSFIrCNNOuS7gPyDjbYyFqetUGXPHspOvyc24Hm8d9uC93kTTfG9YEZm6HoShOD35euJxWqkG/BUB6KVDTI/js6Cu9KNnxN9yl292EauMLNUfdl1AuMOtQ9+ME8cP+8elMcFGLXjFwEFh32didwISXOwkvs7DLPc8JE3GJjD7YmHwwSCVdEp4xxnl+d0MW4hg94ettWzbGiN0s2rgoL1kU4L4ofnHuU0W74DNJ3/+To9mkbw5aTQkaD3BF8EQUF41ru00UxmtX+1bnXGJAFee1X/S1PyOg7/dEvuWOUXqpbeQitGZj/dvHm+J/6vk8hu1ztopJizZCkh+yluIXBMlQ0k0+2DdHZESktiJm3ydwMatBu+lslXIMvPuHyTYAIfTjrsJ49T3It7pZpLhWQ3wDWxoYKySox3j/bD+BfSkLaWcEY51RJr7xH0bLvkQmxgpQFM1t6qidm2VU2O0l6aXKwvwRvKN+ktTE8mVaPDbLIimwRCdb0mJZy1qOpi6E14fZdZJ5e17VjQB2g3tw+LcKgEn41CSJaPteSlK0aEj2SvyBh98dSUwYniy4Y7q0nb8ZqjFF0BIHb/MrmuNRJyQXeFl9MbTFTgN9ez/tS2sMoyOHC266BbdhRBQrKp7mY/U34ElJ04r9si0S1zzXakBvNmC0SkHzkabX5ih+h2wEZGQH18GB5ADqZKT9GzlsSA/PBtrt5OR8+M/+8H3Ixa67BGi/kCaJS/5ffMw1el6ufLLB0pavNJYwM6y11/ePBRhruL2GOBMU1xI5NBsNNeTM1CwmKAhZZtAZBYuLKK3wJHPYx8qzf54GyiFYtdoieh32xjj7x5Iz5kQPe/SsJJGlB+NzK1aPjm2e7W7YkG6sC0GRYO+4rsYkosM7v+oqXF9hh7fRoSc/A8++H/tB5/y2sRZarl+nCHTn8zKfGlmwco+/r1JeVTiMecR9xHkRlNG9+xu/fVOwhmlcykfdJDKKUPI63XvQyILmichC9WXWDYbc2/eJNA5bU1A+wSsj+jElokxn+Z+aktXu2M8Z6Op24A5iqOjtdKjLzG2motGSMDtXnkNNe3TuIGDSv+XpsZUXeXRWwbQCIPfnz3rGs1Q+PizNp1fqg+motou4MHWe2EzbYtg0+BaGMqkdhKMGqYutw/15Sq3dN0VHao2bCgomMzHfcRWkvFlI5MeszEOxBM7+E1kAqy5QJMtukjJnvUAx29hBV6RiyKENV0cU6SC1WL8WJ0YfLCPmwtD58YXkwYvRqJnbSxAFx0VLHZIaGaQx3oikZcdXIW3U1L9De5ILKQrD/rcUevQysdXspk7VFi6rojcAzZ3dOx77R5l2meZmXkbfJg+MDrOni7BANWIZWC0EUKlpTkplXLUQN+QTwU72TWrgBoMSe+SDDkIbwX+mrB1/ibodfBa01Ii2/Wl2hSjGLz8GirUpqv75wjXeZ6VtdsU8uLFWFJHUSp5el97cBL5nodsPhTq1b+Cl/08kw+rr5d/1tSARufrnZnHexNu8se56G8X7NLyKb97lVMTPg2Ld3fAOFAkuGbRqt3lTTH+OtdfqjBeErIeMgRkkZzzZoIc1CRnKiv572LeAIRGQef2DysQ16Mk+5hTE4b9dhGm3mnO4B2JuIEECoaBn9pSAgneoPa00Zitu88W6RQHsutfECa4mos+5Xfr7gJRIu8MHHzK737S1JzMj/tl2CZf+CbFtK3dakcAtC3t1j4Rfyd6YrS3dCBKk9uRb4KRisWBfE+FF6mgbW3FnnRC2kVZgW2RdtdfUQ4pqgpHitHuZiaFwtjOTfVraopFlLcnfJBbC91gPiwKlOMStQRDidC9PALqPNY9phzeuWR0uS+7vamIbL+UbwuHinPRJmeTJTZ/r9vD7QEJV4/oWWAO2IJWZnrx48TcGMn1+GeLRD84ZnI3KtJLNRx6Q/wd7ApNpWapQzr1hp5zYIzwbc03WWS3t388RPBzGKAqUZCEo1mUYWn5tg0m3RGA445tkswmkL9nX6VxL0YlaakBH8RKxSX2uDs+DG6MbFWhHjTLTK/kzNsaCmVJPwYs4uAOw909cETLodF8E9fN6+rX+pC5r7VNNU3u/qCLkDCxRD+9Uf+kqTkJX/hvgWl/7sOzf56L/p7fbTSBIUrSaSipZ1PJ27DVPAtYzV4rXamZwpv3JnKTsPkrGjBhIhCQ3fHujNNWyA77SFdyZJkfHKSyek1lYVvx855jsbcODSOyKWigfeA7xSF9DlxAMBBERWb0pC1dDlIEOpf3DD5IcwTFBhxS21wS0ce56M/8bvsxVTDNHnHwX00Nul5pmJNcG8W40ZrrbEYFg1TwlM0r7PmcnBbq1sSZjyG6kUgGVoKcJ36z4DGMI4OYp2ENCz1cVVKMiLlNbE/nwwa0XSUFLDTJrEXR3Fo8YRLii4qkQADjUFxklChaZKim2pONhhq+PH02EYpafe+T5R7vOcFgBQODutonjjSuPufE0Z0VFWbEm3SPn1J/eVfjFrFvvI3lQD3TF3IZm2imYM/ZsZWJCT/FGFBXnJsDwhxfOJJf9g2AnoiHRw66/bKvIbteCuq3CTYoPt5CDMwQV3JsimzNxJ5/nhzbuxEcCDuIu/w+y9X2WeQhMhKuU1CwLtK1pIssBVPwIhihBs6NnUVRboJjK4Akw+gqjVHqmSkDB2U8GSS6dexrJcjln424277J8dx3fFtG74L+b71w6Fga/FFTk9ofhS3DUiC6AP88F/11wf6U1/Z4L2pa3RInbemzjBX8DCv3E7MDZwO6XcSTOzzomziQgHhDyDtJG2ZKVkt2nzfJfsn6/O6sl0M8VCHnvnnYdCNcCgmGFW5G8o7Xd4R5PjRlv04NTpv8qS2N8KigtWEXx3Ggs29gXj3wRmitbontS4zirEdbv3nuNX9pasRvB2A/D3re9UMxHDAwpaziF7vPEqOZhGQuhSl1KZSCGLaQxHA0m12XbaEosrDI0SVuTfR4JXLhO5q4GCnc2XBBVXGLbkkynQ5H09BaaiNgcD+G3zQHQomdlqpNOqbN7zVNbbP57VOmLL6h22o5XdFM6Y6zYMuTWnAWP44tZfb1lBhXhs7nfwGEJpd4z+5CEC5H6qw+fNSW2kavopywEPY8E1mqX+AdecGf/dYx3sKnsjNYkJtULzWjZnBY91EqckSL5g3ABnrp+nriNbyIcsD4BkJHceR+FMzNeyE2IhukZjdHSUPJVG4JPJ2kbgF1Z9+7TdfRCLbrwEJNrs206zWVfmBWAYuqOIKxLFmJcJzNJVfD2vf09+22nOHw7Q9Uo/CZbcMhgW6xs5iSP/+zpgYdJwn6LTzbO831/zgX/U3JlZqmg8G3u/HI3GDQlYOxd5LJh08s6KAFOPIDKq627JpNNXNFV+LLSQLxA1gEHUMHnyKAV3IitRDkS6lbu2DgHtjamUZMG0zK5TU+K7uvDp1MQUBcLyjITeI2gmN/akvB33JqDBy8wQFwJUGIreaiJiSKXaMjrY9O5dYTDv6rqWkxo3wespte/z1tY3w9cmnD9JqLbuGhaLcqlwMn1Fdd1DAiuE5OMylYzxg46NycujWNHkseriYK8FCTfENFAHV+q/c2lgjJYe08n40nMokEPuC2HGeHCQTXwm8vSK25xnFtfhWLMNXwxqdQxzcR+46BfE+fUoVVUmcOeOFQ5pLiei2PC2+0h2BVE+Epdg/P4fCyo0wSL2nRafRIjaHUWHv3/EgZKqj0dpXG6BATPztG5JT8G1vhYNkq1x4Ia13nZFPK64E2Wcl2cECaEcpeCnL+UZoRPfHrtsiJSiaRpWwZtgXRwjAWhE/GR0UoE7w9+xClClYhz5dEjp8rzGHRMlpW+XpgK8z0CCvPRGMU+3n+5kE3MXrA0wLcaNGSyRaRvtAXPuMfQ0HpHirtCrGHxb6Y+pOmxmB3j3qrT2GA+/Nc9JeS65+cmvE+sFcKR7wFToD1bOaibWWKVRq73rLREQ7EX6vwBJXcuBSC9pa0M0XSkIp6Fwfn+z6fjdhQOZP907tP/VEgBM+daxDG24CN+xjo1/E9PaXggp1CFr+0pSC7+Wo2UOuoDTT4oNbmphz3OBf1GB8rdOU1JPap+SMOtoEY/j79dbUfhOs35iaFKrhNrBV1Jb4ouxPHcS7ov40z4YXieNZm0I60del9lkL80aB3TVSBQ401FWUx/hCV4JEtLIxkzXepYsu6wQerSsQDf/mRREJheMMpwQAgJf1R0VQQwmBWcI0yFB/EvmqL5b2t1ChIyv7HF0fEUtXhz3bJqKJPSZ1zrd97iTuCvae3UXpQfwA77LTyZmvicjNSqrN5rMzls2BPLuNLzUSPHQWk8U/HqObpLqHGJ47nZ1ZN4/vMEe3koMMHGWGcVCvnI87lVRZJhoocBVsIw8r5JUawrz6/sYHSXSWwxphiGzQt8BxPirmek/2q1+U2FNq8Q1rktb0uU4OtzZ1nLaldFq2mEoyC99N04l5AaB1z5l2rb2MofFMXZOuvkUQNxpa9HZM1GQP0/3FD9YiDuQXHjypZkOn/eS76RyXXWRCAitDp1/1LAK1B7NEn2ILD6EjKIcSethd4x7AIG4YYaM8eJp2Zbbv3IAH+KJZ2rP59OcGTlZxCzSNePIeBfGzLdXZDm/U8xsweSNuGSza++k9tqUE9tnwkfHrfRg1KY/DBFje0jmzW3JM/f8ayyqlpcB9ePeKgyW0qAWF0pS2lYPd0gMrhC6mrGL9jS0MF3O/pIkprVyz6wuGraWEXLOlzK7ZK+KVzUZkB6E2fIotIHVVaCGl1j3gFfr95hTZE0VzYWYeCmG3R5WUMDWKF3lbyOE0HMUXdDBMyTSUkLQwj698DDQnIr7Ip59oZPlBHekV7vJPxlsjgsIgdz32k8/UCN3NDKIk4VRNgp98f9ngB9MrzJEAuxxXFFrrAHKGZ0PcsFEk+UrnfUokbyTPFrB2R7LCqgLP9myY1tVdws9EE0hzaspo6rQRRP7Kf+epRXLHnILFmBu+ZXK4bjdKV7oH0UUhSXWsY6JvV0juFwwes9flym75DJ/wzBxZuvq/hzeCU58T9LPBgZ6TbNpQj57F7+1+0IIcV+CTwvA2OFpUkH6VaHJsj7srp6f99Q/WIg8sEQu7PBoFpcvnHuegfvYbSC/nS55yUGaKjHzz615W/23biRchhumHYsubY1BLoHrgZPQXsvkrUTu84oNqmd9t7EwHcuwNYyZ6Kbh8S8aVCUcig1E66yhMW8MS+QBjkE8n848e4uqFCQTcQGJL3UPIfHIxQ4Pqmbw6aKNC+B/3yGpJb+060TSabFXQR+WzC8/l9cGoR5OzHV1cMoSCFExtY1U1gqxiLVttCbTUzLzJBU1TcMAdEDh+SKlyxO6cBXFuMpa1TpsrDVVyUdSE+oyPbSa9m9ApSeG0si70MldALqmd/+YpDFpKc5XBtBpeYZbGmLveL/BnxCisgC37PMVDmwc+kc1EQrm7Mp4VeT2z4nz/yQbZ4R94fDFPA5QSJJDuKph+LQKjnzofyYuP9txdHwlhBuXcWKTFxi24DB7GZGs6cENwS5MAuhOjTkWZJOhmwHPAvvHbmvgIFXutJ5nyUwyvtNG3eDSP515wIZcK5yxusVTjOCEM1jvz99ZUACRFqey/ayMtaoRRi2x0p3Doc2vvLYpSs74U5BNiQ7DWYY61ftpdd4Q547WRMTWexXRsX+RmfFi87m9mHEozN35r0h1t2NMtDyz/g4P82F/3lsVACBdMyp8R76RUfpI1aB76aWRbz0gHfKJkBR8tqkXF2r/jcEeUU2L8TRPbO04A3DnlxANKZfhraMUG+GxRylgd+cOSPmU/sV3pGFZG9Ixvg1R0IkEsi/i4VCP7y5wfxrMKMyDtgtvmU1xYPeqkg1KRDFOsPRVq/PPfEn9rSwj0ww6/SJksTdIJ7rm/TkXzlL/B9TJfji5arc3xL6cNyiE5RUuITk0Qlbevmr+8JRJfDGUAIcSck1w4oUW6cEPAQrCRrQjANR6KQ3cy5FnKEWqUVIJEQtYEIIQkW3TomLg+oyGK/7R41ymq99U7Aaj3XQ3IpNYDPL8bMQp1MXtsBVHeKi1FU5JdaWDkjThLL1dtA0d5oFVDONrhXW55nPWHGTjdcylg7k3tyn1+qpuDY3SFK5CQ4jrrIhcK6p4p53jMlXRZNBczch28waf6MynNlJQyhOfvCl80nTEzFDOJiiZFsyTBlSX+5WMpmvBLe4e4e1mjbUuKKaDiNfFb/DuqM0SM57oQifr0EeWqw7j7zgRin9FPm5iiMoiVlVGyrrQDvyLuj99VSIgao6Sxx3pmAserHjMlyB0xHpcf7uv+Bg//3XPQfHPzlsZCeCtWMYj/jwP5KW2rUuu3P1uEgD62f++ZptgnFDr4hFrMJlCdBwM9HvUQqKEkq7A/4U/tZXE9u71j2DuzZ/knT+IANnSxxg1HBm6hPp0SoWHY4diDJRARSJBf7x48RyZouBAMHb5NvYvRTXttjbinHyY+5pWRgtR8cOf7BwZW2tGL69KkAkJ8q1tBgEgTHY/W6/T7mFFbhm2UBHF4QBWwuXO+/OeqV+Ij5y5rxu4eiXTwSpY32NvqedKSntBjC1iPMSLbwjBaOvF//fq6oAhLfWFuaQtucLsoYJvG1DMJuVAmt7Uu4JyGW2W7di+jg485EbwrN8mT9WJloBD/QRsOyzPNLp+Nte3VcirnUseLc7OGq8TY2P5W0scNGey5m3PJiiYPYymuooBCZY4wLLYQwMFXuEydGLzaWzvZtLzrKnK5DL6jJwXPSuURwqYkkZ59tSCWBsreNPVxcrJZcCUJeHXss4pyasn9DFONtWOI5aZSj6+Yd8aMnTKIJDVBxqkVPyUYl73juhZi7EsIdXuJB7j1xQweANLlsSFf5F+HiqC0NnDahyWwUWorKwH/Pfoi3aRILnOdvxs/K1uld2TzuzbLKzgcOCFRSW9n/xWvoXxz8zWMhfpqKh0f7qZ28gYMfjFqXN8+HJwQ+L9KEdB+Yci1zMgzaExXCHGQVbhcNg8DA7i1iMvmtby9E9g9oNAy7U/dWpzQPg/v+OLW5LrsYTd2FayqQPtHsS5AmPizOf/MlLtmnEoeSQhaVH/Panvig82du6frmxS+voSdtKUwUiwf4u8aep18xfvItrVXjnb3pnTD1vH+GCEVZlj7b5968xaQLBnPPxXxTEwfpbBBAok+amharRip2B3JOavSDZgdqkkBV6aivqsbYtOgRtlWOqCrKSZ+U+E8EN93j7J+/nDN1uqK+u6iKy6xONoNdGcrWZVvoGHMgFTHsmcr3wxcqV9SlKwv40vjJRMV/SEJZkuoAEDmbd6Pi2tQWtk2Vu+qRgYNdN8tMpanjy4stRZdl7Z1ljs0cM3qBNWt7+N4wpZ0UV6G9q1BIRL5g3NzAvuE328L0vGDyOtJx5nsvTQeEIGeOYuiSlItQKZRz3PD3digjyCx/tWZ6nh8qzO3ZunSbx5US38bvC50g85525pZYjKqcYozQ8PMMIzc+OC+2FwmurLrRlpzdaNI1TphglQPH5h1VmhXMi7tfODh7dvb/xcFft8Qf0cF0mHSGxtCKDyJGrfN0VjZNNQb8plutWu3JqzNJODBcpna/fXEH5ik7bTf5cdI7Mhe83j3YGzCppOd2lrEUs3HTNLfjzmgKmn3xcrw5kwE7aEa9XRDN/MqpIZMkiVoj3wDd95TX9phbyv7MLY387jX0U1t6O8bnDyutRxMgJNYxDrQU0TzbWR8tlOvuSN5L67KJLluL2ynjAx1UARCLdneSieCc2dr/64hDumLY4IOh+YXMmhaCyD2kJLjnVlxCMCS/p0Woa08k+UgEPjl+lghxCpoxi9P4Nd/DdaFdKcVaL2+tylSXJ/SJNGdG7nzGqKL7n19s9TqkXLiyAvzcAdqnBknp4BFQMQgvyILTW6uuB4hr+6005Z55D591DRwcbH4p9dWzYkfuY0utha1qXQPX6O7Nl9mAdL6YaxoKgy92lsqtYOa21sPk4lVGRJZmouBi8PMikXzQw1SADzGl5HZpafC2Q/PV9lLnicG5pQm4HU17L3GP5qNp4dTAwSJ/D+5a7xAscWVbYBRwYLs47MbZfszzzWwpvC822EEJIFoBeVskjX9rWfIR8/HEejy/A2fD33Ewjxz//3Dw16YGnKb0CCst0oxi8EEDB28CZaD0ogAH795a0lzD9OTVSaHcZwfo5Xcg2cs4I7gJ8bGbaU7ueQMQv+sTbZrWTNjoZ3b9dThsigXt3JQTcf1O3gt5GTjpg+yo9o8fo4GDkgDNsOuc6YfylNf2mFtqcIPH3NIWO7T2bSuPhSccXGlLy/SHvQProlAzudFFFNgvkEt9os3ycxXvfcA6QkUKp2Zai4fZXlELU+xXo0cKhiZnKIZH1rBENyctDyIKdKg4qg05WkdQBQsQVregRiaXviMkxEfDEb+LWRg1bENRlkYVrUWvaTbdlqO1sQ3pVShyRR4jp55D01IE2fEGE9JVoqpTe7rxdRM9p2OjRtzJ4+jxwEnYOFAdd0bO52hJ0/A571nrstDJEm9iXaW9mosKp1ghNBH21iYyMHylOYYPtN1hPX3w9WnkXYrQVBznQl7c6DOyzaMgEOmuBJKbRA/Mmjt6HAc/2M4WtNZW+4FvgoLBKBNNo7Bwry8cRVcoUYetMaCPiaV3DeoW6EOvbH/dkN2IafdlOsyc1+yEDmNcPmnAhzuUH8Js/3KitVpv64VJnNt0Ff1hulOEPr2ogCscJCo1M7lcwuDD2f8yF/21H/z3ltjd9arZxeqW2OCDBg66C6ta97hr4/AjSjeYJpEj/P65BvHklivhz1qomT9VCju310B7HjtIkad/O63eBhTZmcXALJIyIXEMIOMirnyOO6IT1v8GIIERw//mz38HfiI509jUtDu0f3NL98EYbirZywhuu7YPja7odMezGD5pS81M8a1ZuR/AIf6eNjmylj6zVGD+o3AfbTjzyZmAXnx+iYxupXFnY31ZDe4sEnHZxMvCCLKmjmVCxUaRNbJGsed1Wg3vOTbO3KpqehA96xDNU0NVrA5JBcJwW+95LEmgVOQ01hJ6aJtuUGXrZ8hPTfwz/nBtLAmWEdFuPSiCWFWulJcp1tcT9gwcnLcuiE6xL559Lp7ko31GTv5l8MHnuFOvyKLUSd0fzqzlzFSeJF5J82lndS9qdIxvn48zYxKd/LDOp3sQOPWmZvqAiGCkeroPsnM58BS20guR9f7Bq+UxU+e5sJdKJ2iLwNJ1QmuZo8J1G5XFUSiYu5S0e/tVUqiyzNVJ4EgcZZRG8rN6C1/HJXQ3RrTmIvd9SGWXIEbUrUqzOLoqWUN4/Sj92meVm+VK5l3M2vqUA3Mz87RbPdCfGTjYL5mxwnuDWtT3/+w19Nt+8N8J1TxovunfEOZPGeBJWwryRq07ndfNnvsi6oqXaNCZs9Nefs9DiJC8lnH79RuZfDXdYaH92c25z7/HQhvUDeyoThnHyc6OdxTDEN4tg4GC07k5l0AZfb3c7BNg7F9NTRZ1mEm/7m6THgPz/s0tFSnQzr6YHbPMymPh573oT21p8631vJCHpmyOsmfA1PXGnG9UXq/DX+ciMJ6vfSNKBL5o8rU0JbBFdbu3HUkQRTn8zVwWEu+4hF6JrTug59y0KoezqftQ/FI2+k9CapqNhmrkUrrIvSSf8BjTNdHOBCe/sZw9KzJF7fb40vg679TScK6J8Cw+pzpwv10k4cVr8V7ouPKjB1HZf/viqNdX5MFXRNL7JsQCpSSHG+8zRyqOzfgmcYtMzT71emMkNeJvtibnC6EZXq67oIV8hTbVcnAhLwJjR+esqcLDfsqNQGSB2la1FAJ+ss/lcS1JHB0ZFFUO8agS5/j5PmtJOEc2o+QGT7X7rgUs2aJyw5I43GK6Sh14h9zX3FDb7hDp4kwYlT5z4EA3+vuVKUrLbqaNj9EA3NiZB8tFVT267CrND3CjPCn2AMGbfR1e8w+AaX9GzB8qBg42wNjiMvMVaAB/0pb+dz/474TKMvfOErs7ywTjNvigX89Fd2fw6ezdQTpfAgW0bg5qV3YQohHg3V+TTTUOc/SeI44TK02NN0f2oTALJCAWdgRyu3byIUfI4Qgcd2+Ma6ICsNU1ZjrA2ZCLMHqkPJJkv9vOIwLk+HdmXvgtp+afvDYRKcXbj/78oDNtx3J3++Za0Qw4JNuyXqate/shFKfFrd0hv4RHOOirqUtz3sDBF/FEiFJ3UyLG8Ds3STQcvnj/6rDXE4yfezOqc45otxiM0h0yCF3gzl3bapNulqNTZrvbo7WwY/tw20VLyN6eY2GUgqicj0WHVWlU+0xyAaNiIhNbpFemroM9XgE+bsOf5qwUt218IUYEoS/lchTCl74B9CAi6l23Hz0udynn8w3CrPWhDZdL0/QhkzsZsdD7OT5DxnI7XFQJ23HMOS2L4d2JMpeNWtc7YK6u+6/zPMrVN1lyItJ4p01zfIwfIWAGqAwBVtl33fV0Gm2lI7fAG98bu8GOyzGDD9YEuKtII76k3NdlS4Fo4Hd8MfhF5SOi3ZKiBnZbYOFKEbwt9swB8nmaUNsBQqOlUOU9ba81qgQQO2VGwdFJz8YMS8wH64Fl8RsO/uSDxtt4fzAc14B8dp6d5E7+zAf/47ln4KD3ndHz19nMbXmlqZl9IVf7lAOGKCh4UIv6/EjQfTNmNz9IYCBi8b+Nmpzblzmnt0hz0W9wDvUDoUwqpgInFA2s1mfjO4oF6YSdzlH7PPPzlhj7Y07NP3lt/mFqpalpmJ3UlT0dp4BTn3cOik0wdnBpjtLvciK+hbUnC0yihra+MtUm9Kk4Dw3dvWnDKERb379nFIyM29aZoWpb9Ui0HI/Jip07NgDDVIq7wj2cOwtK2q2Bg2NdfdwPniKkcG2SeCXNSvc6bu9u9OmgXop9I4ta8sVqiFp0b0xNpIbO+UOqx7f3F0Sz3ifbZIOy6elUZ9ph/FswgWZU7SFpp8+t09d2ZEQjGy/lcecVyeoNEpwPUvcXc3tfWcpw8ES4h/rufLvPIBdXp0unVa5XviDSKoQ6BCbvayhZkWnpW9RG8VYVULGo9A4IkmB/bd+7zRJdLex9WeTbhzWmHVyV3JFwvXwX+znck1r2t1RxeKvAa+ihgYMR6morjJuP0lKRyXCwpt7TNNRnaP4uaK3k+dKHhkUos7a1na+iqZyMHb2Fl92P5lHnNxz8Dx80OplHHMzn7H/kg//13CPMJ2jf6PlDy2rqzUpTw+XRZIQw71dUfARGXEwE82anGee2w7XDmQ9OM2Bth83Bewd21BJ8nQF1KARNQjJ0Qjp3M6RgLn6iAX3bZEtDBHj6jw8V+P/NLV1pamYD9Q7lgud4UGo+eSxoLUQgv1vWIlNsIQzsujLH3+BToSGdbXl8HQFM5XfWQ3TsIh2M+vhojK2TNuEt9qQtFbFoKaOxaEfcujw74nQ/Kz+jSHV+SHNLHyly/RsR3wSDXYFWRkBNxOwwXaTLAv7e81eiVOOn+FttHH8tO9MlrQmMb4CTB/teu6/cJQ7pphMwfkArXadTx7AM4dNYBG2GYHCuOKIzg0HuLY1evLjgxWkb0UdD1VpfSI3ImcfzaSiAYt/ggyP1qrhU+nyXMBU7zs4LRLltG6SmYuZalE2+m0XRtfFXUYkG8cSrCCWtR6WuILalSvze0kUGBubdBT5oLWFl9TASG+8/P99m6sJd5dk6Y0Ld7RYRMRA7mkO2gkAwGOagfQdZWog/6Lp225e3dl8FSwVT/sPn2RK00DcTjuBWu+OPlvO7u99w8D98ENoIz9KI99acnPyZD/7He5ac3kRTRq0rVM3u0kpT8zEwVDlTMisBgXu7Y1MLmgHyUz/LgitNje+GfOk1vlm/lzd5fGhIupnFIIbbNIdUltoQZZR7tz0xzVgkbg780tQgJJz8NTP/LafmNxwMP2lLk3EOiUzuOXAvZ6MfPRaaZuDiITfvhO2fXWb8jp4yh+9nAvS+hzfpqRZ7GAue0Y7qisZD8iUtLetWo3EVwhcnR9+FkCbf4rCIrvaDWDi6GNBBzFJ01kK0VPeZlRaiWXrErRb2nLycGOUBiRw6sWrJsnzEwZpc6x2TJ3x/pamxKJkBcd2asUrh0Lf1EWDnN/YDN9TD7YKdGChOXPA4AfumV5tUJzfk7oDKv17iKvcAfXSXtInBPg49c0EAFtQs2JWXYk2xZS6M/405t3fYoVZ8MA+g7PmH+fHDMMiB5z7urr/BFnoKjaLhHILfQH490oZK1npJZ35YQK4OvPJ4FnW22X8wnuhUu0J7ch+tSWwd2ym6RnS9WFdMilHaaSCBD1Ke539tE7doR3h22WVaH6Z3+XHmodJZSnDibdJiiVCceVSBR4e3luX/goOr3THiXs3My3/mg/9Ny+Xi5K1R64yef/5xpanhMmQDsLO+yetbCYjRdi4ABRVqgCCViHtXcrB3W14wUIntpkokAq51csgeuH1T/cEhOqNlPU3RdNJREQ+EmymOY2X8H23pbzPzP+MgIqe+BuQwZyqdVxE9Z7aDWuMJB8lqKvSRiwcL1+oDWtTA+QN27+nY+qGCNuHPBYwgdhKb8SDMOb+jIzU+prbXl0VlC8Oj8qKoCbuQiYOKqdCilnLfhRgaNfDvNg6v7bwoaG2z8ZczpPSmKPG7WFuE0kVrEdEpczcfZ3Yr2kNmRJilPpREa5pWHDBHvI9tWU3a3NcnhfGdfNUVE3nexPaPbGTTkdTssIGD5v6JY9SRGt6XlNp5Tj5075QZN4sCl0tbPzlRbnez9Lw3dz20R4wsR0+3ph1KiX9FZw0UlEpwViJQ2t/dkE4bQYIPaqa+OSg9C+Wowa3zxdJG11FOO6S6bPtwSTWDU+1nsFQyr4yE0cuK0KJtXLF6G0E30Zl4WzPhZ1thqvNBy5c8VLMzSJbo4LfpYrgojterzd7iNQ0WluAxuj8b9o3+5/p/x8GJb7ifshsV6Y988L8XC7hpGtGMWhdbvEubVpoaopE0hxlzdk4BRU4CSClI7pzSYEBDIRT26daTjR0uYc76Xi3B2OTG9jEbRCabmFuPS0CECYEnTXhvGMBNAomjus1sG65m5u6d//rz/wEH8UfvWQqcsaePfd2jx0K8TROF4j7R0UNaD6K4wECcRW+taGiCk8E7EQEuPPCirS3YiHXTIKEXMo1V03wslha2klAwEZJXM3NKdGQ0Ljhg7Deu51yoKsnZ3ZZigksMXcd5UywrvmE+GTh4LyuXFX5Rf8t0h8XHS9TEqCw0bMbb6Gcp56JBIm73zYx2In5X1+CDz6V5aXVLjHAgzb4+xFdB9znzbAqY5hvD6Kza08q1Z5qjavBBpmzRSw/EG7kjKDPFZ55vsuDDw/5Xp5WyhzYoP2wi2gwCPnzdU8ZtU/LrPMLSVFqUU6sQ6h+CEg3jV07+tnCkldBQjC4UsPvDhW20rAt1/YNwLyxdLStANywfXm0xevROO3ex2phhbSUvjpRzydmb5N9TkCrKoW/lIia9s9ClPPTm466NVrUw/8nnvJsy03n5YNqp/a84+BW+SzmBJSTE/swH/3OxsDA95tR8Oq+B7ncrTU0RHQs5FNyx722WeTPiDpmIbT+Y5ZCVpqYUpof7WEII+HnCsc3RTqob8hKBFMOTGuDLORAiT5LDGQfGyL1HHypb0EvhUot2/Mef/7e56D84uPzpPZtlYDmehz3cPTyJE5z8eWKlqdt9026cz7s7hLq6OTkGyElwIbx7X5GWa2XjIfFRLibEL1ybSpKQNN+lHGVoy6O21PP+5ZHr0WMBEeEDp+guRqRo7j6EvW+7dwmWN2NfVExoOR3tsjq+fP3yqldSkcGpfY7NHWBaj8+wpdZfPldxesKBOoJO0wHtx4bOKpNXvqOFzs1tdj+JwdR528DBEmoAPQCw3pXnXj/l6vdk9t0Sv+XGjo1jq8EH+2LucmQUmaEqrnQT5Sb5PS3dOIZetkKjnLhkFbuAcOevPl7YEhip2T1sNeuhW0qY7pLiqHdKfg3SYbo2shikhrhqyfJt5bPHY3NSRQjd/yKUxCt0SY66S5mtDBnJtWthpCANTfUI/2yqVMvly+Nn28Va6YZ6Y+t4a0xUxXdpf5aajAPD1V1Bp3Dw5n/BwWmq8nRLbPwG/+edjIGD/03LzaWguVHrygfBT/dkKV+Dsfg30IlqpHwronGTc1qzx5zMIpEqx92pCIjMIpB7dx7GNz/c2CyRscjuonF35oZD57Ql8cVDmfURk+BNtBlc5dSs/DduSrT87beZ+R9zS3EbsfKeDSXR9dWdzG0eTKJ1QL95b03f3QKyHblOMAvh9upCGXeO5DxWlcGDUgzIjtw1lxwNLRzhKJTe4duSAl+sX61cdcfzfQeIqls0LyiLBR9PT53ccUvT2krfGakVGSoha2Ptw/rO67YEPFTXVqB53W2oo25ZbvELR8FVI+74SdRV7lDOY6c67jyYNmc1bdJ9YHIXA24Bwtr9voNqRfbw70M68VDN0QNPR25mNLWzGDK26+KLDjOXFP+pYs4dks5uS2lS3dT9ywlcnnbISeuvVc8PsL0BU5dvXttBjG2UE2ZUgBHegaW7BE/XndvCxyRb5+nVmZ9WekckcSDvfPFsrtzxXOSZo8q36EyptN+Wmw8j8dr2CSuMRkz/JRfh7FpS1PIJ9O9n14LxZ/Vzc7VSwvOtUpItlrCt6TvwZbqQJFLqi0bEkVvdFZRW93X/Cw4+Zdpa7z6YuN+9hv7Fwf+mIwHeUcph1Lr4OG85vm8BMfwq9/pv2eSf8tkLVgOASAaC5mn3btyUUmloCEx8EJo0BTSHDYwvUsr74hf3MhKGP9pFOIIKDn1CguPdBLpuB/zDJ20p4rxBbXL81iQ/7oB+w0Fq5TXEGDgoE0Lqt7koewvMTP/mteFBqhAwiFFIRAd4GMM1LnAriEzNfpdpMdu4rMLc1sb0RSZsimn2k6ksUF2jocIFIVZUbMJfUQPz5Mi6mRCTuMyGYGnr0v+cMct1zX6RV2bwPb0M0qppPNG2eu9ixVFV6nNL5Z4+wwuru4Jd84uOsqCR7ylykk2RzmJDaVZ6KelwYt5bdsmxJ8U00y4TJ4OEfJo9hUELNTXRyFzvQoh7GBXlhVoWXuN/6wt+VrpDUN0p/2gESVB6vvXU89sOXqet5HfBhQ9qOartcQAseiCpo3j25Y3UatmyEtSPwSc7Lwu1pUpt0zEc3ory3STfLkzi91zXPqCxdr1+KjDNZYC3LWPU4Yfn2zYwjNc/7XJamSMKI+2+F76f8p9bn/YTYrEyyxby4C1gyYzlyfcPUyg1/q1Hqh6E5jU07zsJr/mHqVhglWGU/40P/tlz7xcfNHCQGYbDByXmbfHAYr0vm8JoyRT+qamhmCCYZde9SiBjkVA04LNltsNM52AzO6jtqKDtYG/XwXU3ITmnmYIyvxtAGTbRlMDlHQoETcqjD5V9c3/lz4/OwT0K5552QL9wcKUtTVPxsIGDN4Ip9tRCQKHQbfKNevcfbWn6L19C5xep16khxX7qkGN47tg426f0Kql4ASk4v4zerMzPuXII84zsYQMHg+kTUWJ0gHMNJQW/OV4dpSvhDCziA6fYS6elJUAHQUvbEt5caHriUmtNGw6nbSmEX75/Pk7qxqu7+td/QxyO8H7vlXbq2eTAZQupD30a49jkZFR+4oOcadfdTRhvA3z03ONbQ4g7hzSNnmDH4kJZ4eB43oE+jQfqLWyjt4yef3nk1OaMk1rktshzWrphMZQerO8Ss9K+uIRj+KH5yzlDR4lKeLNl6pvuGSDVRMl4enVLHCgqbWVk8MGu+sMSxCuDo60dO41xZXUH6NXka95iTiJElq50A/K3WqreM+c+Q8VS6y+icKfeHl7YoYciXyhscEIyfeptp7d+vQ0LNikaOFjOpoiG5Wkuur/Slv7DB//sufcbHxykpslQ+p1R6z4ZtHIKh/D2fnDnp6Zm4EBCZBLfsMdt9OtsdT9r9UZtibdhxJ2q5ACkQsFuabbhTvhvEH84zM1IwbFZoOD5EMr2p4qJSBJJs9h4yrTlWNgVueeGztx/cmqW8i1nvb6wWXMk4N5kTOEd2h7SaJRU+mb5X23pKrf0U86FsTyLLY854YFWNj5o5twzkpWXvGkuKhDAbqQzwShRdEYghrLyPTkMv/ccnk9Z6Q7wu4ySsnK1jbRRUhgpCMv6JHXpw1x3AY4+G97ySOR6DT1vSjNwsbHey8tXBvfvYwuCrw6hwvO2pi19qS/5nvzw3GXgb8+U7ddWb4PbWodo8/rqbUB4i9rH7au3kXCwkVSHkoZHKrfoS2dryIuC8iBNj1eeewrO+e/kWWQWlV4B5krQQo0ZgZmlV5oaK6eDiVO4nuTAlA0oCTGkG4qmu9HYfXAB5t2ex5n5N1VXS88aVKNStr5YurS7HkKcOWWy/Z5I0vU23zSXlOvlzoGiZizZ15208YFNF2sm8f16wNuuZu7K51vNoiLTDc1onGZ5b+TYfvnzhqqUdWxfRsB5AQIf78x1aHb6Hib3TnLib/vB/J88937ngwYOstAk43n4GBbvmiBBDnAby/zU1FgTXy5YBI/G0tlZwp3SXN4byDtGC4GUuufdZDWTZ2eZdgyTGfcCi1DvXx06o5yGfvxEmccp3Bby/+ZDxd5Dnk0SwTnUno7/5jW09U9+90pbygaCO8ITDkaMFoL8V1u6wkHzYuJwtfQuiHSHqeZiqewuPxFc/UFaMlnXuCYmzulkyChfzrNnjEHEJfsaoQieriopaZafBwh715tl9TQVOU3dCw5cZuA4a/t8dW70M3U1C5SU5mWBbCK6tszOVML2BuNWdwUrTfrwcOVZzdjeW553dD8LbvLkXVahOpktak7CiZnVhfiDVhKu/sWggSnobDwwjYuvL7aEsaxXfljved09o+fG99zT+qVn2qlvzoPRkgVlBjITAjg9ZfBBo9YhRs/vxgHSTljZoCPGiVEJXmXM1RRtRFXU1uKKE4aifH0SODH6JrGR/MA3CkdKnq8p9yiSLb1fONJGW1jX18V7ob2h5EMwd/754xt71UxU3n27r8XelpjMTbE0pgfFN6PLSQ6rjHyuGwd5x4rhxxuqOTQrmOfDYyI4qTHjbd34L6igSeNtSN7Rb3zwT557v+NgPjxHDBzcr8D95K3FUq/Q2KnPhv3U1FAo7/BH4hC1a1R6lUN2TP4AZ37whW3qxo6G2FOBj321H4E5cBPCZBuwwQUBvCjvTZ+puOCmkQVn/pXXZt9ffsk++hL/5jVEr5wQbDuaABFhAwdjjH3jEQevDUaf/6UtNXBQRR7Cs2LRYRf3ZTU9wFaa9KSpRzYGBZfz+CQRwiMRL6Co3KWYxIqKGGcjGNyzhbsIodZ2cbEVNHPdBCG/gS+eORFKCdu+CKHcperQx0Kby4eA7K11b7Og6q0PAgD13c7knJ/ur97GRNap7wjAP0CSw3kzhw9If5BUcMHAvITfDMigbMkAXKNytAWbDOKbH21+KQ21M36gldNLldfn7g5TxW/93egXdankTUtiLA2czyGnqsJ2+sOeg1scGLVuHyLMhQP8fOhNstU0GdgLrYQh/FJRbrm9o/Nl0OCDO+7W8MHAQUeqWZwpo95n6qu+wsGlpV7EiCu7zDcqH9w7z1oqNx2nIHQEg/dtNNkFlHxgiLbIkHwryONLtXpfd+bBPDB5Zxn86ACOxuzxhuq0c2sudcpIpFBlhq/mTz2S8TZGF3VL9Bcf/KPn3u84OLiZGTh4YPT8FdPs9LM5in+HjbrxpKn5zrC8GjT5/Dt2cmzL3GUtB5iS3f/bbfWWsGyqzMFKpBP2+pEoiMRsrrMbxhy8jdGzB8qmuRSITSDZr484iCf58C0MRn76Ev/uNRRlkYynZGN4ysDBlTPeEw4+eu79qy1d4aCeLFh4YdG9kO09mCFOLM8TvbYQfvtRuwU+S91iLGqShDB0SG6mBVEkqo4IVMK3uyNWDnP+o20bySPxPQeIrfwYiQiANqVdBaU263ciCOUtaGhMvbGPxPHgcnuiDwUwPNlgMkv1Cu8ab2OhmvS5s/Bsy8CUQModgYymE1TvTHvA5nddMYWMt7E7YoXDkTr3eCmBrStnzHG8A+liGR4qc/clzi0PGMIDvCwkZ5Ky8Yq6Q0ncBiPUPOu+mR2scHBlFLDLzYoRc4GGWP3I/uaZFWurqhUQVj5UKxxsy60GiLRXu+Oijq1kX6V3JQ4fiPZXf3m1O76iPntZVDkuk6Dr0QjTboeA/NeDVYb0yNFhm0tOzo9it++/+V61JaJf2H65DEbfLUOOm3bO3VvdUL07kMc1IHm+yvL7HAGMHuk4C12C46rJ/uYXHxz/v7xnVziYuPRxBg465mXO0Smu7gqsYk74qanhHZsSi3LYeqoIh6xewUyjJv+YmWx4b3LQARFH5ewbBlh6Me9FNAoNV5Z0uIq/3zt1LLws6CZ/zswletXJmGUW9MuPeW2/ew1dLMAw/eix8ISD6ScctBeIkvqvtvQRB2cv2e9XTFWb2nOwCOxBYmsRb2JlsUZcUpsyqdE1ZY0sKSzaZVR44HBevaY1jFU93Ijmt0wyr2C0FJcZS2JDZ+ppMvhNZMUk2qbgwdz98QpZsQnekypLppdTasYvZCFbUm3tU8yB6MIePHj0ZrFbDpiza/21PeFg5HCWmpiyFAd7Vm8jdX8xhcOLAKUGXkjz0sL9wOgSQn18YSbyaj3yBQHwubsZnKckUxcfPN6LAux9Ygudph3aRQigwdt94/E7DeKIBshqkuaADKeHIkx+V7puo1oRKgkDHCHvW8dkcbjyY0SNVq2m3W5bpQZ8LZT4pdzuaBrDJby5toyRkTcmzqBOki0ZoiyvnntpUK2r7svSKPuu2S7dVnt9OcqgE2/ewI8I9HhDxWb6RSj2+mL+5aFgXhwYPZK/+jQXnZd/m4v+v7xnVzg4Tut+AwfTM8vcW3jS1AAtWxRjWdb80slwKoq7YwiVyoCRG9C/ByO+gPwXlDU5fZAbdfqkAKgOMDOAXusZUVydkYB00QUOOzdICFz5Mf7Mdr+5fMx2B+wMYLe/+CenxsBB0sBBLkBobcTzEwdDjzjYsh9T+V/a0hUOhqshD54XwrCXEBgU4I4r+N2wH18P40IPlbgGLHgcXw650JAJ2y7kR39+uhqNAmVMerNpjjhDtGK8OgFLoGSxeqttOd4cupa0ervxlQ9V3qmO4UwDAYOk7/et/dBM1vgzQQrMXWxyyTc8f58sDd5fL/xARIsbQIxPt+R/4oN/t3dYCdyCUaZHkPyCRQbPvbB9yoHlwSaj5LWr6oNaWyyIVnrucHhrmhoFb0ibj7RRgDqJ2UyfPvXVcWaFgyjJfwa0uYLgi3uOO7Su5ZaJDF35dsP0Rk5+KagNy/XzbQaL3AEBR6tadjfpXrSJlsWRsMqmTMvNUWmTQMxJaAEGKflV7tiTMLHl8NY3hBGv4B6eLpaaxRBuar3w3BUe6PxHkLhPm7k7iOVP0q+BBhBaFm62xkVkfdIwcLBi9Eh5BnyzDFugxe/7wf+n9+wKB/O+uYGDl9bhoAidPmpq7qGY1YQye05w4z4IBPG4L8BmpZu+yZ+X+P2ww/Y557YcFDcT1X0VckZ1BxuAopT/BvPhGg8l8m7H9p1mcqAJkvvT7vi//vy/cDD5W363gVa0gYPhHfantnSFg2kz0tsMJoSiVHZ0yFmIUvLYQLRZAn91l3kNtdkkdO4Q3dVg1EQJCgQzm3JbjoaqsAItSat7KSvwxc738wbHI/CuE1yUXe1uPgLIZXlUuqbZxd3/4ew939JYw+3h6UMndkGFRFMsUdNM2dEdehNweh+GjiJFUToM//pvBs0O+5x93g/vh3zxil4Kw7Pu9dyryLOHiW3Yr1Cnpr7ucn/jwl0Xwdxo5buZ1Vkcq2XmjkBEGL5bWdNuqr0U2/VThcxYQwt95xfIRgyNeX53b4tHl3w5KT1RZlRde287iPKlO+HR4AJya48sVHvsBdo9vEs42REsGnzQxMFVQm6ACXzHjVV6UQYek4TUyaKFziWvHDlWXzq5Bni99NPAwV9FNZ7tjNl2XXcVXteSN8Io+gMCVcEyu7wFBs533nODMRdyr2hjkDhWXWS4hBpnXeRX+zhcADPX428812C/0M1HNXX688eIt9xPoTO8fDmgFjRUj9+2FYN3Jz/mkdH0P+5FR19R9X5y5fw/cDD26vjJU6OfkIFpkRk3S9tBnkdXcdiBTRk0QIV5LhRwJe+DFoYgqJ3Sho7OPAyexXZgzeaQhxnXwDiF+muKKyprm6lbDVg+zDlmOzxn1f8vDRU47+8W3TcYsYiDMR60O2HMEvj1Dw6a3tLfvaVEXt9wGHRnjPw8Wk37jWGbsEzxijUqFGJtvSQoM1cCGrGBSC3lGsyEJMGkwsMpvLIxIgL6hLUDY1FcrVJSLUALcYazONezXN1Xjy09FoTk2S01AKbuhM1Po1Vd+LQ5lGcvhgSYMHXm18r72zcpBzkTPEeblARktHzSNt8dc6iXuf3yWhkMX6l3Zk/N8DElz/vaBioyesPMNVSiQdaQL6/RuvE7e/7CpagLngaNmT/jIss9xcDBFQ5LbCJqBFL+LoWoip316bYrCrdFN38Uk7ylRjYCNaFx15d/sR9jYj8TePx6L7RmWq4I5xXk8OBlsU8G6fVv9A1yJAmCGuBlSOCPO3SS09P0iAm2xAewZBuTZebIu8UkqmXo+O1YbqwrnWb7iuy0eYdfWdBQ1Tkgb/Dui4Pp9zkfPCRH3drCfvCrZaMyz6H6P3Awn1bnnpoqPizUWPDbwMrwNf9alMCXT2gnQ2gEt/e3m/Ve2pw/MC/h965fJXveALLmT3H86gaVtly+icJkeNWdCYeQw61Xw35ewae/cDwKgv/eHZv5/DIMOkMyo3K3QGzDP+tm6T9aYr49V/wmpV8LOFiyLMtPGQt/l9opflBecTtx4rjtpMpjL9mKjFzFLyNmNKoEGVSJJOyJ5Kgi277a3iTGjBK2rdJabJvg4FFO4stR+eTBoj48cEoNuBVbCZwpKpx2+sn3zjmriZjrOHe98y3nKI4VKWziYMce6j9QWvUNA9Qmrrv2QMYsPw/XZg80kLpCG8aogFm8qYneedodFw3uV7o2LySJU+JeGNOvvOjoQWxI3RUXOdDOiSkdNrB7tmmcdVtrBuZZLg8ut6jCMqgNhg/wm4uhApdg7vM3lEJPQwYqBHnZJXOfEo4+WxfqfjTMllRHnq0ZH6Z3b9dtVfoWODZmO/cKYyeDbUFSuqhC/fATOW7QXicmuhXiDdo9OrKd2o2TMFde/tG5LX0uqW0djWUHcfCl+heWiDvhKWG7G9gWNVTBUtng3TVMGT7xweFNhV3cD2YObw0cLP5fOIjsbzx5asSzPBK4+Wzp3VTgJffpTPGruGfPoEvEGryMyU56hK2G7EAaAuByzCtsl0OOzE0OtkWObaOaPQxvBmw8KQsE0dQ8gXsSWYUBO/6v3fHCnTl7mzyVaPToSn3qa5vzwYX94Av5qb97b91Uzz5nLIzswQQktIebPNcxDhnsgQ+97dIA843tELfKyd8ne6IYDIYNHBxp9miiGJPgqRZqZXMORdSiwaJF0U1PzS2nDE72Xw1ZUhhWTp2RYtEV7RVigD5UPf4v9EG9LkvBkh17KBPzbBbPa+8uPO8wWmGj49x5Z0T5osDT7piCtGHnIbqfv6O5VyMtN+07X79HyKEwlD8hHXF20icmiakK5crqefIkcl+6N3CwS0tBUy9qnnXdQy4Bs7fnb2jNTZC2mpnVCSekowDot4YYiF02hsBL3J4I0l3QZfDBYLs82QBKgPyrQ8qPxVmsGRDWpddBluwElJ85XS3ZSf4WkGzbL6dBBrv0+NwRhLLP0kyAzLXvxdJn/XjQUvrjwhttUuDO2ikrMfFbj3xBa3xBQ1UoIJTBu8HrDzsG5gGlN8V/4+CkCnO/PmSt/0cGe+Du5slTc7A//f5YRqbVY8J4O3mHjfYQFQkSOLsLk9O4d8AILAeuf13fmEF6ljr66t6iDea9MUi6Dr0ZqBiOAKGwTKz8jDm2hrzndJvEM+y/dscLd+ZNfKD2MSUE+JSnvjaTDy54ahb6u/kREmTy2wGDp5XcXIYsHrONVhrXAziL7XGHyEpPuxmeOHQ4Z9f1qAb1IvGa35Zg07QG91NudKxyG0IygPDuZXykaPpEWD3K8OKJTkh9vC0JWNXl/DJm6sRN8Gc5r+VNDVV84k5gmwbvH7MJws+1Dx/ISbFHzcoVhezvpgojlAmvbdOy6S3t3bPkieWI7z8yt+e7NFrZVTniVm0U7qMycG97FAfKMHIkNcU745AxcBD49hptWehxKoxPkgYOWqBEM90nQp2setS3GBxzG7kNIJJlnH4ySL5OUh0o5qWFHHv8EORHpNhA1cg5+yYs9mvq1VdTQ7VPFKupS/zFxW4RigbodatwK4NxGZsBtB7fIi+K3is2IN8EBbIo9L80WuPr8qt3Fo8eHebQ06PsBL1ApXB/QUNVQq1dg1s1mlxmsngv+hsHF/aD/5nBfpNyzj01RfxoWEdXC3mcvirx6bWkfWsqbSKkCC5bLt3MTkq1r+kr3NX2Doj2fQHOuewNgw4PyzjgyZpXTcUxYSUMjY05q1+QscMfR7M0Tv5bQyU0/YS9SCa5Os6Ef4KBmMwA2d99bQYOKma1QYMn+bYviLHoqvTU1xakRkScM3DwRkNn8RcvVl+CtBAO+L6PH4jj9Ej14GV1Wi1aOmQkSfri2mFZkYVXBB+Yimvb3peJcVUN2xyaBtMcP8MUCXjMysgYCTuTbUX9WtJA4px1ErfamvGTi+ORhC0f5ILdb7lkp6iAue1U8+vM1BJT19gbWWanYH7W5UZO6g2qDtT69DsGFB8gsPN4afwjHmdvn3BwfGMdkTP61/KdMNZOVnff3AkSdb9D+Tu596MxXck4iRnrMHBwVc2p2KXb5iRt53blJg+DKwcDJVe7JJKeuUFSwNkgXwgr7CdwKztLyPURGmwVAaDUZsVrS+LVeltX693jVUJxrzNMUOSFkDg3wfmtMe66RPCTURYxPkK32rtN78tiKd/Dv3xGQvgXlC2nAAUwdQW248Ij6FjQUMWKnw3e3QIcs9K/7kV/4+Cf/eB/ZrBbB9CTp2ap8WEnnc+DpR9lNHCJ2BSfhGXfvBxmuCjqSWw4+BHjuJLXvF4XMglRYHqaRX35S9oemmTJZXsI8Ww4xgdUDuCqS2ywS3IOF+Ej/6Wh+sdTA08i+FM+v3r9x1NzxSPGCMGDa1c2K8T6TqMtrI+0rFGiwlhPtwwcrIL+rUE0/ilPNtkML8SuabtVuiyMZ9IjbzwbCph8UOKBVcvenquvKvQHu4wPXZJbj0cZWgm3AMW1aRyewSKmtjKyvaRWc9fI4av1JCeHtWNni2lbo/VqXEpPc2Uzo8zfkybJPKbUzC6/Gad43q2tvrkXGpP+CuX0zTuMQnrvSWf+vp2D4fvU/l2XsmnLuVyhByV9dlKDC/KnFwMBWp2Sk2qfbsW3KNsofZlPOLmKx25w2JyWD4L8sXV0kK8jvOJnn/L5RZ/x/oauSjuXoN8Z4fvi02WIPZ277p4uvbcrfBPMb3x/6Md+md7STltgK50XIhk0zrVE6KepF/1oyVL1CePTsQAlxLVdR49vfY628jHHoJKVnEfNj9e3wxEvm7qCvqMZtBALGqrjPEAZvJucVv94ahZx8M9+8D8z2MVJ/slTM2hwGfNe/ePR5LtEPntqJCIgy1tEOARAk20QvXL6K37oFB7414Gw28sIXOQnELCMtmPpk1AAeCFzANbMQdsFmuylE/YI9q+7gt85VMCZnTD4IG8n4w3E/Y+nhlvo72bApeyprnBFiPOYnppPSIYfoQ6hzXCraZcn2SMGNVGWq+sA30FY1fL57TnLSKGKfWUGR1b1VlTRGUXoQxhr9pbq47gbI6v8+4So0UMDB3UtB6SIdYOBikSajKb1thqv562dDzp945vF91MDlbPfkYPwzP3ah5BaeiZdHW1xEGDwwchUmcVqik2XDFrg48snPWVa383lLXb2/FfxkAOdHOg6UHKVlyonlHKT+Dg+3X6we/r31PU2z0nQALx3WpnRTvQICZg6mQyKszDQLKWTzTZMhQVeJm7dbLPKwCAYkP9+uDLIhnHknifrxRvl1dse37a0E41AP9eWWf7c5hbl64dI2qFFOd3GidVY+NehfU+sBWNkwurg0V+IOr0NMIVCvGG1QmOD1JR2bFoZmZ01rXo1pv7Y+dqNNWCb89uChqq847wweHe+jEb+nbHwv/aD/501dHNpm3tqbsHxrHAp5Ms4yLdw8dlTo4IB55Yc8iLbacfV3/YVPrGTwg/cG36vzcO4cQvxMQ3SN2GIzmjQC8qxuUIJaOJMAMZTwJbGOPAI35+l4ecZ6Y+W+M/uWPvHU/MHB58y2PmxVtwmmwv93akEYa9lOGvQQZdzF3703M6Cufsd18NYeY8XomkhGueY0PoDm0sGIwH1xUSR3R8VfjQUbZe2fRYlbpSPNKHEgJLBNDlhUh6Iv2zfAkWMVNTdktaqf6F5b160ccCbgqpLGHSSy+3sKvn0VAOvZtHpi541lOlTiP5WbrI6aDOeDezk6+s1taeOCmZPTQeSRo+pht6lfP490iHc89hWxTISZ4SVuBOVlLK16x5yGGb3H7RQmssAdDeToWZRCOAMUjNog8kfBYPUvA+IsB0G3ryaSlAwQid/yvQ9Ey11VgMMIodaPOHozzrkdeBUYUV2QzDvzHnn7rp9lCbqF+sc7F7hW0GNx/JQogECeN0aI6/Hy3Vh1Ps067G3j85j8K2GjXqh7IvhsMWQN7X5XUHyP7XET97S+b3ov/aDNTZ9qhs4+MdTE9ULrMe6E7JAkwXfRB4ZtM14ZLPf6tlTU7C7+8+emo0ytll0CltxF1e+8kJmyNTq1oVFlu/i0JZvGfXHOKKXU/D4xfoAnvCYDfVRxCX77C01d8f/h5b4f3pLTT4YbvGKmbFAXy/0d9f4yB6YHSs69+koen3P4OpUmVAC2FbfJ/eDD30pmH4Rj0HLywlXJBxGtt/tJWeignyxy8EdUEgqfQFAqHBkW3TVgqyMMt81MKraHBlGGSAnb8/bpBie7tvAUdUBJvQImB6oIeiMPFR6EohVrcp4SljTHfF2+HJt1z4RJsOdHXY8zJHMTH0sdnJw4g7iX0E5pNdJuQYdNe83fRNdx+uXGDlkeuxeqsvpik+Ttx20Xtkm7ASfuBNAtrtmo6QgJdkfQI57N9vPF1ECCHmIYYPn7A6RE+BYGlOyYJ0IMWrQRZUiKaRVFOrAu6X3W+kgA8asABaMIR01khaCUXYErkgkmyQFqx9RI6DKjlN0/fHF68nLfEW8r+29Q2vFV8CstiOqCqBVmPTPoYW5L+yg4//WEocOqtZgoYqGxgs4eJxHAt0za3paWPCWfkKi+hf00Vu8Cv7xTSD68BsU4ArzfqsnT40CxIRnT80NuurVwM1LONWjC8ZRBXtTLIUCX7sB63THGAz/SmIjUcmucip8WMiBJS+Bhn0813vylprRJQu9pQf2CMSBbo6EQiu83SHz/6O/u46NaGNwfc5gf+7vzrIEhkgEm5sOq0nxc8I4RUFKK2UZWX1wOVeoEGJx/bpwRSKoZnkRZaQ1vaepeiAWV2Yw94ORczMo4Rr0Kf48IGvI0Lmy8UPKtUF+bSlYlX4RgqxGitJUz7sdywUSSU/j39FxjvP3qRwyc7z2uTWEGUlXJ31xBvpyDZMPTuoq2X4TLZAdIYSMn/aD3gf2/KvtNc9OpNv1QzUXPlE45Zpq4kC0ebSBVtIWOrdq4GDEARcI40VguKOZEyfVRzciqTAwVbGk3MboStUvO2+z8/7uHBiWPjpSRFeybdvOLymsq776qkv8bibF+INxXlIjyMweLkA1pU+HjeNauxSroQi4cvaowu0UkdhLEzhTbZXG1VJefiy81BKT6WhEqavbWWfhszU9LEFHZ76JMqjB3OfPCKt/m3c3kHplhzi4pcXnjIU/OHgy/W58La7vkwveUlwcfDPOumsDBxfOuuqH9MFJG3SY/VbPnpoELz17angwTyNYFvBvhaHRhm/HnqX2ZiBXSNl23oQw2h93B+ISsMMGQKBh8fQfaVjkeGNGevaW2s18/v/y1Ih/tMR/cPDZW+qhRtCf/u4c/skmXfWiUcVrBTpKniFTVD2+593dehQlbrJ+OM5FEF/ajNyPcIq49vAlmBjrMe1Q0uTEMZW4Rfi5p4bsyMqHt0KQ3yX5mV+VJmhfIEgwnIg25c2TqgaOjp7S3S+htzxWETHiREXpV1S+d6NKhceU/PUOeex3KaS+J8vRO7cxfUnz3tL+A1XvGnyweu9s9HqpRudB86gHJK90BHDWwJVaT/s76ebVoamTGXEyZPNRAYzmgm6iUsswojFb2Vc21WsVSRzcZHldu5KHj5fYX49/SZAjRpyvRQl5LSJ3NkOMTAdbfHr9qh2JkwGn0sJUizAr5a4taxfHtkSQMn4QP6QUms9sklgDST4syV/HdYP71b5UtcDsoFnAayNg7ecvroLa9ENyNKywjm51x9RQiYOvlo2CgXkTnYwPatbl7nPGwkLW0NKwjorDqoGDf7TEa7Maou6a+fzThbOuAAwuipbgpdlv9eypuRaw4rOnZqMCes7sj6WsBStGmOwWHyAc680dZ1gPeP3cJYulNHh26cCCDYruTTjQTm3q+8aM9OQtZfjg5YKnZiGXePkfLfECDtJzbyk69BEL/d15FACaIaqbc7zZ2MvXHkLk52/GsP11SjeYidagkhHEtqoZA1VwKxWOzHr2pKsohZBPb3ZdD8ap58MlZAeSBIMPzhBNjSKkU7WxUgCDc62obCm5igLGH789vy1puOfIDnjNrM5RbOIbquXoMXFYHfIgeYsps3uSEu6FceWdF4FnovGCL7vILsHhM7U877SdOnjoWrv23adYbqZyG11qEB86vuw7c7kgynx6OxEg5C7X3IaMw9xL2hPGYR4AWOPdNfggqXBBnL9Ym52yaJAEP5KcYsxITEZj8GzgCmNSUCARMvjg0g0mZBAmECS6a8sbr1pqG5SswD9iDyRi8EEy93MbYKeCBwU6YmvP0a+I+NnB9MtdQcORQ8fDNKLyBgANa9jwxtynmDNSacd8NjKHdYs5I1lBv/G1POQ+rhk4uLgf/LCTnlQB0QwS/0dL7JukB2V4xpxko398E9ujjy1KlK7n/VZPnhoVj7ufPTXFS2FLBlO0y1tCh55NCKdW0EurtTJhxclWwHVwlcSngj3x/YRBRzX26nSLQZfM3fGTt5QHl9ILu+OFuwLZ7GtrwZS9vbAfNDP3eGNoM/jgn/7uKSiVjN95P4bkl9ssEGWwBnDZPBzZH4NTFRG+adGHzJrgCgeGtO38+EGMotqGG1TalhnDhNs+UlQhkFvBiIBeS7hCJY0zyLmG3GMvNl7JuShILLkyU+WX3shtdmpqs1VxO9gipRl88HtMV5z4TEPpsTMJuYkhMZRXXzxwrWyPbChDBQqVac7JpByze97zaaw208fEPfEona+Cb81sqnHyNDcIn9A2YJVu7jxEgdURGk5A5GBM8zgIAAWrl1EIzuCDuDFPZZGGiGPYOHyFPWB0IL0iv15NkcWICAGdkPwqkyS02Oq293WSErDwK0c60LDU6HadlNi71RDOUjmpH4xf0ViGvPeBqjaBsKx7L1+dzWoXe5UKtjO9LnicI1UWhY3G6x1lUnvKKGt+sIKFKqQceyZgvgDbj84QS/UjCgx1NDgq7wQMHFzcD/7WySxoidlg15z5qwYfXJj58wULJLcBu3B+9ePZU4NwuWdPzZW7dglkNwhsI0U+QNltp3/dYgP56qW6Zf3LzV4FEZddRnZwwUEMc+Dw4RJfcuPGjPTsLb0y8/n/0RKDk6Xv2Ew5/3c+/0LGgmo3cdDcDy70d8vNbbKSz2glRPmiyrVOT0BVBVYsy8a5MT1eX63JQegxbuOhRBQRSClNRGLNraaluGxqianAEsiLjhWVHxU021fsDYcGKMX7llcaAMPDLV6EB5Pc2vhbsDiryephQZsuH9A8PBXOLfibe3EijZcPVVTeo7hqXZU0PSqfjO2P7KN6EziWZHIK3oM+Rsn+OhyYWmL+sxVgJk99bfg45xGPCUd1zJsZC/VZX7NkjD9w4PfsvV7hmnHcd6Cg9LGBg2ERpGdJHJtJsjx4AAy0DPL8l4BUDcWwN+6/JDUTIN4zIaLglAVhO8bcD3OspWh7ZHWBHHnMW+IVmUUi3PG3s1O7AHGKf4uH7tYbluiwYIoei9+6n/grdCxF3/O6mF2SNkoQZ2aUXVeRePWEGFVKzLiZ3x4XSljJ7EkfLuDg4n7wH53MHy2xyQeNmZ8XkfHCzO+x6s0y7Mab8GCDt5GQCu60A9Dhs6cGOgP85SttPWsFSytUsZSLAbYdgzrH9WVoGcvBvoiwNYZZTsjLwOwGA5ywwqrGjPTbWxoPLPSWPrWqzXfHf/L5F/jgNmN2kSBL8dJCf/fQyvAGH5zgIr+caj+mCucvzv5Srmuo9OlTl4P4IRNRMnEgKwcOHhwhkw8qXzkJ0h3JB51VTh0nr0xd1YCwRwL3pqfmUWgjuUALaLuUMS8Eij+1yLhpK7UrAn548PZ8VtAU5GzuLW0Qs4hkdvlBB4SjOBWk8bVVKd2Tv5g+f3u/t7p79ihObhCfO4IR572RWjbvRc3+7i+3lAbrEVbq0IXMvXFoP0LZx0dVe9jk936iLLrmUOQowhUgkdsNsIm8AjI+FCTE4LJs7ye4C8/w9K4K8pXQMj8sr/N6MMcX3dksZnpqEmEG6lvJUoT91dLla8268t7OhPiyHYYkFsPkWzAhqwjtIxjJNVZqD/Xgz7LONj9PnLOqqBytjbSws1a7ROcZZU0kacwcw2GB6X0bWPVCZfu0VkD7nxoLOLi4HzT5oI4sPX5Y0BKfzWf+fQr6mv7jH0T6hTESZNrGuSGSq3YOZKdOLJh79tScZR5LFO5lUeYUmXpSXhuE0TTumg52gPdQGh/FFH6SkxwrMoNMq1ASLqlwEDBmpH+8pWYuMWvMSGlbJL5wLwoafPDnujE33S7sB83+QQMHsz/MtCioZDf54C97j66AR6nNv1wQw+dSWKv3aCH5vsqDlVpk+nZoqbWZ6DiwEoKimdXOcy7xxa0socN5b6m9bRwFcEcTlLGTW1HyCqAmXMNak8d1MjcAkPXBVkue5MZLP8cT5X36USunB4punqLeAjksPka+h4Y5jukQaOXemfwOEEj1jk0swc+eGofazt8q72/fGTioi2Wgq0zrL405fSS9/8txxJcemNsPu3TuLkUXAm1q6nYlpF9BoGJgXi7IcFIAhGy9CAEeZfdXiQg5LjughgqA01ko2wFCbD29IbrUJCkEFCAXCQgMyVwDA+frl+d8XZhKu1+NuYlvZ7juQ4ZFxhnw7odPHahw0l0ASduHRMFgdsjPV8BtFyjmQTKuq0sKCVVGiLs0Rpeks+3epAyWzqroqPnZ7IeFwWNjRsqXoNiCt/Q3Dop/Mvf+tR+Mj44MHKyyZHfEc1fjTNbAQXzYBElqRNhyTdvyujbvqdk/4Z89NZfuM9rpgzCfJ5PspzbSqyt+GV7FaxmHtnvlZhIB2vJuz7nF53DfmYYOX9G2oJc0ZqRnb2lsoacmTC/0dxt8MGCMl7KBgwueGrN/cJSVGZW6Bibu1zPIVPwqe0QgTDFcHVcb6hXrjxi0vMTcdOoeTOn3SCpwqw3pdff5KB1iUiE7z6oxhKGkrZEicnXa1mETHNbjQ8BAjQjHCoto1xbndw8TEAjl42pThb82mZk+0mbbw9z74En8PjmQypvzU5RwCF3p/Qvw7f08l/gdnSu8V52jBtUYdqLTrxPEILwUUnwjT+c6mb586/jrDXrbVeuVc+u074Hl5X5K6jwSodm7HGHMz1hkDR8HQJUtuZi6RG6ir52sXEl5qB5IcaSF95VwdtbGQO4VI1/3Y1eOyxhrX0+IZs7ci4sLuQ8E6PdWibh3yiVhLLZlWmUtdccV1wnTlVOQx28Z5U7EOM4z3bczGar7A2nADbxgDZYKeekhXziS8D65hejaF4jgWrzaKEKTj/sTqFExzoQTInBTNGakwjbJL2Qs/E8+OL8XXdgPDmtpt5nPf6SHwtiUfw+UEfWwYZ3Vjfn5aM2mQyz2xeypuRDco2dPTapBYNcxh18WgUpoPbmei+P21JvpY3YQQjyJZcgbscE9OgAEWsrm+JVGrLpZjDFmpN/e0nku8e98/j/93UgphBs4WISMKeiPp8bsH/wqQw71uYVKy+MljUeGV02uZy1dYdVJ0oFpRcs6V4DzATBbtVB1YSh+3JTD4G7oMuKPzfvakLYr5JopmvKWkfVlmHd6WfXkrzd7SVJUcAISg9onMcmMxGihENS/tly15I04an0QmplHx11wIoy3P7xbs820+uVHK0BMHWBgEAEjMy003iMcpQ1O6l9b6uLU1BKL4+k77yo+ERrUaIUVhzlbdUp5qg8kXO3CHGUOCPep74M+nX+9nLspA8CbH4+564ydS6A4i4KYiiXTnN5lCLtCZ/MjjPG9ixBS+4VkH6fI3cSPP8YQ8zA3+KAgxdOlpdSPUUtpQ+oa0RglEd0ZISoEfjDrgaQqmTM/Ck5v02l8TLQDvfPm19TGTJO3TpLVkWy1pxMx5iINr7bB4G3tcu2ujB8VGojx1OHDqyILGjOStVnbMXvS1ZNbCzv6n3zw6V70z36wCmTNDPb1L9ZL39SYZOa+CWhy+g2NMhfG/JzAfB2zp4bhBOrZU1O2ausUtsNQFDx59Hu3wXSK4nGl0s2sjbwhoBhadb2Pm+NvkJnkaef+ugrFQGNGevaWCs9r9+d8/gVPDYtlVgVbNHC94Kkx+wdN30T7dwuViYNm9izqvMQt6V5YuPj5ck0PkDeVj0s8FMpSTrivtO9phXsbWFIykfg44A5HS+y62ddG73r3hiusjN5vu2Yd0qbrWggeaeJm5pfxBxYVoDZwDmtFim4VlAH9dWOo/25xNXGwb/znsQYHJg7HeoFEIqPIPjdR7+BpDvL0HF/27cTN6J79bHYYve3nwNFUmUllhWy/S/Gze6F8ckc3R3PfBEP+7T7ix48smCUITaLoe2SNnuaxpATa8XAL5K7bHr6h2FAzjHRkxQ+QBE7els2+tgBezESuOpmogYPr0muWqXeKsZ/llizY28ytJq3692whSrBFPF8DUZZTrWSXBGgxCAJ3H1mpX+K63yCyMOEnvURQOTjYHrU1XYr4D4rg4GPJErwqIYPxBD1qfN3ulfMGDpZR4saYkQpleOmjgYOTKhz79gmJjr6imQU+OMfBhf1g7PhJS8zrR1sObOgPTqs7DmPmT3KfrFK8AAf9qXlPDSzzz56akLXCYkQW93r85MgLeR07m2FcyX1jAO4+5kWSMSjt4JxeQiM2Pe8Mes2Cbo6Y52/84y39k8+/4KnZ0I2vzdcNlgVPjdk/WDLme+a5hapv4uDKu8l3qY7bIt7NWcmFdNpCXyBZrjLiFELd4MGo7h6w8Us8nQjTl2vO8TETYCh5FXjgBMKnyEqHEs2a2oeXl1wA5kJHm6T0sKJwt+Fba2J/jR3peTH7qSC1t2fPLa75OQ4WsJEU2pypTfvRvLvh/AX+xhHVZfXDGwW92lXz1RY1hV2Xk+wQeez3VCRyJAPsBOQeOix2+PPNWrurjqbfsQbigSamH7bvoea5xKKLnTI8eksAyolqpcC836fvO9npNL7pFnDKrgyobgajxFkGt1GaqGbCV28v45zuSxV7Zvnm1q5YC4bpc9TAwbWYLKyGuHsox9nrXDJfB1kzRKLBbsssK9U/Wze29HohL7xY0S/7dMHW6QedgfZ2nGpSSamGMMNP8Cjf4PsNY8Y2cPB7vozG9VOCoCsGDv5/3YsuZLAPSk9a4mkVG0Fl/2V6ZrGaM/9tCc0AedsMZchP6FvnrJlDvjx7arxDzFcNrm6tAMQk6/f6Lzcw51aBA7PDKJrN/j1aCUnodMcBRlouoHefwhwg5SP88rO3FH7K3/idz/+Pp4blTS1xMM6gq9kFT43ZPxiWYbuy2N9t+ugLeMk4D2kGdt0dhIv9B7bv7oLkvQvMDfmB27l/lMAiwXCGjgd4QDCgTZD4x5REuLBwEVK09BwHAT7x5C3d7SQ5NZQxHfqY/BAY5KLdaiyy27WVg1NtyLwXpyYO2nQBy356h2Zm2ij80TIVnu4KGpF77VE9IP8K3AsgeW0djXu5X52JeEsfm7nEPDi42/4+6+bOi7rqYe5I4dYJ8y/bmqZ3UgeQkyrwLnVYhsCzjYGai+Lc2meI0X+BiqzinFDZIjmFT933nnpL8fGyYAsuOIw2zJjTNcaOyHwxFEs/OBNQIB3m4dt1Eu9Z4EIR4utrqf1ZAuVAeON7J9n+gAK14Z1x6ugyc/N6qx+OSQPaJtUs+4U2EKt/yPywNMFxrZY6zRs4yLfR1WEVc3VLLPh5aLFWyjtC6b/vRf9kz+oINtcS1wDxoJh1rH+bn3VHB1vTNNUEJ0sI7u04weVCEAgoz56aa8Dhj3PbFLy+b3307exwqephDnSUdFgc+0LU6CqyNdIESOCszvdDDRn7E1Qc5237T97SuYbqTz6/9EdLbH20MXHSLyT5Zxw0vaVm/yBhvN6tf/d3m/tuqQ2tUjcZNnEiz/rM7cW70QFXBRn1gqVz9KHQ6Six4TCszSzck6emhamgX7GUbJQaPlnbxcecHEZ23K1AyxoVGoG2wIhKH+I4v6RGa1M7NstTp4GuPP6nzXyy5PIXFBLuax5c1/TE1FFYr5MaPo3slzuKc6ND5rSBuTvWkJHZ7X4vtj91yEaxT80e28bB+C5aIB94z94mNbEkcwUDK89/dg/zpk5mhSaGeW7uqcEoLNVgHGZPDZFLUmwjbYHuGZSsryUOdntxvhyzwSISnnfaCkCECwg28Yt6SRWtAvwYiMmvHNlbILVjij0YOQz4KQEjjjMuIjyLNe7axGcLdVsHHsHqppKpTFbuEpPehLUerZpnCeyGi8DgoGwZD/PIoDQwcPDLtpKvAuLHChqY88Ga8Wxs/jcOLmTuBSZPWmLu4HS6b+pk9BOCqJQYUi5uO7Q2Im5BDmxKowQVevbUhCxFhuSKsxX/FX/PZLcsOynZ5rgspF3kTYhSPZorqmmbKVIElU+UQ+8xnHW0b8xNz97Slaf8jed8/gUN1d/2nnwNKAYfVJ5x0Fw3mP2D4zTrJxb7u/MtRuWuYbvdP+3mBxKAW2DJmHJxQLhqZtyML/Oa4KpqEKptrVCZSJIQmCBNQ8t4zTgKQHLtcCyIqx1NNqa82KTFWjuvZ8yoWAkcGcdD4o3KBj23ri9VP1MfFZ88NfM286HWBifa+5X38cLWWAwhj+o0cZjjGV0mVy1H/GwqY759dSCfKvl51lAnBRxO7I+3D9RN6yXT1NfBu4dHFnsX2Z+lrTTe/W5msANyErqcBgGqQjDqEbvBYQkPWi91FQvp4kcpanOvC9C4LeWhCYy+IK1cHYnz+c0gznKCpALRPn0jtPQvbFHhIvjV4IcEPyS5889RqvUZV+UkTKKacdYF5IQ9kCH93+RGsfT+xiI+TD6ez3y6TmhD8E0mFDhDJe8AIZn8NvHxli4Z3E8ffoFMHMzkK1Ds4GCyLz3xwfm96H/i4EL2LFB/0hJPitjS1OCD06ox8xeY3s+RNULf+E8RCuid0E69rtGfnj01zBnura441sNrWDmwCW3BWW514xq1Tj+mHOT6iku9VJHDrZfDzHUOm37D8RkKg30s/ewtlUgx9YSDRC7PAwYf5NyvZ/tZGp8Kr+jAvKfGzCV+jrIMm/vBPm3DqX88NT9OGsb5XE4JBh8Ep4VMjcSY/G0ZvKO2pD4JXLL3OMGvdLhAPL6asv28nOhw8INFDcY/5Ti4TskwGIwgfXvYCXHqJs1LevrXPI9x7dPqq0SUVMJeSAhOvxp8UNcmyDA+3e7aPJlJbtT6KAJQ35EPlsQx//H1HjtWFOQCm+odaNIaxaXARO3Pzggnu8FPTC3xuG/g4Igb37/z7vpn4iQ3WP7OdoiLqIvu+vpk28ye3fKqgzaQdQ/TprdUhXIguLJVy+UAG/N5DWaEJUCVS2lSb/qI4zqdvCuiTOWzwj0AL+RZMEB8Qs/X2apAVbIeroe/YOyixjWpQLZxGsK7RZgYJHm2+TAC8yMv2V3b2nyXGBUqg0/fCsjDF3TWiEqCeLU6+Go9vjIw73pExBsF6/K0DtrrF+nH1QZA/nNnXl/QEo+s+lxLXP0XDv7Jnh2HHZUC6p5Ns+Djhx3QmPmTcBkdNT9Y0nQdONowzg3c7Kmxg7ry7Kmp4qtbbnf60u0fA4Xs9hbuymg5wF78iHf/uosZXM/Cj2WBCMji5qigIatZ0J64UaDgk7fUrl2KsN34WP34uwiRqsEHpWvkSJaxktZAaI3lQU/W4H6kfy34zAeVW97z69TO/OOpKVrIbgkJGVOGkvvpk6MK70NDpYma1PL9IGe8Gkd3whV367LGp/RKXEiLcRgQ1BnCrFT7gjTCEBWEFEvSxirX2569dRsthPkTG8jw9lm6GYwqjLTJfqVXRi25ARXnN66n6UcB85xt7Oo9aRLTl75nppot8qg9wlVFF6quwnqe1mA9vp8aqvn9ZW3QvXd+8Vk0rdN/xsEHsjG6U2eTBnWR4BN20Ms/vtumGhlWySftzIVT38+jPnbkZshhg6fvg5vElEKSuNONdYsAB88Ig2E7Ib51Sdbf2Te2mDD/mFsDHoJXz1lDIaaefiG/3kxRHSsPjTsZiW3bWFAiNvWpcf5d4n4KTbSt7ev8bb9WkW87hyGp0brp1cW1cdOYnwvWWbXMWE+95vMC+T8WAeO1tjoq/9yZ76T/aIkt6cpcSzxRFnHwT/asZ21j/vAnHVsmHyxBsbODadc4/3jiPeGU29zYRpg9NTCWtz17anihRAHLSduKL8G9pYol0Pi0gSE8D7pSwyCEQUFwEJfNiHInW5A9a9s8riZzdjbw7C0NU4Db3B1vMKaGyuCDfeyI+uEHUw2o5KawwNU/3tL5vSgHAhirmN7Sfzw1lGicUVbTW9po80B2Er5lqNOXAZi+xZMQzoKANIOTU+JerPqpy32GD8Cq8mJQEpN4ncrRZrf7K1GNxsi1nxgj/MLNkZiXm5GmJeHtM3W9ElzKlTTHcYMZ30/cySpM3aR1+Wp1JLe3hwSozJS2VJ7nbxS2aqIHGWiRzjHpiOgGEcNeF/p9Rp17al5Szk6DAguzSNMxs5cfBupNLWvMSCBwH7Aw2Nvzo5nVQo5zjHVafYSnrO+ymQGprsIpTtXBTEcspFYxAwdtbD3PetbW3awsw5sOZ4jnyUs+ABg4GIyB3EdJMrjf1VdbnL/fD0hKKoZn3V/k3Bji1lCAEXYcmswCZGu6yu0lPoxbSrMSYyblfPt1XU/0wusf1/Q0VYImn7+gLPMJUQs6Oh6VtgmzH/a6ZADQGewsNzngugRxx8aMZByWPHEy1xKP7xdxcEEvel+/tO2c4Y9Ife4tFe5KGDhtIKVmEQ9fNvmeJ2mPmD01JQ3qPXtqKM9sJR+27ThFPB9IeddpGXB42jvOs2vvmuoP4IktBRprdkfmRsQPPx7NejCNTxLAs7fUzKEyd0BFctXgfswTDjJqlgIm7nez7ynK4IMe2hlneMcV73d4KdNTYzuOF/94auQiPBEu0gebTcAR5C5hklGOVYrrlgze3QeAPL6p5uBenElF45f2QDJAa2uX718mgkVBzbylnzw1zG/XKhZ2PdA5dZPUIq1frLNYy6051l4WSwUhdP4xF7z/ojnhkjYJT+LTF4+2EDtShpFDqanezfva1NXvb9aCU7Ve+GBtKiMnOPZGJ5EuERq/1PjqkAMfbqy4qJO/xqA81va8u+4hL03tO27QR3DAMt2NOgm43oPtlDc3yOAJd9jksG51mE9hZ/hEyYk4l/iJsq3PiNKM4qR+L3OfAhtZ462lR0yUbzz4ZJs5FUT+Osn3EL5+scbC2WWuMOPJZgNJTNbcaNdpJeAkQaLpzllbEevlb+89Fg2sQjmnDZ7eM0HZfDaGWKnxybrRbQLBxyExzRctULMJ2qsf0vDmnA/+g4PisIgP51lDs3/pZP7oRWvQZtZg9Kma1QlVDD44M866b9u9stmLe2smitsUzOypeTfsS8+emirrWNe8XhrcLCEHG2nIjvu4S8JWzodzV3dxNM65xjCVM/7SDWZc0ThHmPT57ilUfPKWQo5Q2twB2aErGZqABh/cNeYmlUiYd+ZgXMBXrziENrXEzr6NkTkfanpqHHkb+4+npgz47U3AfZG3jKc0OBArccL2NmvmN3VPAQIvsSqXuJPev/DsJeH7GPp9KYLzVsnNBKP6UAvpWdXAQdHAQVTVg4rFPebUQdazh/VrwtDEwaoBE61SDOhV1ZD/I71Sv5akZMGiZAYElegIt/L7jd2zh7liYV8sayTRVTzEUJph9457qKVpQiHFTu6Vu4NxDsJtcBKyETezTf5qdSq2dx9zjeIdjUIYdWFNXHJb93zFgxO4SitcFOU55/ggrwDsyE4RN2WGtKk+0qw2kD5b5oLYXM1DNHpZpDACudGe5XSmB5hyyAqXLFcY7kgn5fYVO0qvy0e3QRqr+lFAARSLfcjd3mW3bOf5IhomdomAXmYHgfF4LJGTEbSt/BxaIs3azlqtiGaQtnWmlxiPx2OxVqrw2Y8CMPiYf+KDv3FwUgVN3zEx/WZVpgXon3vRhf2gQ68ZjP6aTl4X0UjhzJj527zaKMMcfjjpUjfYFPRR/qFG+prSs6fGD36+dGx5YSybJPrryXXQu2OQj6NNi8U7S6VTcBQ81DgA4wWYMr4vnc7aGa8x9gSfvaURmrf+yd8w+GDbPo63cXfmETviIH86ZvDB37tj+RYEcVNL3Db44D+emnmG5Ly/O181cPAsxaka2LKGryug7WC3niJvkb9wXEUhIB1mh+mr2JZqT0BVNsCU4i6qT/EbAmt8NOGVjR9iDr5jV4/8rExEZLkPM9K0XnU598dMYJSP74NloXRWpwfIzJE8hwwcnMlXL3ShnR0TUqSjilxds5HvooXavVg77NCAcko6BF2wnVheF0r3TD0rGJQ4S+X1No0BDyn53QYadvpppP2Eg4WVO+n2XeJkpidJNZdBpCBg8EE4IQdByhch1J9ROyMzHmRMYOrJQ8Dsa/Ot2QJ0kQ94HGCY/yRetkdtiUc305j9oyznSkD2KxbiC6+DsjZ58g/CURu7e9LnWkq4gNTyTaSrV9w0V6CYJhVyRNLE/d8WpUIbBGFzqlBFiDv9hMyYz3MNlaNl8MGL1vx1Zrq/cbBiHCP786yh6WifDEx/34su7AcHsy37Vjms3Rszf/Hj0w6IrKVOG1V8ic7jpSsSDUMKmfkcc82ePTXrn2wrhYg9Ze/ObmLe7Z2dDdDiuUCByjTtpDcFGAg5tvqcgAo/BHDcBWw9iMGOsu+fvaUwFo3gOBBO40HTW2rwwSR1gzMyZEZ4PeXz+xf2g2FjhKDb/uAVhYmccT7PvaVjgm8YOKjlDYLwLQPoK5o0jPkdEY29aAd5n97T9EAP4F8/piYBUHsRikQFnE4EKqan5ohDYVn17lJajOd4vUVJk+2kSJBfwh2MztWAmvFUfDFYWlU4dwDvOmRJwA0cHMRPNKevaLCJUQQwcZAcqFpiX2oGp2Be7LG3hx9fo+pQwYEzy7R452y07lJgf4esRKjcT2zEg6XbeU/NL33IK8C7LX3qZjFoZ57Pf1Gykl0VpttmcunKlpoLwokfl36qsG6XoTIInL0aKLnxJZk4zVCtd2FZ2BaZwlWO/aQ40qwSoUbC5VzscTdOkJbIT4PUhIj6xy3ipsER9+oW3ej2LqUd149t53Wxugrk72jrAd301ZXD4++noSpi0w/oUbjFjAvF7WCzhIt3F1Z8WgfI/JiwcX+yLJ5xMHWar+JH86yh2oKnprSQwV70R1CfhZmWEqGDKkgdFJ7vvkwtxE9/T+LgJGcMel2Hoy+HkGz252Muj9p2lrgtHkyNrUPI60UBjIKt0rSRcsYqG0gQTxE9SsPj+NIAboiYLeGn/F2KDz55S9HVGPKEgzmz293gg3wBnih41rwzJ+f5/AueGr7Fz+9Fw4xPIEvG+TzXi7IRj8fKGPz0zE1BFEVY+WKNnnVZluuRV7ZIiPPQlNhcPmJdxcsA8mL3QgxKYdrrjIyGTunBlxCiYTasb5sIK0hkC1d1se103F5r+It3L89tfG5Y2LMB8MQ9Gxl8sFpWPZkT8kfrRgK3TD44JK2CLqr86QaiX4tSqraxnxkppO9RCeE1BR7DpobK3AVe/rh0UPf8upajB+4vmJXQlLG0e9g1zg2HgokOGrr3kccMk7BHIDbsxMhGklDsUZQ79nQP7SjMj34QhPHNRKHNc00KTU72MmA9EWD67AaJpRO43RonR6f4gTESc+odBEkPYWzahrLThyvGV+QVIuripiCG3wqYZAJQjsOPNness7vhw76jhUjYfQ8pFQZXrkren/42Nv2626ezCgr83bSwoyrjOdr6k2XxGwdLA9T0HSsGH0z+8dRAS3+yhrKU55txyMyunOiAj6du6NJdCY0Mn7QQAHUNTrhNvXYngpvVVZ6Mhyjv/dVqhYa2ITy74UmO/V7/ampbwgGgGbQyvZXU/tcUFgiGMieUCh9WCLB4T6NhL/G0Ow6T/jW1ifX/btnYCMl5/pXP/8+dOfZvbyliN6vunntLn/SirQtcDV/hJFEw+GDDs3pXCGPCS6JU5SA+AF6DS9ybveBQDQ83Vgaj9AakoxrTE+JKyc3/wNRcW00sDWq06S1VQpfAsvEoqFGOWP+pEsIvWBDVYl6FqjVr50uXDujF2NGd8XYYn5QcMHN/+Y4bQ/1M2OXHcvuFThvEWhHBSc4W/BZz9ivS4+pAbZrZsw87jJlDxY8f5NsPL+nr4Usza0idVDrRKTBFKisdasAybANdB+9GPqbOpM1ud069TuMy8QA1g2AW64ep8DMOYnW/MVqHpL9nGcI0huzZrigBiv0OnDT4YIiRxAgyW8lJuQcw8UPDiPsPNnkY2wGyM2uuZgw6Fz9btQebo58vO8olV5L/JXLPu+PfGqr5nfnU+Bo0Of2CzoofkH5hgIyLxe3Rxya1eC/6vB/81p0UUL54QoxuFvaDf/yDWwRctkI3LSDGmJ6avHFuGPNz9tlTQ0vAIByj1DQL+Avg6obq2FrP2W7iOzuprZ9D0N+Ebc6DMLbDxdw+LQLTahgEGlZP5pGCVzkOf8qhmvfUGM+GMSM5IcwS+YUvZA0t5PP/y1v63EXS5sf073vRC6sULkJkrkvYJM6+zKvoRH+9srqergs2xOcuesnzQDvnwcsyGMgsSS8F40E3jhZKkN2vchyCMLZt7JBFjffr4yqvNXiemY0KQkx6FNdseMAsOe1/qmlg/SPrHBXEX39vvzUzGtXMaW5wdWBMkFUFRAZxmTdwMDhWhsqJMIUeHc4VXVBp04Xdm2csNCw7cNPM5y92ifLDK+JQnwqT0rV1VJvkqPGGMT8rm2tTkJNtOztu1ELZSQddQXwEsuqH8xubSq6WzP4IQ2TBZWYsmDrz78bzYmYsBOj7pYhgjIY8Aglm0JaBAAHa9y5qaokNHIxyx2uDfeNQ5ZT1l/Qwm6Xua5GSSLVGxV+332LpcQW4/c5HxmE/8Lw7/q2h+t9aYgPzygPC1JnvN5vA5A8ffNoP3pt9bVXMNSz8g4Nrsz/+wQ8j2KJPa/CZcdaZnhpHmMFNT/qTp0bGivYw5Le9AHMFyA77B6Vrv3cKfctu+VDKp9Hbjsroam2cSjPFbBCOhl2Yv0FRy48cNklt6t/tf3zHJN2Y97WVQufWjeF/ekshR9TMnqURZZ49yyBhM4N9ob9btRSsFqZu7tKsVr4C+DcqsamlpgpqiNDlberYdRh0qmUxtCnEOcKXSCpq6GT75blYUhT6Oy7jQ6f8oPRluMIGwBeiqyaWc3XluwaKkqXE1nI4cvQKu62IYX7fFunVXJPlUVyCh+pjZp/klQdRipbsCjQy+GBXUOWTjQt3f34vuo/pis13o5SJTq5V7EOFV5CGMP0U+9hX7s4mxMDM3PMZODjbZq7e9nhhzfHURYKtUhct7pIf3/FhwUZIJUblajB3cTSe95aOPnr4npm/kZG4ojt8VVrif/iZCJcbGzjovELsYJwAfxlnXSdJjstJWBqjQJMEEzLiIrtpRfurna2JkfQ3qFho20ixJMRev96tBZPj0vOz8VtD9b+1xNZZtcZ8NuYNvWDwwbMFPjjfD37aUQbmfrCGjn7joMEH/3SRHF4B9zPUUTQwxfTU5Op4RIaA0bOnxuNeHh9kI9D2CBTKN0iWDnuhK7K7CW0pK+mw3UqXGZG9C7ngcMqYsdcuoUMGHZXkq5M7Hl2CnnOoZJZPO41nI0z5TpMcpgKthawh0uSDpmV7sb/bwEEeEldufvPBJxyMtSH73jfUIuAowI/Nu1w2BsjWCpMkc9FNSmpZYWemKIyRv/aOXUhsQG8szR1zrVwI1nNCeubmVzBJBbbijhuRZc6Zgorzv5YGx4XcLHW7caTeSL+qTbFWLKnxatXVeTmlNHgWd4HD3N1Kh8yFdffrMUzdBAbCpxdTQaTLtPRbJ2M2GwZnYhnpKtPem9y9PpLIE/cRXzLz+V8rg4qBg8UWje10Uw3CjXatFgIWRQMH7fB92suARGR/psAkwCVM4YTxbGDJ5jjL+sEl0RVMUdhIgtVWVrZnLqkRR/lQ1xU9vY9uHvQA6rhmzPxtjEK3M6DdvaleZ/xJqoKSzoOBBKRuPy/BvmbvoVY+OerUUDoadBQKz8/G1/+/OMipv7Nnr5+8pXM++K9OrjoQnAyJJ09NHuYCxvz89dlTY0wUh/IllPBmXJtDVMk61zb8Tniysb21pb1wgL46pNrRn+4tLIAQK1GcdssOYqiB4YcUrrix5xwqEgtcnhvPRgVWVk5nxvMC2hf6u8l/soYWempCFGDfeO4iEXbp0RwHeT9J57Ek9csmhVU4KHXp6aTD/7K4qPqE99i6IUoePPw/zt60LY2E+R7uvdlJVFRAIevEJdFEo5lM4oR9E7D3hl6h2ZTVBWSHr/50YyaSmcx/7t/zNtdcCdNdXadOVZ1TK79Hp/IhkQxWcSU2SRj32oIJsiqG+Akh5j6wfAPhrPZn62w9QkrPeUqaICVmnuPzcLmbczXeL+7UbO4V1PboE23T/3XLOfzbTXIoyJY9GUX2VA4vSsLFJDJd65vKjqkyxA7y0+Cd81qeirLp5PXLTpfCdc4+zd1Bwv3d93ttzwwc5FsohNVnXvXABjKgYsxTVjnxHPV9jpgJ8m6FDmdgep5EwWurT1JKqeznmxDHrCSE4XUC2+t2JfguQHzN6cXJm5Aw7YS4WU/g3808Waum0/9PMV4vOCUuaGXf2Sc71xEP11uFNbl5VOrMS9VCc9JtnXLeUuEKYX6ukf7vOFh69J590JYafHDpJpexLzorspHtzYWmJuRkYaef+66pCUN71Kp3FQ6bzj/Adkqk1y992xP2g1bagKFNZpuwF0fb9ntPHhoFYt6gleewggh6ixg+8kpsZqG38s17et3E514QI7rDG33Rn7yGHu93w5z07WL3xWI+uLhb+lQ0dombiHHiZ8EHxcutHNvUcbBuiYKXvFk7NFMEw351R6i2yye3Ohd0p1xRD4OfQsmoEEibwpFo25LMV5UQsvf8xZ1OZoc7uJ4K8Fwyks4BABGK2DrOvkzmAokTNVKr268deo2UPTA0NcrI/dEwJnI2F7vEUyUU3Kds3vs8GCyYJHlOr4/64qD30eiL5kCqu+LIDxRSm1DuWV9pB6b24ttLQq32ojuFGwMHVfTaCq9gJnWAbDLHdpxFzXZVGN3TubCHsvRfpWwjD1exgzx+x8pcQ8dBY0RyHyYr2U1iOFklbmoigwvRi+abANCbJbjLhpsopdPozT3IjT7hB0jbuD+YwSeeW3iatCdzMlPckpDCa7ZQRuvNI6DPpff5BjAZ/a1G+r/jIOqszZCn1x+27x+0pQs++Og9uzQfNDQ1RMsfWBWJ0ndNjV9nQFI2im6/w7tbBcjHJphslu2lPOs2zCOijvPCFoBeZXEipfKxWMS5qzLIVLMlIZMCBxHuQXcczuF50YiNNp92ZS3meH3Ja2jJn9/a+muHChtkLnQc/Jumhq8D4OrGTOJaSc4QOrURPFMsxUBnto+ZL/DKLEEqm1kWCIr2u0xORhDzNzwvRanK+gMOjhQ5oil52W/nOK8gz9muLRxssl/rHekyfLR+BjcEEJytOIJT2TVrKLX7ipTzjp08WaCGgXHEERooBZ0PXsaHzo9fUVKFtdza5sN8UAhMHnaJ87+lbOM+HwKGciv3kiwSfeHtgenVjYGDH7LUFfAbZb/DaL2KTArfbOiCD66lWAH8zgdd2V3kNkE2ykkUZyFgyuJZ7C5LV7QtgagFKBzNw/J9WjDdBSlpsOV7iaUosQf5nW0dB8cWuqLnuk7ebr/mXDIE0GP7ebtk8oltAe993BmccpNiHzo5qf6tRvr/g4MncGDQ4PqT7zhoeCwsec/a/poPVgxNTY/mY5xeP0uQe+RM7Ozx2EgOpBFv0pEqmmyiaHdvuvCP2TS0wYXRtWwDsV0cZJ0eMEhz384crCrjvhMFDT+nLDYPgVHffYnToY4eG4u7pVZQrcDgsqbmh8fCd22psUPFQ6Bdx8GfNDW5d4RdZXgb39oieRouCceWd+d1YBjNYl1QLVqSCVrispsvvUOxuVl37fuVKOJjo2nNuFsquBxYIBGs8uH9lKwHv8IidNVhxzYZVKsqVltbjh1UqYl3KHWUsnx4p+PgXVlw8xNFdO7QN4mZaLFhr22QzgeT72Tl4kC61gN0AowiU9OtJZScSEhuRwTYOWi/u2PHB3+8esn25VHl2Dxd3OS61nGwS/rQrGrTRhxmdunvCJUOghuspMjel0MngxVRnzMHUWfjANerIVQ+CQJWr0tWvt/vZtSgeDWAwNcbc3kwT5Gu/QyVO0yLt5tpMqe6Ca5NJQqgjQ2bUcMbXOLkQOXY/sJjZrRK9/O7qjDACRvOZ4IBxRf4da/gf8fBup7rturAuK8tzQeXvGeNfVHDY+GgsdDURF6+s5gvCNCfldDtM9E5ikfhbUS0wZf0mkIB/ml2a4T0kusbEOqGvZPe5SRjnTIueBZYg+/VMBBgxM3xB5UvbbBYxLfQHT/cqVnERl2v593U6HypV/B4t3TpTo3+Jf+Rh4I/aWoecXCm1rZcf/VFc721V2en2j1CXZ7l8kwHuVFb0lCdXCejG+N1KT9WAl5bODrP2ZN5LSd/43Zf3EZJJbTyJY9cIHljnTIqdoIRpO2U89X8SDvJRe4u7ddGr4B//wZlJ2rdvW9tRSZOwTmOT9IjJRQ9oP7A+nlBLlqlxS2SS2HQ+7T24vU8NzHu1LDX5NvbMRUa3Shz7729aKkR6ujm3Gnx0jcqIEMhHHh9NlYGwCaTcEFM2w5KLRmic5CL5BgiyVURJoziBF7i5XkyTp7ppIa7DZA92MVBE54oBgVu2g1kJ28ugMoszg0aXl7IOVFLHeZHTyP7g5GX7MJ2AEUKxxrJDO7mBW2ritCfMUvSJqSJ+KC0tKvW+XEP6BEHmwwIjk3mobaN/hIHNT3XFc3kVfnCAejFduGYlwbaDxxMT2uQpPNBsKyBE/cnlGXOcPkiiQXdhJs8obmEoMKs6EK8k7B6paDubY7TTqU7z9Z2KOVVUYlupV30TQBIZDcc63Ee9VEBhiuo9t2pAsVQ8EF3HKWTLuEhNpJxBnHw/FKvYMmf//FOzcJzL6j+pKmBluaD8FO/Z5qm9Nzr/oRQ/Haez0dLpUKh23xjxSual0LSb5V5LbHuNOoowP71nSxFB5UnDuiesEatXDga6Aj9DMauJox1yrQedW3m66guXPZO1wdwU5xfa09ZaC59Tfck90KhP7AZHgtX6WmEDc1ljrmilPDAlhxvUQg8ya3xOg7aJuTCg71wSZP936I3NcNrqC+JzB5hy/VZy5+2feOIKJjKk2rM0NRgtOjcOhcI4ziFl1a28hweMXaoQL7uOt95wcBko2CCS6YsdmuLpXPBCFsHV0S7jnPTWwEa34eFg3FogYMzj41tTSH/Zwkn3gHrVLgU49Fx6337tdYQg9rg1XmllPRnAvM6zR9vby/5P/91B2GEPn3EQcR+9YCD4Ot/w8Emne9q6OxKL7a5Jtd1lmBu94fXEDEq6nzwqrAVVItYsnlkFsIiTOLn7GSi2HaLLD6VNlI7pYDJUwOJDyGTe9VuKYsej5sUQWnjyzYQm8Y9KSAOraxxjhmjEibXG/v8hgFDHAlRC39+Hg9F+w+xoTBQfkPHQf6rVVIvjRppCQeX7tT4RXJNr+9/0tT8wEGdD9KGx4K2FeT13xwCQ0y1zuBS9vduJCt8MFnzkvv5Bv6aDMAFwbpXUuMHEh9NV3U+qMmW20SCq/vowJcQL9xttNlgnDAlPh5ydeNv5itCc6/AzutlZb6lKRajVwAN8+61uc4mDI+Fee6tCXvNB8d5LLMnX4b3lOTtRAWN+eDa3Opmx9JV4hUjlmYOTh6IY9OnV67kdKEfbM16EFi/ToF3bjIcoJR9FuREFMPxu2vyW3vC1a2SF/3dwbZ4wO9ETcRZxkn6SheMsBnCLZyar5Hhi9+gIGd5lRWvuinstfWjeHl3zrn0zwrdR2QxiZLtlpu0BhLntjpGBj5xRcT26dLElmqs2eSez2cSkT5Go+0zHOCXdtWEv+4BLeHgREPj2jsiwHf+BQcLZrXX0AnCxwy81QZsY+0cLWiPXkPDgs4Hh+YZf7XlamhoBihZ5yDPceZXNm9RxR3WCL7NhUF6itrcsscLO9Ml08TjhyjET6k8cDlNWfaoz+N+LIJOnzrBCGMG7ospcOymfAFucdsdN6vAYoeqTy38+WdQ6HF2HHy8373kz89bdi50HPxJU7OMgyUmDY70703HwTyBCxkLPx5O8IuTz6JyF+PWDr35Tpbh4HQuOqXCEVp2yPmaEqge5cXoDOTtHkFymQ51ptlRQ77P+bGI5GzppNK5KcciB03TZr+k1Ovv84D/3satzkVMj42BpfDgsZAY2YTELN70DZVQfpdaNeaDmGatZ4bkodQVG+eHLsQ6e9CWymP1a7qrdo2bXLO+/eZjnVC1bspxY2hqAEXF3fDq2EFcSSPhxRs/j0o+tcVCRC6+Rp0FjBvNGcq3n+Kb41VxHgyR776dHBbuQyQQ2uTVyZaxJMaJCpIUPpnwShsiBkGenRgzoPk9V/nm8kzvtVLVuvsRQbof75JgfNa602Pjg+Xt1ZL/8xIOPvJBPTYqOg729Of8Sz64+UNTQ72rmm3TGkqNh3/tyeg4qOc6HQfBSgXY93unEtUCORDFo24IlCoxgGByXnI1zUDXKVvhnN304ivJsHS7vZ2KVEscbGOrUJ7qBSgiHPcG9JjAOJMdG9LIqHtOxWHioWceQS4+v3iIDTRGINKF8F1bangsLN2p+aGpebfoizpXf9LULOPgwok3TVd0HPTO7rlBbOgBcldla7NN5rhp2fAa6jn7QV7ARk9Dc5JZzzWE0PB0/cVIL4VCvVUHdMta51Yy0GE0sVY6YriIJnd0HLwiNYq+rev/8af1DeelAKLa09+DemwE+qobHkltZmizrVRJFS/EHaGZbCe6i1skK9VteqiNckf8KNc56iugdq3jYF0i5cOILTjPuU+v6Vb7OckzPeHtqXPPavawYDZFqbBM20d1WRhsnk9fjJDu+IaG17JcM2eDLO0koW5nd1/Uk1zX6oCFOQaKJTw5vQsy4dmWaK8FaXG0iYzbqPynsUsMS96XtREvTO63du9zesHZKQWDo8rtJbg/3VVpnB771kosIu8Vlvyfl3BwiQ+mqZKOgzW9RvolH0TlvzQ1JzoOXmuoeXoEE483uSaQ0RfVDoiAWGTIorZlE1kkCcO2txUKHV0G+IkQc8DrAfN2leO2/wD9YSu4t+H1ueGwzQa1UEewEqZWCcXhjaveAzYPpv+k7LN7louMdq3MYnbMwaGNzkNsGHbfWcNjgYfWHsYNS7vEj5qazEUWt+k4+JOmZhkHH+93s2SxuTVgQmJ5xGnUGs9Mcx5sLPnJb4lL+RJw2sZnXICZ5Kx7NTGvA6fgHal5cCRZE6SOg7lqjJkUc3cfOkyDZqz2j+tMYFTMfzgoCLGDGjVvV3Q2UZTJzKGOgyMhRM+UafodwQcmOfIce12MjgTZ8Va53P6olGZlSbgYxqemubXc7+qP/Y0osjdOjh0IGPLlwWOBNm4096DmrJ+a9HUcBLPKF++IB+cdXMaMPZkR17h55UHXLYxYSWz+hoboM9LEhe8ybL6WBQvWTflS54OfH4dcwMnuTLrsAPzxUz3XZbtKs3pPoaLUPE7/MZ5pzJzJq/Nr+b2S5HvQ09T+FBwUwCX/5yUcXOKD1NXDnZrr4q/54FUdICcz0lLW+eDNJchpx5muaekmV7Gl42ARH160mPSXsTlC132HAImvvCBtnqpCmN58dXixqGX7A2JyO6F12uMZY2PIm7IymMIh5um7c9t4fcXRj4eRvY2XwwyVx6aHGDB3A1gGe/Altm/kFztUs/jCn//vvsR/eQ0ZVpbfvYb0+j6m46Dw3YM993ccXLrf/WlsNoulHBPqU8WdjHg1SYGvJ0PlanYvZF/w+l8ZT8IzSYgPYiLdN8t3JQMHFTGyAvEJ+FL5tul6liA19fLtpzwS/pa3aUMleqPFwL2GqT8vKsPcO+PKia2QmS5mx2hwIknh99aWZ2gTmGFcwA3v2T3Khl3mwWjRJEVnxCExy8v0uzXk9W2+GRuu/C4P1Le5W8NjQWnP+lAh0VbV25tzCvNThdcDddC7hj467Iv73S8JP58jELnVx8n2kOXfaXTW8N/oHcIcfsdI1zJAcl8eVsdHu6ThPUsWSz6iFXKcT7ZBtGfU/GvklZYrvp+Yp9XE+1XklKgT2Dno5sM1NnhT9I8viku7ao84+Dg7LqfQBQ62Frcb/tkXvTTNDY+FbcOHqphwvi4CoZPKd+9ZY1/0dBvUcXDtpIyNxPcmia4DIL47T/spnN+3gAxjgaVwHvLMMmtl2JaArF5PKvliy+sFMuscZGU+IL29SQziEmY+KOYJn5jbJIoyrF3D1g2P9DA7DrHWFf4hNnb/zEO2v/sS/3W39FFTo/NBQsfB9e8e7K2/4+DS/W7UJA1r8M7Wt2fXCZAffbaUavgabZ9dyk26EmL5zIpXFoVg1Rqej+n1Wx0H6aOnZ6O+oS01jugxpmiiEwSYgtgvHTOfZy0RmA/tw1qBWtdxcHBzuDacXS76or9DM50PdiV3ZKbm/GUnv1IjEViLfbkuKwV/j0SRuW3lGUoOcwPxyDbL5Z8M6QkzVuehqkwG38Zt45tc+ahPN4GMYpvdsF+/Vfc46JrBvj6jBzfP5Zv8JtGKgQnhqfO73ormm6MAOrPraCUhu9Z0lAMuE2hzHACnDTQ5rRnes4ykpwIGC6zhQA6U/kw6GClG+TxYoXpt6e1ZtOuxs9ahN+FQeOjRefenoclcXOrJLOPgUs+cms8QqfBxC+R+2RdNWr+9R9iqzgdbI5RDa1sE3HQveQ3x/UsdB092Jr9TNYSvvyXsKsuRDto9mkqQ1jQ53oZTOOFn81sFfOX0AvRFLNzbL2PQX4nixAcKdqxOsxCGxYAtVU8FaMC+sGbt0zhASlY28ZcP1RUQ8uqxYWWsQXHhx4hJKcgvGf4bP+aDNPDUquMgTACxX3nuLePg4/1uhN9eoe10eRUm5PAkitAVMCvtjx18s1a2Dset5Ls6qYSHDvvbd1SAoWTLHinFkBEh1HBenKY1a8IyZEZSPbiDTmXb6yYT5CvmN2+9TL1azWf3anInO6Tn7Zo6p/TYsBzHtHlJCvEldTY6pfnEMH/4h/9N0TsW5JUTNdjblzipLjfFaURcuzP0gzoOvnrwGqp7hPHax70XZjM10nEQIK4hYew7F4HtBQ7aNw2vIQ/e8PcVlrWx0mTF7/k9SWE355vO+xD/osQwI9sF1ZlnsOvdbelyHr1w9lCS960okNUKrL7uKjCC8QkGaRR0KlBYm9SknDT4cMVPGfYmVNgtP9aiq66pVChC3PaXX+DgX3fxmhzQ1fTnvD+BmobHwnN6xBdY202Zt9F6rmt+MG0U6yBZMHaJq2a1+Oi599MMqKXhjvBCi2dlPDl3qiFA97akwwNGZO/2BPSryPY2551ju751mod8hOyzr3a9rr4/iGsbIWhMm2wZWsH3dvcG9349NhJGrwDHZT02yACz0NTkU9SDH2Mox2Q4vUZ6nA8uZsfkOe+3hb9rS5e8Z3/GweX73Rpi/OZzdo1DibuL364CXPtrVhoqVjjpA2jyVpAzR2pwuqcmZ6NcFND54FrHEsrfkfKmqZGLBL6yiWpdcR1tvbntF9XB20+58fAon9QG+flQ54NIwxxaLSkIZuDgvf1uruXx03dvhuOiMkJOTeBtzQmujOKTwEgq+/eoPekmJ5Bl00iekpThFlV85kL8xk2u/jZbGqlfq2OqO7YRufr1Yl/00uZ/uFuqrivDFAqsfu4pSB/jj78gVO5NQGw1MlzuRuBMgacX1hHOhl0ogXf88nVNT+aRjztcAGLroSx1FSMIHvGQGAVdYC/lL1vSoJIS1kdVJHDCzDwysfpl8Q0+1KJtxlYsbZGtNrb2Cxxc8MG177Nj/TmDxabhsbDg3dLxzNDPbLkaOg6e1k3RepX1aVsmplJZ8hpangGVwDx+9aDFgxgMePd8uCoIKG93wb6Z33ZFu30edAvKguO0aDX5/GHW4uUCijqJo7zfOf5MqcAmsc6QFZkcTWlfEKIWvQLB0B0rF5QRG5ChLV3sUAlQMHip10hL80GjRkKN2XH94V6brWCZ5xpLt0h+4ODy/W5gDS5jAce3sHCv5N59eqZXuRIxOqHJYSwlXfuSwqySl+YIZas2pGgw4QxHa7Q5N+elyydvng/lq1w4/MI+G1XMc6YZjFY1aXP8nllNt6V5aWgJz0sUPavLg+LpxsB5JXa6hSdf7koScd9Q+vc6H8xVnDayQCLp2Y89mUtx/OA1VO2za7/d5Oen13pZey3Pu5cSSb42+qJchb+lgfoz8ka7Zr/+4TT6okw9lKKGMZrggy49NtBk85OhqQE4uLZOTG4DqNUeI8Hji11kFuOAchKd9IPglIQTGKLnOpSS7UGQxao8pOS4wrPMZeGe9X96vR+sTjdFOzqpYfv8Yy0qfemZzfTlFtr4BQ4u+GBJx8GiXiPpz7mgx4bhsWBtoIHikeHHCD997dVxsAhbP31ETLOPaH86/Nd9UQ5/Pd9ZaPH8lH8oGYZK3pEYARLebSA9tHorsbVs1IZfPnGAPi1CcNt7FlN4HE2n8BCQjXOwRufgUE8l+m9SVuOGEWr0Cp6U9Ni45COf9NgQKcC5sbhbutihouTu0nywgdrpbwt/fml5l/hXOPh4vxvgnHsTSLhEreDx2gzu4TiZ72IdiAoHZPWPwJU8x4JPUCyaxGd0kKZN9q9+SmWuWddTjBZdUiHfjxBivDp2JLALts6UY0yhlL/D20yjWNP/zE+js2L++V5NaP5WYOdaVWl2Jwox/hDTxjXBrfNBwLmv88FZ7isH/HYTHQqYZU9W1HcyZ3gNObei09Optaxzv+E8xUznU9De7wqNoz9ev8z3KNlKYOKoBwm39ylhdkuE7ZJMyA4Wq/tRuY3JrGxlpcKWD7WEGFGMbO7OzllrP833xgiFjDMY99kjK0H8/LufjDq0Atje4E3nPl8rHryC5z2M7+YDw1gUyWJPJx8fa9Gr9yZQvYSl1+7vs4l/8sFks4Kai0f6c+7osWF4LOj1RqGCTLUdMnD1Fx/U8LXBqQmv6NyvMNT5YMGsXjWX9YMLTY0kLrR4KA1J5OqXsGOuBrwpIGRTT82gL4emvKPSPTDc3N72wh7CiQHhYsY+3MzDe9kVb18Q0RysguMWaL/38eDT7MFih8q47c4GMD02+ngwwn6/W0rikbBeIy3NB3d0HLTofJCAlneJf4WDS3Mr+Ap7OmyhWWiMOfV0Yd2Qi7U+lNiNw6QlMyOR6aXl/OMfKTKnht6f5oPxI5Xr6PEEg8k8kfwc0GqMIj8pKJHbP5lbopYnjjzPtaimht5+1HHwVOFwTQW3B3Exe+WUOxUFrRp90Ya9dKflQ78dvXE5Zuoo/t4kRkY2MD2MCMaeTP4FYZtN+JZ5Da/ffe8V9N540d+d3BS92/r9bqi+1ZlcqNonZ9U+xO/ofHB2F3WU+5SFB2UoBoOvvTMJ1suCYxSl0JcZeZoEiJm6SZ4xfNJaR5mwGSQmHVotBBHeau7tFVAPi3nekFfdjWano1VRZT5R1k0HkfSMRANEiofvjG/wey1aRnjmuZ4U9Rrp+2ziH3yw2AIm2mnGeM5krXaeG2g42OogpWIRc0wLP/ggOq4hmdOWKTorsO6FpqYI+XeX90XH6FPl84MWj2IB8spiWxVlBLB+Hm8MLizaNuv3oVlPmGx7wqgT81ptAiQk7dzVBkJmz4k0peBu/MlgtynqNds2FcCoRa/AJuqxIeALf34ylKYtizaLAMcC3/QaaWk+GBb1eCYN+/qfdol/gYNLc6s+smN9b3jggMlsLQytHMksqxDvvk129HKAk5J7auPCFL/FpcisKMrRI9rWX2XFgBeVZxnRmkxeqqG1V8+xu1J+WDy0gLOSjgWdYFTng7XaB3q1eic0vVPrKDOmvuY68mXxw/qZVcfBQfUJo9fshtdQCB5Js8CdvWgpEwhzH92ZXNOFV+uKCluA7Fnve6/AzrcJWMaii9kxRY7fRIuGiz5wQ7dmr5TivY6De+b9a9RuHFshhmWWNMoeQ1jd/GQIQwDyckzwQtsK8RLEjcDkDqJzRPw6s7hFglmNu0sTpRJ4qjm3mqVrpnxUHXrrz0qAQPOM5bOpDfw1OzZq0WSrhTvOmzoOfp9N/IMPVuCTk4JeI+nPuafHhrFDtTQfDFwd6XywDIP+rYlUKECT/eOlm1zVn3CQ4IqMvNDiuWe1awHgmDV+rEYoYj3j8hTRrWlI2nC5rMUwvpYthcCVU9VijoxWUtX5OeYLypkDSoKftChAu6FQh4fkpIWmxqiR2hiwpceGRPPmLw93S0OrLEw5m0vzwc9+SWEe/PmXd4l/hYOPPAXkvX0+k6rC3MbGvHfZj4wGZuBuHsOm/XR22s+S7tJHlp3xwVk++JQq5ThiJKsDY/J4Isp6Uerazxt3atrK5n1RmI408+3bOT1iasEvhaJqM8gjUnS8GkN0Xasoz4+K8mSvSAHVYn5SHqpfV9/Gb7Ca2OVHtGD9rqkxD3YLDMaDfso4kUnwUS8hGr2CtQnaI2AC3sxxQgQEuPktix38uT8H/TRgZXDc5IZbGSAxJSGqUmUXQy5sxKANDZX/bASpHr7in/cu6NYU9jurEH2WtxA9/J7OBwHgenVNvRrdRn4XQbb9qtgsx8anv2+NLu/zWMp5QkCDVdoSjGuPtSjXApOfKyih/vl9NuH5Bw6SmrZt323oz7n6fYeq9WM+uNMtoZbqAUHQRb/tpqjX/Bqe9S55DS3vi651QJv8oMUDPSSItURgEI/Qq4QIcBVgLZuHvSq5fg/O3Cnvp/EqpwJW+7u0eZgKOvTaCx7KYfCJ4Nzsl40ancMDlgdNDajHhhQz/Pm/GNrShx2qAOcPWBf+/H/NB/X8fPXdY2F5l/hXOPjIU343tYBglE+5ynquq1xmvLKtg21KyPXrLRHuRy4+X9kl267M47T6cLd0xEjP14zXzfHzHJ+Dwa5KNP4IaKWR1Ad0Plj/RNhyFcW1t/nsdl7NyY7jXKPyUbVV+/l5RQvOTlvOWqOkoLOPOXB+abNnijoffPsKsSO0DKeRSSONtcah7PQuy/SMeUrSymCMDwUInDicO5g6nPK+/LrKiZh7ezeCUlZghQ4DPiK/6QcKVr80qAH660b0ZB4Qr7pR7ASeSEoHJr+6I4bHgizqua7t2CK4BJe4lny87ylGTkhCLd73GXIN3WGrfDW/8b7Q7UiDKRlVhqMeP6QuqdLl7Pvs2KhFG7D1bHfaK1zi/MNs4seM/gcOXg6IablmNp4zV32f6QINwFaqpg4LNR0HG4ueOa3X/IDhx9iqbufG5X/ZFy2ZgucdPGT4mVtRt1zIo5hVgsiLFcfGMGE98Q5rG7BvK+F/4Y2jsm9ddNs8TNZFPc8yiVAIjqpP0THF0veXOWz63Dv73cks98x/8ucnQzofxEmdSi/NB/W6DjXqOrqwNB9MWyKijoOsnp+XcNAsNmD/5yZMrS73RYEtsR9Uyma8pXWOOzP2nOHtk0NuZhdwiyWCq2bhDs+K8FAMR7Kqrabj4EiC5RkmWJOdUs5YPF5vVBRsuGNteSrmTrsQi94Xxdr4E73brovR+diOyU326+xSvhx+XB+8LogT5XLjd/+AtNzOpe7YRuXnGHDtdD/4UN2E+ZtnJh3o42B20pUHxm33Y5SZuexKa81GoHEvyQWfnxck/ZNlLCSeoYxHzp99+frYMy+vcsWaj5g28SzusmMV/XXAUYZr5hxAcfWOxfaRnZfjW2rU+wNvJW7hKRvolWqF8uUNe/ds84qHQwV6GtJMO3w7wf1th+rpEh/8MaP/Bw7+SlNzupW+LAL5dzWUEP80ScUCBL7zTkGuliSZT6ipur+0J2P49ujcKgyAAVil7q9FfHr2ZAxzIYjbhvPeCpqtXNigsB2tirC0cSzavRXOn49Owo6M5Rx3B9bOd37jUKKWu1i75lAJkrDkcs/8YsmH6rvPNhOnfpoPUnnj1J1eQoSWPdgNbalLz89LOCj2EZvhsWDVlvqiDf0brCRmazsHz2bTUu/yHSCwIib2sdQk3cmlS09SOxFGjYwjDsxPce9Gqho614vAEz0VxOob+3dVwaV18rVRUY5rRfPtxwGN3hZ1HKypd68v6Uav5HgDufU/mxizY7F50GSi6araATXlLfsqWqza2N4XiBAaT3JsMES/cJ29YxMBCoBXWDi2wfN3+huEg1nh2I75NEivkSiuGQBgCwHzo21qf272E4CSwZsAhIk/euasQDRMjMj40cbILrGsla2XGbehH2zpuY6y+yguCtA9uE/CWtPGbahtceCfkyNvufm2JSJqYsvtdplnLRI4zf5th0pY4oM/ZvT/xMFf9gqEGmTdPdBzXQ2J1w/14NcYUixsB2/K+Frh1LS8L7oiFnRu9e3i858y7OsLF6mCDD9RkzCGhR3kFJE2zJ4NDvKXyLnfq245VvkcKFnBj8DcE0c/bkTxsFWw+XoKuD1O6XGA+dKwXvM/StUWt/wefIn130ycGbGBk8vzQeN+d8iYDxI/ebATYofRecoSDhZAm9KneaFpUh/7omCwVk0ig6uIZXzeDHTUgrgmHs1PVGmA38efckRcfH2RIsKq5dyyx49vRfkDT0jwFre4WxpTejki/zGolQri5sFVfpY7puyzap44cL8pekd5jHivXAInqt1XkkBxHBHX7k1yv6he1V8JLazrvL41caN95GB+G+n0YJ3i9aVvGhu7yJGGR5mz+KqfoW4N0RAaEkx9nfCmVn0vd5xc60pP5m2M4ACQDkcxCgnCAGfdXuDgbhEhbl4FpGFZLwK9E0XJYJzrWC9O9rrKdM1H5zAX9S7AJKxQl3cjA2Ga9LdNk8TE8b4LN6XJlbxuC1DSR0QujnBbRPvbDlV7iQ/+mNH/Ewd/qS2tpNCyhj2tdJB8q4CF9eBPfxqbZsOKjoMVJLOMg3wZDllbhkeZJQhRIF2LgYBg88qxIA7tJu1llVrZgNzbfrejlIXtm9su1u5jtuzqjQgR6ag3uJFgNUUC5lMTPr5W2YyT/Yf/RvB8cQbxu6ZGp83w0nzQuD9o1HVs47v37HcPdkNbiur5+ZEPmlnmko98WTebW4990VGlcxHdvMBldkO1z/t0w14vqeTHtoU957+egm+ScjxIZ1x6arcLt7dRIXJDhttbDy5GdQZWQLloseVryuXpzrOvZFXBpgd2UKo4misjPYsOZfdiA6eX14PXWs/MiMPclKtbs94XzklucoP7fwNDvF5AMPU51yyMc99YpyLA/fAFdRNgZ9C5AHUj+N6JYa4boL/ao/TsDSpNZZTLTbfIswSfLDAI3Xt5TkxkSr7+YTuWIaQTkrgqMGQxatzyw5LNb9aHfdHNFCtAA+DGMcyNTSev1kdos9L9+kHtj05v7NCwNWtGPN5907tpGwwKXYLnfr1L/P/GwV9rS0Od4cKHSqKKwNpil/jIDEBVWHq9fSoNWkv7ooZvj86trHky7+TAecWKjZsMcc+FUT6F9kpN2FeKhLIhM/ox7LBBlTC8NaV4wFW5wH2wwm/Gok6Y5hC+6kz+blJhG8In0Cy15M//150aHQf1wlX+cbf0QP+zKz02jPuDRl3XwgfRZQ92Q1tq8JQlPvjyM8YGcFymx0t9UQY3Tw/hQKjoBzJRsf5yy2MhBtXe9SYwGTvszXQnzIxiMW/elNipEwscHEIEv26V1EEcW8VPivKcq288LdWEQ6KjbM6KQlziHcWERg0DE8NrSOGYLonGZ7bkGCIR4ppJMHqS28YFbI5yNxcK++Le0u/oIRogAmyeXc+xyRj5wvzy3RwMkUBqbfEGGRvL4Ys3mAXCdR0HS5v8pG1GZ2mAGx1aDpBbkGgUztGJYUnXQB+MAqqMZE+amVbVj4wDfuUg6eBHcMqD4GMeQ/sb+/kZaek7mzFkqEn5u080N+3ADC2+RYx5SlOPjSpr3vb+epf4P3Dwl5qai0+wfVDngEJVD/6HXWJ+dELa+YLfbqlt2Zb2RXXmqnOrtnXlXIbc9/ZkdZNBA/lQJoXHHXDFbINUyE0awX+IbXAXOIbncfvFXhCYbceooy9njqgo4cRnFd3epexjiMBCiF7zc0avoAMlnVd/3alZeCxIShOybus4mMZwIJ7GSSM29Bopb5x85YGfPNh3qCvEQrxd4oNtbE34ZsHDOg4+9kXPYzks3T3QQFu/bmHTWPOlTSk1+rWCUEvDNztX1Oj2KrRXFiJOnOQD05zFZtnjAj5O+vCkLTVNDNMJNHMTapRzdU6Ct/OiVDtt5I17bTeBoWgxgb/ZoKHQWN9f3LS1RyoUOL2NTL85wQAR5GvsUzKfo78xWlivck2H3oTSUcobX0pJ+Sw3j17kgkIrQLiE/YaFxVAW6tqDomkcoMDCls+FhejbcN5P5RCKq4VJXxSl5nMEvP5g4GAq6xxmiZuvdmlYgIGTj3Zi2MH5ly47D724ISeRrhyLJWQr4e7P7m+02NP+WCm9KN5UY+dPvYeztFKE9eeMzG/f/3J2/J84+Ett6VF6d6sBBEvl1Iq3oONgC83fVLBhsciC+xNTZHlfVH8akTcP9bMzS6P0iWIjLgSYDubh1LV77ZIDvRC16c3Kr9ezkMWdWh32Nqi0lfm2ATPpDTgdl+ERIW6OT0hem3BYxIMCo+zSft1PONhZ3LTNN3UcFHVIMLyG9HjWYcKYD+p13ZIHu6EtpfX8HH/0WEDlJgoARQsrPfZFT7k2FNpoWcmLCjqixMjX0Wp/FiGqwTcUi5OUYMvN84Rt7+sdKUrhjxbDa0i0wVExGu4E20cd52aynqtHPqsg27Yk5aqOg4dvXhp3auIfTFNpahMCsyio3ald8i1hi1zzYsKLS+NrmUly9Oh6dWtmyZC5eNxNg2HGlEl2/CWleT0WvnV2o0V5nO/a1AjL+LLSkEPwJ5NvQh+Jkcf7QbpIhASxE22ixU3qLE1lCyOEqRzDxKTB6TgIk9ynk0NOw7j6KrPwVeOYMoFlnefN7BApz4vUVfWTCtyn8PlsXKi954DXQKramFrIUdzYM29uDzxFbO361PLL2fF/4uCvtaWhs6I5WCwiFKtlpetP2+CgkjI890Y3R6b7aWlpX9Sonw1ulcaDIOkev6M4Ta/V5+FVhPQGlfUm5NZWI9ofAFyOoqFsOQ5nKyruCk+DAIavOxJqEiOEMMMVFPvqVIWsKJDdPRWX9uuWcDB9bo1gxv3uNt7fEhd3ao7fGHtfFdiJN+HBxrIHu6Etben5uf7osWDdmIKXJcjqgpf6oowvsNGg8xyJzNQjgKjJ6GzWuCyDHza99zG+O/1gnd13rJHbvAzPpHi15uRX2ooa9abt4XGBout5KaR+fYLvdqSoQq9/ISvSV2Jq7Jmr7cjUVlypEcjoNrXTvZYK+A0xjKXwPwanilIL0a43eo3NXAhiDSVzQ6Vtsm+kLZJA1u2hNpZZKZkRum46/HTImoNkD17h7gUX046qvNjNpkvmFOi7TTDQeINvRmwoEwgT9U+ZXaQOkGMdB5ulC2w6R5NY3pgdZ9W96iwn3EI4APrVP02ALHeljbWhpX477e+S6cFgi0pXAlIhu3XFsfdvemb6YrrlytdQOdn+9S7xf+DgLzU1eJte0zHP3DtN8t6G4T2bsHCvp4fWAsIzh15iaV80z50ZPq5QMJSgNq8le6bFIPGc67w6z5roEhTKKpgbhtbH20Ofm+ThrGL2gbFhwnWwFYDvnyQcEUkmONcbm3fIYCdZEgpxhqaGw516bIDGnnmMhEvWBkaEv5mkYg2WVvXfLLQgTv/NrB7PPzQ1G0v3ux93iZfyc1Png01jTwYrxb6ZBf0btClp0tJsWiG+AHDaCb67eROIDrdfOtti0VRLdMY2mZpL104NO08EI3n5iSJGbp+TPD4VrG+eLXao1OwTUpmYyhSAtfKx8kwhgzuRYrQs1X4bSCKxQxaZLmN9M9uz5WyctJqnlXKKYBCVxwp4VnhyC1TaAC9v0txklMGtTJAGCMuBgYPdwZMvWDKI3WYiabzEdkZtU/E1q9RxVITLubD8ZyNNqPD21mwHZDQstUnNwsyRLbgQhqBbaZDDt0W4BCedqWuJOxmrg5s76JXhq0YMxRd7hut4Rswlueadlp/Zrjz922A+krVq2bjlxCr9S6/gP3GwfvCgt1rig/hfOFhumqCrurFLnO4+6ujTGNRA1yq1dMS3vC+60NRYohGSM2v7NraS02twEadXgw5P5cJWJd3+lDUBhZh7v0hZ/V6eAjbocwv8+ctYTsXRuPkpNCPMwH0lAo5uSZ9OaBfjhpmox4Zg7NcR4GT1jY6DLM4ThwQh6rHRYvykUSMp35Y0NezS/e6lXeLH/MxL6Mjwk/Ef1ljDT8Yc1fmg2eUxm+kGHPqsoU4nY4rNoGgbE5vmOtidRbRa3ZWiWuk/+dvIpYzsvTi7K8lSeAcTxwCWS0qjfOeiHWjzeZOsp7vA6Cg3hfq262Axh/Ef9wbzO7ne+wNvygiIWW9SrQxEVSKc+DGfJnMgC4OBjGoFTJQacvnnvQR5Gw66TwMBnkcu+FFU4K/zIYylQhok58aESDfZ9Xaneq1+u/B+E2RbnF43RwjkW1jIsRE+11PbJmLlomMO0ZU3cV4osXKhBPBnb0b7xXGXlTLPCEghCD6zRovb87j4VM9aDFvopVzjTHr+9a5wGw36X812siQ23f6XXsF/4mAJHy70Vkt88KBhimplxry/ppOGGhT6UACos8e+6I7zaDtdLgD515Of9kUXmhozjM9BGLyfxoFRW/COrSkmsZGw+4fUZjkEJC8AqBShItpWFvWVmGQ+NAxSPkvM64vHwYRitWNDCgl0U5QFJi3QYkX/wZ9/nC8nD0M0AooCtiZq+LDX4tPoYOG5h8osBmz90NT8dOrusWe+lJ95nQ+KBCBtbOq1aEv/BnU+GDlDgNYYIdudLT/epJNCFZ9WP5E59OqoaZ8Wa649lzXhVzBg0w56JBcsKaHISMjXIGNVQJKj+YQ9XGP5t1JbGlRON4YnXWGCaisOzUecwQOqYrPR83kW5FY9MgzgSaqC8DMLJUihAPbH5GUeLgXJr0y+cWPPFfF5hEegUPuFtpLtoHFyZA5xd7a1EltT68yh28tEmhVlFW1VJ3aeyceaubLQzx8Tn0d1vtNnV+vYLf21LQWIHmE9XLuFiPFlEpkEIQCz+RJY1ElUvusHW+Aahpd6stXGVfPR9T+ch/Y6uAmfu8o1XBILyJoeG//vnvm/42DyZKG3WuKDo6T1+ETHlG94pjLUn3NxizhpLvVFG1ymWYO5DwfTnWUd/UJTw6NrWcCauCIQXznIxJSIM2PJmhmNjWi/Of00sn1CDjxu+MLhO1cxZ7CYlvvpvHMeDnrXZBFc+ZOyeWYseazt6nXTwo8RduqxQcabyEC+wCTus6/fZcC1z2WMONdxME4/zAdD/KOmZhkHH3eJl/JzXeeDL2i7UYued7Zs+je4JiAW/LwN2AxPVIEM74ebQAz9aFuDLmrX4s3ex9F9le3ftXrSSIAinOXufZDHbgX5i8KLt7s03wBoi/2tj637KMUKVEXoyYSYSGNlBm0SZ+yLlNUMsL3DKN9kVYlrQIv6eQ5Gr1TYyd7DT5hZlOnkstH+nU54x2aJkbccDRSlcSYdvFQ/6f+DdYkBuXXg7q70HmGpHgKQ7UDVob2KqrW73PmXsqYU35vyNdi6tmUdqle3w/xzOhJl+EyQDJM4lY/CgJXClEEePf+95zVukShXKb1wPZuL/aha39ifjNSvWGGSE8LjYBfdnxxvGyugyf/omf8rDp7tPOitHvngNjms4GuGB/t5HbBd9ghLs2CGfuqLllNos/Y3P5mFpsbvivJ4JqnYGC1PbB6+dLDhOMrsZk1VGFzx+HyeNN32rlpFbEMBzRCcslHTJw7ZsHF1GrKCPDbdNwGzWxjLQMkHP8ZVPTY4PTZ6X0B7qMTIWR6wOvcmvRSl4+ALwk4XGFJs+Zfng484uLRL/Jif8SStIUOR4+8/pS0MrX+DrF4Sm4pmVjM8Udets8oVeAJTELsXY1oyWSxdTIoO86tJK8fToYN5LpIAuPwtI68drD23e9Xw8CuSxytflWQukZsPS/Hp2o011BlIVzLD67ANFkGABr8hh/N7nG4oIJDXg1/ryL08onYaoDXv6LPU7W0IULRczkoSREUxv36+o13l4urz0+pCEtisZ6K8wOaO9F9frOmh8JvRDPkotwVr8egCflbUAai8ccg1xGOukGvITbEY4l7YVy+4meFDhZNCUMfYJM6fIbbdgo7K9RM3B8MEN6v1i0UHXszau0CNBEJ0WOcpSpMDBL0W/a+e+b/iYG2hqTH8+X/kOuM5NwpIZq9hYnUcjOx7TObpUl+0V3qYDxZOfvKTWWhqnItHh0+PreCsbYLvRRUi3Bcu7wdrYpo1e2IuSgvBQPIqi7g1+KL3x3Uc2gRNvD8cpwla3CSKEpy7hqyCDhPkwo+R02NDW8RGd67zQfYycZht4E9VESvFW7jjQvsez0vzwSUcfNwlXsrPis4HrSRmp4+tabWuf4MuPde1Fp57bFvHQXqABdM1//j5FV3oS5SeN66wKgC1E6L+haVeu1YrufD5pnPmUU2dNBGa3RP5WhBidMIrCVjVWi/dkt/qE07uvdp8+dXBimLqOWFPsmdzK9GTUQYdC9/Y191WBZiNdGhtWj8qBXjAfXvy/LkGZcKNdbt6dQ22ire1XOfGMBi5tXQ79zoOuiNszoYW2km2wR/vr81AotI9+1CUFaDZnnc1hKqMNYn46K/nm/2O+epOOv/aTsRI6RDffcGg9BgPI5MGBIhJICmOg+wo4pJeBYXSBR3cudauS+s5RyK4/f6iu1cAbWQ9eRij/sfZ8T9xEGwu9FZLfFDHFK93Ag4qydj+yeI4hVxZ3iWuIrPiMUwMmgt//h9+MgtNDc/bwoTPd6PAWMFsX48nML1ez7NlBEjSTh+Dpo6nwKqfTqIErkDO1WHQrnmC4ECM0hl7yO5tie7UnAb6SckaBRd+jBazHht+PTacFG0Zx0tIKJ/FQOUPPwjrOOiso3b9N4Pi5dJ8cAkHH3eJf97fwF/Ne9krZBrQX7f+Ddp45mGfnzoz471GyiaMN/kCZV6h27HwcNeDehI5MDZd+f3eQ5KRO1XWWuI0wFvtniw3ClABJsTm73YbtBK/g1e8JfVq1GdfEgDb3kcFfC3aKRYD7BFIJTmdINRdQrtUAjvmu2mVibg87G2uXobRptRc6zClUOcuq4zQb8Uv/ntek1i0kbMrf5pA5hL45jzwBnItpfD8MzZXz4zrSPm7UjFIHLWdQbF6F+iewGixbWHpyzKuJ5khUb/tqe7f7HH23djK9Tow3RmnsevXXlmn8Renar49t7SaAonvfJ5saldM9Nz/ugoM4LHZFm+hofkY+19nx//AwWbzQW+1lOvsfJEhr6rbpHG0t/zBJEzbILncF519xP8cXwHBn3zV9LrufOFRZo14eDdSUkEJ4RxMJEZR6ClYoHE3Q/l9afB+Peyz+9x5tz0leFxKN4wnvEEoeL7u7PMKvvfu1aDfpYFYGn3woVr48+uxwal8yXqp13WfgVGsyMghVsdB37zHGbfd3dTocT64hINLu8SP+TmJUtXFvmipyCD0uaGb6FsilepWTm4b3uBm032dcYwO7WZ1Ap+upaWOGS/gJUydDArS17xeHEVrUv+0kY84If420FAP1zaeJ8aV3DjzghgWsvQN3KbAazCLERw0IvKtWmOFx6oZqKhFLoHjVdfze6VTwT2nKBL/WgKEi9uOcQvbkneMqfodOj6FtFqbIZNXyvWHfet6sVZSL9+eVkX+rJ9qBm35ItrIf2tz/U41qI3eQJw2f9VqA9eXRzsTpFktNRobOR2AvjWLd5t05yauo5Xdk+xEQkwYTXGl5IZoAcKXR98OvLMrcFI726mC8BMlSYhpkuno9XPDvUblsEjvGArA/+Ps+B842NZrpOq5a7DUF53+1SvQn7OOg/JBy8wyS33RD9XzKDcOBys/+4sm4YZePyOWe4zB9k7eDPuXOXTqWoUZ97Z9vejzVQIOKCRbj0Sn2VMQmc0yZVUurmOom3OMa6kgzOVcDFmRyMCU8tkgGkn+5L/BWlWLcb9b54O/9N9Y8iVuNDH5ibCkLW3o+ZmDKbhkIs87uDPaQ0EB8oPK//ANVgcMxyfMvgDEQHleFNkxYGljLPbk3W+oY5oP8y/tIKE5OqOZzjRvyApBK8QmyLaqAtzNCeJzkrwCuhYf6uHIW1F58caeax4DSnOMdNrX8zjSwePF2p3Qp1WhNbcUCn2cPPryfK0NBpl6Ci3XCsdaB5GJZnEYaDGgDkCoVK8f51pa8ENnxhINxgX7W4lqpXtyVACzO0XT3bxwh3Pj3H7zJJhmC+D893opcv51bo6S9X3rW6sW5MrdJ1/yJfZ94dJekSi8to2u0Tu+29TAPyOm5WpY/T/Pjv8dB3/puffBPQHLBYh7eYrMZx+QfnGIkrftLfuZjoOFS3xWPILtBR0H9XienOn1M/ddg+BTSF9R9I7UGIjhqwA6NZk9gifLwt4+11v1MQmK2//Nag7PU+EDbxTcCyfgnCjAWz2VXD1M2WYe1ucCfvLfsETCBOinDD74S/+NJV9izxRU+MUtEuN+t6x2ERtT8BPWArWmXOJMGIDszTaTyTb++xtUuoRFKQb2pKQgWbfc6CsrI6qwnwreKSRez/dHBRnSqk5+vUYi6XH09xs7xb2ySFeTCP7H62dav5Svpxi6IW6HSlowyN8UE6VjYjU9r5LVxn65eSt/a7eDRMVsf+tt10uLY7Jy96zEdvqtUrY4zH1qn2wlmKY8dl7dzdQ/5wG2Drz0rllAqlSZHHxCo9ppoTOdKdFJOUY8WxyTVUazj5X7ivFSrpTy+/3nU4a8rQgv6VuxY9Jrfj8pNNES/94ErN3n7EHto8gSSTwTMt0XWPP2piky/b/Pjv8VB3/pudfWn3Np4ceYvP5kEoYtwDaYEHyhYF7pNYFJ/TTzeUvngw09ngs1/CldwvNhDh36KFI+DurUSPUi0QC8fhAGiwyWpWa1jRR5vW2nbB63FQQ8F2k7cSfCQOipNxOKYhquguMrp73fY8Cnqd2f/TfiF9gYpRd88Jf+G4++xIyNZvy2h1sklg1DP8jp+ZkyeuYazDFnF5/39FQQJJLof36DVTbiclkifOnc/VuRRVy5Um4TI3MVhrdqiagNGghleiaLxDPyRuqy79J6lRsAyZ7zSRsuOJvtfrZ1l6W6d590HGwrTH+M6S9FRmaMWFFeHm1a7oulnuL/nEs2j/NsZ4QASiconbaoRqN6Vx+cwJFy81m/UIWttldzh56YMe7lmzTV5udUc5xpFrBg6f10tVIXS3dTctovh5/a+j0W+7SzizelebnyzqWVhTfFdq6hdApQtvnSbul3NLVef3lVvCmofWqgTJ6Zn+3fJvHzmPsTOq+eokBl8H+fHf8rDv7Se5ZP23tmpqLxeaSCyKdN81wrsMfbfhNzo0H+d4ZuwrhTY9wAHeiY8sUvhXi45OVx/43NJvMysrf6bSz7M9btQ8pfDEieC7uvHAYdUHnVnpgqkD1WWUf8eIpYSQUQ3rk62G0KYOx+i7JjNEf+5L+hQcHYww4V9Ev/jWUc1Guki8V8UOeDhn6wvrinaRZ10uxsAtRGy0ReMLgz/5/fIBKdfUIzFSM/34WEbeZLwxwgBmM3WcolcSuYYMcHn1+7OvfyaPonPplnMewu2M/VpHbgFio4N6Uqkrv4rNzLBase/GX46/7z3xlKm7JvibZWYjqlwnjcKor6S2lbsx0wSo4+XdWMD7YBpmanOxumRiU6rZ0dajUBJIulTaJ1He9qZun/4+0629PGtq666MQV0yeZSeISdzueTBq9FyFAoiPRsbENNh0J/vp7hJOY3CGTcu+8X/ngR8/x3nvtuhbck+O3INbVS6XBxbWYH5SsmpLJIVMLNRNb6baf1uVhgUtXSsOO+e5oqK5f1+vyq7tc9uNNP1FBD19ZhKZ8wilkexF/XD3NDkxUJ4mnmWOZTtqh+unZ8bdxcCn3bPyjLNSsPejUDHlEODzHkndHODSa4bFx2TQGNc86iGsJYM/j1g0LMRSktFqm27oUvHW5wU6ynrhF4dyIVwkNUqB1uEE3xQUikoygq1BcKXNNzW6kHCLHbmd4PVNAI9c0TIxoZITEmBD1Ff/G/KbG9XZfkVjOv7GAg++UIW8M3pO0SEA9yKz8icskPc34gFTZrgF2p+l1EFdd2bff90FQD2bmOBiNxWZjkKilG1Vy06o4C8SApz3TjqH4e3JIO8bt2K3bjiV1Dr7mTvbUCFuWbaZu65XLk5XzHS6HUdWAnqqR8gR3N4mVOH7KJ0pIb3pXBRWQwN8Njm5u6iKn+bNkvp62+fr+H9WqJldtuXk+3a0OO7nBmckWL8H5N9W78d1J8q5Uq8vPLYppiesH3h1HCshelFGVojRa94yfXr7w382JL1K5+wZzL5YKw4+7gqFZLYvc9nN1v/KbAE1ceGqWvx3Cd4Ytx7SYtODu1sMOVeLnZ8ffxMHvcc+KdbMK1Hjrwhl4Z5DfVyYAU+ry1abEPQvseQvYeLLh33DQ+B5RhH3VNGryZuP5jbTWKgbWj5OQdTO5qgsynYBy2l2zZkllAg3LqadODcV6Uac7j+wWtFsD8B8oPU+SIK1X9IPxx16B+U8iOc+Resv5NxZw0Ovaosdelp0UQT0o3Q/SUi+XQ2LSLjHAwdXiDeSxkdGd7/pgDR8AH0wmYrHTtwq/bUZc6VbYJnbhypLrntssCJwsHPe1XSqmp4cZwq/k5MB+Tjc2DIkawK3zs1K99b4sux1yWCUxKKtjZ5OxeJ1zn9aL6kuQuDYr3ZenegN44GLh4LzTRXc7qrZQqN/XRk5qIE/2Kunx5KII/sqRPVOrMKfbAnFZaSv4gzN8XNWE7/hGWKyFA8QeSNwGFRoqnwclMdlxMzNsn20rNU2o3i4fHIpVTl5qFdZH9bsUWzvqZMoxmWs8PaxR01W/s2epobm1dTHUAPnzz8yOv4uDS3Rq+NYDD9WoBN5ZkPgUTIflGjZQ8XL3pTQf3JC5RvU596yD5ACmXJO0O0ruOUjL2rCI+8gcMmHXNXlLQBHYmdYbHpXJ5aSrXjhnaDq3LFUK33DsRxOE0okai0/wWIGN51pZwvvUMO1pkwTr21rYJb7By5l5jrS4X7ccB50sPmKZ+ezY5ZXuB1sgPpcVycRlwrUnaVNeoVY0iWqV3/XB1yFB0g4+wpOud9FAzZoi6NgE38i/uaRst/kr/DJdY8mE3EVBOeDdoXyrF7C+wWfVIw4aj9p2sWS/O2/Jkt1yIdd9UxgX+N+uBiU0c3GwtXkHKqDpq4tcjft9csnZZ5LDimdCpnGVLQ+nf0xVk+uNzctMoXS693zjBr5lqhIBVPtlvVUwVbl7olY/sp1Or12j0igGTdrMyoB2kDPt2dBMQ4hQ24pPeul8la7XaxzXE4oXVwCAZpWAZ2tWFOE9m8wxq2mYnZFjRCh8BzE1W02qJC0/liP8Pzw7/j4OLrup6TfKD/PB5om8P6qhezt6IdeVtCnPMVnpFAtL2pSl0lyjuczVMbkTgtWRTDKvSxP692sTlLahW7A6TfNEzhBHkDiiH5mHER3Oao3xjCXlHobgnc0QIbrWg38+Y3HLVToaGDLIniFHpAmQ8z/uEj/MU9bLchm1lH9jAQelvI4i1OwHmcSxAOvWRRjYi3LjjdQzJ/POEKa64ay2tdL3fZCNWVTRMlkenjieGC4DbJmHiiGG/02Vb3YzxzszDdUk+cLTF+PUzck9fW3Kl/nMbeU4bqxd9W57AtWZ1GlEAHGj826lu3HdC5err15Oyrm84YpLD2sEIfKn09NpvNbnPW9HteKw2LiuD/kkjpscTkvJp/2tPuielmb5Xus+wg87icHrq7u7SrWVErjs5oVczdUQ+TuzTN2dpNE3x1wlusu1iXKn65x4RXZwsTWrYHf1o1S/1/j9tsOlyooLjRkSQ6n0kTFUvlGSSZyIUyEtUrLmXg7l8mLDhJd/fHb8XRxcyr9xBTHonthrc1FFfyemrpYlriHTpFohy/N6UOJYGFKipAF6Lem1fYy++SuLTqBEFKvk0UiRQX1OO7xVjeQauH7NShgRIzswRpPwmiVH5OjDc4jpuHGL0UM611xaKpiGzRM39KSr1A+6cTTNMOR4zkPVgFbms+OEpFOzMDtOPHAsSHsy364H/4Fj4Sd88PWtjM7qdWfvP5RqeQFkBZM6dkHdYpPbEjcalllK25PnylXTHsfjk2cDIT2t/P5WZXJghhKiPClluN1yss7XcZIfFVemJ567QQ1aP6114MFJS83X0Isjq/6uW0kjvhMs2d2NZogSb+/VGv396+eT6+o9+Kf08SkAzWa9bg+c6F/CfHus3HuOt+vHavVw5IGH943QnoAZBxka5oxTfOxUtC97BLmnOxgNoC4prqQdgwhi7+UK9nEZceQ27Ip01sFD5edX0OLOyU/vUP3kfHCpFsk1wMFZDev6mzL3tJYAWQF4e0kDNIk61qT9uhhhnnlhqKAyDgpe0hcJqozXydWGV2lec0/NEVJlKqkTVp5i1VExg1hwl9Gq8ydTdAFKjmSkzVhMQvObGsv0T8cDDxXlBLbBAhx0JrHy32bH0g7VP9WD3+RY+Akf5GBh5QxzZM2pjt3Lt4W+UDSX8EtbogzPLq4IXIZPKeDUe4dbep9Q8Scjp52KGXwGUSqqOuWr/vm1dtYs477RaxSeXZ3ORqA+e3Ug/tmrgNByoB5z1eTtrNZI39dLLeO5oNoaVDwy0Uj067M/WtcVtHL6VoleVWMT/v3vM66UVDc7DrheHt3Ufrt5WqJ5aMoeBUYRLtakOd9M++cF0soi5b4sOc6ClDguqVxPTOX6H4XDZDAx6pnieaYwW8k4mpCHPBAQeiF//ukdqp/siy7VIqnMcTA0BPn8xQnAwSMsz45B/nxtteky87iRQOSktcVSfdqO6Rllb7cBqUypUIQm9Ht4z4LEo7ApWGDgDd4mG1vTjOBwa9dYFtNfavw1SBIdi/lT0p45knngoXImH3oFXkmvbWF2/I84+J990SUcCz/ug2xMLJHp1on90Jdj0vjsPIXXbll/l0/lqZMXhlYsVWX2z9Sz0hHU50C0rN7ZB3uOA9OgG76bnRWHvOyP3lU3I5y+fYpcQfku90Q+rJbNw09E4nwtefNydp2alhsSrQ0dawqSYrWma77OVWv1wB5ITi542n5ZKXTH087h6NQbRYZZ/x+l4nR8IbKQkDoiURlPVFMDzX4et20XW3Cp2I2MvSNrT96IijU2d1gX8x0tFxfrjbW1nqkZUKVBbeVpkCv85ULc+Pkdqp/ri36zHkyqetJ8sEqmK0fy/d6tdCMWZ6V5irRfB6P+bVMCt6TzYczhhgOiUyXGYfOWxRpwkDc6DyEjInlIvYnZILbvorcuPmjcxRxJoWksflz4rFND5CKEpT/noWoSts88VOTBwuz4I5mXbkslvbZ/qAe/jYM/7oNOomR+BVXxTGwcIaui2o+Kpb59xD1Z4WvtPe6mXK7zeSfH/375diS/q1TMqWmtHSg044Mul9wgraLrrpQ+flHPOHYqrfubersljkCOdDEMjeq9VlooqDZfy6d3ZeTwHSoryir97l/HnAM9bw9mowIkVs3qXcm7y5xInKR4Y/NEvcb3HX/sy1+qZkUbcX5ehYdPOXW1MeiPC3r7juNZoheoOHljPzKiaN9dsFzcx7A/ZnetmPBEb8sk3k/kwyCA760ZvsKcSbuXX+JG6Fd3iX8QB7+tyTWSyasV88aMwwcnt8CeAab8/jBPOTdSiHm/qKKCGXSULqKQzrihqxBGUacwOuBkI0IozefKYb3BkErX6SZqwDfRVa/EOJHZsr9PML52Cp41SciG5pNhx2ceKml2bIjbvElmsjA7zmQziMoTjSsc/1APfhsHf8IHL0FepxdzgQSq3HvpkI/iKfa+y+Mo101fZM+uQiLfMx3X8Fz+o0B1y8jHC+vLu069X3l3iiXbF+1BRyhMOpVh7mlDXoA4HkOO/ZD16vRW5FKK+OlLWMdzYmf3OUaMtJ7Vivn2vl7OwLstpnFVtQtTRXFWFzS9FkxOzjafagcZBis/eSvOiWqLQ2hcoszjp9exklBUc97twIgTnvRisH329AyEgp531HZuCP7783asFZxylZQnyQh0mamQ0+q+n2qlEoPGQtygfnWX+Adx8B80uXLNCgrPdWrm/Q2AKR8f5imhhIUKUCzBFdCZdwW3ktFCsQErzdpAaVdrnaBTKkIH4Ug8Tqw7RxFtybiifZX149IaiYdJq9ay0uklCAXlAqrCYg88VNkUsI1bzFlkmL7+022p1Bf9clt6+Gs4+OM+GFNnb0HdTelj0VuiXEDkiEl3eZ/ij+pOovusrS0jhe2dp5pmBVdMd2PTSenIfV8zzwb1+w3reWt9o5m9FUZn3vuKc7Vz1S1MLrZVk0G3AokrSSOfW0UbuH9aux+vT7S+32bipVjy/KGctFXPr2T5Cf+bHNkSU/dc5c0JV6F/q15XEuO2IIwKSeXBFAqMuw7mU5tFag1J1KyBIYcodtsCscc3nLV+Ozmb8dvC026gVL5kVTPPna2YzUAe/F24a+IRe7K2EDdKv7xL/GM4+G1NLna+J/OgUzO5BvYMMIUE+bNK2q8jaTXaTGD6lCK4/VeINEx8jmMaNweIVQMb6+vtFlVEp9bDVta/QQ4caM4U1Lgui5Ts8KnazeaJs+dxREvHFDELRQw/8VCFgG3412hC7cQ/3Zb+xw7Vt3iJ/xEHf9wHXYZSIhsS5S5v3Xp4dQPl1yf+SXBCrDzFBpU2XH7ye6dUNo+u8Iaaz19X+UTuZCTK1DMvIeVIAAdnw5pGrkEdRTWf1r3iKo5nlWs8OyzmTULxcHzShPu1rPuZEClqL1p3XW7wijbLEt16qnByyidHp/e3k1khXyuZ4VeNlxGbyMeJo1St138O+8X+veno4nf1rHPpe/0Mc060Q/lkNHSMKwXndutF9t7fSlf10/L9FR1qjToTnWXP6JAhl9BrmpH4vpQx5zVGL8SN9K/uEv8gDi7V765+4iX2Xj/o1PA1YM8AU2Sp+U3N6cW20iimSYskb630aigkrNaXLdbzSAaJyAg+yyiMlWh8tcFCirXzvyZrqAfXy9Vw4kYGheJOSAXTFupBw4hwsQ86NfkAsA2lafZnJE6ICxwL3+Zj/CEc/AkfvCIpxYkc1CkIbATx2cMgnt9R90SI3d5OqrWy0Jth1PV5Q92v9CKREj69PW9Ne2L/XRh6zZOVWuXPE959t5eDo6UQHB16+k+b8g1o2mHXgW20G8/UCr7O/bavByE3Spr3Yj1LTevQ1M3paYWc3R/LlZHrbH40Uo/GNeeprVedwbu6F7Nml7EP/3yVmhQJdT/qwYZVm3P6QrXOOarktPmHaziIrN/FGFD5/bmF2YuhErS96xJqx1ggOoNt0yqr3r+h1+c8Jwtx45d3iX8QB5fqd18Aey7B6yB/puY6NXUUthoAptyCuIHO9+vyBjdsuUkbQTBPEkqPmhFjCmNB4y9qLQKyw5R2HaQlmfKlHGIkP960G8ZOL5zKKNS+XhyzCIGkaIwpVhUg58eJBx6qfHy5bSzMB2WgHtTvgW++/gkc/CUfvE3EerwpBt6Oi/zmZyds4/5ydtS/6zdPwqNqt3G2I9sWeO7OvKfsOIXXjL1qTlerd+67M+GJZdAtyAVFdlaT/w4PSu7g+Z9W7DIrmEqHMSvAQXjQaYTGhHg7sfqeTq/v2iXPaeeBFCXfqP+GQxbad1+u7RonPSI/bnFb09AkXwn/kdm+kfmG9w7lJATFXl0GvdNgTEM8D2KTwJV5L8/Efg91sWlpOnVx5KnyVTUHD61DWvyKs7oF2We1AP5f7FD9GA4ucCy0K1gi+AahKpJuKYcIT1+JiPCgUzNuAnsGmBLzSjc1hOpVNYZZGrbEVsGtDTtDhLlvdr/dVRkNkD5hpO70awRsQbKwdisazhdeZrXJqMO4bnchfSipnpaysRP5rtKFsCDnjyHDOQ/VLelYahtf42Ay9w6D5v2NH8XBX/JBtv92KpNf182pQQvPrKn8GDYmdO+10u5l/cnKXTn/m6rZ2erXyzfW0Qt2lRPiKs78m6nSLpi6QjsgakMas2xkKPe1O/VKZK8m55BxNK0VsT90r1g+AHArJURYxWtBRETk5QeTkCiXkIr+dWowPC7QhjLf9QpT52pPzmnEGmvf5Zyu+3MmLHQIxdkZHhuFSvmLZ5BDULWDYy8cErue7Ct6p3WTdxvtTF3EIFlOISuVE/q3X3FWy1V8Ddfe/hc7VD+Ig48cCy1YeXka2gH2rBqUg4dtjtjrNBbmgyBuZGPzm5r+s5jKVSpQsr3fNW6nDbdEnHJqh1itZlUGm9ZSXdNmkIYHMookrHJ0VjRriB2LaN+N85kswR4qIdcdQkCIj4iBnN9mfeChShSX28YC1xDuzwAcDHLz/sYP4uCv+WD8SB7iK+jKvkmEM2VUeXhgmxTM1/LMerUttKdtwn7IjpBqVx8QuU5oN94BKcSZH33R840ChGa/0MB3+YBF4GZ35Ybt1eXLDZUYklkO0H6nYYI1s3Tjj5OXh2qugyrPnnsN9d9mbW6Sr3PEZPw6rqs2/GoPf5LKzC4Lsn5J4TggVefdMmOf/hlzT4pH2btQhRaqpfz0InhcvSqGhOkZKB7tSJYvXToOmN5Z1lqGPSsn2OyG/JqzulHGXeLFf90z/y4OLnAsWN9wsPacl8V69UeCkblOTQ2nsscP8xTppka6obpQwomEEu17i8gYt29U9u0ZhCYNjCEiYsNVf9FB6BPaSPevrk8tmLXMxOuN29jMluU6jxJDRLWP5FG7xEOFsg88VDlsuW0scA3hn3sFie/NBxdi3S/5YBNjp4cUFS8lJ9ccq/bWiUg4Etx1Xwm5aurQ74UGz7pKPn2fP71QR8ROiTxTxuHJCzgwGrVxkEJEtukDfbOa5oZno17lWq3sBSeBvZ2n6svq7aB0qK6W7zRwo+2/qxB8o6oZhYTrklj2pIRacfD0SvDgJW14BsUgrFwzGYfB+8TQ5vHOQrF0vX7GHHqbGdFnJkaDTuv5Vac5Dh6pISFH54isfN07apsY59hsZzkyPTz9mn+Db8Ge6XFo53+wS/zPsW6BY4Hizer9y/g61/isU/Og13YO6kGJc28+T5Fuahj9WCyiREum9nn9hCWQZkztEPykqDKY4Qh9sT2xOiEFFcng2gBrUwc7TphmPfHwSl4zi+e2Dsp5qP+sqHTjDMj5d5TTOQ/VDepYahv0I9eQ8XOv4O0/69R8Fet+yQfJ8nWN0PTKSfjlUOEqcmwqyRDd53SxVogd76y/bEKDOy7we7UcSuKDThep5kjLSJWVVexseNbUEKPIcKUv1rlKYkVhEXuWci0YqATLVFVev6pENdoR/4ds33MHHHbwiuuMNl9fy2SluvrIIvTv6rU6ddqp3+0Wh3YumiHHU5Wpr++Gxv2Rdzsg5u+eCepx9kpzYTmMD8LT+Ad93F1PhCYZQ5+wJ4qVZOhtzyEfSTsnPB5WfcVZjTj267D2/f9gl/g7se5Rt7RHsZWaHGneQMrp6/Ab6LNeW5Xc42+BPT/MU6SbmlknpV8vp+AQxGhcLju9VXoLMSNIv6dTW2x5ouE0qAw1+5b1vBDbiAwdJEHbEGtQp81ncyS083IY7tKQMoSRSZDzh6MPPFSUbrltPHLu8QlVsWWdZFt4+sfrwV/zwUwZSh9XcVvzwtkvJqGcUTfNNcYu6p02M6SVPI1dVjhuOMLeaU9ZlRwYIzutZ+MHdll2miIioJT2jtKVj+epQf2icNsXow546PUygwuzjm93iOOaCHWftdfK6crLwxdyaBYl7nfP+qPSb+lJpRET67mWdVd4lru/z7j5k5xr6MS1/Tsk82od22v7h/bZyh9OMZr03tU8bqEwDlVPYi9yPVTwF4wlfFzEFLm53rHx75zVNUnn8eZ/Njv+Zqxb0C3Vb2zJ5OB7PuGgXCXyuHYyxXKt16Yc+L75PEW6qQkmCej45ShPZ3FRvoZO8TV1U0yoDDkIoWndvrlrNDAss0UXFMVo168QA/IxGrGjntx6wtrMxyw9Wj8xxLE0SSj3DdkHHqpMcrltPHLugW/uSZgH6sF/1Kn5Otb9kg82UGZnR9jOVPCp74BSN29YOz+yxHjBZkBMDHMbquNx5Kgmol0VDPN9d/5ErvYL/Vrm+LyHDI+7iuGNxzEqb6j3HJi+H2hBnPLOOXHKtYNsHj9/I9YH3Qpc+vCbkb9/pR5EA5YKMbqpJC+fllq5Lu9NKsZheP3ODtDqtfsdOfHiou/1xtSXlAlXjqiYm7m49m+BnZtr9/h+A5ndl1ub2Qwv6TwKSOaSZHOSvtUN8MESqGEXOatHMe+QkyH/w5ua5bFuQbe0dozlJS6LWnlhTwbgYKXFSiv6nkddj+RkVIxZ+NSWpeiFiciKNtS0yQAsBkykddOUn1hccJ4pPVPJDbGgk2x7YSgaRFNeNzQMpqjBqUs16zCWDYwiB6accjbnodoEOLPMNj7zMQIc5ME3s/O87p91ar6Kdb/kg/7DVonIXd/g6x2G1BpmSTgUdcgMJdOG+zqc3Y8xwzZzEVaqB5khInw8IqchBdblPeFpkTRNtPxGSei4J94/ArN8e7Xn6PpAKX0BS/t1/WfxSc+dA3nWepXXbIncinjqLWLV6tXv5QKv2rZBXsGnCZlkRc/IXw8fcA1kuxbwcp22S5xiK/cKLt0f8JPtTNzTttCZsc/z4mjrad/DdM3IRoQC8blM+lkOjxdBnaIGdcpXWn6VpAu2grr2f3hT841Y96hbeiHL9DhYBeyZfeSeBTjYmnMsbDAP8xTppmbYzMXCp3a1O140rru9aM4fgdgpHNl/29N51FBZzagttTVotRok1bZZBo0onxjXHC7Cp8zDsWuVOtxLwrnA9iwXYGCl/GHPHPpujrRgG4+zYzn5wEMV9y7OB/93PghwsI6PryU9zTq6t2+Z729MLUS8VnhXu86kxFweL0XOIvvDETrKdBOzCLu5F+ddQ/6VGpXJ70dtRLMfaUe3o11E5FW9mqeXa7yoC3xBwsH+oHvin1YHgVevRHVkElJCr59du2uvK3EhQTsnFb173/46C0ojb0WfyogxutgpI/yLj9D+zEdnSu8vcnT6gAkz3jrumC3M2v7lnvlyHFyou7+n371Tk6tGHEZL94OSNuVc1yNBqjdhdZ4vkhHru0mYtGGui7jakqMNRQSZ4GMTQlu1viCNqjy8XjkxhmP9iA3zKleHdS4Lb01NybElztgVEoVXAvfP98x/qWdODCBeLgM4qP99Ubf0f+iDqKQVJWkm7szfOXbNm1XVuj2XPCv8MRhw3N3tcbrqujcNRuNsee3o7DA4rdk8x6dYfKaCFdXmPOTO/92NrkMmPrchE1Ezbmbu9bvkh24j04ZKwYt7jvjD0o+2PMPStDh82lPVJqxXALFuVAgUmoIDmr4+OoAnmGcYNCnv0/XDdgzPcGKnFxBVN6tR7QxLRC8WZm3/cs98uQ8u1N1L9bujsEHAY7WSiXp/FU83AA72pPvBWzZcuII8a5YRomNgYbySsLPZuE1jM9iQqCZLx9ZCljVrNHETcZOqVT+rkpkpk3tPFiEpvy287rFDu/EkVKrmkGGTZkIJv6Ttbk3lr3EI4hTJ7+VIC/z8j7PjW5jZADhIvV+Mdf9DH6QwOH6Lr4vV0JxfFB9LhMCWw7Jg9+kuc7lhAHsLje78rUBpNe2e5v9wdDsFbFbQdu9fjJ6UW0VcZLeDw7B6oyd4MMH66gIRqkTZF2Qm1Tw1vs5YxjzZF4p7womniI3uzfpZ2OvbpSDPNJjHEJnKOE6X5ds5B/97n/byfRAbp+x625AfXbqTBh1NZAO7intI6sm8WZi1/bs982/4YKGJKtHngqTotEy/+4DtB1TDEcXS1w+3pbXT+R29XeIzd9A41CkSRCePmKIZKryS0roR94YuRlqbTyCdVwGfKcc9Heck9HskIbftOzQWiwc1u3MIRKu38pUilnoOYp0GVeSCMRgmX81zpLlt/GOOdAUxypezbebyi26pNDtWSX1RKdb1FmLd/84H57xqOa4m7eXOOUNAbYXkjk2vIVLwxF+9Sdu7bJnuGsZRN8bxh/f7bEc2Tgtkt5aN7zqLslknr4Sfy5zTgN150Bbs250GJPIMMWarzEBe0PC8bP0YHYuXp/573ldeO/7jrX/CT6FzI+8bHofFykgNTSqe4uHVX667citbP1H0eYHN5ia5AeP6qLSJcRHRkjeoQ7cwa/uXe+bfjXVL9bubslmfS7r0enkC4KDjnIfo+TtLNzURElZiFthKY77jAmzN6jRhwouvHc96ugxiSoQiY3gcMRSjBks8h607dmzZks6FzLJPcHuGia9yGUK/YwCxLkl44S16TNCsim1ZY1n2e7PjQArYWC7OY+vxBRx0xqwbeemm5nahHvx37ru3W1VcMd2OUaOxdbhZM6s6QpSfrDKqcuTyfnpzyMWx5jldnASvtOfPf8+Oa0rizFiFh8eSNBgNj8KByHbrYKtZbXn4ZznH2MlsNipl/e7Oe/UllB6VD14ZZ71Nd6+2QYxLLsPkOJ4Qr5yeieuMuQ/Bqp4ddw5NIe06U8KyZNgYTqZOQtCct4eff/Pjzsm/3DP/bqxbqt8t8bjOdUu7hiluBzg4fi/p1DTIaRGFKDRHD3QsIe7rhm8KedSDaxg7Ec05izBhIMxbLPVCt2GBjIaCPmViwjAkRgjWpwv++cFHjJOFyEElheyCWJdGYviIpZmcPqRIZGPWVPo7vYJH21iYDzYgeA3gIHONKB/rwf+hD0rc4A96mhI3+PqoToya1SR8OpJPr+umVLofyiZ8zJVAnoTX/+x1C/kemmSHheTtNCTYJ3eJxMjapMuOLDrzxvBxoZFoirPx9PXmb5AQN5T6wcA4ODCP6fubCs/1hQISPvT24HHXw5Q64ur2OMpMgttbCgubGdUmzkNO0J6K47bNhQyiG+SpYr835+2JKSR9q4Wdk3+3Z/4NH+xdIFTrls1z9b/flko4WLwh/JULR9bSg+zCiBK50oNOTQ6LoDNJpybhC7TTSIRloZTXBjsM9nwEtqxxTjmiU5LVaAzS8S4ysr83hTyiC6doL2nWubSUNwvFy17oiQBiHUmhfiMFcPBhhyqnXP+JXsGX+aCkxghw8BbEuoU9mf+hD8bmXHAjLNc4N+Ua3INGhqSLV+WR3PP1c1gYuilFMjvSmnmhXq7yA3utTtB7CbE47A7paaQq3xabUgrxzvyCRSf+tOOoLbgP+nJCLOLIkB1tduXuERd1pg7qTnKgikCzWpI9eWHp8jnb1dm5Uz56mhdKNvt1ubTFf+QMAiN4J+CbS0R+/Ua6T0m65nwFCzsn/3LPfLkPHv3DLvED1xBe57D8s6ZDNuUfcJCtzG9qtAylsDRpQrsVgKCGZmuNdpEpxoM6eglIl8XNaKCEyASLKQEzVjbHqKKjpHqsdxoma/5kiilCxp6CtA4LINYlYA9jmaJCkhBd813i72javlvg51+oB3ufeKi89MIu8f/QB5lLTN47R1ljE9hzE7zzHvDBMq4o7RhVRD2p6lybh+J9mHeT8bPZbaN8d3OcZp131oxP9F3R+zINsBdScWbMYpXf2tC4KdGcRuDtK1WqH3DgnBHFh/FDuAkPFDtvIKHfhUbllW1ydqe+a7WHqX4xV5yZWON0Zu/Q4w0P7UqtRXtiD4F1RgGuVIOKxBHmrs35Chb46/7lnvk3fHD4D7vEAAcRaZc4JIDv2TuRvhkbXIN3lm5q1nJUWsfCU4QkJ0I8HirkMC8tG7/R+lXuRDRgRMyBaL6POAmNCcnE4FDULot3swwT8WjXgj5STMh9iCmGjUGs20CT+F40Q6aL1+CbW9/TtAU4eKtUSRzs6cX5YAzUg+9kMLAN+HGXeLkPPsa65e8sxWdQp5BB/nv33Qs+eCMDOZwZnwk2VWKQ6zc88NuutlWBnb2dP3NCLob3+JaqGhrnZtZirHTd7868G+1hRF3sOeoT7oX7A9LCDELqSaSW1cRGYy5VLdwjYiGmOUz0mNm9Y10oTocXyfDINpJhH96HnXY7q6HU2ZvEpFMzqaIVMj08fujX/Ws50j/54BKdGpDXPep3L8FBvjz/5v3RA2eIonCjLDpziLev9v9pSuC2ZD58kHHCkMGuRnjCXM+qA5GspelB5MixG7Y2ISXkHbtpZvpRY/Q6MIsyg8WPi2qbFOsgHwlLcsCOFrwOvln9PU1bgIP+iMTB/vYrHJTqQTElqRIv7BIv9cGF3tfSd26aUlegTvnAK2bfu+9+9EFbTqz7NgN6oZc0eLFVPDvuHbBKd6jeqdvK3ObaSTNo5Xum30SuNjhvhco1BP5Lrw0S1cHEd8Iz+G4U6gvSnZ+5quocF9JjnjfvpqtS21DJpzNnh+LmrHK/1ZevOvqhTUM75BdrUY1YSoQuZgBGGuZU+eE+JXn5L/UKvhPr/q5TA3xwQb/77zgo3ZZyGCR9M/VJ51HiKGPieHynqKKiWXSUzyMR5cZGgcPliBIz0hr/QCbqzSg5rhcyhMJ1oVdN9StI35lDbanUlvV9nCW6UqzDIBuZmWv5CVKPsfADd8dsZs7BvrPYF5XqQYCDcefNQqxb6oMLva+l7wztGY2gTimDnP97990L9ynjgxjrHCdVxRLrMUyiG/WIfy3UYlOw+03Rxl2q2zoOQXcP5b8rSh1SuatUoRNrKzd1qV3jskO1LdtvDQKtQPn5JSxMCsXOnR3a+/AC5Pz58eW7BMp0Dhm+ZBx7NbEpBmfemkNcC/GfC5iNP5JnLWVk5blRzFU4VLl3/u/3CpbFuqWatkv1uxfqQf3nmxpclpB0HiWOMlo/2Y+xBJeHjF4NHnOEY5vtoLKE+mtlpdHgZ/6MOBBNxMDC6wY2qg2217QEGyBsjjwr0CnVTjOGi3008maSA4lrzL8B7GmF5X/g7rgJOSQOduViX/Qc2Mb1w93EY6xb7oOPOf/ydwaYEgPxORa/XXjnZZqJX3OijpGZCX45lDuLU/PGZBjq6WyhcbWqeYkgecR+WQ/8Xqvcr7QbbdN9hShWK1Y2W5lkncJU4x21JwcNgQlMrWczdJK1z7LReLUyiE2ckJjIxJMO5EBU5u9tDifyKjiK9E0Bx8ynCJxebHcbpFjbiVHiAn/dv94rWHrf/XedGuCDj/rd3+Aaui6bYqyk63Eiz3hLiCrgpz3tnHqtmcC8CUUQeRYgKVPAGeEQ87kTMmTVRN1uUAcaG1trXBzZ0E2c6GoyoDHYnPGtl8/UST5NaOY3NZQixjLE0N3Fc+Cb4R+4O47ZJA72RU1bbs4hqZzfTSzEuqU++L354HUCfivd/jeshwvvvEwz8StO1P0SNtLs2iBk6IOP9a+DhSEa22a9BJuz+XK9dCuiiQKDf2vylWu9yat6kRpf0NMBn0bc0IumnO8zfx1wDeiMy2AlPoPWTOOPN/SASrhn6XV7PhTcvZ7AjAsLHzy7DKhN5eArdErsdW7JtPeaHIn8nDI0US0De/6Xe+bfiHWTBS2/Lzj4qN/9jVx0Amq/hikl3adI8xRXjNGP91TJUZq0oBlypHVrLRanmqqb1QE6gRRIw9S8v2WknbHVQhZWrh2fdwdWOyaqnyCulAJavfbAljGlHwfyVFoZn2v5jWmpz/8Dd8eF6JyD/SvOveRlIAVwEM6WF2LdUh/83nyQGBeP5rf/Od3CO5eW56JfcPD9oQjqwZCNOjaywVFyqJia7YZZlKscyDL8zO1JEk+Iuhj7ACmuKoXT5wpNuoqNCk9f5IplqwfiPdi4dCeoz2Vrk+taPt5TOa15Zk2kqQ5qPtrTRsRqNyjTDYOTQE1mr1aAPZcikgZoyHELp8+ruJo/eujz7+v//3rmi7Hub7NjyQeBPb8BPnhek9uX5qJH8xvePZ1uKunUCBsoOcMhuC+6YMtNZsuqZZO+iAuxVo2KCq0ObyoNZh/8ofSXUmYx5aIpYzyaj4tOAxV1wSnPhuZVMIGPOVdSaNOKVU0O5EhE9M0LDnzz5Q/cHTdYl8TBnl3si96StFQPFt4uxrrlPvi9+SDdwFgQnyn2duGdj5bnol9wsEFsG24xLjoiNNWZKRjibM5oM/EqPcMGH25lgq1k1SDngQmayx3JmLywTiUz1lkeGVZzrG1/lLyMXY7lSZ5X4dnO3bRwuLX7QZsk7dPD38KC6yAUcJZDHuouyWq7ej83jSbEk4A302AHmSbK7B8K23QFV8zvUySNjP+vnvlirPvb7Hjug/YED3ywFU93l+eiXgrUVtkWGwuWTKpiC1+PwMrNJoXZOHvCQ2e1OyBfYs1md2lLaay6lQmdCqmvIZBBdELmepDIR/YyWiPhNAbsbiSnYtWJWiomk+8p5QgDW40sMtS1ZCrwzdofuDtO2iQO9sFXfVF5EYIpKdZxC7FuqQ9+bz7IYevXID73Wmx/4Z0HS3PRLzhI5IR9U79RhdaZJjbaPJZDxRGS1xGvs9aKX+F7FZLrz0MBYox7SrPULCLT5RSpbCxEOJPl+3c3+TuWgE52p7CNGjtXV4c2eE2dvcswvBjeIA/tuiqPqJgJ5fVcOwvFEjwzn4QOXnchVRnUVu1ZaKXK4f7RfP85EcL/n2bH/xHr/nN2PPdBYM8sx8uLvavluSg7vy1lcyshuSvetOJulszHCqrENEVtHT7TzIpOjKIdcuochwxexEBByDjZ9SGFAGIMKiG1o2eBBxYPvqt8Nx5ksoRXr4anJQQeGHyEHZ/zUEm3pWQC5EiPmrY/wL9BS/VgGvVIHJK7JcRupwIb9BW24i1j6+xCrPtv33mZZuLxwn1K4eZBB+F8e64d7J1ux2xiNWnv1cx2kD8X0F3HE8Mg4CFLWzbPzLYRvPfZnYziwKoouNu1jbf1WmZj2kzX0YxDK4rmrHwkk2VnLOIfRTKxhszhm1ktY9Qh75SQ8+e1Txy/C5jy47YRKxek/PkCUReW4iAbi7dMqmtgG5Wfi3W5i6FMPiov4ODCO5PlT7qldWw4EbCVzF+mUKUCpd/UgQ+eyfoP3CyzHEmR4qkMMtzIoNWiA6VsToNx35ERC5jFagmYItTYH1XK9Walv1vO+NXJvpqJBV1xWzyzZWGziI/TqF41C6id9IMciVVsR4Ft5ECOtKBp+33+jfV5Pahda0FaFOCgE+BgskfAAcSaYxbng/9tLsotzUUf71N42D7XQaiSe6PP9EH1ZP+lIJt2ePPhYBIJxPoOBy5a5XIz+E2yjarHrRxGkJLLm6jY3Qf+1VwaIT0FtIx5Fa9BjjT1bUag1z10jAoXryI0vjvfR5rc1czUJ47fR0z5iRwpzkn5c2hnl1+Og/KuXA58EAe28VM+yJ/K+jyPrCzg4FfvLPHzSz44OkHHw5vEIFNBhPM9AWlzuPfyEzeLgrLYOgU0VZGrN4MsMS4UGcYYgv3XSkPJlaPfdpW8E1Mmjh2Y+TyuVGdFB2yyeONrKw7NLJ7fWr8qwv1nBaUMZxn9xaFyGo0B27gBOdKCpu0P8G9IO1QxF2OllFI92MDkwdeIOgNiHdOc7z9/ng/+t7nodFku+nifopxEuU/7/EfmkFCD0vsc5tXsOIOE6NsMIK+D5NhvDx1EHPBOCHbyIbVtklCtDfQbjmFYjG57GffmSqbR9wlPD4U/C2VcLO1ueYmhdeicsPZONRwhQaxDmtBkKMRE4RPH7wKm/HiOdIk6pPz5/bVy+XzwowxmgQ8+N4o/d99dw8TaIYjPCzjYOpWT0ry7AbC7VXq4LZ0ehd/IrmB7uho4bFfJFf4KL4/Kn7hZ/NKNsR6bFeAcxmqmKUecmf4FMVVUmVCiFoo2DHDeYqDCBitKU+sRISwrRbzoJKrTDrI58on16WhQoUkhgZFuHORI0QipkmwD5EhfNG09P8C/Ie2LzneJk8pVlgO2cfoJBxuBFLOQ8/+3uWh1WS66cJ9C17GpON/nf7hr2zkAOMhFleY9o8pSs6o1Y9aDjMIAB+0H3o5/mKlsTQsT5160F7Sbd0l4MvGp3QK8KvUKxEY0Eh1FE8GJNavnHHGEN69ikwjsb8iSYz55Krd84vhdyOt+PEciJ5SUP0scC8vjs+JzrON/zgf9PEdo+Hpi6S7xxudclIOGOxW5PdrCHOUZvpc5N4eGPJx+4GZR5AiW2D3/Y7jWSBH6FQ2SsK0gmyKrqlIoYWTWQmzu3uCxpLeMGXVxM+NTJJ4qxzsOB+pJrSes8SxFXRf04w6FpVFYuc9m0YkH2EYG5EhfNG3TP8C/wc/rQfnHA4XL20QdwDZo8loZA7GOjo0Xcv7/Nhc9WJqLPt6n8JCndvywzz+/aysRKwAH/WKdiFdrydxeyeFEZqxkG+FnDdmsXwa2YZaJ0VHQGakGk8o7u7o4ibrDlRChPEwEPSN/RDuLeBV7zh4iInvHyGvIWkGZ0xPMfXeG5z9x/D72N36iV5DpSfmzDCnyy+Pz9edY1/s5H2xwcPmYw2zXy3aJj7/kotTxVbzcrZPT6Blqa/FsuFFCBfQTNwtsoe29QszWTG/Z4mm4lNFpCcQmM1QsgbJDvfkEVnIuPEeb/1Ibq0nIqRM8cIQIoIQ3Aw2DaSr81qOedVhLCouRedOihtGjpq39B/g3pB2qOQd7VqoHb01q9JZeZ0Csc75Blut3/xoO/n2PEfjg430KdI7ysHa+z1/DHQAHV7qPOGjrnS/g4MQf8x2CHGkvmh8JUQ9cZ1XMvb6gFKNO5DAwqlyauhEemVlPBFg7jU5950Zbr2pViZUHDdDKmWy/+onjd6G/8eO9gquES4ob11fgm5fv1/nfAB8sfvjJ+25ph2oHxOeFnnlT2ucvgW+W9CZac35+luHlq+IV5EmdhFDTLTJJ1oMbrQaorbJEORrDnYZ4LH/oVSfZgvEg7UJWk1GILSE5+uVExyAmIbhvtVBWZDXuJVS2SVK1q9MZBh4XUVLmYXtWoRpUk8BetmchlIEEGPmsYbSg7f4D/Bvx2wcO9iA352BnMzey1WIJxLqPoe7BUv3uX8PBJXuMwuFrPFl7jYerE8ye40zj8/k+/8J992eeEx6f4mdGLzGyejTjxLA4i3CFVwAHG9CkKxqpyMiJ9AY+BXwRPnjdRobg6VJDIZSL9wEODkMJQzUZAjl/QiybU2UeGzy7+sTxu9Df+PFeATGjTkHcmGCq3PL4LBzvAR9s/PR9N85ViNxokV90CnC6bN6Y1bHw7qVMJt2WgneejkqIFr2GHMe8zO68xob1CbEHais4wKB+hoEmHa16rVkkI7pn47zHjplPjWqeilk2CcIQpbuIg4F8CIOprNEtJd2OxnIOJ+bVrg7rmTyoQZ4kJz2KsWtilkk0iZUdnzSMFniJv8+/0QA4KHGwSxySl6z+475Czl5BVhDraLS0XL/7l3Bw6f4GkW4BHwQ1YIzuUt7PWlGP991SjhTaRPrRAjIOuQwTazDxiIOgHrQLvpLV8jtulxlKQadyBg/PKzZVthIFdXd4O/CaDaLDAEcL2Lh3Ie+PQG21D+y5C3DwE8fvYn/jh3vmhfdyEmB3jOkuj8+VCrl3Lc1hb3/OB2+H+F7jaJFfVB4SwTfPd6jqqOfiHE9KtRU/xSdjzjqWOPcKl+S0dw4wBdRWERoWmK3pGyEFe0q6hJ1Nx8es10AZIlqEY9ZOs7DVKbMcuY3GTSiqlpkvk+63WJS0QPZwAFTNETYJE6M8MuTzsfzLgFKOJC2HfuaThlGMdX2UtBti8PL4vLQe/LVewfWyXsHCOz/260K5zjXmZ6W9L355LvolbpSg4XndqbYMQ9p7AdsTTszADqDy83LEq9l29oJlZE/SAwK2MZvXg7vRAFICODhkvfRAX9CWv8S6gEPwxeiTi57AR234XmzcqyTtvYp50qmT5TbAwe/x1y3M2h5tg1/ay/1ev24xPi/Z31jAlIXZ8WO/7pvzwU/2jE78jG8DZZHdTgH2jYooHc3EBytF7YzwbBxPwupNlUbH4ua9MFzWWQlMbyZxWW0nDI8ROzKy55DdgmYrz+Uw3/MMZO/A6r6FhVfIgynsScxvamSuj+SgOCDttqW2sbwe/KVewXLbePTBhdlxY377L+WiS3Dw674oddyKR3SzaJw9Qsftxme+r4su+I2CXz/Ug5tVVm2Y14Of+6JGGzpxbmgGQTu+S36YgN+wGYyQ01De0MA5pBrSNEHOfzj91PuqAhz8Hn/dwqxtIT4v++bx93xwMT4v299IvA/NNZqTlwv2/NCvC4Fv/uZ88HPcYBmChnxkRMD0g2EOI94UYGtcp10LevDAm/NuhIG3zL6AMUi/MGwa1i2GFLZOH9uzQcGDJNm1h5uajHRTszF6003BQt9M2wiamThZK8jNcb/n41zfSlUIUQq6JSsWOUi58M2ppfVgw5RKtnBIui2d69Ssy+XxK9RBSn3Ra5kquNwH53y50j5So4wwc/3uU4k3/pHTiatJouoI1eIfdonPDy964Df2cp+ipFkbXzbFrjnC3/rKB+XFXjOowPfCO9glFJtwQVwoE3udJsDBCciR/oaD876oZoyC3wSfjJkE3fTY6TGMQVZQimzqQKwbVgPrz0vYnNtwxCHwuVXIDesL8XmCxW54E/X+ZuGbH24QmPd7wja3EJ+/fPNjH4ltfc8HS4nc24l082jCF3BQv2EAv1VR65sSRL8vz/f5F/hFofXj+lynBua/NR/8HDfixNSCQTZjge63U4T++MmwTttQj0vGxCz2fLxHEFWndiurYpobiM4a92ylTC0MftKJEnp4M1j74COodDGCVVLIkxEF+zo0rjFIem1+5dRJWzfsN8QAAt+cuGL1/y0//1L97l+c0SdBXkfXQS66POf/ygerHGJ9XglK9aCd/1QPto/NPWs1UGDmEwSJkd5HfNUX/YyDFbNtB+T83TKohQ78KmODybdLINYditvdCq6oLcyA/t9nx9/ORf9xj7F28M354KdvBq8BR95MCth4kI2uV/Lok6If9Xm98NDiyDf2ErC1SCIkZhzLdzd1FhiPGPdEmBsFFWcRGzFac2ltRTdkTnqgSEOhDw9prBxhSJt0W4rEoJzy1TRUuAbf/IZIun74puY7OjVf6Xf/2jvzHPbAIfn2B+aDI1w1rpip/Qfb+Jwj5ducTxE4ufionYEc6Us9+Lkv+hkHY95hfS436Znukr1yE8Q6PrjRLhPw6Bpf57lHTBn9/8+Ov+mD/7jHyC3vySzOB40sQtPzmxrYXPfATwprxrDDRRBGL2oULXCEJfSBSK3sSPRN5kTKakkxqiKfUMfv7IaYNZBMRexo0qsiYlycDnXThPjUOP1TyxAK3EJTwSSrknBQ4qFyEArSWXrQ8svcPGja5j5+vUv8BQdv2Jx6oEhkL614/obIy8qKZK4x51hIZJuQVbv8ndfJK1xd/CCD2Us0Z9wQYel+cOGdVZTU+5I0mku4PPpp3r1w361ISLvxEm/Pgg+KLUjFjWKKCicvNluSYki4awK/zfgg3uZAzt/Ay52KdD/4XRzUPq3IYxJXZ32GSTtU/UoZ9n/BlNqCbbzBZdLtf7y38M3S3OoNoqZ5Fios2MaXb742qeI3xLqkpxn8XqyTbnivSU2wNd8J/OyDj/nGAg4u5HUwJ921gW9+U1uaiz7ac8IyZvLzm5qZqCBiDEPlAk7Mu6YZ7+i86uTUF6h4tQEnTAhOg34r6KDgUE8mcw4zzBbp1YaDQVJv2/DVDhL4eJaNYm0GzyE5uGyI404LxfT1PmUiSltTfooML+p3ez/3RZfj4BfOvf/kYJ9rcjHLfXBprFvsP3+JdRBDvYvufCghk+Ty/sajD86Z8f6+JyPyuGM2A/XghRnm+Hm+oVo6H3ysB21Pm3F/u4zLxTMQ664ZqAVypMX+xmPc+O5992N8Xjqj/wn+jYVY95hvLNjzAg4uxLqlOPgY62gxQilWNQVc7Gt82wcMQdltoQOPE94lompRDGm3vGigkED60MiKRCDUWoRkMD8N5E9Kf2pnTgd+pnOTcTSlokY52DkLgHyIsIS7NLrOMCTlxOf1IBzZnq11/2Yb877oUhz8wrn3yD2bXtTkWuqDS2dAi/3nxxsxYM9a3a1MNeKX53WPPogq9yQcBDn/9Vf7orgc4CDVbizkG0txUKbjryC7MAU4WJVvdwAOlgCmQFeQCmCKxFn9iCkL2P1L990Luej3cPAx31jAwaX5xgIOLsS6pTi4gN0Xh8oEwsDU8zg2ep9SWZwu1BzOIRGHzqDrhmVZkrQaFeFNR7JjXov06roCrDDrYyrL2IysImlk7PIaJ2iCKTXS0GykJO3DGN0XHm5LkQiwDd8WPQ4mQT3IPPRFI8TDfFDSm5CyXE0OVdqwaHeWRx+nHhmiHGXwEcsy/ZUFLZKlsW5hFyLwmVdtec7/aM8Led183v2w98VIMyCuiitKwJ6LINYVpfvBL++8sC+6EDcW5oOfcDDZf7kwH9y9lLmnfFIOW5f3N7qvTXDhFl4/5wgb+2G+lwtrf+m+eyE+S7ql7xX7kq7HQqz7PIe127/Rf45L3IY3OIR9rYs3n8Mec8trq7lOTRXkG+sL/PwQETYE4PFUUnSimZKkU+N8gk3IUGyz7VOYjyM1U0RucCt8Rw5CG6hGIaIaxzRixQQRSJikAjmWKWRUIEzi3prGXzPFMGqSnN+WwtEsue79ZBv6iMQ1ZDn0s+TgUacG/CbtizKo1hpTSP2NYThC7kn3gwFG0i0lx85/xMFPM6DPuxCfdwJNy3P+hVj3iCnY4610QeIMkeaw0v4GyOvkvfk+0jL+58f+xsJ8cN4XLWFj8UKe+9Ir4KV7K0xWO8ahhbjxWFvdPuzzo7vCduCSFBO/x8dF9rv33d/h+wLf3Pqk6/F1fP7sg0vjM3sF7PnVNJe5/tqeAQ7a3t/Qy+1Z6sm8otTzd761xrwJiZ9fqUNA7Td0Jz3DvDp8LenUbAT/fB0ibaaAU1eBtYGixhBEDEOStwYKesMaU0TXdfWIKnoQ1bpge5z5+E4zY4vk2XEKG0m3pXweprd85IoS2IaHRf00S1IKBNSDDMDBnZmkEsj4cBJYHZEn/NK+qFW9lqX82gSRsOAQReaTeWUSZhj9dFuZIBUufVztTbCqKGtVOcE3O8gFTS5GWYxmUKWLjHb/Ar+5KX/KEcdy2TLpz97O7wcfc36GgJ5kFTIXxbq+5Pw3qHaNVaqyLKm1j/Fc4S1451vEr6NB3JDe+XJ5//kRU0COdI6qKyBHanzekykD/3rMNx5rKw5WMb2Hft0jdoO8rhrAWzUyV0yR/iLIn0GdEvrHOuUGpZW3ypi0x5geEDDzxporgG/WNgmKfafMFRsQbNz4FDcgIpn6rIuXBO+cia1HaFLufAtTmXIizyxwOuUe7NnOtkwqUFv5Mx8faqtMl1KAfAPhP9VWz8Bv+YYfz1xJ9ykgr3v45tzKQJqdgPyZJfP+ogp8QEwGv1AZ+SKpAf8g55pHQxmcamrCqs8LLKFDLVYWbxsdisKqrkgoA1axqxPCmD60gU5tOjRUdEJUKTfXays1MrCbJyC1MQdsg4YFegvUg0nCC+pBGxFn7BrKYkfiWBqFlDpDHrVbfTQLcBDRFBAPDkXeTMBvGAtiXQJfQXJEOvq9WCdpzLHI0CpprX6OdQv8oo85/wzEP2neDeLzQqz7rMPLIoiNlrR14pLW6qwHsJvNgVi3UHc/1FaSbUg9xhJ455v57uWnujuYqlSJnMQnUy2T8d6nHuPSm8eFXi6wfUkDdAWEbPizZmL01+LzI/9zi42xt/+Zi9KPXbWF+CxpgH7i+JU4q+GNkCJRXMw3gD2/XAcxu7I832BArNOCd45i4JspKEeCuEHSpHgqh1w1LdTnPRBFpYz2tUCipHQj1uqW0sgpws2IzOzKR0x/aeWGsisSqLBYrtoMbQC7g3yRTe2rrI8Y0/YEw6RVKB/H9SWVH5FJem0gIkU+2QZC4U6pL5rwKV1I0rKBxchwLKd040nGNQYRCUkS50wMcdCUwm6gCAcEYp2WsITIzziIK/rBGLxHHizYxnwncK4xN360DWgcySx5Z+CDj3ndgg7vl+5lRMKUmJ3yHZIJkNdJ2A1infdRU2DjMW4s1FYL85Tbyee6e6H/LPEj6aYglsDM4s2jpKepLMX8TJx0BS8Qik4lB4445AFx489I/J/rlC/awcttw1mUbCOqkP9nLvrog8tzUe2D9hnsbHxtzyDWDUA9uNyeQawD79wDb8/aAKYEaSamofRjUdol1qpfjRI4RTtYxiFtz4YIr9nsfmuSyQ1pPEGilmFytGoIRhFzzEvmIhcs5BE9hnXI+6DXlspRso1naiNbIC3nRdy8n1ePm3FgG34yp8MtsDWOrkeSpHoTUsCWBJyj92bgNwjAG5S4Q4kwEgR5XcyiDhSodR1DyBESxLpiEtKxn3GQYGErTSHgmxUxS4ygMT8JK0kLQNNlCPsZB53ANpwspsky4J39yi8I+xkH3x4s/GVW4gyZ/+UV8Jf7ARbEuuaCPS+882P+vDBPWehvPPafF/K6BUxZsA2l7SPIkUqI3c34Dh3ANpwZwv/lm4FtOGlryr2A3W8PwG8xyKFjFrA7SuQiINZ5WGRdFyPU4DX6QWpuG+A3WKlGCZntId+I4XEL9RkHsyisdmQTUAT8L9Yk2wCv4dPHbV/lG592Tpjl+caGI47vgb+cRliAKRSIG0FJm02/Xi7C/Q9JdYLKxU8+ftDOCBtuYRxyaicKVYOwRY8RRmvuNySCqo2IllQbswysEwN4JPBmMiCl29IVZErJ0H7cCdlusluT4xjra7PANjDI3i6AepAhxKeGESqwsNA3JSe9WGws0vpxJ4b+H3Pv/Z42tkUNqyE6ODZu1DjNLS6JW+pE9A5CHSGJDi7Ypnehf/0VTmbM3HEm99657/t9v56HRyw266y99jn76JSmkJFX86C7G6SnTdK8K+c1ch9StS6PjAd0+gj+ldaxjH68q44xoPUPrXvK82sMCZU/z2I7iqp/j1oHRVAvSLgxQlT5TKOBOetSD7n7Ic4LWrdQwy74usf1jQX//Pt7An+sMWpUz09eLujGQu6e35GhcsPrb6BEMq3qBujuw/+VPqtaRzzckw75Ht5tSJpVrcss1N0PfkMbIcLwgj6f536vu7/zGWUQS37Rb6h8tpXn73H9ud8wog+6UXaos9sCGFZ6OXTpYHs0uMyi4U0rNOPWoT7KQWONz+448OagBuwu5Dinz2S4SFt1rtJKpOaUIFO5BGUzbj+B+7GHs6URyWheU3VadU4UU8ibV3r4j3csfOfGYZN56IUotQhoeEVmBtsxk9JiNw8HIiBGVW64+Pn5QXWMmt9NqRltEarWEeCo83sexOEs830P6JEbao5T/VEQVGvYBW5kVQ/31ziTqLzg6x7XN36Pc8aw0sI1UxegxplXfZ2qGylSzSkLtdWTvm5hjXFhT/NxfWNhP+Uxpyxw496De1TMvmtEb9eAZjWnqAL+iPlXazJ/5cbDmozNjmtIVs3d5gXMC3PwSW6ofJ7fkK3WKX/mc0jFPH+P60/4jGsFNacw6Bzzjhr7DVU3vLKAj2+zGxibg1Bp1RJh1dovlmVCjgS4dKXTuTiC2J+szzSKi0rBOlcsbHLLLGKtywlxkJi/ezZgP4yGoIQtYgkIIvl+f8scLHLa07O8Wg9KZqwqgsONuMoNw2ZyKiDcAQ94ZdA86NHo3se94aCr+rpvKDBrm8DEKABi8xurt/JsSdU15QoFMFigk1b1dz3t+eFSEzK9vVK52/3OjWWL+LTnX9C64AOfSWB+DuhprXv0dYta94RuLPjnBd140j8veCQHYNSyPOSVBgvc+HvMP9Hnf5mDMWBvimz2/8M5GLAjP43zI59/j3OMln8WZ3seLMki5FN1Q9wPmBzV3EMvccIWt84iYYLQnwKeImQ0awH7JuNeS0f79s0N1AGnaFTitfr4WdREyEsP754FUr+NV0IBTVj/DKIEI7DMhoCxWg9O3pFMqZsFg9V5PZgnEl0ODe/aRh+7T+RBlRtrxQyCTQN0aPiYB+FfxNn2nRtqDUv/LTf+rHWPfJ7+Ks6LWveUbiz450e/8aR/ZgT8d19HaIGMaFQCf/LPv8D8NDewNr45+T4HF7zoT+fgY92t/Tfn4KM+/x7nzHv903FW/fNDDxV3kAMy817iala7t/51LPrCmk1wGQ5sLpvzVZeJpBC0sgImcgBcCUEpp09rSaplvtGlTXSdD/e1mRkv6iPG/rDD/f3eUsvbOKPBL9V6sMH9UQ/uICrHy1w6VslBqSoJciMB8hXFTPIoYAqOVF+niEDinDTZS1yGcb1Rx3jUciBq/Lt/noMqD5DSawqY/KF1r4aq/mnDF7r5/YNgvxUDx49xnmuddvKEr8uMpAzeEjdxObOgdbEnfN2vdGNhfePRPy+sbzz6ukfMew91Siii+b7+/IPP3l9g/tc5+B1zkGamghlWczfjglPd+T3pTupv/Aa5wI2n/Ma/xvmRz8mhqGVP9AA1M/80zsK8h+psTdUNHtyorVMZMkTi8YDDnQ4CEccyoCnq9CTh5pwSvAZY1hVoFiNKE9Bh92rxdwRkXSn6zfGWzzJU2ZpUZ7eS9jtiwSAk6BjLDP/9/m61Hvyo5sEzQc2DEjAqh8C9hm5jUMgj6Lss4LkymVeKHJo62B6uFCRUPjKAs5IF6FfDoLsmbnrOCNXzcyBd1Wsz04yKOYuyB6ujXXWMGa88cMN9ld90VwUYrZhNaBVH8OFjnNmxWeWzOjbh08g0CwFyBoyo+kws8BmZCIBwmDFRYz6zoXllouUc6t4VNKRaw+JVEbWqufvvatjHtdy01oT9WGM0PrWW+4gZl+d3ReGIzQEbeUjlgSdOGBy/wFwV1JwSVPFxf8KsA1//mIPqnxIjDSaIRF1KEACaxk1xKCKR3bluWMyi+hng7PVQXOCGIAdBfJbfzBzgP4szanC5CLMbZ0xrwiY2ysPc0GRa+0mcMYVLHRZEGKgSQOmWg31xnkw+y1scaVX5Eb/p6tAPFvF56IYrHnTDBWoG7s2Ye43MwW58/ndLhO1ymtTFXwdgz9qKqqLz7tlv4xWfmvGfmcAApQMSLAZgOL/h/UrO10UBZWRAJwWC7DfU3/X12XC3IADMtcrnKx7Hi9mNcVGESgXL9/WN37XuilC1zhqtOQnEvaB1aDUPOWUps/LZa6ZvhQ3khgOWF7TOUc2i+DtJ4zrLm91yHnTVw0DqUr+58sBn1df1rOak/FCnqHzOazf3jYC9ZgWXF/iMXvKg42/4PNe6zAI3Htc3JMj4qBsRzsFqBHte9c+kxgIRDJiY6wb3Fz7/PeZ/nYM/MI8fvegjN4xaT4Ukli9zqm6sj+rq79goPaM9RWFhDlpNEVmNaSFMb1Qkc/JncV7g8x85Ze9ncVZ14x4DlyTrhkhwGtQoQJm47aGXGIh96ErDhKH0klBhMO4rv83utyBTX2w9kTNq3SE//f2+tkbcEDjQ9PamYWhDY3nIsPM8iIVDEEoYzRE1D7oZHzsleNNKkULka31kx6by5UZK2RgBXmIpgGNVPqezeBLEzMHv3ACF32hz4A+t+8Pzm8ajBa2rSJrSGQdObo2mJJnXLnmej5KVBa0rLvi6Rm6Bz7xWfre2EOf5JSDSAp9JzbgSoqaFvGn3lkTkmin6AVC9npJL24bfe1z/nLsfc4payjCB0p5Rb6d/kVPAB914qLsrP3L3nBt/j3kIq2PT2hL1/eKS3zE/yY0ItKH+jnpW1Q0e3iuqulGU4OEojw8uQmalmNs4rOfB/nvCPKtl8feb2+rYz+L8o7aaz8FHPv8kzgJAp62oR2LIhJRHZKN58jHmU2sQq+qRMMLeSqzai4gFknAwEbZ6SC10BA8da1ELaHdhOOP6bX62FPa9q0QsK7LXXLL75+9gV12uZHH4vQ5bNgf1TWoe5ERy4+UXi0JKWgucRfxazoSlOcAv+qA9wuQY8DxaUvk8IeeX6P3gBqH6+WcWaCYY4H7eB2CUqnVamuF4EQimTaiXocgEr/4X2qXhR16Ep5yNneSy5JjkHmpYjtGZ19K0BiMwKsRkTSs5GgnjusiHQ3Usk//O54U4P/CZFTdsmSyYQKgFPn/H/HM+m00DdZ4uvVvwdQu64d3NsNy8TinqtN4hrtYpC7qhap1X5TOe4xb4/AvM/zoHf2B+5MYj5j/iTKu6wVs21JhqOFgCvbmFOTiP8+ZCTvlJnJ/k80/jbIxDL+Z95vP3EmNAyh+HSmnVMdp9xPo2pdZ+oC2VBT1pwLziBjdj2l3ruse+4XKtQ3bcCj+cLcXLrGmla1+Vuj4tyoRgr2XZMohjyJL1xVjli0aecyNgg4WcaljxRcwWzURi8D4hIbJ1eQIT+Tk3KC+Zw7HcnBtZsCSpnj/MouNfxTnPA8NwjhzofX/LjT/HeYEbv4rzr3RDzmew3oPfWNC6wMMe/UovownP/tC6BW6odbecx0XQb3Ys6MbfY/4JNx71eT4H4bHAOSbWn85BIISvLcT535iDT2rdT+Ks5bUjY9CK5XmYzApQKvW9szqicsMhPwNTRcgIO0Z1yYdulMycI2xhKmkItZMJK+pYt6iSC5tCafx7q+1lRM2Dht6fTpGk1TyYC6ncsFnW8lEU8wlsKBRU82tUG8Zs8Q+/qWNef9IWwoClcATmwgHAlw+qvk6wBMOq1nmD39e+MD+p+/ZVHfMhFmNOO7Ly1nGYh0dPap2I7K0v8PlB6xbmoMpdJfwkn39oHe8Y5xf4zKu5W8pZd0lWK3OGOLTA53+WU6RfYP6dGyxd+qeY36hjc92QJGAvz8ClxzloUfJ5x+FCTnm//VIdE5BTY24B80KcH/n8NGY1zh6YpSOMFw7mVzSeVDIjWH0amdGPP66HzOVanCNIRLCTIFRNWzdycKxPFlc8fng1pX7N8hJp0rkoNrBvm1+tG/GnhlEL3PrzaUpFzYOIGPgrN1aCWv/6/NxEAPYHBWgptvzQG8+t+CBvfN2a9PtVrfsyVsc0Yf0SFFC1LhEWYCzw38UZl0SW4QNWmP1HcVb5nDO54znAlfGDqYLqRS+zmsjHPJgpGkzilaQFXm+N1DGUfWkGqTs9INx6Afwut5H5SjERtSahe2Y006BJoaDWKf9vuPFfzMEffH7EvBDnlWFd/f4NapXyPInZT20QOSs8143Aerw276FCwg+rakv2lFluaayZHjpfzloppHWQFvE4/NB4Pawxxg4uJiuhMKqWHlodpp23NGtMtTplWmk67Ekt9nAXidfyUA8iKaPKjVgIkX91cvynJ+aCQGneC8HGteOY9N9pXcRL/Dj58g/4HHJ416MLfP6HOYX5D/T5H2LmYnPdWNJ4QxE8EVP/5XWT6p+9cAgzsF5/mMTiAbW2CoNcaDGnLGBeiPMjn5/G/H77i4UOexF83lnNeC0Y5DePAA5OrdtW1dpPH/8Imn15tSzNG1xnqVo5pUNLgUTMwSZE99p8qZOD0IpaSs+3VplexuioYFJCZd1mzDiur4egDZeF8ULzPPifrhL/zQ7C59/mdQCCr4e0rpWw1Z0Lwy5vXs3dzxxzoqPrXsiTVmvYMKby+dtYHdNsmhdWL7Ggw7MSo9GUD3bkVH32xfHllB/ZXLFO6urYRkDPesIB0p2e/8AAiPrURJ+Loe5Qnt3whazJdEy7OZ+Dn2IoLvqSCO8FgFwUjuSCAOEPkKJZtNA57EGfBV3UQgm+hzqFzvkRtzWgJVW/gfuDqt8Qf4F5BbJj6/CyPw+7/4eY3UEsGfP55/4ZRv1hwJkLkSureTWmPkcsGFITUNxiD2Ako8b5EfO/G2cVM6fy2a/qxnyVmEhS0DRsZqrrxkrTK6W7cYNLm+6WJcRNC8lUJW6N+S32smbk2shpxfWT3HcYNA8A0fy8JYMK7G/4dHYl5tdO1Tyo1oNxeb4u6n1YF3XYQ/aY0wcvR9NWuytAMKVP6lhQg6d8qEt9shvyQ+qTVT6v2tUMq0VTQdiztmRZcQc0KeLzRB1DNql12L75n3csqHxeiPP/akfMa8H/3Tj/jBt/j/l/Mwf/yU7NI+Z/N84qZjXOak7B1Wy14fCB5zKmD8w8wX3Eq/OXId+7BmyNkWbVQqihY00xiULXY5kOtI6YHVdOixo69e9WQ8fktUZK+z0PVkfp768rVOvB1DShy+3GTROVG6le0HD28VP3suszlr6tmYrtZfNVizdX29hqZSudk1U+F67WVD6npKtpyFDaMvSc6li5b8pWel6xKvtWqy2vVW4uW9f+lGHnO49LsQ8Ptz+HEzY4AC5BCYiDHu6YU2fKw12rdls0DPedMetMzYPzG52C0PebDf3E9xt+/ao+L/17T17A/PBkxAsnMgmrmnf+6ZP/FfP/P5+sqw6C/nfNkOWs9fST+yqfA66AeKD/DDByzEC9Q3S13TRoHyEmnPaYYwSLSuq0gtbV1GZIrqX0YHklVitLMfOGS886ihjhTuc25suzNgds4OOFPx29VJOmtvepOecGlPXJadHfS6z6R2lrbugEVosqd6dUNjhMgks9r8pnZ/AzoI4pcf/6MGJZGWHm3Chh8RaTYuqIAkKj6Oq6kjSlX6SAYj/4gLnQChj2X/v1tS0fWL3ymWsd3nQ2ta1+vzg7YKqoNezlA58ftc793/MZOLlK66pDOktPEyDQwtBN1zwaKa3bOXcFYTBln1fHftCpzt2VRO5X+vwLzP+TOfgdc5fPlpt+VTfS+lJ/OejSpRe4MffPPkv9yi9ebvNqTMOr7wZ+09WL1ALmhThXk2ZcoU1w0/Ek5sGcz9SaiZ25zOkRZbaX5m3YOl5ugKbQfCtKMifzjFYNXbDk9OnVaFBHiKxGw2CGqn41HafElYSajkl+M1ZWS5+lnF5Xml+DuDGvB1WtK4CWWBV7yIN/4cYeBoRncdEInqljMYP5IKnHFl/N+rvWHcRMvp4HTMlxw8q7025q+t/F+ZHP/yjOKp8XMP9bfP7/nBv/xRz8O8xRc6i4YfQNMSn9JGbM7rZ7rfHpXDdUP1RxcjSDAudFvS5AMd+3dUTVEvv0m2eqfMUh92YyOoil1DwYglT5QhYsxONWlJoHtYB/YWv1L22rHqWnjv35mMz3V//xPztmXl5oD64WUYtcmF9Tq3K3Mr/ODAHOf6V1j0eJzWnECIZxQDAeLbTaPol5gc9PYaYWuPF7nLsRQ2AX6X3qRs3B2a/0eaE9+BHzk+3B//0cTBgDFxumhfbgVd+uN5frLnDjz5gX2rD/q5zyiHkxzgtbq49WLQKpKu/J0UDVZ1Hz4HflXyg9FrYp/40jVH9qHX9ow/7F64NuF+J8+9RrE6Jq7k59J7+cNm/WVRN4ubm6Pl8MeRc1Oa5Y4I/XJhD/9rGvXvkyZnaWwKyj+BRmT9ZZSYHRK5/eVfLMxVxnL0f8alGj6rNfFfO0ZUNOqUUNC3iqsdVUOWVaO/cD7lJEJFzn6lh0gc8LmJ+cg4+vR354HVYtueo48+UgFZ9HdqjmxC+tXcYf/MYj5oRov0qv2qsJK1RZaHf/FeZHPj+F+RdxdoLrT+rGwhb2Y1n6uyuAp90FV7BgIR7L0v+gVeBx2/1XuuGQ/9h2f1rrqr/Qukc+P7Y3nIRVfA+5+yeYi3qTXNRY6yPk6VaBP45vaB+Oi1ZHGlOt7DKfNUjbZWXhSGAVMp7tyr3L+dUzRxlzsUSbHl7N+tgqsID5yVaBp/V5/qqHP/sN6wJm4fJRnxfaG6bq2OMR179iXmhveArzr3JK7a9tJPM4Py5ZLFi1HxW9NTO259Q86LV71Dy4QNGF8p9R8bisoB03AsukSnM8u+GBGQaVJMARt6IegiWXJVUP4YXlWZbD3XnV85PcQnvDfHmWN6m+Tv1yY6S2p47RQipG5OEUyQIomYOdcR5f0fjNDpJxc05CC0TzRt1jqwDoS/3eYvRjGVwyb6j4NKhWBD15nWmFFbQpx8vRTzAvHO15EvOCPi+2RRGG/NqvWl/iKj5mI0bz4DKgSg/1iBnX8ogLXli6f8D80+NIWt0mjAL2OGrafPo4kjHmmPXWH+NsWiPdpr+0cj1iXojzU5h/EWcSfTrOj0tDC5LrtmMA6lgx4dOHPDhfhVDz4KPkLoTOb//xYeuPpPnjw6l/Wi793XLW33FjzucHE+hxpDPLf1qeNTMet1rDrv0E8yOfn8b8qHU/uCHgzP4LleOi9mlu/AufH5fgFjB/n7C/G9cfmP/pHFyI83wOSgt8/lfMC3H+z+bgD914Ms4L02qejj1AQlZT74+/e0ffXfi7Fyj6+Hf/zEL8fTr+1d/9aCGepuifLMQPzAX20fY8UvQ/sT2/sBCPcV4v/FPb8wTm/86q/dr2FCOG2MFF9/8p5kcpWJDcH/KVZ1sPeXAFWl7Ig+q0snuglNPhWIuu/SdS8MgNj93polIO92bMvmaH7PbNDcgRW09A657vT16Qr/L6Ex/+1anVhQ8/KQVPYl5IE09K7t+ktl+miXmX8oLkLmBe3EH4I85/k9qYhY7fn6a2hTn4K8yPaeIpzL+Is5qO/8KNeZx/cMPtcv01zpto5WluqB8mfvzd/1Vqe4pIf8BQn7wQ5ydZ96vUtvDh/2E6foTx97tLT8b5P0/H/3ctxP9VzAtS8FfME6Dyst3rDY8Igxu8fvXFBDTG3Xbn03OyOXjVbXYb3e6g3+i9Gr1ojFrdVuN5u5m52R6Oylkgllo1j1qjuiv6zsEMtgfteijbHvQv++qH70etZqvxzsn0pvtDuelVtuyftHILlPsrO7Vud6fRSYYaHemuO3rT0lUnJCCH15BJs0kPCN24ajGUXPpaU+Y8hzRoPbm9G3jvubJlplaVINaGSmLZfE04htvD+LCTPf32eV9uN0t9arPXxF91h4P7SrPbn7a2R+9/x6z+wIvmtNOpv/j2ab/dIYIu+PkA6LzqjrvTYWuAT5vbV+eX4/mHP8L9nrQ/HHcG3ec23elVsVGvv301HXLPC13+us7X8XB1vbl1czet6+6Oo7d8+/X4Sqp2XfZ1Y6bKjeLOZ0quTk1IZnNcDHWU1onyzoWPa0L5tFq6K75TKPwGuHi2viXkqYoP1EzrCIhmgAg/7uS79EFmD+vkgsrQfEU3qLdUVvLLFvPbA8Y7k/y6lQno01IGrMjB3oDccuXAqlfOTVyr5aJGnN8HJJCZDfCNWbmVtLgxoMUOEg/7KVhm0wPHEp58a9qavmr3muC2ZYWPFJbMsKygebZgsWgrFDkB2mg+U/H6tDQdCUslPxblupAkniZYqJ5PPZtt8t4irYnDkGJ94SZJxR8k0LpvVSCuLTkUSLOyubNsyl+HfQx18fmlEWA11573jHYotJfz8bo/RDo7JIUPSxhVdGWkbF5PizcD/5T6NHkjlDABPISDivYIY9AhGxii15BVoFy8dwJes1m8ltAbbkmkBh99f/LU98Yjao7ZyMTZhgVS8RqM5+noDBk4jGzNy9ANHpvCR8avO/qBO8vs2nK9cmZyLQp4q5SejY/5V5gMaESM8g80M+1A30e4/U+TbWOV9U1jB17vkGpb89E6lk3+eHIlU+IsQDFrNfFZBe6Rz2a74ADq9ZJmNXS2ia7tUEPHh1mkr0aD//5hJrKjawd8GdrzBdJP2v5y7F0fq7wr4KZaPZBnfOh+f1fEZ+1MIXOVS/lPKUIZ5q0nhoMecO9X4p8DBKqjipM6ZmK7icJZ4h3HRikCm/9AAC+2vBlIawLKVBlARfAkmxu+oLqaAZ/OieWhjtxUaL7avwZKWU59cl4p0nTQ8CKakSq+dbaY075BbkKJBsWWZ3d72YuykplNHmBcnzRKUqRwsbTtbPrqEne2X+9ChvR103U/mVZnDuPV9iwP3GPON8QIKesZXzmfM9m2odmAmpI7xvGguVuQAkqxkEdLvnMS8t17h+A1QNDKtRXPV6iiVe/x3FYLtfqhuT0iIRNXC9n7Ylg2CdlPq7pMAy68FAMFZYWhNSD9POF6cTmallmnhq609J1ezVUolEmHcjiw3sz6nVFib1bE268MbBzyn+4jH26wgsZ4fBLMsgZtZOjymdhpTfmaOB5KdSHne0bURXLp5qZSr9Mrn1+MUMDnO1saB3tvSnTBi9cmqLcAtKlIX8wX0yakVGWl60agFf/ydhccgWW6ktgkWc0Sw2oFrxIuOicvjfvXRg0WqMAx1ht9QeRpmTTqS/oZKo6H79Ym2SaSpUGse0uRcYUpEqJhgNVttJPL079dNSboFHE810gIYmCt7zP52b6sDyZmM1nFfNjZqd1kCWB4Kownd2v30fpI+Gp2Q7fTchfeNWV5C51VOlVQU87MRAtr8rF5HruKsX1P8gsAYsbQty/j2VQeB7BVxhFVxKCxtOkuS2K0vNU9qvejGn6wP6q0Ly8sKWUiI89miMWTr296yPo0bymPgyWcQS03090cW76Wtd3goViA9IhOaPOb5MZHCIjWWvy7V46q/9UsWfKE00iAMzmboHs0y5TEdzyNJvRYHMXHr6JW5D6AAcIzWwtSgBm9+AN71Wy/jhuCxUb+9pYzkrrdj5sW/azoXwFycHhHozclagIfLnEvZ69v2qV6SXk/8ZUEMh2j4KaY9rhy1NCYt3zwuTsv0/10nWULolw1xiKTIiDx1HKc6/cOE41KR46d7x2tgJOmsnIITxLHIW5W4Oo07hpBmHU6KTSA1EucD12bZiZdsU+bT39LEvlsSX/Gcz0RbNWENINh19P1xqtKgWyBNjarSM09MMNIXu2zjbVm2asUPec8mFrhljPXYzDAc0naerrZ1XaLGx8MQU0f7oLaUW3lUN78Tv5TbmSxFQezGj7jC2LJJqDeFlgJDD9rg6O1M4rxl0eHB5++dCaz4WhHJ3JZ/J4Qp/5pvX+v3S8e2Ewc2vbBbLkUk/qd0DCws7R13ollMePeWqI0fBlaLnN1qMUF2G+3gD/Gd0o+y7WpJ7HNog7ooBtnX5Kwe0K7jotU+XTYJtlg+0689+/ckn6i3e4Ol5n6CHDf0hHF6HTuafFhtUvZTeP+RJ+XNFg36UXL/ncYKTZ5ZVD4IKtT8bx8wxWHontk7lNeoWpZyZTBI+040WgAUHIMrY+N3ptOC6BPCkixcdK4Veeg/rPh6LaT432/Ld2Nua/B64nqLFqoktXpPm1GJrNJb2lYRfJOBsSLOdOS2xPpYZqC83mlovXgUXSYBeTS1LF0hTpvQW95c609ykTX+XumnrGeOM8McLXbTF6UKMSFKJPLbgOabQQ86k9duYLB60ypaZJ38ze5eBxYLulmMj4ZQq+lEfVyyHUCQwAoFjtmDOnOCveyn/CNc5f7Ys9dFFd3tPBYmvpmENkfdfdmdMk9qCpYIn8+WndeRgVpdk7lO+N9gRlUfMTm6E2qCJb9xywRsq43KHHWZyyiSJ7oThUDWgjcbPfabeXtzRUb8e0lQMVS7Yuzw6XSlH8X1gevA52wmMh5GheKPsLlWFyAzdw7nPSOrtecUK/tmQnYMi2pYpcxdvlWngv2ZiSxPMGomnT3fDwZ3b8tR4iiwfnZsSn0C1VR/6bdDG0Rci5fYFMhdxFc2QlmR5mua6kVIozPBGwwNawwujeWWmuELxnJvEAHFaEOJkqCq71FvCoAVTSKIlMBwk0Ylu/ELk7d5lEb9YtfGKkDGZqdwQYgs/h0unfz1j0rlAr1jWIx2d6e3ArBwdb6q61ER0Yo48VEG2SFJn6TbldSZQyhkYSl3qh7cWOINL8qgDjCvP9oMtx0xsD04qRWrpy36WDJ761slESLiXYllBI2WbpS+OLadb8yq7xIeLZohBcQfLXv7abUNHEt5F3kTZXp27ypXjoYQbVTVudRnYwGFFd1a/zVkBtFgCxcsJU6aFepFv3R4vvep3tvpiIFTLIU5LS3N6MmItqeG8RMxQ/CZ2VOg4ItOV8YeZX6BJV5IX99O4ikwgV2qiPkCq4YlzfLN1JgIBitEBg2MGD+ZgSQNQVZvTnpKe1a9Qr3A7cR4I7pGRD08LftUk2E5A08f6VdBRpco5+A4Qp8EqfvY9Nu1mUOVCsJ8qpPy7Ju4+UulecF0binzKxH+WQdkjS+4U19/dY+GYRquYSlEhzptjgeErvby7B5RVBT8M6pNGJXG2zXYUYSPkmrLWyj9177pITkSzIDGscMir2zeVZ14UG0tvxWlJBMkCShcHDUsYuQDheNaCGY4oZVHjfGerkmcqx5IVuzXHfi0dd8zRdoougMMm1lZCIbBoxs5djJG7wZun5JpkBfGTjerguTdqBwtJmIl080aa6ugXsB7M6YwC8z3dGUen1ThpR1c2pY9tKmnUNCy9e7m5qpHjicXWquCXOZrBVYNnFNYQmwZq7PitZ8+1rLkwbtxloE43s9+3leGh7Vr8sYnCTSvJ+YJOoWNpPZYMumnnDIX/OXGqvZ/jwbMWfCG7rQBMaD0XGtkUzwakZqXMxy+lDVZZIcSWanFSm5sHe/7TjF3MCAHFql4XBHmc3SuclY6EKijgxNA8VBdbcVEK40Y6oTV17trH9JF6q90iFqxrJModAKgYkJenN7fnM68Q7rosfgHAXiK5bsVUQ8cW9brDrAV1025NxVk0DAQxLJhhXNqpdPUPVgTtAwnAxcJG/JSg9xvoWNvhospDO38x+4NsMwrbYbUR3qQSpC1+g4FEq1BiYwyjbH0Jee3ox0iPLRBzIKoBp97maiABk2YAaPCzpx3B29EGYB+f3tNSyOAft2t8M3eG7/ec4byqRvmRTAd3u2ymrjsw3LSoqS8WcLfiN5GWeCh8fyy9awTbBGuoNTO9zy0I+NK5IEvRt/DuW7iM/3bpDNMScg7pZu0C/DsR6Y9Lpft9sTrSHYLqQ0JjY3C1ii2hI1MpXKp8XgCMAvdXlYJJKWN0Bm7OyeWTxiY89fnIYFMyZvdIDEp1hBGigzhPCihX2CjdR4GPlSbkdrJeWDJesNpbh2PTBkUCQEuFashSITrIwPiSoY3edXxDG1npqsRbrSQFjSQJfkRWVCpGRO8smNl33ekSUz5CbnayauD68ao+4EPnz+7TISFHsf8UCBPmjzGg7nRv5SefWSjdCZ9LX3+RXCzF7osbIvu6r/JovYYBx7qfEHpm+zfKNULya0PjPZI7FsF8mLe2WwyCTpwaCIHccdcKosMeLbpRHQQir6bLGWkaclzdGNSstyEr2z1TV1E2xOxiPBLbsJiVSmrcCXcwDtZMIN76QfFKnrwAsLcX1dQrD88ytz4fpLf9CJ1bWO1W1dlBA7xtcQiBqD3uSs469LsYww3i+3mGK/numNKrc6nERiOUtKNwIzQ8q4axWFEaoxTMqwzLVqHdz8tiZy8JXjYtxM3L8zE3EYeWGZOPoABwxhYyh+98XdMk07KJW/TqyMnnUvywKfe3+Vy0UP+mCzND37vAncRsvTwI4hIxVtQ107UdGUeTljnR3NSnqq6DyDlAZmu09VON/Xd8h+T9u8xlff0IHUYf+yWzJRcidBvrKeO5OYCe0et7Qz5Wg8jpeLewf2LZIlS/AXZKSHVzFe48S4SnnEW/u7fpIKVG1vB2KW3L66yffhjMb9TVQ4ggMdqYj8hZkC1+pkumPJF3nd0IclFO/RyOyh37IM6BPfvve4rmOc2N9/JnoVT65PBbCOZpa6c3ZWZp3rjjKy9mg+A/Pd2U3uQnsKZ1FUIM8zd1LosERpRD4IhSaK8WbFaanma3d4ESuW19qNwRhedW5u5XUa0Auez/qITZBz1Ukj3A/LXwCdM5stTO5ThdDtladgBfNKLGiSLRWCopcNCaala64R8XCxWnZV9jqf4rQ+kIlY22DwSjebFmr01tJzMxMcbhhPWVWYCI1Zrk6BUNnR0ckvLoEBV+3uTulbYTd9I0yzuiXgqNmGYd70ftTOifcArn5BepjyUAoQIvq1kg0JgkVipSto/cXdZ79t0lJoPMPfTsfCWQJ0OzNoj3TRRr1jFKW0WHa7FVDaJ2KWGOXPzW++pqUaR9rOg1PtC4ojxTpU9tc1hsj27C5L+Spn4+rklolQfbHj3Ngf66/FmqD+g3TYODXLYg33jUp1hDeEFTnjDX9gwIp+LaoU2bzRLp+3I/mesr/qqU8hgQDsGszS3gRXLUvyjdTV3HMaugCujHsgpHmXdDkjFYoogGuZYGUld1XDZMVqHaZs4mFMd1WlQwfX0zq7xypsxH9+PES9ZJsvb53mezlb8Ip1weVWoZay3Z4X0qM2YGMRphB1X2XHce4A2dsWhRIOfTGacflcwImhCefL9aLz7lMvUp5UixddWhrsmPsjbf3ZZ+0LOucOVtds9WZ1z1voeHxDkMgROvaM6pHlq+xmNM9LbB/TZjLH9iGSqJBw9/1ZKup6Nmmb0OzUC64WqfzWSGmlK9cfyyqRfhsq1Ki2HdepqQ0o15bRYVxz4L/1FZg23yvRYIJ2GYm8z5/10TXyfHA98he3dzWnjMhxma2jUbHrHNNKDEgLrUrNGN0ZTv3FiotG2A67zxOSLJ0ge0AT7JSKenOCJ7aEBOaqDMf3CdBj0WysT7yTgI5z1HErESnXYscmB0zVO5r6M3wAVJ4VypArqwC3vlws8g4VZhM55ECZptE2IZsGOLajG0U4sG3E35aKbRqI3HOMmSayY3L0aRNDC9zc49UzGlYvtWhhwzpWctM4d/IOAlP6QCcQrt4CzTCjF3cSl0WTV1mbsUU9nLGCrt7JmQbq0LhhdE4H/I3lIqHhTa0ykTK9oDVjEgIdOdwvNfuwToHGPiI53b/OmbvZj7S/mFotdADhVspYB2YbDgyKV9AA2+sNmbvnYlPquZZ/u/gWG04nRSsgKdOL+nUhDgCh6khju96R2jWR9u4YqlgDuVfwMmR0zF5agTbnO/6ssBrtfX/oFLEsUqjC1Cbd6NS0KWMWE6NEJl0Gu+f6U+dNPr3BfHJk8+E9iq/TyaR1msbOeAQ1e5VI+F15XOvuyrdUq098eoMOyJa3tktMxpU1mZklai0v4axvWVdvlJJmVrT1xiyo4XVxuaZbenMkTIRxfOd1LS5AQGqWYO6nqQSNrj+b5Vpmj/c9AwQwsEXWRyVP9MuHVjlsFL4Ad2PoWIwxG2A4O2rMdvhP1FVGm6kdQu1256wcCSGZ48COPF85qbz4GCjVjkf3bWedE8P3VTjyPnEFiFjI0pKYjtt739aWPK/GH3RYR8uBRr7YtSUnmmq4iNTl6Xt6P3+DAC3HKaLagEPiNnuTsaztv7glatnSx2cd4j4DRpRwMr059CUvmNeFbk/mMXM1zHcI/033xmg+PNzJ0mNJ8WekkWiSOon7ZL6pjHOsV+O4VbOVuNJvmQAtLhZm8N63jT0634Jcp+ZhLmCR9bxbFLmZqMrkeZEkAe8A8Db6y8jgys/Dy5raB6ELEhPc4Z2NVrpx1scH5foGYo5Aw1uNWpc9g4P+5BFwFaxf2o7lV5FCuACtnucVBWmYE/nZ2HqXgszNnZhJE5BDL2kicG8cEhGD4VvMsM/o4JsQeMrmpFNmSobLtSrcJcC2rZScBKPulWzOnwIENssOjPZtJ1up8Yb1fc8lri8SGIVj1Xq+uJx8LbdmI03wXYHPXWr5+0i5hRzrvzSCfcFoBwra8svsbBil8mz5unbcOLY1RP6SQ1Trc7/Wi+eyY8v+6q51nAb850QlIgrdPjJTmGBro5O525FShcGozlRpiSf8eb4yWf+yW7/ECgEUvKC1g+1un3GWBlO42l9nV69obSJ7d5IN04YzITuuTQ82Xm2vl7NlbfwF7y87y/3suBlshepBU9bENsqzQsTsb9ZbS9e3oLaz9+3NMNby92IbGg8SfhuaFdJ5X9cZbbwd7KUEb5EvIQBW5BnmdgRgO88+gN4ei1W+ENmi12YS/OUy57utMkdTvWccK0w9y9eTPgvd3l5dwqDN5aKlWan/TOu5CYNjb6shhOW7BvB2xTq6DkDk5CDcN1tf90VKFDOxnl3RmkXAsB1ojt4w9636tD8hHSSQ+2iLev1k2CqOay2NYRQZVbTuj/vyEG7Dx8u94vQFGS8EfLlZv9p+C1xckR2uM34/ayoxjajHIv3DPcORecgXK77XHKE98csiTSB3zVn9onCWGHfKgbvNloeJR1kAg/2Hh69ek55cQVjN5EawLqgEJrNcNXhXtN69cV7PCtfiXt2k3JkHLVVkrB9ffStUO83w2+czpYxX5GajRXBKNXDiPalSXblys7NRHeHrMZKpG6CziXyn3E5Rw7aHCVk0eD0vyVww3P5mxa8aZXZ0CZQ8ZHQryfvEa8uaXSOE69HK2/doU/FkLH50YLf0nUEzteROD25JNwfQmisrlVW8Mnv08jdLjS/WVt8Q+sFRwMJyNRxTZiFnZ/OqWc7S8pt6cSQdLIP1IQcF9Oc6b3CohecCSIdlYuDO1lsS+TJO0jf1adh/FiySuLGvyN1KSr95GkXzTfATXRmLYrkp5RvohOviQoQRSoNybHW9O0lELgptNJ/fsSPnK1Sd4o8y/l4hpS1kS97KHXyX/GIlercIpHOSoaxU/uYlOuPx3sbUEZ3MBqDt2QjE6eAlFfEWpyVH6UtjZXZZLdYu8WI2y0pcp6itbyW/WqUqIl5/pSYjmQXJ8sQuNKiQ5quy1JPHMsQR1bwj7Zas4bhI/ebWmgKgX+O+aFyN9v23ZrpUlhEq/619lLrDlMjdujdVxUw5K1DNbJmcG1awzJW+PK83ZWeQMjvgZs8fnqWK5uyt9tZ3d5IZ1i2Av50Dm+RvLybWMOCD9Ht3cv6Ia7ZX1V/glStfI6dXOSgBRTeuGbK/1TIGMqhN+3aWhIB+YX1PcPv1RbYzBqAG1xucF0HXpa+Y3ySz/oy4ZlkJklPDb3o5VhPj2YNDSOdaDdBV2t0p386I5ai+JpYpjHqOgR1Oqy8iswH17u3nFFkbZndoc0Q+J6/DVOleK4WGb3ofu7y/yQTP66N+66AQD2fH25EvB0YBE/LR40mtLHQNtWx/BrUFwDI2eJt0eJY7jPJJEzsRKK6/sr89vmWBgLLFQXkpw5KCD7IP5FDj7MqA3eduRfcynilgZ22LFgmsOzZXb8sFxPfhpTAAYvZhR0iDBBHKnPKUcsdXSTnbHpcxU0bX81P601OtUM6Uq890JNhIZYcBheKqYVdwmTkOZfOct77O5FK37y870zqD2F4e8h2I5l8eNmY+1pQeDs1YtRSGXdcabl0q59yvZG0r7jalQxrOsm/tkYNa7PLjJjIiDd1oU5jVM6hPIthNz0xuMEWrUCvdS8CNe1rR6j9tl8J1cfziQooiYtbLlAqDdNqhsWXBmy42yBXMISSYdiaus4ExntiQzaMwBFlWivnEMShMvD4qFS7efaW35Zk81PlRbVCbO50WLiVyP+HYpTuz8PUSO5k2zztAfZjNTWlI2erp1YwoZ/KsPzzpv57oZqPwcuDLi5J/pKkcmYP5yV7Lq8mPGUu2ClGTNxveiqk9QQqFioEtyGwQRvXgBzYrZ3PHVq0GoQaRWZYpjoc3t84pxZY0AdYF8LeTwlo/BRV9NsK2ryBmFFJ5E+rtUXkyyAaDVXq0PkrEL6NI/8pWYEDdUX8QJEf7OoPjUhkHsaN1L5I6NncA20zUlqGS7ZqoGitF4prOS/npal9X5GjL9tlmuoZyytJKG2kv125qI0ps0qXwe2yl19Zo9fcfq/Qtj4sTqDbCv3yZSmBweH32hi4Cx/1oR7inuEp+AHbeCZkMLwpvYSHQX55EepvMaWqvnG53aCS2hoF+FiZaV4risozNq+T7BBbzRmJQdTZYO8cYwY88i2zJiYgJyMZgR4T9kjTb+UBuQlUnTHs52+7cl8K7ULA8flW46XBZ0Pl5q0QRsebqm4lY+DZt3GfBSsfJoWsrUKXJdrvV1VpT4vZzeKVcMXq+2g2dwYy3WjwBeSnYkmINnxxQmtvN1yWq3SYDS958jz++Iye9zMH7ty9vJhUmf453IjNLJkJEq1xCiCGpS21IRgLh2GsvOY2fmqa6cvPYdrY2GheuxkYiEK2gmYz7pnyvSCP+4HJ9ZAqXW/dv8NJI2RVwrDiBT15azBgmdKwwqFZUsK4zyA/vhynNfk/j7sotvopgKfDuy3WD12r3N8dfJCUbMJ5uBwHVsrf8GGEuZxPcgYmoJCqzif+9d1Akj6f68rT+zfz1pSk/GRmPjd6BhjVLsL9NQdlJztUE7EkRrLne8MGOfrWb01yye+f2g2YmAyo4V5203uZE96zo5odsHuwlwr5Kkb9/HqhoIm+laanT2bLbDK0oOBm/tBUKreUiq9jgeyWz2vtWWkJT5UCs4sCnkn69ex8xsu8jQzQSLQGlo/VSpLUlK6WbfNcKRvrWlfUC44Aik+0oyZPbkTEn8zbdbDMjhkJl9yF9eU81BFNDmFnFobiKbTpn5UGFNW7gyv15oznU5Cznb15Eci3Q9wGFegCNFoa2oYyE+f6BbmVVLGqL8tKQw8VnbbJJ52yHyOq9jlfoEwarTbRhrhJluvfBekFvspWMijaIZgIM3lsGCYz2UyuTTaksCSJurYtdW53jRuECUOwWVm8Oho1aEywcyePZNZycTYLsVtJlyAkgFfK/7QxdJKWblKtZVkmH9yb2q2aoXHfgI6DV387f1uXOuR3skjouP4H2xEt5CzIHwxmGAKcgWdy062BFm4qFO8DQdNX2YsIRov88AJWwfPqsQvHvpwM4Vm4UJw1HKnFOtZSs4nhuxCf9XeBKDNaW33dBUqkjlUPztF+hAhF3oc1nalXwzERCMVge9nSSQFB5ay6iRfdPLObmOJ3dPDhMhCbPNWttpQYChC9gNr+6wvhgZWQQQynLCXPLXCKmFdRiGFBc6QU+HRa224J9qqlLpCSmohYpCdax4ipVyZaN3aJ7gK4njQYgqPTHe3v9angbAQKlrGwJySZRt2zLCiVswlQn3N3LaBMb+q0nnhfRDFuor7CIONy/bwnX8/M2A8Gp7Mt6b0fysFVanh2NMWaMqE7oQ0rMt0r+550xgmYmQiidLpeLpJHICUQB9Ra0+UJ5dpBLTMYG1+Gbtcv+KBzfPSWvBDrZgLtwLhcu3J6xJxF6huhz50IHWjbcxAuyz/ZNQbJeVhsxQZ5gBWrFiQhS9VZj5DHr8EToein0ig6kbpZTuRt0Yvh4+OaymNHUda/948Geyj8Xy7Rn15nDgjmdbgtCnULbM8uLwRUkDk3ryBj0ltooSAAzVm8elPw5KnNbCl7IS5EBVi068dykQDB5vZcsfU3CyD0frkuGE1qsrmoimVK2VWg7a/u3H8VpuSBUAIIOGaQCFRz3dqIGy70M0YYdWyvI4f37pK1Vopsy7yLfXJkjJShyGCwW9bornbeoWM0bawWgI5cOaSBaOh+PqZEfLmdlULB8RgWlHrw65cdYf5eJXmZvVn8zuXXefunG9zYTLKy2sLqfQAbUKklNaDRV5yN0RmjeLuuuyYpWvkDQPQb0DVunh5NQ6GWVy95DmZKGrZ5d8fF7AULkd/46yeovs+3M2Li0fTQpD/G6GfYE61+DbV+DMAGVqrhPn5RmPr5wZQ6CHQrBBje1cOy3jxuGfBA32s/MuLylicLOqbcaHkInxQvxZlaoTF4Rt5rBudIu9bKr5q/GAhlWNL9dkJH286L3HgWToykFvhrvBS+r44n7daxHNE4MKW3dZT37NtZFRKQe02tHRV2zpdkM5geQHDiX9IoRgavp5T7u4wwGwO7CjqNvrNFyMl5/SUoTr62JSwMBvcMng4zPMSwOGX1NxxWnnS05g0W0xxGTMg0VCmH9ir/EAuE2WgGroTJf3Zu8vWqIU8011M1KrRMqP5qM0c0vtvYUF3wwPe5D32A9IplbgdpdnUld0HcZ+xW0F+qbuSO6W2arBsT+mfV5xyL8uj/qGHxK4S5Hprmb4cXNea6vlLAbpqpwt2v3+EyaCEfwJl9rE6T9GMmGDisAOZPSgrWWeHb1aZzQA1w9G/Z2gCUhqhhv3jhAh48TWtLGRaaqXFQEfyM4xqwN6TzPookBFPJsD/v5ckav12eEZztHqz5tIWD4Zgxpy8sS4PZOMhJSHjyjVhOxYqXXsIE91ciRGD8eCibglCq3uHFsiZcFowYIpDWlbNfdMBKvFZ4t8gGLJPX7F0LKW6++sdqchUBBQl88A9zcha+fpGvEwBqV6Ig2F6kwuu5mab67yjUwxRjb2ELupZxc0a92xNzX7nLhiguTPM0IN+s+jBUrHBAK34LRy1vaP/p6otlVNUZLrZ+KOllfi2oEX1ZBlfFx45wHMxRdO4a52TUQvRlN688O9xzZgmJQDgwQ26Ob0dt6XxK8k8TSlHL5QrWhnAr0M9JhpFPRIrThJSzSOYLWWzEuy8K6Ng22SXSa/MLrXJZZpcsjohzoeW4oTgbXbR/2GrWRs/NbjI3ILglvpUv5e+qSSHkJVz9AFns4NhQNb8ek5rJKmt6uWnsTCPGwDJJ5Qd4FQlK4k02XgCwdToAKGTJMAiJD9DDEl9vXmbTxsixkPHtsTnZ1vekhAc5KUeUru1rtjyFk4xkK4Zz2xgfEiiDxyXqNVTX11IkJmr0Kro2nQ6SryudyxzxJYsmafQ0dJNJGojjSVs4Opr9F+ES9MG9vyOvlwbh6qw2BTkXfWBlaqNlQ2PdJNOO8bZTG2Knz7UFj6K4XTwxIlN+a3VeniKTpeqdvR0w1UmloRvuxQvLqHV1scsjx2Zu9mywnTk7fgt6ukeKG/kC11FKm69h5EWCBggwIZAA7JVvYNf7s9fZr9roqjo9WSzT18t40yTP3AC8O313rpC6bLs2YQi3JIJLOzhTXv+x1Fa9ZzJwZSjXCOcwUY140MBon9UCOugn2yY3tG5mbfjFhedjv+vSha9aYCOkDStS454C17x1MAcI7RfPApU7rHoYofx/x61iDtw+8/bT/pVHSaktnh0VNLVMwMRtKEgmLkwvmVTxSN+Wl51kMpdz+DsEhJ+aNnUtPGA5QawMsbyJEangf9Lbk8urdcrTjVwDxjW8WJJH47c10gnicB3y5zfmsF0ykaxwQ+caoS4vO0N79u3hPF+KvkHylMpjviKEQePxqG5OmcSj1rFcMnFeT/VWmfEdtwGLGNCJzgEa4qPor8TOJmMmh/U3PGwNGDLXp3Yq/pGsUTJFZODG+Gz03LQtef4WsHpUm3rEGSOqGcMbw1nV9Pa4LyYvbXPkVDsxSOX+i7O1vK2gkSw+7IlvLVVpH0R5fF15Fv8IpD+Ij3W9ZEGRNHD7u1+F6dbyXYLEkVs4GqKgGsL5ORLLcYOfwDNBdCiJkPahXykBOyF1x2WZ9HDgBaf8NpkGH72qF0lRb0A/JouXAvaXj4BpvXEekxHHH3wwJnURTxC/SjmrLV435rVK+oo+Oidx0SJ+eHpmx0kZ9ixUleKdhtQcLrYES1hjuDnIFL64vvWvPt4PlS93ohvjwfIuQAuWY8U1xxBmViL+AjTdHleDziC6aDFTKdesokbp9TY3j5f7y+7d7yXEbhwyvpv7URW4CQs2yIjak/cutOsYLYoibKlXVfayI4+uDE83hIOOvhJeeBfnRt1EGVOu6TjOq0d7pu/eOXMQOswU+4Wy1lar/cGdj87bKG5BDqCiFT8tNf7YAF4b+utliSLCxwrX4ulAUrCd6XQWCzGb0DdnSysZjB0twFhN374YBK9gLnhXPr9qxWi71ilGV720/MmNHyOdxLwfggO/wvE5Njn0ExGGzVrk02Lk1y432QHuNUiawtdWOBTKXy4dvjzI8ayBfbLRGU9zEBXK5QWuaxgjy4003MNXc7IVGJHAgMsUyBKxqhvpJGO9/3dMWCGvxGpUnimYmsqjuY2lCZiaOd0WNYtVQohKLOM8/62iB9xfiz9gKf6SN+hyaPoe7QIRSNdibUbyvoZbmZouihXx29ePmxs1AkofxZxNx8oWZhTyV5gRxBqAmO5Sv3EKDZczKrVsX7Rqy+DJiHEPJei9NQf0s1ShXU/cwCguds4ZuaMzgeftpr8Czyfu+gPZ29j2z3iCBZ084Jd/NJI18nGi2QnlpWwGGNJAfTmPhMQpoxE6BvvSsfHMbMRSOxTm6XD2tdJmqJlDNc30TybDkUGBXd6d0idpuMEUybLNsaQ1yZYieZu76shFq8GK9lpdCgbMbq3hdESv0qU8zod9HdRIrqvL8NZuh/g9r7/2cuNbteUsCkUM7Z+PUzrGduvt0txEZTJSQBEJCEhkbTJKQhNK/PvSZ59x76j7z1sx77i3/tutTXy9t1l5JeBtt+b9M6NJau8+TjXxIqetAxkaljOC47HkbQo59AVVCHBkJBIYy2CrtH6oGZmXDVckCV+oy72OfwigTYZHTPKgvuj50/hX3RS43/eWZ0Tlwj9sxsBHepK3pPJ+mD4OnASVFBJiHCtuTAwJvh0Tw645NMq21VuJWJvWHdk+L1dMi+mFanJfaO5GvCO6RF+/fAGXNltpx+QNAxYNblglwODqxJ3jGHh1NG2Ig9Jz1pnLOFsxoHGDH04ALQDePvDNhNiy6v9U70qKgotneZNZY9txml4y1UolcBji2krRTE6oZuvec2YlGtOY+u+Gb9UXY5d1q5ivUfOt8T3I+GA22Ft4ZgNkHmHnVHyD2rV0HVyW9Z5O8CDQ79bc8Cg5D2Rv2WEqWiJSwFd8yU4u+ZBtIHa25vw9Cwza2WCi0qnfR1TxTsTf9SAP1wZJfFQqle5TQsJt0YlhsHX79ekCNyyblO2fwopfwGpwRV2gWPFBWliddeEpdlggzD1WK4mv49Grdmmi2Y6GDLQ84K3gGu2l212bfCDDVZboseerKsRwksg/VCtq2Ha2dCGVMslivv1oU1klWPS1ebzUQ+UfnfCPU2qwhKFwJUWvJUThE5hdhSKC8cO3VF8m3Ga5AhTYrtQpdsxZvGQwJVQ0nzOCEO5lHQqH9s0v7e7mqq5sW3sw5dk20RgHD/kbmmbhoJ4Jk9f1qu86u3hFuFXbdn+7DCD+VGfA+0Gks5nNFhupJpaZ40IHYgogKAzzU04eZyvB3Iby8vjpx5mN66Bm0tI+kj8xykRUrMpQfLhgSK6TCLmgc5Nb6qCo0HNm1P94oVTcvVz1w63AeaDQCLPur/YJ5xHwk59Wotx1NTy/yCaNes6763e+NlkHuetUu7BpPK4N43SfjoBP3N8yRMJ6VeK/Zu8+MQXf4+mlbnKhGPnZ6xScwmk9yWwXD+PNFhu8NZ0pV5kuLp8C1aVHGMOv18Xa6TWr02jo1VfcANcKBOXs8nn9G9uPp+sAw11W1QF8lkHdZP1k9VRJIxla734OAwbGgR4NlKWt/n9o0jDaCo+rbZTcSW/2Rndo6nU/O7a8jhg/arlPBevMcXOSaqHUUYU1g4twtMpsd5su0VCWf3ooWCPI/Xm/k4d24fo0TE+2gmBLiZC5LBauu7onpkJH6h1dJU8lfHUYxRzu75/VpDEAaP/cief0x/ra5E42W4y3TNvHPEpVIsbWoWCOjtUmyhLEHn1z7jibHqptfWN5yWx5iLB3xW1L4VeVu2R2qj+OrRCPWP8KykLXt/eI/Tjd5pvRwWYXi+2TaxKub9vi6eKt9yvZHoJRY1mCT/oKE6HL+YH1/B4nmi6nM85QaQ5UplqDysrXoXS7YScyxWVK+EKJI3acd1HTogk8Oxk5vK799mCmOieiMiEtAbLYB7ITuYsOKbra8gFZVM0SCA2P0tuuPLtdilBeCLyt3lZSxuzmKzT+gA/yi6Y5ZWuwBq9XxPTnBv0WeEgc/5n1ty7670tatywWd26rPSo1o1Fv2BJI6HF+2/v42+OnkXXGFn1YPfkzK5TH2c8MuR87IoV6btmvidjZLLjEdNNp4w0fT6eLiex6d2p+XzKcCk1bxe9cHL59LE0HPMzi9nsUTSyRajTb5zxoJAmtYWVR14OnlqRttxuLnVrvUPrCRxmZY/TB0zxG99K5ZBSKywGoT6h4T2JAVfD0BaMrqws7t+YR4zL+xsYqqiynPMXHSllQBbz3kvVBvpaNwtdATfOL1wmkU9H6OKBShjTg9VwH4Ku9KQN23LWTaADiGwffeUo3Xxo/rn5qvqbaMq2O4Lj+N0WjL4IfiemRhfKf0AEtze7mixWmyLhL22tWl5u6BnhB2s2UB7X4LyNanERXjrN7euc5JWJI5oLfoqV0iGrjL79x1McEZQaZubJ16QfBE44bQgrYl8v06nrBZxaLNNlHHfncFruWXrpfhjtwqFT9BVWfc22PYYHVamDT1Fc+yIVITLX5NQNVXRx5ThsLBOiD6mkOCvYXareJVtG9dDk0FQI1iH8CHmzEqQjkZxV2u4cQ6q3uW1n6UVUNurTqYSvCJ/j0lNqK6Sp8XT7ZVsG0oB2gff/OjJKK0Dp42hIlabLPu0/HY4iRYI8w3cVscOcneJLxwppW+5yIZ9X5SZa2QfU374aui6zubfk/HjzUSTdxTrH+IHgA8V2cJezD+NclUJg8Ii1sp9PHX77f/pQ6YKmmGZUYXNXRgAeU0PgPfpwl7YDavZRXvalYCyMn18vIJZt0U2LVFj8B4KjL7RsBl2bQ4iIVwplDusG51ZjD4MC3m4+TGz+v5b0NCGwcEWtjXM9blSFiyb1UvjM/vxlSvIyeczAdvu8N2VXd+0/xgTW11Hi8rVfmyOC23WxxlJEoX3rOeApvxwQMEM+OTd3A4LBf88PkY1mzubw8kAe9bTW6d2t0gQqVzDaV5fURCSy0m4Dh3droTpgCvX0+pqnu0umhXzFRIj6vTnGX42mQ+jshZNArTN+7hPPUM9CYtnkbXj/hiGwo5XUNqw813giarasxuZK3ybcuLzPv0Qsrsdx6nWbNW3/tm/+F7G3PYysOwEryrys163fOhBa2e2aWZCdWAFt4FavNIqFVcCva88eAMboriGWl9L7ty760duFSa1Ntn/U113vwnw18qEF1yfiQqbYje3v3MMqXt0ulDOd92VCeRhJ0ZmKR2oF6mpjXbPN3atF5+henGpgpxsQl7gvK0eOmjGrjbmpga8kAzmMqBO8/4dFmUinSjXbQGRacLKuZ2NrDW2MJ+fzYS8wY9YQZm+ZJlJ+wWjpOTQma89TzN9uUrQHKoLV8C8vWKIdAGrjfyFTSWacWs4/Q0HLnrrm6AOhzIucW2WS16EslJyu3e/s7FOMq1/twEqNUGMoqXLcHtpn07dNBkkWiIfa5nov1dtG+vMoFLZ8AbGFNlN8BPY4eRulFtW8k606S7a3KvNcaXb3Sj1X8saU0ee1o7PpnV0gT+80mvSu6clMaBjHWkDF3lheKbvZQKnwlmmsRFppaK4Q9Oe7VdmnayJRXQaCjDRqjSR3SrdowcNMkaX6xALQzNfPnI1aHU7bdfDpShqu8LywoeBsp661VBoVgDOdY2lGk8PeqWUCnshwo99F3Ov+pmB/PEqBDAEYa/VGDDqK7FI9EnEW2jcqO5fGLPtMjrZC8ZxR4IRSYDFRf2FTLJ4kKtHucnFCO2Mysh63YCHzUTsI0ypqQgbBrFlOflJVFjx7ONE4OtOHOdkQEPyvqW9YXcUNhCtbl9WYlmR7eJDlJ3P9yvX/fjVgG7uZmasstMRvWJJg0E04U824odjY0eSdUSRk4Su2T1Mvlz363MCPcBFkmGDpsjJZBDBtv4Vjb7qKIRc7x8aWG8s0eBV2xtPCoqJtGq0is+RWndIb22PIhouXDkllrcHcMC9/4cnoXDILNUDU+8PsU25qzh0j7Gslpgl2lXMxmmvxF5FC9rWqVUWdmowGBylSIiWPv8GvK9U6YVyn4NWDeuo7LcFaK5aMAoJL+03RwPMVaNRLFHrTZvS1OBl30y2dBIN1EO5e9Nyb7drjAQizyqq2EzCeP8VjPsSVYdr446f/5yYphcDml/upuZxi2cUXaotK7sjo86KyZO5+qp/CwCJKBpuvVuXYAF+xCRQqXN39/LXZGd8E6p2KbCrZ30+WvR2o9uP9HWuvDCA01Qe3x1fmabQ3voIc+Hd/Zzr0VzRpmGrfQDu7HRo2nCBuMlorvYZy1c4u7bieXDBtMb13+kY9iC5pWaiD0eKsJHrgNuaLSNlLvMVPJPvFE3TWbj8rM07z93fvhsw9ZJVCrVwjxgHyiF2YaRktlwwt6I1Ph5skRS7dTlukqRPVHd3sgUQ0/ool0PRVGkaaykvtvYaTuc+PxajjoWgmT53Z76sjczgkQ1nPkUD7EvCDEu7oK+cTxwkP1ikBPQvgwU0ej4UPYGRfvS3eWTNxqFKt+IYLJ+5UlZZGx3wA4wix+u9+L9VgWWZiHBS6zFhtXV5Z+Ot6otXMh7J2RuJU16W1XO3m7alp2fVYSL8su3Os8Zznw532o9bW9reUMRxf1vaYtxo/nqWWFaEE1sP3EbYXHE3HyoonzvxZscd4rOLzYlY+014u7LCMzbBqN5zBjj85Drmj3OM08zaNhsGS57sPgxnZb8q/CP/ozbptLPk0TvitPqXWXE+F8j9zT55jUhw7wZ23uT1RymBFnHJ/8LiCMzYwdo0IqVIybNRokSVgLuxO1GELAAdHkb4D23k7GqDbOfj+dNOqsVD0l+N3JLeoEmV7HF3lqr2oKsT8scvfIKKp0bLLTpKs/7weVKe1KtrlgMaeJqD3QjaoMs9HQpe4SgshCUboeR4XhfNcei+HAj2L2WenR66bfnQzdkQjGw+A4Awfa1Sk9pwIGP5bcg3X0Jpq0F6jmj2GahaFwOPzYh0WOApGSGJCtbZxInKZGSaN2HqpGpvd+pYuR+5sem1vTiTedDy87ZWD+nc4pd+N+vSCZCaDI7HWs8SpI9O1v6eXq2V6NyCHuOi7bxFbHaKtsNs4VLp8Ozt2lK32qUklx0mhn38UIb+wTDiXhTtb0WABMvgq+IWMsNbb0IkfMmg7Z6u3oVJqLuW8Q95UoLF+e/sCrs4q7vpwnx3FaxMiFlkM2OLMjSh0bBhnnSEMM0wBoyMDq/vPgjUaLfwy8btqnuzwuoJGUA/q154lysp2PhctCv9j15N1phQ62HXccFOym7I16btdL7SU098ygptV/h5d4m1atGCMPZkkYkSKfFwuSHx7f7WrSEU5Z1e9TqRCosHyMMuOnFMsTOUpwO5/5465cQnPNY3y02+HxTDXDQ6MxFgTHMk2uFh4NhLedJ1YqJd96rvF8kqQjv6M/DRefm3jz1izBQ/GSjKoY1ninT5UzMHpp9Cn1+Gyej5sYRZPMWgI6vkjcufn33dVqEG099VevNNS5RF1pxvEmDVw5PgpQjU9qJltlRfjAvDuJfFg73+rMKm/p0TmE+a0iMq/EIUCvri90T20yodpcBaEt0ODxZS6lNvJ6IQTFaHy3syWT8oZlVk1w+n2OGOHnAfMSJ6spltTSTtv2OKgy5X9ybflpSxKuvIkGfSK8MX+djFJ0ha2edN3OXCxwiZK0aqCtwop63nn03C2TJ/v1QU3hnWmcHoGaJs+IPcEtRqlELs2d8ZIRrV4LCbVffA5t8ZQjNvlxW5filR0fj3ogkmNSV4uktodHUZmFb1P1VhzmJ6/s5y3qSmWlRN6bgQrY+JFKDXH3MflyC+1sfrSazC1tKwQqYmVij5pV3tp+Jw+9c2t6u4vsyCq0Ed1v2d/zGfDamCU5InlcaHnkvjELh+v68ynVvEdB0F8Pt1R+8m92QqnXWmHv0ZZej2VoQLRXM3gv6VgpOsVMDHlvJodsDsBVqUSJ3k7w96q+O3PgXIy1aqOY6E+v17XXPvK0m4RXjAx3XtZA91vLva6hlAPY5u96EnJcMiMSU9MprLZ/P997bb6Trk+sqZDQgMrUYjgmMvYdR0U160ML9qUeSidZxKU8ZwPtRKrhJdPAAfDZ4o2u1jRM1oh3WukpStWPaso5LmzWioBdmSzgqVRyrbnqjs5S2LJd5ttT+ZRPntWhDRbvhVoUKU57ixetUMt4ad2xj0gdBJlooFby6jqKZ98Kpq22xbBNMq8vlK1at5Jnlk5lSJBA76qap7mpfJYa2q8drjZqmBevKAlMhgZmgN+cuRzfIfGdF5t/G8iAVHbeCJ5x3Vw+vbj4YTI0rGIlTLV4DmTC6EW0EDTzwkFjSvKZURx7L1Gy8F1yqV0LHXpejQOrD0pebVgi3xdjcZp0vEUb7hfeYmbfgqHfN4VD4QRo2W0HL7YsvAc/e1aK3Hhz+HHear6qcnkf+A+lOFkAplSrbQAt7l2SNIef/frkpIuAsCKJphrQM2KEch9BIFvK8wQqGbYZmZ/Fwk971e5Fm9GjXd8S9TWzibsqkaScw6dNtNsbbwkveBTXnUMLcWfFjK/mrP1AqwperffNdLmyTl8tYNOaKOkZaWor6qrClsLGbtE+cAUcNG07OxiEs2L5MXnxDccwSfMnLDUt+MkY3uWZPo2TPhzuWIsvRml//iGPW4sgwOwX77qGW5FPYSgGyfNwiPJKTWVFp017fQccbCIW2n2ogAVxV3nEr9+nmAWSdLAddr3oaUkEdj4LV8gf2Fj7J3XI1pxESH2YsM/bWZ7DO/fzV2qJVqw5f+8Gpkh/58ghJqPlWdSn4VJLMWUE5rsdamcC7i4/Ut5dujhPNQXmUvevZuT0LWdEnjZCJw9sTsDybAfL7jTzUvRgB1iHt0uW3UhRMj17OembzGlUlnLWVtWWSnjhfnXDGpj7GjDZRTKgtOXr08rDO1Ysic7AI7LYcuyVQ6KXzlkEdHy2HwEbLrEEtqwdYw6hw26CfjmSXQxfI9bzCtm+D3TQjF8bAdsYd3CsDiVpr22WfKnV01Yxo776j52Oq0QCbPw69mu2aEBqJqEcvBsUUQmUrrSJForMslF/OZPDoBF3+9jNH9Nbbd49bOLQWBWYVYCyNw9l9ENrl5TpQPEfsWcZCT2LG693363NgZIVTzuVmUPWhdY+tAnLMrkYUChteLtwSPgmqwp10Z2qYO/iiX+iO3TjxEx+GaJsFV16DwUk4ZlvzgQEvBwjxMmphSfe8/QdLgSXzkDLbVGW7kA4K5C4uUHxLKfKZixzVGkp1mPXXR0hx35dv8eq1T99FolCsdrpI1UBXazgRvCjUfse3ifPlKl42X7PjWb6b7LsRc+Z+/nmsxSxkeBH6gKUdmiiJcV5mu6NU4q4MFnotylpsjId73T4civ78AlmKnKeobN5TdvuX4KQRqcR5JFTwmWfvWa3MS+g6EGMXMOdmLJ/9rlpJMxQm1+5BnveZ3kg7uImVJNVNQjmUmtQ//Gaz2blC1qZmzb3uUgYjoPx+UVLzPmL80bdFKWvkXT0p3m1PZ9WKcNaGK/KRF0HdpduoFfa9pWXo+Q9kiP+Ic7GA1GzOS5s75HrbQZcDNFkMIcCL6d4VaI8PUhCiR5KrUI2uHeaT6deelYMa4KJ6GShTwY70ldX1cLFv2iMN8JuuT1W4Kib2bImJHehbqu3czmDZXPJ4mFmVwPUNFy5NH/z9qIr9OHsOVJqD1/rpfRWxo7CXphFgDEWGbsIeQyUCLF4H6+nUMsjNJmGf1/waTJSQhvcGGSI2wKxlAU+6TqE/0QLT25roOXK61Sa2ndO6pPmIfWgUGLbAJOENtv1mtigbU6XSEk8cF3UhxYlVm9DmFk8S3irAnu1u7LqncIpZhT0NBegDm0y/TQmkxbt2gocase5WoRLB/N5RgaZ169qyriZ236ZONDJW3NF+xtiM1kJh4uJjTWS3rIWmNYIB4cO3Tiz4Cl6bGitH2+TDpRa2u/oJOVUdM7Vw42q2iGtJm2mSEEovsuRodxTz2KFAp2NHmI2zYLdJ9l1GNLzrL26iV7N747Vg0Vob4MhTXEnzhFZCc5e/6DG83tjxxEjfYXGwma57/OGwcZGFqhqlC8Wvdm1LhutrEuY+Ojo+6MDcsLpMlCvB53ZvEBobZJCJnFFYj1OApHHNtqvoPYKgQdz34/CrIzAONVIWw6Cfg8SgqWtyEW/Y3yF1MiXh0JM2NkZf3EmbIPsubP6KFbLYfp2FgHK20rUyrM7Y3oCdEEaLFAwzNzHO6jkdmfUd3U9s2ctUtTAqPkVwBbdmGsEhS4/KE9vrw7obD4VCPpKmULfXpbvw81uP94MbczbQrxYbfjjZ6lq4bN7E9mhbmo9DwPZiqTZxPHDmbq1gOz05fYOiLuViK1K3PUb7IKWPzOYy+NTB2OAWUOZObA0pW/QNZ+XZwqbmC0GWYdWylWbhFUIbLhOVUG1Hfca8tV7cABqX7j7QXc2n84nX028vy11Ib8TXFlHHx626Ghpk+oqVglKhKyGdYqsxF1TOvi6FHY5a8Hbj21XIxuLR5E2QaF2Gsu0dwQIyW9g+viKn1Fxk+Xre2kwJdWCYxF16uZ3gIihrISdMrCiMcs0S6m9u8bfFq5wrKMVN0lKl1DUxNZsmFh0711ggJFlcnnE9tCAnNrlCqF5uRvdRXxDRqi1tzVqTEySap9+UBavzGJOtCHvpLpVxEvaETE9mJxMJHoy8xWAFiNceW5UGeLKYoQxy6fzkF1govuq7VqpWTvVThhKGNzREPwFxjU8atZWrFIcNXlL0vOnfeQbWDZRlyusr3pndbSRHzRHpm22EPeAV7SwY2vtREI8LnhEXt1ou10Ct3/WEEiFo/lPAhmjNrIwar817bcn2GjIj0fw4ypJVIaMpYPaPy2uyRdL8A1qp188KFMvwo/rH5tYX1EsqurfbPg3b29jiG1uiQ4vJl6deooyyyXK7q1iC4R7St0z4iGhD9yGTqsq0HeEwyuH0WsPk6ZH85EA2x/Yvx8pwvFZ7HcSqIMDvzLyuq+T0DcPog22Lx7tMpl4ZcOXcfupN5ivD9FcgbH4qhc31Xj89zKl73Fl7Wty0SgV9Nk55hp5dCHi5kX+MkxMrfEYUosVz3mUJohw0RLIP2acga51HmKKVjxAnnsQ4Ipxcfj7LB9myvuns2dL7Yz1D8lZZkekVPCGziDBRCnpDFW71sVJt7qBnqrNqi1fujsKwcKL3CmatGUK3Swz+FGMDhW78k0wNseuupxGHma3dE7eoU6XHmwZadxByvhJu9TKRUpbcTOSmxWJ0gQsypYLxBjTNlMt/5QjRtdHFurWhfgFlS3eiNsem/aQIVCuUIEtAcNz8+FUSK8HGNfqH7G/I+SK4RREzsu+3pmK1HoWU7II3hjGR1uY51Sq5bmYaFA663Cef35Pl9UTi04zv5UOvAjSr7BjLURQ/C/mjtvrWyrsnY9xXsE7RdZT+uvcWsdX5Zd9WZIxxycx6aYbnk4ViZys8VZpJBsJLHH5m+GBb0I8eQRSFdd++lIZTmMnw41y+Sek4dFs76ElYBWAO4RHzejHGojS+kNo6ZZtDmw0CYFv7B/laeS+MBhgNPQUT631jMz4gbZDHVx3kuyXKtio/ESNwnvzRMFS+RPAWFKao0U5g3zjeCMKNQOWs7hHNpAjYraZv7Y+HHj1DC7dP7CT23MJmK4AFRVhuUQWyH82wU1nUTY4F+Ao6Ex/8sFLgelI5tWFDNvZIIojUagoUQyxBMpAkrCnbyZuttHieed+NWY8Tf6hpuMcB0BclGnowaHlDF7I20nLvc9hEZ5tqkmqIf3NSmWaJXll7aU91oAUlb8piy4d6mlohwmQQ/Mdgv6hiY0a5clfS/tu3rN7U88u2gEZ6IvrSkoT37DU+LYWIEsAOXblFlZPjIINZMbK+SnkRqnB96TwmIo12Ob/SKDWfap22OSIsQAKjy3mWa1BWdW82zIwcdEWkocPPf9hHUk2oWfbGbctZMEwHMybaSmHgtGB0khFJfNIbPHfrGdd0yHYCz4hRpFLILM0M8aygT6PjabNYrjKSX/J2tYm53oYN6cdHMh+bWv3nL8MKJE9fl0pYOFtJ29pV0tLIWp4dn9UkWJis3L7b6P6hOzSDDN/3XVeQ7m9Pnj7Pe9W7+NhTVntRJglZxqvi0mwUL94A0ylxbWgVV/h07TlApuAkfJ2N1bCl+JseqeR3CLxx4PTkiLgXSB03sP70KekOJ96vnLsHGDVGCc8BWfH56WQvi/aMQbm85lwIA41aSsKViepa/gA7RBjbfmx7m2OauHnS1GKg34umkJAMSOoTs6+6G8g0VQCbdml3AlbjQ/zo5ai/Ra9HvPmo0yCCPFmBYFBOkwuTpfp7sV1/hWfTCeUwJtSoTL9sWfuRngU+yw+7fjxWUXcaRLQJIf4l2MjIVmrDBpSyxfM3TxwpW1CPw4GOtGLmszdvOa591DbKRR41wZfh5YyGzLfKhq6kkceCKddmd/6Vn1ky1xy6rHQ9e55ZhGfUsMiUaqn8va1aRyDusKkqoEMSZXv44tzpKwiVkj23wQf9170gmqogTbNmLxrXrTxJgMaaOZUTN0iakgrLLvXCmYoVq45idqKcTvqh3YhBcUr10vfYMK0Wx46HS2cRN4kGddMX8R/gkaJYTN/RltjCrhMpAoZFSIRp30JxyhXqrzeKnh49pHE+VHFkbS/YbGwDv+BghykKeDzaoNLVcPlCf1r3ItOC+tAK6dkH08eUKp+OtHWuTeizTVgt48cxlSbl2oCOeZ/KzwMyjtVjp0gsaPpxxyaAfwosq+M2Z4APe2HH+OegVHit2WOlTvWIXX0f6m1Oz6tBPnmLYsYODnrOdguVUJ1f27C0heVJel5axlmrhJ2M3GKiU63JPluLrq69abUJfQK39iQIJTd2HhkE2kHlQQ3cLefUwB4PxtbiI3ArX2gOqQtmYhejJy+wi9Z621afL+bsBWojta6STVQSyWBa5m1cPHFRQBp5LDOyQrP7BfvOWlKr2xeXFJ71t5JshOCt0WSDSILRpQIwgs7EXp95diId+H3h+tsyT2kqu3DnsYeWe0DwvUJrgNC/XYMqa6MRoNzh1JZ8lhuQJHm54XhByyCk/DoihYYvPfJmB/Eh8sqcJCpK1TYpkOiIB4KY9m7C7gBx/ouwb77STq+n2ryhfO2udSgFAw0bcannEn2ueMtl2iaWNHHWfnZ7+t3DlLY70GFG3DmK5qphr8E0mtNHan/rQ9VG3JE07gGfHRIW3Vm+NuxvNKhunN7PN+A6T272BCNYy0lMes1IT4Oo8Ue3X/aBILtJzeyvW3af1ROqXH0GuZ27HgtVoq14GwExxzI0oXarcjE8D78BdW1chFZQ/6yPNtDQpjviROlpj3iVm+FIrbKGfxMS2qwYWoiGROZxqvLtduHr4QEhR1thv63KkwslJ/Ie07JFUQxUrnWM34z37mJogVh4fU9MCw/3ss2bqkLvSedoXLjv18cJvlIWY1Yfehruhehw5SHepFPe8ITrmKnXX1YMTOs7O99URLkz0TazOQ02TUuxV4mlqoL5ugSNxfx2vugs4dBGSx8pM6m8fxa0xB6VUnunTUD9FFJAnTGnJc0PvlpaJHolVIDEjmdFBt7hmE29h412rlDooylPBEa6W371XqYj0dDgSUAx8QlTI2T0cfFCSyHmm3hz3GKap0Ci+a7nS9Msv+fZb2ZtdRjBkXgoBeQnMMd5TwBLNohC7PNR3VDcRVLpVmYSWgtZjOdGXpKp5fNYs/Jx8zqIqhvuo9OvFEiHbc4FWc7fcIyFA+JiKAZiH34yKDfH+BPqEUU4oSWtJH3xE3jXCm7rLaawJOAZlHbsirAtk4DzCnq1yV3brdqIjmG8QMxGe98P/Y74dDzMPzekkLvJN7ejWHSdDhUce9teLh0wPFWr1jsPrw2Nt4cL13WFrG4Th2scWE0xE+33H5DFleEn5LZXEcxkyxv8iLkefOgrLN6d/GEZ8OzsfReHWN81NAut1O1cljaACcVIuB2oOl3h1uovsww2UlbH+ebYGisWAygmcOcxur4B6KFaNn6j36wPx2M1CkyDI+NA01EIuIkeX6Bj6RVPXYZMZaeuc8tyy8/qkxuDkJdoIlZ2VUqegreLYzHm9pvdFoLitPHyCIfQhQxjNINs2uyoz0NHco2wIbn1aonMXTFB/h1Ct3cgniLdzHdck0EaC0ZfFTM+FGJ75rd4etRshgsIlX8nOX9llt9/hjZrKft6dT07E3xrZU8t3ahCstI+cH/f8EyFSHTj1Z5GisQ0voMUHmpbbFyYmUWXWo09xpKznk1o1SORBWnNFJAyG4RGH6LrOhPa5ePb0V8vVTzYdJ1uBLB4Nme031BpQ6taSfb7q8QVI+Hb7dHY53SPuo2gw15TvKYtKReXWUfLhTnjZU8zGNVrrtCZ9G6nucp9qf/RL1Sdhos7ebA+dgpV0J2x6PEcLTvQhOwxieW4y7/5rr5pXOWQZ0ts8pXO24DzLKTxiSoRuzhB2rmHEepJeFozMRr3jxZ3tXEuUTy3WPDu/rQCxOb9OmR3h+Q3fhU1rekvfaq9bMlZPhKho7Ujuk8j1fhJLUiMzqhqpcXZH12BDhCtI0tbYbFBV4OzaM5SYTaNHeTAYEzEfF94rRII4e+TncL+950ncitdhiAAB0ruyqgWK+Ys7beGxYTiZaDZTZ4TpTgNY6yjjvmIB7W4BZXI0G3wfeJF1RAFeOJgAr7lPrOGEpI2PhlbFtezowdEWkv3v75PqTSSuofyiHnTz9XMyUiJxQnbu3XudYRVPMMh+PXOnbFT0oNPvOImvbF4tkKyAG24lQSAFC2d1iclnZhSKLVyztjawwXZV3Tzl64dN0Pkmermp5k4viLoQnMcr+Xfm/lhfvA+UbTOSoqzS0/ufomboJ88D5gDCMV2v3mk8kqdtcVBUCyn0C8ZoDJkwpKwzEVH1JWey4eLP3zOH0Sk7SpdLGR3pf0oGzM1Tbc0wb2+p/oqDqQuaYFjfUeVSQ5DSzmrWHlrjkMJrIHbb+sUPMuZQSpmSwlHUZ+TTjRToxgKnkyQIk1+Ov8DoFJIjV4rgtiOw8hPYhjvmxjl7VBhA1SLYGTP/jEeB8aVclU+eRGOB5EianGtVIZRH+2SBXAzP1mPW/zLUIpB6vyGOv8ADwFCF8msa3bRgbFUOHsSNSoBdmZrRXhrUWhgTjCCUlWq98T3MlNYIswCveb4vDswQmWgWBaDllO2nlkJA/4Y2bLSNg6vxgvhAgz384spOqLMgy683ZsW2di9jYlixNikkP6MjBnhfOeW9kM2tmVDrUb3kVgLvW0EboTPHhvRohyPUCP/Iz8tN+26NW5+/Bjm051wn8htcUxmdUHFK/AUu9s4f+V2k/yPVW+wSKNARCXNKszYyeF5IxgvRrbgQoB/3VUros7du777HKps4Asn/ZiNoT64OEXkuTD6o+dkXAmPqqSSMLD4q0pPYMvLisVUjAhXTZUMvnK127VsF2hqHJxhswe9J7eCkYWhpdnfdiSkyuTgh20ZsZGz1zN7IVHDhHokTrRqmZ7u9i/pYMXL0HegCIYXPWD+DT5ZO/huyHZp5/sxLg6yNlMPDAGguAw9vp41ghRNbR6Ctq3kA5CPFWx5r3NFd0bi1o0/Cq2ov+cx8TqcxVWDTm6ZPCHXzbwt0uIsjqFluvOy2PqDAXVQyns1R4kB5KgOqcJ6NHLvIHmEtFe3z0ZbKrkfrMUjAhExLeUGJO04CkCrtWygLTKUp7iGxT6E2EpzppY3ymJk8cKJx2axp/XN74l6vkW778EZ5tTRKFSgfBXdsjB04GtxCYqvt7xm9xJbi0Dk09LPXa+aZ2efFqAG9lRJttdlzA/HM5drtzGg3Nza/LLeppLPQ2zyOrxzHvxIlNvl8oKnmhikoIwei1rqqEGtvBEthjaU7bP2TM7sDfsTN2ZPOM6BUYF2Ld4FbM0sP7LIlWpjnZqSxUqwA1COyJ0l0hh6gEn39T2V+mbziph7EvB5Si18npl1OJrL0ZXF2S2i1Ggmca9uiSN7d1RxK48PJ3VFQ9TyWaqkMM+7uB5r71JmrJVyQyKibNrLF7YRmnzw6GSIz57Bsz7eYkKnqXo89sTIs22lv7Ee4C4z1wofnQnaqlkdpS/6StIonTosfk9SKUvf98Tfd4PL/3E3+MzaU0YT01hzwWH5ZOYg7Mpfd4PTn5a2cHwOI/yYD/q2w0fK3g7/1grsfhuLovj8VsR2CNsPjzctF5uRUD48lI5hufFbeTxX1u5jqUAB6+2Ng6J8IitivryGnt0oIyE++Tcz/vOKcvFPeDiZHM2V52vjfwLLv2HpN3zqvYTcnTl8VfsTTrzrO8TnOaw1xv9NM2a/4SZcywK9OSy+KWU4tXE9h5Hxf9nnAfb7WnV3BQok59WlmPmb8hSdK58GmkHamhV688D2W1k7KE0nYJx3TzOzIJoVKoX46bLyKFByzFzE08PxUVCaboQUelycbXuWeRQL6hE8JVe1JYH9N5v3/jIjtUX2VpadcWH0UfjzAc1BI+IuujxeFRD+u7vR/Q2XmpUSFBblz079nf9rn0f/BZZ/K2u1+qZFnCvLnf+bcu4m3o3Kk40No0qmL2YeyChdOoDPnuS/w/xvm/+8Cn6p295y/ZorG/U/lcfRxk7i2xw+a/x3vW70G07XajvgzzksNCTWKMLkHEb+fygf/jajOa4jy/CicvDh+BOWRojg93rM6eTT7YYzZPA1+7N7FFGfQOTfld9+K8+UoTj56d2sz318PHm+/dPmUnS2afuYw2fd/9lj9e9w608YlGeEqdy7BT03EobQn/CpZRBetoak6Yf1f/p0/xvMz2EVH3wCnLHJ5Dgz+zEI2N7nsMz9V7jzW/ksjP/lGwsLL3Uamyv7z8ziX2dwJ7a1RXBzZa2R5N2zrIwdhqclW+pszfFN5P9uRmOuLCRLa2v27NyMyOBhbvNsgUJ1tfDww/P1bzaXs0RPMHe4ireYO+jNz9t/POBsTAf/PW7Uo5YNqzi3+Ub7058fw9C/bOasS3/ZfIz/h81Sc9sOsTZFVDQ5vvpmmMS8VIkXtKPLaz+paCr+ciBN4MWp3OAyo/S0PoWK1ihGSm/a5VTEtD1ZGw+tD0euVY+ojeu/DiuyAUhDPSdrxkcP21Ouew5p2v445sQxfpLtjif12x8APBTkYfvrXlOYXCreUDMeVUBbKYB4WSaklysr/Ih13UxItjLFtxW4S2PDqP+qWVSPuXl60oamsMs+dsg6ro8S6dNaH3U4cTXeDB3dHwIAzAZtCwdGHV6EVIKcB43ah/ggHjckoQUi1/EwSJ/U3xtydOX28SYfgcfVtfv2lPb3wEK8ZGsYs4DTff3Rnwj8xtFsWO2cg2y+WLhYAhRElQnL/V2tKeVBT2slN24og5FF2DNnbwMbfznkJfkZ1GUTtv/4duAIyEk1teQt+xYssu21VG2Vc2NgAL5+iLqsnIBW843IkrIq2c58/pkER/Dtq1pVOp3vc2M6bU/Ywh1znVC7tCO+p08xdK2AlUT3Ysbv7TYn4+m3G4WLLk47vW690R52wjfmraIb8qh6PIZ57XNBnEeX+7Mtx3xtjPzYgxtz7xaG6rBe47sjSNzfMEfWZmfvVekNDge99mi4HzA2M0VdsX85mSE9EkiSQQJt2zvhqzxQFwU0XnucZRUddojNCfRl5RoSKTSi3xwB2thmnZ8juEaLrPLwuvzR7Y5a2q0wCk/233pC3TxKurzO5nCIe85aFm6h95HZIXOTOjfdMw+2++I0Tp3XbF4cdhVfVeHyU8Chs/Lw/U+bj0JZTC7VK8Zb7RPtQxDUDpf/aIDW4f57tgM2Fk42FYei66F9DGRw/1CUe9WxZJNHJ2/XH6IwjKdsU0aRCUOthcWnhxtT44ejyfmDOIQuJT3UC6GFcUt0jfZ73UkuzsFkFtcvX9eibvzh0qmERMGCf3O1rJFseLHdMM0doxUogtZe37QTEYcNrBIwnXmnNGLpD5+E96qJnzdlO4LRWFSn8qylOcPVT7MJUpB6h692KkUi9Ji1QLd//GSSXsj9eAED5QJQqTdRrzHqFA7e/cIwOlXwBzsrBv20bpNclhX7CTnBbPD256nAn5pkY5erMs2twP7bKml2IkTqnC7Hp0/o2maz+vIlcM1CTBI5uJvWehcYEzLbw3RdbNFF26BGmqXtP8qzcOLxHW+1mhdPB3LIATaqudtIVF0CP8KxRnMegw2wV9kQI7RpZBGpELzGy2o9vPC0uSKCPWs8uVftbixLY+UDxUjrR/4nd5obi964eh/SgeBjcZioTq7uH77l2jPNkv/SGhZOJVl4Y9HimMKsnuXmb98wC9p0yh2aM+eIXkutbK6pI5Pf8Qbo1mVVk3rTAjzgNPy3bxS1uIkZWlve0/p1sAndXu8XpvGivGabvKP5OGpshGikpE58vY3BVG+EqYNafzh47phCVD643nBOdSEofs/zguiVtXqnznOTzuxU+fSmgJz4sWGMatpt/0OU8NMXxT1fm04sl7325J4fTAcjEuZL+asx0TCM6FugGCbKFNhxTEejh29rj5QqgPmAtdqUzqWqquoNn9hDGX2/J04ka29VavYnV0RNpiK2e8+OPpVqkxcbNhWODAc8s5PWimpjet/fZ6w1ZPtj3TpxnWoFReDWLm/s2QkFWkInzKtxUSKrM2sJ7qeGF+IjV6Qq07etElJ+zZtdiXBdHzl+DWrCm/XLkQEybtsqqeoyoMaVHwjWY6u5YJDADevsRypXbQs/7T9+8pVaNb7xtV2KEptkVIkBxWwZtfKXy0a8z0ePQ0Gl5HVJMDz0p+XDTtAkKocECcnLRUFoKO1oMTc8/MAFL5AONvdAMPq+mGBKtWrx18+TeU2J7Hxf0bTCSWFAdiXJjPG9nZofSjWZ7pat0QjzWJA0giXbyy/b2twdjbvURzLkgTOxbdZTEjpK4Q03QGwQiRbprd5kbUygtfja0ebProEyyN2x3FB/Trq9BJjLjknPQ3I5qYyZqbbH2C2Zw34PcL25EsuaU46NtCI8LUleMhM1mkihReke/YpPOIYgczSUQsA5MkzWxafcoQ6Uptv5Hze2sOLOZfmtVg+virZ9t1WW2u2WbkWkrdFZX9PLLv/Wzx9MDHVbP32zJ3tPXAfiwprYpDksca8nsE1j5ZkpAeJNodLt4KTv12OBjIHK6bemYMPYXiEoTEBera1oaxRRaVNvB2NMyYLV4e4E33sBXGScb0vPlyI1OrL2hgNGFpsxdkd77glj1FAPxxVO3Xs3Gpb6zrcN73xNb3zbizeFw7bJbTcy5qRXOGGv1NlIbrzn582W4/nP/7psXwo8MnWpjV3CSJ7PV4bDuiQU6B5EYPn4kCwpldPIsMldcqN3dfLl1OlTFGlU/2pri9K9VK3STJUdLofx2Z4mJqYj4bgLjIYnHX1ijpjvvkBSas3yic9NQTsZafRgKom+VhYCjtjJrBSbOWofUX6J+Ii1E5ebv67JWEx5Txci3dhtLDx3XEnIx6JezPUGxuFx75YOz8Yn3XlAFo/Pfe730YSdeG6lYftWINpUaFz4aJuu2nk0i6kj7WimiM792WAs8kd/7Htz/HRcv96rEOqx8CZ0UHQypaM3zJnatbG4+GBXo+MzR2Zawlcund/74c3uLIOWmbGjjBVKpLmB7EQWKt/FNTsdNi66hS39WkOwRuo+IcpSE5Co9KMq6WiuUmwQSG6eNp8GqyTHjLBBMWWDgTW3ElNsbufx9UyvbVPri/bN6H0b8JrDCYisIzfui+UP3sJ/3MVFywykkZD7jfj6c09vwXZ7GgJpi63iznWUnCl0rOeKc2dJDI+DT4xl9n6K1zYRY8F+4nYhirBztWKRg3c6Ou0gY3g9ypFsOo036uV1VJuGuJvSQCzga99qu7WQzQ268vOCZr8pjduV5tCfiK4hy1kiGeVLDsHi9a8O3lo86/Q//JiWoslIFiCK0efN2W45p39AgtfV/dY0qlqwfRkdtbr3YtUKk0tfrAfs/1jN/y9Ym8PD7H/Uoqd/q0Vbc1gqpLJOa7y3N7T+TRn+rZx3p7agj7myov1Pt/+Hv2Ewuri525/DPHdAFqG5faPeyj9Tbv6G0bfdbfC38uzh7/B+T5mw1c0sSc7hzN+V63NlM+4LA1ZKEET7fyoPzn8rO/3qX/+vjYkjOwFobsbCLAPUwQykR+Rt0bURNGjrxo0kIsKjN6hNpU+3D7JDY2fxp1sxOfNr6Vm3EZoxnfRp6GlHqoMJ3j1FlP6JnAzK5M3F9gzF+y3bwyfTsH8aYyjTGAVr1a2XIb6L0yMGcZMIMUnmHEis8ONzTS2EW0pnNztUJtvkIKMCXkiWwf18UZGmhp20oDqZCfSlBt/8ZF/Z1zDJ9prMe4PWo9AYDCPVosjVU3mg6t6KtcySuzUyCzlvRAavIls7Pn5aj30nJALbjgH93WGUGqvWgreY9TIAFsaSIzl8M9NBfeLPtJzZcalBp29aJvWym1LKOXYE0/LB2mPZr4QbTddwFDTw1XwTwFPbe+sfZQDQv631ZfLLiELZ0Wajz9oZ9+I2HbUJ+o1gUN09kAkGXxd3Dx8TfJAS0yUI4Z5rbyUkno4p0UggS6QpPFaDDtaD2dEvD+9g6i+P7oNR0DQiv+4bjZkF8OUrM63EvOuns6c3tR6RjNOCfdg5nCivknqyuXbA8ui8Fj0K68gPc0xJGhMs1sUH7Jh7V4ZK58oSU/WF0muVxehtuw8P5mHq8JDT2ONMmraFyjRilIDiLSlW/tYP8r8daefK/P/qYf+fTooWnMOjzehfZzDu3191d+fw3fYfvcbQNL+7JkP77VBluGmbofHhnXIzYI36uOdrT8fvez0nl5re/QB987XRxPE4lRqHnKOBayMJHWAXH/MaqTEBzZMW3Kw+u0EgTz9bTwOzxjzO+oC6tXQ5lCQtZx01jPRj59E0mla+emsBvP+XPkU8+f2A2m7przmS2y7+a47U5hhnNo/OHzAjR+iw30aJRyqmJ83/1znS/3HrfL/hKbm45gWQI2EG/7PAeD2HJS60tJ0n53BaVOMX1/PgRvXG3CfXPwy5zBw+9nnYtSIxh+P/LDAe/objFvmv2VdQiXNBWdhInyr78ltLbf7DkCv/hsGJuQm8zWG9/Y9yiqjN4ZMgGvOA1N5Ysgp+r1Mv1X/PvpTWsNm6+ofZavobvi47KyAYGvUOLP9o64bQHFajlPVf8Xk0DNZboG1emR99HKu91nTctQA1hLmeeGVBWzkxlQRayuPnhdFQgn4PcAz2r5m5B5n9a2b+8J7Q/zUz/2fp+P43LEea67u9Ocx3/waTc/jk8Scw95c5vPI35ZkBbAvOlEOfWvHLtgJLB2hG4235uxNQ0RtF8ZunMBGPhqrwz9Lx42+YTX/ZtvfmsMD9Jzw6n8MiGRU3k8QcLv9N2WgDwXOMBc1RAQbWRVCVyr7LNmw5YzsC19ImRkfGU5fdXCHGBgEXbqjuJGOn3k7OgM9qIkhteLzVeNOZx1ukXP3f9QYU+yvWWRKPf8U6/3+xWfttM7g8SO9yczP423/k/MLvkbLFR4ddFs+eOLadFUv/qjeaB0nwX/XGLBrJsY7ccDLC/1El8+3hNzxKxqECMYeDJ4W1v/zZFvUnXdwcPrv8M3yNo/+4ruN+w+Zpes3Sn8Nm8/dIWfs/wjUEkC04cFO4KYp1MMm7i1ZlhiJi07RcfDv+Nl97NRYeRK1ZSItsCpZFC67ciWhdqwR1A3+Vq9pJnVAj+aeXjdWBYc2za4VCTXjsFaNIz9b+m82Du982A6Xyv2qk7j86KdriHObSpb/OIGAr/vXeKttrztP4j+M/ZwXDpUupzvgyOt9TpIKiTo/I54FRmzS3b1+HnHyusmZjeOTb8M3XWpbzDV2UgN+zAklQ6+/ws/G03SUb0HK+QLWClrdZE2uCjsst7/8q1dy/0saCOE7krVDsFl9V19U+TKU+Vlvd6j4MIAgiiIRHEgRCQhBFSCDJTUJC/vW9sXLqnm5/SX+953PmzJ1zHzPfmZou61/2sg7hkMNaBtPmmyut+U5hCeF4Tj3iZZ4q9i+LmnL1aWbq/M7riS4FyqV2kVeAtcG2h3iFXJOqIDta5dKyl4YbNGh6Lt1EKbjBxLGPSobwqCL23IVkbcr7F4yGSNvKn99Z8Mjx6kTyJ+GFvbB3kBQI99i5UCYF/ROIdxqm3V37Rep+eDT/3qbOfwNhYflsaqmQhfCCvQJh8Ai7qKeeZvPiaIaOK+8RTOmCBksztM3SQ7Vgclh56gHRth7zTasHZFSISQ/IqLpWtokWJu7rahuwv0dstkgGFqxlyEmOZCt0cgHCejw2fupNgNGL3bbb86Euio/6c09eJ69GMIfTFlFJizN44LxQz099NPzPLAOmqbhG7MCkXOY1QTlH+R+7kYdu9E/j+GKqDN0gnvnc693o3N6ub9usYPm7z8tM6YfRkC3LuOq7HofhmskEdnjeidbFKJNrZLUO51I32YAhUMUdIHnBvg4r95tnbshnlmVvtfLa3YeWxX1boVOt0Bl4LF7NHAfVobtUmM56OxCWWBLPDUcN6cWjZg4qjQ26XsfeGOqYL0YioWDZAM7SgpMBZ8gAubzNiayU1g60jZo0rI2pk3sNIddG9yOCWT30B4tfdSRVH+NmsR8HBE6AuKdIVsg2c5baEOqlGdRHcmwS+Tt0SLTzids3aGaQeWuOrhkGgKYqhdRlPYoMmPESw9I301QfYKWNs79Xfa4AV98OGHJjNo8TeNnrjAHmyrd1d5foOkdzHQbx7woyduu4erkTUWUrGv7i6VLpAUZD5aKJ+jJCwWjE5WF9MldQLSQnd5D1bz/NFXDNxOR9tlf+1yyYjV3/1FyBYMFmBkvPnEBYpfFtgsbAu+A0D253bbYpxxZ8Na78VB+Wt+ChGZv06BXSk96uNWIorYiml4n2tEyRDNt7GMFjuSRhr+L6CfxnnPZCl7Bgva6kqw4IYyIbNtoO/xasyoYgMrMQlt2lNI9G6g2bolPaklnCaf01noXwqT1paMuCqcLU5A7iap2JMiAf3bgfVPtEP5gneyk3jsSvWge+DyGNKiN62sm0Y4g8ymWa+diDZNj8JnALBunCT+X86xY8xF2TnD+lkkrYAA7fpqGmhkPUgqlkflKnnGJUwIXJXVBMo2tPeR0XuAjPV6+hZb+982xacGG89v15lhsQHrROvd/fQaU65aFrH4O7ScMhCvqnUcyszl5WO9M3qN/bbni6M9TWnsDrpTxpS5B8X4dwIxOfaAXfYIBY8DBZeD39AGGN+2a5gya0dnBNvnef65/+PEYFoUE3DtxFPruC882KWKFlUCkV5/U0Kes9P1fkOhHdlxLO3x6FIjIHBve7v9XvdZT1R3vR7oDWWztG2HxoMmPlY9MV01429DbDfPjj+Fe4ZrQP96XEeKprMNYcTC5FH/W2FUEaJVKHHle5HKw9OGtV7+z6l2YKAGYDHfPKjJkmO33MizD2dNEohHkxfLFQzEP4y/N8w4JHeOw/MydfLWNGpT27t7kJ82BueDxvqPnvLPPWgMpl4iJ1Q0E3Xv6z80LV/t8NZaxp7EpEb7iH6O2Dy2iuu1cXDSnIyAGClbCblhGdawlYyOB/cRx0cr6WSBIMH0MOjVzClN9OO3xqUgFngc91XyuS60YZWskqimsVHHWnDYEmd4GAgJVuzuTM1b0ld3QscJ7PHikQXryN/wt5smqK \ No newline at end of file diff --git a/example/example-rcl.py b/example/example-rcl.py deleted file mode 100644 index 71def86..0000000 --- a/example/example-rcl.py +++ /dev/null @@ -1,99 +0,0 @@ -import os - -from regula.documentreader.webclient import * -from regula.documentreader.webclient.ext.models.recognition_request import LicenseRequest, EncryptedRCLRequest - -host = os.getenv("API_BASE_PATH", "https://api.regulaforensics.com") -regula_license = os.getenv("TEST_LICENSE", None) # optional, used here only for smoke test purposes - -# read optional local license file -if os.path.isfile('regula.license') and os.access('regula.license', os.R_OK): - with open("regula.license", "rb") as f: - print("Found local license file. Using it for performing request...") - regula_license = f.read() - -with open("license.txt", "r") as f: - license_ = f.read() - -with open("encrypted-rcl.txt", "r") as f: - encrypted_rcl = f.read() - -with DocumentReaderApi(host) as api: - api.license = regula_license - - params = ProcessParams( - scenario=Scenario.FULL_PROCESS, - result_type_output=[ - # actual results - Result.STATUS, Result.AUTHENTICITY, Result.TEXT, Result.IMAGES, - Result.DOCUMENT_TYPE, Result.DOCUMENT_TYPE_CANDIDATES, Result.IMAGE_QUALITY, - Result.DOCUMENT_POSITION, - # legacy results - Result.MRZ_TEXT, Result.VISUAL_TEXT, Result.BARCODE_TEXT, Result.RFID_TEXT, - Result.VISUAL_GRAPHICS, Result.BARCODE_GRAPHICS, Result.RFID_GRAPHICS, - Result.LEXICAL_ANALYSIS - ] - ) - request = RecognitionRequest( - process_params=params, - container_list=ContainerList([ - LicenseRequest(license_), - EncryptedRCLRequest(encrypted_rcl) - ]) - ) - response = api.process(request) - - # status examples - response_status = response.status - doc_overall_status = "valid" if response_status.overall_status == CheckResult.OK else "not valid" - - # text fields example - doc_number_field = response.text.get_field(TextFieldType.DOCUMENT_NUMBER) - doc_number_field_by_name = response.text.get_field_by_name("Document Number") - - doc_number_mrz = doc_number_field.get_value() - doc_number_visual = doc_number_field.get_value(Source.VISUAL) - doc_number_visual_validity = doc_number_field.source_validity(Source.VISUAL) - doc_number_mrz_validity = doc_number_field.source_validity(Source.MRZ) - doc_number_mrz_visual_matching = doc_number_field.cross_source_comparison(Source.MRZ, Source.VISUAL) - - doc_authenticity = response.authenticity() - - doc_ir_b900 = doc_authenticity.ir_b900_checks \ - if doc_authenticity is not None else None - # if FULL_PROCESS then auth is None - - doc_ir_b900_blank = doc_ir_b900.checks_by_element(SecurityFeatureType.BLANK) \ - if doc_authenticity is not None else None - - doc_image_pattern = doc_authenticity.image_pattern_checks \ - if doc_authenticity is not None else None - - doc_image_pattern_blank = doc_image_pattern.checks_by_element(SecurityFeatureType.BLANK) \ - if doc_authenticity is not None else None - - # images fields example - document_image = response.images.get_field(GraphicFieldType.DOCUMENT_FRONT).get_value() - portrait_from_visual = response.images.get_field(GraphicFieldType.PORTRAIT).get_value(Source.VISUAL) - with open('portrait.jpg', 'wb') as f: - f.write(portrait_from_visual) - with open('document-image.jpg', 'wb') as f: - f.write(document_image) - - print(""" - --------------------------------------------------------------------------- - Web API version: {ping_version} - --------------------------------------------------------------------------- - Document Overall Status: {doc_overall_status} - Document Number Visual: {doc_number_visual} - Document Number MRZ: {doc_number_mrz} - Validity Of Document Number Visual: {doc_number_visual_validity} - Validity Of Document Number MRZ: {doc_number_mrz_validity} - MRZ-Visual values comparison: {doc_number_mrz_visual_matching} - --------------------------------------------------------------------------- - """.format( - ping_version=api.ping().version, - doc_overall_status=doc_overall_status, doc_number_visual=doc_number_visual, - doc_number_mrz=doc_number_mrz, doc_number_visual_validity=doc_number_mrz_validity, - doc_number_mrz_validity=doc_number_mrz_validity, doc_number_mrz_visual_matching=doc_number_mrz_visual_matching, - )) diff --git a/example/example.py b/example/example.py index 109a0a8..7cad3ed 100755 --- a/example/example.py +++ b/example/example.py @@ -24,7 +24,7 @@ "X-CLIENT-KEY": "123", "Authorization": "Bearer 123" } - params = ProcessParams(already_cropped=True, scenario=Scenario.FULL_PROCESS) + params = ProcessParams(alreadyCropped=True, scenario=Scenario.FULLPROCESS) # Add license to request # request = RecognitionRequest(system_info=ProcessSystemInfo(license=base64.b64encode(regula_license).decode()), process_params=params, images=[ @@ -38,8 +38,8 @@ ]) response = api.process(request) - request_json = request.json # example for request & response raw json - response_json = response.json + request_json = request.to_json() # example for request & response raw json + response_json = response.to_json() # status examples response_status = response.status diff --git a/example/license.txt b/example/license.txt deleted file mode 100644 index 4225f85..0000000 --- a/example/license.txt +++ /dev/null @@ -1 +0,0 @@ -AAEAAK/WKOtEs17ikF4B/IKdpwmj9p0KTx2OSFFdNba1eoDT5+8tDMeZEM4ucNYB3zqKknTIxH/7zTNpQtFLtzZlwmtWEgwfLLSdFdWTA63AI7RjRxD9gr2ci++l32k7iJvUnLy1XAMM6sEhij4Ui3s+MpObMhu6/EJWe9y/57uFB4Jzdwx34D9VAS1wj9O6MliCqKs9sIZNwohaddcg8sVYHKd76VqVvrZKN5HcW7nSjWoDDXWsLA3LW6INaU3SuWJJkDD1EqE6lvjWjKlxwe7B5h77csirRjI58HCXrbXL1g84n1FZ3uTgw7KfISxlQ+i99Zj9TbhSEiGPfnZFvk6LHARUBAAAAAAAECcDDWmiV6FtvHfS/mQmG7iPG16AxSAM1CZkciHkBeXKD+P3qYfPPKvOoC+VmgsKy3+YtFZbNtdrzWILttCv9PDHshglkIaC5qIwJCJUwmj7o2LHMtLyVVzLq15v3JULQ89HGa0Mgcjoo4Rporb/ARsRq5f9YaEamP6i2zmc88Fa4a4pxl3bBI3pDlu6qZ2SGRyysrkh19PUf3wNigE5i1kK7CMqi5TuUkuoyboog+bypE5CV8peAnrhcH0O8PzoDz0R8U3K+cy/BuyeP6eZ/0J8mk4QgVcaYDGRIeKPYWtvhdRa2j3ybItNfA2S2piTL6Mf9fEli5mpifBTNNGoZuzwEWxUH0vmco/zAFkH8dmkRQGSe9u8WjbgQHhIUIQ0aifGSJEbNocc/3kQsRTBhMT1By8C2cSJ20A0OnyY9nmWx9vpAeuCdMkTNOjAP/AZuZNZtmmRmBsoXpsAP+TOZ1hbimumcw/QSVUhKDVdLbIH03g45byy8Db1xe2uohSY65p9pRqIzgEMoCs/Is5ga+2jRxNlfGwer2AKxhWpxjqnGQJt9Asr9LI7IfCxrJnzBHxsH4a8iEZaSZXIhgwy6NhwIALVhRnohljzs/LBo2gpEVugBIdWHdbS/juGma8vGstWEj1yDpPBuavlj8/+lRpt8OVPZG99hMvaph50D3Q1hwlsxPw2Nz/8hQlP7PQ1JmzYULpVsnL2jPjpMdvjGOsyf3Niv4FakLHGyLpUb8GErzQpF4hCTyJyhAMCR2E6dBMT8E95BGSV8tEo5LzYK4nfSYJk8LDGVU4dvtxrLhbLeLr9OmNigVImKDKrZrIQLOJtCcb4q3V8HDQ5XeGsJ2pPRHDOJL7RjUEEbhb0w8ewTpJdDec2BUvZXMTwVLk4CED8mZwMssO6HEcnjy2JqVHU47sVwhpfKJIT+9deAzybEkTi+Mibs4MLBcaO6iaoQsaORvk87ERwXe4F/5JUz0uMoSoEbIPrR4s+MakfFsEDNSOBEl5LCmM2BvIFkqoVnzV5Ft+1mLhvYNgnkrwntnCf0Nt81ragY83Jumvs3QvSBw7M4WW1ANlKJfrGfgwwroISK0Ma5mXc40oKUIb7Jmgp+uwxr+Nka3DNBGG3qUUI/lM3N4ZkmPAOTbNwVHv+TDo62nFaCtCeaK31owNYKojWbc5Gf+FL8K34j01DzIJiUO+3wHs2pH39ePDregf8uvx/kTvvA8oqEZWMzjmYdMkV1o43/nvnlHiwl8Pyq4O2F5NX9LVxcQpw6nMPWlKe6zrluztm/gYO7h2Rt1ualZbO4DQvt8OuTwXvzxR1X9XWJ6qNZjYbMmnZp+tPpL+iO3St6sWWGEc5nelcCPOIBOoXwYo1SZxUa0ex//aiExfoaEL1aJO95ARWnKwXnVBJyEiRume5j/qFeFkwo5/XFiBt9bRluOMdWuNTOc5A25eFmuNr0n8eeE458Huyg7DiKQ== \ No newline at end of file diff --git a/generator-config.json b/generator-config.json index 96a0a12..9ff1ac9 100755 --- a/generator-config.json +++ b/generator-config.json @@ -1,4 +1,8 @@ { "packageName": "regula.documentreader.webclient.gen", - "extPackageName": "regula.documentreader.webclient.ext" + "extPackageName": "regula.documentreader.webclient.ext", + "typeMappings" : { + "ContainerListListInner": "ResultItem", + "AuthenticityCheckResultListInner": "AuthenticityCheckResultItem" + } } \ No newline at end of file diff --git a/generator-templates/api_client.mustache b/generator-templates/api_client.mustache deleted file mode 100755 index e26e47e..0000000 --- a/generator-templates/api_client.mustache +++ /dev/null @@ -1,698 +0,0 @@ -# coding: utf-8 -{{>partial_header}} -from __future__ import absolute_import - -import atexit -import datetime -from copy import copy -from dateutil.parser import parse -import json -import mimetypes -from multiprocessing.pool import ThreadPool -import os -import re - -# python 2 and python 3 compatibility library -import six -from six.moves.urllib.parse import quote -{{#tornado}} -import tornado.gen -{{/tornado}} - -from {{packageName}}.configuration import Configuration -import {{modelPackage}} -from {{packageName}} import rest -from {{packageName}}.exceptions import ApiValueError, ApiException - - -class ModelSerDe: - - PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int if six.PY3 else long, # noqa: F821 - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'object': object, - } - - def sanitize_for_serialization(self, obj): - """Builds a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - if isinstance(obj, regula.documentreader.webclient.ext.models.RawResultItem): - obj_dict = obj.raw - elif isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in six.iteritems(obj.openapi_types) - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in six.iteritems(obj_dict)} - - def deserialize_raw(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match(r'list\[(.*)\]', klass).group(1) - return [self.deserialize_raw(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.deserialize_raw(v, sub_kls) - for k, v in six.iteritems(data)} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - elif hasattr({{extPackageName}}.models, klass): - klass = getattr({{extPackageName}}.models, klass) - else: - klass = getattr({{modelPackage}}, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datetime(data) - else: - return self.__deserialize_model(data, klass) - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return six.text_type(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datetime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - has_discriminator = False - if (hasattr(klass, 'get_real_child_model') - and klass.discriminator_value_class_map): - has_discriminator = True - - if not klass.openapi_types and has_discriminator is False: - return data - - kwargs = {} - if (data is not None and - klass.openapi_types is not None and - isinstance(data, (list, dict))): - - if "raw" in six.iterkeys(klass.openapi_types): - kwargs[klass.attribute_map["raw"]] = copy(data) - - for attr, attr_type in six.iteritems(klass.openapi_types): - if klass.attribute_map[attr] in data: - value = data[klass.attribute_map[attr]] - kwargs[attr] = self.deserialize_raw(value, attr_type) - - instance = klass(**kwargs) - - if has_discriminator: - klass_name = instance.get_real_child_model(data) - if klass_name: - instance = self.deserialize_raw(data, klass_name) - return instance - - -class ApiClient(ModelSerDe, object): - """Generic API client for OpenAPI client library builds. - - OpenAPI generic API client. This client handles the client- - server communication, and is invariant across implementations. Specifics of - the methods and models for each application are generated from the OpenAPI - templates. - - NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - Do not edit the class manually. - - :param configuration: .Configuration object for this client - :param header_name: a header to pass when making calls to the API. - :param header_value: a header value to pass when making calls to - the API. - :param cookie: a cookie to include in the header when making calls - to the API - :param pool_threads: The number of threads to use for async requests - to the API. More threads means more concurrent API requests. - """ - - _pool = None - - def __init__(self, configuration=None, header_name=None, header_value=None, - cookie=None, pool_threads=1): - if configuration is None: - configuration = Configuration.get_default_copy() - self.configuration = configuration - self.pool_threads = pool_threads - - self.rest_client = rest.RESTClientObject(configuration) - self.default_headers = {} - if header_name is not None: - self.default_headers[header_name] = header_value - self.cookie = cookie - # Set default User-Agent. - self.user_agent = '{{#httpUserAgent}}{{{.}}}{{/httpUserAgent}}{{^httpUserAgent}}OpenAPI-Generator/{{{packageVersion}}}/python{{/httpUserAgent}}' - self.client_side_validation = configuration.client_side_validation - - {{#asyncio}} - async def __aenter__(self): - return self - - async def __aexit__(self, exc_type, exc_value, traceback): - await self.close() - {{/asyncio}} - {{^asyncio}} - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - {{/asyncio}} - - {{#asyncio}}async {{/asyncio}}def close(self): - {{#asyncio}} - await self.rest_client.close() - {{/asyncio}} - if self._pool: - self._pool.close() - self._pool.join() - self._pool = None - if hasattr(atexit, 'unregister'): - atexit.unregister(self.close) - - @property - def pool(self): - """Create thread pool on first request - avoids instantiating unused threadpool for blocking clients. - """ - if self._pool is None: - atexit.register(self.close) - self._pool = ThreadPool(self.pool_threads) - return self._pool - - @property - def user_agent(self): - """User agent for this API client""" - return self.default_headers['User-Agent'] - - @user_agent.setter - def user_agent(self, value): - self.default_headers['User-Agent'] = value - - def set_default_header(self, header_name, header_value): - self.default_headers[header_name] = header_value - - {{#tornado}} - @tornado.gen.coroutine - {{/tornado}} - {{#asyncio}}async {{/asyncio}}def __call_api( - self, resource_path, method, path_params=None, - query_params=None, header_params=None, body=None, post_params=None, - files=None, response_types_map=None, auth_settings=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, _host=None, - _request_auth=None): - - config = self.configuration - - # header parameters - header_params = header_params or {} - header_params.update(self.default_headers) - if self.cookie: - header_params['Cookie'] = self.cookie - if header_params: - header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) - - # path parameters - if path_params: - path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) - for k, v in path_params: - # specified safe chars, encode everything - resource_path = resource_path.replace( - '{%s}' % k, - quote(str(v), safe=config.safe_chars_for_path_param) - ) - - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - - # post parameters - if post_params or files: - post_params = post_params if post_params else [] - post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - post_params.extend(self.files_parameters(files)) - - # auth setting - self.update_params_for_auth( - header_params, query_params, auth_settings, - request_auth=_request_auth) - - # body - if body: - body = self.sanitize_for_serialization(body) - - # request url - if _host is None: - url = self.configuration.host + resource_path - else: - # use server/host defined in path or operation instead - url = _host + resource_path - - try: - # perform request and return response - response_data = {{#asyncio}}await {{/asyncio}}{{#tornado}}yield {{/tornado}}self.request( - method, url, query_params=query_params, headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout) - except ApiException as e: - e.body = e.body.decode('utf-8') if six.PY3 else e.body - raise e - - self.last_response = response_data - - return_data = response_data - - if not _preload_content: - {{^tornado}} - return return_data - {{/tornado}} - {{#tornado}} - raise tornado.gen.Return(return_data) - {{/tornado}} - - response_type = response_types_map.get(response_data.status, None) - - if six.PY3 and response_type not in ["file", "bytes"]: - match = None - content_type = response_data.getheader('content-type') - if content_type is not None: - match = re.search(r"charset=([a-zA-Z\-\d]+)[\s\;]?", content_type) - encoding = match.group(1) if match else "utf-8" - response_data.data = response_data.data.decode(encoding) - - # deserialize response data - - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None - -{{^tornado}} - if _return_http_data_only: - return (return_data) - else: - return (return_data, response_data.status, - response_data.getheaders()) -{{/tornado}} -{{#tornado}} - if _return_http_data_only: - raise tornado.gen.Return(return_data) - else: - raise tornado.gen.Return((return_data, response_data.status, - response_data.getheaders())) -{{/tornado}} - - def deserialize(self, response, response_type): - """Deserializes response into an object. - - :param response: RESTResponse object to be deserialized. - :param response_type: class literal for - deserialized object, or string of class name. - - :return: deserialized object. - """ - try: - data = json.loads(response.data) - except ValueError: - data = response.data - return self.deserialize_raw(data, response_type) - - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_types_map=None, auth_settings=None, - async_req=None, _return_http_data_only=None, - collection_formats=None,_preload_content=True, - _request_timeout=None, _host=None, _request_auth=None): - """Makes the HTTP request (synchronous) and returns deserialized data. - - To make an async_req request, set the async_req parameter. - - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param async_req bool: execute request asynchronously - :param _return_http_data_only: response data without head status code - and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. - :type _request_token: dict, optional - :return: - If async_req parameter is True, - the request will be called asynchronously. - The method will return the request thread. - If parameter async_req is False or missing, - then the method will return the response directly. - """ - if not async_req: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_types_map, auth_settings, - _return_http_data_only, collection_formats, - _preload_content, _request_timeout, _host, - _request_auth) - - return self.pool.apply_async(self.__call_api, (resource_path, - method, path_params, - query_params, - header_params, body, - post_params, files, - response_types_map, - auth_settings, - _return_http_data_only, - collection_formats, - _preload_content, - _request_timeout, - _host, _request_auth)) - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Makes the HTTP request using RESTClient.""" - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - else: - raise ApiValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) - - def parameters_to_tuples(self, params, collection_formats): - """Get parameters as list of tuples, formatting collections. - - :param params: Parameters as dict or list of two-tuples - :param dict collection_formats: Parameter collection formats - :return: Parameters as list of tuples, collections formatted - """ - new_params = [] - if collection_formats is None: - collection_formats = {} - for k, v in six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501 - if k in collection_formats: - collection_format = collection_formats[k] - if collection_format == 'multi': - new_params.extend((k, value) for value in v) - else: - if collection_format == 'ssv': - delimiter = ' ' - elif collection_format == 'tsv': - delimiter = '\t' - elif collection_format == 'pipes': - delimiter = '|' - else: # csv is the default - delimiter = ',' - new_params.append( - (k, delimiter.join(str(value) for value in v))) - else: - new_params.append((k, v)) - return new_params - - def files_parameters(self, files=None): - """Builds form parameters. - - :param files: File parameters. - :return: Form parameters with files. - """ - params = [] - - if files: - for k, v in six.iteritems(files): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = (mimetypes.guess_type(filename)[0] or - 'application/octet-stream') - params.append( - tuple([k, tuple([filename, filedata, mimetype])])) - - return params - - def select_header_accept(self, accepts): - """Returns `Accept` based on an array of accepts provided. - - :param accepts: List of headers. - :return: Accept (e.g. application/json). - """ - if not accepts: - return - - accepts = [x.lower() for x in accepts] - - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) - - def select_header_content_type(self, content_types): - """Returns `Content-Type` based on an array of content_types provided. - - :param content_types: List of content-types. - :return: Content-Type (e.g. application/json). - """ - if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] - - def update_params_for_auth(self, headers, querys, auth_settings, - request_auth=None): - """Updates header and query params based on authentication setting. - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_settings: Authentication setting identifiers list. - :param request_auth: if set, the provided settings will - override the token in the configuration. - """ - if not auth_settings: - return - - if request_auth: - self._apply_auth_params(headers, querys, request_auth) - return - - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - self._apply_auth_params(headers, querys, auth_setting) - - def _apply_auth_params(self, headers, querys, auth_setting): - """Updates the request parameters based on a single auth_setting - - :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. - :param auth_setting: auth settings for the endpoint - """ - if auth_setting['in'] == 'cookie': - headers['Cookie'] = auth_setting['value'] - elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] - elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) - else: - raise ApiValueError( - 'Authentication token must be in `query` or `header`' - ) diff --git a/generator-templates/model.mustache b/generator-templates/model.mustache deleted file mode 100755 index c6b100e..0000000 --- a/generator-templates/model.mustache +++ /dev/null @@ -1,245 +0,0 @@ -# coding: utf-8 - -{{>partial_header}} - -import pprint -import re # noqa: F401 - -import six - -from {{packageName}}.configuration import Configuration -# this line was added to enable pycharm type hinting -from {{packageName}}.models import * - - -{{#models}} -{{#model}} -""" -{{unescapedDescription}} -""" -class {{classname}}(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ -{{#allowableValues}}{{#enumVars}} - {{#model.isString}}{{name}} = {{{value}}}{{/model.isString}}{{^model.isString}}{{name}} = int({{{value}}}){{/model.isString}} -{{/enumVars}}{{/allowableValues}} -{{#allowableValues}} - allowable_values = [{{#enumVars}}{{name}}{{^-last}}, {{/-last}}{{/enumVars}}] # noqa: E501 - -{{/allowableValues}} - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { -{{#allVars}} - '{{name}}': '{{{dataType}}}'{{^-last}},{{/-last}} -{{/allVars}} - } - - attribute_map = { -{{#allVars}} - '{{name}}': '{{baseName}}'{{^-last}},{{/-last}} -{{/allVars}} - } -{{#discriminator}} - discriminator_value_class_map = { - {{#mappedModels}} - {{mappingName}} : '{{modelName}}', - {{/mappedModels}} - } -{{/discriminator}} - - def __init__(self{{#allVars}}, {{name}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/allVars}}, local_vars_configuration=None): # noqa: E501 - """{{classname}} - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration -{{#allVars}}{{#-first}} -{{/-first}} - self._{{name}} = None -{{/allVars}} - self.discriminator = {{#discriminator}}'{{{discriminatorName}}}'{{/discriminator}}{{^discriminator}}None{{/discriminator}} -{{#allVars}}{{#-first}} -{{/-first}} -{{#required}} - self.{{name}} = {{name}} -{{/required}} -{{^required}} -{{#isNullable}} - self.{{name}} = {{name}} -{{/isNullable}} -{{^isNullable}} - if {{name}} is not None: - self.{{name}} = {{name}} -{{/isNullable}} -{{/required}} -{{/allVars}} - -{{#allVars}} - @property - def {{name}}(self): - """Gets the {{name}} of this {{classname}}. # noqa: E501 - -{{#description}} - {{{description}}} # noqa: E501 -{{/description}} - - :return: The {{name}} of this {{classname}}. # noqa: E501 - :rtype: {{dataType}} - """ - return self._{{name}} - - @{{name}}.setter - def {{name}}(self, {{name}}): - """Sets the {{name}} of this {{classname}}. - -{{#description}} - {{{description}}} # noqa: E501 -{{/description}} - - :param {{name}}: The {{name}} of this {{classname}}. # noqa: E501 - :type {{name}}: {{dataType}} - """ -{{^isNullable}} -{{#required}} - if self.local_vars_configuration.client_side_validation and {{name}} is None: # noqa: E501 - raise ValueError("Invalid value for `{{name}}`, must not be `None`") # noqa: E501 -{{/required}} -{{/isNullable}} -{{#isEnum}} -{{#isContainer}} - allowed_values = [{{#isNullable}}None,{{/isNullable}}{{#allowableValues}}{{#values}}{{#items.isString}}"{{/items.isString}}{{{this}}}{{#items.isString}}"{{/items.isString}}{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}] # noqa: E501 -{{#isListContainer}} - if (self.local_vars_configuration.client_side_validation and - not set({{{name}}}).issubset(set(allowed_values))): # noqa: E501 - raise ValueError( - "Invalid values for `{{{name}}}` [{0}], must be a subset of [{1}]" # noqa: E501 - .format(", ".join(map(str, set({{{name}}}) - set(allowed_values))), # noqa: E501 - ", ".join(map(str, allowed_values))) - ) -{{/isListContainer}} -{{#isMapContainer}} - if (self.local_vars_configuration.client_side_validation and - not set({{{name}}}.keys()).issubset(set(allowed_values))): # noqa: E501 - raise ValueError( - "Invalid keys in `{{{name}}}` [{0}], must be a subset of [{1}]" # noqa: E501 - .format(", ".join(map(str, set({{{name}}}.keys()) - set(allowed_values))), # noqa: E501 - ", ".join(map(str, allowed_values))) - ) -{{/isMapContainer}} -{{/isContainer}} -{{^isContainer}} - allowed_values = [{{#isNullable}}None,{{/isNullable}}{{#allowableValues}}{{#values}}{{#isString}}"{{/isString}}{{{this}}}{{#isString}}"{{/isString}}{{^-last}}, {{/-last}}{{/values}}{{/allowableValues}}] # noqa: E501 - if self.local_vars_configuration.client_side_validation and {{{name}}} not in allowed_values: # noqa: E501 - raise ValueError( - "Invalid value for `{{{name}}}` ({0}), must be one of {1}" # noqa: E501 - .format({{{name}}}, allowed_values) - ) -{{/isContainer}} -{{/isEnum}} -{{^isEnum}} -{{#hasValidation}} -{{#maxLength}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and len({{name}}) > {{maxLength}}): - raise ValueError("Invalid value for `{{name}}`, length must be less than or equal to `{{maxLength}}`") # noqa: E501 -{{/maxLength}} -{{#minLength}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and len({{name}}) < {{minLength}}): - raise ValueError("Invalid value for `{{name}}`, length must be greater than or equal to `{{minLength}}`") # noqa: E501 -{{/minLength}} -{{#maximum}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and {{name}} >{{#exclusiveMaximum}}={{/exclusiveMaximum}} {{maximum}}): # noqa: E501 - raise ValueError("Invalid value for `{{name}}`, must be a value less than {{^exclusiveMaximum}}or equal to {{/exclusiveMaximum}}`{{maximum}}`") # noqa: E501 -{{/maximum}} -{{#minimum}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and {{name}} <{{#exclusiveMinimum}}={{/exclusiveMinimum}} {{minimum}}): # noqa: E501 - raise ValueError("Invalid value for `{{name}}`, must be a value greater than {{^exclusiveMinimum}}or equal to {{/exclusiveMinimum}}`{{minimum}}`") # noqa: E501 -{{/minimum}} -{{#pattern}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and not re.search(r'{{{vendorExtensions.x-regex}}}', {{name}}{{#vendorExtensions.x-modifiers}}{{#-first}}, flags={{/-first}}re.{{.}}{{^-last}} | {{/-last}}{{/vendorExtensions.x-modifiers}})): # noqa: E501 - raise ValueError(r"Invalid value for `{{name}}`, must be a follow pattern or equal to `{{{pattern}}}`") # noqa: E501 -{{/pattern}} -{{#maxItems}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and len({{name}}) > {{maxItems}}): - raise ValueError("Invalid value for `{{name}}`, number of items must be less than or equal to `{{maxItems}}`") # noqa: E501 -{{/maxItems}} -{{#minItems}} - if (self.local_vars_configuration.client_side_validation and - {{name}} is not None and len({{name}}) < {{minItems}}): - raise ValueError("Invalid value for `{{name}}`, number of items must be greater than or equal to `{{minItems}}`") # noqa: E501 -{{/minItems}} -{{/hasValidation}} -{{/isEnum}} - - self._{{name}} = {{name}} - -{{/allVars}} -{{#discriminator}} - def get_real_child_model(self, data): - """Returns the real base class specified by the discriminator""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - from regula.documentreader.webclient.ext.models import Raw{{classname}} - return self.discriminator_value_class_map.get(discriminator_value, Raw{{classname}}.__name__) - -{{/discriminator}} - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, {{classname}}): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, {{classname}}): - return True - - return self.to_dict() != other.to_dict() -{{/model}} -{{/models}} diff --git a/generator-templates/model_generic.mustache b/generator-templates/model_generic.mustache new file mode 100644 index 0000000..ea3ddc7 --- /dev/null +++ b/generator-templates/model_generic.mustache @@ -0,0 +1,403 @@ +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +{{#vendorExtensions.x-py-other-imports}} +{{{.}}} +{{/vendorExtensions.x-py-other-imports}} +{{#vendorExtensions.x-py-model-imports}} +{{{.}}} +{{/vendorExtensions.x-py-model-imports}} +from typing import Optional, Set +from typing_extensions import Self + +{{#hasChildren}} +{{#discriminator}} +{{! If this model is a super class, importlib is used. So import the necessary modules for the type here. }} +from typing import TYPE_CHECKING +if TYPE_CHECKING: +{{#mappedModels}} + from {{packageName}}.models.{{model.classFilename}} import {{modelName}} +{{/mappedModels}} + +{{/discriminator}} +{{/hasChildren}} +class {{classname}}({{#parent}}{{{.}}}{{/parent}}{{^parent}}BaseModel{{/parent}}): + """ + {{#description}}{{{description}}}{{/description}}{{^description}}{{{classname}}}{{/description}} + """ # noqa: E501 +{{#vars}} + {{name}}: {{{vendorExtensions.x-py-typing}}} +{{/vars}} +{{#isAdditionalPropertiesTrue}} + additional_properties: Dict[str, Any] = {} +{{/isAdditionalPropertiesTrue}} + __properties: ClassVar[List[str]] = [{{#allVars}}"{{baseName}}"{{^-last}}, {{/-last}}{{/allVars}}] +{{#vars}} + {{#vendorExtensions.x-regex}} + + @field_validator('{{{name}}}') + def {{{name}}}_validate_regular_expression(cls, value): + """Validates the regular expression""" + {{^required}} + if value is None: + return value + + {{/required}} + {{#required}} + {{#isNullable}} + if value is None: + return value + + {{/isNullable}} + {{/required}} + if not re.match(r"{{{.}}}", value{{#vendorExtensions.x-modifiers}} ,re.{{{.}}}{{/vendorExtensions.x-modifiers}}): + raise ValueError(r"must validate the regular expression {{{vendorExtensions.x-pattern}}}") + return value + {{/vendorExtensions.x-regex}} + {{#isEnum}} + + @field_validator('{{{name}}}') + def {{{name}}}_validate_enum(cls, value): + """Validates the enum""" + {{^required}} + if value is None: + return value + + {{/required}} + {{#required}} + {{#isNullable}} + if value is None: + return value + + {{/isNullable}} + {{/required}} + {{#isContainer}} + {{#isArray}} + for i in value: + if i not in set([{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]): + raise ValueError("each list item must be one of ({{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}})") + {{/isArray}} + {{#isMap}} + for i in value.values(): + if i not in set([{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]): + raise ValueError("dict values must be one of enum values ({{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}})") + {{/isMap}} + {{/isContainer}} + {{^isContainer}} + if value not in set([{{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}}]): + raise ValueError("must be one of enum values ({{#allowableValues}}{{#enumVars}}{{{value}}}{{^-last}}, {{/-last}}{{/enumVars}}{{/allowableValues}})") + {{/isContainer}} + return value + {{/isEnum}} +{{/vars}} + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + +{{#hasChildren}} +{{#discriminator}} + # JSON field name that stores the object type + __discriminator_property_name: ClassVar[str] = '{{discriminator.propertyBaseName}}' + + # discriminator mappings + __discriminator_value_class_map: ClassVar[Dict[str, str]] = { + {{#mappedModels}}'{{{mappingName}}}': '{{{modelName}}}'{{^-last}},{{/-last}}{{/mappedModels}} + } + + @classmethod + def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(str(discriminator_value)) + else: + return None + +{{/discriminator}} +{{/hasChildren}} + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[{{^hasChildren}}Self{{/hasChildren}}{{#hasChildren}}{{#discriminator}}Union[{{#mappedModels}}{{{modelName}}}{{^-last}}, {{/-last}}{{/mappedModels}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}{{/hasChildren}}]: + """Create an instance of {{{classname}}} from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + {{#vendorExtensions.x-py-readonly}} + * OpenAPI `readOnly` fields are excluded. + {{/vendorExtensions.x-py-readonly}} + {{#isAdditionalPropertiesTrue}} + * Fields in `self.additional_properties` are added to the output dict. + {{/isAdditionalPropertiesTrue}} + """ + excluded_fields: Set[str] = set([ + {{#vendorExtensions.x-py-readonly}} + "{{{.}}}", + {{/vendorExtensions.x-py-readonly}} + {{#isAdditionalPropertiesTrue}} + "additional_properties", + {{/isAdditionalPropertiesTrue}} + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + {{#allVars}} + {{#isContainer}} + {{#isArray}} + {{#items.isArray}} + {{^items.items.isPrimitiveType}} + # override the default output from pydantic by calling `to_dict()` of each item in {{{name}}} (list of list) + _items = [] + if self.{{{name}}}: + for _item_{{{name}}} in self.{{{name}}}: + if _item_{{{name}}}: + _items.append( + [_inner_item.to_dict() for _inner_item in _item_{{{name}}} if _inner_item is not None] + ) + _dict['{{{baseName}}}'] = _items + {{/items.items.isPrimitiveType}} + {{/items.isArray}} + {{^items.isArray}} + {{^items.isPrimitiveType}} + {{^items.isEnumOrRef}} + # override the default output from pydantic by calling `to_dict()` of each item in {{{name}}} (list) + _items = [] + if self.{{{name}}}: + for _item_{{{name}}} in self.{{{name}}}: + if _item_{{{name}}}: + _items.append(_item_{{{name}}}.to_dict()) + _dict['{{{baseName}}}'] = _items + {{/items.isEnumOrRef}} + {{/items.isPrimitiveType}} + {{/items.isArray}} + {{/isArray}} + {{#isMap}} + {{#items.isArray}} + {{^items.items.isPrimitiveType}} + # override the default output from pydantic by calling `to_dict()` of each value in {{{name}}} (dict of array) + _field_dict_of_array = {} + if self.{{{name}}}: + for _key_{{{name}}} in self.{{{name}}}: + if self.{{{name}}}[_key_{{{name}}}] is not None: + _field_dict_of_array[_key_{{{name}}}] = [ + _item.to_dict() for _item in self.{{{name}}}[_key_{{{name}}}] + ] + _dict['{{{baseName}}}'] = _field_dict_of_array + {{/items.items.isPrimitiveType}} + {{/items.isArray}} + {{^items.isArray}} + {{^items.isPrimitiveType}} + {{^items.isEnumOrRef}} + # override the default output from pydantic by calling `to_dict()` of each value in {{{name}}} (dict) + _field_dict = {} + if self.{{{name}}}: + for _key_{{{name}}} in self.{{{name}}}: + if self.{{{name}}}[_key_{{{name}}}]: + _field_dict[_key_{{{name}}}] = self.{{{name}}}[_key_{{{name}}}].to_dict() + _dict['{{{baseName}}}'] = _field_dict + {{/items.isEnumOrRef}} + {{/items.isPrimitiveType}} + {{/items.isArray}} + {{/isMap}} + {{/isContainer}} + {{^isContainer}} + {{^isPrimitiveType}} + {{^isEnumOrRef}} + # override the default output from pydantic by calling `to_dict()` of {{{name}}} + if self.{{{name}}}: + _dict['{{{baseName}}}'] = self.{{{name}}}.to_dict() + {{/isEnumOrRef}} + {{/isPrimitiveType}} + {{/isContainer}} + {{/allVars}} + {{#isAdditionalPropertiesTrue}} + # puts key-value pairs in additional_properties in the top level + if self.additional_properties is not None: + for _key, _value in self.additional_properties.items(): + _dict[_key] = _value + + {{/isAdditionalPropertiesTrue}} + {{#allVars}} + {{#isNullable}} + # set to None if {{{name}}} (nullable) is None + # and model_fields_set contains the field + if self.{{name}} is None and "{{{name}}}" in self.model_fields_set: + _dict['{{{baseName}}}'] = None + + {{/isNullable}} + {{/allVars}} + return _dict + + {{#hasChildren}} + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Optional[{{#discriminator}}Union[{{#mappedModels}}{{{modelName}}}{{^-last}}, {{/-last}}{{/mappedModels}}]{{/discriminator}}{{^discriminator}}Self{{/discriminator}}]: + """Create an instance of {{{classname}}} from a dict""" + {{#discriminator}} + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + {{#mappedModels}} + if object_type == '{{{modelName}}}': + return import_module("{{packageName}}.models.{{model.classFilename}}").{{modelName}}.from_dict(obj) + {{/mappedModels}} + + raise ValueError("{{{classname}}} failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) + {{/discriminator}} + {{/hasChildren}} + {{^hasChildren}} + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of {{{classname}}} from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + {{#disallowAdditionalPropertiesIfNotPresent}} + {{^isAdditionalPropertiesTrue}} + # raise errors for additional fields in the input + for _key in obj.keys(): + if _key not in cls.__properties: + raise ValueError("Error due to additional fields (not defined in {{classname}}) in the input: " + _key) + + {{/isAdditionalPropertiesTrue}} + {{/disallowAdditionalPropertiesIfNotPresent}} + _obj = cls.model_validate({ + {{#allVars}} + {{#isContainer}} + {{#isArray}} + {{#items.isArray}} + {{#items.items.isPrimitiveType}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{^-last}},{{/-last}} + {{/items.items.isPrimitiveType}} + {{^items.items.isPrimitiveType}} + "{{{baseName}}}": [ + [{{{items.items.dataType}}}.from_dict(_inner_item) for _inner_item in _item] + for _item in obj["{{{baseName}}}"] + ] if obj.get("{{{baseName}}}") is not None else None{{^-last}},{{/-last}} + {{/items.items.isPrimitiveType}} + {{/items.isArray}} + {{^items.isArray}} + {{^items.isPrimitiveType}} + {{#items.isEnumOrRef}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{^-last}},{{/-last}} + {{/items.isEnumOrRef}} + {{^items.isEnumOrRef}} + "{{{baseName}}}": [{{{items.dataType}}}.from_dict(_item) for _item in obj["{{{baseName}}}"]] if obj.get("{{{baseName}}}") is not None else None{{^-last}},{{/-last}} + {{/items.isEnumOrRef}} + {{/items.isPrimitiveType}} + {{#items.isPrimitiveType}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{^-last}},{{/-last}} + {{/items.isPrimitiveType}} + {{/items.isArray}} + {{/isArray}} + {{#isMap}} + {{^items.isPrimitiveType}} + {{^items.isEnumOrRef}} + {{#items.isContainer}} + {{#items.isMap}} + "{{{baseName}}}": dict( + (_k, dict( + (_ik, {{{items.items.dataType}}}.from_dict(_iv)) + for _ik, _iv in _v.items() + ) + if _v is not None + else None + ) + for _k, _v in obj.get("{{{baseName}}}").items() + ) + if obj.get("{{{baseName}}}") is not None + else None{{^-last}},{{/-last}} + {{/items.isMap}} + {{#items.isArray}} + "{{{baseName}}}": dict( + (_k, + [{{{items.items.dataType}}}.from_dict(_item) for _item in _v] + if _v is not None + else None + ) + for _k, _v in obj.get("{{{baseName}}}", {}).items() + ){{^-last}},{{/-last}} + {{/items.isArray}} + {{/items.isContainer}} + {{^items.isContainer}} + "{{{baseName}}}": dict( + (_k, {{{items.dataType}}}.from_dict(_v)) + for _k, _v in obj["{{{baseName}}}"].items() + ) + if obj.get("{{{baseName}}}") is not None + else None{{^-last}},{{/-last}} + {{/items.isContainer}} + {{/items.isEnumOrRef}} + {{#items.isEnumOrRef}} + "{{{baseName}}}": dict((_k, _v) for _k, _v in obj.get("{{{baseName}}}").items()) if obj.get("{{{baseName}}}") is not None else None{{^-last}},{{/-last}} + {{/items.isEnumOrRef}} + {{/items.isPrimitiveType}} + {{#items.isPrimitiveType}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{^-last}},{{/-last}} + {{/items.isPrimitiveType}} + {{/isMap}} + {{/isContainer}} + {{^isContainer}} + {{^isPrimitiveType}} + {{^isEnumOrRef}} + "{{{baseName}}}": {{{dataType}}}.from_dict(obj["{{{baseName}}}"]) if obj.get("{{{baseName}}}") is not None else None{{^-last}},{{/-last}} + {{/isEnumOrRef}} + {{#isEnumOrRef}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{#defaultValue}} if obj.get("{{baseName}}") is not None else {{defaultValue}}{{/defaultValue}}{{^-last}},{{/-last}} + {{/isEnumOrRef}} + {{/isPrimitiveType}} + {{#isPrimitiveType}} + {{#defaultValue}} + "{{{baseName}}}": obj.get("{{{baseName}}}") if obj.get("{{{baseName}}}") is not None else {{{defaultValue}}}{{^-last}},{{/-last}} + {{/defaultValue}} + {{^defaultValue}} + "{{{baseName}}}": obj.get("{{{baseName}}}"){{^-last}},{{/-last}} + {{/defaultValue}} + {{/isPrimitiveType}} + {{/isContainer}} + {{/allVars}} + }) + {{#isAdditionalPropertiesTrue}} + # store additional fields in additional_properties + for _key in obj.keys(): + if _key not in cls.__properties: + _obj.additional_properties[_key] = obj.get(_key) + + {{/isAdditionalPropertiesTrue}} + return _obj + {{/hasChildren}} + +{{#vendorExtensions.x-py-postponed-model-imports.size}} +{{#vendorExtensions.x-py-postponed-model-imports}} +{{{.}}} +{{/vendorExtensions.x-py-postponed-model-imports}} +# TODO: Rewrite to not use raise_errors +{{classname}}.model_rebuild(raise_errors=False) +{{/vendorExtensions.x-py-postponed-model-imports.size}} \ No newline at end of file diff --git a/regula/documentreader/webclient/ext/__init__.py b/regula/documentreader/webclient/ext/__init__.py index cb38314..0df1eef 100755 --- a/regula/documentreader/webclient/ext/__init__.py +++ b/regula/documentreader/webclient/ext/__init__.py @@ -6,7 +6,6 @@ from regula.documentreader.webclient.ext.models.authenticity.ocr_security_text import OCRSecurityTextChecks from regula.documentreader.webclient.ext.models.authenticity.security_feature import SecurityFeatureChecks from regula.documentreader.webclient.ext.models.images import Images, ImagesField -from regula.documentreader.webclient.ext.models.raw_result_item import RawResultItem from regula.documentreader.webclient.ext.models.recognition_request import RecognitionRequest, RecognitionImage from regula.documentreader.webclient.ext.models.recognition_response import RecognitionResponse from regula.documentreader.webclient.ext.models.text import Text diff --git a/regula/documentreader/webclient/ext/api/document_reader_api.py b/regula/documentreader/webclient/ext/api/document_reader_api.py index b554471..13ade47 100755 --- a/regula/documentreader/webclient/ext/api/document_reader_api.py +++ b/regula/documentreader/webclient/ext/api/document_reader_api.py @@ -25,8 +25,8 @@ def __init__(self, host=None, debug=False, verify_ssl=True, api_client=None): def __enter__(self): return self - def __exit__(self, exc_type, exc_val, exc_tb): - self.api_client.close() + def __exit__(self, exc_type, exc_value, traceback): + pass def set_configuration(self, configuration) -> None: self.api_client.configuration = configuration diff --git a/regula/documentreader/webclient/ext/models/__init__.py b/regula/documentreader/webclient/ext/models/__init__.py index 0d04edc..acf7975 100755 --- a/regula/documentreader/webclient/ext/models/__init__.py +++ b/regula/documentreader/webclient/ext/models/__init__.py @@ -5,8 +5,6 @@ from regula.documentreader.webclient.ext.models.authenticity.ocr_security_text import OCRSecurityTextChecks from regula.documentreader.webclient.ext.models.authenticity.security_feature import SecurityFeatureChecks from regula.documentreader.webclient.ext.models.images import Images, ImagesField -from regula.documentreader.webclient.ext.models.raw_authenticity_result_item import RawAuthenticityCheckResultItem -from regula.documentreader.webclient.ext.models.raw_result_item import RawResultItem from regula.documentreader.webclient.ext.models.recognition_request import RecognitionImage from regula.documentreader.webclient.ext.models.recognition_request import RecognitionRequest from regula.documentreader.webclient.ext.models.recognition_response import RecognitionResponse diff --git a/regula/documentreader/webclient/ext/models/authenticity/authenticity_check_list.py b/regula/documentreader/webclient/ext/models/authenticity/authenticity_check_list.py index 7dc85b7..64c9819 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/authenticity_check_list.py +++ b/regula/documentreader/webclient/ext/models/authenticity/authenticity_check_list.py @@ -1,6 +1,7 @@ from typing import Optional -from regula.documentreader.webclient import gen, AuthenticityResultType +from regula.documentreader.webclient.gen.models import AuthenticityCheckList as GenAuthenticityCheckList +from regula.documentreader.webclient.gen.models import AuthenticityResultType, AuthenticityCheckResult from regula.documentreader.webclient.ext.models.authenticity.fiber import FiberChecks from regula.documentreader.webclient.ext.models.authenticity.ident import IdentChecks from regula.documentreader.webclient.ext.models.authenticity.image_ident import ImageIdentChecks @@ -8,71 +9,85 @@ from regula.documentreader.webclient.ext.models.authenticity.security_feature import SecurityFeatureChecks -class AuthenticityCheckList(gen.AuthenticityCheckList): +class AuthenticityCheckList(GenAuthenticityCheckList): @property def uv_luminescence_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.UV_LUMINESCENCE, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.UV_LUMINESCENCE) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def ir_b900_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.IR_B900, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.IR_B900) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def image_pattern_checks(self) -> Optional[IdentChecks]: - return self.__result_by_type(AuthenticityResultType.IMAGE_PATTERN, IdentChecks) + result = self.__result_by_type(AuthenticityResultType.IMAGE_PATTERN) + return IdentChecks.from_dict(result.to_dict()) @property def axial_protection_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.AXIAL_PROTECTION, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.AXIAL_PROTECTION) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def uv_fiber_checks(self) -> Optional[FiberChecks]: - return self.__result_by_type(AuthenticityResultType.UV_FIBERS, FiberChecks) + result = self.__result_by_type(AuthenticityResultType.UV_FIBERS) + return FiberChecks.from_dict(result.to_dict()) @property def ir_visibility_checks(self) -> Optional[IdentChecks]: - return self.__result_by_type(AuthenticityResultType.IR_VISIBILITY, IdentChecks) + result = self.__result_by_type(AuthenticityResultType.IR_VISIBILITY) + return IdentChecks.from_dict(result.to_dict()) @property def ocr_security_text_checks(self) -> Optional[OCRSecurityTextChecks]: - return self.__result_by_type(AuthenticityResultType.OCR_SECURITY_TEXT, OCRSecurityTextChecks) + result = self.__result_by_type(AuthenticityResultType.OCR_SECURITY_TEXT) + return OCRSecurityTextChecks.from_dict(result.to_dict()) @property def ipi_checks(self) -> Optional[ImageIdentChecks]: - return self.__result_by_type(AuthenticityResultType.IPI, ImageIdentChecks) + result = self.__result_by_type(AuthenticityResultType.IPI) + return ImageIdentChecks.from_dict(result.to_dict()) @property def embed_image_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.PHOTO_EMBED_TYPE, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.PHOTO_EMBED_TYPE) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def holograms_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.HOLOGRAMS, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.HOLOGRAMS) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def photo_area_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.PHOTO_AREA, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.PHOTO_AREA) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def portrait_comparison_checks(self) -> Optional[IdentChecks]: - return self.__result_by_type(AuthenticityResultType.PORTRAIT_COMPARISON, IdentChecks) + result = self.__result_by_type(AuthenticityResultType.PORTRAIT_COMPARISON) + return IdentChecks.from_dict(result.to_dict()) @property def barcode_format_checks(self) -> Optional[SecurityFeatureChecks]: - return self.__result_by_type(AuthenticityResultType.BARCODE_FORMAT_CHECK, SecurityFeatureChecks) + result = self.__result_by_type(AuthenticityResultType.BARCODE_FORMAT_CHECK) + return SecurityFeatureChecks.from_dict(result.to_dict()) @property def kinegram_checks(self) -> Optional[IdentChecks]: - return self.__result_by_type(AuthenticityResultType.KINEGRAM, IdentChecks) + result = self.__result_by_type(AuthenticityResultType.KINEGRAM) + return IdentChecks.from_dict(result.to_dict()) @property def letter_screen_checks(self) -> Optional[IdentChecks]: - return self.__result_by_type(AuthenticityResultType.LETTER_SCREEN, IdentChecks) + result = self.__result_by_type(AuthenticityResultType.LETTER_SCREEN) + return IdentChecks.from_dict(result.to_dict()) - def __result_by_type(self, authenticity_type: int, parent_class: type) -> Optional[gen.AuthenticityCheckResult]: + def __result_by_type(self, authenticity_type: int) -> Optional[AuthenticityCheckResult]: for result in self.list: if result.type == authenticity_type: - result.__class__ = parent_class return result return None diff --git a/regula/documentreader/webclient/ext/models/authenticity/fiber.py b/regula/documentreader/webclient/ext/models/authenticity/fiber.py index f275e18..43c3039 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/fiber.py +++ b/regula/documentreader/webclient/ext/models/authenticity/fiber.py @@ -1,11 +1,11 @@ from typing import List -from regula.documentreader.webclient import gen +from regula.documentreader.webclient.gen.models import FiberResult, AuthenticityCheckResult -class FiberChecks(gen.AuthenticityCheckResult): +class FiberChecks(AuthenticityCheckResult): - @gen.AuthenticityCheckResult.list.getter - def list(self) -> List[gen.FiberResult]: + @property + def list(self) -> List[FiberResult]: # noinspection PyTypeChecker return super().list diff --git a/regula/documentreader/webclient/ext/models/authenticity/ident.py b/regula/documentreader/webclient/ext/models/authenticity/ident.py index bfbab83..2146849 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/ident.py +++ b/regula/documentreader/webclient/ext/models/authenticity/ident.py @@ -1,14 +1,15 @@ -from typing import List, Optional +from typing import List -from regula.documentreader.webclient import gen +from regula.documentreader.webclient.gen.models import AuthenticityCheckResult, IdentResult -class IdentChecks(gen.AuthenticityCheckResult): - @gen.AuthenticityCheckResult.list.getter - def list(self) -> List[gen.IdentResult]: +class IdentChecks(AuthenticityCheckResult): + + @property + def list(self) -> List[IdentResult]: # noinspection PyTypeChecker - return super().list + return self.list # element_type is SecurityFeatureType - def checks_by_element(self, element_type: int) -> List[gen.IdentResult]: + def checks_by_element(self, element_type: int) -> List[IdentResult]: return [check for check in self.list if check.element_type == element_type] diff --git a/regula/documentreader/webclient/ext/models/authenticity/image_ident.py b/regula/documentreader/webclient/ext/models/authenticity/image_ident.py index 63d0fc3..200fda9 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/image_ident.py +++ b/regula/documentreader/webclient/ext/models/authenticity/image_ident.py @@ -1,10 +1,11 @@ from typing import List -from regula.documentreader.webclient import gen +from regula.documentreader.webclient.gen.models import AuthenticityCheckResult, PhotoIdentResult -class ImageIdentChecks(gen.AuthenticityCheckResult): - @gen.AuthenticityCheckResult.list.getter - def list(self) -> List[gen.PhotoIdentResult]: +class ImageIdentChecks(AuthenticityCheckResult): + + @property + def list(self) -> List[PhotoIdentResult]: # noinspection PyTypeChecker - return super().list + return self.list diff --git a/regula/documentreader/webclient/ext/models/authenticity/ocr_security_text.py b/regula/documentreader/webclient/ext/models/authenticity/ocr_security_text.py index e617ecb..2617639 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/ocr_security_text.py +++ b/regula/documentreader/webclient/ext/models/authenticity/ocr_security_text.py @@ -1,11 +1,11 @@ from typing import List -from regula.documentreader.webclient import gen +from regula.documentreader.webclient.gen.models import AuthenticityCheckResult, OCRSecurityTextResult -class OCRSecurityTextChecks(gen.AuthenticityCheckResult): +class OCRSecurityTextChecks(AuthenticityCheckResult): - @gen.AuthenticityCheckResult.list.getter - def list(self) -> List[gen.OCRSecurityTextResult]: + @property + def list(self) -> List[OCRSecurityTextResult]: # noinspection PyTypeChecker - return super().list + return self.list diff --git a/regula/documentreader/webclient/ext/models/authenticity/security_feature.py b/regula/documentreader/webclient/ext/models/authenticity/security_feature.py index 266d506..276a7c9 100644 --- a/regula/documentreader/webclient/ext/models/authenticity/security_feature.py +++ b/regula/documentreader/webclient/ext/models/authenticity/security_feature.py @@ -1,13 +1,15 @@ from typing import List, Optional -from regula.documentreader.webclient import gen +from regula.documentreader.webclient.gen.models import AuthenticityCheckResult, SecurityFeatureResult -class SecurityFeatureChecks(gen.AuthenticityCheckResult): - @gen.AuthenticityCheckResult.list.getter - def list(self) -> List[gen.SecurityFeatureResult]: - return super().list +class SecurityFeatureChecks(AuthenticityCheckResult): + + @property + def list(self) -> List[SecurityFeatureResult]: + # noinspection PyTypeChecker + return self.list # element_type is SecurityFeatureType - def checks_by_element(self, element_type: int) -> List[gen.SecurityFeatureResult]: + def checks_by_element(self, element_type: int) -> List[SecurityFeatureResult]: return [check for check in self.list if check.element_type == element_type] diff --git a/regula/documentreader/webclient/ext/models/images.py b/regula/documentreader/webclient/ext/models/images.py index 115b745..42c0a98 100755 --- a/regula/documentreader/webclient/ext/models/images.py +++ b/regula/documentreader/webclient/ext/models/images.py @@ -1,10 +1,10 @@ import base64 from typing import Optional, List -from regula.documentreader.webclient.gen.models import Images as GenImages, ImagesField as GetImagesField, Source +from regula.documentreader.webclient.gen.models import Images as GenImages, ImagesField as GenImagesField, Source -class ImagesField(GetImagesField): +class ImagesField(GenImagesField): def get_value(self, source: str = None, original=False) -> Optional[bytes]: @@ -33,8 +33,8 @@ class Images(GenImages): def get_field(self, field_type: int) -> Optional[ImagesField]: for field in self.field_list: if field.field_type == field_type: - return field + return ImagesField.from_dict(field.to_dict()) return None def get_fields(self, field_type: int) -> List[ImagesField]: - return [field for field in self.field_list if field.field_type == field_type] + return [ImagesField.from_dict(field.to_dict()) for field in self.field_list if field.field_type == field_type] diff --git a/regula/documentreader/webclient/ext/models/raw_authenticity_result_item.py b/regula/documentreader/webclient/ext/models/raw_authenticity_result_item.py deleted file mode 100644 index 9cdf967..0000000 --- a/regula/documentreader/webclient/ext/models/raw_authenticity_result_item.py +++ /dev/null @@ -1,27 +0,0 @@ -from copy import copy - -from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem - - -class RawAuthenticityCheckResultItem(AuthenticityCheckResultItem): - openapi_types = copy(AuthenticityCheckResultItem.openapi_types) - openapi_types["raw"] = "dict" - - attribute_map = copy(AuthenticityCheckResultItem.attribute_map) - attribute_map["raw"] = "raw" - - def __init__(self, type=0, element_result=None, element_diagnose=None, raw=None, percent_value=None, local_vars_configuration=None): - super().__init__(type, element_result, element_diagnose, percent_value, local_vars_configuration) - self.__raw = raw - - @property - def raw(self): - return self.__raw - - def to_dict(self): - result = super(RawAuthenticityCheckResultItem, self).to_dict() - result["raw"] = self.__raw - return result - - def get_real_child_model(self, data): - return None diff --git a/regula/documentreader/webclient/ext/models/raw_result_item.py b/regula/documentreader/webclient/ext/models/raw_result_item.py deleted file mode 100755 index e975442..0000000 --- a/regula/documentreader/webclient/ext/models/raw_result_item.py +++ /dev/null @@ -1,26 +0,0 @@ -from copy import copy - -from regula.documentreader.webclient.gen.models.result_item import ResultItem - - -class RawResultItem(ResultItem): - openapi_types = copy(ResultItem.openapi_types) - openapi_types["raw"] = "dict" - - attribute_map = copy(ResultItem.attribute_map) - attribute_map["raw"] = "raw" - - def __init__(self, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=None, raw=None, - local_vars_configuration=None): - super().__init__(buf_length, light, list_idx, page_idx, result_type, local_vars_configuration) - self.__raw = raw - - @property - def raw(self): - return self.__raw - - def to_dict(self): - return self.__raw - - def get_real_child_model(self, data): - return None diff --git a/regula/documentreader/webclient/ext/models/recognition_request.py b/regula/documentreader/webclient/ext/models/recognition_request.py index 2c57182..2504a42 100755 --- a/regula/documentreader/webclient/ext/models/recognition_request.py +++ b/regula/documentreader/webclient/ext/models/recognition_request.py @@ -1,4 +1,3 @@ -import json import base64 from typing import List, Union @@ -15,7 +14,11 @@ class RecognitionImage(ProcessRequestImage): def __init__(self, image: Union[bytes, Base64String], light_index=None, page_index=None): if isinstance(image, bytes): image = base64.b64encode(image).decode("utf-8") - super().__init__(ImageData(image), light_index, page_index) + super().__init__( + ImageData = ImageData(image = image), + light = light_index, + page_index = page_index, + ) class LicenseRequest(LicenseResult): @@ -29,12 +32,12 @@ def __init__(self, _license: Union[bytes, Base64String], _buf_length = len(_license) _result_type = Result.LICENSE super().__init__( - __license, - _buf_length, - _light, - _list_idx, - _page_idx, - _result_type + License = __license, + buf_length = _buf_length, + light = _light, + list_idx = _list_idx, + page_idx = _page_idx, + result_type = _result_type ) @@ -50,12 +53,12 @@ def __init__(self, _encrypted_rcl: Union[bytes, Base64String] = None, _buf_length = len(_encrypted_rcl) _result_type = Result.ENCRYPTED_RCL super().__init__( - __encrypted_rcl, - _buf_length, - _light, - _list_idx, - _page_idx, - _result_type + EncryptedRCL = __encrypted_rcl, + buf_length = _buf_length, + light = _light, + list_idx = _list_idx, + page_idx = _page_idx, + result_type = _result_type ) @@ -75,19 +78,15 @@ def __init__( else: input_images.append(image) super().__init__( - process_param=process_params, - list=input_images, - system_info=system_info, + processParam=process_params, + List=input_images, + systemInfo=system_info, tag=tag ) if container_list: super().__init__( - process_param=process_params, - container_list=container_list, - system_info=system_info, + processParam=process_params, + ContainerList=container_list, + systemInfo=system_info, tag=tag ) - - @property - def json(self) -> str: - return json.dumps(self.to_dict()) diff --git a/regula/documentreader/webclient/ext/models/recognition_response.py b/regula/documentreader/webclient/ext/models/recognition_response.py index 3624a80..c977efa 100755 --- a/regula/documentreader/webclient/ext/models/recognition_response.py +++ b/regula/documentreader/webclient/ext/models/recognition_response.py @@ -1,5 +1,4 @@ import base64 -import json import zlib from typing import Optional, List from regula.documentreader.webclient import ImageQualityCheckList, OneCandidate @@ -21,13 +20,9 @@ def __init__(self, process_response: ProcessResponse): def text(self) -> Optional[Text]: result = self.result_by_type(Result.TEXT) if result: - return result.text + return Text.from_dict(result.text.to_dict()) return None - @property - def json(self) -> str: - return json.dumps(self.low_lvl_response.to_dict()) - @property def status(self) -> Optional[Status]: result = self.result_by_type(Result.STATUS) @@ -39,13 +34,13 @@ def status(self) -> Optional[Status]: def images(self) -> Optional[Images]: result = self.result_by_type(Result.IMAGES) if result: - return result.images + return Images.from_dict(result.images.to_dict()) return None def authenticity(self, page_idx=0) -> Optional[AuthenticityCheckList]: result = self.pageable_result_by_type(Result.AUTHENTICITY, page_idx) if result: - return result.authenticity_check_list + return AuthenticityCheckList.from_dict(result.authenticity_check_list.to_dict()) return None def image_quality_checks(self, page_idx=0) -> Optional[ImageQualityCheckList]: @@ -85,3 +80,6 @@ def __eq__(self, other: object) -> bool: if not isinstance(other, RecognitionResponse): return False return self.low_lvl_response == other.low_lvl_response + + def to_json(self) -> str: + return self.low_lvl_response.to_json() diff --git a/regula/documentreader/webclient/ext/models/text.py b/regula/documentreader/webclient/ext/models/text.py index 6aba338..754c27b 100755 --- a/regula/documentreader/webclient/ext/models/text.py +++ b/regula/documentreader/webclient/ext/models/text.py @@ -1,4 +1,4 @@ -from typing import Optional, List +from typing import Optional from regula.documentreader.webclient.ext.models.text_field import TextField from regula.documentreader.webclient.gen.models import LCID, Text as GenText @@ -11,12 +11,12 @@ def get_field(self, field_type: int, lcid: int = None) -> Optional[TextField]: for field in self.field_list: if field.field_type == field_type: if lcid is not None and field.lcid == lcid: - return field + return TextField.from_dict(field.to_dict()) elif lcid is None and field.lcid == LCID.LATIN: - return field + return TextField.from_dict(field.to_dict()) elif lcid is None and result is None: result = field - return result + return TextField.from_dict(result.to_dict()) def get_field_value(self, field_type: int, lcid: int = None) -> Optional[str]: field = self.get_field(field_type, lcid) @@ -27,18 +27,13 @@ def get_field_by_name(self, field_name: str, lcid: int = None) -> Optional[TextF for field in self.field_list: if field.field_name == field_name: if lcid is not None and field.lcid == lcid: - return field + return TextField.from_dict(field.to_dict()) elif lcid is None and field.lcid == LCID.LATIN: - return field + return TextField.from_dict(field.to_dict()) elif lcid is None and result is None: result = field - return result + return TextField.from_dict(result.to_dict()) def get_field_value_by_name(self, field_name: str, lcid: int = None) -> Optional[str]: field = self.get_field_by_name(field_name, lcid) return field.value if field else None - - @GenText.field_list.getter - def field_list(self) -> List[TextField]: - # fix type hinting - return super().field_list diff --git a/regula/documentreader/webclient/gen/__init__.py b/regula/documentreader/webclient/gen/__init__.py old mode 100755 new mode 100644 index 6f8c6ec..e8ac421 --- a/regula/documentreader/webclient/gen/__init__.py +++ b/regula/documentreader/webclient/gen/__init__.py @@ -6,8 +6,6 @@ Generated by: https://openapi-generator.tech """ -from __future__ import absolute_import - __version__ = "1.0.0" # import apis into sdk package @@ -16,6 +14,7 @@ from regula.documentreader.webclient.gen.api.transaction_api import TransactionApi # import ApiClient +from regula.documentreader.webclient.gen.api_response import ApiResponse from regula.documentreader.webclient.gen.api_client import ApiClient from regula.documentreader.webclient.gen.configuration import Configuration from regula.documentreader.webclient.gen.exceptions import OpenApiException @@ -24,26 +23,33 @@ from regula.documentreader.webclient.gen.exceptions import ApiKeyError from regula.documentreader.webclient.gen.exceptions import ApiAttributeError from regula.documentreader.webclient.gen.exceptions import ApiException + # import models into sdk package from regula.documentreader.webclient.gen.models.area_array import AreaArray from regula.documentreader.webclient.gen.models.area_container import AreaContainer from regula.documentreader.webclient.gen.models.auth_params import AuthParams from regula.documentreader.webclient.gen.models.authenticity_check_list import AuthenticityCheckList +from regula.documentreader.webclient.gen.models.authenticity_check_list_item import AuthenticityCheckListItem from regula.documentreader.webclient.gen.models.authenticity_check_result import AuthenticityCheckResult from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_check_result_list_inner import AuthenticityCheckResultListInner from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult -from regula.documentreader.webclient.gen.models.authenticity_result_all_of import AuthenticityResultAllOf from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.bar_code_module_type import BarCodeModuleType +from regula.documentreader.webclient.gen.models.barcode_type import BarcodeType from regula.documentreader.webclient.gen.models.bc_pdf417_info import BcPDF417INFO from regula.documentreader.webclient.gen.models.bc_roidetect import BcROIDETECT +from regula.documentreader.webclient.gen.models.binary_data import BinaryData +from regula.documentreader.webclient.gen.models.byte_array_item import ByteArrayItem from regula.documentreader.webclient.gen.models.byte_array_result import ByteArrayResult -from regula.documentreader.webclient.gen.models.byte_array_result_all_of import ByteArrayResultAllOf +from regula.documentreader.webclient.gen.models.candidates_list_item import CandidatesListItem +from regula.documentreader.webclient.gen.models.certificate_data import CertificateData from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose from regula.documentreader.webclient.gen.models.check_result import CheckResult from regula.documentreader.webclient.gen.models.chosen_document_type import ChosenDocumentType from regula.documentreader.webclient.gen.models.chosen_document_type_result import ChosenDocumentTypeResult -from regula.documentreader.webclient.gen.models.chosen_document_type_result_all_of import ChosenDocumentTypeResultAllOf from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.container_list_list_inner import ContainerListListInner from regula.documentreader.webclient.gen.models.critical import Critical from regula.documentreader.webclient.gen.models.cross_source_value_comparison import CrossSourceValueComparison from regula.documentreader.webclient.gen.models.data_module import DataModule @@ -51,86 +57,103 @@ from regula.documentreader.webclient.gen.models.details_rfid import DetailsRFID from regula.documentreader.webclient.gen.models.device_info import DeviceInfo from regula.documentreader.webclient.gen.models.doc_bar_code_info import DocBarCodeInfo -from regula.documentreader.webclient.gen.models.doc_bar_code_info_all_of import DocBarCodeInfoAllOf from regula.documentreader.webclient.gen.models.doc_bar_code_info_fields_list import DocBarCodeInfoFieldsList +from regula.documentreader.webclient.gen.models.doc_bar_code_info_item import DocBarCodeInfoItem +from regula.documentreader.webclient.gen.models.doc_graphics_info_item import DocGraphicsInfoItem from regula.documentreader.webclient.gen.models.doc_visual_extended_field import DocVisualExtendedField +from regula.documentreader.webclient.gen.models.doc_visual_extended_field_item import DocVisualExtendedFieldItem from regula.documentreader.webclient.gen.models.doc_visual_extended_info import DocVisualExtendedInfo +from regula.documentreader.webclient.gen.models.doc_visual_extended_info_item import DocVisualExtendedInfoItem +from regula.documentreader.webclient.gen.models.document_binary_info_result import DocumentBinaryInfoResult from regula.documentreader.webclient.gen.models.document_format import DocumentFormat from regula.documentreader.webclient.gen.models.document_image import DocumentImage from regula.documentreader.webclient.gen.models.document_image_result import DocumentImageResult -from regula.documentreader.webclient.gen.models.document_image_result_all_of import DocumentImageResultAllOf from regula.documentreader.webclient.gen.models.document_position import DocumentPosition +from regula.documentreader.webclient.gen.models.document_position_item import DocumentPositionItem from regula.documentreader.webclient.gen.models.document_position_result import DocumentPositionResult -from regula.documentreader.webclient.gen.models.document_position_result_all_of import DocumentPositionResultAllOf from regula.documentreader.webclient.gen.models.document_type import DocumentType from regula.documentreader.webclient.gen.models.document_type_recognition_result import DocumentTypeRecognitionResult from regula.documentreader.webclient.gen.models.document_types_candidates import DocumentTypesCandidates from regula.documentreader.webclient.gen.models.document_types_candidates_list import DocumentTypesCandidatesList from regula.documentreader.webclient.gen.models.document_types_candidates_result import DocumentTypesCandidatesResult -from regula.documentreader.webclient.gen.models.document_types_candidates_result_all_of import DocumentTypesCandidatesResultAllOf from regula.documentreader.webclient.gen.models.documents_database import DocumentsDatabase +from regula.documentreader.webclient.gen.models.encrypted_rcl_item import EncryptedRCLItem from regula.documentreader.webclient.gen.models.encrypted_rcl_result import EncryptedRCLResult -from regula.documentreader.webclient.gen.models.encrypted_rcl_result_all_of import EncryptedRCLResultAllOf +from regula.documentreader.webclient.gen.models.error_coordinates import ErrorCoordinates from regula.documentreader.webclient.gen.models.fdsid_list import FDSIDList from regula.documentreader.webclient.gen.models.face_api import FaceApi from regula.documentreader.webclient.gen.models.face_api_search import FaceApiSearch +from regula.documentreader.webclient.gen.models.face_detection import FaceDetection +from regula.documentreader.webclient.gen.models.face_detection_item import FaceDetectionItem +from regula.documentreader.webclient.gen.models.face_detection_result import FaceDetectionResult +from regula.documentreader.webclient.gen.models.face_item import FaceItem +from regula.documentreader.webclient.gen.models.fiber_item import FiberItem from regula.documentreader.webclient.gen.models.fiber_result import FiberResult -from regula.documentreader.webclient.gen.models.fiber_result_all_of import FiberResultAllOf +from regula.documentreader.webclient.gen.models.field_item import FieldItem +from regula.documentreader.webclient.gen.models.file_image import FileImage from regula.documentreader.webclient.gen.models.get_transactions_by_tag_response import GetTransactionsByTagResponse +from regula.documentreader.webclient.gen.models.graph_data import GraphData from regula.documentreader.webclient.gen.models.graphic_field import GraphicField from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType from regula.documentreader.webclient.gen.models.graphic_fields_list import GraphicFieldsList from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult -from regula.documentreader.webclient.gen.models.graphics_result_all_of import GraphicsResultAllOf from regula.documentreader.webclient.gen.models.healthcheck import Healthcheck from regula.documentreader.webclient.gen.models.healthcheck_documents_database import HealthcheckDocumentsDatabase +from regula.documentreader.webclient.gen.models.ident_item import IdentItem from regula.documentreader.webclient.gen.models.ident_result import IdentResult -from regula.documentreader.webclient.gen.models.ident_result_all_of import IdentResultAllOf from regula.documentreader.webclient.gen.models.image_data import ImageData from regula.documentreader.webclient.gen.models.image_qa import ImageQA from regula.documentreader.webclient.gen.models.image_quality_check import ImageQualityCheck from regula.documentreader.webclient.gen.models.image_quality_check_list import ImageQualityCheckList +from regula.documentreader.webclient.gen.models.image_quality_check_list_item import ImageQualityCheckListItem from regula.documentreader.webclient.gen.models.image_quality_check_type import ImageQualityCheckType from regula.documentreader.webclient.gen.models.image_quality_result import ImageQualityResult -from regula.documentreader.webclient.gen.models.image_quality_result_all_of import ImageQualityResultAllOf from regula.documentreader.webclient.gen.models.image_transaction_data import ImageTransactionData from regula.documentreader.webclient.gen.models.images import Images from regula.documentreader.webclient.gen.models.images_available_source import ImagesAvailableSource from regula.documentreader.webclient.gen.models.images_field import ImagesField from regula.documentreader.webclient.gen.models.images_field_value import ImagesFieldValue +from regula.documentreader.webclient.gen.models.images_item import ImagesItem from regula.documentreader.webclient.gen.models.images_result import ImagesResult -from regula.documentreader.webclient.gen.models.images_result_all_of import ImagesResultAllOf from regula.documentreader.webclient.gen.models.in_data import InData from regula.documentreader.webclient.gen.models.in_data_transaction_images_field_value import InDataTransactionImagesFieldValue from regula.documentreader.webclient.gen.models.in_data_video import InDataVideo -from regula.documentreader.webclient.gen.models.inline_response200 import InlineResponse200 -from regula.documentreader.webclient.gen.models.inline_response2001 import InlineResponse2001 from regula.documentreader.webclient.gen.models.input_barcode_type import InputBarcodeType from regula.documentreader.webclient.gen.models.input_image_quality_checks import InputImageQualityChecks from regula.documentreader.webclient.gen.models.lcid import LCID from regula.documentreader.webclient.gen.models.lexical_analysis_result import LexicalAnalysisResult -from regula.documentreader.webclient.gen.models.lexical_analysis_result_all_of import LexicalAnalysisResultAllOf +from regula.documentreader.webclient.gen.models.license_item import LicenseItem from regula.documentreader.webclient.gen.models.license_result import LicenseResult -from regula.documentreader.webclient.gen.models.license_result_all_of import LicenseResultAllOf from regula.documentreader.webclient.gen.models.light import Light from regula.documentreader.webclient.gen.models.list_transactions_by_tag_response import ListTransactionsByTagResponse from regula.documentreader.webclient.gen.models.list_verified_fields import ListVerifiedFields +from regula.documentreader.webclient.gen.models.list_verified_fields_item import ListVerifiedFieldsItem from regula.documentreader.webclient.gen.models.liveness_params import LivenessParams from regula.documentreader.webclient.gen.models.log_level import LogLevel +from regula.documentreader.webclient.gen.models.mrz_detector_result import MRZDetectorResult from regula.documentreader.webclient.gen.models.mrz_format import MRZFormat +from regula.documentreader.webclient.gen.models.mrz_position_result import MRZPositionResult +from regula.documentreader.webclient.gen.models.mrz_rows_item import MRZRowsItem +from regula.documentreader.webclient.gen.models.mrz_test_quality import MRZTestQuality +from regula.documentreader.webclient.gen.models.mrz_test_quality_item import MRZTestQualityItem +from regula.documentreader.webclient.gen.models.mrz_test_quality_result import MRZTestQualityResult from regula.documentreader.webclient.gen.models.measure_system import MeasureSystem from regula.documentreader.webclient.gen.models.mrz_detect_mode_enum import MrzDetectModeEnum +from regula.documentreader.webclient.gen.models.mrz_position import MrzPosition +from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem +from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult -from regula.documentreader.webclient.gen.models.ocr_security_text_result_all_of import OCRSecurityTextResultAllOf from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol from regula.documentreader.webclient.gen.models.out_data import OutData from regula.documentreader.webclient.gen.models.out_data_transaction_images_field_value import OutDataTransactionImagesFieldValue from regula.documentreader.webclient.gen.models.p_array_field import PArrayField +from regula.documentreader.webclient.gen.models.parsed_data import ParsedData from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes from regula.documentreader.webclient.gen.models.per_document_config import PerDocumentConfig +from regula.documentreader.webclient.gen.models.photo_ident_item import PhotoIdentItem from regula.documentreader.webclient.gen.models.photo_ident_result import PhotoIdentResult -from regula.documentreader.webclient.gen.models.photo_ident_result_all_of import PhotoIdentResultAllOf from regula.documentreader.webclient.gen.models.point import Point from regula.documentreader.webclient.gen.models.point_array import PointArray from regula.documentreader.webclient.gen.models.points_container import PointsContainer @@ -141,39 +164,89 @@ from regula.documentreader.webclient.gen.models.process_response import ProcessResponse from regula.documentreader.webclient.gen.models.process_system_info import ProcessSystemInfo from regula.documentreader.webclient.gen.models.processing_status import ProcessingStatus +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_field import RFIDDocVisualExtendedField +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_field_item import RFIDDocVisualExtendedFieldItem +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info import RFIDDocVisualExtendedInfo +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info_item import RFIDDocVisualExtendedInfoItem +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.rfid_graphics_info_result import RFIDGraphicsInfoResult +from regula.documentreader.webclient.gen.models.rfidpkd_resource_type import RFIDPKDResourceType +from regula.documentreader.webclient.gen.models.rfid_text_data_result import RFIDTextDataResult +from regula.documentreader.webclient.gen.models.raw_image_container_item import RawImageContainerItem from regula.documentreader.webclient.gen.models.raw_image_container_list import RawImageContainerList from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates from regula.documentreader.webclient.gen.models.result import Result from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector +from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem +from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip +from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo +from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType +from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey +from regula.documentreader.webclient.gen.models.rfid_application import RfidApplication +from regula.documentreader.webclient.gen.models.rfid_application_type import RfidApplicationType +from regula.documentreader.webclient.gen.models.rfid_attribute_data import RfidAttributeData +from regula.documentreader.webclient.gen.models.rfid_attribute_name import RfidAttributeName +from regula.documentreader.webclient.gen.models.rfid_authentication_procedure_type import RfidAuthenticationProcedureType +from regula.documentreader.webclient.gen.models.rfid_baud_rate import RfidBaudRate +from regula.documentreader.webclient.gen.models.rfid_card_properties_ext import RfidCardPropertiesExt +from regula.documentreader.webclient.gen.models.rfid_certificate_ex import RfidCertificateEx +from regula.documentreader.webclient.gen.models.rfid_certificate_origin import RfidCertificateOrigin +from regula.documentreader.webclient.gen.models.rfid_certificate_type import RfidCertificateType +from regula.documentreader.webclient.gen.models.rfid_dg1 import RfidDG1 +from regula.documentreader.webclient.gen.models.rfid_data_file import RfidDataFile +from regula.documentreader.webclient.gen.models.rfid_data_file_type import RfidDataFileType +from regula.documentreader.webclient.gen.models.rfid_data_group_type_tag import RfidDataGroupTypeTag +from regula.documentreader.webclient.gen.models.rfid_distinguished_name import RfidDistinguishedName from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation from regula.documentreader.webclient.gen.models.rfid_origin import RfidOrigin +from regula.documentreader.webclient.gen.models.rfid_password_type import RfidPasswordType +from regula.documentreader.webclient.gen.models.rfid_pki_extension import RfidPkiExtension +from regula.documentreader.webclient.gen.models.rfid_raw_data import RfidRawData +from regula.documentreader.webclient.gen.models.rfid_security_object import RfidSecurityObject +from regula.documentreader.webclient.gen.models.rfid_session_data import RfidSessionData +from regula.documentreader.webclient.gen.models.rfid_signer_info_ex import RfidSignerInfoEx +from regula.documentreader.webclient.gen.models.rfid_terminal import RfidTerminal +from regula.documentreader.webclient.gen.models.rfid_terminal_type import RfidTerminalType +from regula.documentreader.webclient.gen.models.rfid_type import RfidType +from regula.documentreader.webclient.gen.models.rfid_validity import RfidValidity from regula.documentreader.webclient.gen.models.scenario import Scenario +from regula.documentreader.webclient.gen.models.security_feature_item import SecurityFeatureItem from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult -from regula.documentreader.webclient.gen.models.security_feature_result_all_of import SecurityFeatureResultAllOf from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from regula.documentreader.webclient.gen.models.security_object_certificates import SecurityObjectCertificates from regula.documentreader.webclient.gen.models.source import Source from regula.documentreader.webclient.gen.models.source_validity import SourceValidity from regula.documentreader.webclient.gen.models.status import Status +from regula.documentreader.webclient.gen.models.status_item import StatusItem from regula.documentreader.webclient.gen.models.status_result import StatusResult -from regula.documentreader.webclient.gen.models.status_result_all_of import StatusResultAllOf +from regula.documentreader.webclient.gen.models.string_item import StringItem from regula.documentreader.webclient.gen.models.string_recognition_result import StringRecognitionResult +from regula.documentreader.webclient.gen.models.symbol import Symbol from regula.documentreader.webclient.gen.models.symbol_candidate import SymbolCandidate +from regula.documentreader.webclient.gen.models.symbol_estimation_item import SymbolEstimationItem from regula.documentreader.webclient.gen.models.symbol_recognition_result import SymbolRecognitionResult +from regula.documentreader.webclient.gen.models.t_doc_binary_info import TDocBinaryInfo +from regula.documentreader.webclient.gen.models.t_doc_binary_info_item import TDocBinaryInfoItem +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info import TOriginalRFIDGraphicsInfo +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info_item import TOriginalRFIDGraphicsInfoItem from regula.documentreader.webclient.gen.models.text import Text from regula.documentreader.webclient.gen.models.text_available_source import TextAvailableSource from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult -from regula.documentreader.webclient.gen.models.text_data_result_all_of import TextDataResultAllOf from regula.documentreader.webclient.gen.models.text_field import TextField from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType from regula.documentreader.webclient.gen.models.text_field_value import TextFieldValue +from regula.documentreader.webclient.gen.models.text_item import TextItem from regula.documentreader.webclient.gen.models.text_post_processing import TextPostProcessing from regula.documentreader.webclient.gen.models.text_result import TextResult -from regula.documentreader.webclient.gen.models.text_result_all_of import TextResultAllOf from regula.documentreader.webclient.gen.models.transaction_image import TransactionImage from regula.documentreader.webclient.gen.models.transaction_info import TransactionInfo from regula.documentreader.webclient.gen.models.transaction_process_get_response import TransactionProcessGetResponse from regula.documentreader.webclient.gen.models.transaction_process_request import TransactionProcessRequest +from regula.documentreader.webclient.gen.models.transaction_process_result import TransactionProcessResult +from regula.documentreader.webclient.gen.models.trf_ft_bytes import TrfFtBytes +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString from regula.documentreader.webclient.gen.models.verification_result import VerificationResult from regula.documentreader.webclient.gen.models.verified_field_map import VerifiedFieldMap from regula.documentreader.webclient.gen.models.visibility import Visibility - +from regula.documentreader.webclient.gen.models.visual_extended_field_item import VisualExtendedFieldItem diff --git a/regula/documentreader/webclient/gen/api/__init__.py b/regula/documentreader/webclient/gen/api/__init__.py old mode 100755 new mode 100644 index 12efc92..b26c61e --- a/regula/documentreader/webclient/gen/api/__init__.py +++ b/regula/documentreader/webclient/gen/api/__init__.py @@ -1,8 +1,7 @@ -from __future__ import absolute_import - # flake8: noqa # import apis into api package from regula.documentreader.webclient.gen.api.healthcheck_api import HealthcheckApi from regula.documentreader.webclient.gen.api.process_api import ProcessApi from regula.documentreader.webclient.gen.api.transaction_api import TransactionApi + diff --git a/regula/documentreader/webclient/gen/api/default_api.py b/regula/documentreader/webclient/gen/api/default_api.py deleted file mode 100755 index 20faf67..0000000 --- a/regula/documentreader/webclient/gen/api/default_api.py +++ /dev/null @@ -1,160 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -from __future__ import absolute_import - -import re # noqa: F401 - -# python 2 and python 3 compatibility library -import six - -from regula.documentreader.webclient.gen.api_client import ApiClient -from regula.documentreader.webclient.gen.exceptions import ( # noqa: F401 - ApiTypeError, - ApiValueError -) - - -class DefaultApi(object): - """NOTE: This class is auto generated by OpenAPI Generator - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - def __init__(self, api_client=None): - if api_client is None: - api_client = ApiClient() - self.api_client = api_client - - def ping(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.ping(async_req=True) - >>> result = thread.get() - - :param x_request_id: - :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: DeviceInfo - """ - kwargs['_return_http_data_only'] = True - return self.ping_with_http_info(**kwargs) # noqa: E501 - - def ping_with_http_info(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.ping_with_http_info(async_req=True) - >>> result = thread.get() - - :param x_request_id: - :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. - :type _request_auth: dict, optional - :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(DeviceInfo, status_code(int), headers(HTTPHeaderDict)) - """ - - local_var_params = locals() - - all_params = [ - 'x_request_id' - ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' - ] - ) - - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method ping" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - - collection_formats = {} - - path_params = {} - - query_params = [] - - header_params = {} - if 'x_request_id' in local_var_params: - header_params['X-RequestID'] = local_var_params['x_request_id'] # noqa: E501 - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "DeviceInfo", - } - - return self.api_client.call_api( - '/api/ping', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) diff --git a/regula/documentreader/webclient/gen/api/healthcheck_api.py b/regula/documentreader/webclient/gen/api/healthcheck_api.py index 98f5ad6..f9bfb0a 100644 --- a/regula/documentreader/webclient/gen/api/healthcheck_api.py +++ b/regula/documentreader/webclient/gen/api/healthcheck_api.py @@ -3,410 +3,799 @@ """ Generated by: https://openapi-generator.tech """ +import warnings +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Any, Dict, List, Optional, Tuple, Union +from typing_extensions import Annotated -from __future__ import absolute_import +from pydantic import StrictStr +from typing import Optional +from regula.documentreader.webclient.gen.models.device_info import DeviceInfo +from regula.documentreader.webclient.gen.models.healthcheck import Healthcheck -import re # noqa: F401 +from regula.documentreader.webclient.gen.api_client import ApiClient, RequestSerialized +from regula.documentreader.webclient.gen.api_response import ApiResponse +from regula.documentreader.webclient.gen.rest import RESTResponseType -# python 2 and python 3 compatibility library -import six -from regula.documentreader.webclient.gen.api_client import ApiClient -from regula.documentreader.webclient.gen.exceptions import ( # noqa: F401 - ApiTypeError, - ApiValueError -) - - -class HealthcheckApi(object): +class HealthcheckApi: """NOTE: This class is auto generated by OpenAPI Generator Ref: https://openapi-generator.tech Do not edit the class manually. """ - def __init__(self, api_client=None): + def __init__(self, api_client=None) -> None: if api_client is None: - api_client = ApiClient() + api_client = ApiClient.get_default() self.api_client = api_client - def healthz(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def healthz( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> Healthcheck: + """Server health check - >>> thread = api.healthz(async_req=True) - >>> result = thread.get() :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: Healthcheck - """ - kwargs['_return_http_data_only'] = True - return self.healthz_with_http_info(**kwargs) # noqa: E501 - - def healthz_with_http_info(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 + """ # noqa: E501 + + _param = self._healthz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + _response_types_map: Dict[str, Optional[str]] = { + '200': "Healthcheck", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def healthz_with_http_info( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[Healthcheck]: + """Server health check - >>> thread = api.healthz_with_http_info(async_req=True) - >>> result = thread.get() :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(Healthcheck, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._healthz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - local_var_params = locals() + _response_types_map: Dict[str, Optional[str]] = { + '200': "Healthcheck", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - all_params = [ - 'x_request_id' - ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + @validate_call + def healthz_without_preload_content( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Server health check + + + :param x_request_id: + :type x_request_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._healthz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method healthz" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] + _response_types_map: Dict[str, Optional[str]] = { + '200': "Healthcheck", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _healthz_serialize( + self, + x_request_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } - collection_formats = {} + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + if x_request_id is not None: + _header_params['X-RequestID'] = x_request_id + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ + ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/healthz', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) - path_params = {} - query_params = [] - header_params = {} - if 'x_request_id' in local_var_params: - header_params['X-RequestID'] = local_var_params['x_request_id'] # noqa: E501 - form_params = [] - local_var_files = {} + @validate_call + def ping( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> DeviceInfo: + """(Deprecated) Server health check - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "Healthcheck", + :param x_request_id: + :type x_request_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + warnings.warn("GET /api/ping is deprecated.", DeprecationWarning) + + _param = self._ping_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "DeviceInfo", } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def ping_with_http_info( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[DeviceInfo]: + """(Deprecated) Server health check - return self.api_client.call_api( - '/api/healthz', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def ping(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.ping(async_req=True) - >>> result = thread.get() :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: DeviceInfo - """ - kwargs['_return_http_data_only'] = True - return self.ping_with_http_info(**kwargs) # noqa: E501 + """ # noqa: E501 + warnings.warn("GET /api/ping is deprecated.", DeprecationWarning) + + _param = self._ping_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - def ping_with_http_info(self, **kwargs): # noqa: E501 - """Server health check # noqa: E501 + _response_types_map: Dict[str, Optional[str]] = { + '200': "DeviceInfo", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.ping_with_http_info(async_req=True) - >>> result = thread.get() + @validate_call + def ping_without_preload_content( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """(Deprecated) Server health check + :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(DeviceInfo, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + warnings.warn("GET /api/ping is deprecated.", DeprecationWarning) + + _param = self._ping_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "DeviceInfo", + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _ping_serialize( + self, + x_request_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: - local_var_params = locals() + _host = None - all_params = [ - 'x_request_id' + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + if x_request_id is not None: + _header_params['X-RequestID'] = x_request_id + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' - ] - ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method ping" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] + return self.api_client.param_serialize( + method='GET', + resource_path='/api/ping', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) - collection_formats = {} - path_params = {} - query_params = [] - header_params = {} - if 'x_request_id' in local_var_params: - header_params['X-RequestID'] = local_var_params['x_request_id'] # noqa: E501 + @validate_call + def readyz( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> None: + """License health check - form_params = [] - local_var_files = {} - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 + :param x_request_id: + :type x_request_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._readyz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "DeviceInfo", + _response_types_map: Dict[str, Optional[str]] = { + '200': None, + '400': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def readyz_with_http_info( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[None]: + """License health check - return self.api_client.call_api( - '/api/ping', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def readyz(self, **kwargs): # noqa: E501 - """License health check # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.readyz(async_req=True) - >>> result = thread.get() :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: None - """ - kwargs['_return_http_data_only'] = True - return self.readyz_with_http_info(**kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._readyz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': None, + '400': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def readyz_with_http_info(self, **kwargs): # noqa: E501 - """License health check # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def readyz_without_preload_content( + self, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """License health check - >>> thread = api.readyz_with_http_info(async_req=True) - >>> result = thread.get() :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: None - """ + """ # noqa: E501 + + _param = self._readyz_serialize( + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': None, + '400': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _readyz_serialize( + self, + x_request_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None - local_var_params = locals() + # process the path parameters + # process the query parameters + # process the header parameters + if x_request_id is not None: + _header_params['X-RequestID'] = x_request_id + # process the form parameters + # process the body parameter - all_params = [ - 'x_request_id' + + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' - ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/readyz', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method readyz" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - - collection_formats = {} - - path_params = {} - - query_params = [] - - header_params = {} - if 'x_request_id' in local_var_params: - header_params['X-RequestID'] = local_var_params['x_request_id'] # noqa: E501 - - form_params = [] - local_var_files = {} - - body_params = None - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = {} - - return self.api_client.call_api( - '/api/readyz', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) + diff --git a/regula/documentreader/webclient/gen/api/process_api.py b/regula/documentreader/webclient/gen/api/process_api.py index b6197a1..d720053 100644 --- a/regula/documentreader/webclient/gen/api/process_api.py +++ b/regula/documentreader/webclient/gen/api/process_api.py @@ -3,175 +3,320 @@ """ Generated by: https://openapi-generator.tech """ +import warnings +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Any, Dict, List, Optional, Tuple, Union +from typing_extensions import Annotated -from __future__ import absolute_import +from pydantic import StrictStr +from typing import Optional +from regula.documentreader.webclient.gen.models.process_request import ProcessRequest +from regula.documentreader.webclient.gen.models.process_response import ProcessResponse -import re # noqa: F401 +from regula.documentreader.webclient.gen.api_client import ApiClient, RequestSerialized +from regula.documentreader.webclient.gen.api_response import ApiResponse +from regula.documentreader.webclient.gen.rest import RESTResponseType -# python 2 and python 3 compatibility library -import six -from regula.documentreader.webclient.gen.api_client import ApiClient -from regula.documentreader.webclient.gen.exceptions import ( # noqa: F401 - ApiTypeError, - ApiValueError -) - - -class ProcessApi(object): +class ProcessApi: """NOTE: This class is auto generated by OpenAPI Generator Ref: https://openapi-generator.tech Do not edit the class manually. """ - def __init__(self, api_client=None): + def __init__(self, api_client=None) -> None: if api_client is None: - api_client = ApiClient() + api_client = ApiClient.get_default() self.api_client = api_client - def api_process(self, process_request, **kwargs): # noqa: E501 - """Process list of documents images and return extracted data # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_process( + self, + process_request: ProcessRequest, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ProcessResponse: + """Process list of documents images and return extracted data - >>> thread = api.api_process(process_request, async_req=True) - >>> result = thread.get() :param process_request: (required) :type process_request: ProcessRequest :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: ProcessResponse - """ - kwargs['_return_http_data_only'] = True - return self.api_process_with_http_info(process_request, **kwargs) # noqa: E501 + """ # noqa: E501 - def api_process_with_http_info(self, process_request, **kwargs): # noqa: E501 - """Process list of documents images and return extracted data # noqa: E501 + _param = self._api_process_serialize( + process_request=process_request, + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_process_with_http_info( + self, + process_request: ProcessRequest, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ProcessResponse]: + """Process list of documents images and return extracted data - >>> thread = api.api_process_with_http_info(process_request, async_req=True) - >>> result = thread.get() :param process_request: (required) :type process_request: ProcessRequest :param x_request_id: :type x_request_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(ProcessResponse, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 - local_var_params = locals() + _param = self._api_process_serialize( + process_request=process_request, + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - all_params = [ - 'process_request', - 'x_request_id' - ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) + + + @validate_call + def api_process_without_preload_content( + self, + process_request: ProcessRequest, + x_request_id: Optional[StrictStr] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Process list of documents images and return extracted data + + + :param process_request: (required) + :type process_request: ProcessRequest + :param x_request_id: + :type x_request_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_process_serialize( + process_request=process_request, + x_request_id=x_request_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_process" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'process_request' is set - if self.api_client.client_side_validation and ('process_request' not in local_var_params or # noqa: E501 - local_var_params['process_request'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `process_request` when calling `api_process`") # noqa: E501 - - collection_formats = {} - - path_params = {} - - query_params = [] - - header_params = {} - if 'x_request_id' in local_var_params: - header_params['X-RequestID'] = local_var_params['x_request_id'] # noqa: E501 - - form_params = [] - local_var_files = {} - - body_params = None - if 'process_request' in local_var_params: - body_params = local_var_params['process_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "ProcessResponse", - 400: None, - 403: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _api_process_serialize( + self, + process_request, + x_request_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + # process the query parameters + # process the header parameters + if x_request_id is not None: + _header_params['X-RequestID'] = x_request_id + # process the form parameters + # process the body parameter + if process_request is not None: + _body_params = process_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type + + # authentication setting + _auth_settings: List[str] = [ + ] + + return self.api_client.param_serialize( + method='POST', + resource_path='/api/process', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + - return self.api_client.call_api( - '/api/process', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) diff --git a/regula/documentreader/webclient/gen/api/transaction_api.py b/regula/documentreader/webclient/gen/api/transaction_api.py index f708054..aef94e4 100644 --- a/regula/documentreader/webclient/gen/api/transaction_api.py +++ b/regula/documentreader/webclient/gen/api/transaction_api.py @@ -3,871 +3,1670 @@ """ Generated by: https://openapi-generator.tech """ - -from __future__ import absolute_import - -import re # noqa: F401 - -# python 2 and python 3 compatibility library -import six - -from regula.documentreader.webclient.gen.api_client import ApiClient -from regula.documentreader.webclient.gen.exceptions import ( # noqa: F401 - ApiTypeError, - ApiValueError -) - - -class TransactionApi(object): +import warnings +from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt +from typing import Any, Dict, List, Optional, Tuple, Union +from typing_extensions import Annotated + +from pydantic import Field, StrictBool, StrictBytes, StrictStr +from typing import Any, Dict, Optional, Tuple, Union +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.list_transactions_by_tag_response import ListTransactionsByTagResponse +from regula.documentreader.webclient.gen.models.process_response import ProcessResponse +from regula.documentreader.webclient.gen.models.transaction_process_get_response import TransactionProcessGetResponse +from regula.documentreader.webclient.gen.models.transaction_process_request import TransactionProcessRequest +from regula.documentreader.webclient.gen.models.transaction_process_result import TransactionProcessResult + +from regula.documentreader.webclient.gen.api_client import ApiClient, RequestSerialized +from regula.documentreader.webclient.gen.api_response import ApiResponse +from regula.documentreader.webclient.gen.rest import RESTResponseType + + +class TransactionApi: """NOTE: This class is auto generated by OpenAPI Generator Ref: https://openapi-generator.tech Do not edit the class manually. """ - def __init__(self, api_client=None): + def __init__(self, api_client=None) -> None: if api_client is None: - api_client = ApiClient() + api_client = ApiClient.get_default() self.api_client = api_client - def api_v2_tag_tag_id_delete(self, tag_id, **kwargs): # noqa: E501 - """Delete Reprocess transactions by tag # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_tag_tag_id_delete( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> object: + """Delete Reprocess transactions by tag - >>> thread = api.api_v2_tag_tag_id_delete(tag_id, async_req=True) - >>> result = thread.get() :param tag_id: Tag id (required) :type tag_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: object - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_tag_tag_id_delete_with_http_info(tag_id, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_delete_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': "object", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_tag_tag_id_delete_with_http_info( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[object]: + """Delete Reprocess transactions by tag + + + :param tag_id: Tag id (required) + :type tag_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_delete_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': "object", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def api_v2_tag_tag_id_delete_with_http_info(self, tag_id, **kwargs): # noqa: E501 - """Delete Reprocess transactions by tag # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_tag_tag_id_delete_without_preload_content( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Delete Reprocess transactions by tag - >>> thread = api.api_v2_tag_tag_id_delete_with_http_info(tag_id, async_req=True) - >>> result = thread.get() :param tag_id: Tag id (required) :type tag_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(object, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_delete_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '204': "object", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _api_v2_tag_tag_id_delete_serialize( + self, + tag_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: - local_var_params = locals() + _host = None - all_params = [ - 'tag_id' + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if tag_id is not None: + _path_params['tagId'] = tag_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + return self.api_client.param_serialize( + method='DELETE', + resource_path='/api/v2/tag/{tagId}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def api_v2_tag_tag_id_transactions_get( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ListTransactionsByTagResponse: + """Get transactions by tag + + + :param tag_id: Tag id (required) + :type tag_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_transactions_get_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_tag_tag_id_delete" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'tag_id' is set - if self.api_client.client_side_validation and ('tag_id' not in local_var_params or # noqa: E501 - local_var_params['tag_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `tag_id` when calling `api_v2_tag_tag_id_delete`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'tag_id' in local_var_params: - path_params['tagId'] = local_var_params['tag_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 204: "object", - 400: None, - 403: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "ListTransactionsByTagResponse", + '400': None, + '403': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_tag_tag_id_transactions_get_with_http_info( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ListTransactionsByTagResponse]: + """Get transactions by tag - return self.api_client.call_api( - '/api/v2/tag/{tagId}', 'DELETE', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def api_v2_tag_tag_id_transactions_get(self, tag_id, **kwargs): # noqa: E501 - """Get transactions by tag # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.api_v2_tag_tag_id_transactions_get(tag_id, async_req=True) - >>> result = thread.get() :param tag_id: Tag id (required) :type tag_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: ListTransactionsByTagResponse - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_tag_tag_id_transactions_get_with_http_info(tag_id, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_transactions_get_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - def api_v2_tag_tag_id_transactions_get_with_http_info(self, tag_id, **kwargs): # noqa: E501 - """Get transactions by tag # noqa: E501 + _response_types_map: Dict[str, Optional[str]] = { + '200': "ListTransactionsByTagResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - >>> thread = api.api_v2_tag_tag_id_transactions_get_with_http_info(tag_id, async_req=True) - >>> result = thread.get() + @validate_call + def api_v2_tag_tag_id_transactions_get_without_preload_content( + self, + tag_id: Annotated[StrictStr, Field(description="Tag id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get transactions by tag + :param tag_id: Tag id (required) :type tag_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(ListTransactionsByTagResponse, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_tag_tag_id_transactions_get_serialize( + tag_id=tag_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ListTransactionsByTagResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _api_v2_tag_tag_id_transactions_get_serialize( + self, + tag_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: - local_var_params = locals() + _host = None - all_params = [ - 'tag_id' + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if tag_id is not None: + _path_params['tagId'] = tag_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/v2/tag/{tagId}/transactions', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def api_v2_transaction_transaction_id_file_get( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + name: Annotated[StrictStr, Field(description="File name")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> bytearray: + """Get Reprocess transaction file + + + :param transaction_id: Transaction id (required) + :type transaction_id: str + :param name: File name (required) + :type name: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_file_get_serialize( + transaction_id=transaction_id, + name=name, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_tag_tag_id_transactions_get" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'tag_id' is set - if self.api_client.client_side_validation and ('tag_id' not in local_var_params or # noqa: E501 - local_var_params['tag_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `tag_id` when calling `api_v2_tag_tag_id_transactions_get`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'tag_id' in local_var_params: - path_params['tagId'] = local_var_params['tag_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "ListTransactionsByTagResponse", - 400: None, - 403: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "bytearray", + '404': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_transaction_transaction_id_file_get_with_http_info( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + name: Annotated[StrictStr, Field(description="File name")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[bytearray]: + """Get Reprocess transaction file - return self.api_client.call_api( - '/api/v2/tag/{tagId}/transactions', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def api_v2_transaction_transaction_id_file_get(self, transaction_id, name, **kwargs): # noqa: E501 - """Get Reprocess transaction file # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.api_v2_transaction_transaction_id_file_get(transaction_id, name, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param name: File name (required) :type name: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: file - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_transaction_transaction_id_file_get_with_http_info(transaction_id, name, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_file_get_serialize( + transaction_id=transaction_id, + name=name, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "bytearray", + '404': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def api_v2_transaction_transaction_id_file_get_with_http_info(self, transaction_id, name, **kwargs): # noqa: E501 - """Get Reprocess transaction file # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_transaction_transaction_id_file_get_without_preload_content( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + name: Annotated[StrictStr, Field(description="File name")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Reprocess transaction file - >>> thread = api.api_v2_transaction_transaction_id_file_get_with_http_info(transaction_id, name, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param name: File name (required) :type name: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(file, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_file_get_serialize( + transaction_id=transaction_id, + name=name, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "bytearray", + '404': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response - local_var_params = locals() - all_params = [ - 'transaction_id', - 'name' + def _api_v2_transaction_transaction_id_file_get_serialize( + self, + transaction_id, + name, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if transaction_id is not None: + _path_params['transactionId'] = transaction_id + # process the query parameters + if name is not None: + + _query_params.append(('name', name)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/octet-stream' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/v2/transaction/{transactionId}/file', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def api_v2_transaction_transaction_id_get( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> TransactionProcessGetResponse: + """Get Reprocess transaction data + + + :param transaction_id: Transaction id (required) + :type transaction_id: str + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_get_serialize( + transaction_id=transaction_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_transaction_transaction_id_file_get" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'transaction_id' is set - if self.api_client.client_side_validation and ('transaction_id' not in local_var_params or # noqa: E501 - local_var_params['transaction_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `transaction_id` when calling `api_v2_transaction_transaction_id_file_get`") # noqa: E501 - # verify the required parameter 'name' is set - if self.api_client.client_side_validation and ('name' not in local_var_params or # noqa: E501 - local_var_params['name'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `name` when calling `api_v2_transaction_transaction_id_file_get`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'transaction_id' in local_var_params: - path_params['transactionId'] = local_var_params['transaction_id'] # noqa: E501 - - query_params = [] - if 'name' in local_var_params and local_var_params['name'] is not None: # noqa: E501 - query_params.append(('name', local_var_params['name'])) # noqa: E501 - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/octet-stream']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "file", - 404: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessGetResponse", + '400': None, + '403': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_transaction_transaction_id_get_with_http_info( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[TransactionProcessGetResponse]: + """Get Reprocess transaction data - return self.api_client.call_api( - '/api/v2/transaction/{transactionId}/file', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def api_v2_transaction_transaction_id_get(self, transaction_id, **kwargs): # noqa: E501 - """Get Reprocess transaction data # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.api_v2_transaction_transaction_id_get(transaction_id, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: TransactionProcessGetResponse - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_transaction_transaction_id_get_with_http_info(transaction_id, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_get_serialize( + transaction_id=transaction_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessGetResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def api_v2_transaction_transaction_id_get_with_http_info(self, transaction_id, **kwargs): # noqa: E501 - """Get Reprocess transaction data # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_transaction_transaction_id_get_without_preload_content( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Reprocess transaction data - >>> thread = api.api_v2_transaction_transaction_id_get_with_http_info(transaction_id, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(TransactionProcessGetResponse, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_get_serialize( + transaction_id=transaction_id, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessGetResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response - local_var_params = locals() - all_params = [ - 'transaction_id' + def _api_v2_transaction_transaction_id_get_serialize( + self, + transaction_id, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if transaction_id is not None: + _path_params['transactionId'] = transaction_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/v2/transaction/{transactionId}', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def api_v2_transaction_transaction_id_process_post( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + transaction_process_request: TransactionProcessRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> TransactionProcessResult: + """Reprocess + + + :param transaction_id: Transaction id (required) + :type transaction_id: str + :param transaction_process_request: (required) + :type transaction_process_request: TransactionProcessRequest + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_process_post_serialize( + transaction_id=transaction_id, + transaction_process_request=transaction_process_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_transaction_transaction_id_get" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'transaction_id' is set - if self.api_client.client_side_validation and ('transaction_id' not in local_var_params or # noqa: E501 - local_var_params['transaction_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `transaction_id` when calling `api_v2_transaction_transaction_id_get`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'transaction_id' in local_var_params: - path_params['transactionId'] = local_var_params['transaction_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "TransactionProcessGetResponse", - 400: None, - 403: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessResult", + '400': None, + '403': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_transaction_transaction_id_process_post_with_http_info( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + transaction_process_request: TransactionProcessRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[TransactionProcessResult]: + """Reprocess - return self.api_client.call_api( - '/api/v2/transaction/{transactionId}', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def api_v2_transaction_transaction_id_process_post(self, transaction_id, transaction_process_request, **kwargs): # noqa: E501 - """Reprocess # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.api_v2_transaction_transaction_id_process_post(transaction_id, transaction_process_request, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param transaction_process_request: (required) :type transaction_process_request: TransactionProcessRequest - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: InlineResponse200 - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_transaction_transaction_id_process_post_with_http_info(transaction_id, transaction_process_request, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_process_post_serialize( + transaction_id=transaction_id, + transaction_process_request=transaction_process_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessResult", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def api_v2_transaction_transaction_id_process_post_with_http_info(self, transaction_id, transaction_process_request, **kwargs): # noqa: E501 - """Reprocess # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_transaction_transaction_id_process_post_without_preload_content( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + transaction_process_request: TransactionProcessRequest, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Reprocess - >>> thread = api.api_v2_transaction_transaction_id_process_post_with_http_info(transaction_id, transaction_process_request, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param transaction_process_request: (required) :type transaction_process_request: TransactionProcessRequest - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(InlineResponse200, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_process_post_serialize( + transaction_id=transaction_id, + transaction_process_request=transaction_process_request, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) - local_var_params = locals() + _response_types_map: Dict[str, Optional[str]] = { + '200': "TransactionProcessResult", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + + + def _api_v2_transaction_transaction_id_process_post_serialize( + self, + transaction_id, + transaction_process_request, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: + + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if transaction_id is not None: + _path_params['transactionId'] = transaction_id + # process the query parameters + # process the header parameters + # process the form parameters + # process the body parameter + if transaction_process_request is not None: + _body_params = transaction_process_request + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + # set the HTTP header `Content-Type` + if _content_type: + _header_params['Content-Type'] = _content_type + else: + _default_content_type = ( + self.api_client.select_header_content_type( + [ + 'application/json' + ] + ) + ) + if _default_content_type is not None: + _header_params['Content-Type'] = _default_content_type - all_params = [ - 'transaction_id', - 'transaction_process_request' + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' + + return self.api_client.param_serialize( + method='POST', + resource_path='/api/v2/transaction/{transactionId}/process', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth + ) + + + + + @validate_call + def api_v2_transaction_transaction_id_results_get( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + with_images: Annotated[Optional[StrictBool], Field(description="With base64 images or url")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ProcessResponse: + """Get Reprocess transaction result + + + :param transaction_id: Transaction id (required) + :type transaction_id: str + :param with_images: With base64 images or url + :type with_images: bool + :param _request_timeout: timeout setting for this request. If one + number provided, it will be total request + timeout. It can also be a pair (tuple) of + (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional + :return: Returns the result object. + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_results_get_serialize( + transaction_id=transaction_id, + with_images=with_images, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_transaction_transaction_id_process_post" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'transaction_id' is set - if self.api_client.client_side_validation and ('transaction_id' not in local_var_params or # noqa: E501 - local_var_params['transaction_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `transaction_id` when calling `api_v2_transaction_transaction_id_process_post`") # noqa: E501 - # verify the required parameter 'transaction_process_request' is set - if self.api_client.client_side_validation and ('transaction_process_request' not in local_var_params or # noqa: E501 - local_var_params['transaction_process_request'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `transaction_process_request` when calling `api_v2_transaction_transaction_id_process_post`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'transaction_id' in local_var_params: - path_params['transactionId'] = local_var_params['transaction_id'] # noqa: E501 - - query_params = [] - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - if 'transaction_process_request' in local_var_params: - body_params = local_var_params['transaction_process_request'] - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # HTTP header `Content-Type` - header_params['Content-Type'] = self.api_client.select_header_content_type( # noqa: E501 - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "InlineResponse200", - 400: None, - 403: None, + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ).data + + + @validate_call + def api_v2_transaction_transaction_id_results_get_with_http_info( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + with_images: Annotated[Optional[StrictBool], Field(description="With base64 images or url")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> ApiResponse[ProcessResponse]: + """Get Reprocess transaction result - return self.api_client.call_api( - '/api/v2/transaction/{transactionId}/process', 'POST', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) - - def api_v2_transaction_transaction_id_results_get(self, transaction_id, **kwargs): # noqa: E501 - """Get Reprocess transaction result # noqa: E501 - - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True - - >>> thread = api.api_v2_transaction_transaction_id_results_get(transaction_id, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param with_images: With base64 images or url :type with_images: bool - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the + authentication in the spec for a single request. + :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: InlineResponse2001 - """ - kwargs['_return_http_data_only'] = True - return self.api_v2_transaction_transaction_id_results_get_with_http_info(transaction_id, **kwargs) # noqa: E501 + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_results_get_serialize( + transaction_id=transaction_id, + with_images=with_images, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + response_data.read() + return self.api_client.response_deserialize( + response_data=response_data, + response_types_map=_response_types_map, + ) - def api_v2_transaction_transaction_id_results_get_with_http_info(self, transaction_id, **kwargs): # noqa: E501 - """Get Reprocess transaction result # noqa: E501 - This method makes a synchronous HTTP request by default. To make an - asynchronous HTTP request, please pass async_req=True + @validate_call + def api_v2_transaction_transaction_id_results_get_without_preload_content( + self, + transaction_id: Annotated[StrictStr, Field(description="Transaction id")], + with_images: Annotated[Optional[StrictBool], Field(description="With base64 images or url")] = None, + _request_timeout: Union[ + None, + Annotated[StrictFloat, Field(gt=0)], + Tuple[ + Annotated[StrictFloat, Field(gt=0)], + Annotated[StrictFloat, Field(gt=0)] + ] + ] = None, + _request_auth: Optional[Dict[StrictStr, Any]] = None, + _content_type: Optional[StrictStr] = None, + _headers: Optional[Dict[StrictStr, Any]] = None, + _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0, + ) -> RESTResponseType: + """Get Reprocess transaction result - >>> thread = api.api_v2_transaction_transaction_id_results_get_with_http_info(transaction_id, async_req=True) - >>> result = thread.get() :param transaction_id: Transaction id (required) :type transaction_id: str :param with_images: With base64 images or url :type with_images: bool - :param async_req: Whether to execute the request asynchronously. - :type async_req: bool, optional - :param _return_http_data_only: response data without head status code - and headers - :type _return_http_data_only: bool, optional - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :type _preload_content: bool, optional :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. + :type _request_timeout: int, tuple(int, int), optional :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. + request; this effectively ignores the + authentication in the spec for a single request. :type _request_auth: dict, optional + :param _content_type: force content-type for the request. + :type _content_type: str, Optional + :param _headers: set to override the headers for a single + request; this effectively ignores the headers + in the spec for a single request. + :type _headers: dict, optional + :param _host_index: set to override the host_index for a single + request; this effectively ignores the host_index + in the spec for a single request. + :type _host_index: int, optional :return: Returns the result object. - If the method is called asynchronously, - returns the request thread. - :rtype: tuple(InlineResponse2001, status_code(int), headers(HTTPHeaderDict)) - """ + """ # noqa: E501 + + _param = self._api_v2_transaction_transaction_id_results_get_serialize( + transaction_id=transaction_id, + with_images=with_images, + _request_auth=_request_auth, + _content_type=_content_type, + _headers=_headers, + _host_index=_host_index + ) + + _response_types_map: Dict[str, Optional[str]] = { + '200': "ProcessResponse", + '400': None, + '403': None, + } + response_data = self.api_client.call_api( + *_param, + _request_timeout=_request_timeout + ) + return response_data.response + - local_var_params = locals() + def _api_v2_transaction_transaction_id_results_get_serialize( + self, + transaction_id, + with_images, + _request_auth, + _content_type, + _headers, + _host_index, + ) -> RequestSerialized: - all_params = [ - 'transaction_id', - 'with_images' + _host = None + + _collection_formats: Dict[str, str] = { + } + + _path_params: Dict[str, str] = {} + _query_params: List[Tuple[str, str]] = [] + _header_params: Dict[str, Optional[str]] = _headers or {} + _form_params: List[Tuple[str, str]] = [] + _files: Dict[ + str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]] + ] = {} + _body_params: Optional[bytes] = None + + # process the path parameters + if transaction_id is not None: + _path_params['transactionId'] = transaction_id + # process the query parameters + if with_images is not None: + + _query_params.append(('withImages', with_images)) + + # process the header parameters + # process the form parameters + # process the body parameter + + + # set the HTTP header `Accept` + if 'Accept' not in _header_params: + _header_params['Accept'] = self.api_client.select_header_accept( + [ + 'application/json' + ] + ) + + + # authentication setting + _auth_settings: List[str] = [ ] - all_params.extend( - [ - 'async_req', - '_return_http_data_only', - '_preload_content', - '_request_timeout', - '_request_auth' - ] + + return self.api_client.param_serialize( + method='GET', + resource_path='/api/v2/transaction/{transactionId}/results', + path_params=_path_params, + query_params=_query_params, + header_params=_header_params, + body=_body_params, + post_params=_form_params, + files=_files, + auth_settings=_auth_settings, + collection_formats=_collection_formats, + _host=_host, + _request_auth=_request_auth ) - for key, val in six.iteritems(local_var_params['kwargs']): - if key not in all_params: - raise ApiTypeError( - "Got an unexpected keyword argument '%s'" - " to method api_v2_transaction_transaction_id_results_get" % key - ) - local_var_params[key] = val - del local_var_params['kwargs'] - # verify the required parameter 'transaction_id' is set - if self.api_client.client_side_validation and ('transaction_id' not in local_var_params or # noqa: E501 - local_var_params['transaction_id'] is None): # noqa: E501 - raise ApiValueError("Missing the required parameter `transaction_id` when calling `api_v2_transaction_transaction_id_results_get`") # noqa: E501 - - collection_formats = {} - - path_params = {} - if 'transaction_id' in local_var_params: - path_params['transactionId'] = local_var_params['transaction_id'] # noqa: E501 - - query_params = [] - if 'with_images' in local_var_params and local_var_params['with_images'] is not None: # noqa: E501 - query_params.append(('withImages', local_var_params['with_images'])) # noqa: E501 - - header_params = {} - - form_params = [] - local_var_files = {} - - body_params = None - # HTTP header `Accept` - header_params['Accept'] = self.api_client.select_header_accept( - ['application/json']) # noqa: E501 - - # Authentication setting - auth_settings = [] # noqa: E501 - - response_types_map = { - 200: "InlineResponse2001", - 400: None, - 403: None, - } - return self.api_client.call_api( - '/api/v2/transaction/{transactionId}/results', 'GET', - path_params, - query_params, - header_params, - body=body_params, - post_params=form_params, - files=local_var_files, - response_types_map=response_types_map, - auth_settings=auth_settings, - async_req=local_var_params.get('async_req'), - _return_http_data_only=local_var_params.get('_return_http_data_only'), # noqa: E501 - _preload_content=local_var_params.get('_preload_content', True), - _request_timeout=local_var_params.get('_request_timeout'), - collection_formats=collection_formats, - _request_auth=local_var_params.get('_request_auth')) diff --git a/regula/documentreader/webclient/gen/api_client.py b/regula/documentreader/webclient/gen/api_client.py old mode 100755 new mode 100644 index 15e342d..bae09e5 --- a/regula/documentreader/webclient/gen/api_client.py +++ b/regula/documentreader/webclient/gen/api_client.py @@ -1,225 +1,40 @@ # coding: utf-8 + """ Generated by: https://openapi-generator.tech """ -from __future__ import absolute_import -import atexit import datetime -from copy import copy from dateutil.parser import parse +from enum import Enum +import decimal import json import mimetypes -from multiprocessing.pool import ThreadPool import os import re +import tempfile -# python 2 and python 3 compatibility library -import six -from six.moves.urllib.parse import quote +from urllib.parse import quote +from typing import Tuple, Optional, List, Dict, Union +from pydantic import SecretStr from regula.documentreader.webclient.gen.configuration import Configuration +from regula.documentreader.webclient.gen.api_response import ApiResponse, T as ApiResponseT import regula.documentreader.webclient.gen.models from regula.documentreader.webclient.gen import rest -from regula.documentreader.webclient.gen.exceptions import ApiValueError, ApiException - - -class ModelSerDe: - - PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types - NATIVE_TYPES_MAPPING = { - 'int': int, - 'long': int if six.PY3 else long, # noqa: F821 - 'float': float, - 'str': str, - 'bool': bool, - 'date': datetime.date, - 'datetime': datetime.datetime, - 'object': object, - } - - def sanitize_for_serialization(self, obj): - """Builds a JSON POST object. - - If obj is None, return None. - If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date - convert to string in iso8601 format. - If obj is list, sanitize each element in the list. - If obj is dict, return the dict. - If obj is OpenAPI model, return the properties dict. - - :param obj: The data to serialize. - :return: The serialized form of data. - """ - if obj is None: - return None - elif isinstance(obj, self.PRIMITIVE_TYPES): - return obj - elif isinstance(obj, list): - return [self.sanitize_for_serialization(sub_obj) - for sub_obj in obj] - elif isinstance(obj, tuple): - return tuple(self.sanitize_for_serialization(sub_obj) - for sub_obj in obj) - elif isinstance(obj, (datetime.datetime, datetime.date)): - return obj.isoformat() - - if isinstance(obj, regula.documentreader.webclient.ext.models.RawResultItem): - obj_dict = obj.raw - elif isinstance(obj, dict): - obj_dict = obj - else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - obj_dict = {obj.attribute_map[attr]: getattr(obj, attr) - for attr, _ in six.iteritems(obj.openapi_types) - if getattr(obj, attr) is not None} - - return {key: self.sanitize_for_serialization(val) - for key, val in six.iteritems(obj_dict)} - - def deserialize_raw(self, data, klass): - """Deserializes dict, list, str into an object. - - :param data: dict, list or str. - :param klass: class literal, or string of class name. - - :return: object. - """ - if data is None: - return None - - if type(klass) == str: - if klass.startswith('list['): - sub_kls = re.match(r'list\[(.*)\]', klass).group(1) - return [self.deserialize_raw(sub_data, sub_kls) - for sub_data in data] - - if klass.startswith('dict('): - sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2) - return {k: self.deserialize_raw(v, sub_kls) - for k, v in six.iteritems(data)} - - # convert str to class - if klass in self.NATIVE_TYPES_MAPPING: - klass = self.NATIVE_TYPES_MAPPING[klass] - elif hasattr(regula.documentreader.webclient.ext.models, klass): - klass = getattr(regula.documentreader.webclient.ext.models, klass) - else: - klass = getattr(regula.documentreader.webclient.gen.models, klass) - - if klass in self.PRIMITIVE_TYPES: - return self.__deserialize_primitive(data, klass) - elif klass == object: - return self.__deserialize_object(data) - elif klass == datetime.date: - return self.__deserialize_date(data) - elif klass == datetime.datetime: - return self.__deserialize_datetime(data) - else: - return self.__deserialize_model(data, klass) - - def __deserialize_primitive(self, data, klass): - """Deserializes string to primitive type. - - :param data: str. - :param klass: class literal. - - :return: int, long, float, str, bool. - """ - try: - return klass(data) - except UnicodeEncodeError: - return six.text_type(data) - except TypeError: - return data - - def __deserialize_object(self, value): - """Return an original value. - - :return: object. - """ - return value - - def __deserialize_date(self, string): - """Deserializes string to date. - - :param string: str. - :return: date. - """ - try: - return parse(string).date() - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason="Failed to parse `{0}` as date object".format(string) - ) - - def __deserialize_datetime(self, string): - """Deserializes string to datetime. - - The string should be in iso8601 datetime format. - - :param string: str. - :return: datetime. - """ - try: - return parse(string) - except ImportError: - return string - except ValueError: - raise rest.ApiException( - status=0, - reason=( - "Failed to parse `{0}` as datetime object" - .format(string) - ) - ) - - def __deserialize_model(self, data, klass): - """Deserializes list or dict to model. - - :param data: dict, list. - :param klass: class literal. - :return: model object. - """ - has_discriminator = False - if (hasattr(klass, 'get_real_child_model') - and klass.discriminator_value_class_map): - has_discriminator = True - - if not klass.openapi_types and has_discriminator is False: - return data - - kwargs = {} - if (data is not None and - klass.openapi_types is not None and - isinstance(data, (list, dict))): - - if "raw" in six.iterkeys(klass.openapi_types): - kwargs[klass.attribute_map["raw"]] = copy(data) - - for attr, attr_type in six.iteritems(klass.openapi_types): - if klass.attribute_map[attr] in data: - value = data[klass.attribute_map[attr]] - kwargs[attr] = self.deserialize_raw(value, attr_type) - - instance = klass(**kwargs) - - if has_discriminator: - klass_name = instance.get_real_child_model(data) - if klass_name: - instance = self.deserialize_raw(data, klass_name) - return instance - - -class ApiClient(ModelSerDe, object): +from regula.documentreader.webclient.gen.exceptions import ( + ApiValueError, + ApiException, + BadRequestException, + UnauthorizedException, + ForbiddenException, + NotFoundException, + ServiceException +) + +RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]] + +class ApiClient: """Generic API client for OpenAPI client library builds. OpenAPI generic API client. This client handles the client- @@ -227,28 +42,39 @@ class ApiClient(ModelSerDe, object): the methods and models for each application are generated from the OpenAPI templates. - NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - Do not edit the class manually. - :param configuration: .Configuration object for this client :param header_name: a header to pass when making calls to the API. :param header_value: a header value to pass when making calls to the API. :param cookie: a cookie to include in the header when making calls to the API - :param pool_threads: The number of threads to use for async requests - to the API. More threads means more concurrent API requests. """ + PRIMITIVE_TYPES = (float, bool, bytes, str, int) + NATIVE_TYPES_MAPPING = { + 'int': int, + 'long': int, # TODO remove as only py3 is supported? + 'float': float, + 'str': str, + 'bool': bool, + 'date': datetime.date, + 'datetime': datetime.datetime, + 'decimal': decimal.Decimal, + 'object': object, + } _pool = None - def __init__(self, configuration=None, header_name=None, header_value=None, - cookie=None, pool_threads=1): + def __init__( + self, + configuration=None, + header_name=None, + header_value=None, + cookie=None + ) -> None: + # use default configuration if none is provided if configuration is None: - configuration = Configuration.get_default_copy() + configuration = Configuration.get_default() self.configuration = configuration - self.pool_threads = pool_threads self.rest_client = rest.RESTClientObject(configuration) self.default_headers = {} @@ -263,25 +89,7 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): - self.close() - - def close(self): - if self._pool: - self._pool.close() - self._pool.join() - self._pool = None - if hasattr(atexit, 'unregister'): - atexit.unregister(self.close) - - @property - def pool(self): - """Create thread pool on first request - avoids instantiating unused threadpool for blocking clients. - """ - if self._pool is None: - atexit.register(self.close) - self._pool = ThreadPool(self.pool_threads) - return self._pool + pass @property def user_agent(self): @@ -295,13 +103,69 @@ def user_agent(self, value): def set_default_header(self, header_name, header_value): self.default_headers[header_name] = header_value - def __call_api( - self, resource_path, method, path_params=None, - query_params=None, header_params=None, body=None, post_params=None, - files=None, response_types_map=None, auth_settings=None, - _return_http_data_only=None, collection_formats=None, - _preload_content=True, _request_timeout=None, _host=None, - _request_auth=None): + + _default = None + + @classmethod + def get_default(cls): + """Return new instance of ApiClient. + + This method returns newly created, based on default constructor, + object of ApiClient class or returns a copy of default + ApiClient. + + :return: The ApiClient object. + """ + if cls._default is None: + cls._default = ApiClient() + return cls._default + + @classmethod + def set_default(cls, default): + """Set default instance of ApiClient. + + It stores default ApiClient. + + :param default: object of ApiClient. + """ + cls._default = default + + def param_serialize( + self, + method, + resource_path, + path_params=None, + query_params=None, + header_params=None, + body=None, + post_params=None, + files=None, auth_settings=None, + collection_formats=None, + _host=None, + _request_auth=None + ) -> RequestSerialized: + + """Builds the HTTP request params needed by the request. + :param method: Method to call. + :param resource_path: Path to method endpoint. + :param path_params: Path parameters in the url. + :param query_params: Query parameters in the url. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param auth_settings list: Auth Settings names for the request. + :param files dict: key -> filename, value -> filepath, + for `multipart/form-data`. + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. + :param _request_auth: set to override the auth_settings for an a single + request; this effectively ignores the authentication + in the spec for a single request. + :return: tuple of form (path, http_method, query_params, header_params, + body, post_params, files) + """ config = self.configuration @@ -312,14 +176,17 @@ def __call_api( header_params['Cookie'] = self.cookie if header_params: header_params = self.sanitize_for_serialization(header_params) - header_params = dict(self.parameters_to_tuples(header_params, - collection_formats)) + header_params = dict( + self.parameters_to_tuples(header_params,collection_formats) + ) # path parameters if path_params: path_params = self.sanitize_for_serialization(path_params) - path_params = self.parameters_to_tuples(path_params, - collection_formats) + path_params = self.parameters_to_tuples( + path_params, + collection_formats + ) for k, v in path_params: # specified safe chars, encode everything resource_path = resource_path.replace( @@ -327,219 +194,269 @@ def __call_api( quote(str(v), safe=config.safe_chars_for_path_param) ) - # query parameters - if query_params: - query_params = self.sanitize_for_serialization(query_params) - query_params = self.parameters_to_tuples(query_params, - collection_formats) - # post parameters if post_params or files: post_params = post_params if post_params else [] post_params = self.sanitize_for_serialization(post_params) - post_params = self.parameters_to_tuples(post_params, - collection_formats) - post_params.extend(self.files_parameters(files)) + post_params = self.parameters_to_tuples( + post_params, + collection_formats + ) + if files: + post_params.extend(self.files_parameters(files)) # auth setting self.update_params_for_auth( - header_params, query_params, auth_settings, - request_auth=_request_auth) + header_params, + query_params, + auth_settings, + resource_path, + method, + body, + request_auth=_request_auth + ) # body if body: body = self.sanitize_for_serialization(body) # request url - if _host is None: + if _host is None or self.configuration.ignore_operation_servers: url = self.configuration.host + resource_path else: # use server/host defined in path or operation instead url = _host + resource_path + # query parameters + if query_params: + query_params = self.sanitize_for_serialization(query_params) + url_query = self.parameters_to_url_query( + query_params, + collection_formats + ) + url += "?" + url_query + + return method, url, header_params, body, post_params + + + def call_api( + self, + method, + url, + header_params=None, + body=None, + post_params=None, + _request_timeout=None + ) -> rest.RESTResponse: + """Makes the HTTP request (synchronous) + :param method: Method to call. + :param url: Path to method endpoint. + :param header_params: Header parameters to be + placed in the request header. + :param body: Request body. + :param post_params dict: Request post form parameters, + for `application/x-www-form-urlencoded`, `multipart/form-data`. + :param _request_timeout: timeout setting for this request. + :return: RESTResponse + """ + try: # perform request and return response - response_data = self.request( - method, url, query_params=query_params, headers=header_params, - post_params=post_params, body=body, - _preload_content=_preload_content, - _request_timeout=_request_timeout) + response_data = self.rest_client.request( + method, url, + headers=header_params, + body=body, post_params=post_params, + _request_timeout=_request_timeout + ) + except ApiException as e: - e.body = e.body.decode('utf-8') if six.PY3 else e.body raise e - self.last_response = response_data - - return_data = response_data + return response_data - if not _preload_content: - return return_data + def response_deserialize( + self, + response_data: rest.RESTResponse, + response_types_map: Optional[Dict[str, ApiResponseT]]=None + ) -> ApiResponse[ApiResponseT]: + """Deserializes response into an object. + :param response_data: RESTResponse object to be deserialized. + :param response_types_map: dict of response types. + :return: ApiResponse + """ - response_type = response_types_map.get(response_data.status, None) + msg = "RESTResponse.read() must be called before passing it to response_deserialize()" + assert response_data.data is not None, msg - if six.PY3 and response_type not in ["file", "bytes"]: - match = None - content_type = response_data.getheader('content-type') - if content_type is not None: - match = re.search(r"charset=([a-zA-Z\-\d]+)[\s\;]?", content_type) - encoding = match.group(1) if match else "utf-8" - response_data.data = response_data.data.decode(encoding) + response_type = response_types_map.get(str(response_data.status), None) + if not response_type and isinstance(response_data.status, int) and 100 <= response_data.status <= 599: + # if not found, look for '1XX', '2XX', etc. + response_type = response_types_map.get(str(response_data.status)[0] + "XX", None) # deserialize response data + response_text = None + return_data = None + try: + if response_type == "bytearray": + return_data = response_data.data + elif response_type == "file": + return_data = self.__deserialize_file(response_data) + elif response_type is not None: + match = None + content_type = response_data.getheader('content-type') + if content_type is not None: + match = re.search(r"charset=([a-zA-Z\-\d]+)[\s;]?", content_type) + encoding = match.group(1) if match else "utf-8" + response_text = response_data.data.decode(encoding) + return_data = self.deserialize(response_text, response_type, content_type) + finally: + if not 200 <= response_data.status <= 299: + raise ApiException.from_response( + http_resp=response_data, + body=response_text, + data=return_data, + ) - if response_type: - return_data = self.deserialize(response_data, response_type) - else: - return_data = None + return ApiResponse( + status_code = response_data.status, + data = return_data, + headers = response_data.getheaders(), + raw_data = response_data.data + ) + + def sanitize_for_serialization(self, obj): + """Builds a JSON POST object. + + If obj is None, return None. + If obj is SecretStr, return obj.get_secret_value() + If obj is str, int, long, float, bool, return directly. + If obj is datetime.datetime, datetime.date + convert to string in iso8601 format. + If obj is decimal.Decimal return string representation. + If obj is list, sanitize each element in the list. + If obj is dict, return the dict. + If obj is OpenAPI model, return the properties dict. + + :param obj: The data to serialize. + :return: The serialized form of data. + """ + if obj is None: + return None + elif isinstance(obj, Enum): + return obj.value + elif isinstance(obj, SecretStr): + return obj.get_secret_value() + elif isinstance(obj, self.PRIMITIVE_TYPES): + return obj + elif isinstance(obj, list): + return [ + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ] + elif isinstance(obj, tuple): + return tuple( + self.sanitize_for_serialization(sub_obj) for sub_obj in obj + ) + elif isinstance(obj, (datetime.datetime, datetime.date)): + return obj.isoformat() + elif isinstance(obj, decimal.Decimal): + return str(obj) - if _return_http_data_only: - return (return_data) + elif isinstance(obj, dict): + obj_dict = obj else: - return (return_data, response_data.status, - response_data.getheaders()) + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + if hasattr(obj, 'to_dict') and callable(getattr(obj, 'to_dict')): + obj_dict = obj.to_dict() + else: + obj_dict = obj.__dict__ + + return { + key: self.sanitize_for_serialization(val) + for key, val in obj_dict.items() + } - def deserialize(self, response, response_type): + def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): """Deserializes response into an object. :param response: RESTResponse object to be deserialized. :param response_type: class literal for deserialized object, or string of class name. + :param content_type: content type of response. :return: deserialized object. """ - try: - data = json.loads(response.data) - except ValueError: - data = response.data - return self.deserialize_raw(data, response_type) - def call_api(self, resource_path, method, - path_params=None, query_params=None, header_params=None, - body=None, post_params=None, files=None, - response_types_map=None, auth_settings=None, - async_req=None, _return_http_data_only=None, - collection_formats=None,_preload_content=True, - _request_timeout=None, _host=None, _request_auth=None): - """Makes the HTTP request (synchronous) and returns deserialized data. + # fetch data from response object + if content_type is None: + try: + data = json.loads(response_text) + except ValueError: + data = response_text + elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE): + if response_text == "": + data = "" + else: + data = json.loads(response_text) + elif re.match(r'^text\/[a-z.+-]+\s*(;|$)', content_type, re.IGNORECASE): + data = response_text + else: + raise ApiException( + status=0, + reason="Unsupported content type: {0}".format(content_type) + ) - To make an async_req request, set the async_req parameter. + return self.__deserialize(data, response_type) - :param resource_path: Path to method endpoint. - :param method: Method to call. - :param path_params: Path parameters in the url. - :param query_params: Query parameters in the url. - :param header_params: Header parameters to be - placed in the request header. - :param body: Request body. - :param post_params dict: Request post form parameters, - for `application/x-www-form-urlencoded`, `multipart/form-data`. - :param auth_settings list: Auth Settings names for the request. - :param response: Response data type. - :param files dict: key -> filename, value -> filepath, - for `multipart/form-data`. - :param async_req bool: execute request asynchronously - :param _return_http_data_only: response data without head status code - and headers - :param collection_formats: dict of collection formats for path, query, - header, and post parameters. - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. - :param _request_timeout: timeout setting for this request. If one - number provided, it will be total request - timeout. It can also be a pair (tuple) of - (connection, read) timeouts. - :param _request_auth: set to override the auth_settings for an a single - request; this effectively ignores the authentication - in the spec for a single request. - :type _request_token: dict, optional - :return: - If async_req parameter is True, - the request will be called asynchronously. - The method will return the request thread. - If parameter async_req is False or missing, - then the method will return the response directly. + def __deserialize(self, data, klass): + """Deserializes dict, list, str into an object. + + :param data: dict, list or str. + :param klass: class literal, or string of class name. + + :return: object. """ - if not async_req: - return self.__call_api(resource_path, method, - path_params, query_params, header_params, - body, post_params, files, - response_types_map, auth_settings, - _return_http_data_only, collection_formats, - _preload_content, _request_timeout, _host, - _request_auth) - - return self.pool.apply_async(self.__call_api, (resource_path, - method, path_params, - query_params, - header_params, body, - post_params, files, - response_types_map, - auth_settings, - _return_http_data_only, - collection_formats, - _preload_content, - _request_timeout, - _host, _request_auth)) - - def request(self, method, url, query_params=None, headers=None, - post_params=None, body=None, _preload_content=True, - _request_timeout=None): - """Makes the HTTP request using RESTClient.""" - if method == "GET": - return self.rest_client.GET(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "HEAD": - return self.rest_client.HEAD(url, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - headers=headers) - elif method == "OPTIONS": - return self.rest_client.OPTIONS(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout) - elif method == "POST": - return self.rest_client.POST(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PUT": - return self.rest_client.PUT(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "PATCH": - return self.rest_client.PATCH(url, - query_params=query_params, - headers=headers, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - elif method == "DELETE": - return self.rest_client.DELETE(url, - query_params=query_params, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) + if data is None: + return None + + if isinstance(klass, str): + if klass.startswith('List['): + m = re.match(r'List\[(.*)]', klass) + assert m is not None, "Malformed List type definition" + sub_kls = m.group(1) + return [self.__deserialize(sub_data, sub_kls) + for sub_data in data] + + if klass.startswith('Dict['): + m = re.match(r'Dict\[([^,]*), (.*)]', klass) + assert m is not None, "Malformed Dict type definition" + sub_kls = m.group(2) + return {k: self.__deserialize(v, sub_kls) + for k, v in data.items()} + + # convert str to class + if klass in self.NATIVE_TYPES_MAPPING: + klass = self.NATIVE_TYPES_MAPPING[klass] + else: + klass = getattr(regula.documentreader.webclient.gen.models, klass) + + if klass in self.PRIMITIVE_TYPES: + return self.__deserialize_primitive(data, klass) + elif klass == object: + return self.__deserialize_object(data) + elif klass == datetime.date: + return self.__deserialize_date(data) + elif klass == datetime.datetime: + return self.__deserialize_datetime(data) + elif klass == decimal.Decimal: + return decimal.Decimal(data) + elif issubclass(klass, Enum): + return self.__deserialize_enum(data, klass) else: - raise ApiValueError( - "http method must be `GET`, `HEAD`, `OPTIONS`," - " `POST`, `PATCH`, `PUT` or `DELETE`." - ) + return self.__deserialize_model(data, klass) def parameters_to_tuples(self, params, collection_formats): """Get parameters as list of tuples, formatting collections. @@ -548,10 +465,10 @@ def parameters_to_tuples(self, params, collection_formats): :param dict collection_formats: Parameter collection formats :return: Parameters as list of tuples, collections formatted """ - new_params = [] + new_params: List[Tuple[str, str]] = [] if collection_formats is None: collection_formats = {} - for k, v in six.iteritems(params) if isinstance(params, dict) else params: # noqa: E501 + for k, v in params.items() if isinstance(params, dict) else params: if k in collection_formats: collection_format = collection_formats[k] if collection_format == 'multi': @@ -571,45 +488,94 @@ def parameters_to_tuples(self, params, collection_formats): new_params.append((k, v)) return new_params - def files_parameters(self, files=None): + def parameters_to_url_query(self, params, collection_formats): + """Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: URL query string (e.g. a=Hello%20World&b=123) + """ + new_params: List[Tuple[str, str]] = [] + if collection_formats is None: + collection_formats = {} + for k, v in params.items() if isinstance(params, dict) else params: + if isinstance(v, bool): + v = str(v).lower() + if isinstance(v, (int, float)): + v = str(v) + if isinstance(v, dict): + v = json.dumps(v) + + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, quote(str(value))) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(quote(str(value)) for value in v)) + ) + else: + new_params.append((k, quote(str(v)))) + + return "&".join(["=".join(map(str, item)) for item in new_params]) + + def files_parameters( + self, + files: Dict[str, Union[str, bytes, List[str], List[bytes], Tuple[str, bytes]]], + ): """Builds form parameters. :param files: File parameters. :return: Form parameters with files. """ params = [] - - if files: - for k, v in six.iteritems(files): - if not v: - continue - file_names = v if type(v) is list else [v] - for n in file_names: - with open(n, 'rb') as f: - filename = os.path.basename(f.name) - filedata = f.read() - mimetype = (mimetypes.guess_type(filename)[0] or - 'application/octet-stream') - params.append( - tuple([k, tuple([filename, filedata, mimetype])])) - + for k, v in files.items(): + if isinstance(v, str): + with open(v, 'rb') as f: + filename = os.path.basename(f.name) + filedata = f.read() + elif isinstance(v, bytes): + filename = k + filedata = v + elif isinstance(v, tuple): + filename, filedata = v + elif isinstance(v, list): + for file_param in v: + params.extend(self.files_parameters({k: file_param})) + continue + else: + raise ValueError("Unsupported file value") + mimetype = ( + mimetypes.guess_type(filename)[0] + or 'application/octet-stream' + ) + params.append( + tuple([k, tuple([filename, filedata, mimetype])]) + ) return params - def select_header_accept(self, accepts): + def select_header_accept(self, accepts: List[str]) -> Optional[str]: """Returns `Accept` based on an array of accepts provided. :param accepts: List of headers. :return: Accept (e.g. application/json). """ if not accepts: - return + return None - accepts = [x.lower() for x in accepts] + for accept in accepts: + if re.search('json', accept, re.IGNORECASE): + return accept - if 'application/json' in accepts: - return 'application/json' - else: - return ', '.join(accepts) + return accepts[0] def select_header_content_type(self, content_types): """Returns `Content-Type` based on an array of content_types provided. @@ -618,22 +584,33 @@ def select_header_content_type(self, content_types): :return: Content-Type (e.g. application/json). """ if not content_types: - return 'application/json' - - content_types = [x.lower() for x in content_types] - - if 'application/json' in content_types or '*/*' in content_types: - return 'application/json' - else: - return content_types[0] + return None - def update_params_for_auth(self, headers, querys, auth_settings, - request_auth=None): + for content_type in content_types: + if re.search('json', content_type, re.IGNORECASE): + return content_type + + return content_types[0] + + def update_params_for_auth( + self, + headers, + queries, + auth_settings, + resource_path, + method, + body, + request_auth=None + ) -> None: """Updates header and query params based on authentication setting. :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. + :param queries: Query parameters tuple list to be updated. :param auth_settings: Authentication setting identifiers list. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). :param request_auth: if set, the provided settings will override the token in the configuration. """ @@ -641,28 +618,172 @@ def update_params_for_auth(self, headers, querys, auth_settings, return if request_auth: - self._apply_auth_params(headers, querys, request_auth) - return - - for auth in auth_settings: - auth_setting = self.configuration.auth_settings().get(auth) - if auth_setting: - self._apply_auth_params(headers, querys, auth_setting) - - def _apply_auth_params(self, headers, querys, auth_setting): + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + request_auth + ) + else: + for auth in auth_settings: + auth_setting = self.configuration.auth_settings().get(auth) + if auth_setting: + self._apply_auth_params( + headers, + queries, + resource_path, + method, + body, + auth_setting + ) + + def _apply_auth_params( + self, + headers, + queries, + resource_path, + method, + body, + auth_setting + ) -> None: """Updates the request parameters based on a single auth_setting :param headers: Header parameters dict to be updated. - :param querys: Query parameters tuple list to be updated. + :param queries: Query parameters tuple list to be updated. + :resource_path: A string representation of the HTTP request resource path. + :method: A string representation of the HTTP request method. + :body: A object representing the body of the HTTP request. + The object type is the return value of sanitize_for_serialization(). :param auth_setting: auth settings for the endpoint """ if auth_setting['in'] == 'cookie': headers['Cookie'] = auth_setting['value'] elif auth_setting['in'] == 'header': - headers[auth_setting['key']] = auth_setting['value'] + if auth_setting['type'] != 'http-signature': + headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': - querys.append((auth_setting['key'], auth_setting['value'])) + queries.append((auth_setting['key'], auth_setting['value'])) else: raise ApiValueError( 'Authentication token must be in `query` or `header`' ) + + def __deserialize_file(self, response): + """Deserializes body to file + + Saves response body into a file in a temporary folder, + using the filename from the `Content-Disposition` header if provided. + + handle file downloading + save response body into a tmp file and return the instance + + :param response: RESTResponse. + :return: file path. + """ + fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path) + os.close(fd) + os.remove(path) + + content_disposition = response.getheader("Content-Disposition") + if content_disposition: + m = re.search( + r'filename=[\'"]?([^\'"\s]+)[\'"]?', + content_disposition + ) + assert m is not None, "Unexpected 'content-disposition' header value" + filename = m.group(1) + path = os.path.join(os.path.dirname(path), filename) + + with open(path, "wb") as f: + f.write(response.data) + + return path + + def __deserialize_primitive(self, data, klass): + """Deserializes string to primitive type. + + :param data: str. + :param klass: class literal. + + :return: int, long, float, str, bool. + """ + try: + return klass(data) + except UnicodeEncodeError: + return str(data) + except TypeError: + return data + + def __deserialize_object(self, value): + """Return an original value. + + :return: object. + """ + return value + + def __deserialize_date(self, string): + """Deserializes string to date. + + :param string: str. + :return: date. + """ + try: + return parse(string).date() + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason="Failed to parse `{0}` as date object".format(string) + ) + + def __deserialize_datetime(self, string): + """Deserializes string to datetime. + + The string should be in iso8601 datetime format. + + :param string: str. + :return: datetime. + """ + try: + return parse(string) + except ImportError: + return string + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as datetime object" + .format(string) + ) + ) + + def __deserialize_enum(self, data, klass): + """Deserializes primitive type to enum. + + :param data: primitive type. + :param klass: class literal. + :return: enum value. + """ + try: + return klass(data) + except ValueError: + raise rest.ApiException( + status=0, + reason=( + "Failed to parse `{0}` as `{1}`" + .format(data, klass) + ) + ) + + def __deserialize_model(self, data, klass): + """Deserializes list or dict to model. + + :param data: dict, list. + :param klass: class literal. + :return: model object. + """ + + return klass.from_dict(data) diff --git a/regula/documentreader/webclient/gen/api_response.py b/regula/documentreader/webclient/gen/api_response.py new file mode 100644 index 0000000..9bc7c11 --- /dev/null +++ b/regula/documentreader/webclient/gen/api_response.py @@ -0,0 +1,21 @@ +"""API response object.""" + +from __future__ import annotations +from typing import Optional, Generic, Mapping, TypeVar +from pydantic import Field, StrictInt, StrictBytes, BaseModel + +T = TypeVar("T") + +class ApiResponse(BaseModel, Generic[T]): + """ + API response object + """ + + status_code: StrictInt = Field(description="HTTP status code") + headers: Optional[Mapping[str, str]] = Field(None, description="HTTP headers") + data: T = Field(description="Deserialized data given the data type") + raw_data: StrictBytes = Field(description="Raw data (HTTP response body)") + + model_config = { + "arbitrary_types_allowed": True + } diff --git a/regula/documentreader/webclient/gen/configuration.py b/regula/documentreader/webclient/gen/configuration.py old mode 100755 new mode 100644 index 4574401..b6a97db --- a/regula/documentreader/webclient/gen/configuration.py +++ b/regula/documentreader/webclient/gen/configuration.py @@ -4,17 +4,16 @@ Generated by: https://openapi-generator.tech """ -from __future__ import absolute_import - import copy +import http.client as httplib import logging +from logging import FileHandler import multiprocessing import sys -import urllib3 +from typing import Any, ClassVar, Dict, List, Literal, Optional, TypedDict, Union +from typing_extensions import NotRequired, Self -import six -from six.moves import http_client as httplib -from regula.documentreader.webclient.gen.exceptions import ApiValueError +import urllib3 JSON_SCHEMA_VALIDATION_KEYWORDS = { @@ -23,46 +22,123 @@ 'minLength', 'pattern', 'maxItems', 'minItems' } -class Configuration(object): - """NOTE: This class is auto generated by OpenAPI Generator - - Ref: https://openapi-generator.tech - Do not edit the class manually. - - :param host: Base url +ServerVariablesT = Dict[str, str] + +GenericAuthSetting = TypedDict( + "GenericAuthSetting", + { + "type": str, + "in": str, + "key": str, + "value": str, + }, +) + + +OAuth2AuthSetting = TypedDict( + "OAuth2AuthSetting", + { + "type": Literal["oauth2"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +APIKeyAuthSetting = TypedDict( + "APIKeyAuthSetting", + { + "type": Literal["api_key"], + "in": str, + "key": str, + "value": Optional[str], + }, +) + + +BasicAuthSetting = TypedDict( + "BasicAuthSetting", + { + "type": Literal["basic"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": Optional[str], + }, +) + + +BearerFormatAuthSetting = TypedDict( + "BearerFormatAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "format": Literal["JWT"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +BearerAuthSetting = TypedDict( + "BearerAuthSetting", + { + "type": Literal["bearer"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": str, + }, +) + + +HTTPSignatureAuthSetting = TypedDict( + "HTTPSignatureAuthSetting", + { + "type": Literal["http-signature"], + "in": Literal["header"], + "key": Literal["Authorization"], + "value": None, + }, +) + + +AuthSettings = TypedDict( + "AuthSettings", + { + }, + total=False, +) + + +class HostSettingVariable(TypedDict): + description: str + default_value: str + enum_values: List[str] + + +class HostSetting(TypedDict): + url: str + description: str + variables: NotRequired[Dict[str, HostSettingVariable]] + + +class Configuration: + """This class contains various settings of the API client. + + :param host: Base url. + :param ignore_operation_servers + Boolean to ignore operation servers for the API client. + Config will use `host` as the base url regardless of the operation servers. :param api_key: Dict to store API key(s). Each entry in the dict specifies an API key. The dict key is the name of the security scheme in the OAS specification. The dict value is the API key secret. - :param api_key_prefix: Dict to store API prefix (e.g. Bearer) + :param api_key_prefix: Dict to store API prefix (e.g. Bearer). The dict key is the name of the security scheme in the OAS specification. The dict value is an API key prefix when generating the auth data. - :param username: Username for HTTP basic authentication - :param password: Password for HTTP basic authentication - :param discard_unknown_keys: Boolean value indicating whether to discard - unknown properties. A server may send a response that includes additional - properties that are not known by the client in the following scenarios: - 1. The OpenAPI document is incomplete, i.e. it does not match the server - implementation. - 2. The client was generated using an older version of the OpenAPI document - and the server has been upgraded since then. - If a schema in the OpenAPI document defines the additionalProperties attribute, - then all undeclared properties received by the server are injected into the - additional properties map. In that case, there are undeclared properties, and - nothing to discard. - :param disabled_client_side_validations (string): Comma-separated list of - JSON schema validation keywords to disable JSON schema structural validation - rules. The following keywords may be specified: multipleOf, maximum, - exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern, - maxItems, minItems. - By default, the validation is performed for data generated locally by the client - and data received from the server, independent of any validation performed by - the server side. If the input data does not satisfy the JSON schema validation - rules specified in the OpenAPI document, an exception is raised. - If disabled_client_side_validations is set, structural validation is - disabled. This can be useful to troubleshoot data validation problem, such as - when the OpenAPI document validation rules do not match the actual API data - received by the server. + :param username: Username for HTTP basic authentication. + :param password: Password for HTTP basic authentication. + :param access_token: Access token. :param server_index: Index to servers configuration. :param server_variables: Mapping with string values to replace variables in templated server configuration. The validation of enums is performed for @@ -71,23 +147,37 @@ class Configuration(object): configuration. :param server_operation_variables: Mapping from operation ID to a mapping with string values to replace variables in templated server configuration. - The validation of enums is performed for variables with defined enum values before. - :param ssl_ca_cert: str - the path to a file of concatenated CA certificates - in PEM format + The validation of enums is performed for variables with defined enum + values before. + :param ssl_ca_cert: str - the path to a file of concatenated CA certificates + in PEM format. + :param retries: Number of retries for API requests. + :param ca_cert_data: verify the peer using concatenated CA certificate data + in PEM (str) or DER (bytes) format. """ - _default = None - - def __init__(self, host=None, - api_key=None, api_key_prefix=None, - username=None, password=None, - discard_unknown_keys=False, - disabled_client_side_validations="", - server_index=None, server_variables=None, - server_operation_index=None, server_operation_variables=None, - ssl_ca_cert=None, - ): + _default: ClassVar[Optional[Self]] = None + + def __init__( + self, + host: Optional[str]=None, + api_key: Optional[Dict[str, str]]=None, + api_key_prefix: Optional[Dict[str, str]]=None, + username: Optional[str]=None, + password: Optional[str]=None, + access_token: Optional[str]=None, + server_index: Optional[int]=None, + server_variables: Optional[ServerVariablesT]=None, + server_operation_index: Optional[Dict[int, int]]=None, + server_operation_variables: Optional[Dict[int, ServerVariablesT]]=None, + ignore_operation_servers: bool=False, + ssl_ca_cert: Optional[str]=None, + retries: Optional[int] = None, + ca_cert_data: Optional[Union[str, bytes]] = None, + *, + debug: Optional[bool] = None, + ) -> None: """Constructor """ self._base_path = "https://api.regulaforensics.com" if host is None else host @@ -101,6 +191,9 @@ def __init__(self, host=None, self.server_operation_variables = server_operation_variables or {} """Default server variables """ + self.ignore_operation_servers = ignore_operation_servers + """Ignore operation servers + """ self.temp_folder_path = None """Temp file folder for downloading files """ @@ -124,8 +217,9 @@ def __init__(self, host=None, self.password = password """Password for HTTP basic authentication """ - self.discard_unknown_keys = discard_unknown_keys - self.disabled_client_side_validations = disabled_client_side_validations + self.access_token = access_token + """Access token + """ self.logger = {} """Logging Settings """ @@ -137,13 +231,16 @@ def __init__(self, host=None, self.logger_stream_handler = None """Log stream handler """ - self.logger_file_handler = None + self.logger_file_handler: Optional[FileHandler] = None """Log file handler """ self.logger_file = None """Debug file location """ - self.debug = False + if debug is not None: + self.debug = debug + else: + self.__debug = False """Debug switch """ @@ -155,6 +252,10 @@ def __init__(self, host=None, self.ssl_ca_cert = ssl_ca_cert """Set this to customize the certificate file to verify the peer. """ + self.ca_cert_data = ca_cert_data + """Set this to verify the peer using PEM (str) or DER (bytes) + certificate data. + """ self.cert_file = None """client certificate file """ @@ -164,6 +265,10 @@ def __init__(self, host=None, self.assert_hostname = None """Set this to True/False to enable/disable SSL hostname verification. """ + self.tls_server_name = None + """SSL/TLS Server Name Indication (SNI) + Set this to the SNI value expected by the server. + """ self.connection_pool_maxsize = multiprocessing.cpu_count() * 5 """urllib3 connection pool's maximum number of connections saved @@ -173,7 +278,7 @@ def __init__(self, host=None, cpu_count * 5 is used as default value to increase performance. """ - self.proxy = None + self.proxy: Optional[str] = None """Proxy URL """ self.proxy_headers = None @@ -182,7 +287,7 @@ def __init__(self, host=None, self.safe_chars_for_path_param = '' """Safe chars for path_param """ - self.retries = None + self.retries = retries """Adding retries to override urllib3 default value 3 """ # Enable client side validation @@ -192,7 +297,15 @@ def __init__(self, host=None, """Options to pass down to the underlying urllib3 socket """ - def __deepcopy__(self, memo): + self.datetime_format = "%Y-%m-%dT%H:%M:%S.%f%z" + """datetime format + """ + + self.date_format = "%Y-%m-%d" + """date format + """ + + def __deepcopy__(self, memo: Dict[int, Any]) -> Self: cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result @@ -206,18 +319,11 @@ def __deepcopy__(self, memo): result.debug = self.debug return result - def __setattr__(self, name, value): + def __setattr__(self, name: str, value: Any) -> None: object.__setattr__(self, name, value) - if name == 'disabled_client_side_validations': - s = set(filter(None, value.split(','))) - for v in s: - if v not in JSON_SCHEMA_VALIDATION_KEYWORDS: - raise ApiValueError( - "Invalid keyword: '{0}''".format(v)) - self._disabled_client_side_validations = s @classmethod - def set_default(cls, default): + def set_default(cls, default: Optional[Self]) -> None: """Set default instance of configuration. It stores default configuration, which can be @@ -225,24 +331,34 @@ def set_default(cls, default): :param default: object of Configuration """ - cls._default = copy.deepcopy(default) + cls._default = default + + @classmethod + def get_default_copy(cls) -> Self: + """Deprecated. Please use `get_default` instead. + + Deprecated. Please use `get_default` instead. + + :return: The configuration object. + """ + return cls.get_default() @classmethod - def get_default_copy(cls): - """Return new instance of configuration. + def get_default(cls) -> Self: + """Return the default configuration. This method returns newly created, based on default constructor, object of Configuration class or returns a copy of default - configuration passed by the set_default method. + configuration. :return: The configuration object. """ - if cls._default is not None: - return copy.deepcopy(cls._default) - return Configuration() + if cls._default is None: + cls._default = cls() + return cls._default @property - def logger_file(self): + def logger_file(self) -> Optional[str]: """The logger file. If the logger_file is None, then add stream handler and remove file @@ -254,7 +370,7 @@ def logger_file(self): return self.__logger_file @logger_file.setter - def logger_file(self, value): + def logger_file(self, value: Optional[str]) -> None: """The logger file. If the logger_file is None, then add stream handler and remove file @@ -269,11 +385,11 @@ def logger_file(self, value): # then add file handler and remove stream handler. self.logger_file_handler = logging.FileHandler(self.__logger_file) self.logger_file_handler.setFormatter(self.logger_formatter) - for _, logger in six.iteritems(self.logger): + for _, logger in self.logger.items(): logger.addHandler(self.logger_file_handler) @property - def debug(self): + def debug(self) -> bool: """Debug status :param value: The debug status, True or False. @@ -282,7 +398,7 @@ def debug(self): return self.__debug @debug.setter - def debug(self, value): + def debug(self, value: bool) -> None: """Debug status :param value: The debug status, True or False. @@ -291,20 +407,20 @@ def debug(self, value): self.__debug = value if self.__debug: # if debug status is True, turn on debug logging - for _, logger in six.iteritems(self.logger): + for _, logger in self.logger.items(): logger.setLevel(logging.DEBUG) # turn on httplib debug httplib.HTTPConnection.debuglevel = 1 else: # if debug status is False, turn off debug logging, # setting log level to default `logging.WARNING` - for _, logger in six.iteritems(self.logger): + for _, logger in self.logger.items(): logger.setLevel(logging.WARNING) # turn off httplib debug httplib.HTTPConnection.debuglevel = 0 @property - def logger_format(self): + def logger_format(self) -> str: """The logger format. The logger_formatter will be updated when sets logger_format. @@ -315,7 +431,7 @@ def logger_format(self): return self.__logger_format @logger_format.setter - def logger_format(self, value): + def logger_format(self, value: str) -> None: """The logger format. The logger_formatter will be updated when sets logger_format. @@ -326,7 +442,7 @@ def logger_format(self, value): self.__logger_format = value self.logger_formatter = logging.Formatter(self.__logger_format) - def get_api_key_with_prefix(self, identifier, alias=None): + def get_api_key_with_prefix(self, identifier: str, alias: Optional[str]=None) -> Optional[str]: """Gets API key (with prefix if set). :param identifier: The identifier of apiKey. @@ -343,7 +459,9 @@ def get_api_key_with_prefix(self, identifier, alias=None): else: return key - def get_basic_auth_token(self): + return None + + def get_basic_auth_token(self) -> Optional[str]: """Gets HTTP basic authentication header (string). :return: The token for basic HTTP authentication. @@ -358,15 +476,15 @@ def get_basic_auth_token(self): basic_auth=username + ':' + password ).get('authorization') - def auth_settings(self): + def auth_settings(self)-> AuthSettings: """Gets Auth Settings dict for api client. :return: The Auth Settings information dict. """ - auth = {} + auth: AuthSettings = {} return auth - def to_debug_report(self): + def to_debug_report(self) -> str: """Gets the essential information for debugging. :return: The report for debugging. @@ -374,31 +492,36 @@ def to_debug_report(self): return "Python SDK Debug Report:\n"\ "OS: {env}\n"\ "Python Version: {pyversion}\n"\ - "Version of the API: 7.2.0\n"\ + "Version of the API: 7.6.0\n"\ "SDK Package Version: 1.0.0".\ format(env=sys.platform, pyversion=sys.version) - def get_host_settings(self): + def get_host_settings(self) -> List[HostSetting]: """Gets an array of host settings :return: An array of host settings """ return [ { - 'url': "https://api.regulaforensics.com/", + 'url': "https://api.regulaforensics.com", 'description': "Latest stable Regula Document Reader demo endpoint", }, { - 'url': "https://nightly-api.regulaforensics.com/", + 'url': "https://nightly-api.regulaforensics.com", 'description': "Nightly Regula document reader demo endpoint", }, { - 'url': "http://localhost:8080/", + 'url': "http://localhost:8080", 'description': "Local on-premise installation", } ] - def get_host_from_settings(self, index, variables=None, servers=None): + def get_host_from_settings( + self, + index: Optional[int], + variables: Optional[ServerVariablesT]=None, + servers: Optional[List[HostSetting]]=None, + ) -> str: """Gets host URL based on the index and variables :param index: array index of the host settings :param variables: hash of variable and the corresponding value @@ -438,12 +561,12 @@ def get_host_from_settings(self, index, variables=None, servers=None): return url @property - def host(self): + def host(self) -> str: """Return generated host.""" return self.get_host_from_settings(self.server_index, variables=self.server_variables) @host.setter - def host(self, value): + def host(self, value: str) -> None: """Fix base path.""" self._base_path = value self.server_index = None diff --git a/regula/documentreader/webclient/gen/exceptions.py b/regula/documentreader/webclient/gen/exceptions.py old mode 100755 new mode 100644 index 01c903e..03a9f77 --- a/regula/documentreader/webclient/gen/exceptions.py +++ b/regula/documentreader/webclient/gen/exceptions.py @@ -3,9 +3,8 @@ """ Generated by: https://openapi-generator.tech """ - -import six - +from typing import Any, Optional +from typing_extensions import Self class OpenApiException(Exception): """The base exception class for all OpenAPIExceptions""" @@ -13,7 +12,7 @@ class OpenApiException(Exception): class ApiTypeError(OpenApiException, TypeError): def __init__(self, msg, path_to_item=None, valid_classes=None, - key_type=None): + key_type=None) -> None: """ Raises an exception for TypeErrors Args: @@ -41,7 +40,7 @@ def __init__(self, msg, path_to_item=None, valid_classes=None, class ApiValueError(OpenApiException, ValueError): - def __init__(self, msg, path_to_item=None): + def __init__(self, msg, path_to_item=None) -> None: """ Args: msg (str): the exception message @@ -59,7 +58,7 @@ def __init__(self, msg, path_to_item=None): class ApiAttributeError(OpenApiException, AttributeError): - def __init__(self, msg, path_to_item=None): + def __init__(self, msg, path_to_item=None) -> None: """ Raised when an attribute reference or assignment fails. @@ -78,7 +77,7 @@ def __init__(self, msg, path_to_item=None): class ApiKeyError(OpenApiException, KeyError): - def __init__(self, msg, path_to_item=None): + def __init__(self, msg, path_to_item=None) -> None: """ Args: msg (str): the exception message @@ -96,17 +95,63 @@ def __init__(self, msg, path_to_item=None): class ApiException(OpenApiException): - def __init__(self, status=None, reason=None, http_resp=None): + def __init__( + self, + status=None, + reason=None, + http_resp=None, + *, + body: Optional[str] = None, + data: Optional[Any] = None, + ) -> None: + self.status = status + self.reason = reason + self.body = body + self.data = data + self.headers = None + if http_resp: - self.status = http_resp.status - self.reason = http_resp.reason - self.body = http_resp.data + if self.status is None: + self.status = http_resp.status + if self.reason is None: + self.reason = http_resp.reason + if self.body is None: + try: + self.body = http_resp.data.decode('utf-8') + except Exception: + pass self.headers = http_resp.getheaders() - else: - self.status = status - self.reason = reason - self.body = None - self.headers = None + + @classmethod + def from_response( + cls, + *, + http_resp, + body: Optional[str], + data: Optional[Any], + ) -> Self: + if http_resp.status == 400: + raise BadRequestException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 401: + raise UnauthorizedException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 403: + raise ForbiddenException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 404: + raise NotFoundException(http_resp=http_resp, body=body, data=data) + + # Added new conditions for 409 and 422 + if http_resp.status == 409: + raise ConflictException(http_resp=http_resp, body=body, data=data) + + if http_resp.status == 422: + raise UnprocessableEntityException(http_resp=http_resp, body=body, data=data) + + if 500 <= http_resp.status <= 599: + raise ServiceException(http_resp=http_resp, body=body, data=data) + raise ApiException(http_resp=http_resp, body=body, data=data) def __str__(self): """Custom error messages for exception""" @@ -116,41 +161,47 @@ def __str__(self): error_message += "HTTP response headers: {0}\n".format( self.headers) - if self.body: - error_message += "HTTP response body: {0}\n".format(self.body) + if self.data or self.body: + error_message += "HTTP response body: {0}\n".format(self.data or self.body) return error_message -class NotFoundException(ApiException): +class BadRequestException(ApiException): + pass - def __init__(self, status=None, reason=None, http_resp=None): - super(NotFoundException, self).__init__(status, reason, http_resp) +class NotFoundException(ApiException): + pass -class UnauthorizedException(ApiException): - def __init__(self, status=None, reason=None, http_resp=None): - super(UnauthorizedException, self).__init__(status, reason, http_resp) +class UnauthorizedException(ApiException): + pass class ForbiddenException(ApiException): - - def __init__(self, status=None, reason=None, http_resp=None): - super(ForbiddenException, self).__init__(status, reason, http_resp) + pass class ServiceException(ApiException): + pass + + +class ConflictException(ApiException): + """Exception for HTTP 409 Conflict.""" + pass + - def __init__(self, status=None, reason=None, http_resp=None): - super(ServiceException, self).__init__(status, reason, http_resp) +class UnprocessableEntityException(ApiException): + """Exception for HTTP 422 Unprocessable Entity.""" + pass def render_path(path_to_item): """Returns a string representation of a path""" result = "" for pth in path_to_item: - if isinstance(pth, six.integer_types): + if isinstance(pth, int): result += "[{0}]".format(pth) else: result += "['{0}']".format(pth) diff --git a/regula/documentreader/webclient/gen/models/__init__.py b/regula/documentreader/webclient/gen/models/__init__.py old mode 100755 new mode 100644 index d175856..34464de --- a/regula/documentreader/webclient/gen/models/__init__.py +++ b/regula/documentreader/webclient/gen/models/__init__.py @@ -5,28 +5,32 @@ Generated by: https://openapi-generator.tech """ -from __future__ import absolute_import - # import models into model package from regula.documentreader.webclient.gen.models.area_array import AreaArray from regula.documentreader.webclient.gen.models.area_container import AreaContainer from regula.documentreader.webclient.gen.models.auth_params import AuthParams from regula.documentreader.webclient.gen.models.authenticity_check_list import AuthenticityCheckList +from regula.documentreader.webclient.gen.models.authenticity_check_list_item import AuthenticityCheckListItem from regula.documentreader.webclient.gen.models.authenticity_check_result import AuthenticityCheckResult from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_check_result_list_inner import AuthenticityCheckResultListInner from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult -from regula.documentreader.webclient.gen.models.authenticity_result_all_of import AuthenticityResultAllOf from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.bar_code_module_type import BarCodeModuleType +from regula.documentreader.webclient.gen.models.barcode_type import BarcodeType from regula.documentreader.webclient.gen.models.bc_pdf417_info import BcPDF417INFO from regula.documentreader.webclient.gen.models.bc_roidetect import BcROIDETECT +from regula.documentreader.webclient.gen.models.binary_data import BinaryData +from regula.documentreader.webclient.gen.models.byte_array_item import ByteArrayItem from regula.documentreader.webclient.gen.models.byte_array_result import ByteArrayResult -from regula.documentreader.webclient.gen.models.byte_array_result_all_of import ByteArrayResultAllOf +from regula.documentreader.webclient.gen.models.candidates_list_item import CandidatesListItem +from regula.documentreader.webclient.gen.models.certificate_data import CertificateData from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose from regula.documentreader.webclient.gen.models.check_result import CheckResult from regula.documentreader.webclient.gen.models.chosen_document_type import ChosenDocumentType from regula.documentreader.webclient.gen.models.chosen_document_type_result import ChosenDocumentTypeResult -from regula.documentreader.webclient.gen.models.chosen_document_type_result_all_of import ChosenDocumentTypeResultAllOf from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.container_list_list_inner import ContainerListListInner from regula.documentreader.webclient.gen.models.critical import Critical from regula.documentreader.webclient.gen.models.cross_source_value_comparison import CrossSourceValueComparison from regula.documentreader.webclient.gen.models.data_module import DataModule @@ -34,86 +38,103 @@ from regula.documentreader.webclient.gen.models.details_rfid import DetailsRFID from regula.documentreader.webclient.gen.models.device_info import DeviceInfo from regula.documentreader.webclient.gen.models.doc_bar_code_info import DocBarCodeInfo -from regula.documentreader.webclient.gen.models.doc_bar_code_info_all_of import DocBarCodeInfoAllOf from regula.documentreader.webclient.gen.models.doc_bar_code_info_fields_list import DocBarCodeInfoFieldsList +from regula.documentreader.webclient.gen.models.doc_bar_code_info_item import DocBarCodeInfoItem +from regula.documentreader.webclient.gen.models.doc_graphics_info_item import DocGraphicsInfoItem from regula.documentreader.webclient.gen.models.doc_visual_extended_field import DocVisualExtendedField +from regula.documentreader.webclient.gen.models.doc_visual_extended_field_item import DocVisualExtendedFieldItem from regula.documentreader.webclient.gen.models.doc_visual_extended_info import DocVisualExtendedInfo +from regula.documentreader.webclient.gen.models.doc_visual_extended_info_item import DocVisualExtendedInfoItem +from regula.documentreader.webclient.gen.models.document_binary_info_result import DocumentBinaryInfoResult from regula.documentreader.webclient.gen.models.document_format import DocumentFormat from regula.documentreader.webclient.gen.models.document_image import DocumentImage from regula.documentreader.webclient.gen.models.document_image_result import DocumentImageResult -from regula.documentreader.webclient.gen.models.document_image_result_all_of import DocumentImageResultAllOf from regula.documentreader.webclient.gen.models.document_position import DocumentPosition +from regula.documentreader.webclient.gen.models.document_position_item import DocumentPositionItem from regula.documentreader.webclient.gen.models.document_position_result import DocumentPositionResult -from regula.documentreader.webclient.gen.models.document_position_result_all_of import DocumentPositionResultAllOf from regula.documentreader.webclient.gen.models.document_type import DocumentType from regula.documentreader.webclient.gen.models.document_type_recognition_result import DocumentTypeRecognitionResult from regula.documentreader.webclient.gen.models.document_types_candidates import DocumentTypesCandidates from regula.documentreader.webclient.gen.models.document_types_candidates_list import DocumentTypesCandidatesList from regula.documentreader.webclient.gen.models.document_types_candidates_result import DocumentTypesCandidatesResult -from regula.documentreader.webclient.gen.models.document_types_candidates_result_all_of import DocumentTypesCandidatesResultAllOf from regula.documentreader.webclient.gen.models.documents_database import DocumentsDatabase +from regula.documentreader.webclient.gen.models.encrypted_rcl_item import EncryptedRCLItem from regula.documentreader.webclient.gen.models.encrypted_rcl_result import EncryptedRCLResult -from regula.documentreader.webclient.gen.models.encrypted_rcl_result_all_of import EncryptedRCLResultAllOf +from regula.documentreader.webclient.gen.models.error_coordinates import ErrorCoordinates from regula.documentreader.webclient.gen.models.fdsid_list import FDSIDList from regula.documentreader.webclient.gen.models.face_api import FaceApi from regula.documentreader.webclient.gen.models.face_api_search import FaceApiSearch +from regula.documentreader.webclient.gen.models.face_detection import FaceDetection +from regula.documentreader.webclient.gen.models.face_detection_item import FaceDetectionItem +from regula.documentreader.webclient.gen.models.face_detection_result import FaceDetectionResult +from regula.documentreader.webclient.gen.models.face_item import FaceItem +from regula.documentreader.webclient.gen.models.fiber_item import FiberItem from regula.documentreader.webclient.gen.models.fiber_result import FiberResult -from regula.documentreader.webclient.gen.models.fiber_result_all_of import FiberResultAllOf +from regula.documentreader.webclient.gen.models.field_item import FieldItem +from regula.documentreader.webclient.gen.models.file_image import FileImage from regula.documentreader.webclient.gen.models.get_transactions_by_tag_response import GetTransactionsByTagResponse +from regula.documentreader.webclient.gen.models.graph_data import GraphData from regula.documentreader.webclient.gen.models.graphic_field import GraphicField from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType from regula.documentreader.webclient.gen.models.graphic_fields_list import GraphicFieldsList from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult -from regula.documentreader.webclient.gen.models.graphics_result_all_of import GraphicsResultAllOf from regula.documentreader.webclient.gen.models.healthcheck import Healthcheck from regula.documentreader.webclient.gen.models.healthcheck_documents_database import HealthcheckDocumentsDatabase +from regula.documentreader.webclient.gen.models.ident_item import IdentItem from regula.documentreader.webclient.gen.models.ident_result import IdentResult -from regula.documentreader.webclient.gen.models.ident_result_all_of import IdentResultAllOf from regula.documentreader.webclient.gen.models.image_data import ImageData from regula.documentreader.webclient.gen.models.image_qa import ImageQA from regula.documentreader.webclient.gen.models.image_quality_check import ImageQualityCheck from regula.documentreader.webclient.gen.models.image_quality_check_list import ImageQualityCheckList +from regula.documentreader.webclient.gen.models.image_quality_check_list_item import ImageQualityCheckListItem from regula.documentreader.webclient.gen.models.image_quality_check_type import ImageQualityCheckType from regula.documentreader.webclient.gen.models.image_quality_result import ImageQualityResult -from regula.documentreader.webclient.gen.models.image_quality_result_all_of import ImageQualityResultAllOf from regula.documentreader.webclient.gen.models.image_transaction_data import ImageTransactionData from regula.documentreader.webclient.gen.models.images import Images from regula.documentreader.webclient.gen.models.images_available_source import ImagesAvailableSource from regula.documentreader.webclient.gen.models.images_field import ImagesField from regula.documentreader.webclient.gen.models.images_field_value import ImagesFieldValue +from regula.documentreader.webclient.gen.models.images_item import ImagesItem from regula.documentreader.webclient.gen.models.images_result import ImagesResult -from regula.documentreader.webclient.gen.models.images_result_all_of import ImagesResultAllOf from regula.documentreader.webclient.gen.models.in_data import InData from regula.documentreader.webclient.gen.models.in_data_transaction_images_field_value import InDataTransactionImagesFieldValue from regula.documentreader.webclient.gen.models.in_data_video import InDataVideo -from regula.documentreader.webclient.gen.models.inline_response200 import InlineResponse200 -from regula.documentreader.webclient.gen.models.inline_response2001 import InlineResponse2001 from regula.documentreader.webclient.gen.models.input_barcode_type import InputBarcodeType from regula.documentreader.webclient.gen.models.input_image_quality_checks import InputImageQualityChecks from regula.documentreader.webclient.gen.models.lcid import LCID from regula.documentreader.webclient.gen.models.lexical_analysis_result import LexicalAnalysisResult -from regula.documentreader.webclient.gen.models.lexical_analysis_result_all_of import LexicalAnalysisResultAllOf +from regula.documentreader.webclient.gen.models.license_item import LicenseItem from regula.documentreader.webclient.gen.models.license_result import LicenseResult -from regula.documentreader.webclient.gen.models.license_result_all_of import LicenseResultAllOf from regula.documentreader.webclient.gen.models.light import Light from regula.documentreader.webclient.gen.models.list_transactions_by_tag_response import ListTransactionsByTagResponse from regula.documentreader.webclient.gen.models.list_verified_fields import ListVerifiedFields +from regula.documentreader.webclient.gen.models.list_verified_fields_item import ListVerifiedFieldsItem from regula.documentreader.webclient.gen.models.liveness_params import LivenessParams from regula.documentreader.webclient.gen.models.log_level import LogLevel +from regula.documentreader.webclient.gen.models.mrz_detector_result import MRZDetectorResult from regula.documentreader.webclient.gen.models.mrz_format import MRZFormat +from regula.documentreader.webclient.gen.models.mrz_position_result import MRZPositionResult +from regula.documentreader.webclient.gen.models.mrz_rows_item import MRZRowsItem +from regula.documentreader.webclient.gen.models.mrz_test_quality import MRZTestQuality +from regula.documentreader.webclient.gen.models.mrz_test_quality_item import MRZTestQualityItem +from regula.documentreader.webclient.gen.models.mrz_test_quality_result import MRZTestQualityResult from regula.documentreader.webclient.gen.models.measure_system import MeasureSystem from regula.documentreader.webclient.gen.models.mrz_detect_mode_enum import MrzDetectModeEnum +from regula.documentreader.webclient.gen.models.mrz_position import MrzPosition +from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem +from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult -from regula.documentreader.webclient.gen.models.ocr_security_text_result_all_of import OCRSecurityTextResultAllOf from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol from regula.documentreader.webclient.gen.models.out_data import OutData from regula.documentreader.webclient.gen.models.out_data_transaction_images_field_value import OutDataTransactionImagesFieldValue from regula.documentreader.webclient.gen.models.p_array_field import PArrayField +from regula.documentreader.webclient.gen.models.parsed_data import ParsedData from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes from regula.documentreader.webclient.gen.models.per_document_config import PerDocumentConfig +from regula.documentreader.webclient.gen.models.photo_ident_item import PhotoIdentItem from regula.documentreader.webclient.gen.models.photo_ident_result import PhotoIdentResult -from regula.documentreader.webclient.gen.models.photo_ident_result_all_of import PhotoIdentResultAllOf from regula.documentreader.webclient.gen.models.point import Point from regula.documentreader.webclient.gen.models.point_array import PointArray from regula.documentreader.webclient.gen.models.points_container import PointsContainer @@ -124,38 +145,89 @@ from regula.documentreader.webclient.gen.models.process_response import ProcessResponse from regula.documentreader.webclient.gen.models.process_system_info import ProcessSystemInfo from regula.documentreader.webclient.gen.models.processing_status import ProcessingStatus +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_field import RFIDDocVisualExtendedField +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_field_item import RFIDDocVisualExtendedFieldItem +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info import RFIDDocVisualExtendedInfo +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info_item import RFIDDocVisualExtendedInfoItem +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.rfid_graphics_info_result import RFIDGraphicsInfoResult +from regula.documentreader.webclient.gen.models.rfidpkd_resource_type import RFIDPKDResourceType +from regula.documentreader.webclient.gen.models.rfid_text_data_result import RFIDTextDataResult +from regula.documentreader.webclient.gen.models.raw_image_container_item import RawImageContainerItem from regula.documentreader.webclient.gen.models.raw_image_container_list import RawImageContainerList from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates from regula.documentreader.webclient.gen.models.result import Result from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector +from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem +from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip +from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo +from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType +from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey +from regula.documentreader.webclient.gen.models.rfid_application import RfidApplication +from regula.documentreader.webclient.gen.models.rfid_application_type import RfidApplicationType +from regula.documentreader.webclient.gen.models.rfid_attribute_data import RfidAttributeData +from regula.documentreader.webclient.gen.models.rfid_attribute_name import RfidAttributeName +from regula.documentreader.webclient.gen.models.rfid_authentication_procedure_type import RfidAuthenticationProcedureType +from regula.documentreader.webclient.gen.models.rfid_baud_rate import RfidBaudRate +from regula.documentreader.webclient.gen.models.rfid_card_properties_ext import RfidCardPropertiesExt +from regula.documentreader.webclient.gen.models.rfid_certificate_ex import RfidCertificateEx +from regula.documentreader.webclient.gen.models.rfid_certificate_origin import RfidCertificateOrigin +from regula.documentreader.webclient.gen.models.rfid_certificate_type import RfidCertificateType +from regula.documentreader.webclient.gen.models.rfid_dg1 import RfidDG1 +from regula.documentreader.webclient.gen.models.rfid_data_file import RfidDataFile +from regula.documentreader.webclient.gen.models.rfid_data_file_type import RfidDataFileType +from regula.documentreader.webclient.gen.models.rfid_data_group_type_tag import RfidDataGroupTypeTag +from regula.documentreader.webclient.gen.models.rfid_distinguished_name import RfidDistinguishedName from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation from regula.documentreader.webclient.gen.models.rfid_origin import RfidOrigin +from regula.documentreader.webclient.gen.models.rfid_password_type import RfidPasswordType +from regula.documentreader.webclient.gen.models.rfid_pki_extension import RfidPkiExtension +from regula.documentreader.webclient.gen.models.rfid_raw_data import RfidRawData +from regula.documentreader.webclient.gen.models.rfid_security_object import RfidSecurityObject +from regula.documentreader.webclient.gen.models.rfid_session_data import RfidSessionData +from regula.documentreader.webclient.gen.models.rfid_signer_info_ex import RfidSignerInfoEx +from regula.documentreader.webclient.gen.models.rfid_terminal import RfidTerminal +from regula.documentreader.webclient.gen.models.rfid_terminal_type import RfidTerminalType +from regula.documentreader.webclient.gen.models.rfid_type import RfidType +from regula.documentreader.webclient.gen.models.rfid_validity import RfidValidity from regula.documentreader.webclient.gen.models.scenario import Scenario +from regula.documentreader.webclient.gen.models.security_feature_item import SecurityFeatureItem from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult -from regula.documentreader.webclient.gen.models.security_feature_result_all_of import SecurityFeatureResultAllOf from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from regula.documentreader.webclient.gen.models.security_object_certificates import SecurityObjectCertificates from regula.documentreader.webclient.gen.models.source import Source from regula.documentreader.webclient.gen.models.source_validity import SourceValidity from regula.documentreader.webclient.gen.models.status import Status +from regula.documentreader.webclient.gen.models.status_item import StatusItem from regula.documentreader.webclient.gen.models.status_result import StatusResult -from regula.documentreader.webclient.gen.models.status_result_all_of import StatusResultAllOf +from regula.documentreader.webclient.gen.models.string_item import StringItem from regula.documentreader.webclient.gen.models.string_recognition_result import StringRecognitionResult +from regula.documentreader.webclient.gen.models.symbol import Symbol from regula.documentreader.webclient.gen.models.symbol_candidate import SymbolCandidate +from regula.documentreader.webclient.gen.models.symbol_estimation_item import SymbolEstimationItem from regula.documentreader.webclient.gen.models.symbol_recognition_result import SymbolRecognitionResult +from regula.documentreader.webclient.gen.models.t_doc_binary_info import TDocBinaryInfo +from regula.documentreader.webclient.gen.models.t_doc_binary_info_item import TDocBinaryInfoItem +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info import TOriginalRFIDGraphicsInfo +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info_item import TOriginalRFIDGraphicsInfoItem from regula.documentreader.webclient.gen.models.text import Text from regula.documentreader.webclient.gen.models.text_available_source import TextAvailableSource from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult -from regula.documentreader.webclient.gen.models.text_data_result_all_of import TextDataResultAllOf from regula.documentreader.webclient.gen.models.text_field import TextField from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType from regula.documentreader.webclient.gen.models.text_field_value import TextFieldValue +from regula.documentreader.webclient.gen.models.text_item import TextItem from regula.documentreader.webclient.gen.models.text_post_processing import TextPostProcessing from regula.documentreader.webclient.gen.models.text_result import TextResult -from regula.documentreader.webclient.gen.models.text_result_all_of import TextResultAllOf from regula.documentreader.webclient.gen.models.transaction_image import TransactionImage from regula.documentreader.webclient.gen.models.transaction_info import TransactionInfo from regula.documentreader.webclient.gen.models.transaction_process_get_response import TransactionProcessGetResponse from regula.documentreader.webclient.gen.models.transaction_process_request import TransactionProcessRequest +from regula.documentreader.webclient.gen.models.transaction_process_result import TransactionProcessResult +from regula.documentreader.webclient.gen.models.trf_ft_bytes import TrfFtBytes +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString from regula.documentreader.webclient.gen.models.verification_result import VerificationResult from regula.documentreader.webclient.gen.models.verified_field_map import VerifiedFieldMap from regula.documentreader.webclient.gen.models.visibility import Visibility +from regula.documentreader.webclient.gen.models.visual_extended_field_item import VisualExtendedFieldItem diff --git a/regula/documentreader/webclient/gen/models/area_array.py b/regula/documentreader/webclient/gen/models/area_array.py index 0178f86..a24c98b 100644 --- a/regula/documentreader/webclient/gen/models/area_array.py +++ b/regula/documentreader/webclient/gen/models/area_array.py @@ -4,142 +4,96 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.point_array import PointArray +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AreaArray(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class AreaArray(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'list': 'list[RectangleCoordinates]', - 'points': 'list[PointArray]' - } - - attribute_map = { - 'list': 'List', - 'points': 'Points' - } - - def __init__(self, list=None, points=None, local_vars_configuration=None): # noqa: E501 - """AreaArray - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._list = None - self._points = None - self.discriminator = None - - if list is not None: - self.list = list - if points is not None: - self.points = points - - @property - def list(self): - """Gets the list of this AreaArray. # noqa: E501 - - - :return: The list of this AreaArray. # noqa: E501 - :rtype: list[RectangleCoordinates] + AreaArray + """ # noqa: E501 + count: Union[StrictFloat, StrictInt] = Field(description="Number of elements in List and Points", alias="Count") + list: List[RectangleCoordinates] = Field(alias="List") + points: List[PointArray] = Field(alias="Points") + __properties: ClassVar[List[str]] = ["Count", "List", "Points"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AreaArray from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this AreaArray. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in points (list) + _items = [] + if self.points: + for _item_points in self.points: + if _item_points: + _items.append(_item_points.to_dict()) + _dict['Points'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AreaArray from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "List": [RectangleCoordinates.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None, + "Points": [PointArray.from_dict(_item) for _item in obj["Points"]] if obj.get("Points") is not None else None + }) + return _obj - :param list: The list of this AreaArray. # noqa: E501 - :type list: list[RectangleCoordinates] - """ - - self._list = list - - @property - def points(self): - """Gets the points of this AreaArray. # noqa: E501 - - - :return: The points of this AreaArray. # noqa: E501 - :rtype: list[PointArray] - """ - return self._points - - @points.setter - def points(self, points): - """Sets the points of this AreaArray. - - - :param points: The points of this AreaArray. # noqa: E501 - :type points: list[PointArray] - """ - self._points = points - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AreaArray): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AreaArray): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/area_container.py b/regula/documentreader/webclient/gen/models/area_container.py index eaf5b8c..abd2086 100644 --- a/regula/documentreader/webclient/gen/models/area_container.py +++ b/regula/documentreader/webclient/gen/models/area_container.py @@ -4,168 +4,96 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.points_container import PointsContainer +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Checked fragment coordinates -""" -class AreaContainer(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class AreaContainer(BaseModel): """ - openapi_types = { - 'count': 'int', - 'list': 'list[RectangleCoordinates]', - 'points': 'list[PointsContainer]' - } - - attribute_map = { - 'count': 'Count', - 'list': 'List', - 'points': 'Points' - } - - def __init__(self, count=None, list=None, points=None, local_vars_configuration=None): # noqa: E501 - """AreaContainer - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._count = None - self._list = None - self._points = None - self.discriminator = None - - if count is not None: - self.count = count - if list is not None: - self.list = list - if points is not None: - self.points = points - - @property - def count(self): - """Gets the count of this AreaContainer. # noqa: E501 - - - :return: The count of this AreaContainer. # noqa: E501 - :rtype: int + Checked fragment coordinates + """ # noqa: E501 + count: StrictInt = Field(alias="Count") + list: List[RectangleCoordinates] = Field(alias="List") + points: List[PointsContainer] = Field(alias="Points") + __properties: ClassVar[List[str]] = ["Count", "List", "Points"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AreaContainer from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._count - - @count.setter - def count(self, count): - """Sets the count of this AreaContainer. - - - :param count: The count of this AreaContainer. # noqa: E501 - :type count: int - """ - - self._count = count - - @property - def list(self): - """Gets the list of this AreaContainer. # noqa: E501 - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in points (list) + _items = [] + if self.points: + for _item_points in self.points: + if _item_points: + _items.append(_item_points.to_dict()) + _dict['Points'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AreaContainer from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "List": [RectangleCoordinates.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None, + "Points": [PointsContainer.from_dict(_item) for _item in obj["Points"]] if obj.get("Points") is not None else None + }) + return _obj - :return: The list of this AreaContainer. # noqa: E501 - :rtype: list[RectangleCoordinates] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this AreaContainer. - - - :param list: The list of this AreaContainer. # noqa: E501 - :type list: list[RectangleCoordinates] - """ - - self._list = list - - @property - def points(self): - """Gets the points of this AreaContainer. # noqa: E501 - - - :return: The points of this AreaContainer. # noqa: E501 - :rtype: list[PointsContainer] - """ - return self._points - - @points.setter - def points(self, points): - """Sets the points of this AreaContainer. - - - :param points: The points of this AreaContainer. # noqa: E501 - :type points: list[PointsContainer] - """ - self._points = points - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AreaContainer): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AreaContainer): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/auth_params.py b/regula/documentreader/webclient/gen/models/auth_params.py index 293ae3d..6452be9 100644 --- a/regula/documentreader/webclient/gen/models/auth_params.py +++ b/regula/documentreader/webclient/gen/models/auth_params.py @@ -4,536 +4,110 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictBool +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.liveness_params import LivenessParams +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AuthParams(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class AuthParams(BaseModel): """ + AuthParams + """ # noqa: E501 + check_liveness: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable document liveness check", alias="checkLiveness") + liveness_params: Optional[LivenessParams] = Field(default=None, alias="livenessParams") + check_uv_luminiscence: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Document luminescence check in UV light", alias="checkUVLuminiscence") + check_irb900: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable B900 ink MRZ contrast check in IR light", alias="checkIRB900") + check_image_patterns: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Image patterns presence/absence check (position, shape, color)", alias="checkImagePatterns") + check_fibers: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Fibers detection", alias="checkFibers") + check_ext_mrz: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Extended MRZ Check", alias="checkExtMRZ") + check_ext_ocr: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Extended OCR Check", alias="checkExtOCR") + check_axial: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable laminate integrity check in axial light", alias="checkAxial") + check_barcode_format: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Barcode format check (code metadata, data format, contents format, etc.)", alias="checkBarcodeFormat") + check_ir_visibility: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Document elements visibility check in IR light", alias="checkIRVisibility") + check_ipi: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Invisible Personal Information (IPI) check", alias="checkIPI") + check_photo_embedding: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Owner's photo embedding check (is photo printed or sticked)", alias="checkPhotoEmbedding") + check_photo_comparison: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Portrait comparison check", alias="checkPhotoComparison") + check_letter_screen: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable LetterScreen check", alias="checkLetterScreen") + check_security_text: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Security text check", alias="checkSecurityText") + __properties: ClassVar[List[str]] = ["checkLiveness", "livenessParams", "checkUVLuminiscence", "checkIRB900", "checkImagePatterns", "checkFibers", "checkExtMRZ", "checkExtOCR", "checkAxial", "checkBarcodeFormat", "checkIRVisibility", "checkIPI", "checkPhotoEmbedding", "checkPhotoComparison", "checkLetterScreen", "checkSecurityText"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AuthParams from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of liveness_params + if self.liveness_params: + _dict['livenessParams'] = self.liveness_params.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AuthParams from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "checkLiveness": obj.get("checkLiveness"), + "livenessParams": LivenessParams.from_dict(obj["livenessParams"]) if obj.get("livenessParams") is not None else None, + "checkUVLuminiscence": obj.get("checkUVLuminiscence"), + "checkIRB900": obj.get("checkIRB900"), + "checkImagePatterns": obj.get("checkImagePatterns"), + "checkFibers": obj.get("checkFibers"), + "checkExtMRZ": obj.get("checkExtMRZ"), + "checkExtOCR": obj.get("checkExtOCR"), + "checkAxial": obj.get("checkAxial"), + "checkBarcodeFormat": obj.get("checkBarcodeFormat"), + "checkIRVisibility": obj.get("checkIRVisibility"), + "checkIPI": obj.get("checkIPI"), + "checkPhotoEmbedding": obj.get("checkPhotoEmbedding"), + "checkPhotoComparison": obj.get("checkPhotoComparison"), + "checkLetterScreen": obj.get("checkLetterScreen"), + "checkSecurityText": obj.get("checkSecurityText") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'check_liveness': 'bool', - 'liveness_params': 'LivenessParams', - 'check_uv_luminiscence': 'bool', - 'check_irb900': 'bool', - 'check_image_patterns': 'bool', - 'check_fibers': 'bool', - 'check_ext_mrz': 'bool', - 'check_ext_ocr': 'bool', - 'check_axial': 'bool', - 'check_barcode_format': 'bool', - 'check_ir_visibility': 'bool', - 'check_ipi': 'bool', - 'check_photo_embedding': 'bool', - 'check_photo_comparison': 'bool', - 'check_letter_screen': 'bool', - 'check_security_text': 'bool' - } - - attribute_map = { - 'check_liveness': 'checkLiveness', - 'liveness_params': 'livenessParams', - 'check_uv_luminiscence': 'checkUVLuminiscence', - 'check_irb900': 'checkIRB900', - 'check_image_patterns': 'checkImagePatterns', - 'check_fibers': 'checkFibers', - 'check_ext_mrz': 'checkExtMRZ', - 'check_ext_ocr': 'checkExtOCR', - 'check_axial': 'checkAxial', - 'check_barcode_format': 'checkBarcodeFormat', - 'check_ir_visibility': 'checkIRVisibility', - 'check_ipi': 'checkIPI', - 'check_photo_embedding': 'checkPhotoEmbedding', - 'check_photo_comparison': 'checkPhotoComparison', - 'check_letter_screen': 'checkLetterScreen', - 'check_security_text': 'checkSecurityText' - } - - def __init__(self, check_liveness=None, liveness_params=None, check_uv_luminiscence=None, check_irb900=None, check_image_patterns=None, check_fibers=None, check_ext_mrz=None, check_ext_ocr=None, check_axial=None, check_barcode_format=None, check_ir_visibility=None, check_ipi=None, check_photo_embedding=None, check_photo_comparison=None, check_letter_screen=None, check_security_text=None, local_vars_configuration=None): # noqa: E501 - """AuthParams - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._check_liveness = None - self._liveness_params = None - self._check_uv_luminiscence = None - self._check_irb900 = None - self._check_image_patterns = None - self._check_fibers = None - self._check_ext_mrz = None - self._check_ext_ocr = None - self._check_axial = None - self._check_barcode_format = None - self._check_ir_visibility = None - self._check_ipi = None - self._check_photo_embedding = None - self._check_photo_comparison = None - self._check_letter_screen = None - self._check_security_text = None - self.discriminator = None - - if check_liveness is not None: - self.check_liveness = check_liveness - if liveness_params is not None: - self.liveness_params = liveness_params - if check_uv_luminiscence is not None: - self.check_uv_luminiscence = check_uv_luminiscence - if check_irb900 is not None: - self.check_irb900 = check_irb900 - if check_image_patterns is not None: - self.check_image_patterns = check_image_patterns - if check_fibers is not None: - self.check_fibers = check_fibers - if check_ext_mrz is not None: - self.check_ext_mrz = check_ext_mrz - if check_ext_ocr is not None: - self.check_ext_ocr = check_ext_ocr - if check_axial is not None: - self.check_axial = check_axial - if check_barcode_format is not None: - self.check_barcode_format = check_barcode_format - if check_ir_visibility is not None: - self.check_ir_visibility = check_ir_visibility - if check_ipi is not None: - self.check_ipi = check_ipi - if check_photo_embedding is not None: - self.check_photo_embedding = check_photo_embedding - if check_photo_comparison is not None: - self.check_photo_comparison = check_photo_comparison - if check_letter_screen is not None: - self.check_letter_screen = check_letter_screen - if check_security_text is not None: - self.check_security_text = check_security_text - - @property - def check_liveness(self): - """Gets the check_liveness of this AuthParams. # noqa: E501 - - This parameter is used to enable document liveness check # noqa: E501 - - :return: The check_liveness of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_liveness - - @check_liveness.setter - def check_liveness(self, check_liveness): - """Sets the check_liveness of this AuthParams. - - This parameter is used to enable document liveness check # noqa: E501 - - :param check_liveness: The check_liveness of this AuthParams. # noqa: E501 - :type check_liveness: bool - """ - - self._check_liveness = check_liveness - - @property - def liveness_params(self): - """Gets the liveness_params of this AuthParams. # noqa: E501 - - - :return: The liveness_params of this AuthParams. # noqa: E501 - :rtype: LivenessParams - """ - return self._liveness_params - - @liveness_params.setter - def liveness_params(self, liveness_params): - """Sets the liveness_params of this AuthParams. - - - :param liveness_params: The liveness_params of this AuthParams. # noqa: E501 - :type liveness_params: LivenessParams - """ - - self._liveness_params = liveness_params - - @property - def check_uv_luminiscence(self): - """Gets the check_uv_luminiscence of this AuthParams. # noqa: E501 - - This parameter is used to enable Document luminescence check in UV light # noqa: E501 - - :return: The check_uv_luminiscence of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_uv_luminiscence - - @check_uv_luminiscence.setter - def check_uv_luminiscence(self, check_uv_luminiscence): - """Sets the check_uv_luminiscence of this AuthParams. - - This parameter is used to enable Document luminescence check in UV light # noqa: E501 - - :param check_uv_luminiscence: The check_uv_luminiscence of this AuthParams. # noqa: E501 - :type check_uv_luminiscence: bool - """ - - self._check_uv_luminiscence = check_uv_luminiscence - - @property - def check_irb900(self): - """Gets the check_irb900 of this AuthParams. # noqa: E501 - - This parameter is used to enable B900 ink MRZ contrast check in IR light # noqa: E501 - - :return: The check_irb900 of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_irb900 - - @check_irb900.setter - def check_irb900(self, check_irb900): - """Sets the check_irb900 of this AuthParams. - - This parameter is used to enable B900 ink MRZ contrast check in IR light # noqa: E501 - - :param check_irb900: The check_irb900 of this AuthParams. # noqa: E501 - :type check_irb900: bool - """ - - self._check_irb900 = check_irb900 - - @property - def check_image_patterns(self): - """Gets the check_image_patterns of this AuthParams. # noqa: E501 - - This parameter is used to enable Image patterns presence/absence check (position, shape, color) # noqa: E501 - - :return: The check_image_patterns of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_image_patterns - - @check_image_patterns.setter - def check_image_patterns(self, check_image_patterns): - """Sets the check_image_patterns of this AuthParams. - - This parameter is used to enable Image patterns presence/absence check (position, shape, color) # noqa: E501 - - :param check_image_patterns: The check_image_patterns of this AuthParams. # noqa: E501 - :type check_image_patterns: bool - """ - - self._check_image_patterns = check_image_patterns - - @property - def check_fibers(self): - """Gets the check_fibers of this AuthParams. # noqa: E501 - - This parameter is used to enable Fibers detection # noqa: E501 - - :return: The check_fibers of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_fibers - - @check_fibers.setter - def check_fibers(self, check_fibers): - """Sets the check_fibers of this AuthParams. - - This parameter is used to enable Fibers detection # noqa: E501 - - :param check_fibers: The check_fibers of this AuthParams. # noqa: E501 - :type check_fibers: bool - """ - - self._check_fibers = check_fibers - - @property - def check_ext_mrz(self): - """Gets the check_ext_mrz of this AuthParams. # noqa: E501 - - This parameter is used to enable Extended MRZ Check # noqa: E501 - - :return: The check_ext_mrz of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_ext_mrz - - @check_ext_mrz.setter - def check_ext_mrz(self, check_ext_mrz): - """Sets the check_ext_mrz of this AuthParams. - - This parameter is used to enable Extended MRZ Check # noqa: E501 - - :param check_ext_mrz: The check_ext_mrz of this AuthParams. # noqa: E501 - :type check_ext_mrz: bool - """ - - self._check_ext_mrz = check_ext_mrz - - @property - def check_ext_ocr(self): - """Gets the check_ext_ocr of this AuthParams. # noqa: E501 - - This parameter is used to enable Extended OCR Check # noqa: E501 - - :return: The check_ext_ocr of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_ext_ocr - - @check_ext_ocr.setter - def check_ext_ocr(self, check_ext_ocr): - """Sets the check_ext_ocr of this AuthParams. - - This parameter is used to enable Extended OCR Check # noqa: E501 - - :param check_ext_ocr: The check_ext_ocr of this AuthParams. # noqa: E501 - :type check_ext_ocr: bool - """ - - self._check_ext_ocr = check_ext_ocr - - @property - def check_axial(self): - """Gets the check_axial of this AuthParams. # noqa: E501 - - This parameter is used to enable laminate integrity check in axial light # noqa: E501 - - :return: The check_axial of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_axial - - @check_axial.setter - def check_axial(self, check_axial): - """Sets the check_axial of this AuthParams. - - This parameter is used to enable laminate integrity check in axial light # noqa: E501 - - :param check_axial: The check_axial of this AuthParams. # noqa: E501 - :type check_axial: bool - """ - - self._check_axial = check_axial - - @property - def check_barcode_format(self): - """Gets the check_barcode_format of this AuthParams. # noqa: E501 - - This parameter is used to enable Barcode format check (code metadata, data format, contents format, etc.) # noqa: E501 - - :return: The check_barcode_format of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_barcode_format - - @check_barcode_format.setter - def check_barcode_format(self, check_barcode_format): - """Sets the check_barcode_format of this AuthParams. - - This parameter is used to enable Barcode format check (code metadata, data format, contents format, etc.) # noqa: E501 - - :param check_barcode_format: The check_barcode_format of this AuthParams. # noqa: E501 - :type check_barcode_format: bool - """ - - self._check_barcode_format = check_barcode_format - - @property - def check_ir_visibility(self): - """Gets the check_ir_visibility of this AuthParams. # noqa: E501 - - This parameter is used to enable Document elements visibility check in IR light # noqa: E501 - - :return: The check_ir_visibility of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_ir_visibility - - @check_ir_visibility.setter - def check_ir_visibility(self, check_ir_visibility): - """Sets the check_ir_visibility of this AuthParams. - - This parameter is used to enable Document elements visibility check in IR light # noqa: E501 - - :param check_ir_visibility: The check_ir_visibility of this AuthParams. # noqa: E501 - :type check_ir_visibility: bool - """ - - self._check_ir_visibility = check_ir_visibility - - @property - def check_ipi(self): - """Gets the check_ipi of this AuthParams. # noqa: E501 - - This parameter is used to enable Invisible Personal Information (IPI) check # noqa: E501 - - :return: The check_ipi of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_ipi - - @check_ipi.setter - def check_ipi(self, check_ipi): - """Sets the check_ipi of this AuthParams. - - This parameter is used to enable Invisible Personal Information (IPI) check # noqa: E501 - - :param check_ipi: The check_ipi of this AuthParams. # noqa: E501 - :type check_ipi: bool - """ - - self._check_ipi = check_ipi - - @property - def check_photo_embedding(self): - """Gets the check_photo_embedding of this AuthParams. # noqa: E501 - - This parameter is used to enable Owner's photo embedding check (is photo printed or sticked) # noqa: E501 - - :return: The check_photo_embedding of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_photo_embedding - - @check_photo_embedding.setter - def check_photo_embedding(self, check_photo_embedding): - """Sets the check_photo_embedding of this AuthParams. - - This parameter is used to enable Owner's photo embedding check (is photo printed or sticked) # noqa: E501 - - :param check_photo_embedding: The check_photo_embedding of this AuthParams. # noqa: E501 - :type check_photo_embedding: bool - """ - - self._check_photo_embedding = check_photo_embedding - - @property - def check_photo_comparison(self): - """Gets the check_photo_comparison of this AuthParams. # noqa: E501 - - This parameter is used to enable Portrait comparison check # noqa: E501 - - :return: The check_photo_comparison of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_photo_comparison - - @check_photo_comparison.setter - def check_photo_comparison(self, check_photo_comparison): - """Sets the check_photo_comparison of this AuthParams. - - This parameter is used to enable Portrait comparison check # noqa: E501 - - :param check_photo_comparison: The check_photo_comparison of this AuthParams. # noqa: E501 - :type check_photo_comparison: bool - """ - - self._check_photo_comparison = check_photo_comparison - - @property - def check_letter_screen(self): - """Gets the check_letter_screen of this AuthParams. # noqa: E501 - - This parameter is used to enable LetterScreen check # noqa: E501 - - :return: The check_letter_screen of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_letter_screen - - @check_letter_screen.setter - def check_letter_screen(self, check_letter_screen): - """Sets the check_letter_screen of this AuthParams. - - This parameter is used to enable LetterScreen check # noqa: E501 - - :param check_letter_screen: The check_letter_screen of this AuthParams. # noqa: E501 - :type check_letter_screen: bool - """ - - self._check_letter_screen = check_letter_screen - - @property - def check_security_text(self): - """Gets the check_security_text of this AuthParams. # noqa: E501 - - This parameter is used to enable Security text check # noqa: E501 - - :return: The check_security_text of this AuthParams. # noqa: E501 - :rtype: bool - """ - return self._check_security_text - - @check_security_text.setter - def check_security_text(self, check_security_text): - """Sets the check_security_text of this AuthParams. - - This parameter is used to enable Security text check # noqa: E501 - - :param check_security_text: The check_security_text of this AuthParams. # noqa: E501 - :type check_security_text: bool - """ - - self._check_security_text = check_security_text - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthParams): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthParams): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_check_list.py b/regula/documentreader/webclient/gen/models/authenticity_check_list.py index c66ae51..1436bb3 100644 --- a/regula/documentreader/webclient/gen/models/authenticity_check_list.py +++ b/regula/documentreader/webclient/gen/models/authenticity_check_list.py @@ -4,147 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AuthenticityCheckList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.authenticity_check_result import AuthenticityCheckResult +from typing import Optional, Set +from typing_extensions import Self +class AuthenticityCheckList(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'count': 'int', - 'list': 'list[AuthenticityCheckResult]' - } - - attribute_map = { - 'count': 'Count', - 'list': 'List' - } - - def __init__(self, count=None, list=None, local_vars_configuration=None): # noqa: E501 - """AuthenticityCheckList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._count = None - self._list = None - self.discriminator = None - - if count is not None: - self.count = count - self.list = list - - @property - def count(self): - """Gets the count of this AuthenticityCheckList. # noqa: E501 - - Count of items in List # noqa: E501 - - :return: The count of this AuthenticityCheckList. # noqa: E501 - :rtype: int - """ - return self._count - - @count.setter - def count(self, count): - """Sets the count of this AuthenticityCheckList. - - Count of items in List # noqa: E501 - - :param count: The count of this AuthenticityCheckList. # noqa: E501 - :type count: int - """ - - self._count = count - - @property - def list(self): - """Gets the list of this AuthenticityCheckList. # noqa: E501 - - Authenticity Check # noqa: E501 - - :return: The list of this AuthenticityCheckList. # noqa: E501 - :rtype: list[AuthenticityCheckResult] + AuthenticityCheckList + """ # noqa: E501 + count: StrictInt = Field(description="Count of items in List", alias="Count") + list: List[AuthenticityCheckResult] = Field(description="Authenticity Check", alias="List") + __properties: ClassVar[List[str]] = ["Count", "List"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AuthenticityCheckList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._list + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AuthenticityCheckList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "List": [AuthenticityCheckResult.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None + }) + return _obj - @list.setter - def list(self, list): - """Sets the list of this AuthenticityCheckList. - Authenticity Check # noqa: E501 - - :param list: The list of this AuthenticityCheckList. # noqa: E501 - :type list: list[AuthenticityCheckResult] - """ - if self.local_vars_configuration.client_side_validation and list is None: # noqa: E501 - raise ValueError("Invalid value for `list`, must not be `None`") # noqa: E501 - - self._list = list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityCheckList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityCheckList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_check_list_item.py b/regula/documentreader/webclient/gen/models/authenticity_check_list_item.py new file mode 100644 index 0000000..a3f0bb0 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/authenticity_check_list_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.authenticity_check_list import AuthenticityCheckList +from typing import Optional, Set +from typing_extensions import Self + +class AuthenticityCheckListItem(BaseModel): + """ + AuthenticityCheckListItem + """ # noqa: E501 + authenticity_check_list: AuthenticityCheckList = Field(alias="AuthenticityCheckList") + __properties: ClassVar[List[str]] = ["AuthenticityCheckList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AuthenticityCheckListItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of authenticity_check_list + if self.authenticity_check_list: + _dict['AuthenticityCheckList'] = self.authenticity_check_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AuthenticityCheckListItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "AuthenticityCheckList": AuthenticityCheckList.from_dict(obj["AuthenticityCheckList"]) if obj.get("AuthenticityCheckList") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/authenticity_check_result.py b/regula/documentreader/webclient/gen/models/authenticity_check_result.py index db6f057..efef11f 100644 --- a/regula/documentreader/webclient/gen/models/authenticity_check_result.py +++ b/regula/documentreader/webclient/gen/models/authenticity_check_result.py @@ -4,171 +4,92 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AuthenticityCheckResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from typing import Optional, Set +from typing_extensions import Self +class AuthenticityCheckResult(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'AuthenticityResultType', - 'result': 'CheckResult', - 'list': 'list[AuthenticityCheckResultItem]' - } - - attribute_map = { - 'type': 'Type', - 'result': 'Result', - 'list': 'List' - } - - def __init__(self, type=None, result=None, list=None, local_vars_configuration=None): # noqa: E501 - """AuthenticityCheckResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._result = None - self._list = None - self.discriminator = None - - self.type = type - self.result = result - self.list = list - - @property - def type(self): - """Gets the type of this AuthenticityCheckResult. # noqa: E501 - - - :return: The type of this AuthenticityCheckResult. # noqa: E501 - :rtype: AuthenticityResultType + AuthenticityCheckResult + """ # noqa: E501 + type: AuthenticityResultType = Field(alias="Type") + result: CheckResult = Field(alias="Result") + count: Optional[StrictInt] = Field(default=None, description="Count of items in List", alias="Count") + list: List[AuthenticityCheckResultItem] = Field(alias="List") + __properties: ClassVar[List[str]] = ["Type", "Result", "Count", "List"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AuthenticityCheckResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this AuthenticityCheckResult. - - - :param type: The type of this AuthenticityCheckResult. # noqa: E501 - :type type: AuthenticityResultType - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def result(self): - """Gets the result of this AuthenticityCheckResult. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AuthenticityCheckResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Result": obj.get("Result"), + "Count": obj.get("Count"), + "List": [AuthenticityCheckResultItem.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None + }) + return _obj - :return: The result of this AuthenticityCheckResult. # noqa: E501 - :rtype: CheckResult - """ - return self._result - - @result.setter - def result(self, result): - """Sets the result of this AuthenticityCheckResult. - - - :param result: The result of this AuthenticityCheckResult. # noqa: E501 - :type result: CheckResult - """ - if self.local_vars_configuration.client_side_validation and result is None: # noqa: E501 - raise ValueError("Invalid value for `result`, must not be `None`") # noqa: E501 - - self._result = result - - @property - def list(self): - """Gets the list of this AuthenticityCheckResult. # noqa: E501 - - - :return: The list of this AuthenticityCheckResult. # noqa: E501 - :rtype: list[AuthenticityCheckResultItem] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this AuthenticityCheckResult. - - - :param list: The list of this AuthenticityCheckResult. # noqa: E501 - :type list: list[AuthenticityCheckResultItem] - """ - if self.local_vars_configuration.client_side_validation and list is None: # noqa: E501 - raise ValueError("Invalid value for `list`, must not be `None`") # noqa: E501 - - self._list = list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityCheckResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityCheckResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_check_result_item.py b/regula/documentreader/webclient/gen/models/authenticity_check_result_item.py index c95f1ac..5e2b254 100644 --- a/regula/documentreader/webclient/gen/models/authenticity_check_result_item.py +++ b/regula/documentreader/webclient/gen/models/authenticity_check_result_item.py @@ -4,228 +4,165 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Common fields for all authenticity result objects -""" -class AuthenticityCheckResultItem(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - +import json + +from importlib import import_module +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from typing import Optional, Set +from typing_extensions import Self + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.photo_ident_result import PhotoIdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.fiber_result import FiberResult + from regula.documentreader.webclient.gen.models.fiber_result import FiberResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.photo_ident_result import PhotoIdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.ident_result import IdentResult + from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult + +class AuthenticityCheckResultItem(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue' - } - discriminator_value_class_map = { - 1 : 'SecurityFeatureResult', - 1024 : 'IdentResult', - 1048576 : 'IdentResult', - 128 : 'PhotoIdentResult', - 131072 : 'IdentResult', - 16 : 'FiberResult', - 16384 : 'FiberResult', - 2 : 'SecurityFeatureResult', - 2048 : 'IdentResult', - 256 : 'PhotoIdentResult', - 262144 : 'IdentResult', - 32 : 'IdentResult', - 32768 : 'IdentResult', - 4 : 'IdentResult', - 4096 : 'SecurityFeatureResult', - 512 : 'SecurityFeatureResult', - 524288 : 'IdentResult', - 64 : 'OCRSecurityTextResult', - 65536 : 'SecurityFeatureResult', - 8 : 'SecurityFeatureResult', - 8192 : 'SecurityFeatureResult', - 8388608 : 'SecurityFeatureResult', + Common fields for all authenticity result objects + """ # noqa: E501 + type: AuthenticityResultType = Field(alias="Type") + element_result: Optional[CheckResult] = Field(default=None, alias="ElementResult") + element_diagnose: Optional[CheckDiagnose] = Field(default=None, alias="ElementDiagnose") + percent_value: Optional[StrictInt] = Field(default=None, alias="PercentValue") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + # JSON field name that stores the object type + __discriminator_property_name: ClassVar[str] = 'Type' + + # discriminator mappings + __discriminator_value_class_map: ClassVar[Dict[str, str]] = { + '1': 'SecurityFeatureResult','1024': 'IdentResult','1048576': 'IdentResult','128': 'PhotoIdentResult','131072': 'IdentResult','16': 'FiberResult','16384': 'FiberResult','2': 'SecurityFeatureResult','2048': 'IdentResult','256': 'PhotoIdentResult','262144': 'IdentResult','32': 'IdentResult','32768': 'IdentResult','4': 'IdentResult','4096': 'SecurityFeatureResult','512': 'SecurityFeatureResult','524288': 'IdentResult','64': 'OCRSecurityTextResult','65536': 'SecurityFeatureResult','8': 'SecurityFeatureResult','8192': 'SecurityFeatureResult','8388608': 'SecurityFeatureResult' } - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, local_vars_configuration=None): # noqa: E501 - """AuthenticityCheckResultItem - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self.discriminator = 'type' - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - - @property - def type(self): - """Gets the type of this AuthenticityCheckResultItem. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this AuthenticityCheckResultItem. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this AuthenticityCheckResultItem. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this AuthenticityCheckResultItem. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this AuthenticityCheckResultItem. # noqa: E501 - - - :return: The element_result of this AuthenticityCheckResultItem. # noqa: E501 - :rtype: CheckResult + @classmethod + def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(str(discriminator_value)) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Union[SecurityFeatureResult, IdentResult, IdentResult, PhotoIdentResult, IdentResult, FiberResult, FiberResult, SecurityFeatureResult, IdentResult, PhotoIdentResult, IdentResult, IdentResult, IdentResult, IdentResult, SecurityFeatureResult, SecurityFeatureResult, IdentResult, OCRSecurityTextResult, SecurityFeatureResult, SecurityFeatureResult, SecurityFeatureResult, SecurityFeatureResult]]: + """Create an instance of AuthenticityCheckResultItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._element_result + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[SecurityFeatureResult, IdentResult, IdentResult, PhotoIdentResult, IdentResult, FiberResult, FiberResult, SecurityFeatureResult, IdentResult, PhotoIdentResult, IdentResult, IdentResult, IdentResult, IdentResult, SecurityFeatureResult, SecurityFeatureResult, IdentResult, OCRSecurityTextResult, SecurityFeatureResult, SecurityFeatureResult, SecurityFeatureResult, SecurityFeatureResult]]: + """Create an instance of AuthenticityCheckResultItem from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'PhotoIdentResult': + return import_module("regula.documentreader.webclient.gen.models.photo_ident_result").PhotoIdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'FiberResult': + return import_module("regula.documentreader.webclient.gen.models.fiber_result").FiberResult.from_dict(obj) + if object_type == 'FiberResult': + return import_module("regula.documentreader.webclient.gen.models.fiber_result").FiberResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'PhotoIdentResult': + return import_module("regula.documentreader.webclient.gen.models.photo_ident_result").PhotoIdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'IdentResult': + return import_module("regula.documentreader.webclient.gen.models.ident_result").IdentResult.from_dict(obj) + if object_type == 'OCRSecurityTextResult': + return import_module("regula.documentreader.webclient.gen.models.ocr_security_text_result").OCRSecurityTextResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + if object_type == 'SecurityFeatureResult': + return import_module("regula.documentreader.webclient.gen.models.security_feature_result").SecurityFeatureResult.from_dict(obj) + + raise ValueError("AuthenticityCheckResultItem failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this AuthenticityCheckResultItem. - - - :param element_result: The element_result of this AuthenticityCheckResultItem. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this AuthenticityCheckResultItem. # noqa: E501 - - - :return: The element_diagnose of this AuthenticityCheckResultItem. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this AuthenticityCheckResultItem. - - - :param element_diagnose: The element_diagnose of this AuthenticityCheckResultItem. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this AuthenticityCheckResultItem. # noqa: E501 - - - :return: The percent_value of this AuthenticityCheckResultItem. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this AuthenticityCheckResultItem. - - - :param percent_value: The percent_value of this AuthenticityCheckResultItem. # noqa: E501 - :type percent_value: int - """ - self._percent_value = percent_value - - def get_real_child_model(self, data): - """Returns the real base class specified by the discriminator""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - from regula.documentreader.webclient.ext.models import RawAuthenticityCheckResultItem - return self.discriminator_value_class_map.get(discriminator_value, RawAuthenticityCheckResultItem.__name__) - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityCheckResultItem): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityCheckResultItem): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_check_result_list_inner.py b/regula/documentreader/webclient/gen/models/authenticity_check_result_list_inner.py new file mode 100644 index 0000000..bfeab93 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/authenticity_check_result_list_inner.py @@ -0,0 +1,174 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +import pprint +from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator +from typing import Any, List, Optional +from regula.documentreader.webclient.gen.models.fiber_result import FiberResult +from regula.documentreader.webclient.gen.models.ident_result import IdentResult +from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult +from regula.documentreader.webclient.gen.models.photo_ident_result import PhotoIdentResult +from regula.documentreader.webclient.gen.models.security_feature_result import SecurityFeatureResult +from pydantic import StrictStr, Field +from typing import Union, List, Set, Optional, Dict +from typing_extensions import Literal, Self + +AUTHENTICITYCHECKRESULTLISTINNER_ONE_OF_SCHEMAS = ["FiberResult", "IdentResult", "OCRSecurityTextResult", "PhotoIdentResult", "SecurityFeatureResult"] + +class AuthenticityCheckResultListInner(BaseModel): + """ + AuthenticityCheckResultListInner + """ + # data type: SecurityFeatureResult + oneof_schema_1_validator: Optional[SecurityFeatureResult] = None + # data type: IdentResult + oneof_schema_2_validator: Optional[IdentResult] = None + # data type: FiberResult + oneof_schema_3_validator: Optional[FiberResult] = None + # data type: OCRSecurityTextResult + oneof_schema_4_validator: Optional[OCRSecurityTextResult] = None + # data type: PhotoIdentResult + oneof_schema_5_validator: Optional[PhotoIdentResult] = None + actual_instance: Optional[Union[FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult]] = None + one_of_schemas: Set[str] = { "FiberResult", "IdentResult", "OCRSecurityTextResult", "PhotoIdentResult", "SecurityFeatureResult" } + + model_config = ConfigDict( + validate_assignment=True, + protected_namespaces=(), + ) + + + discriminator_value_class_map: Dict[str, str] = { + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator('actual_instance') + def actual_instance_must_validate_oneof(cls, v): + instance = AuthenticityCheckResultListInner.model_construct() + error_messages = [] + match = 0 + # validate data type: SecurityFeatureResult + if not isinstance(v, SecurityFeatureResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `SecurityFeatureResult`") + else: + match += 1 + # validate data type: IdentResult + if not isinstance(v, IdentResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `IdentResult`") + else: + match += 1 + # validate data type: FiberResult + if not isinstance(v, FiberResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `FiberResult`") + else: + match += 1 + # validate data type: OCRSecurityTextResult + if not isinstance(v, OCRSecurityTextResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `OCRSecurityTextResult`") + else: + match += 1 + # validate data type: PhotoIdentResult + if not isinstance(v, PhotoIdentResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `PhotoIdentResult`") + else: + match += 1 + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when setting `actual_instance` in AuthenticityCheckResultListInner with oneOf schemas: FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when setting `actual_instance` in AuthenticityCheckResultListInner with oneOf schemas: FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult. Details: " + ", ".join(error_messages)) + else: + return v + + @classmethod + def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + match = 0 + + # deserialize data into SecurityFeatureResult + try: + instance.actual_instance = SecurityFeatureResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into IdentResult + try: + instance.actual_instance = IdentResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into FiberResult + try: + instance.actual_instance = FiberResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into OCRSecurityTextResult + try: + instance.actual_instance = OCRSecurityTextResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into PhotoIdentResult + try: + instance.actual_instance = PhotoIdentResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when deserializing the JSON string into AuthenticityCheckResultListInner with oneOf schemas: FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when deserializing the JSON string into AuthenticityCheckResultListInner with oneOf schemas: FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult. Details: " + ", ".join(error_messages)) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], FiberResult, IdentResult, OCRSecurityTextResult, PhotoIdentResult, SecurityFeatureResult]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + # primitive type + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) + + diff --git a/regula/documentreader/webclient/gen/models/authenticity_result.py b/regula/documentreader/webclient/gen/models/authenticity_result.py index 882ad50..606a681 100644 --- a/regula/documentreader/webclient/gen/models/authenticity_result.py +++ b/regula/documentreader/webclient/gen/models/authenticity_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.authenticity_check_list import AuthenticityCheckList +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AuthenticityResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class AuthenticityResult(ResultItem): """ + AuthenticityResult + """ # noqa: E501 + authenticity_check_list: AuthenticityCheckList = Field(alias="AuthenticityCheckList") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "AuthenticityCheckList"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'authenticity_check_list': 'AuthenticityCheckList', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'authenticity_check_list': 'AuthenticityCheckList', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, authenticity_check_list=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """AuthenticityResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._authenticity_check_list = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.authenticity_check_list = authenticity_check_list - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def authenticity_check_list(self): - """Gets the authenticity_check_list of this AuthenticityResult. # noqa: E501 - - - :return: The authenticity_check_list of this AuthenticityResult. # noqa: E501 - :rtype: AuthenticityCheckList - """ - return self._authenticity_check_list - - @authenticity_check_list.setter - def authenticity_check_list(self, authenticity_check_list): - """Sets the authenticity_check_list of this AuthenticityResult. - - - :param authenticity_check_list: The authenticity_check_list of this AuthenticityResult. # noqa: E501 - :type authenticity_check_list: AuthenticityCheckList - """ - if self.local_vars_configuration.client_side_validation and authenticity_check_list is None: # noqa: E501 - raise ValueError("Invalid value for `authenticity_check_list`, must not be `None`") # noqa: E501 - - self._authenticity_check_list = authenticity_check_list - - @property - def buf_length(self): - """Gets the buf_length of this AuthenticityResult. # noqa: E501 - - - :return: The buf_length of this AuthenticityResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this AuthenticityResult. - - - :param buf_length: The buf_length of this AuthenticityResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this AuthenticityResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this AuthenticityResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this AuthenticityResult. - - - :param light: The light of this AuthenticityResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this AuthenticityResult. # noqa: E501 - - - :return: The list_idx of this AuthenticityResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this AuthenticityResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this AuthenticityResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this AuthenticityResult. # noqa: E501 - - - :return: The page_idx of this AuthenticityResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this AuthenticityResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of AuthenticityResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this AuthenticityResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this AuthenticityResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this AuthenticityResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this AuthenticityResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of authenticity_check_list + if self.authenticity_check_list: + _dict['AuthenticityCheckList'] = self.authenticity_check_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of AuthenticityResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "AuthenticityCheckList": AuthenticityCheckList.from_dict(obj["AuthenticityCheckList"]) if obj.get("AuthenticityCheckList") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this AuthenticityResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_result_all_of.py b/regula/documentreader/webclient/gen/models/authenticity_result_all_of.py deleted file mode 100644 index 9e95a91..0000000 --- a/regula/documentreader/webclient/gen/models/authenticity_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class AuthenticityResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'authenticity_check_list': 'AuthenticityCheckList' - } - - attribute_map = { - 'authenticity_check_list': 'AuthenticityCheckList' - } - - def __init__(self, authenticity_check_list=None, local_vars_configuration=None): # noqa: E501 - """AuthenticityResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._authenticity_check_list = None - self.discriminator = None - - self.authenticity_check_list = authenticity_check_list - - @property - def authenticity_check_list(self): - """Gets the authenticity_check_list of this AuthenticityResultAllOf. # noqa: E501 - - - :return: The authenticity_check_list of this AuthenticityResultAllOf. # noqa: E501 - :rtype: AuthenticityCheckList - """ - return self._authenticity_check_list - - @authenticity_check_list.setter - def authenticity_check_list(self, authenticity_check_list): - """Sets the authenticity_check_list of this AuthenticityResultAllOf. - - - :param authenticity_check_list: The authenticity_check_list of this AuthenticityResultAllOf. # noqa: E501 - :type authenticity_check_list: AuthenticityCheckList - """ - if self.local_vars_configuration.client_side_validation and authenticity_check_list is None: # noqa: E501 - raise ValueError("Invalid value for `authenticity_check_list`, must not be `None`") # noqa: E501 - - self._authenticity_check_list = authenticity_check_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/authenticity_result_type.py b/regula/documentreader/webclient/gen/models/authenticity_result_type.py index 6b94a2b..5d03eec 100644 --- a/regula/documentreader/webclient/gen/models/authenticity_result_type.py +++ b/regula/documentreader/webclient/gen/models/authenticity_result_type.py @@ -4,134 +4,51 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration describes available authenticity checks: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/. -""" -class AuthenticityResultType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class AuthenticityResultType(int, Enum): + """ + Enumeration describes available authenticity checks: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/. """ - - UV_LUMINESCENCE = int("1") - - IR_B900 = int("2") - - IMAGE_PATTERN = int("4") - - AXIAL_PROTECTION = int("8") - - UV_FIBERS = int("16") - - IR_VISIBILITY = int("32") - - OCR_SECURITY_TEXT = int("64") - - IPI = int("128") - - PHOTO_EMBED_TYPE = int("512") - - OVI = int("1024") - - HOLOGRAMS = int("4096") - - PHOTO_AREA = int("8192") - - PORTRAIT_COMPARISON = int("32768") - - BARCODE_FORMAT_CHECK = int("65536") - - KINEGRAM = int("131072") - - LETTER_SCREEN = int("262144") - - HOLOGRAM_DETECTION = int("524288") - - FINGERPRINT_COMPARISON = int("1048576") - - LIVENESS = int("2097152") - - EXTENDED_OCR_CHECK = int("4194304") - - EXTENDED_MRZ_CHECK = int("8388608") - - ENCRYPTED_IPI = int("16777216") - - allowable_values = [UV_LUMINESCENCE, IR_B900, IMAGE_PATTERN, AXIAL_PROTECTION, UV_FIBERS, IR_VISIBILITY, OCR_SECURITY_TEXT, IPI, PHOTO_EMBED_TYPE, OVI, HOLOGRAMS, PHOTO_AREA, PORTRAIT_COMPARISON, BARCODE_FORMAT_CHECK, KINEGRAM, LETTER_SCREEN, HOLOGRAM_DETECTION, FINGERPRINT_COMPARISON, LIVENESS, EXTENDED_OCR_CHECK, EXTENDED_MRZ_CHECK, ENCRYPTED_IPI] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """AuthenticityResultType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, AuthenticityResultType): - return False - - return self.to_dict() == other.to_dict() + NONE = 0 + UV_LUMINESCENCE = 1 + IR_B900 = 2 + IMAGE_PATTERN = 4 + AXIAL_PROTECTION = 8 + UV_FIBERS = 16 + IR_VISIBILITY = 32 + OCR_SECURITY_TEXT = 64 + IPI = 128 + IR_PHOTO = 256 + PHOTO_EMBED_TYPE = 512 + OVI = 1024 + IR_LUMINESCENCE = 2048 + HOLOGRAMS = 4096 + PHOTO_AREA = 8192 + UV_BACKGROUND = 16384 + PORTRAIT_COMPARISON = 32768 + BARCODE_FORMAT_CHECK = 65536 + KINEGRAM = 131072 + LETTER_SCREEN = 262144 + HOLOGRAM_DETECTION = 524288 + FINGERPRINT_COMPARISON = 1048576 + LIVENESS = 2097152 + EXTENDED_OCR_CHECK = 4194304 + EXTENDED_MRZ_CHECK = 8388608 + ENCRYPTED_IPI = 16777216 + STATUS_ONLY = 2147483648 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of AuthenticityResultType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, AuthenticityResultType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/bar_code_module_type.py b/regula/documentreader/webclient/gen/models/bar_code_module_type.py new file mode 100644 index 0000000..f6d7ec2 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/bar_code_module_type.py @@ -0,0 +1,32 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class BarCodeModuleType(int, Enum): + """ + BarCodeModuleType + """ + + """ + allowed enum values + """ + TEXT = 0 + BYTE = 1 + NUM = 2 + SHIFT = 3 + ALL = 4 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of BarCodeModuleType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/barcode_type.py b/regula/documentreader/webclient/gen/models/barcode_type.py new file mode 100644 index 0000000..0d9a62a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/barcode_type.py @@ -0,0 +1,48 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class BarcodeType(int, Enum): + """ + Enumeration contains the types of barcodes that can be processed + """ + + """ + allowed enum values + """ + UNKNOWN = 0 + CODE128 = 1 + CODE39 = 2 + EAN8 = 3 + ITF = 4 + PDF417 = 5 + STF = 6 + MTF = 7 + IATA = 8 + CODABAR = 9 + UPCA = 10 + CODE93 = 11 + UPCE = 12 + EAN13 = 13 + QRCODE = 14 + AZTEC = 15 + DATAMATRIX = 16 + ALL_1D = 17 + CODE11 = 18 + JABCODE = 19 + END = 20 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of BarcodeType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/bc_pdf417_info.py b/regula/documentreader/webclient/gen/models/bc_pdf417_info.py index 322c85d..4b4a803 100644 --- a/regula/documentreader/webclient/gen/models/bc_pdf417_info.py +++ b/regula/documentreader/webclient/gen/models/bc_pdf417_info.py @@ -4,246 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class BcPDF417INFO(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from typing import Optional, Set +from typing_extensions import Self +class BcPDF417INFO(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'angle': 'float', - 'bc_column': 'int', - 'bc_error_level': 'int', - 'bc_row': 'int', - 'min_x': 'float', - 'min_y': 'float' - } - - attribute_map = { - 'angle': 'Angle', - 'bc_column': 'bcColumn', - 'bc_error_level': 'bcErrorLevel', - 'bc_row': 'bcRow', - 'min_x': 'minX', - 'min_y': 'minY' - } - - def __init__(self, angle=None, bc_column=None, bc_error_level=None, bc_row=None, min_x=None, min_y=None, local_vars_configuration=None): # noqa: E501 - """BcPDF417INFO - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._angle = None - self._bc_column = None - self._bc_error_level = None - self._bc_row = None - self._min_x = None - self._min_y = None - self.discriminator = None - - if angle is not None: - self.angle = angle - if bc_column is not None: - self.bc_column = bc_column - if bc_error_level is not None: - self.bc_error_level = bc_error_level - if bc_row is not None: - self.bc_row = bc_row - if min_x is not None: - self.min_x = min_x - if min_y is not None: - self.min_y = min_y - - @property - def angle(self): - """Gets the angle of this BcPDF417INFO. # noqa: E501 - - - :return: The angle of this BcPDF417INFO. # noqa: E501 - :rtype: float + BcPDF417INFO + """ # noqa: E501 + angle: Union[StrictFloat, StrictInt] = Field(alias="Angle") + bc_column: StrictInt = Field(alias="bcColumn") + bc_error_level: StrictInt = Field(alias="bcErrorLevel") + bc_row: StrictInt = Field(alias="bcRow") + min_x: Union[StrictFloat, StrictInt] = Field(alias="minX") + min_y: Union[StrictFloat, StrictInt] = Field(alias="minY") + __properties: ClassVar[List[str]] = ["Angle", "bcColumn", "bcErrorLevel", "bcRow", "minX", "minY"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of BcPDF417INFO from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._angle - - @angle.setter - def angle(self, angle): - """Sets the angle of this BcPDF417INFO. - - - :param angle: The angle of this BcPDF417INFO. # noqa: E501 - :type angle: float - """ - - self._angle = angle - - @property - def bc_column(self): - """Gets the bc_column of this BcPDF417INFO. # noqa: E501 - - - :return: The bc_column of this BcPDF417INFO. # noqa: E501 - :rtype: int - """ - return self._bc_column - - @bc_column.setter - def bc_column(self, bc_column): - """Sets the bc_column of this BcPDF417INFO. - - - :param bc_column: The bc_column of this BcPDF417INFO. # noqa: E501 - :type bc_column: int - """ - - self._bc_column = bc_column - - @property - def bc_error_level(self): - """Gets the bc_error_level of this BcPDF417INFO. # noqa: E501 - - - :return: The bc_error_level of this BcPDF417INFO. # noqa: E501 - :rtype: int - """ - return self._bc_error_level - - @bc_error_level.setter - def bc_error_level(self, bc_error_level): - """Sets the bc_error_level of this BcPDF417INFO. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of BcPDF417INFO from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Angle": obj.get("Angle"), + "bcColumn": obj.get("bcColumn"), + "bcErrorLevel": obj.get("bcErrorLevel"), + "bcRow": obj.get("bcRow"), + "minX": obj.get("minX"), + "minY": obj.get("minY") + }) + return _obj - :param bc_error_level: The bc_error_level of this BcPDF417INFO. # noqa: E501 - :type bc_error_level: int - """ - - self._bc_error_level = bc_error_level - - @property - def bc_row(self): - """Gets the bc_row of this BcPDF417INFO. # noqa: E501 - - - :return: The bc_row of this BcPDF417INFO. # noqa: E501 - :rtype: int - """ - return self._bc_row - - @bc_row.setter - def bc_row(self, bc_row): - """Sets the bc_row of this BcPDF417INFO. - - - :param bc_row: The bc_row of this BcPDF417INFO. # noqa: E501 - :type bc_row: int - """ - - self._bc_row = bc_row - - @property - def min_x(self): - """Gets the min_x of this BcPDF417INFO. # noqa: E501 - - - :return: The min_x of this BcPDF417INFO. # noqa: E501 - :rtype: float - """ - return self._min_x - - @min_x.setter - def min_x(self, min_x): - """Sets the min_x of this BcPDF417INFO. - - - :param min_x: The min_x of this BcPDF417INFO. # noqa: E501 - :type min_x: float - """ - - self._min_x = min_x - - @property - def min_y(self): - """Gets the min_y of this BcPDF417INFO. # noqa: E501 - - - :return: The min_y of this BcPDF417INFO. # noqa: E501 - :rtype: float - """ - return self._min_y - - @min_y.setter - def min_y(self, min_y): - """Sets the min_y of this BcPDF417INFO. - - - :param min_y: The min_y of this BcPDF417INFO. # noqa: E501 - :type min_y: float - """ - self._min_y = min_y - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, BcPDF417INFO): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, BcPDF417INFO): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/bc_roidetect.py b/regula/documentreader/webclient/gen/models/bc_roidetect.py index eba4755..0461af9 100644 --- a/regula/documentreader/webclient/gen/models/bc_roidetect.py +++ b/regula/documentreader/webclient/gen/models/bc_roidetect.py @@ -4,194 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class BcROIDETECT(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self +class BcROIDETECT(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'bottom': 'int', - 'left': 'int', - 'right': 'int', - 'top': 'int' - } - - attribute_map = { - 'bottom': 'bottom', - 'left': 'left', - 'right': 'right', - 'top': 'top' - } - - def __init__(self, bottom=None, left=None, right=None, top=None, local_vars_configuration=None): # noqa: E501 - """BcROIDETECT - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._bottom = None - self._left = None - self._right = None - self._top = None - self.discriminator = None - - if bottom is not None: - self.bottom = bottom - if left is not None: - self.left = left - if right is not None: - self.right = right - if top is not None: - self.top = top - - @property - def bottom(self): - """Gets the bottom of this BcROIDETECT. # noqa: E501 - - - :return: The bottom of this BcROIDETECT. # noqa: E501 - :rtype: int - """ - return self._bottom - - @bottom.setter - def bottom(self, bottom): - """Sets the bottom of this BcROIDETECT. - - - :param bottom: The bottom of this BcROIDETECT. # noqa: E501 - :type bottom: int - """ - - self._bottom = bottom - - @property - def left(self): - """Gets the left of this BcROIDETECT. # noqa: E501 - - - :return: The left of this BcROIDETECT. # noqa: E501 - :rtype: int + BcROIDETECT + """ # noqa: E501 + bottom: StrictInt + left: StrictInt + right: StrictInt + top: StrictInt + __properties: ClassVar[List[str]] = ["bottom", "left", "right", "top"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of BcROIDETECT from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._left - - @left.setter - def left(self, left): - """Sets the left of this BcROIDETECT. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of BcROIDETECT from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "bottom": obj.get("bottom"), + "left": obj.get("left"), + "right": obj.get("right"), + "top": obj.get("top") + }) + return _obj - :param left: The left of this BcROIDETECT. # noqa: E501 - :type left: int - """ - - self._left = left - - @property - def right(self): - """Gets the right of this BcROIDETECT. # noqa: E501 - - - :return: The right of this BcROIDETECT. # noqa: E501 - :rtype: int - """ - return self._right - - @right.setter - def right(self, right): - """Sets the right of this BcROIDETECT. - - - :param right: The right of this BcROIDETECT. # noqa: E501 - :type right: int - """ - - self._right = right - - @property - def top(self): - """Gets the top of this BcROIDETECT. # noqa: E501 - - - :return: The top of this BcROIDETECT. # noqa: E501 - :rtype: int - """ - return self._top - - @top.setter - def top(self, top): - """Sets the top of this BcROIDETECT. - - - :param top: The top of this BcROIDETECT. # noqa: E501 - :type top: int - """ - self._top = top - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, BcROIDETECT): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, BcROIDETECT): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/binary_data.py b/regula/documentreader/webclient/gen/models/binary_data.py new file mode 100644 index 0000000..938f643 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/binary_data.py @@ -0,0 +1,218 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.details_rfid import DetailsRFID +from regula.documentreader.webclient.gen.models.rfid_data_file_type import RfidDataFileType +from regula.documentreader.webclient.gen.models.rfid_dg1 import RfidDG1 +from regula.documentreader.webclient.gen.models.rfid_session_data import RfidSessionData +from typing import Optional, Set +from typing_extensions import Self + +class BinaryData(BaseModel): + """ + Structure is used for storing the results of one bar-code module reading. + """ # noqa: E501 + rfid_authentication_info: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_Authentication_Info") + rfid_mifare_data_validity: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_MIFARE_Data_Validity") + rfid_mifare_data: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_MIFARE_Data") + rfid_ef_com: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_EF_COM") + rfid_dg1: Optional[RfidDG1] = Field(default=None, alias="RFID_DG1") + rfid_dg2: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG2") + rfid_dg3: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG3") + rfid_dg4: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG4") + rfid_dg5: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG5") + rfid_dg6: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG6") + rfid_dg7: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG7") + rfid_dg8: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG8") + rfid_dg9: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG9") + rfid_dg10: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG10") + rfid_dg11: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG11") + rfid_dg12: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG12") + rfid_dg13: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG13") + rfid_dg14: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG14") + rfid_dg15: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG15") + rfid_dg16: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_DG16") + rfid_ef_sod: Optional[Dict[str, Any]] = Field(default=None, alias="RFID_EF_SOD") + e_id_dg1: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG1") + e_id_dg2: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG2") + e_id_dg3: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG3") + e_id_dg4: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG4") + e_id_dg5: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG5") + e_id_dg6: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG6") + e_id_dg7: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG7") + e_id_dg8: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG8") + e_id_dg9: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG9") + e_id_dg10: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG10") + e_id_dg11: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG11") + e_id_dg12: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG12") + e_id_dg13: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG13") + e_id_dg14: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG14") + e_id_dg15: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG15") + e_id_dg16: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG16") + e_id_dg17: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG17") + e_id_dg18: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG18") + e_id_dg19: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG19") + e_id_dg20: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG20") + e_id_dg21: Optional[Dict[str, Any]] = Field(default=None, alias="eID_DG21") + e_dl_com: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_COM") + e_dl_sod: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_SOD") + e_dl_dg1: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG1") + e_dl_dg2: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG2") + e_dl_dg3: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG3") + e_dl_dg4: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG4") + e_dl_dg5: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG5") + e_dl_dg6: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG6") + e_dl_dg7: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG7") + e_dl_dg8: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG8") + e_dl_dg9: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG9") + e_dl_dg10: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG10") + e_dl_dg11: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG11") + e_dl_dg12: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG12") + e_dl_dg13: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG13") + e_dl_dg14: Optional[Dict[str, Any]] = Field(default=None, alias="eDL_DG14") + visible_digital_seal: Optional[Dict[str, Any]] = Field(default=None, alias="Visible_Digital_Seal") + visible_digital_seal_nc: Optional[Dict[str, Any]] = Field(default=None, alias="Visible_Digital_Seal_NC") + digital_signature: Optional[Dict[str, Any]] = Field(default=None, alias="Digital_Signature") + rfid_session_data: Optional[RfidSessionData] = Field(default=None, alias="RFID_Session_Data") + rfid_session_data_status: Optional[DetailsRFID] = Field(default=None, alias="RFID_Session_Data_Status") + rfid_e_passp_directory: Optional[List[RfidDataFileType]] = Field(default=None, description="Indexes of groups that aren't read", alias="RFID_ePassp_Directory") + __properties: ClassVar[List[str]] = ["RFID_Authentication_Info", "RFID_MIFARE_Data_Validity", "RFID_MIFARE_Data", "RFID_EF_COM", "RFID_DG1", "RFID_DG2", "RFID_DG3", "RFID_DG4", "RFID_DG5", "RFID_DG6", "RFID_DG7", "RFID_DG8", "RFID_DG9", "RFID_DG10", "RFID_DG11", "RFID_DG12", "RFID_DG13", "RFID_DG14", "RFID_DG15", "RFID_DG16", "RFID_EF_SOD", "eID_DG1", "eID_DG2", "eID_DG3", "eID_DG4", "eID_DG5", "eID_DG6", "eID_DG7", "eID_DG8", "eID_DG9", "eID_DG10", "eID_DG11", "eID_DG12", "eID_DG13", "eID_DG14", "eID_DG15", "eID_DG16", "eID_DG17", "eID_DG18", "eID_DG19", "eID_DG20", "eID_DG21", "eDL_COM", "eDL_SOD", "eDL_DG1", "eDL_DG2", "eDL_DG3", "eDL_DG4", "eDL_DG5", "eDL_DG6", "eDL_DG7", "eDL_DG8", "eDL_DG9", "eDL_DG10", "eDL_DG11", "eDL_DG12", "eDL_DG13", "eDL_DG14", "Visible_Digital_Seal", "Visible_Digital_Seal_NC", "Digital_Signature", "RFID_Session_Data", "RFID_Session_Data_Status", "RFID_ePassp_Directory"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of BinaryData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of rfid_dg1 + if self.rfid_dg1: + _dict['RFID_DG1'] = self.rfid_dg1.to_dict() + # override the default output from pydantic by calling `to_dict()` of rfid_session_data + if self.rfid_session_data: + _dict['RFID_Session_Data'] = self.rfid_session_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of rfid_session_data_status + if self.rfid_session_data_status: + _dict['RFID_Session_Data_Status'] = self.rfid_session_data_status.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of BinaryData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RFID_Authentication_Info": obj.get("RFID_Authentication_Info"), + "RFID_MIFARE_Data_Validity": obj.get("RFID_MIFARE_Data_Validity"), + "RFID_MIFARE_Data": obj.get("RFID_MIFARE_Data"), + "RFID_EF_COM": obj.get("RFID_EF_COM"), + "RFID_DG1": RfidDG1.from_dict(obj["RFID_DG1"]) if obj.get("RFID_DG1") is not None else None, + "RFID_DG2": obj.get("RFID_DG2"), + "RFID_DG3": obj.get("RFID_DG3"), + "RFID_DG4": obj.get("RFID_DG4"), + "RFID_DG5": obj.get("RFID_DG5"), + "RFID_DG6": obj.get("RFID_DG6"), + "RFID_DG7": obj.get("RFID_DG7"), + "RFID_DG8": obj.get("RFID_DG8"), + "RFID_DG9": obj.get("RFID_DG9"), + "RFID_DG10": obj.get("RFID_DG10"), + "RFID_DG11": obj.get("RFID_DG11"), + "RFID_DG12": obj.get("RFID_DG12"), + "RFID_DG13": obj.get("RFID_DG13"), + "RFID_DG14": obj.get("RFID_DG14"), + "RFID_DG15": obj.get("RFID_DG15"), + "RFID_DG16": obj.get("RFID_DG16"), + "RFID_EF_SOD": obj.get("RFID_EF_SOD"), + "eID_DG1": obj.get("eID_DG1"), + "eID_DG2": obj.get("eID_DG2"), + "eID_DG3": obj.get("eID_DG3"), + "eID_DG4": obj.get("eID_DG4"), + "eID_DG5": obj.get("eID_DG5"), + "eID_DG6": obj.get("eID_DG6"), + "eID_DG7": obj.get("eID_DG7"), + "eID_DG8": obj.get("eID_DG8"), + "eID_DG9": obj.get("eID_DG9"), + "eID_DG10": obj.get("eID_DG10"), + "eID_DG11": obj.get("eID_DG11"), + "eID_DG12": obj.get("eID_DG12"), + "eID_DG13": obj.get("eID_DG13"), + "eID_DG14": obj.get("eID_DG14"), + "eID_DG15": obj.get("eID_DG15"), + "eID_DG16": obj.get("eID_DG16"), + "eID_DG17": obj.get("eID_DG17"), + "eID_DG18": obj.get("eID_DG18"), + "eID_DG19": obj.get("eID_DG19"), + "eID_DG20": obj.get("eID_DG20"), + "eID_DG21": obj.get("eID_DG21"), + "eDL_COM": obj.get("eDL_COM"), + "eDL_SOD": obj.get("eDL_SOD"), + "eDL_DG1": obj.get("eDL_DG1"), + "eDL_DG2": obj.get("eDL_DG2"), + "eDL_DG3": obj.get("eDL_DG3"), + "eDL_DG4": obj.get("eDL_DG4"), + "eDL_DG5": obj.get("eDL_DG5"), + "eDL_DG6": obj.get("eDL_DG6"), + "eDL_DG7": obj.get("eDL_DG7"), + "eDL_DG8": obj.get("eDL_DG8"), + "eDL_DG9": obj.get("eDL_DG9"), + "eDL_DG10": obj.get("eDL_DG10"), + "eDL_DG11": obj.get("eDL_DG11"), + "eDL_DG12": obj.get("eDL_DG12"), + "eDL_DG13": obj.get("eDL_DG13"), + "eDL_DG14": obj.get("eDL_DG14"), + "Visible_Digital_Seal": obj.get("Visible_Digital_Seal"), + "Visible_Digital_Seal_NC": obj.get("Visible_Digital_Seal_NC"), + "Digital_Signature": obj.get("Digital_Signature"), + "RFID_Session_Data": RfidSessionData.from_dict(obj["RFID_Session_Data"]) if obj.get("RFID_Session_Data") is not None else None, + "RFID_Session_Data_Status": DetailsRFID.from_dict(obj["RFID_Session_Data_Status"]) if obj.get("RFID_Session_Data_Status") is not None else None, + "RFID_ePassp_Directory": obj.get("RFID_ePassp_Directory") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/byte_array_item.py b/regula/documentreader/webclient/gen/models/byte_array_item.py new file mode 100644 index 0000000..b1348fa --- /dev/null +++ b/regula/documentreader/webclient/gen/models/byte_array_item.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class ByteArrayItem(BaseModel): + """ + ByteArrayItem + """ # noqa: E501 + byte_array: StrictStr = Field(description="Byte array in base64", alias="ByteArray") + __properties: ClassVar[List[str]] = ["ByteArray"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ByteArrayItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ByteArrayItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ByteArray": obj.get("ByteArray") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/byte_array_result.py b/regula/documentreader/webclient/gen/models/byte_array_result.py index 0d4c141..e58b897 100644 --- a/regula/documentreader/webclient/gen/models/byte_array_result.py +++ b/regula/documentreader/webclient/gen/models/byte_array_result.py @@ -4,252 +4,83 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ByteArrayResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ByteArrayResult(ResultItem): """ + ByteArrayResult + """ # noqa: E501 + byte_array: StrictStr = Field(description="Byte array in base64", alias="ByteArray") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "ByteArray"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'byte_array': 'str', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'byte_array': 'ByteArray', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, byte_array=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """ByteArrayResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._byte_array = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.byte_array = byte_array - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def byte_array(self): - """Gets the byte_array of this ByteArrayResult. # noqa: E501 - - Byte array in base64 # noqa: E501 - - :return: The byte_array of this ByteArrayResult. # noqa: E501 - :rtype: str - """ - return self._byte_array - - @byte_array.setter - def byte_array(self, byte_array): - """Sets the byte_array of this ByteArrayResult. - - Byte array in base64 # noqa: E501 - - :param byte_array: The byte_array of this ByteArrayResult. # noqa: E501 - :type byte_array: str - """ - if self.local_vars_configuration.client_side_validation and byte_array is None: # noqa: E501 - raise ValueError("Invalid value for `byte_array`, must not be `None`") # noqa: E501 - - self._byte_array = byte_array - - @property - def buf_length(self): - """Gets the buf_length of this ByteArrayResult. # noqa: E501 - - - :return: The buf_length of this ByteArrayResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this ByteArrayResult. - - - :param buf_length: The buf_length of this ByteArrayResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this ByteArrayResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this ByteArrayResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ByteArrayResult. - - - :param light: The light of this ByteArrayResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this ByteArrayResult. # noqa: E501 - - - :return: The list_idx of this ByteArrayResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this ByteArrayResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this ByteArrayResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this ByteArrayResult. # noqa: E501 - - - :return: The page_idx of this ByteArrayResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ByteArrayResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ByteArrayResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this ByteArrayResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this ByteArrayResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this ByteArrayResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this ByteArrayResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ByteArrayResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "ByteArray": obj.get("ByteArray") + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this ByteArrayResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ByteArrayResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ByteArrayResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/byte_array_result_all_of.py b/regula/documentreader/webclient/gen/models/byte_array_result_all_of.py deleted file mode 100644 index 5edc18e..0000000 --- a/regula/documentreader/webclient/gen/models/byte_array_result_all_of.py +++ /dev/null @@ -1,122 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ByteArrayResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'byte_array': 'str' - } - - attribute_map = { - 'byte_array': 'ByteArray' - } - - def __init__(self, byte_array=None, local_vars_configuration=None): # noqa: E501 - """ByteArrayResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._byte_array = None - self.discriminator = None - - self.byte_array = byte_array - - @property - def byte_array(self): - """Gets the byte_array of this ByteArrayResultAllOf. # noqa: E501 - - Byte array in base64 # noqa: E501 - - :return: The byte_array of this ByteArrayResultAllOf. # noqa: E501 - :rtype: str - """ - return self._byte_array - - @byte_array.setter - def byte_array(self, byte_array): - """Sets the byte_array of this ByteArrayResultAllOf. - - Byte array in base64 # noqa: E501 - - :param byte_array: The byte_array of this ByteArrayResultAllOf. # noqa: E501 - :type byte_array: str - """ - if self.local_vars_configuration.client_side_validation and byte_array is None: # noqa: E501 - raise ValueError("Invalid value for `byte_array`, must not be `None`") # noqa: E501 - - self._byte_array = byte_array - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ByteArrayResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ByteArrayResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/candidates_list_item.py b/regula/documentreader/webclient/gen/models/candidates_list_item.py new file mode 100644 index 0000000..e5a3f84 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/candidates_list_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.document_types_candidates_list import DocumentTypesCandidatesList +from typing import Optional, Set +from typing_extensions import Self + +class CandidatesListItem(BaseModel): + """ + CandidatesListItem + """ # noqa: E501 + candidates_list: Optional[DocumentTypesCandidatesList] = Field(default=None, alias="CandidatesList") + __properties: ClassVar[List[str]] = ["CandidatesList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of CandidatesListItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of candidates_list + if self.candidates_list: + _dict['CandidatesList'] = self.candidates_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of CandidatesListItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "CandidatesList": DocumentTypesCandidatesList.from_dict(obj["CandidatesList"]) if obj.get("CandidatesList") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/certificate_data.py b/regula/documentreader/webclient/gen/models/certificate_data.py new file mode 100644 index 0000000..749f16a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/certificate_data.py @@ -0,0 +1,81 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class CertificateData(BaseModel): + """ + CertificateData + """ # noqa: E501 + data: StrictStr = Field(alias="Data") + length: StrictStr = Field(alias="Length") + __properties: ClassVar[List[str]] = ["Data", "Length"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of CertificateData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of CertificateData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Data": obj.get("Data"), + "Length": obj.get("Length") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/check_diagnose.py b/regula/documentreader/webclient/gen/models/check_diagnose.py index eb3916b..2360176 100644 --- a/regula/documentreader/webclient/gen/models/check_diagnose.py +++ b/regula/documentreader/webclient/gen/models/check_diagnose.py @@ -4,340 +4,149 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration contains identifiers which determinate the single document element authenticity check outcome reason: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/check-diagnose/ -""" -class CheckDiagnose(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class CheckDiagnose(int, Enum): + """ + Enumeration contains identifiers which determinate the single document element authenticity check outcome reason: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/check-diagnose/ """ - - UNKNOWN = int("0") - - PASS = int("1") - - INVALID_INPUT_DATA = int("2") - - INTERNAL_ERROR = int("3") - - EXCEPTION_IN_MODULE = int("4") - - UNCERTAIN_VERIFICATION = int("5") - - NECESSARY_IMAGE_NOT_FOUND = int("7") - - PHOTO_SIDES_NOT_FOUND = int("8") - - INVALID_CHECKSUM = int("10") - - SYNTAX_ERROR = int("11") - - LOGIC_ERROR = int("12") - - SOURCES_COMPARISON_ERROR = int("13") - - FIELDS_COMPARISON_LOGIC_ERROR = int("14") - - INVALID_FIELD_FORMAT = int("15") - - TRUE_LUMINESCENCE_ERROR = int("20") - - FALSE_LUMINESCENCE_ERROR = int("21") - - FIXED_PATTERN_ERROR = int("22") - - LOW_CONTRAST_IN_IR_LIGHT = int("23") - - INCORRECT_BACKGROUND_LIGHT = int("24") - - BACKGROUND_COMPARISON_ERROR = int("25") - - INCORRECT_TEXT_COLOR = int("26") - - PHOTO_FALSE_LUMINESCENCE = int("27") - - TOO_MUCH_SHIFT = int("28") - - CONTACT_CHIP_TYPE_MISMATCH = int("29") - - FIBERS_NOT_FOUND = int("30") - - TOO_MANY_OBJECTS = int("31") - - SPECKS_IN_UV = int("33") - - TOO_LOW_RESOLUTION = int("34") - - INVISIBLE_ELEMENT_PRESENT = int("40") - - VISIBLE_ELEMENT_ABSENT = int("41") - - ELEMENT_SHOULD_BE_COLORED = int("42") - - ELEMENT_SHOULD_BE_GRAYSCALE = int("43") - - PHOTO_WHITE_IR_DONT_MATCH = int("44") - - UV_DULL_PAPER_MRZ = int("50") - - FALSE_LUMINESCENCE_IN_MRZ = int("51") - - UV_DULL_PAPER_PHOTO = int("52") - - UV_DULL_PAPER_BLANK = int("53") - - UV_DULL_PAPER_ERROR = int("54") - - FALSE_LUMINESCENCE_IN_BLANK = int("55") - - BAD_AREA_IN_AXIAL = int("60") - - FALSE_IPI_PARAMETERS = int("65") - - ENCRYPTED_IPI_NOT_FOUND = int("66") - - ENCRYPTED_IPI_DATA_DONT_MATCH = int("67") - - FIELD_POS_CORRECTOR_HIGHLIGHT_IR = int("80") - - FIELD_POS_CORRECTOR_GLARES_IN_PHOTO_AREA = int("81") - - FIELD_POS_CORRECTOR_PHOTO_REPLACED = int("82") - - FIELD_POS_CORRECTOR_LANDMARKS_CHECK_ERROR = int("83") - - FIELD_POS_CORRECTOR_FACE_PRESENCE_CHECK_ERROR = int("84") - - FIELD_POS_CORRECTOR_FACE_ABSENCE_CHECK_ERROR = int("85") - - FIELD_POS_CORRECTOR_INCORRECT_HEAD_POSITION = int("86") - - OVI_IR_INVISIBLE = int("90") - - OVI_INSUFFICIENT_AREA = int("91") - - OVI_COLOR_INVARIABLE = int("92") - - OVI_BAD_COLOR_FRONT = int("93") - - OVI_BAD_COLOR_SIDE = int("94") - - OVI_WIDE_COLOR_SPREAD = int("95") - - OVI_BAD_COLOR_PERCENT = int("96") - - HOLOGRAM_ELEMENT_ABSENT = int("100") - - HOLOGRAM_SIDE_TOP_IMAGES_ABSENT = int("101") - - HOLOGRAM_ELEMENT_PRESENT = int("102") - - HOLOGRAM_FRAMES_IS_ABSENT = int("103") - - HOLOGRAM_HOLO_FIELD_IS_ABSENT = int("104") - - PHOTO_PATTERN_INTERRUPTED = int("110") - - PHOTO_PATTERN_SHIFTED = int("111") - - PHOTO_PATTERN_DIFFERENT_COLORS = int("112") - - PHOTO_PATTERN_IR_VISIBLE = int("113") - - PHOTO_PATTERN_NOT_INTERSECT = int("114") - - PHOTO_SIZE_IS_WRONG = int("115") - - PHOTO_PATTERN_INVALID_COLOR = int("116") - - PHOTO_PATTERN_SHIFTED_VERT = int("117") - - PHOTO_PATTERN_PATTERN_NOT_FOUND = int("118") - - PHOTO_PATTERN_DIFFERENT_LINES_THICKNESS = int("119") - - PHOTO_IS_NOT_RECTANGLE = int("120") - - PHOTO_CORNERS_IS_WRONG = int("121") - - DOCUMENT_IS_CANCELLING = int("122") - - TEXT_COLOR_SHOULD_BE_BLUE = int("130") - - TEXT_COLOR_SHOULD_BE_GREEN = int("131") - - TEXT_COLOR_SHOULD_BE_RED = int("132") - - TEXT_SHOULD_BE_BLACK = int("133") - - BARCODE_WAS_READ_WITH_ERRORS = int("140") - - BARCODE_DATA_FORMAT_ERROR = int("141") - - BARCODE_SIZE_PARAMS_ERROR = int("142") - - NOT_ALL_BARCODES_READ = int("143") - - GLARES_IN_BARCODE_AREA = int("144") - - NO_CERTIFICATE_FOR_DIGITAL_SIGNATURE_CHECK = int("145") - - PORTRAIT_COMPARISON_PORTRAITS_DIFFER = int("150") - - PORTRAIT_COMPARISON_NO_SERVICE_REPLY = int("151") - - PORTRAIT_COMPARISON_SERVICE_ERROR = int("152") - - PORTRAIT_COMPARISON_NOT_ENOUGH_IMAGES = int("153") - - PORTRAIT_COMPARISON_NO_LIVE_PHOTO = int("154") - - PORTRAIT_COMPARISON_NO_SERVICE_LICENSE = int("155") - - PORTRAIT_COMPARISON_NO_PORTRAIT_DETECTED = int("156") - - MOBILE_IMAGES_UNSUITABLE_LIGHT_CONDITIONS = int("160") - - MOBILE_IMAGES_WHITE_UV_NO_DIFFERENCE = int("161") - - FINGERPRINTS_COMPARISON_MISMATCH = int("170") - - HOLO_PHOTO_FACE_NOT_DETECTED = int("180") - - HOLO_PHOTO_FACE_COMPARISON_FAILED = int("181") - - HOLO_PHOTO_GLARE_IN_CENTER_ABSENT = int("182") - - HOLO_PHOTO_HOLO_ELEMENT_SHAPE_ERROR = int("183") - - HOLO_PHOTO_ALGORITHMS_STEPS_ERROR = int("184") - - HOLO_PHOTO_HOLO_AREAS_NOT_LOADED = int("185") - - HOLO_PHOTO_FINISHED_BY_TIMEOUT = int("186") - - HOLO_PHOTO_DOCUMENT_OUTSIDE_FRAME = int("187") - - LIVENESS_DEPTH_CHECK_FAILED = int("190") - - MRZ_QUALITY_WRONG_SYMBOL_POSITION = int("200") - - MRZ_QUALITY_WRONG_BACKGROUND = int("201") - - MRZ_QUALITY_WRONG_MRZ_WIDTH = int("202") - - MRZ_QUALITY_WRONG_MRZ_HEIGHT = int("203") - - MRZ_QUALITY_WRONG_LINE_POSITION = int("204") - - MRZ_QUALITY_WRONG_FONT_TYPE = int("205") - - OCR_QUALITY_TEXT_POSITION = int("220") - - OCR_QUALITY_INVALID_FONT = int("221") - - OCR_QUALITY_INVALID_BACKGROUND = int("222") - - LASINK_INVALID_LINES_FREQUENCY = int("230") - - DOC_LIVENESS_DOCUMENT_NOT_LIVE = int("238") - - DOC_LIVENESS_BLACK_AND_WHITE_COPY_DETECTED = int("239") - - DOC_LIVENESS_ELECTRONIC_DEVICE_DETECTED = int("240") - - DOC_LIVENESS_INVALID_BARCODE_BACKGROUND = int("241") - - CHD_ICAO_IDB_BASE32_ERROR = int("243") - - CHD_ICAO_IDB_ZIPPED_ERROR = int("244") - - CHD_ICAO_IDB_MESSAGE_ZONE_EMPTY = int("245") - - CHD_ICAO_IDB_SIGNATURE_MUST_BE_PRESENT = int("246") - - CHD_ICAO_IDB_SIGNATURE_MUST_NOT_BE_PRESENT = int("247") - - CHD_ICAO_IDB_CERTIFICATE_MUST_NOT_BE_PRESENT = int("248") - - CHD_INCORRECT_OBJECT_COLOR = int("250") - - allowable_values = [UNKNOWN, PASS, INVALID_INPUT_DATA, INTERNAL_ERROR, EXCEPTION_IN_MODULE, UNCERTAIN_VERIFICATION, NECESSARY_IMAGE_NOT_FOUND, PHOTO_SIDES_NOT_FOUND, INVALID_CHECKSUM, SYNTAX_ERROR, LOGIC_ERROR, SOURCES_COMPARISON_ERROR, FIELDS_COMPARISON_LOGIC_ERROR, INVALID_FIELD_FORMAT, TRUE_LUMINESCENCE_ERROR, FALSE_LUMINESCENCE_ERROR, FIXED_PATTERN_ERROR, LOW_CONTRAST_IN_IR_LIGHT, INCORRECT_BACKGROUND_LIGHT, BACKGROUND_COMPARISON_ERROR, INCORRECT_TEXT_COLOR, PHOTO_FALSE_LUMINESCENCE, TOO_MUCH_SHIFT, CONTACT_CHIP_TYPE_MISMATCH, FIBERS_NOT_FOUND, TOO_MANY_OBJECTS, SPECKS_IN_UV, TOO_LOW_RESOLUTION, INVISIBLE_ELEMENT_PRESENT, VISIBLE_ELEMENT_ABSENT, ELEMENT_SHOULD_BE_COLORED, ELEMENT_SHOULD_BE_GRAYSCALE, PHOTO_WHITE_IR_DONT_MATCH, UV_DULL_PAPER_MRZ, FALSE_LUMINESCENCE_IN_MRZ, UV_DULL_PAPER_PHOTO, UV_DULL_PAPER_BLANK, UV_DULL_PAPER_ERROR, FALSE_LUMINESCENCE_IN_BLANK, BAD_AREA_IN_AXIAL, FALSE_IPI_PARAMETERS, ENCRYPTED_IPI_NOT_FOUND, ENCRYPTED_IPI_DATA_DONT_MATCH, FIELD_POS_CORRECTOR_HIGHLIGHT_IR, FIELD_POS_CORRECTOR_GLARES_IN_PHOTO_AREA, FIELD_POS_CORRECTOR_PHOTO_REPLACED, FIELD_POS_CORRECTOR_LANDMARKS_CHECK_ERROR, FIELD_POS_CORRECTOR_FACE_PRESENCE_CHECK_ERROR, FIELD_POS_CORRECTOR_FACE_ABSENCE_CHECK_ERROR, FIELD_POS_CORRECTOR_INCORRECT_HEAD_POSITION, OVI_IR_INVISIBLE, OVI_INSUFFICIENT_AREA, OVI_COLOR_INVARIABLE, OVI_BAD_COLOR_FRONT, OVI_BAD_COLOR_SIDE, OVI_WIDE_COLOR_SPREAD, OVI_BAD_COLOR_PERCENT, HOLOGRAM_ELEMENT_ABSENT, HOLOGRAM_SIDE_TOP_IMAGES_ABSENT, HOLOGRAM_ELEMENT_PRESENT, HOLOGRAM_FRAMES_IS_ABSENT, HOLOGRAM_HOLO_FIELD_IS_ABSENT, PHOTO_PATTERN_INTERRUPTED, PHOTO_PATTERN_SHIFTED, PHOTO_PATTERN_DIFFERENT_COLORS, PHOTO_PATTERN_IR_VISIBLE, PHOTO_PATTERN_NOT_INTERSECT, PHOTO_SIZE_IS_WRONG, PHOTO_PATTERN_INVALID_COLOR, PHOTO_PATTERN_SHIFTED_VERT, PHOTO_PATTERN_PATTERN_NOT_FOUND, PHOTO_PATTERN_DIFFERENT_LINES_THICKNESS, PHOTO_IS_NOT_RECTANGLE, PHOTO_CORNERS_IS_WRONG, DOCUMENT_IS_CANCELLING, TEXT_COLOR_SHOULD_BE_BLUE, TEXT_COLOR_SHOULD_BE_GREEN, TEXT_COLOR_SHOULD_BE_RED, TEXT_SHOULD_BE_BLACK, BARCODE_WAS_READ_WITH_ERRORS, BARCODE_DATA_FORMAT_ERROR, BARCODE_SIZE_PARAMS_ERROR, NOT_ALL_BARCODES_READ, GLARES_IN_BARCODE_AREA, NO_CERTIFICATE_FOR_DIGITAL_SIGNATURE_CHECK, PORTRAIT_COMPARISON_PORTRAITS_DIFFER, PORTRAIT_COMPARISON_NO_SERVICE_REPLY, PORTRAIT_COMPARISON_SERVICE_ERROR, PORTRAIT_COMPARISON_NOT_ENOUGH_IMAGES, PORTRAIT_COMPARISON_NO_LIVE_PHOTO, PORTRAIT_COMPARISON_NO_SERVICE_LICENSE, PORTRAIT_COMPARISON_NO_PORTRAIT_DETECTED, MOBILE_IMAGES_UNSUITABLE_LIGHT_CONDITIONS, MOBILE_IMAGES_WHITE_UV_NO_DIFFERENCE, FINGERPRINTS_COMPARISON_MISMATCH, HOLO_PHOTO_FACE_NOT_DETECTED, HOLO_PHOTO_FACE_COMPARISON_FAILED, HOLO_PHOTO_GLARE_IN_CENTER_ABSENT, HOLO_PHOTO_HOLO_ELEMENT_SHAPE_ERROR, HOLO_PHOTO_ALGORITHMS_STEPS_ERROR, HOLO_PHOTO_HOLO_AREAS_NOT_LOADED, HOLO_PHOTO_FINISHED_BY_TIMEOUT, HOLO_PHOTO_DOCUMENT_OUTSIDE_FRAME, LIVENESS_DEPTH_CHECK_FAILED, MRZ_QUALITY_WRONG_SYMBOL_POSITION, MRZ_QUALITY_WRONG_BACKGROUND, MRZ_QUALITY_WRONG_MRZ_WIDTH, MRZ_QUALITY_WRONG_MRZ_HEIGHT, MRZ_QUALITY_WRONG_LINE_POSITION, MRZ_QUALITY_WRONG_FONT_TYPE, OCR_QUALITY_TEXT_POSITION, OCR_QUALITY_INVALID_FONT, OCR_QUALITY_INVALID_BACKGROUND, LASINK_INVALID_LINES_FREQUENCY, DOC_LIVENESS_DOCUMENT_NOT_LIVE, DOC_LIVENESS_BLACK_AND_WHITE_COPY_DETECTED, DOC_LIVENESS_ELECTRONIC_DEVICE_DETECTED, DOC_LIVENESS_INVALID_BARCODE_BACKGROUND, CHD_ICAO_IDB_BASE32_ERROR, CHD_ICAO_IDB_ZIPPED_ERROR, CHD_ICAO_IDB_MESSAGE_ZONE_EMPTY, CHD_ICAO_IDB_SIGNATURE_MUST_BE_PRESENT, CHD_ICAO_IDB_SIGNATURE_MUST_NOT_BE_PRESENT, CHD_ICAO_IDB_CERTIFICATE_MUST_NOT_BE_PRESENT, CHD_INCORRECT_OBJECT_COLOR] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """CheckDiagnose - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, CheckDiagnose): - return False - - return self.to_dict() == other.to_dict() + UNKNOWN = 0 + PASS = 1 + INVALID_INPUT_DATA = 2 + INTERNAL_ERROR = 3 + EXCEPTION_IN_MODULE = 4 + UNCERTAIN_VERIFICATION = 5 + NECESSARY_IMAGE_NOT_FOUND = 7 + PHOTO_SIDES_NOT_FOUND = 8 + INVALID_CHECKSUM = 10 + SYNTAX_ERROR = 11 + LOGIC_ERROR = 12 + SOURCES_COMPARISON_ERROR = 13 + FIELDS_COMPARISON_LOGIC_ERROR = 14 + INVALID_FIELD_FORMAT = 15 + TRUE_LUMINESCENCE_ERROR = 20 + FALSE_LUMINESCENCE_ERROR = 21 + FIXED_PATTERN_ERROR = 22 + LOW_CONTRAST_IN_IR_LIGHT = 23 + INCORRECT_BACKGROUND_LIGHT = 24 + BACKGROUND_COMPARISON_ERROR = 25 + INCORRECT_TEXT_COLOR = 26 + PHOTO_FALSE_LUMINESCENCE = 27 + TOO_MUCH_SHIFT = 28 + CONTACT_CHIP_TYPE_MISMATCH = 29 + FIBERS_NOT_FOUND = 30 + TOO_MANY_OBJECTS = 31 + SPECKS_IN_UV = 33 + TOO_LOW_RESOLUTION = 34 + INVISIBLE_ELEMENT_PRESENT = 40 + VISIBLE_ELEMENT_ABSENT = 41 + ELEMENT_SHOULD_BE_COLORED = 42 + ELEMENT_SHOULD_BE_GRAYSCALE = 43 + PHOTO_WHITE_IR_DONT_MATCH = 44 + UV_DULL_PAPER_MRZ = 50 + FALSE_LUMINESCENCE_IN_MRZ = 51 + UV_DULL_PAPER_PHOTO = 52 + UV_DULL_PAPER_BLANK = 53 + UV_DULL_PAPER_ERROR = 54 + FALSE_LUMINESCENCE_IN_BLANK = 55 + BAD_AREA_IN_AXIAL = 60 + FALSE_IPI_PARAMETERS = 65 + ENCRYPTED_IPI_NOT_FOUND = 66 + ENCRYPTED_IPI_DATA_DONT_MATCH = 67 + FIELD_POS_CORRECTOR_HIGHLIGHT_IR = 80 + FIELD_POS_CORRECTOR_GLARES_IN_PHOTO_AREA = 81 + FIELD_POS_CORRECTOR_PHOTO_REPLACED = 82 + FIELD_POS_CORRECTOR_LANDMARKS_CHECK_ERROR = 83 + FIELD_POS_CORRECTOR_FACE_PRESENCE_CHECK_ERROR = 84 + FIELD_POS_CORRECTOR_FACE_ABSENCE_CHECK_ERROR = 85 + FIELD_POS_CORRECTOR_INCORRECT_HEAD_POSITION = 86 + OVI_IR_INVISIBLE = 90 + OVI_INSUFFICIENT_AREA = 91 + OVI_COLOR_INVARIABLE = 92 + OVI_BAD_COLOR_FRONT = 93 + OVI_BAD_COLOR_SIDE = 94 + OVI_WIDE_COLOR_SPREAD = 95 + OVI_BAD_COLOR_PERCENT = 96 + HOLOGRAM_ELEMENT_ABSENT = 100 + HOLOGRAM_SIDE_TOP_IMAGES_ABSENT = 101 + HOLOGRAM_ELEMENT_PRESENT = 102 + HOLOGRAM_FRAMES_IS_ABSENT = 103 + HOLOGRAM_HOLO_FIELD_IS_ABSENT = 104 + PHOTO_PATTERN_INTERRUPTED = 110 + PHOTO_PATTERN_SHIFTED = 111 + PHOTO_PATTERN_DIFFERENT_COLORS = 112 + PHOTO_PATTERN_IR_VISIBLE = 113 + PHOTO_PATTERN_NOT_INTERSECT = 114 + PHOTO_SIZE_IS_WRONG = 115 + PHOTO_PATTERN_INVALID_COLOR = 116 + PHOTO_PATTERN_SHIFTED_VERT = 117 + PHOTO_PATTERN_PATTERN_NOT_FOUND = 118 + PHOTO_PATTERN_DIFFERENT_LINES_THICKNESS = 119 + PHOTO_IS_NOT_RECTANGLE = 120 + PHOTO_CORNERS_IS_WRONG = 121 + DOCUMENT_IS_CANCELLING = 122 + TEXT_COLOR_SHOULD_BE_BLUE = 130 + TEXT_COLOR_SHOULD_BE_GREEN = 131 + TEXT_COLOR_SHOULD_BE_RED = 132 + TEXT_SHOULD_BE_BLACK = 133 + BARCODE_WAS_READ_WITH_ERRORS = 140 + BARCODE_DATA_FORMAT_ERROR = 141 + BARCODE_SIZE_PARAMS_ERROR = 142 + NOT_ALL_BARCODES_READ = 143 + GLARES_IN_BARCODE_AREA = 144 + NO_CERTIFICATE_FOR_DIGITAL_SIGNATURE_CHECK = 145 + PORTRAIT_COMPARISON_PORTRAITS_DIFFER = 150 + PORTRAIT_COMPARISON_NO_SERVICE_REPLY = 151 + PORTRAIT_COMPARISON_SERVICE_ERROR = 152 + PORTRAIT_COMPARISON_NOT_ENOUGH_IMAGES = 153 + PORTRAIT_COMPARISON_NO_LIVE_PHOTO = 154 + PORTRAIT_COMPARISON_NO_SERVICE_LICENSE = 155 + PORTRAIT_COMPARISON_NO_PORTRAIT_DETECTED = 156 + MOBILE_IMAGES_UNSUITABLE_LIGHT_CONDITIONS = 160 + MOBILE_IMAGES_WHITE_UV_NO_DIFFERENCE = 161 + FINGERPRINTS_COMPARISON_MISMATCH = 170 + HOLO_PHOTO_FACE_NOT_DETECTED = 180 + HOLO_PHOTO_FACE_COMPARISON_FAILED = 181 + HOLO_PHOTO_GLARE_IN_CENTER_ABSENT = 182 + HOLO_PHOTO_HOLO_ELEMENT_SHAPE_ERROR = 183 + HOLO_PHOTO_ALGORITHMS_STEPS_ERROR = 184 + HOLO_PHOTO_HOLO_AREAS_NOT_LOADED = 185 + HOLO_PHOTO_FINISHED_BY_TIMEOUT = 186 + HOLO_PHOTO_DOCUMENT_OUTSIDE_FRAME = 187 + LIVENESS_DEPTH_CHECK_FAILED = 190 + MRZ_QUALITY_WRONG_SYMBOL_POSITION = 200 + MRZ_QUALITY_WRONG_BACKGROUND = 201 + MRZ_QUALITY_WRONG_MRZ_WIDTH = 202 + MRZ_QUALITY_WRONG_MRZ_HEIGHT = 203 + MRZ_QUALITY_WRONG_LINE_POSITION = 204 + MRZ_QUALITY_WRONG_FONT_TYPE = 205 + OCR_QUALITY_TEXT_POSITION = 220 + OCR_QUALITY_INVALID_FONT = 221 + OCR_QUALITY_INVALID_BACKGROUND = 222 + LASINK_INVALID_LINES_FREQUENCY = 230 + DOC_LIVENESS_DOCUMENT_NOT_LIVE = 238 + DOC_LIVENESS_BLACK_AND_WHITE_COPY_DETECTED = 239 + DOC_LIVENESS_ELECTRONIC_DEVICE_DETECTED = 240 + DOC_LIVENESS_INVALID_BARCODE_BACKGROUND = 241 + CHD_ICAO_IDB_BASE32_ERROR = 243 + CHD_ICAO_IDB_ZIPPED_ERROR = 244 + CHD_ICAO_IDB_MESSAGE_ZONE_EMPTY = 245 + CHD_ICAO_IDB_SIGNATURE_MUST_BE_PRESENT = 246 + CHD_ICAO_IDB_SIGNATURE_MUST_NOT_BE_PRESENT = 247 + CHD_ICAO_IDB_CERTIFICATE_MUST_NOT_BE_PRESENT = 248 + CHD_INCORRECT_OBJECT_COLOR = 250 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of CheckDiagnose from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, CheckDiagnose): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/check_result.py b/regula/documentreader/webclient/gen/models/check_result.py old mode 100755 new mode 100644 index ae08e5f..d99ade4 --- a/regula/documentreader/webclient/gen/models/check_result.py +++ b/regula/documentreader/webclient/gen/models/check_result.py @@ -4,96 +4,27 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -0 - result is negative; 1 - result is positive; 2 - сheck was not performed -""" -class CheckResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class CheckResult(int, Enum): + """ + 0 - result is negative; 1 - result is positive; 2 - сheck was not performed """ - - ERROR = int("0") - - OK = int("1") - - WAS_NOT_DONE = int("2") - - allowable_values = [ERROR, OK, WAS_NOT_DONE] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """CheckResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, CheckResult): - return False + ERROR = 0 + OK = 1 + WAS_NOT_DONE = 2 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of CheckResult from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, CheckResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/chosen_document_type.py b/regula/documentreader/webclient/gen/models/chosen_document_type.py index 846f517..445d2a4 100644 --- a/regula/documentreader/webclient/gen/models/chosen_document_type.py +++ b/regula/documentreader/webclient/gen/models/chosen_document_type.py @@ -4,344 +4,104 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains information about one document type candidate -""" -class ChosenDocumentType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.fdsid_list import FDSIDList +from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation +from typing import Optional, Set +from typing_extensions import Self +class ChosenDocumentType(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'document_name': 'str', - 'id': 'int', - 'p': 'float', - 'rfid_presence': 'RfidLocation', - 'fdsid_list': 'FDSIDList', - 'necessary_lights': 'int', - 'check_authenticity': 'int', - 'uv_exp': 'int', - 'authenticity_necessary_lights': 'int' - } - - attribute_map = { - 'document_name': 'DocumentName', - 'id': 'ID', - 'p': 'P', - 'rfid_presence': 'RFID_Presence', - 'fdsid_list': 'FDSIDList', - 'necessary_lights': 'NecessaryLights', - 'check_authenticity': 'CheckAuthenticity', - 'uv_exp': 'UVExp', - 'authenticity_necessary_lights': 'AuthenticityNecessaryLights' - } - - def __init__(self, document_name=None, id=None, p=None, rfid_presence=None, fdsid_list=None, necessary_lights=None, check_authenticity=None, uv_exp=None, authenticity_necessary_lights=None, local_vars_configuration=None): # noqa: E501 - """ChosenDocumentType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._document_name = None - self._id = None - self._p = None - self._rfid_presence = None - self._fdsid_list = None - self._necessary_lights = None - self._check_authenticity = None - self._uv_exp = None - self._authenticity_necessary_lights = None - self.discriminator = None - - if document_name is not None: - self.document_name = document_name - if id is not None: - self.id = id - if p is not None: - self.p = p - if rfid_presence is not None: - self.rfid_presence = rfid_presence - if fdsid_list is not None: - self.fdsid_list = fdsid_list - if necessary_lights is not None: - self.necessary_lights = necessary_lights - if check_authenticity is not None: - self.check_authenticity = check_authenticity - if uv_exp is not None: - self.uv_exp = uv_exp - if authenticity_necessary_lights is not None: - self.authenticity_necessary_lights = authenticity_necessary_lights - - @property - def document_name(self): - """Gets the document_name of this ChosenDocumentType. # noqa: E501 - - Document name # noqa: E501 - - :return: The document_name of this ChosenDocumentType. # noqa: E501 - :rtype: str - """ - return self._document_name - - @document_name.setter - def document_name(self, document_name): - """Sets the document_name of this ChosenDocumentType. - - Document name # noqa: E501 - - :param document_name: The document_name of this ChosenDocumentType. # noqa: E501 - :type document_name: str - """ - - self._document_name = document_name - - @property - def id(self): - """Gets the id of this ChosenDocumentType. # noqa: E501 - - Unique document type template identifier (Regula's internal numeric code) # noqa: E501 - - :return: The id of this ChosenDocumentType. # noqa: E501 - :rtype: int - """ - return self._id - - @id.setter - def id(self, id): - """Sets the id of this ChosenDocumentType. - - Unique document type template identifier (Regula's internal numeric code) # noqa: E501 - - :param id: The id of this ChosenDocumentType. # noqa: E501 - :type id: int - """ - - self._id = id - - @property - def p(self): - """Gets the p of this ChosenDocumentType. # noqa: E501 - - A measure of the likelihood of correct recognition in the analysis of this type of document # noqa: E501 - - :return: The p of this ChosenDocumentType. # noqa: E501 - :rtype: float - """ - return self._p - - @p.setter - def p(self, p): - """Sets the p of this ChosenDocumentType. - - A measure of the likelihood of correct recognition in the analysis of this type of document # noqa: E501 - - :param p: The p of this ChosenDocumentType. # noqa: E501 - :type p: float - """ - if (self.local_vars_configuration.client_side_validation and - p is not None and p > 1): # noqa: E501 - raise ValueError("Invalid value for `p`, must be a value less than or equal to `1`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - p is not None and p < 0): # noqa: E501 - raise ValueError("Invalid value for `p`, must be a value greater than or equal to `0`") # noqa: E501 - - self._p = p - - @property - def rfid_presence(self): - """Gets the rfid_presence of this ChosenDocumentType. # noqa: E501 - - - :return: The rfid_presence of this ChosenDocumentType. # noqa: E501 - :rtype: RfidLocation - """ - return self._rfid_presence - - @rfid_presence.setter - def rfid_presence(self, rfid_presence): - """Sets the rfid_presence of this ChosenDocumentType. - - - :param rfid_presence: The rfid_presence of this ChosenDocumentType. # noqa: E501 - :type rfid_presence: RfidLocation - """ - - self._rfid_presence = rfid_presence - - @property - def fdsid_list(self): - """Gets the fdsid_list of this ChosenDocumentType. # noqa: E501 - - - :return: The fdsid_list of this ChosenDocumentType. # noqa: E501 - :rtype: FDSIDList - """ - return self._fdsid_list - - @fdsid_list.setter - def fdsid_list(self, fdsid_list): - """Sets the fdsid_list of this ChosenDocumentType. - - - :param fdsid_list: The fdsid_list of this ChosenDocumentType. # noqa: E501 - :type fdsid_list: FDSIDList - """ - - self._fdsid_list = fdsid_list - - @property - def necessary_lights(self): - """Gets the necessary_lights of this ChosenDocumentType. # noqa: E501 - - Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document # noqa: E501 - - :return: The necessary_lights of this ChosenDocumentType. # noqa: E501 - :rtype: int - """ - return self._necessary_lights - - @necessary_lights.setter - def necessary_lights(self, necessary_lights): - """Sets the necessary_lights of this ChosenDocumentType. - - Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document # noqa: E501 - - :param necessary_lights: The necessary_lights of this ChosenDocumentType. # noqa: E501 - :type necessary_lights: int - """ - - self._necessary_lights = necessary_lights - - @property - def check_authenticity(self): - """Gets the check_authenticity of this ChosenDocumentType. # noqa: E501 - - Set of authentication options provided for this type of document (combination of Authenticity enum) # noqa: E501 - - :return: The check_authenticity of this ChosenDocumentType. # noqa: E501 - :rtype: int - """ - return self._check_authenticity - - @check_authenticity.setter - def check_authenticity(self, check_authenticity): - """Sets the check_authenticity of this ChosenDocumentType. - - Set of authentication options provided for this type of document (combination of Authenticity enum) # noqa: E501 - - :param check_authenticity: The check_authenticity of this ChosenDocumentType. # noqa: E501 - :type check_authenticity: int - """ - - self._check_authenticity = check_authenticity - - @property - def uv_exp(self): - """Gets the uv_exp of this ChosenDocumentType. # noqa: E501 - - The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme # noqa: E501 - - :return: The uv_exp of this ChosenDocumentType. # noqa: E501 - :rtype: int - """ - return self._uv_exp - - @uv_exp.setter - def uv_exp(self, uv_exp): - """Sets the uv_exp of this ChosenDocumentType. - - The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme # noqa: E501 - - :param uv_exp: The uv_exp of this ChosenDocumentType. # noqa: E501 - :type uv_exp: int - """ - - self._uv_exp = uv_exp - - @property - def authenticity_necessary_lights(self): - """Gets the authenticity_necessary_lights of this ChosenDocumentType. # noqa: E501 - - Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity # noqa: E501 - - :return: The authenticity_necessary_lights of this ChosenDocumentType. # noqa: E501 - :rtype: int - """ - return self._authenticity_necessary_lights - - @authenticity_necessary_lights.setter - def authenticity_necessary_lights(self, authenticity_necessary_lights): - """Sets the authenticity_necessary_lights of this ChosenDocumentType. - - Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity # noqa: E501 - - :param authenticity_necessary_lights: The authenticity_necessary_lights of this ChosenDocumentType. # noqa: E501 - :type authenticity_necessary_lights: int - """ - - self._authenticity_necessary_lights = authenticity_necessary_lights - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ChosenDocumentType): - return False - - return self.to_dict() == other.to_dict() + Contains information about one document type candidate + """ # noqa: E501 + document_name: StrictStr = Field(description="Document name", alias="DocumentName") + id: StrictInt = Field(description="Unique document type template identifier (Regula's internal numeric code)", alias="ID") + p: Union[Annotated[float, Field(le=1, strict=True, ge=0)], Annotated[int, Field(le=1, strict=True, ge=0)]] = Field(description="A measure of the likelihood of correct recognition in the analysis of this type of document", alias="P") + rotated180: StrictInt = Field(description="true if the document of the given type is rotated by 180 degrees", alias="Rotated180") + rfid_presence: RfidLocation = Field(alias="RFID_Presence") + fdsid_list: FDSIDList = Field(alias="FDSIDList") + necessary_lights: StrictInt = Field(description="Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document", alias="NecessaryLights") + check_authenticity: StrictInt = Field(description="Set of authentication options provided for this type of document (combination of Authenticity enum)", alias="CheckAuthenticity") + uv_exp: StrictInt = Field(description="The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme", alias="UVExp") + authenticity_necessary_lights: StrictInt = Field(description="Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity", alias="AuthenticityNecessaryLights") + ovi_exp: Union[StrictFloat, StrictInt] = Field(description="Camera exposure value necessary when obtaining document images of the given type for AXIAL lighting scheme", alias="OVIExp") + rotation_angle: Optional[StrictInt] = Field(default=None, alias="RotationAngle") + __properties: ClassVar[List[str]] = ["DocumentName", "ID", "P", "Rotated180", "RFID_Presence", "FDSIDList", "NecessaryLights", "CheckAuthenticity", "UVExp", "AuthenticityNecessaryLights", "OVIExp", "RotationAngle"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ChosenDocumentType from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of fdsid_list + if self.fdsid_list: + _dict['FDSIDList'] = self.fdsid_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ChosenDocumentType from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocumentName": obj.get("DocumentName"), + "ID": obj.get("ID"), + "P": obj.get("P"), + "Rotated180": obj.get("Rotated180"), + "RFID_Presence": obj.get("RFID_Presence"), + "FDSIDList": FDSIDList.from_dict(obj["FDSIDList"]) if obj.get("FDSIDList") is not None else None, + "NecessaryLights": obj.get("NecessaryLights"), + "CheckAuthenticity": obj.get("CheckAuthenticity"), + "UVExp": obj.get("UVExp"), + "AuthenticityNecessaryLights": obj.get("AuthenticityNecessaryLights"), + "OVIExp": obj.get("OVIExp"), + "RotationAngle": obj.get("RotationAngle") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ChosenDocumentType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/chosen_document_type_result.py b/regula/documentreader/webclient/gen/models/chosen_document_type_result.py old mode 100755 new mode 100644 index 2804967..5ac2148 --- a/regula/documentreader/webclient/gen/models/chosen_document_type_result.py +++ b/regula/documentreader/webclient/gen/models/chosen_document_type_result.py @@ -4,275 +4,91 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains information about the type of document that was determined based on the analysis of the provided image -""" -class ChosenDocumentTypeResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ChosenDocumentTypeResult(ResultItem): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'one_candidate': 'OneCandidate', - 'xml_buffer': 'str', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'one_candidate': 'OneCandidate', - 'xml_buffer': 'XML_buffer', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, one_candidate=None, xml_buffer=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """ChosenDocumentTypeResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._one_candidate = None - self._xml_buffer = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - if one_candidate is not None: - self.one_candidate = one_candidate - if xml_buffer is not None: - self.xml_buffer = xml_buffer - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def one_candidate(self): - """Gets the one_candidate of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The one_candidate of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: OneCandidate - """ - return self._one_candidate - - @one_candidate.setter - def one_candidate(self, one_candidate): - """Sets the one_candidate of this ChosenDocumentTypeResult. - - - :param one_candidate: The one_candidate of this ChosenDocumentTypeResult. # noqa: E501 - :type one_candidate: OneCandidate + Contains information about the type of document that was determined based on the analysis of the provided image + """ # noqa: E501 + one_candidate: OneCandidate = Field(alias="OneCandidate") + xml_buffer: Optional[StrictStr] = Field(default=None, alias="XML_buffer") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "OneCandidate", "XML_buffer"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ChosenDocumentTypeResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * OpenAPI `readOnly` fields are excluded. """ + excluded_fields: Set[str] = set([ + "xml_buffer", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of one_candidate + if self.one_candidate: + _dict['OneCandidate'] = self.one_candidate.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ChosenDocumentTypeResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "OneCandidate": OneCandidate.from_dict(obj["OneCandidate"]) if obj.get("OneCandidate") is not None else None, + "XML_buffer": obj.get("XML_buffer") + }) + return _obj - self._one_candidate = one_candidate - - @property - def xml_buffer(self): - """Gets the xml_buffer of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The xml_buffer of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: str - """ - return self._xml_buffer - - @xml_buffer.setter - def xml_buffer(self, xml_buffer): - """Sets the xml_buffer of this ChosenDocumentTypeResult. - - - :param xml_buffer: The xml_buffer of this ChosenDocumentTypeResult. # noqa: E501 - :type xml_buffer: str - """ - - self._xml_buffer = xml_buffer - - @property - def buf_length(self): - """Gets the buf_length of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The buf_length of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this ChosenDocumentTypeResult. - - - :param buf_length: The buf_length of this ChosenDocumentTypeResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The light of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ChosenDocumentTypeResult. - - - :param light: The light of this ChosenDocumentTypeResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The list_idx of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this ChosenDocumentTypeResult. - - - :param list_idx: The list_idx of this ChosenDocumentTypeResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this ChosenDocumentTypeResult. # noqa: E501 - - - :return: The page_idx of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ChosenDocumentTypeResult. - - - :param page_idx: The page_idx of this ChosenDocumentTypeResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this ChosenDocumentTypeResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this ChosenDocumentTypeResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this ChosenDocumentTypeResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this ChosenDocumentTypeResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ChosenDocumentTypeResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ChosenDocumentTypeResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/chosen_document_type_result_all_of.py b/regula/documentreader/webclient/gen/models/chosen_document_type_result_all_of.py deleted file mode 100755 index 9bd1902..0000000 --- a/regula/documentreader/webclient/gen/models/chosen_document_type_result_all_of.py +++ /dev/null @@ -1,145 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ChosenDocumentTypeResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'one_candidate': 'OneCandidate', - 'xml_buffer': 'str' - } - - attribute_map = { - 'one_candidate': 'OneCandidate', - 'xml_buffer': 'XML_buffer' - } - - def __init__(self, one_candidate=None, xml_buffer=None, local_vars_configuration=None): # noqa: E501 - """ChosenDocumentTypeResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._one_candidate = None - self._xml_buffer = None - self.discriminator = None - - if one_candidate is not None: - self.one_candidate = one_candidate - if xml_buffer is not None: - self.xml_buffer = xml_buffer - - @property - def one_candidate(self): - """Gets the one_candidate of this ChosenDocumentTypeResultAllOf. # noqa: E501 - - - :return: The one_candidate of this ChosenDocumentTypeResultAllOf. # noqa: E501 - :rtype: OneCandidate - """ - return self._one_candidate - - @one_candidate.setter - def one_candidate(self, one_candidate): - """Sets the one_candidate of this ChosenDocumentTypeResultAllOf. - - - :param one_candidate: The one_candidate of this ChosenDocumentTypeResultAllOf. # noqa: E501 - :type one_candidate: OneCandidate - """ - - self._one_candidate = one_candidate - - @property - def xml_buffer(self): - """Gets the xml_buffer of this ChosenDocumentTypeResultAllOf. # noqa: E501 - - - :return: The xml_buffer of this ChosenDocumentTypeResultAllOf. # noqa: E501 - :rtype: str - """ - return self._xml_buffer - - @xml_buffer.setter - def xml_buffer(self, xml_buffer): - """Sets the xml_buffer of this ChosenDocumentTypeResultAllOf. - - - :param xml_buffer: The xml_buffer of this ChosenDocumentTypeResultAllOf. # noqa: E501 - :type xml_buffer: str - """ - - self._xml_buffer = xml_buffer - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ChosenDocumentTypeResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ChosenDocumentTypeResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/container_list.py b/regula/documentreader/webclient/gen/models/container_list.py old mode 100755 new mode 100644 index aa56dd2..022f81a --- a/regula/documentreader/webclient/gen/models/container_list.py +++ b/regula/documentreader/webclient/gen/models/container_list.py @@ -4,145 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -List with various objects, containing processing results -""" -class ContainerList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ContainerList(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'count': 'int', - 'list': 'list[ResultItem]' - } - - attribute_map = { - 'count': 'Count', - 'list': 'List' - } - - def __init__(self, count=None, list=None, local_vars_configuration=None): # noqa: E501 - """ContainerList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._count = None - self._list = None - self.discriminator = None - - if count is not None: - self.count = count - self.list = list - - @property - def count(self): - """Gets the count of this ContainerList. # noqa: E501 - - Length of list (Count for items) # noqa: E501 - - :return: The count of this ContainerList. # noqa: E501 - :rtype: int + List with various objects, containing processing results + """ # noqa: E501 + count: Optional[StrictInt] = Field(default=None, description="Length of list (Count for items)", alias="Count") + list: List[ResultItem] = Field(alias="List") + __properties: ClassVar[List[str]] = ["Count", "List"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ContainerList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._count + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ContainerList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "List": [ResultItem.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None + }) + return _obj - @count.setter - def count(self, count): - """Sets the count of this ContainerList. - Length of list (Count for items) # noqa: E501 - - :param count: The count of this ContainerList. # noqa: E501 - :type count: int - """ - - self._count = count - - @property - def list(self): - """Gets the list of this ContainerList. # noqa: E501 - - - :return: The list of this ContainerList. # noqa: E501 - :rtype: list[ResultItem] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this ContainerList. - - - :param list: The list of this ContainerList. # noqa: E501 - :type list: list[ResultItem] - """ - if self.local_vars_configuration.client_side_validation and list is None: # noqa: E501 - raise ValueError("Invalid value for `list`, must not be `None`") # noqa: E501 - - self._list = list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ContainerList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ContainerList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/container_list_list_inner.py b/regula/documentreader/webclient/gen/models/container_list_list_inner.py new file mode 100644 index 0000000..878c3d8 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/container_list_list_inner.py @@ -0,0 +1,426 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +import pprint +from pydantic import BaseModel, ConfigDict, Field, StrictStr, ValidationError, field_validator +from typing import Any, List, Optional +from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult +from regula.documentreader.webclient.gen.models.byte_array_result import ByteArrayResult +from regula.documentreader.webclient.gen.models.chosen_document_type_result import ChosenDocumentTypeResult +from regula.documentreader.webclient.gen.models.doc_bar_code_info import DocBarCodeInfo +from regula.documentreader.webclient.gen.models.document_binary_info_result import DocumentBinaryInfoResult +from regula.documentreader.webclient.gen.models.document_image_result import DocumentImageResult +from regula.documentreader.webclient.gen.models.document_position_result import DocumentPositionResult +from regula.documentreader.webclient.gen.models.document_types_candidates_result import DocumentTypesCandidatesResult +from regula.documentreader.webclient.gen.models.encrypted_rcl_result import EncryptedRCLResult +from regula.documentreader.webclient.gen.models.face_detection_result import FaceDetectionResult +from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult +from regula.documentreader.webclient.gen.models.image_quality_result import ImageQualityResult +from regula.documentreader.webclient.gen.models.images_result import ImagesResult +from regula.documentreader.webclient.gen.models.lexical_analysis_result import LexicalAnalysisResult +from regula.documentreader.webclient.gen.models.license_result import LicenseResult +from regula.documentreader.webclient.gen.models.mrz_detector_result import MRZDetectorResult +from regula.documentreader.webclient.gen.models.mrz_position_result import MRZPositionResult +from regula.documentreader.webclient.gen.models.mrz_test_quality_result import MRZTestQualityResult +from regula.documentreader.webclient.gen.models.rfid_graphics_info_result import RFIDGraphicsInfoResult +from regula.documentreader.webclient.gen.models.rfid_text_data_result import RFIDTextDataResult +from regula.documentreader.webclient.gen.models.status_result import StatusResult +from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult +from regula.documentreader.webclient.gen.models.text_result import TextResult +from pydantic import StrictStr, Field +from typing import Union, List, Set, Optional, Dict +from typing_extensions import Literal, Self + +CONTAINERLISTLISTINNER_ONE_OF_SCHEMAS = ["AuthenticityResult", "ByteArrayResult", "ChosenDocumentTypeResult", "DocBarCodeInfo", "DocumentBinaryInfoResult", "DocumentImageResult", "DocumentPositionResult", "DocumentTypesCandidatesResult", "EncryptedRCLResult", "FaceDetectionResult", "GraphicsResult", "ImageQualityResult", "ImagesResult", "LexicalAnalysisResult", "LicenseResult", "MRZDetectorResult", "MRZPositionResult", "MRZTestQualityResult", "RFIDGraphicsInfoResult", "RFIDTextDataResult", "StatusResult", "TextDataResult", "TextResult"] + +class ContainerListListInner(BaseModel): + """ + ContainerListListInner + """ + # data type: StatusResult + oneof_schema_1_validator: Optional[StatusResult] = None + # data type: TextResult + oneof_schema_2_validator: Optional[TextResult] = None + # data type: DocumentImageResult + oneof_schema_3_validator: Optional[DocumentImageResult] = None + # data type: ImagesResult + oneof_schema_4_validator: Optional[ImagesResult] = None + # data type: ChosenDocumentTypeResult + oneof_schema_5_validator: Optional[ChosenDocumentTypeResult] = None + # data type: DocumentTypesCandidatesResult + oneof_schema_6_validator: Optional[DocumentTypesCandidatesResult] = None + # data type: TextDataResult + oneof_schema_7_validator: Optional[TextDataResult] = None + # data type: GraphicsResult + oneof_schema_8_validator: Optional[GraphicsResult] = None + # data type: LexicalAnalysisResult + oneof_schema_9_validator: Optional[LexicalAnalysisResult] = None + # data type: AuthenticityResult + oneof_schema_10_validator: Optional[AuthenticityResult] = None + # data type: ImageQualityResult + oneof_schema_11_validator: Optional[ImageQualityResult] = None + # data type: DocumentPositionResult + oneof_schema_12_validator: Optional[DocumentPositionResult] = None + # data type: DocBarCodeInfo + oneof_schema_13_validator: Optional[DocBarCodeInfo] = None + # data type: LicenseResult + oneof_schema_14_validator: Optional[LicenseResult] = None + # data type: EncryptedRCLResult + oneof_schema_15_validator: Optional[EncryptedRCLResult] = None + # data type: DocumentBinaryInfoResult + oneof_schema_16_validator: Optional[DocumentBinaryInfoResult] = None + # data type: ByteArrayResult + oneof_schema_17_validator: Optional[ByteArrayResult] = None + # data type: FaceDetectionResult + oneof_schema_18_validator: Optional[FaceDetectionResult] = None + # data type: MRZDetectorResult + oneof_schema_19_validator: Optional[MRZDetectorResult] = None + # data type: MRZPositionResult + oneof_schema_20_validator: Optional[MRZPositionResult] = None + # data type: MRZTestQualityResult + oneof_schema_21_validator: Optional[MRZTestQualityResult] = None + # data type: RFIDGraphicsInfoResult + oneof_schema_22_validator: Optional[RFIDGraphicsInfoResult] = None + # data type: RFIDTextDataResult + oneof_schema_23_validator: Optional[RFIDTextDataResult] = None + actual_instance: Optional[Union[AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult]] = None + one_of_schemas: Set[str] = { "AuthenticityResult", "ByteArrayResult", "ChosenDocumentTypeResult", "DocBarCodeInfo", "DocumentBinaryInfoResult", "DocumentImageResult", "DocumentPositionResult", "DocumentTypesCandidatesResult", "EncryptedRCLResult", "FaceDetectionResult", "GraphicsResult", "ImageQualityResult", "ImagesResult", "LexicalAnalysisResult", "LicenseResult", "MRZDetectorResult", "MRZPositionResult", "MRZTestQualityResult", "RFIDGraphicsInfoResult", "RFIDTextDataResult", "StatusResult", "TextDataResult", "TextResult" } + + model_config = ConfigDict( + validate_assignment=True, + protected_namespaces=(), + ) + + + discriminator_value_class_map: Dict[str, str] = { + } + + def __init__(self, *args, **kwargs) -> None: + if args: + if len(args) > 1: + raise ValueError("If a position argument is used, only 1 is allowed to set `actual_instance`") + if kwargs: + raise ValueError("If a position argument is used, keyword arguments cannot be used.") + super().__init__(actual_instance=args[0]) + else: + super().__init__(**kwargs) + + @field_validator('actual_instance') + def actual_instance_must_validate_oneof(cls, v): + instance = ContainerListListInner.model_construct() + error_messages = [] + match = 0 + # validate data type: StatusResult + if not isinstance(v, StatusResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `StatusResult`") + else: + match += 1 + # validate data type: TextResult + if not isinstance(v, TextResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `TextResult`") + else: + match += 1 + # validate data type: DocumentImageResult + if not isinstance(v, DocumentImageResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `DocumentImageResult`") + else: + match += 1 + # validate data type: ImagesResult + if not isinstance(v, ImagesResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `ImagesResult`") + else: + match += 1 + # validate data type: ChosenDocumentTypeResult + if not isinstance(v, ChosenDocumentTypeResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `ChosenDocumentTypeResult`") + else: + match += 1 + # validate data type: DocumentTypesCandidatesResult + if not isinstance(v, DocumentTypesCandidatesResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `DocumentTypesCandidatesResult`") + else: + match += 1 + # validate data type: TextDataResult + if not isinstance(v, TextDataResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `TextDataResult`") + else: + match += 1 + # validate data type: GraphicsResult + if not isinstance(v, GraphicsResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `GraphicsResult`") + else: + match += 1 + # validate data type: LexicalAnalysisResult + if not isinstance(v, LexicalAnalysisResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `LexicalAnalysisResult`") + else: + match += 1 + # validate data type: AuthenticityResult + if not isinstance(v, AuthenticityResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `AuthenticityResult`") + else: + match += 1 + # validate data type: ImageQualityResult + if not isinstance(v, ImageQualityResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `ImageQualityResult`") + else: + match += 1 + # validate data type: DocumentPositionResult + if not isinstance(v, DocumentPositionResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `DocumentPositionResult`") + else: + match += 1 + # validate data type: DocBarCodeInfo + if not isinstance(v, DocBarCodeInfo): + error_messages.append(f"Error! Input type `{type(v)}` is not `DocBarCodeInfo`") + else: + match += 1 + # validate data type: LicenseResult + if not isinstance(v, LicenseResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `LicenseResult`") + else: + match += 1 + # validate data type: EncryptedRCLResult + if not isinstance(v, EncryptedRCLResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `EncryptedRCLResult`") + else: + match += 1 + # validate data type: DocumentBinaryInfoResult + if not isinstance(v, DocumentBinaryInfoResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `DocumentBinaryInfoResult`") + else: + match += 1 + # validate data type: ByteArrayResult + if not isinstance(v, ByteArrayResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `ByteArrayResult`") + else: + match += 1 + # validate data type: FaceDetectionResult + if not isinstance(v, FaceDetectionResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `FaceDetectionResult`") + else: + match += 1 + # validate data type: MRZDetectorResult + if not isinstance(v, MRZDetectorResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `MRZDetectorResult`") + else: + match += 1 + # validate data type: MRZPositionResult + if not isinstance(v, MRZPositionResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `MRZPositionResult`") + else: + match += 1 + # validate data type: MRZTestQualityResult + if not isinstance(v, MRZTestQualityResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `MRZTestQualityResult`") + else: + match += 1 + # validate data type: RFIDGraphicsInfoResult + if not isinstance(v, RFIDGraphicsInfoResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `RFIDGraphicsInfoResult`") + else: + match += 1 + # validate data type: RFIDTextDataResult + if not isinstance(v, RFIDTextDataResult): + error_messages.append(f"Error! Input type `{type(v)}` is not `RFIDTextDataResult`") + else: + match += 1 + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when setting `actual_instance` in ContainerListListInner with oneOf schemas: AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when setting `actual_instance` in ContainerListListInner with oneOf schemas: AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult. Details: " + ", ".join(error_messages)) + else: + return v + + @classmethod + def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self: + return cls.from_json(json.dumps(obj)) + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Returns the object represented by the json string""" + instance = cls.model_construct() + error_messages = [] + match = 0 + + # deserialize data into StatusResult + try: + instance.actual_instance = StatusResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into TextResult + try: + instance.actual_instance = TextResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into DocumentImageResult + try: + instance.actual_instance = DocumentImageResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into ImagesResult + try: + instance.actual_instance = ImagesResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into ChosenDocumentTypeResult + try: + instance.actual_instance = ChosenDocumentTypeResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into DocumentTypesCandidatesResult + try: + instance.actual_instance = DocumentTypesCandidatesResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into TextDataResult + try: + instance.actual_instance = TextDataResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into GraphicsResult + try: + instance.actual_instance = GraphicsResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into LexicalAnalysisResult + try: + instance.actual_instance = LexicalAnalysisResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into AuthenticityResult + try: + instance.actual_instance = AuthenticityResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into ImageQualityResult + try: + instance.actual_instance = ImageQualityResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into DocumentPositionResult + try: + instance.actual_instance = DocumentPositionResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into DocBarCodeInfo + try: + instance.actual_instance = DocBarCodeInfo.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into LicenseResult + try: + instance.actual_instance = LicenseResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into EncryptedRCLResult + try: + instance.actual_instance = EncryptedRCLResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into DocumentBinaryInfoResult + try: + instance.actual_instance = DocumentBinaryInfoResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into ByteArrayResult + try: + instance.actual_instance = ByteArrayResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into FaceDetectionResult + try: + instance.actual_instance = FaceDetectionResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into MRZDetectorResult + try: + instance.actual_instance = MRZDetectorResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into MRZPositionResult + try: + instance.actual_instance = MRZPositionResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into MRZTestQualityResult + try: + instance.actual_instance = MRZTestQualityResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into RFIDGraphicsInfoResult + try: + instance.actual_instance = RFIDGraphicsInfoResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + # deserialize data into RFIDTextDataResult + try: + instance.actual_instance = RFIDTextDataResult.from_json(json_str) + match += 1 + except (ValidationError, ValueError) as e: + error_messages.append(str(e)) + + if match > 1: + # more than 1 match + raise ValueError("Multiple matches found when deserializing the JSON string into ContainerListListInner with oneOf schemas: AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult. Details: " + ", ".join(error_messages)) + elif match == 0: + # no match + raise ValueError("No match found when deserializing the JSON string into ContainerListListInner with oneOf schemas: AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult. Details: " + ", ".join(error_messages)) + else: + return instance + + def to_json(self) -> str: + """Returns the JSON representation of the actual instance""" + if self.actual_instance is None: + return "null" + + if hasattr(self.actual_instance, "to_json") and callable(self.actual_instance.to_json): + return self.actual_instance.to_json() + else: + return json.dumps(self.actual_instance) + + def to_dict(self) -> Optional[Union[Dict[str, Any], AuthenticityResult, ByteArrayResult, ChosenDocumentTypeResult, DocBarCodeInfo, DocumentBinaryInfoResult, DocumentImageResult, DocumentPositionResult, DocumentTypesCandidatesResult, EncryptedRCLResult, FaceDetectionResult, GraphicsResult, ImageQualityResult, ImagesResult, LexicalAnalysisResult, LicenseResult, MRZDetectorResult, MRZPositionResult, MRZTestQualityResult, RFIDGraphicsInfoResult, RFIDTextDataResult, StatusResult, TextDataResult, TextResult]]: + """Returns the dict representation of the actual instance""" + if self.actual_instance is None: + return None + + if hasattr(self.actual_instance, "to_dict") and callable(self.actual_instance.to_dict): + return self.actual_instance.to_dict() + else: + # primitive type + return self.actual_instance + + def to_str(self) -> str: + """Returns the string representation of the actual instance""" + return pprint.pformat(self.model_dump()) + + diff --git a/regula/documentreader/webclient/gen/models/critical.py b/regula/documentreader/webclient/gen/models/critical.py index 924c110..7bfe6fb 100644 --- a/regula/documentreader/webclient/gen/models/critical.py +++ b/regula/documentreader/webclient/gen/models/critical.py @@ -4,94 +4,26 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration contains identifiers determining the criticality of the security element -""" -class Critical(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Critical(int, Enum): + """ + Enumeration contains identifiers determining the criticality of the security element """ - - NOT_CRITICAL = int("0") - - CRITICAL = int("1") - - allowable_values = [NOT_CRITICAL, CRITICAL] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Critical - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Critical): - return False + NOT_CRITICAL = 0 + CRITICAL = 1 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Critical from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Critical): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/cross_source_value_comparison.py b/regula/documentreader/webclient/gen/models/cross_source_value_comparison.py old mode 100755 new mode 100644 index ccfd5ca..411125c --- a/regula/documentreader/webclient/gen/models/cross_source_value_comparison.py +++ b/regula/documentreader/webclient/gen/models/cross_source_value_comparison.py @@ -4,171 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class CrossSourceValueComparison(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class CrossSourceValueComparison(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'source_left': 'Source', - 'source_right': 'Source', - 'status': 'CheckResult' - } - - attribute_map = { - 'source_left': 'sourceLeft', - 'source_right': 'sourceRight', - 'status': 'status' - } - - def __init__(self, source_left=None, source_right=None, status=None, local_vars_configuration=None): # noqa: E501 - """CrossSourceValueComparison - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._source_left = None - self._source_right = None - self._status = None - self.discriminator = None - - self.source_left = source_left - self.source_right = source_right - self.status = status - - @property - def source_left(self): - """Gets the source_left of this CrossSourceValueComparison. # noqa: E501 - - - :return: The source_left of this CrossSourceValueComparison. # noqa: E501 - :rtype: Source + CrossSourceValueComparison + """ # noqa: E501 + source_left: Source = Field(alias="sourceLeft") + source_right: Source = Field(alias="sourceRight") + status: CheckResult + __properties: ClassVar[List[str]] = ["sourceLeft", "sourceRight", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of CrossSourceValueComparison from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._source_left - - @source_left.setter - def source_left(self, source_left): - """Sets the source_left of this CrossSourceValueComparison. + excluded_fields: Set[str] = set([ + ]) + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - :param source_left: The source_left of this CrossSourceValueComparison. # noqa: E501 - :type source_left: Source - """ - if self.local_vars_configuration.client_side_validation and source_left is None: # noqa: E501 - raise ValueError("Invalid value for `source_left`, must not be `None`") # noqa: E501 - - self._source_left = source_left + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of CrossSourceValueComparison from a dict""" + if obj is None: + return None - @property - def source_right(self): - """Gets the source_right of this CrossSourceValueComparison. # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) + _obj = cls.model_validate({ + "sourceLeft": obj.get("sourceLeft"), + "sourceRight": obj.get("sourceRight"), + "status": obj.get("status") + }) + return _obj - :return: The source_right of this CrossSourceValueComparison. # noqa: E501 - :rtype: Source - """ - return self._source_right - @source_right.setter - def source_right(self, source_right): - """Sets the source_right of this CrossSourceValueComparison. - - - :param source_right: The source_right of this CrossSourceValueComparison. # noqa: E501 - :type source_right: Source - """ - if self.local_vars_configuration.client_side_validation and source_right is None: # noqa: E501 - raise ValueError("Invalid value for `source_right`, must not be `None`") # noqa: E501 - - self._source_right = source_right - - @property - def status(self): - """Gets the status of this CrossSourceValueComparison. # noqa: E501 - - - :return: The status of this CrossSourceValueComparison. # noqa: E501 - :rtype: CheckResult - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this CrossSourceValueComparison. - - - :param status: The status of this CrossSourceValueComparison. # noqa: E501 - :type status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, CrossSourceValueComparison): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, CrossSourceValueComparison): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/data_module.py b/regula/documentreader/webclient/gen/models/data_module.py index 4a7e64b..9d54192 100644 --- a/regula/documentreader/webclient/gen/models/data_module.py +++ b/regula/documentreader/webclient/gen/models/data_module.py @@ -4,220 +4,85 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.bar_code_module_type import BarCodeModuleType +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DataModule(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DataModule(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'm_data': 'str', - 'm_length': 'int', - 'm_reserved1': 'int', - 'm_reserver2': 'int', - 'm_type': 'int' - } - - attribute_map = { - 'm_data': 'mData', - 'm_length': 'mLength', - 'm_reserved1': 'mReserved1', - 'm_reserver2': 'mReserver2', - 'm_type': 'mType' - } - - def __init__(self, m_data=None, m_length=None, m_reserved1=None, m_reserver2=None, m_type=None, local_vars_configuration=None): # noqa: E501 - """DataModule - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._m_data = None - self._m_length = None - self._m_reserved1 = None - self._m_reserver2 = None - self._m_type = None - self.discriminator = None - - if m_data is not None: - self.m_data = m_data - if m_length is not None: - self.m_length = m_length - if m_reserved1 is not None: - self.m_reserved1 = m_reserved1 - if m_reserver2 is not None: - self.m_reserver2 = m_reserver2 - if m_type is not None: - self.m_type = m_type - - @property - def m_data(self): - """Gets the m_data of this DataModule. # noqa: E501 - - - :return: The m_data of this DataModule. # noqa: E501 - :rtype: str - """ - return self._m_data - - @m_data.setter - def m_data(self, m_data): - """Sets the m_data of this DataModule. - - - :param m_data: The m_data of this DataModule. # noqa: E501 - :type m_data: str - """ - - self._m_data = m_data - - @property - def m_length(self): - """Gets the m_length of this DataModule. # noqa: E501 - - - :return: The m_length of this DataModule. # noqa: E501 - :rtype: int - """ - return self._m_length - - @m_length.setter - def m_length(self, m_length): - """Sets the m_length of this DataModule. - - - :param m_length: The m_length of this DataModule. # noqa: E501 - :type m_length: int - """ - - self._m_length = m_length - - @property - def m_reserved1(self): - """Gets the m_reserved1 of this DataModule. # noqa: E501 - - - :return: The m_reserved1 of this DataModule. # noqa: E501 - :rtype: int - """ - return self._m_reserved1 - - @m_reserved1.setter - def m_reserved1(self, m_reserved1): - """Sets the m_reserved1 of this DataModule. - - - :param m_reserved1: The m_reserved1 of this DataModule. # noqa: E501 - :type m_reserved1: int - """ - - self._m_reserved1 = m_reserved1 - - @property - def m_reserver2(self): - """Gets the m_reserver2 of this DataModule. # noqa: E501 - - - :return: The m_reserver2 of this DataModule. # noqa: E501 - :rtype: int + DataModule + """ # noqa: E501 + m_data: StrictStr = Field(alias="mData") + m_length: StrictInt = Field(alias="mLength") + m_reserved1: Optional[StrictInt] = Field(default=None, alias="mReserved1") + m_reserver2: Optional[StrictInt] = Field(default=None, alias="mReserver2") + m_type: BarCodeModuleType = Field(alias="mType") + __properties: ClassVar[List[str]] = ["mData", "mLength", "mReserved1", "mReserver2", "mType"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DataModule from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._m_reserver2 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DataModule from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "mData": obj.get("mData"), + "mLength": obj.get("mLength"), + "mReserved1": obj.get("mReserved1"), + "mReserver2": obj.get("mReserver2"), + "mType": obj.get("mType") + }) + return _obj - @m_reserver2.setter - def m_reserver2(self, m_reserver2): - """Sets the m_reserver2 of this DataModule. - - - :param m_reserver2: The m_reserver2 of this DataModule. # noqa: E501 - :type m_reserver2: int - """ - - self._m_reserver2 = m_reserver2 - - @property - def m_type(self): - """Gets the m_type of this DataModule. # noqa: E501 - - - :return: The m_type of this DataModule. # noqa: E501 - :rtype: int - """ - return self._m_type - - @m_type.setter - def m_type(self, m_type): - """Sets the m_type of this DataModule. - - - :param m_type: The m_type of this DataModule. # noqa: E501 - :type m_type: int - """ - self._m_type = m_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DataModule): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DataModule): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/details_optical.py b/regula/documentreader/webclient/gen/models/details_optical.py old mode 100755 new mode 100644 index f43b45d..caa4079 --- a/regula/documentreader/webclient/gen/models/details_optical.py +++ b/regula/documentreader/webclient/gen/models/details_optical.py @@ -4,308 +4,93 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DetailsOptical(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DetailsOptical(BaseModel): """ + Details on performed optical checks + """ # noqa: E501 + overall_status: CheckResult = Field(alias="overallStatus") + doc_type: CheckResult = Field(alias="docType") + expiry: CheckResult + image_qa: CheckResult = Field(alias="imageQA") + mrz: CheckResult + pages_count: StrictInt = Field(description="Number of processed pages in the document", alias="pagesCount") + security: CheckResult + text: CheckResult + vds: Optional[StrictInt] = None + __properties: ClassVar[List[str]] = ["overallStatus", "docType", "expiry", "imageQA", "mrz", "pagesCount", "security", "text", "vds"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DetailsOptical from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DetailsOptical from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "overallStatus": obj.get("overallStatus"), + "docType": obj.get("docType"), + "expiry": obj.get("expiry"), + "imageQA": obj.get("imageQA"), + "mrz": obj.get("mrz"), + "pagesCount": obj.get("pagesCount"), + "security": obj.get("security"), + "text": obj.get("text"), + "vds": obj.get("vds") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'overall_status': 'CheckResult', - 'doc_type': 'CheckResult', - 'expiry': 'CheckResult', - 'image_qa': 'CheckResult', - 'mrz': 'CheckResult', - 'pages_count': 'int', - 'security': 'CheckResult', - 'text': 'CheckResult' - } - - attribute_map = { - 'overall_status': 'overallStatus', - 'doc_type': 'docType', - 'expiry': 'expiry', - 'image_qa': 'imageQA', - 'mrz': 'mrz', - 'pages_count': 'pagesCount', - 'security': 'security', - 'text': 'text' - } - - def __init__(self, overall_status=None, doc_type=None, expiry=None, image_qa=None, mrz=None, pages_count=None, security=None, text=None, local_vars_configuration=None): # noqa: E501 - """DetailsOptical - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._overall_status = None - self._doc_type = None - self._expiry = None - self._image_qa = None - self._mrz = None - self._pages_count = None - self._security = None - self._text = None - self.discriminator = None - - self.overall_status = overall_status - self.doc_type = doc_type - self.expiry = expiry - self.image_qa = image_qa - self.mrz = mrz - self.pages_count = pages_count - self.security = security - self.text = text - - @property - def overall_status(self): - """Gets the overall_status of this DetailsOptical. # noqa: E501 - - - :return: The overall_status of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._overall_status - - @overall_status.setter - def overall_status(self, overall_status): - """Sets the overall_status of this DetailsOptical. - - - :param overall_status: The overall_status of this DetailsOptical. # noqa: E501 - :type overall_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and overall_status is None: # noqa: E501 - raise ValueError("Invalid value for `overall_status`, must not be `None`") # noqa: E501 - - self._overall_status = overall_status - - @property - def doc_type(self): - """Gets the doc_type of this DetailsOptical. # noqa: E501 - - - :return: The doc_type of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._doc_type - - @doc_type.setter - def doc_type(self, doc_type): - """Sets the doc_type of this DetailsOptical. - - - :param doc_type: The doc_type of this DetailsOptical. # noqa: E501 - :type doc_type: CheckResult - """ - if self.local_vars_configuration.client_side_validation and doc_type is None: # noqa: E501 - raise ValueError("Invalid value for `doc_type`, must not be `None`") # noqa: E501 - - self._doc_type = doc_type - - @property - def expiry(self): - """Gets the expiry of this DetailsOptical. # noqa: E501 - - - :return: The expiry of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._expiry - - @expiry.setter - def expiry(self, expiry): - """Sets the expiry of this DetailsOptical. - - - :param expiry: The expiry of this DetailsOptical. # noqa: E501 - :type expiry: CheckResult - """ - if self.local_vars_configuration.client_side_validation and expiry is None: # noqa: E501 - raise ValueError("Invalid value for `expiry`, must not be `None`") # noqa: E501 - - self._expiry = expiry - - @property - def image_qa(self): - """Gets the image_qa of this DetailsOptical. # noqa: E501 - - - :return: The image_qa of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._image_qa - - @image_qa.setter - def image_qa(self, image_qa): - """Sets the image_qa of this DetailsOptical. - - - :param image_qa: The image_qa of this DetailsOptical. # noqa: E501 - :type image_qa: CheckResult - """ - if self.local_vars_configuration.client_side_validation and image_qa is None: # noqa: E501 - raise ValueError("Invalid value for `image_qa`, must not be `None`") # noqa: E501 - - self._image_qa = image_qa - - @property - def mrz(self): - """Gets the mrz of this DetailsOptical. # noqa: E501 - - - :return: The mrz of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._mrz - - @mrz.setter - def mrz(self, mrz): - """Sets the mrz of this DetailsOptical. - - - :param mrz: The mrz of this DetailsOptical. # noqa: E501 - :type mrz: CheckResult - """ - if self.local_vars_configuration.client_side_validation and mrz is None: # noqa: E501 - raise ValueError("Invalid value for `mrz`, must not be `None`") # noqa: E501 - - self._mrz = mrz - - @property - def pages_count(self): - """Gets the pages_count of this DetailsOptical. # noqa: E501 - - Number of processed pages in the document # noqa: E501 - - :return: The pages_count of this DetailsOptical. # noqa: E501 - :rtype: int - """ - return self._pages_count - - @pages_count.setter - def pages_count(self, pages_count): - """Sets the pages_count of this DetailsOptical. - - Number of processed pages in the document # noqa: E501 - - :param pages_count: The pages_count of this DetailsOptical. # noqa: E501 - :type pages_count: int - """ - if self.local_vars_configuration.client_side_validation and pages_count is None: # noqa: E501 - raise ValueError("Invalid value for `pages_count`, must not be `None`") # noqa: E501 - - self._pages_count = pages_count - - @property - def security(self): - """Gets the security of this DetailsOptical. # noqa: E501 - - - :return: The security of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._security - - @security.setter - def security(self, security): - """Sets the security of this DetailsOptical. - - - :param security: The security of this DetailsOptical. # noqa: E501 - :type security: CheckResult - """ - if self.local_vars_configuration.client_side_validation and security is None: # noqa: E501 - raise ValueError("Invalid value for `security`, must not be `None`") # noqa: E501 - - self._security = security - - @property - def text(self): - """Gets the text of this DetailsOptical. # noqa: E501 - - - :return: The text of this DetailsOptical. # noqa: E501 - :rtype: CheckResult - """ - return self._text - - @text.setter - def text(self, text): - """Sets the text of this DetailsOptical. - - - :param text: The text of this DetailsOptical. # noqa: E501 - :type text: CheckResult - """ - if self.local_vars_configuration.client_side_validation and text is None: # noqa: E501 - raise ValueError("Invalid value for `text`, must not be `None`") # noqa: E501 - - self._text = text - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DetailsOptical): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DetailsOptical): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/details_rfid.py b/regula/documentreader/webclient/gen/models/details_rfid.py old mode 100755 new mode 100644 index 02866af..64ac8e0 --- a/regula/documentreader/webclient/gen/models/details_rfid.py +++ b/regula/documentreader/webclient/gen/models/details_rfid.py @@ -4,279 +4,89 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DetailsRFID(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DetailsRFID(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'overall_status': 'CheckResult', - 'aa': 'CheckResult', - 'bac': 'CheckResult', - 'ca': 'CheckResult', - 'pa': 'CheckResult', - 'pace': 'CheckResult', - 'ta': 'CheckResult' - } - - attribute_map = { - 'overall_status': 'overallStatus', - 'aa': 'AA', - 'bac': 'BAC', - 'ca': 'CA', - 'pa': 'PA', - 'pace': 'PACE', - 'ta': 'TA' - } - - def __init__(self, overall_status=None, aa=None, bac=None, ca=None, pa=None, pace=None, ta=None, local_vars_configuration=None): # noqa: E501 - """DetailsRFID - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._overall_status = None - self._aa = None - self._bac = None - self._ca = None - self._pa = None - self._pace = None - self._ta = None - self.discriminator = None - - self.overall_status = overall_status - self.aa = aa - self.bac = bac - self.ca = ca - self.pa = pa - self.pace = pace - self.ta = ta - - @property - def overall_status(self): - """Gets the overall_status of this DetailsRFID. # noqa: E501 - - - :return: The overall_status of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._overall_status - - @overall_status.setter - def overall_status(self, overall_status): - """Sets the overall_status of this DetailsRFID. - - - :param overall_status: The overall_status of this DetailsRFID. # noqa: E501 - :type overall_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and overall_status is None: # noqa: E501 - raise ValueError("Invalid value for `overall_status`, must not be `None`") # noqa: E501 - - self._overall_status = overall_status - - @property - def aa(self): - """Gets the aa of this DetailsRFID. # noqa: E501 - - - :return: The aa of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._aa - - @aa.setter - def aa(self, aa): - """Sets the aa of this DetailsRFID. - - - :param aa: The aa of this DetailsRFID. # noqa: E501 - :type aa: CheckResult - """ - if self.local_vars_configuration.client_side_validation and aa is None: # noqa: E501 - raise ValueError("Invalid value for `aa`, must not be `None`") # noqa: E501 - - self._aa = aa - - @property - def bac(self): - """Gets the bac of this DetailsRFID. # noqa: E501 - - - :return: The bac of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._bac - - @bac.setter - def bac(self, bac): - """Sets the bac of this DetailsRFID. - - - :param bac: The bac of this DetailsRFID. # noqa: E501 - :type bac: CheckResult - """ - if self.local_vars_configuration.client_side_validation and bac is None: # noqa: E501 - raise ValueError("Invalid value for `bac`, must not be `None`") # noqa: E501 - - self._bac = bac - - @property - def ca(self): - """Gets the ca of this DetailsRFID. # noqa: E501 - - - :return: The ca of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._ca - - @ca.setter - def ca(self, ca): - """Sets the ca of this DetailsRFID. - - - :param ca: The ca of this DetailsRFID. # noqa: E501 - :type ca: CheckResult - """ - if self.local_vars_configuration.client_side_validation and ca is None: # noqa: E501 - raise ValueError("Invalid value for `ca`, must not be `None`") # noqa: E501 - - self._ca = ca - - @property - def pa(self): - """Gets the pa of this DetailsRFID. # noqa: E501 - - - :return: The pa of this DetailsRFID. # noqa: E501 - :rtype: CheckResult + Details on performed RFID checks + """ # noqa: E501 + overall_status: CheckResult = Field(alias="overallStatus") + aa: CheckResult = Field(alias="AA") + bac: CheckResult = Field(alias="BAC") + ca: CheckResult = Field(alias="CA") + pa: CheckResult = Field(alias="PA") + pace: CheckResult = Field(alias="PACE") + ta: CheckResult = Field(alias="TA") + __properties: ClassVar[List[str]] = ["overallStatus", "AA", "BAC", "CA", "PA", "PACE", "TA"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DetailsRFID from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._pa - - @pa.setter - def pa(self, pa): - """Sets the pa of this DetailsRFID. - - - :param pa: The pa of this DetailsRFID. # noqa: E501 - :type pa: CheckResult - """ - if self.local_vars_configuration.client_side_validation and pa is None: # noqa: E501 - raise ValueError("Invalid value for `pa`, must not be `None`") # noqa: E501 - - self._pa = pa - - @property - def pace(self): - """Gets the pace of this DetailsRFID. # noqa: E501 - - - :return: The pace of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._pace - - @pace.setter - def pace(self, pace): - """Sets the pace of this DetailsRFID. - - - :param pace: The pace of this DetailsRFID. # noqa: E501 - :type pace: CheckResult - """ - if self.local_vars_configuration.client_side_validation and pace is None: # noqa: E501 - raise ValueError("Invalid value for `pace`, must not be `None`") # noqa: E501 - - self._pace = pace - - @property - def ta(self): - """Gets the ta of this DetailsRFID. # noqa: E501 - - - :return: The ta of this DetailsRFID. # noqa: E501 - :rtype: CheckResult - """ - return self._ta - - @ta.setter - def ta(self, ta): - """Sets the ta of this DetailsRFID. - - - :param ta: The ta of this DetailsRFID. # noqa: E501 - :type ta: CheckResult - """ - if self.local_vars_configuration.client_side_validation and ta is None: # noqa: E501 - raise ValueError("Invalid value for `ta`, must not be `None`") # noqa: E501 - - self._ta = ta - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DetailsRFID): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DetailsRFID from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "overallStatus": obj.get("overallStatus"), + "AA": obj.get("AA"), + "BAC": obj.get("BAC"), + "CA": obj.get("CA"), + "PA": obj.get("PA"), + "PACE": obj.get("PACE"), + "TA": obj.get("TA") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DetailsRFID): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/device_info.py b/regula/documentreader/webclient/gen/models/device_info.py index 75594e5..49bdd23 100644 --- a/regula/documentreader/webclient/gen/models/device_info.py +++ b/regula/documentreader/webclient/gen/models/device_info.py @@ -4,246 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DeviceInfo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self +class DeviceInfo(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'app_name': 'str', - 'version': 'str', - 'license_id': 'str', - 'license_serial': 'str', - 'valid_until': 'datetime', - 'server_time': 'datetime' - } - - attribute_map = { - 'app_name': 'app-name', - 'version': 'version', - 'license_id': 'license-id', - 'license_serial': 'license-serial', - 'valid_until': 'valid-until', - 'server_time': 'server-time' - } - - def __init__(self, app_name=None, version=None, license_id=None, license_serial=None, valid_until=None, server_time=None, local_vars_configuration=None): # noqa: E501 - """DeviceInfo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._app_name = None - self._version = None - self._license_id = None - self._license_serial = None - self._valid_until = None - self._server_time = None - self.discriminator = None - - if app_name is not None: - self.app_name = app_name - if version is not None: - self.version = version - if license_id is not None: - self.license_id = license_id - if license_serial is not None: - self.license_serial = license_serial - if valid_until is not None: - self.valid_until = valid_until - if server_time is not None: - self.server_time = server_time - - @property - def app_name(self): - """Gets the app_name of this DeviceInfo. # noqa: E501 - - - :return: The app_name of this DeviceInfo. # noqa: E501 - :rtype: str + DeviceInfo + """ # noqa: E501 + app_name: Optional[StrictStr] = Field(default=None, alias="app-name") + version: Optional[StrictStr] = None + license_id: Optional[StrictStr] = Field(default=None, alias="license-id") + license_serial: Optional[StrictStr] = Field(default=None, alias="license-serial") + valid_until: Optional[datetime] = Field(default=None, alias="valid-until") + server_time: Optional[datetime] = Field(default=None, alias="server-time") + __properties: ClassVar[List[str]] = ["app-name", "version", "license-id", "license-serial", "valid-until", "server-time"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DeviceInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._app_name - - @app_name.setter - def app_name(self, app_name): - """Sets the app_name of this DeviceInfo. - - - :param app_name: The app_name of this DeviceInfo. # noqa: E501 - :type app_name: str - """ - - self._app_name = app_name - - @property - def version(self): - """Gets the version of this DeviceInfo. # noqa: E501 - - - :return: The version of this DeviceInfo. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this DeviceInfo. - - - :param version: The version of this DeviceInfo. # noqa: E501 - :type version: str - """ - - self._version = version - - @property - def license_id(self): - """Gets the license_id of this DeviceInfo. # noqa: E501 - - - :return: The license_id of this DeviceInfo. # noqa: E501 - :rtype: str - """ - return self._license_id - - @license_id.setter - def license_id(self, license_id): - """Sets the license_id of this DeviceInfo. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DeviceInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "app-name": obj.get("app-name"), + "version": obj.get("version"), + "license-id": obj.get("license-id"), + "license-serial": obj.get("license-serial"), + "valid-until": obj.get("valid-until"), + "server-time": obj.get("server-time") + }) + return _obj - :param license_id: The license_id of this DeviceInfo. # noqa: E501 - :type license_id: str - """ - - self._license_id = license_id - - @property - def license_serial(self): - """Gets the license_serial of this DeviceInfo. # noqa: E501 - - - :return: The license_serial of this DeviceInfo. # noqa: E501 - :rtype: str - """ - return self._license_serial - - @license_serial.setter - def license_serial(self, license_serial): - """Sets the license_serial of this DeviceInfo. - - - :param license_serial: The license_serial of this DeviceInfo. # noqa: E501 - :type license_serial: str - """ - - self._license_serial = license_serial - - @property - def valid_until(self): - """Gets the valid_until of this DeviceInfo. # noqa: E501 - - - :return: The valid_until of this DeviceInfo. # noqa: E501 - :rtype: datetime - """ - return self._valid_until - - @valid_until.setter - def valid_until(self, valid_until): - """Sets the valid_until of this DeviceInfo. - - - :param valid_until: The valid_until of this DeviceInfo. # noqa: E501 - :type valid_until: datetime - """ - - self._valid_until = valid_until - - @property - def server_time(self): - """Gets the server_time of this DeviceInfo. # noqa: E501 - - - :return: The server_time of this DeviceInfo. # noqa: E501 - :rtype: datetime - """ - return self._server_time - - @server_time.setter - def server_time(self, server_time): - """Sets the server_time of this DeviceInfo. - - - :param server_time: The server_time of this DeviceInfo. # noqa: E501 - :type server_time: datetime - """ - self._server_time = server_time - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DeviceInfo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DeviceInfo): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/device_info2.py b/regula/documentreader/webclient/gen/models/device_info2.py deleted file mode 100644 index 948c015..0000000 --- a/regula/documentreader/webclient/gen/models/device_info2.py +++ /dev/null @@ -1,275 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DeviceInfo2(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'app': 'str', - 'license_id': 'str', - 'license_type': 'str', - 'license_serial': 'str', - 'license_valid_until': 'datetime', - 'scenarios': 'list[str]', - 'version': 'str' - } - - attribute_map = { - 'app': 'app', - 'license_id': 'licenseId', - 'license_type': 'licenseType', - 'license_serial': 'licenseSerial', - 'license_valid_until': 'licenseValidUntil', - 'scenarios': 'scenarios', - 'version': 'version' - } - - def __init__(self, app=None, license_id=None, license_type=None, license_serial=None, license_valid_until=None, scenarios=None, version=None, local_vars_configuration=None): # noqa: E501 - """DeviceInfo2 - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._app = None - self._license_id = None - self._license_type = None - self._license_serial = None - self._license_valid_until = None - self._scenarios = None - self._version = None - self.discriminator = None - - if app is not None: - self.app = app - if license_id is not None: - self.license_id = license_id - if license_type is not None: - self.license_type = license_type - if license_serial is not None: - self.license_serial = license_serial - if license_valid_until is not None: - self.license_valid_until = license_valid_until - if scenarios is not None: - self.scenarios = scenarios - if version is not None: - self.version = version - - @property - def app(self): - """Gets the app of this DeviceInfo2. # noqa: E501 - - - :return: The app of this DeviceInfo2. # noqa: E501 - :rtype: str - """ - return self._app - - @app.setter - def app(self, app): - """Sets the app of this DeviceInfo2. - - - :param app: The app of this DeviceInfo2. # noqa: E501 - :type app: str - """ - - self._app = app - - @property - def license_id(self): - """Gets the license_id of this DeviceInfo2. # noqa: E501 - - - :return: The license_id of this DeviceInfo2. # noqa: E501 - :rtype: str - """ - return self._license_id - - @license_id.setter - def license_id(self, license_id): - """Sets the license_id of this DeviceInfo2. - - - :param license_id: The license_id of this DeviceInfo2. # noqa: E501 - :type license_id: str - """ - - self._license_id = license_id - - @property - def license_type(self): - """Gets the license_type of this DeviceInfo2. # noqa: E501 - - - :return: The license_type of this DeviceInfo2. # noqa: E501 - :rtype: str - """ - return self._license_type - - @license_type.setter - def license_type(self, license_type): - """Sets the license_type of this DeviceInfo2. - - - :param license_type: The license_type of this DeviceInfo2. # noqa: E501 - :type license_type: str - """ - - self._license_type = license_type - - @property - def license_serial(self): - """Gets the license_serial of this DeviceInfo2. # noqa: E501 - - - :return: The license_serial of this DeviceInfo2. # noqa: E501 - :rtype: str - """ - return self._license_serial - - @license_serial.setter - def license_serial(self, license_serial): - """Sets the license_serial of this DeviceInfo2. - - - :param license_serial: The license_serial of this DeviceInfo2. # noqa: E501 - :type license_serial: str - """ - - self._license_serial = license_serial - - @property - def license_valid_until(self): - """Gets the license_valid_until of this DeviceInfo2. # noqa: E501 - - - :return: The license_valid_until of this DeviceInfo2. # noqa: E501 - :rtype: datetime - """ - return self._license_valid_until - - @license_valid_until.setter - def license_valid_until(self, license_valid_until): - """Sets the license_valid_until of this DeviceInfo2. - - - :param license_valid_until: The license_valid_until of this DeviceInfo2. # noqa: E501 - :type license_valid_until: datetime - """ - - self._license_valid_until = license_valid_until - - @property - def scenarios(self): - """Gets the scenarios of this DeviceInfo2. # noqa: E501 - - - :return: The scenarios of this DeviceInfo2. # noqa: E501 - :rtype: list[str] - """ - return self._scenarios - - @scenarios.setter - def scenarios(self, scenarios): - """Sets the scenarios of this DeviceInfo2. - - - :param scenarios: The scenarios of this DeviceInfo2. # noqa: E501 - :type scenarios: list[str] - """ - - self._scenarios = scenarios - - @property - def version(self): - """Gets the version of this DeviceInfo2. # noqa: E501 - - - :return: The version of this DeviceInfo2. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this DeviceInfo2. - - - :param version: The version of this DeviceInfo2. # noqa: E501 - :type version: str - """ - - self._version = version - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DeviceInfo2): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DeviceInfo2): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_bar_code_info.py b/regula/documentreader/webclient/gen/models/doc_bar_code_info.py index 50e532c..480fa5a 100644 --- a/regula/documentreader/webclient/gen/models/doc_bar_code_info.py +++ b/regula/documentreader/webclient/gen/models/doc_bar_code_info.py @@ -4,249 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.doc_bar_code_info_fields_list import DocBarCodeInfoFieldsList +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Raw data from BarCodes -""" -class DocBarCodeInfo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class DocBarCodeInfo(ResultItem): """ - openapi_types = { - 'doc_bar_code_info': 'DocBarCodeInfoFieldsList', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'doc_bar_code_info': 'DocBarCodeInfo', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, doc_bar_code_info=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """DocBarCodeInfo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_bar_code_info = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - if doc_bar_code_info is not None: - self.doc_bar_code_info = doc_bar_code_info - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def doc_bar_code_info(self): - """Gets the doc_bar_code_info of this DocBarCodeInfo. # noqa: E501 - - - :return: The doc_bar_code_info of this DocBarCodeInfo. # noqa: E501 - :rtype: DocBarCodeInfoFieldsList - """ - return self._doc_bar_code_info - - @doc_bar_code_info.setter - def doc_bar_code_info(self, doc_bar_code_info): - """Sets the doc_bar_code_info of this DocBarCodeInfo. - - - :param doc_bar_code_info: The doc_bar_code_info of this DocBarCodeInfo. # noqa: E501 - :type doc_bar_code_info: DocBarCodeInfoFieldsList - """ - - self._doc_bar_code_info = doc_bar_code_info - - @property - def buf_length(self): - """Gets the buf_length of this DocBarCodeInfo. # noqa: E501 - - - :return: The buf_length of this DocBarCodeInfo. # noqa: E501 - :rtype: int - """ - return self._buf_length + Raw data from BarCodes + """ # noqa: E501 + doc_bar_code_info: DocBarCodeInfoFieldsList = Field(alias="DocBarCodeInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "DocBarCodeInfo"] - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this DocBarCodeInfo. + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :param buf_length: The buf_length of this DocBarCodeInfo. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this DocBarCodeInfo. # noqa: E501 + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - :return: The light of this DocBarCodeInfo. # noqa: E501 - :rtype: int - """ - return self._light + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocBarCodeInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @light.setter - def light(self, light): - """Sets the light of this DocBarCodeInfo. + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :param light: The light of this DocBarCodeInfo. # noqa: E501 - :type light: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this DocBarCodeInfo. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_bar_code_info + if self.doc_bar_code_info: + _dict['DocBarCodeInfo'] = self.doc_bar_code_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocBarCodeInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "DocBarCodeInfo": DocBarCodeInfoFieldsList.from_dict(obj["DocBarCodeInfo"]) if obj.get("DocBarCodeInfo") is not None else None + }) + return _obj - :return: The list_idx of this DocBarCodeInfo. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this DocBarCodeInfo. - - - :param list_idx: The list_idx of this DocBarCodeInfo. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this DocBarCodeInfo. # noqa: E501 - - - :return: The page_idx of this DocBarCodeInfo. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this DocBarCodeInfo. - - - :param page_idx: The page_idx of this DocBarCodeInfo. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this DocBarCodeInfo. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this DocBarCodeInfo. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this DocBarCodeInfo. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this DocBarCodeInfo. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocBarCodeInfo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocBarCodeInfo): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_bar_code_info_all_of.py b/regula/documentreader/webclient/gen/models/doc_bar_code_info_all_of.py deleted file mode 100644 index eb38328..0000000 --- a/regula/documentreader/webclient/gen/models/doc_bar_code_info_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocBarCodeInfoAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'doc_bar_code_info': 'DocBarCodeInfoFieldsList' - } - - attribute_map = { - 'doc_bar_code_info': 'DocBarCodeInfo' - } - - def __init__(self, doc_bar_code_info=None, local_vars_configuration=None): # noqa: E501 - """DocBarCodeInfoAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_bar_code_info = None - self.discriminator = None - - if doc_bar_code_info is not None: - self.doc_bar_code_info = doc_bar_code_info - - @property - def doc_bar_code_info(self): - """Gets the doc_bar_code_info of this DocBarCodeInfoAllOf. # noqa: E501 - - - :return: The doc_bar_code_info of this DocBarCodeInfoAllOf. # noqa: E501 - :rtype: DocBarCodeInfoFieldsList - """ - return self._doc_bar_code_info - - @doc_bar_code_info.setter - def doc_bar_code_info(self, doc_bar_code_info): - """Sets the doc_bar_code_info of this DocBarCodeInfoAllOf. - - - :param doc_bar_code_info: The doc_bar_code_info of this DocBarCodeInfoAllOf. # noqa: E501 - :type doc_bar_code_info: DocBarCodeInfoFieldsList - """ - - self._doc_bar_code_info = doc_bar_code_info - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocBarCodeInfoAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocBarCodeInfoAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_bar_code_info_fields_list.py b/regula/documentreader/webclient/gen/models/doc_bar_code_info_fields_list.py index fef5559..8a8ca2d 100644 --- a/regula/documentreader/webclient/gen/models/doc_bar_code_info_fields_list.py +++ b/regula/documentreader/webclient/gen/models/doc_bar_code_info_fields_list.py @@ -4,146 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.p_array_field import PArrayField +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocBarCodeInfoFieldsList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocBarCodeInfoFieldsList(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'n_fields': 'int', - 'p_array_fields': 'list[PArrayField]' - } - - attribute_map = { - 'n_fields': 'nFields', - 'p_array_fields': 'pArrayFields' - } - - def __init__(self, n_fields=None, p_array_fields=None, local_vars_configuration=None): # noqa: E501 - """DocBarCodeInfoFieldsList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._n_fields = None - self._p_array_fields = None - self.discriminator = None - - if n_fields is not None: - self.n_fields = n_fields - if p_array_fields is not None: - self.p_array_fields = p_array_fields - - @property - def n_fields(self): - """Gets the n_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - - Count of array fields # noqa: E501 - - :return: The n_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - :rtype: int + DocBarCodeInfoFieldsList + """ # noqa: E501 + n_fields: StrictInt = Field(description="Count of array fields", alias="nFields") + p_array_fields: List[PArrayField] = Field(description="Data from barcode", alias="pArrayFields") + __properties: ClassVar[List[str]] = ["nFields", "pArrayFields"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocBarCodeInfoFieldsList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._n_fields - - @n_fields.setter - def n_fields(self, n_fields): - """Sets the n_fields of this DocBarCodeInfoFieldsList. - - Count of array fields # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in p_array_fields (list) + _items = [] + if self.p_array_fields: + for _item_p_array_fields in self.p_array_fields: + if _item_p_array_fields: + _items.append(_item_p_array_fields.to_dict()) + _dict['pArrayFields'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocBarCodeInfoFieldsList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "nFields": obj.get("nFields"), + "pArrayFields": [PArrayField.from_dict(_item) for _item in obj["pArrayFields"]] if obj.get("pArrayFields") is not None else None + }) + return _obj - :param n_fields: The n_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - :type n_fields: int - """ - - self._n_fields = n_fields - - @property - def p_array_fields(self): - """Gets the p_array_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - - Data from barcode # noqa: E501 - - :return: The p_array_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - :rtype: list[PArrayField] - """ - return self._p_array_fields - - @p_array_fields.setter - def p_array_fields(self, p_array_fields): - """Sets the p_array_fields of this DocBarCodeInfoFieldsList. - - Data from barcode # noqa: E501 - - :param p_array_fields: The p_array_fields of this DocBarCodeInfoFieldsList. # noqa: E501 - :type p_array_fields: list[PArrayField] - """ - self._p_array_fields = p_array_fields - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocBarCodeInfoFieldsList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocBarCodeInfoFieldsList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_bar_code_info_item.py b/regula/documentreader/webclient/gen/models/doc_bar_code_info_item.py new file mode 100644 index 0000000..8869af6 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/doc_bar_code_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.doc_bar_code_info_fields_list import DocBarCodeInfoFieldsList +from typing import Optional, Set +from typing_extensions import Self + +class DocBarCodeInfoItem(BaseModel): + """ + DocBarCodeInfoItem + """ # noqa: E501 + doc_bar_code_info: DocBarCodeInfoFieldsList = Field(alias="DocBarCodeInfo") + __properties: ClassVar[List[str]] = ["DocBarCodeInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocBarCodeInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_bar_code_info + if self.doc_bar_code_info: + _dict['DocBarCodeInfo'] = self.doc_bar_code_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocBarCodeInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocBarCodeInfo": DocBarCodeInfoFieldsList.from_dict(obj["DocBarCodeInfo"]) if obj.get("DocBarCodeInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/doc_graphics_info_item.py b/regula/documentreader/webclient/gen/models/doc_graphics_info_item.py new file mode 100644 index 0000000..5437eed --- /dev/null +++ b/regula/documentreader/webclient/gen/models/doc_graphics_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.graphic_fields_list import GraphicFieldsList +from typing import Optional, Set +from typing_extensions import Self + +class DocGraphicsInfoItem(BaseModel): + """ + DocGraphicsInfoItem + """ # noqa: E501 + doc_graphics_info: GraphicFieldsList = Field(alias="DocGraphicsInfo") + __properties: ClassVar[List[str]] = ["DocGraphicsInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocGraphicsInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_graphics_info + if self.doc_graphics_info: + _dict['DocGraphicsInfo'] = self.doc_graphics_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocGraphicsInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocGraphicsInfo": GraphicFieldsList.from_dict(obj["DocGraphicsInfo"]) if obj.get("DocGraphicsInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/doc_visual_extended_field.py b/regula/documentreader/webclient/gen/models/doc_visual_extended_field.py old mode 100755 new mode 100644 index 2a61372..83d9032 --- a/regula/documentreader/webclient/gen/models/doc_visual_extended_field.py +++ b/regula/documentreader/webclient/gen/models/doc_visual_extended_field.py @@ -4,311 +4,115 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.string_recognition_result import StringRecognitionResult +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocVisualExtendedField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocVisualExtendedField(BaseModel): """ + DocVisualExtendedField + """ # noqa: E501 + field_type: StrictInt = Field(alias="FieldType") + w_field_type: TextFieldType = Field(alias="wFieldType") + field_name: StrictStr = Field(description="Field symbolic name (null-terminated string)", alias="FieldName") + strings_count: Union[StrictFloat, StrictInt] = Field(description="Number of StringsResult array elements", alias="StringsCount") + strings_result: List[StringRecognitionResult] = Field(description="Array of recognizing probabilities for a each line of text field. Only for Result.VISUAL_TEXT and Result.MRZ_TEXT results.", alias="StringsResult") + buf_length: Union[StrictFloat, StrictInt] = Field(description="Buf_Text text string length", alias="Buf_Length") + buf_text: StrictStr = Field(description="Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^'", alias="Buf_Text") + field_mask: Optional[StrictStr] = Field(default=None, alias="FieldMask") + validity: Optional[StrictInt] = Field(default=None, alias="Validity") + in_comparison: Optional[StrictInt] = Field(default=None, alias="InComparison") + w_lcid: Optional[StrictInt] = Field(default=None, alias="wLCID") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + reserved3: Optional[StrictInt] = Field(default=None, alias="Reserved3") + field_rect: RectangleCoordinates = Field(alias="FieldRect") + __properties: ClassVar[List[str]] = ["FieldType", "wFieldType", "FieldName", "StringsCount", "StringsResult", "Buf_Length", "Buf_Text", "FieldMask", "Validity", "InComparison", "wLCID", "Reserved2", "Reserved3", "FieldRect"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocVisualExtendedField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in strings_result (list) + _items = [] + if self.strings_result: + for _item_strings_result in self.strings_result: + if _item_strings_result: + _items.append(_item_strings_result.to_dict()) + _dict['StringsResult'] = _items + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocVisualExtendedField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldType": obj.get("FieldType"), + "wFieldType": obj.get("wFieldType"), + "FieldName": obj.get("FieldName"), + "StringsCount": obj.get("StringsCount"), + "StringsResult": [StringRecognitionResult.from_dict(_item) for _item in obj["StringsResult"]] if obj.get("StringsResult") is not None else None, + "Buf_Length": obj.get("Buf_Length"), + "Buf_Text": obj.get("Buf_Text"), + "FieldMask": obj.get("FieldMask"), + "Validity": obj.get("Validity"), + "InComparison": obj.get("InComparison"), + "wLCID": obj.get("wLCID"), + "Reserved2": obj.get("Reserved2"), + "Reserved3": obj.get("Reserved3"), + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'w_field_type': 'TextFieldType', - 'field_name': 'str', - 'w_lcid': 'LCID', - 'strings_result': 'list[StringRecognitionResult]', - 'buf_text': 'str', - 'field_rect': 'RectangleCoordinates', - 'rfid_origin_dg': 'int', - 'rfid_origin_tag_entry': 'int' - } - - attribute_map = { - 'w_field_type': 'wFieldType', - 'field_name': 'FieldName', - 'w_lcid': 'wLCID', - 'strings_result': 'StringsResult', - 'buf_text': 'Buf_Text', - 'field_rect': 'FieldRect', - 'rfid_origin_dg': 'RFID_OriginDG', - 'rfid_origin_tag_entry': 'RFID_OriginTagEntry' - } - - def __init__(self, w_field_type=None, field_name=None, w_lcid=None, strings_result=None, buf_text=None, field_rect=None, rfid_origin_dg=None, rfid_origin_tag_entry=None, local_vars_configuration=None): # noqa: E501 - """DocVisualExtendedField - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._w_field_type = None - self._field_name = None - self._w_lcid = None - self._strings_result = None - self._buf_text = None - self._field_rect = None - self._rfid_origin_dg = None - self._rfid_origin_tag_entry = None - self.discriminator = None - - self.w_field_type = w_field_type - self.field_name = field_name - self.w_lcid = w_lcid - if strings_result is not None: - self.strings_result = strings_result - if buf_text is not None: - self.buf_text = buf_text - if field_rect is not None: - self.field_rect = field_rect - if rfid_origin_dg is not None: - self.rfid_origin_dg = rfid_origin_dg - if rfid_origin_tag_entry is not None: - self.rfid_origin_tag_entry = rfid_origin_tag_entry - - @property - def w_field_type(self): - """Gets the w_field_type of this DocVisualExtendedField. # noqa: E501 - - - :return: The w_field_type of this DocVisualExtendedField. # noqa: E501 - :rtype: TextFieldType - """ - return self._w_field_type - - @w_field_type.setter - def w_field_type(self, w_field_type): - """Sets the w_field_type of this DocVisualExtendedField. - - - :param w_field_type: The w_field_type of this DocVisualExtendedField. # noqa: E501 - :type w_field_type: TextFieldType - """ - if self.local_vars_configuration.client_side_validation and w_field_type is None: # noqa: E501 - raise ValueError("Invalid value for `w_field_type`, must not be `None`") # noqa: E501 - - self._w_field_type = w_field_type - - @property - def field_name(self): - """Gets the field_name of this DocVisualExtendedField. # noqa: E501 - - Field name. Only use to search values for fields with fieldType=50(other). In general, use wFieldType for lookup. # noqa: E501 - - :return: The field_name of this DocVisualExtendedField. # noqa: E501 - :rtype: str - """ - return self._field_name - - @field_name.setter - def field_name(self, field_name): - """Sets the field_name of this DocVisualExtendedField. - - Field name. Only use to search values for fields with fieldType=50(other). In general, use wFieldType for lookup. # noqa: E501 - - :param field_name: The field_name of this DocVisualExtendedField. # noqa: E501 - :type field_name: str - """ - if self.local_vars_configuration.client_side_validation and field_name is None: # noqa: E501 - raise ValueError("Invalid value for `field_name`, must not be `None`") # noqa: E501 - - self._field_name = field_name - - @property - def w_lcid(self): - """Gets the w_lcid of this DocVisualExtendedField. # noqa: E501 - - - :return: The w_lcid of this DocVisualExtendedField. # noqa: E501 - :rtype: LCID - """ - return self._w_lcid - - @w_lcid.setter - def w_lcid(self, w_lcid): - """Sets the w_lcid of this DocVisualExtendedField. - - - :param w_lcid: The w_lcid of this DocVisualExtendedField. # noqa: E501 - :type w_lcid: LCID - """ - if self.local_vars_configuration.client_side_validation and w_lcid is None: # noqa: E501 - raise ValueError("Invalid value for `w_lcid`, must not be `None`") # noqa: E501 - - self._w_lcid = w_lcid - - @property - def strings_result(self): - """Gets the strings_result of this DocVisualExtendedField. # noqa: E501 - - Array of recognizing probabilities for a each line of text field. Only for Result.VISUAL_TEXT and Result.MRZ_TEXT results. # noqa: E501 - - :return: The strings_result of this DocVisualExtendedField. # noqa: E501 - :rtype: list[StringRecognitionResult] - """ - return self._strings_result - - @strings_result.setter - def strings_result(self, strings_result): - """Sets the strings_result of this DocVisualExtendedField. - - Array of recognizing probabilities for a each line of text field. Only for Result.VISUAL_TEXT and Result.MRZ_TEXT results. # noqa: E501 - - :param strings_result: The strings_result of this DocVisualExtendedField. # noqa: E501 - :type strings_result: list[StringRecognitionResult] - """ - - self._strings_result = strings_result - - @property - def buf_text(self): - """Gets the buf_text of this DocVisualExtendedField. # noqa: E501 - - Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^' # noqa: E501 - - :return: The buf_text of this DocVisualExtendedField. # noqa: E501 - :rtype: str - """ - return self._buf_text - - @buf_text.setter - def buf_text(self, buf_text): - """Sets the buf_text of this DocVisualExtendedField. - - Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^' # noqa: E501 - - :param buf_text: The buf_text of this DocVisualExtendedField. # noqa: E501 - :type buf_text: str - """ - - self._buf_text = buf_text - - @property - def field_rect(self): - """Gets the field_rect of this DocVisualExtendedField. # noqa: E501 - - - :return: The field_rect of this DocVisualExtendedField. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this DocVisualExtendedField. - - - :param field_rect: The field_rect of this DocVisualExtendedField. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def rfid_origin_dg(self): - """Gets the rfid_origin_dg of this DocVisualExtendedField. # noqa: E501 - - Origin data group information. Only for Result.RFID_TEXT results. # noqa: E501 - - :return: The rfid_origin_dg of this DocVisualExtendedField. # noqa: E501 - :rtype: int - """ - return self._rfid_origin_dg - - @rfid_origin_dg.setter - def rfid_origin_dg(self, rfid_origin_dg): - """Sets the rfid_origin_dg of this DocVisualExtendedField. - - Origin data group information. Only for Result.RFID_TEXT results. # noqa: E501 - - :param rfid_origin_dg: The rfid_origin_dg of this DocVisualExtendedField. # noqa: E501 - :type rfid_origin_dg: int - """ - - self._rfid_origin_dg = rfid_origin_dg - - @property - def rfid_origin_tag_entry(self): - """Gets the rfid_origin_tag_entry of this DocVisualExtendedField. # noqa: E501 - - Index of the text field record in origin data group. Only for Result.RFID_TEXT results. # noqa: E501 - - :return: The rfid_origin_tag_entry of this DocVisualExtendedField. # noqa: E501 - :rtype: int - """ - return self._rfid_origin_tag_entry - - @rfid_origin_tag_entry.setter - def rfid_origin_tag_entry(self, rfid_origin_tag_entry): - """Sets the rfid_origin_tag_entry of this DocVisualExtendedField. - - Index of the text field record in origin data group. Only for Result.RFID_TEXT results. # noqa: E501 - - :param rfid_origin_tag_entry: The rfid_origin_tag_entry of this DocVisualExtendedField. # noqa: E501 - :type rfid_origin_tag_entry: int - """ - - self._rfid_origin_tag_entry = rfid_origin_tag_entry - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocVisualExtendedField): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocVisualExtendedField): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_visual_extended_field_item.py b/regula/documentreader/webclient/gen/models/doc_visual_extended_field_item.py new file mode 100644 index 0000000..81290df --- /dev/null +++ b/regula/documentreader/webclient/gen/models/doc_visual_extended_field_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class DocVisualExtendedFieldItem(BaseModel): + """ + DocVisualExtendedFieldItem + """ # noqa: E501 + field_rect: RectangleCoordinates = Field(alias="FieldRect") + __properties: ClassVar[List[str]] = ["FieldRect"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocVisualExtendedFieldItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocVisualExtendedFieldItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/doc_visual_extended_info.py b/regula/documentreader/webclient/gen/models/doc_visual_extended_info.py old mode 100755 new mode 100644 index a581856..1a06995 --- a/regula/documentreader/webclient/gen/models/doc_visual_extended_info.py +++ b/regula/documentreader/webclient/gen/models/doc_visual_extended_info.py @@ -4,117 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.doc_visual_extended_field import DocVisualExtendedField +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Container for extracted text fields. Fields are identified by type and language -""" -class DocVisualExtendedInfo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocVisualExtendedInfo(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'p_array_fields': 'list[DocVisualExtendedField]' - } - - attribute_map = { - 'p_array_fields': 'pArrayFields' - } - - def __init__(self, p_array_fields=None, local_vars_configuration=None): # noqa: E501 - """DocVisualExtendedInfo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._p_array_fields = None - self.discriminator = None - - self.p_array_fields = p_array_fields - - @property - def p_array_fields(self): - """Gets the p_array_fields of this DocVisualExtendedInfo. # noqa: E501 - - - :return: The p_array_fields of this DocVisualExtendedInfo. # noqa: E501 - :rtype: list[DocVisualExtendedField] + Container for extracted text fields. Fields are identified by type and language + """ # noqa: E501 + n_fields: Union[StrictFloat, StrictInt] = Field(description="Number of pArrayFields array elements", alias="nFields") + p_array_fields: List[DocVisualExtendedField] = Field(alias="pArrayFields") + __properties: ClassVar[List[str]] = ["nFields", "pArrayFields"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocVisualExtendedInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._p_array_fields + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in p_array_fields (list) + _items = [] + if self.p_array_fields: + for _item_p_array_fields in self.p_array_fields: + if _item_p_array_fields: + _items.append(_item_p_array_fields.to_dict()) + _dict['pArrayFields'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocVisualExtendedInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "nFields": obj.get("nFields"), + "pArrayFields": [DocVisualExtendedField.from_dict(_item) for _item in obj["pArrayFields"]] if obj.get("pArrayFields") is not None else None + }) + return _obj - @p_array_fields.setter - def p_array_fields(self, p_array_fields): - """Sets the p_array_fields of this DocVisualExtendedInfo. - - :param p_array_fields: The p_array_fields of this DocVisualExtendedInfo. # noqa: E501 - :type p_array_fields: list[DocVisualExtendedField] - """ - if self.local_vars_configuration.client_side_validation and p_array_fields is None: # noqa: E501 - raise ValueError("Invalid value for `p_array_fields`, must not be `None`") # noqa: E501 - - self._p_array_fields = p_array_fields - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocVisualExtendedInfo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocVisualExtendedInfo): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/doc_visual_extended_info_item.py b/regula/documentreader/webclient/gen/models/doc_visual_extended_info_item.py new file mode 100644 index 0000000..357ec9a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/doc_visual_extended_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.doc_visual_extended_info import DocVisualExtendedInfo +from typing import Optional, Set +from typing_extensions import Self + +class DocVisualExtendedInfoItem(BaseModel): + """ + DocVisualExtendedInfoItem + """ # noqa: E501 + doc_visual_extended_info: DocVisualExtendedInfo = Field(alias="DocVisualExtendedInfo") + __properties: ClassVar[List[str]] = ["DocVisualExtendedInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocVisualExtendedInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_visual_extended_info + if self.doc_visual_extended_info: + _dict['DocVisualExtendedInfo'] = self.doc_visual_extended_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocVisualExtendedInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocVisualExtendedInfo": DocVisualExtendedInfo.from_dict(obj["DocVisualExtendedInfo"]) if obj.get("DocVisualExtendedInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/document_binary_info_result.py b/regula/documentreader/webclient/gen/models/document_binary_info_result.py new file mode 100644 index 0000000..70fce2d --- /dev/null +++ b/regula/documentreader/webclient/gen/models/document_binary_info_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.t_doc_binary_info import TDocBinaryInfo +from typing import Optional, Set +from typing_extensions import Self + +class DocumentBinaryInfoResult(ResultItem): + """ + Structure is used to store the data reading results from the RFID-chip in a form of a list of the logically separated data groups. + """ # noqa: E501 + t_doc_binary_info: TDocBinaryInfo = Field(alias="TDocBinaryInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "TDocBinaryInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentBinaryInfoResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of t_doc_binary_info + if self.t_doc_binary_info: + _dict['TDocBinaryInfo'] = self.t_doc_binary_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentBinaryInfoResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "TDocBinaryInfo": TDocBinaryInfo.from_dict(obj["TDocBinaryInfo"]) if obj.get("TDocBinaryInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/document_format.py b/regula/documentreader/webclient/gen/models/document_format.py old mode 100755 new mode 100644 index 877ce21..b1ea995 --- a/regula/documentreader/webclient/gen/models/document_format.py +++ b/regula/documentreader/webclient/gen/models/document_format.py @@ -4,116 +4,38 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Defining the geometric format of documents in accordance with ISO / IEC 7810 -""" -class DocumentFormat(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentFormat(int, Enum): + """ + Defining the geometric format of documents in accordance with ISO / IEC 7810 """ - - ID1 = int("0") - - ID2 = int("1") - - ID3 = int("2") - - NON = int("3") - - A4 = int("4") - - ID3_X2 = int("5") - - ID1_90 = int("10") - - ID1_180 = int("11") - - ID1_270 = int("12") - - ID2_180 = int("13") - - ID3_180 = int("14") - - CUSTOM = int("1000") - - FLEXIBLE = int("1002") - - allowable_values = [ID1, ID2, ID3, NON, A4, ID3_X2, ID1_90, ID1_180, ID1_270, ID2_180, ID3_180, CUSTOM, FLEXIBLE] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """DocumentFormat - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentFormat): - return False - - return self.to_dict() == other.to_dict() + UNKNOWN = -1 + ID1 = 0 + ID2 = 1 + ID3 = 2 + NON = 3 + A4 = 4 + ID3_X2 = 5 + ID1_90 = 10 + ID1_180 = 11 + ID1_270 = 12 + ID2_180 = 13 + ID3_180 = 14 + CUSTOM = 1000 + FLEXIBLE = 1002 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of DocumentFormat from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentFormat): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_image.py b/regula/documentreader/webclient/gen/models/document_image.py index 8ce9b9f..66a1df4 100644 --- a/regula/documentreader/webclient/gen/models/document_image.py +++ b/regula/documentreader/webclient/gen/models/document_image.py @@ -4,147 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentImage(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class DocumentImage(BaseModel): """ - openapi_types = { - 'image': 'str', - 'format': 'str' - } - - attribute_map = { - 'image': 'image', - 'format': 'format' - } - - def __init__(self, image=None, format=None, local_vars_configuration=None): # noqa: E501 - """DocumentImage - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._image = None - self._format = None - self.discriminator = None - - self.image = image - if format is not None: - self.format = format - - @property - def image(self): - """Gets the image of this DocumentImage. # noqa: E501 - - Base64 encoded image # noqa: E501 - - :return: The image of this DocumentImage. # noqa: E501 - :rtype: str + DocumentImage + """ # noqa: E501 + image: StrictStr = Field(description="Base64 encoded image") + format: Optional[StrictStr] = Field(default=None, description="Image format") + __properties: ClassVar[List[str]] = ["image", "format"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentImage from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._image + excluded_fields: Set[str] = set([ + ]) - @image.setter - def image(self, image): - """Sets the image of this DocumentImage. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - Base64 encoded image # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentImage from a dict""" + if obj is None: + return None - :param image: The image of this DocumentImage. # noqa: E501 - :type image: str - """ - if self.local_vars_configuration.client_side_validation and image is None: # noqa: E501 - raise ValueError("Invalid value for `image`, must not be `None`") # noqa: E501 - - self._image = image - - @property - def format(self): - """Gets the format of this DocumentImage. # noqa: E501 - - Image format # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The format of this DocumentImage. # noqa: E501 - :rtype: str - """ - return self._format - - @format.setter - def format(self, format): - """Sets the format of this DocumentImage. + _obj = cls.model_validate({ + "image": obj.get("image"), + "format": obj.get("format") + }) + return _obj - Image format # noqa: E501 - - :param format: The format of this DocumentImage. # noqa: E501 - :type format: str - """ - self._format = format - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentImage): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentImage): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_image_result.py b/regula/documentreader/webclient/gen/models/document_image_result.py old mode 100755 new mode 100644 index c43cd56..ec09c62 --- a/regula/documentreader/webclient/gen/models/document_image_result.py +++ b/regula/documentreader/webclient/gen/models/document_image_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains document image. -""" -class DocumentImageResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class DocumentImageResult(ResultItem): """ - openapi_types = { - 'raw_image_container': 'ImageData', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'raw_image_container': 'RawImageContainer', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, raw_image_container=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """DocumentImageResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._raw_image_container = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.raw_image_container = raw_image_container - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def raw_image_container(self): - """Gets the raw_image_container of this DocumentImageResult. # noqa: E501 - - - :return: The raw_image_container of this DocumentImageResult. # noqa: E501 - :rtype: ImageData - """ - return self._raw_image_container - - @raw_image_container.setter - def raw_image_container(self, raw_image_container): - """Sets the raw_image_container of this DocumentImageResult. - - - :param raw_image_container: The raw_image_container of this DocumentImageResult. # noqa: E501 - :type raw_image_container: ImageData - """ - if self.local_vars_configuration.client_side_validation and raw_image_container is None: # noqa: E501 - raise ValueError("Invalid value for `raw_image_container`, must not be `None`") # noqa: E501 - - self._raw_image_container = raw_image_container - - @property - def buf_length(self): - """Gets the buf_length of this DocumentImageResult. # noqa: E501 - - - :return: The buf_length of this DocumentImageResult. # noqa: E501 - :rtype: int - """ - return self._buf_length + Contains document image. + """ # noqa: E501 + raw_image_container: ImageData = Field(alias="RawImageContainer") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "RawImageContainer"] - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this DocumentImageResult. + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :param buf_length: The buf_length of this DocumentImageResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this DocumentImageResult. # noqa: E501 + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - :return: The light of this DocumentImageResult. # noqa: E501 - :rtype: int - """ - return self._light + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentImageResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @light.setter - def light(self, light): - """Sets the light of this DocumentImageResult. + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :param light: The light of this DocumentImageResult. # noqa: E501 - :type light: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this DocumentImageResult. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of raw_image_container + if self.raw_image_container: + _dict['RawImageContainer'] = self.raw_image_container.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentImageResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "RawImageContainer": ImageData.from_dict(obj["RawImageContainer"]) if obj.get("RawImageContainer") is not None else None + }) + return _obj - :return: The list_idx of this DocumentImageResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this DocumentImageResult. - - - :param list_idx: The list_idx of this DocumentImageResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this DocumentImageResult. # noqa: E501 - - - :return: The page_idx of this DocumentImageResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this DocumentImageResult. - - - :param page_idx: The page_idx of this DocumentImageResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this DocumentImageResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this DocumentImageResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this DocumentImageResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this DocumentImageResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentImageResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentImageResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_image_result_all_of.py b/regula/documentreader/webclient/gen/models/document_image_result_all_of.py deleted file mode 100755 index 9d82027..0000000 --- a/regula/documentreader/webclient/gen/models/document_image_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentImageResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'raw_image_container': 'ImageData' - } - - attribute_map = { - 'raw_image_container': 'RawImageContainer' - } - - def __init__(self, raw_image_container=None, local_vars_configuration=None): # noqa: E501 - """DocumentImageResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._raw_image_container = None - self.discriminator = None - - self.raw_image_container = raw_image_container - - @property - def raw_image_container(self): - """Gets the raw_image_container of this DocumentImageResultAllOf. # noqa: E501 - - - :return: The raw_image_container of this DocumentImageResultAllOf. # noqa: E501 - :rtype: ImageData - """ - return self._raw_image_container - - @raw_image_container.setter - def raw_image_container(self, raw_image_container): - """Sets the raw_image_container of this DocumentImageResultAllOf. - - - :param raw_image_container: The raw_image_container of this DocumentImageResultAllOf. # noqa: E501 - :type raw_image_container: ImageData - """ - if self.local_vars_configuration.client_side_validation and raw_image_container is None: # noqa: E501 - raise ValueError("Invalid value for `raw_image_container`, must not be `None`") # noqa: E501 - - self._raw_image_container = raw_image_container - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentImageResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentImageResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_position.py b/regula/documentreader/webclient/gen/models/document_position.py index 052c3f5..5d72185 100644 --- a/regula/documentreader/webclient/gen/models/document_position.py +++ b/regula/documentreader/webclient/gen/models/document_position.py @@ -4,350 +4,121 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.document_format import DocumentFormat +from regula.documentreader.webclient.gen.models.point import Point +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentPosition(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class DocumentPosition(BaseModel): """ - openapi_types = { - 'doc_format': 'DocumentFormat', - 'angle': 'float', - 'width': 'int', - 'height': 'int', - 'center': 'Point', - 'left_bottom': 'Point', - 'left_top': 'Point', - 'right_bottom': 'Point', - 'right_top': 'Point', - 'dpi': 'int' - } - - attribute_map = { - 'doc_format': 'docFormat', - 'angle': 'Angle', - 'width': 'Width', - 'height': 'Height', - 'center': 'Center', - 'left_bottom': 'LeftBottom', - 'left_top': 'LeftTop', - 'right_bottom': 'RightBottom', - 'right_top': 'RightTop', - 'dpi': 'Dpi' - } - - def __init__(self, doc_format=None, angle=None, width=None, height=None, center=None, left_bottom=None, left_top=None, right_bottom=None, right_top=None, dpi=None, local_vars_configuration=None): # noqa: E501 - """DocumentPosition - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_format = None - self._angle = None - self._width = None - self._height = None - self._center = None - self._left_bottom = None - self._left_top = None - self._right_bottom = None - self._right_top = None - self._dpi = None - self.discriminator = None - - if doc_format is not None: - self.doc_format = doc_format - if angle is not None: - self.angle = angle - if width is not None: - self.width = width - if height is not None: - self.height = height - if center is not None: - self.center = center - if left_bottom is not None: - self.left_bottom = left_bottom - if left_top is not None: - self.left_top = left_top - if right_bottom is not None: - self.right_bottom = right_bottom - if right_top is not None: - self.right_top = right_top - if dpi is not None: - self.dpi = dpi - - @property - def doc_format(self): - """Gets the doc_format of this DocumentPosition. # noqa: E501 - - - :return: The doc_format of this DocumentPosition. # noqa: E501 - :rtype: DocumentFormat - """ - return self._doc_format - - @doc_format.setter - def doc_format(self, doc_format): - """Sets the doc_format of this DocumentPosition. - - - :param doc_format: The doc_format of this DocumentPosition. # noqa: E501 - :type doc_format: DocumentFormat - """ - - self._doc_format = doc_format - - @property - def angle(self): - """Gets the angle of this DocumentPosition. # noqa: E501 - - - :return: The angle of this DocumentPosition. # noqa: E501 - :rtype: float - """ - return self._angle - - @angle.setter - def angle(self, angle): - """Sets the angle of this DocumentPosition. - - - :param angle: The angle of this DocumentPosition. # noqa: E501 - :type angle: float - """ - - self._angle = angle - - @property - def width(self): - """Gets the width of this DocumentPosition. # noqa: E501 - - - :return: The width of this DocumentPosition. # noqa: E501 - :rtype: int - """ - return self._width - - @width.setter - def width(self, width): - """Sets the width of this DocumentPosition. - - - :param width: The width of this DocumentPosition. # noqa: E501 - :type width: int - """ - - self._width = width - - @property - def height(self): - """Gets the height of this DocumentPosition. # noqa: E501 - - - :return: The height of this DocumentPosition. # noqa: E501 - :rtype: int - """ - return self._height - - @height.setter - def height(self, height): - """Sets the height of this DocumentPosition. - - - :param height: The height of this DocumentPosition. # noqa: E501 - :type height: int - """ - - self._height = height - - @property - def center(self): - """Gets the center of this DocumentPosition. # noqa: E501 - - - :return: The center of this DocumentPosition. # noqa: E501 - :rtype: Point - """ - return self._center - - @center.setter - def center(self, center): - """Sets the center of this DocumentPosition. - - - :param center: The center of this DocumentPosition. # noqa: E501 - :type center: Point - """ - - self._center = center - - @property - def left_bottom(self): - """Gets the left_bottom of this DocumentPosition. # noqa: E501 - - - :return: The left_bottom of this DocumentPosition. # noqa: E501 - :rtype: Point - """ - return self._left_bottom - - @left_bottom.setter - def left_bottom(self, left_bottom): - """Sets the left_bottom of this DocumentPosition. - - - :param left_bottom: The left_bottom of this DocumentPosition. # noqa: E501 - :type left_bottom: Point - """ - - self._left_bottom = left_bottom - - @property - def left_top(self): - """Gets the left_top of this DocumentPosition. # noqa: E501 - - - :return: The left_top of this DocumentPosition. # noqa: E501 - :rtype: Point - """ - return self._left_top - - @left_top.setter - def left_top(self, left_top): - """Sets the left_top of this DocumentPosition. - - - :param left_top: The left_top of this DocumentPosition. # noqa: E501 - :type left_top: Point - """ - - self._left_top = left_top - - @property - def right_bottom(self): - """Gets the right_bottom of this DocumentPosition. # noqa: E501 - - - :return: The right_bottom of this DocumentPosition. # noqa: E501 - :rtype: Point - """ - return self._right_bottom - - @right_bottom.setter - def right_bottom(self, right_bottom): - """Sets the right_bottom of this DocumentPosition. - - - :param right_bottom: The right_bottom of this DocumentPosition. # noqa: E501 - :type right_bottom: Point - """ - - self._right_bottom = right_bottom - - @property - def right_top(self): - """Gets the right_top of this DocumentPosition. # noqa: E501 - - - :return: The right_top of this DocumentPosition. # noqa: E501 - :rtype: Point - """ - return self._right_top - - @right_top.setter - def right_top(self, right_top): - """Sets the right_top of this DocumentPosition. - - - :param right_top: The right_top of this DocumentPosition. # noqa: E501 - :type right_top: Point - """ - - self._right_top = right_top - - @property - def dpi(self): - """Gets the dpi of this DocumentPosition. # noqa: E501 - - - :return: The dpi of this DocumentPosition. # noqa: E501 - :rtype: int - """ - return self._dpi - - @dpi.setter - def dpi(self, dpi): - """Sets the dpi of this DocumentPosition. - - - :param dpi: The dpi of this DocumentPosition. # noqa: E501 - :type dpi: int - """ - - self._dpi = dpi - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentPosition): - return False - - return self.to_dict() == other.to_dict() + DocumentPosition + """ # noqa: E501 + doc_format: DocumentFormat = Field(alias="docFormat") + angle: Union[StrictFloat, StrictInt] = Field(description="Document rotation angle", alias="Angle") + width: StrictInt = Field(description="Document width", alias="Width") + height: StrictInt = Field(description="Document height", alias="Height") + center: Point = Field(alias="Center") + left_bottom: Point = Field(alias="LeftBottom") + left_top: Point = Field(alias="LeftTop") + right_bottom: Point = Field(alias="RightBottom") + right_top: Point = Field(alias="RightTop") + dpi: StrictInt = Field(alias="Dpi") + inverse: Optional[StrictInt] = Field(default=None, alias="Inverse") + obj_area: Optional[StrictInt] = Field(default=None, alias="ObjArea") + obj_int_angle_dev: Optional[StrictInt] = Field(default=None, alias="ObjIntAngleDev") + perspective_tr: Optional[StrictInt] = Field(default=None, alias="PerspectiveTr") + result_status: Optional[StrictInt] = Field(default=None, alias="ResultStatus") + __properties: ClassVar[List[str]] = ["docFormat", "Angle", "Width", "Height", "Center", "LeftBottom", "LeftTop", "RightBottom", "RightTop", "Dpi", "Inverse", "ObjArea", "ObjIntAngleDev", "PerspectiveTr", "ResultStatus"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentPosition from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of center + if self.center: + _dict['Center'] = self.center.to_dict() + # override the default output from pydantic by calling `to_dict()` of left_bottom + if self.left_bottom: + _dict['LeftBottom'] = self.left_bottom.to_dict() + # override the default output from pydantic by calling `to_dict()` of left_top + if self.left_top: + _dict['LeftTop'] = self.left_top.to_dict() + # override the default output from pydantic by calling `to_dict()` of right_bottom + if self.right_bottom: + _dict['RightBottom'] = self.right_bottom.to_dict() + # override the default output from pydantic by calling `to_dict()` of right_top + if self.right_top: + _dict['RightTop'] = self.right_top.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentPosition from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "docFormat": obj.get("docFormat"), + "Angle": obj.get("Angle"), + "Width": obj.get("Width"), + "Height": obj.get("Height"), + "Center": Point.from_dict(obj["Center"]) if obj.get("Center") is not None else None, + "LeftBottom": Point.from_dict(obj["LeftBottom"]) if obj.get("LeftBottom") is not None else None, + "LeftTop": Point.from_dict(obj["LeftTop"]) if obj.get("LeftTop") is not None else None, + "RightBottom": Point.from_dict(obj["RightBottom"]) if obj.get("RightBottom") is not None else None, + "RightTop": Point.from_dict(obj["RightTop"]) if obj.get("RightTop") is not None else None, + "Dpi": obj.get("Dpi"), + "Inverse": obj.get("Inverse"), + "ObjArea": obj.get("ObjArea"), + "ObjIntAngleDev": obj.get("ObjIntAngleDev"), + "PerspectiveTr": obj.get("PerspectiveTr"), + "ResultStatus": obj.get("ResultStatus") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentPosition): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_position_item.py b/regula/documentreader/webclient/gen/models/document_position_item.py new file mode 100644 index 0000000..b39e6d8 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/document_position_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.document_position import DocumentPosition +from typing import Optional, Set +from typing_extensions import Self + +class DocumentPositionItem(BaseModel): + """ + DocumentPositionItem + """ # noqa: E501 + document_position: DocumentPosition = Field(alias="DocumentPosition") + __properties: ClassVar[List[str]] = ["DocumentPosition"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentPositionItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of document_position + if self.document_position: + _dict['DocumentPosition'] = self.document_position.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentPositionItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocumentPosition": DocumentPosition.from_dict(obj["DocumentPosition"]) if obj.get("DocumentPosition") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/document_position_result.py b/regula/documentreader/webclient/gen/models/document_position_result.py index 404c2db..a840e60 100644 --- a/regula/documentreader/webclient/gen/models/document_position_result.py +++ b/regula/documentreader/webclient/gen/models/document_position_result.py @@ -4,249 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.document_position import DocumentPosition +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains information about document position on the input image, its center, angle, etc -""" -class DocumentPositionResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class DocumentPositionResult(ResultItem): """ - openapi_types = { - 'document_position': 'DocumentPosition', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'document_position': 'DocumentPosition', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, document_position=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """DocumentPositionResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._document_position = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - if document_position is not None: - self.document_position = document_position - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def document_position(self): - """Gets the document_position of this DocumentPositionResult. # noqa: E501 - - - :return: The document_position of this DocumentPositionResult. # noqa: E501 - :rtype: DocumentPosition - """ - return self._document_position - - @document_position.setter - def document_position(self, document_position): - """Sets the document_position of this DocumentPositionResult. - - - :param document_position: The document_position of this DocumentPositionResult. # noqa: E501 - :type document_position: DocumentPosition - """ - - self._document_position = document_position - - @property - def buf_length(self): - """Gets the buf_length of this DocumentPositionResult. # noqa: E501 - - - :return: The buf_length of this DocumentPositionResult. # noqa: E501 - :rtype: int - """ - return self._buf_length + Contains information about document position on the input image, its center, angle, etc + """ # noqa: E501 + document_position: DocumentPosition = Field(alias="DocumentPosition") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "DocumentPosition"] - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this DocumentPositionResult. + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :param buf_length: The buf_length of this DocumentPositionResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this DocumentPositionResult. # noqa: E501 + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - :return: The light of this DocumentPositionResult. # noqa: E501 - :rtype: int - """ - return self._light + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentPositionResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @light.setter - def light(self, light): - """Sets the light of this DocumentPositionResult. + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :param light: The light of this DocumentPositionResult. # noqa: E501 - :type light: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this DocumentPositionResult. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of document_position + if self.document_position: + _dict['DocumentPosition'] = self.document_position.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentPositionResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "DocumentPosition": DocumentPosition.from_dict(obj["DocumentPosition"]) if obj.get("DocumentPosition") is not None else None + }) + return _obj - :return: The list_idx of this DocumentPositionResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this DocumentPositionResult. - - - :param list_idx: The list_idx of this DocumentPositionResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this DocumentPositionResult. # noqa: E501 - - - :return: The page_idx of this DocumentPositionResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this DocumentPositionResult. - - - :param page_idx: The page_idx of this DocumentPositionResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this DocumentPositionResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this DocumentPositionResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this DocumentPositionResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this DocumentPositionResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentPositionResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentPositionResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_position_result_all_of.py b/regula/documentreader/webclient/gen/models/document_position_result_all_of.py deleted file mode 100644 index 2c16244..0000000 --- a/regula/documentreader/webclient/gen/models/document_position_result_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentPositionResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'document_position': 'DocumentPosition' - } - - attribute_map = { - 'document_position': 'DocumentPosition' - } - - def __init__(self, document_position=None, local_vars_configuration=None): # noqa: E501 - """DocumentPositionResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._document_position = None - self.discriminator = None - - if document_position is not None: - self.document_position = document_position - - @property - def document_position(self): - """Gets the document_position of this DocumentPositionResultAllOf. # noqa: E501 - - - :return: The document_position of this DocumentPositionResultAllOf. # noqa: E501 - :rtype: DocumentPosition - """ - return self._document_position - - @document_position.setter - def document_position(self, document_position): - """Sets the document_position of this DocumentPositionResultAllOf. - - - :param document_position: The document_position of this DocumentPositionResultAllOf. # noqa: E501 - :type document_position: DocumentPosition - """ - - self._document_position = document_position - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentPositionResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentPositionResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_type.py b/regula/documentreader/webclient/gen/models/document_type.py old mode 100755 new mode 100644 index 80647b1..12e75ed --- a/regula/documentreader/webclient/gen/models/document_type.py +++ b/regula/documentreader/webclient/gen/models/document_type.py @@ -4,550 +4,254 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Possible values for document types -""" -class DocumentType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentType(int, Enum): + """ + Possible values for document types """ - - NOT_DEFINED = int("0") - - PASSPORT = int("11") - - IDENTITY_CARD = int("12") - - DIPLOMATIC_PASSPORT = int("13") - - SERVICE_PASSPORT = int("14") - - SEAMANS_IDENTITY_DOCUMENT = int("15") - - IDENTITY_CARD_FOR_RESIDENCE = int("16") - - TRAVEL_DOCUMENT = int("17") - - NATIONAL_IDENTITY_CARD = int("20") - - SOCIAL_IDENTITY_CARD = int("21") - - ALIENS_IDENTITY_CARD = int("22") - - PRIVILEGED_IDENTITY_CARD = int("23") - - RESIDENCE_PERMIT_IDENTITY_CARD = int("24") - - ORIGIN_CARD = int("25") - - EMERGENCY_PASSPORT = int("26") - - ALIENS_PASSPORT = int("27") - - ALTERNATIVE_IDENTITY_CARD = int("28") - - VISA_ID2 = int("29") - - VISA_ID3 = int("30") - - AUTHORIZATION_CARD = int("32") - - BEGINNER_PERMIT = int("33") - - BORDER_CROSSING_CARD = int("34") - - CHAUFFEUR_LICENSE = int("35") - - CHAUFFEUR_LICENSE_UNDER_18 = int("36") - - CHAUFFEUR_LICENSE_UNDER_21 = int("37") - - COMMERCIAL_DRIVING_LICENSE = int("38") - - COMMERCIAL_DRIVING_LICENSE_INSTRUCTIONAL_PERMIT = int("39") - - COMMERCIAL_DRIVING_LICENSE_UNDER_18 = int("40") - - COMMERCIAL_DRIVING_LICENSE_UNDER_21 = int("41") - - COMMERCIAL_INSTRUCTION_PERMIT = int("42") - - COMMERCIAL_NEW_PERMIT = int("43") - - CONCEALED_CARRY_LICENSE = int("44") - - CONCEALED_FIREARM_PERMIT = int("45") - - CONDITIONAL_DRIVING_LICENSE = int("46") - - DEPARTMENT_OF_VETERANS_AFFAIRS_IDENTITY_CARD = int("47") - - DIPLOMATIC_DRIVING_LICENSE = int("48") - - DRIVING_LICENSE = int("49") - - DRIVING_LICENSE_INSTRUCTIONAL_PERMIT = int("50") - - DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_18 = int("51") - - DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_21 = int("52") - - DRIVING_LICENSE_LEARNERS_PERMIT = int("53") - - DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_18 = int("54") - - DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_21 = int("55") - - DRIVING_LICENSE_NOVICE = int("56") - - DRIVING_LICENSE_NOVICE_UNDER_18 = int("57") - - DRIVING_LICENSE_NOVICE_UNDER_21 = int("58") - - DRIVING_LICENSE_REGISTERED_OFFENDER = int("59") - - DRIVING_LICENSE_RESTRICTED_UNDER_18 = int("60") - - DRIVING_LICENSE_RESTRICTED_UNDER_21 = int("61") - - DRIVING_LICENSE_TEMPORARY_VISITOR = int("62") - - DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_18 = int("63") - - DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_21 = int("64") - - DRIVING_LICENSE_UNDER_18 = int("65") - - DRIVING_LICENSE_UNDER_21 = int("66") - - EMPLOYMENT_DRIVING_PERMIT = int("67") - - ENHANCED_CHAUFFEUR_LICENSE = int("68") - - ENHANCED_CHAUFFEUR_LICENSE_UNDER_18 = int("69") - - ENHANCED_CHAUFFEUR_LICENSE_UNDER_21 = int("70") - - ENHANCED_COMMERCIAL_DRIVING_LICENSE = int("71") - - ENHANCED_DRIVING_LICENSE = int("72") - - ENHANCED_DRIVING_LICENSE_UNDER_18 = int("73") - - ENHANCED_DRIVING_LICENSE_UNDER_21 = int("74") - - ENHANCED_IDENTITY_CARD = int("75") - - ENHANCED_IDENTITY_CARD_UNDER_18 = int("76") - - ENHANCED_IDENTITY_CARD_UNDER_21 = int("77") - - ENHANCED_OPERATORS_LICENSE = int("78") - - FIREARMS_PERMIT = int("79") - - FULL_PROVISIONAL_LICENSE = int("80") - - FULL_PROVISIONAL_LICENSE_UNDER_18 = int("81") - - FULL_PROVISIONAL_LICENSE_UNDER_21 = int("82") - - GENEVA_CONVENTIONS_IDENTITY_CARD = int("83") - - GRADUATED_DRIVING_LICENSE_UNDER_18 = int("84") - - GRADUATED_DRIVING_LICENSE_UNDER_21 = int("85") - - GRADUATED_INSTRUCTION_PERMIT_UNDER_18 = int("86") - - GRADUATED_INSTRUCTION_PERMIT_UNDER_21 = int("87") - - GRADUATED_LICENSE_UNDER_18 = int("88") - - GRADUATED_LICENSE_UNDER_21 = int("89") - - HANDGUN_CARRY_PERMIT = int("90") - - IDENTITY_AND_PRIVILEGE_CARD = int("91") - - IDENTITY_CARD_MOBILITY_IMPAIRED = int("92") - - IDENTITY_CARD_REGISTERED_OFFENDER = int("93") - - IDENTITY_CARD_TEMPORARY_VISITOR = int("94") - - IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_18 = int("95") - - IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_21 = int("96") - - IDENTITY_CARD_UNDER_18 = int("97") - - IDENTITY_CARD_UNDER_21 = int("98") - - OTHER = int("99") - - IGNITION_INTERLOCK_PERMIT = int("100") - - IMMIGRANT_VISA = int("101") - - INSTRUCTION_PERMIT = int("102") - - INSTRUCTION_PERMIT_UNDER_18 = int("103") - - INSTRUCTION_PERMIT_UNDER_21 = int("104") - - INTERIM_DRIVING_LICENSE = int("105") - - INTERIM_IDENTITY_CARD = int("106") - - INTERMEDIATE_DRIVING_LICENSE = int("107") - - INTERMEDIATE_DRIVING_LICENSE_UNDER_18 = int("108") - - INTERMEDIATE_DRIVING_LICENSE_UNDER_21 = int("109") - - JUNIOR_DRIVING_LICENSE = int("110") - - LEARNER_INSTRUCTIONAL_PERMIT = int("111") - - LEARNER_LICENSE = int("112") - - LEARNER_LICENSE_UNDER_18 = int("113") - - LEARNER_LICENSE_UNDER_21 = int("114") - - LEARNER_PERMIT = int("115") - - LEARNER_PERMIT_UNDER_18 = int("116") - - LEARNER_PERMIT_UNDER_21 = int("117") - - LIMITED_LICENSE = int("118") - - LIMITED_PERMIT = int("119") - - LIMITED_TERM_DRIVING_LICENSE = int("120") - - LIMITED_TERM_IDENTITY_CARD = int("121") - - LIQUOR_IDENTITY_CARD = int("122") - - NEW_PERMIT = int("123") - - NEW_PERMIT_UNDER_18 = int("124") - - NEW_PERMIT_UNDER_21 = int("125") - - NON_US_CITIZEN_DRIVING_LICENSE = int("126") - - OCCUPATIONAL_DRIVING_LICENSE = int("127") - - ONEIDA_TRIBE_OF_INDIANS_IDENTITY_CARD = int("128") - - OPERATOR_LICENSE = int("129") - - OPERATOR_LICENSE_UNDER_18 = int("130") - - OPERATOR_LICENSE_UNDER_21 = int("131") - - PERMANENT_DRIVING_LICENSE = int("132") - - PERMIT_TO_REENTER = int("133") - - PROBATIONARY_AUTO_LICENSE = int("134") - - PROBATIONARY_DRIVING_LICENSE_UNDER_18 = int("135") - - PROBATIONARY_DRIVING_LICENSE_UNDER_21 = int("136") - - PROBATIONARY_VEHICLE_SALES_PERSON_LICENSE = int("137") - - PROVISIONAL_DRIVING_LICENSE = int("138") - - PROVISIONAL_DRIVING_LICENSE_UNDER_18 = int("139") - - PROVISIONAL_DRIVING_LICENSE_UNDER_21 = int("140") - - PROVISIONAL_LICENSE = int("141") - - PROVISIONAL_LICENSE_UNDER_18 = int("142") - - PROVISIONAL_LICENSE_UNDER_21 = int("143") - - PUBLIC_PASSENGER_CHAUFFEUR_LICENSE = int("144") - - RACING_AND_GAMING_COMISSION_CARD = int("145") - - REFUGEE_TRAVEL_DOCUMENT = int("146") - - RENEWAL_PERMIT = int("147") - - RESTRICTED_COMMERCIAL_DRIVER_LICENSE = int("148") - - RESTRICTED_DRIVER_LICENSE = int("149") - - RESTRICTED_PERMIT = int("150") - - SEASONAL_PERMIT = int("151") - - SEASONAL_RESIDENT_IDENTITY_CARD = int("152") - - SEASONAL_CITIZEN_IDENTITY_CARD = int("153") - - SEX_OFFENDER = int("154") - - SOCIAL_SECURITY_CARD = int("155") - - TEMPORARY_DRIVING_LICENSE = int("156") - - TEMPORARY_DRIVING_LICENSE_UNDER_18 = int("157") - - TEMPORARY_DRIVING_LICENSE_UNDER_21 = int("158") - - TEMPORARY_IDENTITY_CARD = int("159") - - TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD = int("160") - - TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_18 = int("161") - - TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_21 = int("162") - - TEMPORARY_VISITOR_DRIVING_LICENSE = int("163") - - TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_18 = int("164") - - TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_21 = int("165") - - UNIFORMED_SERVICES_IDENTITY_CARD = int("166") - - VEHICLE_SALES_PERSON_LICENSE = int("167") - - WORKER_IDENTIFICATION_CREDENTIAL = int("168") - - COMMERCIAL_DRIVING_LICENSE_NOVICE = int("169") - - COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_18 = int("170") - - COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_21 = int("171") - - PASSPORT_CARD = int("172") - - PASSPORT_RESIDENT_CARD = int("173") - - PERSONAL_IDENTIFICATION_VERIFICATION = int("174") - - TEMPORARY_OPERATOR_LICENSE = int("175") - - DRIVING_LICENSE_UNDER_19 = int("176") - - IDENTITY_CARD_UNDER_19 = int("177") - - VISA = int("178") - - TEMPORARY_PASSPORT = int("179") - - VOTING_CARD = int("180") - - HEALTH_CARD = int("181") - - CERTIFICATE_OF_CITIZENSHIP = int("182") - - ADDRESS_CARD = int("183") - - AIRPORT_IMMIGRATION_CARD = int("184") - - ALIEN_REGISTRATION_CARD = int("185") - - APEH_CARD = int("186") - - COUPON_TO_DRIVING_LICENSE = int("187") - - CREW_MEMBER_CERTIFICATE = int("188") - - DOCUMENT_FOR_RETURN = int("189") - - E_CARD = int("190") - - EMPLOYMENT_CARD = int("191") - - HKSAR_IMMIGRATION_FORM = int("192") - - IMMIGRANT_CARD = int("193") - - LABOUR_CARD = int("194") - - LAISSEZ_PASSER = int("195") - - LAWYER_IDENTITY_CERTIFICATE = int("196") - - LICENSE_CARD = int("197") - - PASSPORT_STATELESS = int("198") - - PASSPORT_CHILD = int("199") - - PASSPORT_CONSULAR = int("200") - - PASSPORT_DIPLOMATIC_SERVICE = int("201") - - PASSPORT_OFFICIAL = int("202") - - PASSPORT_PROVISIONAL = int("203") - - PASSPORT_SPECIAL = int("204") - - PERMISSION_TO_THE_LOCAL_BORDER_TRAFFIC = int("205") - - REGISTRATION_CERTIFICATE = int("206") - - SEDESOL_CARD = int("207") - - SOCIAL_CARD = int("208") - - TB_CARD = int("209") - - VEHICLE_PASSPORT = int("210") - - W_DOCUMENT = int("211") - - DIPLOMATIC_IDENTITY_CARD = int("212") - - CONSULAR_IDENTITY_CARD = int("213") - - INCOME_TAX_CARD = int("214") - - RESIDENCE_PERMIT = int("215") - - DOCUMENT_OF_IDENTITY = int("216") - - BORDER_CROSSING_PERMIT = int("217") - - PASSPORT_LIMITED_VALIDITY = int("218") - - SIM_CARD = int("219") - - TAX_CARD = int("220") - - COMPANY_CARD = int("221") - - DOMESTIC_PASSPORT = int("222") - - IDENTITY_CERTIFICATE = int("223") - - RESIDENT_ID_CARD = int("224") - - ARMED_FORCES_IDENTITY_CARD = int("225") - - PROFESSIONAL_CARD = int("226") - - REGISTRATION_STAMP = int("227") - - DRIVER_CARD = int("228") - - DRIVER_TRAINING_CERTIFICATE = int("229") - - QUALIFICATION_DRIVING_LICENSE = int("230") - - MEMBERSHIP_CARD = int("231") - - PUBLIC_VEHICLE_DRIVER_AUTHORITY_CARD = int("232") - - MARINE_LICENSE = int("233") - - TEMPORARY_LEARNER_LICENSE = int("234") - - TEMPORARY_COMMERCIAL_DRIVING_LICENSE = int("235") - - INTERIM_INSTRUCTIONAL_PERMIT = int("236") - - CERTIFICATE_OF_COMPETENCY = int("237") - - CERTIFICATE_OF_PROFICIENCY = int("238") - - TRADE_LICENSE = int("239") - - PASSPORT_PAGE = int("240") - - INVOICE = int("241") - - PASSENGER_LOCATOR_FORM = int("242") - - allowable_values = [NOT_DEFINED, PASSPORT, IDENTITY_CARD, DIPLOMATIC_PASSPORT, SERVICE_PASSPORT, SEAMANS_IDENTITY_DOCUMENT, IDENTITY_CARD_FOR_RESIDENCE, TRAVEL_DOCUMENT, NATIONAL_IDENTITY_CARD, SOCIAL_IDENTITY_CARD, ALIENS_IDENTITY_CARD, PRIVILEGED_IDENTITY_CARD, RESIDENCE_PERMIT_IDENTITY_CARD, ORIGIN_CARD, EMERGENCY_PASSPORT, ALIENS_PASSPORT, ALTERNATIVE_IDENTITY_CARD, VISA_ID2, VISA_ID3, AUTHORIZATION_CARD, BEGINNER_PERMIT, BORDER_CROSSING_CARD, CHAUFFEUR_LICENSE, CHAUFFEUR_LICENSE_UNDER_18, CHAUFFEUR_LICENSE_UNDER_21, COMMERCIAL_DRIVING_LICENSE, COMMERCIAL_DRIVING_LICENSE_INSTRUCTIONAL_PERMIT, COMMERCIAL_DRIVING_LICENSE_UNDER_18, COMMERCIAL_DRIVING_LICENSE_UNDER_21, COMMERCIAL_INSTRUCTION_PERMIT, COMMERCIAL_NEW_PERMIT, CONCEALED_CARRY_LICENSE, CONCEALED_FIREARM_PERMIT, CONDITIONAL_DRIVING_LICENSE, DEPARTMENT_OF_VETERANS_AFFAIRS_IDENTITY_CARD, DIPLOMATIC_DRIVING_LICENSE, DRIVING_LICENSE, DRIVING_LICENSE_INSTRUCTIONAL_PERMIT, DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_18, DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_21, DRIVING_LICENSE_LEARNERS_PERMIT, DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_18, DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_21, DRIVING_LICENSE_NOVICE, DRIVING_LICENSE_NOVICE_UNDER_18, DRIVING_LICENSE_NOVICE_UNDER_21, DRIVING_LICENSE_REGISTERED_OFFENDER, DRIVING_LICENSE_RESTRICTED_UNDER_18, DRIVING_LICENSE_RESTRICTED_UNDER_21, DRIVING_LICENSE_TEMPORARY_VISITOR, DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_18, DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_21, DRIVING_LICENSE_UNDER_18, DRIVING_LICENSE_UNDER_21, EMPLOYMENT_DRIVING_PERMIT, ENHANCED_CHAUFFEUR_LICENSE, ENHANCED_CHAUFFEUR_LICENSE_UNDER_18, ENHANCED_CHAUFFEUR_LICENSE_UNDER_21, ENHANCED_COMMERCIAL_DRIVING_LICENSE, ENHANCED_DRIVING_LICENSE, ENHANCED_DRIVING_LICENSE_UNDER_18, ENHANCED_DRIVING_LICENSE_UNDER_21, ENHANCED_IDENTITY_CARD, ENHANCED_IDENTITY_CARD_UNDER_18, ENHANCED_IDENTITY_CARD_UNDER_21, ENHANCED_OPERATORS_LICENSE, FIREARMS_PERMIT, FULL_PROVISIONAL_LICENSE, FULL_PROVISIONAL_LICENSE_UNDER_18, FULL_PROVISIONAL_LICENSE_UNDER_21, GENEVA_CONVENTIONS_IDENTITY_CARD, GRADUATED_DRIVING_LICENSE_UNDER_18, GRADUATED_DRIVING_LICENSE_UNDER_21, GRADUATED_INSTRUCTION_PERMIT_UNDER_18, GRADUATED_INSTRUCTION_PERMIT_UNDER_21, GRADUATED_LICENSE_UNDER_18, GRADUATED_LICENSE_UNDER_21, HANDGUN_CARRY_PERMIT, IDENTITY_AND_PRIVILEGE_CARD, IDENTITY_CARD_MOBILITY_IMPAIRED, IDENTITY_CARD_REGISTERED_OFFENDER, IDENTITY_CARD_TEMPORARY_VISITOR, IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_18, IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_21, IDENTITY_CARD_UNDER_18, IDENTITY_CARD_UNDER_21, OTHER, IGNITION_INTERLOCK_PERMIT, IMMIGRANT_VISA, INSTRUCTION_PERMIT, INSTRUCTION_PERMIT_UNDER_18, INSTRUCTION_PERMIT_UNDER_21, INTERIM_DRIVING_LICENSE, INTERIM_IDENTITY_CARD, INTERMEDIATE_DRIVING_LICENSE, INTERMEDIATE_DRIVING_LICENSE_UNDER_18, INTERMEDIATE_DRIVING_LICENSE_UNDER_21, JUNIOR_DRIVING_LICENSE, LEARNER_INSTRUCTIONAL_PERMIT, LEARNER_LICENSE, LEARNER_LICENSE_UNDER_18, LEARNER_LICENSE_UNDER_21, LEARNER_PERMIT, LEARNER_PERMIT_UNDER_18, LEARNER_PERMIT_UNDER_21, LIMITED_LICENSE, LIMITED_PERMIT, LIMITED_TERM_DRIVING_LICENSE, LIMITED_TERM_IDENTITY_CARD, LIQUOR_IDENTITY_CARD, NEW_PERMIT, NEW_PERMIT_UNDER_18, NEW_PERMIT_UNDER_21, NON_US_CITIZEN_DRIVING_LICENSE, OCCUPATIONAL_DRIVING_LICENSE, ONEIDA_TRIBE_OF_INDIANS_IDENTITY_CARD, OPERATOR_LICENSE, OPERATOR_LICENSE_UNDER_18, OPERATOR_LICENSE_UNDER_21, PERMANENT_DRIVING_LICENSE, PERMIT_TO_REENTER, PROBATIONARY_AUTO_LICENSE, PROBATIONARY_DRIVING_LICENSE_UNDER_18, PROBATIONARY_DRIVING_LICENSE_UNDER_21, PROBATIONARY_VEHICLE_SALES_PERSON_LICENSE, PROVISIONAL_DRIVING_LICENSE, PROVISIONAL_DRIVING_LICENSE_UNDER_18, PROVISIONAL_DRIVING_LICENSE_UNDER_21, PROVISIONAL_LICENSE, PROVISIONAL_LICENSE_UNDER_18, PROVISIONAL_LICENSE_UNDER_21, PUBLIC_PASSENGER_CHAUFFEUR_LICENSE, RACING_AND_GAMING_COMISSION_CARD, REFUGEE_TRAVEL_DOCUMENT, RENEWAL_PERMIT, RESTRICTED_COMMERCIAL_DRIVER_LICENSE, RESTRICTED_DRIVER_LICENSE, RESTRICTED_PERMIT, SEASONAL_PERMIT, SEASONAL_RESIDENT_IDENTITY_CARD, SEASONAL_CITIZEN_IDENTITY_CARD, SEX_OFFENDER, SOCIAL_SECURITY_CARD, TEMPORARY_DRIVING_LICENSE, TEMPORARY_DRIVING_LICENSE_UNDER_18, TEMPORARY_DRIVING_LICENSE_UNDER_21, TEMPORARY_IDENTITY_CARD, TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD, TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_18, TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_21, TEMPORARY_VISITOR_DRIVING_LICENSE, TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_18, TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_21, UNIFORMED_SERVICES_IDENTITY_CARD, VEHICLE_SALES_PERSON_LICENSE, WORKER_IDENTIFICATION_CREDENTIAL, COMMERCIAL_DRIVING_LICENSE_NOVICE, COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_18, COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_21, PASSPORT_CARD, PASSPORT_RESIDENT_CARD, PERSONAL_IDENTIFICATION_VERIFICATION, TEMPORARY_OPERATOR_LICENSE, DRIVING_LICENSE_UNDER_19, IDENTITY_CARD_UNDER_19, VISA, TEMPORARY_PASSPORT, VOTING_CARD, HEALTH_CARD, CERTIFICATE_OF_CITIZENSHIP, ADDRESS_CARD, AIRPORT_IMMIGRATION_CARD, ALIEN_REGISTRATION_CARD, APEH_CARD, COUPON_TO_DRIVING_LICENSE, CREW_MEMBER_CERTIFICATE, DOCUMENT_FOR_RETURN, E_CARD, EMPLOYMENT_CARD, HKSAR_IMMIGRATION_FORM, IMMIGRANT_CARD, LABOUR_CARD, LAISSEZ_PASSER, LAWYER_IDENTITY_CERTIFICATE, LICENSE_CARD, PASSPORT_STATELESS, PASSPORT_CHILD, PASSPORT_CONSULAR, PASSPORT_DIPLOMATIC_SERVICE, PASSPORT_OFFICIAL, PASSPORT_PROVISIONAL, PASSPORT_SPECIAL, PERMISSION_TO_THE_LOCAL_BORDER_TRAFFIC, REGISTRATION_CERTIFICATE, SEDESOL_CARD, SOCIAL_CARD, TB_CARD, VEHICLE_PASSPORT, W_DOCUMENT, DIPLOMATIC_IDENTITY_CARD, CONSULAR_IDENTITY_CARD, INCOME_TAX_CARD, RESIDENCE_PERMIT, DOCUMENT_OF_IDENTITY, BORDER_CROSSING_PERMIT, PASSPORT_LIMITED_VALIDITY, SIM_CARD, TAX_CARD, COMPANY_CARD, DOMESTIC_PASSPORT, IDENTITY_CERTIFICATE, RESIDENT_ID_CARD, ARMED_FORCES_IDENTITY_CARD, PROFESSIONAL_CARD, REGISTRATION_STAMP, DRIVER_CARD, DRIVER_TRAINING_CERTIFICATE, QUALIFICATION_DRIVING_LICENSE, MEMBERSHIP_CARD, PUBLIC_VEHICLE_DRIVER_AUTHORITY_CARD, MARINE_LICENSE, TEMPORARY_LEARNER_LICENSE, TEMPORARY_COMMERCIAL_DRIVING_LICENSE, INTERIM_INSTRUCTIONAL_PERMIT, CERTIFICATE_OF_COMPETENCY, CERTIFICATE_OF_PROFICIENCY, TRADE_LICENSE, PASSPORT_PAGE, INVOICE, PASSENGER_LOCATOR_FORM] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """DocumentType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentType): - return False - - return self.to_dict() == other.to_dict() + NOT_DEFINED = 0 + PASSPORT = 11 + IDENTITY_CARD = 12 + DIPLOMATIC_PASSPORT = 13 + SERVICE_PASSPORT = 14 + SEAMANS_IDENTITY_DOCUMENT = 15 + IDENTITY_CARD_FOR_RESIDENCE = 16 + TRAVEL_DOCUMENT = 17 + NATIONAL_IDENTITY_CARD = 20 + SOCIAL_IDENTITY_CARD = 21 + ALIENS_IDENTITY_CARD = 22 + PRIVILEGED_IDENTITY_CARD = 23 + RESIDENCE_PERMIT_IDENTITY_CARD = 24 + ORIGIN_CARD = 25 + EMERGENCY_PASSPORT = 26 + ALIENS_PASSPORT = 27 + ALTERNATIVE_IDENTITY_CARD = 28 + VISA_ID2 = 29 + VISA_ID3 = 30 + AUTHORIZATION_CARD = 32 + BEGINNER_PERMIT = 33 + BORDER_CROSSING_CARD = 34 + CHAUFFEUR_LICENSE = 35 + CHAUFFEUR_LICENSE_UNDER_18 = 36 + CHAUFFEUR_LICENSE_UNDER_21 = 37 + COMMERCIAL_DRIVING_LICENSE = 38 + COMMERCIAL_DRIVING_LICENSE_INSTRUCTIONAL_PERMIT = 39 + COMMERCIAL_DRIVING_LICENSE_UNDER_18 = 40 + COMMERCIAL_DRIVING_LICENSE_UNDER_21 = 41 + COMMERCIAL_INSTRUCTION_PERMIT = 42 + COMMERCIAL_NEW_PERMIT = 43 + CONCEALED_CARRY_LICENSE = 44 + CONCEALED_FIREARM_PERMIT = 45 + CONDITIONAL_DRIVING_LICENSE = 46 + DEPARTMENT_OF_VETERANS_AFFAIRS_IDENTITY_CARD = 47 + DIPLOMATIC_DRIVING_LICENSE = 48 + DRIVING_LICENSE = 49 + DRIVING_LICENSE_INSTRUCTIONAL_PERMIT = 50 + DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_18 = 51 + DRIVING_LICENSE_INSTRUCTIONAL_PERMIT_UNDER_21 = 52 + DRIVING_LICENSE_LEARNERS_PERMIT = 53 + DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_18 = 54 + DRIVING_LICENSE_LEARNERS_PERMIT_UNDER_21 = 55 + DRIVING_LICENSE_NOVICE = 56 + DRIVING_LICENSE_NOVICE_UNDER_18 = 57 + DRIVING_LICENSE_NOVICE_UNDER_21 = 58 + DRIVING_LICENSE_REGISTERED_OFFENDER = 59 + DRIVING_LICENSE_RESTRICTED_UNDER_18 = 60 + DRIVING_LICENSE_RESTRICTED_UNDER_21 = 61 + DRIVING_LICENSE_TEMPORARY_VISITOR = 62 + DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_18 = 63 + DRIVING_LICENSE_TEMPORARY_VISITOR_UNDER_21 = 64 + DRIVING_LICENSE_UNDER_18 = 65 + DRIVING_LICENSE_UNDER_21 = 66 + EMPLOYMENT_DRIVING_PERMIT = 67 + ENHANCED_CHAUFFEUR_LICENSE = 68 + ENHANCED_CHAUFFEUR_LICENSE_UNDER_18 = 69 + ENHANCED_CHAUFFEUR_LICENSE_UNDER_21 = 70 + ENHANCED_COMMERCIAL_DRIVING_LICENSE = 71 + ENHANCED_DRIVING_LICENSE = 72 + ENHANCED_DRIVING_LICENSE_UNDER_18 = 73 + ENHANCED_DRIVING_LICENSE_UNDER_21 = 74 + ENHANCED_IDENTITY_CARD = 75 + ENHANCED_IDENTITY_CARD_UNDER_18 = 76 + ENHANCED_IDENTITY_CARD_UNDER_21 = 77 + ENHANCED_OPERATORS_LICENSE = 78 + FIREARMS_PERMIT = 79 + FULL_PROVISIONAL_LICENSE = 80 + FULL_PROVISIONAL_LICENSE_UNDER_18 = 81 + FULL_PROVISIONAL_LICENSE_UNDER_21 = 82 + GENEVA_CONVENTIONS_IDENTITY_CARD = 83 + GRADUATED_DRIVING_LICENSE_UNDER_18 = 84 + GRADUATED_DRIVING_LICENSE_UNDER_21 = 85 + GRADUATED_INSTRUCTION_PERMIT_UNDER_18 = 86 + GRADUATED_INSTRUCTION_PERMIT_UNDER_21 = 87 + GRADUATED_LICENSE_UNDER_18 = 88 + GRADUATED_LICENSE_UNDER_21 = 89 + HANDGUN_CARRY_PERMIT = 90 + IDENTITY_AND_PRIVILEGE_CARD = 91 + IDENTITY_CARD_MOBILITY_IMPAIRED = 92 + IDENTITY_CARD_REGISTERED_OFFENDER = 93 + IDENTITY_CARD_TEMPORARY_VISITOR = 94 + IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_18 = 95 + IDENTITY_CARD_TEMPORARY_VISITOR_UNDER_21 = 96 + IDENTITY_CARD_UNDER_18 = 97 + IDENTITY_CARD_UNDER_21 = 98 + OTHER = 99 + IGNITION_INTERLOCK_PERMIT = 100 + IMMIGRANT_VISA = 101 + INSTRUCTION_PERMIT = 102 + INSTRUCTION_PERMIT_UNDER_18 = 103 + INSTRUCTION_PERMIT_UNDER_21 = 104 + INTERIM_DRIVING_LICENSE = 105 + INTERIM_IDENTITY_CARD = 106 + INTERMEDIATE_DRIVING_LICENSE = 107 + INTERMEDIATE_DRIVING_LICENSE_UNDER_18 = 108 + INTERMEDIATE_DRIVING_LICENSE_UNDER_21 = 109 + JUNIOR_DRIVING_LICENSE = 110 + LEARNER_INSTRUCTIONAL_PERMIT = 111 + LEARNER_LICENSE = 112 + LEARNER_LICENSE_UNDER_18 = 113 + LEARNER_LICENSE_UNDER_21 = 114 + LEARNER_PERMIT = 115 + LEARNER_PERMIT_UNDER_18 = 116 + LEARNER_PERMIT_UNDER_21 = 117 + LIMITED_LICENSE = 118 + LIMITED_PERMIT = 119 + LIMITED_TERM_DRIVING_LICENSE = 120 + LIMITED_TERM_IDENTITY_CARD = 121 + LIQUOR_IDENTITY_CARD = 122 + NEW_PERMIT = 123 + NEW_PERMIT_UNDER_18 = 124 + NEW_PERMIT_UNDER_21 = 125 + NON_US_CITIZEN_DRIVING_LICENSE = 126 + OCCUPATIONAL_DRIVING_LICENSE = 127 + ONEIDA_TRIBE_OF_INDIANS_IDENTITY_CARD = 128 + OPERATOR_LICENSE = 129 + OPERATOR_LICENSE_UNDER_18 = 130 + OPERATOR_LICENSE_UNDER_21 = 131 + PERMANENT_DRIVING_LICENSE = 132 + PERMIT_TO_REENTER = 133 + PROBATIONARY_AUTO_LICENSE = 134 + PROBATIONARY_DRIVING_LICENSE_UNDER_18 = 135 + PROBATIONARY_DRIVING_LICENSE_UNDER_21 = 136 + PROBATIONARY_VEHICLE_SALES_PERSON_LICENSE = 137 + PROVISIONAL_DRIVING_LICENSE = 138 + PROVISIONAL_DRIVING_LICENSE_UNDER_18 = 139 + PROVISIONAL_DRIVING_LICENSE_UNDER_21 = 140 + PROVISIONAL_LICENSE = 141 + PROVISIONAL_LICENSE_UNDER_18 = 142 + PROVISIONAL_LICENSE_UNDER_21 = 143 + PUBLIC_PASSENGER_CHAUFFEUR_LICENSE = 144 + RACING_AND_GAMING_COMISSION_CARD = 145 + REFUGEE_TRAVEL_DOCUMENT = 146 + RENEWAL_PERMIT = 147 + RESTRICTED_COMMERCIAL_DRIVER_LICENSE = 148 + RESTRICTED_DRIVER_LICENSE = 149 + RESTRICTED_PERMIT = 150 + SEASONAL_PERMIT = 151 + SEASONAL_RESIDENT_IDENTITY_CARD = 152 + SEASONAL_CITIZEN_IDENTITY_CARD = 153 + SEX_OFFENDER = 154 + SOCIAL_SECURITY_CARD = 155 + TEMPORARY_DRIVING_LICENSE = 156 + TEMPORARY_DRIVING_LICENSE_UNDER_18 = 157 + TEMPORARY_DRIVING_LICENSE_UNDER_21 = 158 + TEMPORARY_IDENTITY_CARD = 159 + TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD = 160 + TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_18 = 161 + TEMPORARY_INSTRUCTION_PERMIT_IDENTITY_CARD_UNDER_21 = 162 + TEMPORARY_VISITOR_DRIVING_LICENSE = 163 + TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_18 = 164 + TEMPORARY_VISITOR_DRIVING_LICENSE_UNDER_21 = 165 + UNIFORMED_SERVICES_IDENTITY_CARD = 166 + VEHICLE_SALES_PERSON_LICENSE = 167 + WORKER_IDENTIFICATION_CREDENTIAL = 168 + COMMERCIAL_DRIVING_LICENSE_NOVICE = 169 + COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_18 = 170 + COMMERCIAL_DRIVING_LICENSE_NOVICE_UNDER_21 = 171 + PASSPORT_CARD = 172 + PASSPORT_RESIDENT_CARD = 173 + PERSONAL_IDENTIFICATION_VERIFICATION = 174 + TEMPORARY_OPERATOR_LICENSE = 175 + DRIVING_LICENSE_UNDER_19 = 176 + IDENTITY_CARD_UNDER_19 = 177 + VISA = 178 + TEMPORARY_PASSPORT = 179 + VOTING_CARD = 180 + HEALTH_CARD = 181 + CERTIFICATE_OF_CITIZENSHIP = 182 + ADDRESS_CARD = 183 + AIRPORT_IMMIGRATION_CARD = 184 + ALIEN_REGISTRATION_CARD = 185 + APEH_CARD = 186 + COUPON_TO_DRIVING_LICENSE = 187 + CREW_MEMBER_CERTIFICATE = 188 + DOCUMENT_FOR_RETURN = 189 + E_CARD = 190 + EMPLOYMENT_CARD = 191 + HKSAR_IMMIGRATION_FORM = 192 + IMMIGRANT_CARD = 193 + LABOUR_CARD = 194 + LAISSEZ_PASSER = 195 + LAWYER_IDENTITY_CERTIFICATE = 196 + LICENSE_CARD = 197 + PASSPORT_STATELESS = 198 + PASSPORT_CHILD = 199 + PASSPORT_CONSULAR = 200 + PASSPORT_DIPLOMATIC_SERVICE = 201 + PASSPORT_OFFICIAL = 202 + PASSPORT_PROVISIONAL = 203 + PASSPORT_SPECIAL = 204 + PERMISSION_TO_THE_LOCAL_BORDER_TRAFFIC = 205 + REGISTRATION_CERTIFICATE = 206 + SEDESOL_CARD = 207 + SOCIAL_CARD = 208 + TB_CARD = 209 + VEHICLE_PASSPORT = 210 + W_DOCUMENT = 211 + DIPLOMATIC_IDENTITY_CARD = 212 + CONSULAR_IDENTITY_CARD = 213 + INCOME_TAX_CARD = 214 + RESIDENCE_PERMIT = 215 + DOCUMENT_OF_IDENTITY = 216 + BORDER_CROSSING_PERMIT = 217 + PASSPORT_LIMITED_VALIDITY = 218 + SIM_CARD = 219 + TAX_CARD = 220 + COMPANY_CARD = 221 + DOMESTIC_PASSPORT = 222 + IDENTITY_CERTIFICATE = 223 + RESIDENT_ID_CARD = 224 + ARMED_FORCES_IDENTITY_CARD = 225 + PROFESSIONAL_CARD = 226 + REGISTRATION_STAMP = 227 + DRIVER_CARD = 228 + DRIVER_TRAINING_CERTIFICATE = 229 + QUALIFICATION_DRIVING_LICENSE = 230 + MEMBERSHIP_CARD = 231 + PUBLIC_VEHICLE_DRIVER_AUTHORITY_CARD = 232 + MARINE_LICENSE = 233 + TEMPORARY_LEARNER_LICENSE = 234 + TEMPORARY_COMMERCIAL_DRIVING_LICENSE = 235 + INTERIM_INSTRUCTIONAL_PERMIT = 236 + CERTIFICATE_OF_COMPETENCY = 237 + CERTIFICATE_OF_PROFICIENCY = 238 + TRADE_LICENSE = 239 + PASSPORT_PAGE = 240 + INVOICE = 241 + PASSENGER_LOCATOR_FORM = 242 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of DocumentType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_type_recognition_result.py b/regula/documentreader/webclient/gen/models/document_type_recognition_result.py old mode 100755 new mode 100644 index 86eb522..89cfe8d --- a/regula/documentreader/webclient/gen/models/document_type_recognition_result.py +++ b/regula/documentreader/webclient/gen/models/document_type_recognition_result.py @@ -4,96 +4,27 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentTypeRecognitionResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentTypeRecognitionResult(int, Enum): + """ + DocumentTypeRecognitionResult """ - - OK = int("0") - - UNKNOWN = int("15") - - NEED_MORE_IMAGES = int("29") - - allowable_values = [OK, UNKNOWN, NEED_MORE_IMAGES] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """DocumentTypeRecognitionResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentTypeRecognitionResult): - return False + OK = 0 + UNKNOWN = 15 + NEED_MORE_IMAGES = 29 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of DocumentTypeRecognitionResult from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentTypeRecognitionResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_types_candidates.py b/regula/documentreader/webclient/gen/models/document_types_candidates.py index 683141d..58c0731 100644 --- a/regula/documentreader/webclient/gen/models/document_types_candidates.py +++ b/regula/documentreader/webclient/gen/models/document_types_candidates.py @@ -4,142 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.document_type_recognition_result import DocumentTypeRecognitionResult +from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentTypesCandidates(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentTypesCandidates(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'rec_result': 'DocumentTypeRecognitionResult', - 'candidates': 'list[OneCandidate]' - } - - attribute_map = { - 'rec_result': 'RecResult', - 'candidates': 'Candidates' - } - - def __init__(self, rec_result=None, candidates=None, local_vars_configuration=None): # noqa: E501 - """DocumentTypesCandidates - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._rec_result = None - self._candidates = None - self.discriminator = None - - if rec_result is not None: - self.rec_result = rec_result - if candidates is not None: - self.candidates = candidates - - @property - def rec_result(self): - """Gets the rec_result of this DocumentTypesCandidates. # noqa: E501 - - - :return: The rec_result of this DocumentTypesCandidates. # noqa: E501 - :rtype: DocumentTypeRecognitionResult + DocumentTypesCandidates + """ # noqa: E501 + rec_result: Optional[DocumentTypeRecognitionResult] = Field(default=None, alias="RecResult") + candidates: Optional[List[OneCandidate]] = Field(default=None, alias="Candidates") + __properties: ClassVar[List[str]] = ["RecResult", "Candidates"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentTypesCandidates from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._rec_result - - @rec_result.setter - def rec_result(self, rec_result): - """Sets the rec_result of this DocumentTypesCandidates. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in candidates (list) + _items = [] + if self.candidates: + for _item_candidates in self.candidates: + if _item_candidates: + _items.append(_item_candidates.to_dict()) + _dict['Candidates'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentTypesCandidates from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RecResult": obj.get("RecResult"), + "Candidates": [OneCandidate.from_dict(_item) for _item in obj["Candidates"]] if obj.get("Candidates") is not None else None + }) + return _obj - :param rec_result: The rec_result of this DocumentTypesCandidates. # noqa: E501 - :type rec_result: DocumentTypeRecognitionResult - """ - - self._rec_result = rec_result - - @property - def candidates(self): - """Gets the candidates of this DocumentTypesCandidates. # noqa: E501 - - - :return: The candidates of this DocumentTypesCandidates. # noqa: E501 - :rtype: list[OneCandidate] - """ - return self._candidates - - @candidates.setter - def candidates(self, candidates): - """Sets the candidates of this DocumentTypesCandidates. - - - :param candidates: The candidates of this DocumentTypesCandidates. # noqa: E501 - :type candidates: list[OneCandidate] - """ - self._candidates = candidates - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentTypesCandidates): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentTypesCandidates): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_types_candidates_list.py b/regula/documentreader/webclient/gen/models/document_types_candidates_list.py old mode 100755 new mode 100644 index 35a4dc5..498b566 --- a/regula/documentreader/webclient/gen/models/document_types_candidates_list.py +++ b/regula/documentreader/webclient/gen/models/document_types_candidates_list.py @@ -4,142 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.document_type_recognition_result import DocumentTypeRecognitionResult +from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentTypesCandidatesList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentTypesCandidatesList(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'rec_result': 'DocumentTypeRecognitionResult', - 'candidates': 'list[OneCandidate]' - } - - attribute_map = { - 'rec_result': 'RecResult', - 'candidates': 'Candidates' - } - - def __init__(self, rec_result=None, candidates=None, local_vars_configuration=None): # noqa: E501 - """DocumentTypesCandidatesList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._rec_result = None - self._candidates = None - self.discriminator = None - - if rec_result is not None: - self.rec_result = rec_result - if candidates is not None: - self.candidates = candidates - - @property - def rec_result(self): - """Gets the rec_result of this DocumentTypesCandidatesList. # noqa: E501 - - - :return: The rec_result of this DocumentTypesCandidatesList. # noqa: E501 - :rtype: DocumentTypeRecognitionResult + DocumentTypesCandidatesList + """ # noqa: E501 + rec_result: Optional[DocumentTypeRecognitionResult] = Field(default=None, alias="RecResult") + candidates: Optional[List[OneCandidate]] = Field(default=None, alias="Candidates") + __properties: ClassVar[List[str]] = ["RecResult", "Candidates"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentTypesCandidatesList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._rec_result - - @rec_result.setter - def rec_result(self, rec_result): - """Sets the rec_result of this DocumentTypesCandidatesList. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in candidates (list) + _items = [] + if self.candidates: + for _item_candidates in self.candidates: + if _item_candidates: + _items.append(_item_candidates.to_dict()) + _dict['Candidates'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentTypesCandidatesList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RecResult": obj.get("RecResult"), + "Candidates": [OneCandidate.from_dict(_item) for _item in obj["Candidates"]] if obj.get("Candidates") is not None else None + }) + return _obj - :param rec_result: The rec_result of this DocumentTypesCandidatesList. # noqa: E501 - :type rec_result: DocumentTypeRecognitionResult - """ - - self._rec_result = rec_result - - @property - def candidates(self): - """Gets the candidates of this DocumentTypesCandidatesList. # noqa: E501 - - - :return: The candidates of this DocumentTypesCandidatesList. # noqa: E501 - :rtype: list[OneCandidate] - """ - return self._candidates - - @candidates.setter - def candidates(self, candidates): - """Sets the candidates of this DocumentTypesCandidatesList. - - - :param candidates: The candidates of this DocumentTypesCandidatesList. # noqa: E501 - :type candidates: list[OneCandidate] - """ - self._candidates = candidates - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentTypesCandidatesList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentTypesCandidatesList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_types_candidates_result.py b/regula/documentreader/webclient/gen/models/document_types_candidates_result.py old mode 100755 new mode 100644 index a9a6039..b341d37 --- a/regula/documentreader/webclient/gen/models/document_types_candidates_result.py +++ b/regula/documentreader/webclient/gen/models/document_types_candidates_result.py @@ -4,249 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.document_types_candidates_list import DocumentTypesCandidatesList +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentTypesCandidatesResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentTypesCandidatesResult(ResultItem): """ + DocumentTypesCandidatesResult + """ # noqa: E501 + candidates_list: Optional[DocumentTypesCandidatesList] = Field(default=None, alias="CandidatesList") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "CandidatesList"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'candidates_list': 'DocumentTypesCandidatesList', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'candidates_list': 'CandidatesList', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, candidates_list=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """DocumentTypesCandidatesResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._candidates_list = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - if candidates_list is not None: - self.candidates_list = candidates_list - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def candidates_list(self): - """Gets the candidates_list of this DocumentTypesCandidatesResult. # noqa: E501 - - - :return: The candidates_list of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: DocumentTypesCandidatesList - """ - return self._candidates_list - - @candidates_list.setter - def candidates_list(self, candidates_list): - """Sets the candidates_list of this DocumentTypesCandidatesResult. - - - :param candidates_list: The candidates_list of this DocumentTypesCandidatesResult. # noqa: E501 - :type candidates_list: DocumentTypesCandidatesList - """ - - self._candidates_list = candidates_list - - @property - def buf_length(self): - """Gets the buf_length of this DocumentTypesCandidatesResult. # noqa: E501 - - - :return: The buf_length of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this DocumentTypesCandidatesResult. - - - :param buf_length: The buf_length of this DocumentTypesCandidatesResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this DocumentTypesCandidatesResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this DocumentTypesCandidatesResult. - - - :param light: The light of this DocumentTypesCandidatesResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this DocumentTypesCandidatesResult. # noqa: E501 - - - :return: The list_idx of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this DocumentTypesCandidatesResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this DocumentTypesCandidatesResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this DocumentTypesCandidatesResult. # noqa: E501 - - - :return: The page_idx of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this DocumentTypesCandidatesResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentTypesCandidatesResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this DocumentTypesCandidatesResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this DocumentTypesCandidatesResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this DocumentTypesCandidatesResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this DocumentTypesCandidatesResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of candidates_list + if self.candidates_list: + _dict['CandidatesList'] = self.candidates_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentTypesCandidatesResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "CandidatesList": DocumentTypesCandidatesList.from_dict(obj["CandidatesList"]) if obj.get("CandidatesList") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this DocumentTypesCandidatesResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentTypesCandidatesResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentTypesCandidatesResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/document_types_candidates_result_all_of.py b/regula/documentreader/webclient/gen/models/document_types_candidates_result_all_of.py deleted file mode 100755 index 755ddd1..0000000 --- a/regula/documentreader/webclient/gen/models/document_types_candidates_result_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class DocumentTypesCandidatesResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'candidates_list': 'DocumentTypesCandidatesList' - } - - attribute_map = { - 'candidates_list': 'CandidatesList' - } - - def __init__(self, candidates_list=None, local_vars_configuration=None): # noqa: E501 - """DocumentTypesCandidatesResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._candidates_list = None - self.discriminator = None - - if candidates_list is not None: - self.candidates_list = candidates_list - - @property - def candidates_list(self): - """Gets the candidates_list of this DocumentTypesCandidatesResultAllOf. # noqa: E501 - - - :return: The candidates_list of this DocumentTypesCandidatesResultAllOf. # noqa: E501 - :rtype: DocumentTypesCandidatesList - """ - return self._candidates_list - - @candidates_list.setter - def candidates_list(self, candidates_list): - """Sets the candidates_list of this DocumentTypesCandidatesResultAllOf. - - - :param candidates_list: The candidates_list of this DocumentTypesCandidatesResultAllOf. # noqa: E501 - :type candidates_list: DocumentTypesCandidatesList - """ - - self._candidates_list = candidates_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentTypesCandidatesResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentTypesCandidatesResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/documents_database.py b/regula/documentreader/webclient/gen/models/documents_database.py index 6622991..47f3a86 100644 --- a/regula/documentreader/webclient/gen/models/documents_database.py +++ b/regula/documentreader/webclient/gen/models/documents_database.py @@ -4,202 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Document database information -""" -class DocumentsDatabase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class DocumentsDatabase(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'description': 'str', - 'export_date': 'str', - 'id': 'str', - 'version': 'str' - } - - attribute_map = { - 'description': 'Description', - 'export_date': 'ExportDate', - 'id': 'ID', - 'version': 'Version' - } - - def __init__(self, description=None, export_date=None, id=None, version=None, local_vars_configuration=None): # noqa: E501 - """DocumentsDatabase - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._description = None - self._export_date = None - self._id = None - self._version = None - self.discriminator = None - - if description is not None: - self.description = description - if export_date is not None: - self.export_date = export_date - if id is not None: - self.id = id - if version is not None: - self.version = version - - @property - def description(self): - """Gets the description of this DocumentsDatabase. # noqa: E501 - - Document database description # noqa: E501 - - :return: The description of this DocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._description - - @description.setter - def description(self, description): - """Sets the description of this DocumentsDatabase. - - Document database description # noqa: E501 - - :param description: The description of this DocumentsDatabase. # noqa: E501 - :type description: str - """ - - self._description = description - - @property - def export_date(self): - """Gets the export_date of this DocumentsDatabase. # noqa: E501 - - Date the document database was created # noqa: E501 - - :return: The export_date of this DocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._export_date - - @export_date.setter - def export_date(self, export_date): - """Sets the export_date of this DocumentsDatabase. - - Date the document database was created # noqa: E501 - - :param export_date: The export_date of this DocumentsDatabase. # noqa: E501 - :type export_date: str - """ - - self._export_date = export_date - - @property - def id(self): - """Gets the id of this DocumentsDatabase. # noqa: E501 - - Document database identifier # noqa: E501 - - :return: The id of this DocumentsDatabase. # noqa: E501 - :rtype: str + Document database information + """ # noqa: E501 + description: Optional[StrictStr] = Field(default=None, description="Document database description", alias="Description") + export_date: Optional[StrictStr] = Field(default=None, description="Date the document database was created", alias="ExportDate") + id: Optional[StrictStr] = Field(default=None, description="Document database identifier", alias="ID") + version: Optional[StrictStr] = Field(default=None, description="Document database version", alias="Version") + __properties: ClassVar[List[str]] = ["Description", "ExportDate", "ID", "Version"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of DocumentsDatabase from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._id - - @id.setter - def id(self, id): - """Sets the id of this DocumentsDatabase. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of DocumentsDatabase from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Description": obj.get("Description"), + "ExportDate": obj.get("ExportDate"), + "ID": obj.get("ID"), + "Version": obj.get("Version") + }) + return _obj - Document database identifier # noqa: E501 - - :param id: The id of this DocumentsDatabase. # noqa: E501 - :type id: str - """ - - self._id = id - - @property - def version(self): - """Gets the version of this DocumentsDatabase. # noqa: E501 - - Document database version # noqa: E501 - - :return: The version of this DocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this DocumentsDatabase. - - Document database version # noqa: E501 - - :param version: The version of this DocumentsDatabase. # noqa: E501 - :type version: str - """ - self._version = version - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, DocumentsDatabase): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, DocumentsDatabase): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/encrypted_rcl_item.py b/regula/documentreader/webclient/gen/models/encrypted_rcl_item.py new file mode 100644 index 0000000..735de62 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/encrypted_rcl_item.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictBytes, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from typing import Optional, Set +from typing_extensions import Self + +class EncryptedRCLItem(BaseModel): + """ + EncryptedRCLItem + """ # noqa: E501 + encrypted_rcl: Union[StrictBytes, StrictStr] = Field(description="Base64 encoded data", alias="EncryptedRCL") + __properties: ClassVar[List[str]] = ["EncryptedRCL"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of EncryptedRCLItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of EncryptedRCLItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "EncryptedRCL": obj.get("EncryptedRCL") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/encrypted_rcl_result.py b/regula/documentreader/webclient/gen/models/encrypted_rcl_result.py index f26bd48..0920406 100644 --- a/regula/documentreader/webclient/gen/models/encrypted_rcl_result.py +++ b/regula/documentreader/webclient/gen/models/encrypted_rcl_result.py @@ -4,252 +4,83 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field, StrictBytes, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class EncryptedRCLResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class EncryptedRCLResult(ResultItem): """ + Contains encrypted result container list + """ # noqa: E501 + encrypted_rcl: Union[StrictBytes, StrictStr] = Field(description="Base64 encoded data", alias="EncryptedRCL") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "EncryptedRCL"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'encrypted_rcl': 'str', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'encrypted_rcl': 'EncryptedRCL', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, encrypted_rcl=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """EncryptedRCLResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._encrypted_rcl = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.encrypted_rcl = encrypted_rcl - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def encrypted_rcl(self): - """Gets the encrypted_rcl of this EncryptedRCLResult. # noqa: E501 - - Base64 encoded data # noqa: E501 - - :return: The encrypted_rcl of this EncryptedRCLResult. # noqa: E501 - :rtype: str - """ - return self._encrypted_rcl - - @encrypted_rcl.setter - def encrypted_rcl(self, encrypted_rcl): - """Sets the encrypted_rcl of this EncryptedRCLResult. - - Base64 encoded data # noqa: E501 - - :param encrypted_rcl: The encrypted_rcl of this EncryptedRCLResult. # noqa: E501 - :type encrypted_rcl: str - """ - if self.local_vars_configuration.client_side_validation and encrypted_rcl is None: # noqa: E501 - raise ValueError("Invalid value for `encrypted_rcl`, must not be `None`") # noqa: E501 - - self._encrypted_rcl = encrypted_rcl - - @property - def buf_length(self): - """Gets the buf_length of this EncryptedRCLResult. # noqa: E501 - - - :return: The buf_length of this EncryptedRCLResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this EncryptedRCLResult. - - - :param buf_length: The buf_length of this EncryptedRCLResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this EncryptedRCLResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this EncryptedRCLResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this EncryptedRCLResult. - - - :param light: The light of this EncryptedRCLResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this EncryptedRCLResult. # noqa: E501 - - - :return: The list_idx of this EncryptedRCLResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this EncryptedRCLResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this EncryptedRCLResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this EncryptedRCLResult. # noqa: E501 - - - :return: The page_idx of this EncryptedRCLResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this EncryptedRCLResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of EncryptedRCLResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this EncryptedRCLResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this EncryptedRCLResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this EncryptedRCLResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this EncryptedRCLResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of EncryptedRCLResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "EncryptedRCL": obj.get("EncryptedRCL") + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this EncryptedRCLResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, EncryptedRCLResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, EncryptedRCLResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/encrypted_rcl_result_all_of.py b/regula/documentreader/webclient/gen/models/encrypted_rcl_result_all_of.py deleted file mode 100644 index 94e971e..0000000 --- a/regula/documentreader/webclient/gen/models/encrypted_rcl_result_all_of.py +++ /dev/null @@ -1,122 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains encrypted result container list -""" -class EncryptedRCLResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'encrypted_rcl': 'str' - } - - attribute_map = { - 'encrypted_rcl': 'EncryptedRCL' - } - - def __init__(self, encrypted_rcl=None, local_vars_configuration=None): # noqa: E501 - """EncryptedRCLResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._encrypted_rcl = None - self.discriminator = None - - self.encrypted_rcl = encrypted_rcl - - @property - def encrypted_rcl(self): - """Gets the encrypted_rcl of this EncryptedRCLResultAllOf. # noqa: E501 - - Base64 encoded data # noqa: E501 - - :return: The encrypted_rcl of this EncryptedRCLResultAllOf. # noqa: E501 - :rtype: str - """ - return self._encrypted_rcl - - @encrypted_rcl.setter - def encrypted_rcl(self, encrypted_rcl): - """Sets the encrypted_rcl of this EncryptedRCLResultAllOf. - - Base64 encoded data # noqa: E501 - - :param encrypted_rcl: The encrypted_rcl of this EncryptedRCLResultAllOf. # noqa: E501 - :type encrypted_rcl: str - """ - if self.local_vars_configuration.client_side_validation and encrypted_rcl is None: # noqa: E501 - raise ValueError("Invalid value for `encrypted_rcl`, must not be `None`") # noqa: E501 - - self._encrypted_rcl = encrypted_rcl - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, EncryptedRCLResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, EncryptedRCLResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/error_coordinates.py b/regula/documentreader/webclient/gen/models/error_coordinates.py new file mode 100644 index 0000000..9b95cb0 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/error_coordinates.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing import Optional, Set +from typing_extensions import Self + +class ErrorCoordinates(BaseModel): + """ + ErrorCoordinates + """ # noqa: E501 + left: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, alias="Left") + top: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, alias="Top") + right: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, alias="Right") + bottom: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, alias="Bottom") + __properties: ClassVar[List[str]] = ["Left", "Top", "Right", "Bottom"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ErrorCoordinates from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ErrorCoordinates from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Left": obj.get("Left"), + "Top": obj.get("Top"), + "Right": obj.get("Right"), + "Bottom": obj.get("Bottom") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/face_api.py b/regula/documentreader/webclient/gen/models/face_api.py index 12d8a7c..cdae3e6 100644 --- a/regula/documentreader/webclient/gen/models/face_api.py +++ b/regula/documentreader/webclient/gen/models/face_api.py @@ -4,368 +4,98 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.face_api_search import FaceApiSearch +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class FaceApi(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class FaceApi(BaseModel): """ - openapi_types = { - 'url': 'str', - 'mode': 'str', - 'search': 'FaceApiSearch', - 'threshold': 'int', - 'service_timeout': 'int', - 'proxy': 'str', - 'proxy_userpwd': 'str', - 'proxy_type': 'int', - 'child_age_threshold': 'int', - 'child_doc_validity_years': 'int' - } - - attribute_map = { - 'url': 'url', - 'mode': 'mode', - 'search': 'search', - 'threshold': 'threshold', - 'service_timeout': 'serviceTimeout', - 'proxy': 'proxy', - 'proxy_userpwd': 'proxy_userpwd', - 'proxy_type': 'proxy_type', - 'child_age_threshold': 'childAgeThreshold', - 'child_doc_validity_years': 'childDocValidityYears' - } - - def __init__(self, url=None, mode=None, search=None, threshold=None, service_timeout=None, proxy=None, proxy_userpwd=None, proxy_type=None, child_age_threshold=None, child_doc_validity_years=None, local_vars_configuration=None): # noqa: E501 - """FaceApi - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._url = None - self._mode = None - self._search = None - self._threshold = None - self._service_timeout = None - self._proxy = None - self._proxy_userpwd = None - self._proxy_type = None - self._child_age_threshold = None - self._child_doc_validity_years = None - self.discriminator = None - - if url is not None: - self.url = url - if mode is not None: - self.mode = mode - if search is not None: - self.search = search - if threshold is not None: - self.threshold = threshold - if service_timeout is not None: - self.service_timeout = service_timeout - if proxy is not None: - self.proxy = proxy - if proxy_userpwd is not None: - self.proxy_userpwd = proxy_userpwd - if proxy_type is not None: - self.proxy_type = proxy_type - if child_age_threshold is not None: - self.child_age_threshold = child_age_threshold - if child_doc_validity_years is not None: - self.child_doc_validity_years = child_doc_validity_years - - @property - def url(self): - """Gets the url of this FaceApi. # noqa: E501 - - The URL of the Regula Face Web service to be used. # noqa: E501 - - :return: The url of this FaceApi. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this FaceApi. - - The URL of the Regula Face Web service to be used. # noqa: E501 - - :param url: The url of this FaceApi. # noqa: E501 - :type url: str - """ - - self._url = url - - @property - def mode(self): - """Gets the mode of this FaceApi. # noqa: E501 - - The processing mode: \"match\" or \"match+search\". # noqa: E501 - - :return: The mode of this FaceApi. # noqa: E501 - :rtype: str - """ - return self._mode - - @mode.setter - def mode(self, mode): - """Sets the mode of this FaceApi. - - The processing mode: \"match\" or \"match+search\". # noqa: E501 - - :param mode: The mode of this FaceApi. # noqa: E501 - :type mode: str - """ - - self._mode = mode - - @property - def search(self): - """Gets the search of this FaceApi. # noqa: E501 - - - :return: The search of this FaceApi. # noqa: E501 - :rtype: FaceApiSearch - """ - return self._search - - @search.setter - def search(self, search): - """Sets the search of this FaceApi. - - - :param search: The search of this FaceApi. # noqa: E501 - :type search: FaceApiSearch - """ - - self._search = search - - @property - def threshold(self): - """Gets the threshold of this FaceApi. # noqa: E501 - - The similarity threshold, 0-100. Above 75 means that the faces' similarity is verified, below 75 is not. # noqa: E501 - - :return: The threshold of this FaceApi. # noqa: E501 - :rtype: int - """ - return self._threshold - - @threshold.setter - def threshold(self, threshold): - """Sets the threshold of this FaceApi. - - The similarity threshold, 0-100. Above 75 means that the faces' similarity is verified, below 75 is not. # noqa: E501 - - :param threshold: The threshold of this FaceApi. # noqa: E501 - :type threshold: int - """ - - self._threshold = threshold - - @property - def service_timeout(self): - """Gets the service_timeout of this FaceApi. # noqa: E501 - - The Regula Face Web service requests timeout, ms. # noqa: E501 - - :return: The service_timeout of this FaceApi. # noqa: E501 - :rtype: int - """ - return self._service_timeout - - @service_timeout.setter - def service_timeout(self, service_timeout): - """Sets the service_timeout of this FaceApi. - - The Regula Face Web service requests timeout, ms. # noqa: E501 - - :param service_timeout: The service_timeout of this FaceApi. # noqa: E501 - :type service_timeout: int - """ - - self._service_timeout = service_timeout - - @property - def proxy(self): - """Gets the proxy of this FaceApi. # noqa: E501 - - Proxy to use, should be set according to the cURL standard. # noqa: E501 - - :return: The proxy of this FaceApi. # noqa: E501 - :rtype: str - """ - return self._proxy - - @proxy.setter - def proxy(self, proxy): - """Sets the proxy of this FaceApi. - - Proxy to use, should be set according to the cURL standard. # noqa: E501 - - :param proxy: The proxy of this FaceApi. # noqa: E501 - :type proxy: str - """ - - self._proxy = proxy - - @property - def proxy_userpwd(self): - """Gets the proxy_userpwd of this FaceApi. # noqa: E501 - - Username and password to use for proxy authentication, should be set according to the cURL standard. # noqa: E501 - - :return: The proxy_userpwd of this FaceApi. # noqa: E501 - :rtype: str - """ - return self._proxy_userpwd - - @proxy_userpwd.setter - def proxy_userpwd(self, proxy_userpwd): - """Sets the proxy_userpwd of this FaceApi. - - Username and password to use for proxy authentication, should be set according to the cURL standard. # noqa: E501 - - :param proxy_userpwd: The proxy_userpwd of this FaceApi. # noqa: E501 - :type proxy_userpwd: str - """ - - self._proxy_userpwd = proxy_userpwd - - @property - def proxy_type(self): - """Gets the proxy_type of this FaceApi. # noqa: E501 - - Proxy protocol type, should be set according to the cURL standard. # noqa: E501 - - :return: The proxy_type of this FaceApi. # noqa: E501 - :rtype: int - """ - return self._proxy_type - - @proxy_type.setter - def proxy_type(self, proxy_type): - """Sets the proxy_type of this FaceApi. - - Proxy protocol type, should be set according to the cURL standard. # noqa: E501 - - :param proxy_type: The proxy_type of this FaceApi. # noqa: E501 - :type proxy_type: int - """ - - self._proxy_type = proxy_type - - @property - def child_age_threshold(self): - """Gets the child_age_threshold of this FaceApi. # noqa: E501 - - The age threshold for the portrait comparison. Default: 13. # noqa: E501 - - :return: The child_age_threshold of this FaceApi. # noqa: E501 - :rtype: int - """ - return self._child_age_threshold - - @child_age_threshold.setter - def child_age_threshold(self, child_age_threshold): - """Sets the child_age_threshold of this FaceApi. - - The age threshold for the portrait comparison. Default: 13. # noqa: E501 - - :param child_age_threshold: The child_age_threshold of this FaceApi. # noqa: E501 - :type child_age_threshold: int - """ - - self._child_age_threshold = child_age_threshold - - @property - def child_doc_validity_years(self): - """Gets the child_doc_validity_years of this FaceApi. # noqa: E501 - - Estimated duration of validity for a child's passport, years. Default: 5. # noqa: E501 - - :return: The child_doc_validity_years of this FaceApi. # noqa: E501 - :rtype: int - """ - return self._child_doc_validity_years - - @child_doc_validity_years.setter - def child_doc_validity_years(self, child_doc_validity_years): - """Sets the child_doc_validity_years of this FaceApi. - - Estimated duration of validity for a child's passport, years. Default: 5. # noqa: E501 - - :param child_doc_validity_years: The child_doc_validity_years of this FaceApi. # noqa: E501 - :type child_doc_validity_years: int - """ - - self._child_doc_validity_years = child_doc_validity_years - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, FaceApi): - return False - - return self.to_dict() == other.to_dict() + FaceApi + """ # noqa: E501 + url: Optional[StrictStr] = Field(default=None, description="The URL of the Regula Face Web service to be used.") + mode: Optional[StrictStr] = Field(default=None, description="The processing mode: \"match\" or \"match+search\".") + search: Optional[FaceApiSearch] = None + threshold: Optional[StrictInt] = Field(default=None, description="The similarity threshold, 0-100. Above 75 means that the faces' similarity is verified, below 75 is not.") + service_timeout: Optional[StrictInt] = Field(default=None, description="The Regula Face Web service requests timeout, ms.", alias="serviceTimeout") + proxy: Optional[StrictStr] = Field(default=None, description="Proxy to use, should be set according to the cURL standard.") + proxy_userpwd: Optional[StrictStr] = Field(default=None, description="Username and password to use for proxy authentication, should be set according to the cURL standard.") + proxy_type: Optional[StrictInt] = Field(default=None, description="Proxy protocol type, should be set according to the cURL standard.") + child_age_threshold: Optional[StrictInt] = Field(default=None, description="The age threshold for the portrait comparison. Default: 13.", alias="childAgeThreshold") + child_doc_validity_years: Optional[StrictInt] = Field(default=None, description="Estimated duration of validity for a child's passport, years. Default: 5.", alias="childDocValidityYears") + __properties: ClassVar[List[str]] = ["url", "mode", "search", "threshold", "serviceTimeout", "proxy", "proxy_userpwd", "proxy_type", "childAgeThreshold", "childDocValidityYears"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceApi from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of search + if self.search: + _dict['search'] = self.search.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceApi from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "url": obj.get("url"), + "mode": obj.get("mode"), + "search": FaceApiSearch.from_dict(obj["search"]) if obj.get("search") is not None else None, + "threshold": obj.get("threshold"), + "serviceTimeout": obj.get("serviceTimeout"), + "proxy": obj.get("proxy"), + "proxy_userpwd": obj.get("proxy_userpwd"), + "proxy_type": obj.get("proxy_type"), + "childAgeThreshold": obj.get("childAgeThreshold"), + "childDocValidityYears": obj.get("childDocValidityYears") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, FaceApi): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/face_api_search.py b/regula/documentreader/webclient/gen/models/face_api_search.py index 7e6c8cd..af98df7 100644 --- a/regula/documentreader/webclient/gen/models/face_api_search.py +++ b/regula/documentreader/webclient/gen/models/face_api_search.py @@ -4,174 +4,80 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -A search filter that can be applied if the "match+search" mode is enabled. May include limit, threshold, group_ids. If the group_ids are specified, the search is performed only in these groups. Find more information in the <a href="https://dev.regulaforensics.com/FaceSDK-web-openapi/#tag/search/operation/search" target="_blank">OpenAPI documentation</a>. -""" -class FaceApiSearch(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing import Optional, Set +from typing_extensions import Self +class FaceApiSearch(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'limit': 'int', - 'threshold': 'float', - 'group_ids': 'list[int]' - } - - attribute_map = { - 'limit': 'limit', - 'threshold': 'threshold', - 'group_ids': 'group_ids' - } - - def __init__(self, limit=None, threshold=None, group_ids=None, local_vars_configuration=None): # noqa: E501 - """FaceApiSearch - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._limit = None - self._threshold = None - self._group_ids = None - self.discriminator = None - - if limit is not None: - self.limit = limit - if threshold is not None: - self.threshold = threshold - if group_ids is not None: - self.group_ids = group_ids - - @property - def limit(self): - """Gets the limit of this FaceApiSearch. # noqa: E501 - - The maximum number of results to be returned. # noqa: E501 - - :return: The limit of this FaceApiSearch. # noqa: E501 - :rtype: int - """ - return self._limit - - @limit.setter - def limit(self, limit): - """Sets the limit of this FaceApiSearch. - - The maximum number of results to be returned. # noqa: E501 - - :param limit: The limit of this FaceApiSearch. # noqa: E501 - :type limit: int + A search filter that can be applied if the \"match+search\" mode is enabled. May include limit, threshold, group_ids. If the group_ids are specified, the search is performed only in these groups. Find more information in the OpenAPI documentation. + """ # noqa: E501 + limit: Optional[StrictInt] = Field(default=None, description="The maximum number of results to be returned.") + threshold: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="The similarity threshold.") + group_ids: Optional[List[StrictInt]] = Field(default=None, description=" The groups where to conduct the search.") + __properties: ClassVar[List[str]] = ["limit", "threshold", "group_ids"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceApiSearch from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ + excluded_fields: Set[str] = set([ + ]) - self._limit = limit + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - @property - def threshold(self): - """Gets the threshold of this FaceApiSearch. # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceApiSearch from a dict""" + if obj is None: + return None - The similarity threshold. # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The threshold of this FaceApiSearch. # noqa: E501 - :rtype: float - """ - return self._threshold + _obj = cls.model_validate({ + "limit": obj.get("limit"), + "threshold": obj.get("threshold"), + "group_ids": obj.get("group_ids") + }) + return _obj - @threshold.setter - def threshold(self, threshold): - """Sets the threshold of this FaceApiSearch. - - The similarity threshold. # noqa: E501 - - :param threshold: The threshold of this FaceApiSearch. # noqa: E501 - :type threshold: float - """ - - self._threshold = threshold - - @property - def group_ids(self): - """Gets the group_ids of this FaceApiSearch. # noqa: E501 - - The groups where to conduct the search. # noqa: E501 - - :return: The group_ids of this FaceApiSearch. # noqa: E501 - :rtype: list[int] - """ - return self._group_ids - - @group_ids.setter - def group_ids(self, group_ids): - """Sets the group_ids of this FaceApiSearch. - - The groups where to conduct the search. # noqa: E501 - - :param group_ids: The group_ids of this FaceApiSearch. # noqa: E501 - :type group_ids: list[int] - """ - self._group_ids = group_ids - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, FaceApiSearch): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, FaceApiSearch): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/face_detection.py b/regula/documentreader/webclient/gen/models/face_detection.py new file mode 100644 index 0000000..1540407 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/face_detection.py @@ -0,0 +1,95 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.face_item import FaceItem +from typing import Optional, Set +from typing_extensions import Self + +class FaceDetection(BaseModel): + """ + FaceDetection + """ # noqa: E501 + count: StrictInt = Field(alias="Count") + count_false_detection: StrictInt = Field(alias="CountFalseDetection") + res: List[FaceItem] = Field(alias="Res") + reserved1: Optional[StrictInt] = Field(default=None, alias="Reserved1") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + __properties: ClassVar[List[str]] = ["Count", "CountFalseDetection", "Res", "Reserved1", "Reserved2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceDetection from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in res (list) + _items = [] + if self.res: + for _item_res in self.res: + if _item_res: + _items.append(_item_res.to_dict()) + _dict['Res'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceDetection from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "CountFalseDetection": obj.get("CountFalseDetection"), + "Res": [FaceItem.from_dict(_item) for _item in obj["Res"]] if obj.get("Res") is not None else None, + "Reserved1": obj.get("Reserved1"), + "Reserved2": obj.get("Reserved2") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/face_detection_item.py b/regula/documentreader/webclient/gen/models/face_detection_item.py new file mode 100644 index 0000000..f3b1e28 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/face_detection_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.face_detection import FaceDetection +from typing import Optional, Set +from typing_extensions import Self + +class FaceDetectionItem(BaseModel): + """ + FaceDetectionItem + """ # noqa: E501 + face_detection: FaceDetection = Field(alias="FaceDetection") + __properties: ClassVar[List[str]] = ["FaceDetection"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceDetectionItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of face_detection + if self.face_detection: + _dict['FaceDetection'] = self.face_detection.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceDetectionItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FaceDetection": FaceDetection.from_dict(obj["FaceDetection"]) if obj.get("FaceDetection") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/face_detection_result.py b/regula/documentreader/webclient/gen/models/face_detection_result.py new file mode 100644 index 0000000..208b77a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/face_detection_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.face_detection import FaceDetection +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self + +class FaceDetectionResult(ResultItem): + """ + FaceDetectionResult + """ # noqa: E501 + face_detection: FaceDetection = Field(alias="FaceDetection") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "FaceDetection"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceDetectionResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of face_detection + if self.face_detection: + _dict['FaceDetection'] = self.face_detection.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceDetectionResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "FaceDetection": FaceDetection.from_dict(obj["FaceDetection"]) if obj.get("FaceDetection") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/face_item.py b/regula/documentreader/webclient/gen/models/face_item.py new file mode 100644 index 0000000..849b717 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/face_item.py @@ -0,0 +1,109 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.point import Point +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class FaceItem(BaseModel): + """ + FaceItem + """ # noqa: E501 + coincidence_to_photo_area: StrictInt = Field(alias="CoincidenceToPhotoArea") + face_rect: RectangleCoordinates = Field(alias="FaceRect") + field_rect: RectangleCoordinates = Field(alias="FieldRect") + graph_field_number: StrictInt = Field(alias="GraphFieldNumber") + landmarks: List[Point] = Field(alias="Landmarks") + light_type: Light = Field(alias="LightType") + orientation: StrictInt = Field(alias="Orientation") + probability: StrictInt = Field(alias="Probability") + __properties: ClassVar[List[str]] = ["CoincidenceToPhotoArea", "FaceRect", "FieldRect", "GraphFieldNumber", "Landmarks", "LightType", "Orientation", "Probability"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FaceItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of face_rect + if self.face_rect: + _dict['FaceRect'] = self.face_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in landmarks (list) + _items = [] + if self.landmarks: + for _item_landmarks in self.landmarks: + if _item_landmarks: + _items.append(_item_landmarks.to_dict()) + _dict['Landmarks'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FaceItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "CoincidenceToPhotoArea": obj.get("CoincidenceToPhotoArea"), + "FaceRect": RectangleCoordinates.from_dict(obj["FaceRect"]) if obj.get("FaceRect") is not None else None, + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None, + "GraphFieldNumber": obj.get("GraphFieldNumber"), + "Landmarks": [Point.from_dict(_item) for _item in obj["Landmarks"]] if obj.get("Landmarks") is not None else None, + "LightType": obj.get("LightType"), + "Orientation": obj.get("Orientation"), + "Probability": obj.get("Probability") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/fdsid_list.py b/regula/documentreader/webclient/gen/models/fdsid_list.py index 1e1471e..0f2e0f4 100644 --- a/regula/documentreader/webclient/gen/models/fdsid_list.py +++ b/regula/documentreader/webclient/gen/models/fdsid_list.py @@ -4,400 +4,101 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.document_format import DocumentFormat +from regula.documentreader.webclient.gen.models.document_type import DocumentType +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Extended document type info and Regula's 'Information Reference Systems' links -""" -class FDSIDList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class FDSIDList(BaseModel): """ - openapi_types = { - 'icao_code': 'str', - 'list': 'list[int]', - 'd_type': 'DocumentType', - 'd_format': 'DocumentFormat', - 'd_mrz': 'bool', - 'd_description': 'str', - 'd_year': 'str', - 'd_country_name': 'str', - 'd_state_code': 'str', - 'd_state_name': 'str', - 'is_deprecated': 'bool' - } - - attribute_map = { - 'icao_code': 'ICAOCode', - 'list': 'List', - 'd_type': 'dType', - 'd_format': 'dFormat', - 'd_mrz': 'dMRZ', - 'd_description': 'dDescription', - 'd_year': 'dYear', - 'd_country_name': 'dCountryName', - 'd_state_code': 'dStateCode', - 'd_state_name': 'dStateName', - 'is_deprecated': 'isDeprecated' - } - - def __init__(self, icao_code=None, list=None, d_type=None, d_format=None, d_mrz=None, d_description=None, d_year=None, d_country_name=None, d_state_code=None, d_state_name=None, is_deprecated=None, local_vars_configuration=None): # noqa: E501 - """FDSIDList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._icao_code = None - self._list = None - self._d_type = None - self._d_format = None - self._d_mrz = None - self._d_description = None - self._d_year = None - self._d_country_name = None - self._d_state_code = None - self._d_state_name = None - self._is_deprecated = None - self.discriminator = None - - if icao_code is not None: - self.icao_code = icao_code - if list is not None: - self.list = list - if d_type is not None: - self.d_type = d_type - if d_format is not None: - self.d_format = d_format - if d_mrz is not None: - self.d_mrz = d_mrz - if d_description is not None: - self.d_description = d_description - if d_year is not None: - self.d_year = d_year - if d_country_name is not None: - self.d_country_name = d_country_name - if d_state_code is not None: - self.d_state_code = d_state_code - if d_state_name is not None: - self.d_state_name = d_state_name - if is_deprecated is not None: - self.is_deprecated = is_deprecated - - @property - def icao_code(self): - """Gets the icao_code of this FDSIDList. # noqa: E501 - - ICAO code of the issuing country # noqa: E501 - - :return: The icao_code of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._icao_code - - @icao_code.setter - def icao_code(self, icao_code): - """Sets the icao_code of this FDSIDList. - - ICAO code of the issuing country # noqa: E501 - - :param icao_code: The icao_code of this FDSIDList. # noqa: E501 - :type icao_code: str - """ - if (self.local_vars_configuration.client_side_validation and - icao_code is not None and len(icao_code) > 3): - raise ValueError("Invalid value for `icao_code`, length must be less than or equal to `3`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - icao_code is not None and len(icao_code) < 3): - raise ValueError("Invalid value for `icao_code`, length must be greater than or equal to `3`") # noqa: E501 - - self._icao_code = icao_code - - @property - def list(self): - """Gets the list of this FDSIDList. # noqa: E501 - - Document identifiers in 'Information Reference Systems' # noqa: E501 - - :return: The list of this FDSIDList. # noqa: E501 - :rtype: list[int] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this FDSIDList. - - Document identifiers in 'Information Reference Systems' # noqa: E501 - - :param list: The list of this FDSIDList. # noqa: E501 - :type list: list[int] - """ - - self._list = list - - @property - def d_type(self): - """Gets the d_type of this FDSIDList. # noqa: E501 - - - :return: The d_type of this FDSIDList. # noqa: E501 - :rtype: DocumentType - """ - return self._d_type - - @d_type.setter - def d_type(self, d_type): - """Sets the d_type of this FDSIDList. - - - :param d_type: The d_type of this FDSIDList. # noqa: E501 - :type d_type: DocumentType - """ - - self._d_type = d_type - - @property - def d_format(self): - """Gets the d_format of this FDSIDList. # noqa: E501 - - - :return: The d_format of this FDSIDList. # noqa: E501 - :rtype: DocumentFormat - """ - return self._d_format - - @d_format.setter - def d_format(self, d_format): - """Sets the d_format of this FDSIDList. - - - :param d_format: The d_format of this FDSIDList. # noqa: E501 - :type d_format: DocumentFormat - """ - - self._d_format = d_format - - @property - def d_mrz(self): - """Gets the d_mrz of this FDSIDList. # noqa: E501 - - Flag indicating the presence of MRZ on the document # noqa: E501 - - :return: The d_mrz of this FDSIDList. # noqa: E501 - :rtype: bool - """ - return self._d_mrz - - @d_mrz.setter - def d_mrz(self, d_mrz): - """Sets the d_mrz of this FDSIDList. - - Flag indicating the presence of MRZ on the document # noqa: E501 - - :param d_mrz: The d_mrz of this FDSIDList. # noqa: E501 - :type d_mrz: bool - """ - - self._d_mrz = d_mrz - - @property - def d_description(self): - """Gets the d_description of this FDSIDList. # noqa: E501 - - Document description # noqa: E501 - - :return: The d_description of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_description - - @d_description.setter - def d_description(self, d_description): - """Sets the d_description of this FDSIDList. - - Document description # noqa: E501 - - :param d_description: The d_description of this FDSIDList. # noqa: E501 - :type d_description: str - """ - - self._d_description = d_description - - @property - def d_year(self): - """Gets the d_year of this FDSIDList. # noqa: E501 - - Year of publication of the document # noqa: E501 - - :return: The d_year of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_year - - @d_year.setter - def d_year(self, d_year): - """Sets the d_year of this FDSIDList. - - Year of publication of the document # noqa: E501 - - :param d_year: The d_year of this FDSIDList. # noqa: E501 - :type d_year: str - """ - - self._d_year = d_year - - @property - def d_country_name(self): - """Gets the d_country_name of this FDSIDList. # noqa: E501 - - Issuing country name # noqa: E501 - - :return: The d_country_name of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_country_name - - @d_country_name.setter - def d_country_name(self, d_country_name): - """Sets the d_country_name of this FDSIDList. - - Issuing country name # noqa: E501 - - :param d_country_name: The d_country_name of this FDSIDList. # noqa: E501 - :type d_country_name: str - """ - - self._d_country_name = d_country_name - - @property - def d_state_code(self): - """Gets the d_state_code of this FDSIDList. # noqa: E501 - - Issuing state code # noqa: E501 - - :return: The d_state_code of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_state_code - - @d_state_code.setter - def d_state_code(self, d_state_code): - """Sets the d_state_code of this FDSIDList. - - Issuing state code # noqa: E501 - - :param d_state_code: The d_state_code of this FDSIDList. # noqa: E501 - :type d_state_code: str - """ - - self._d_state_code = d_state_code - - @property - def d_state_name(self): - """Gets the d_state_name of this FDSIDList. # noqa: E501 - - Issuing state name # noqa: E501 - - :return: The d_state_name of this FDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_state_name - - @d_state_name.setter - def d_state_name(self, d_state_name): - """Sets the d_state_name of this FDSIDList. - - Issuing state name # noqa: E501 - - :param d_state_name: The d_state_name of this FDSIDList. # noqa: E501 - :type d_state_name: str - """ - - self._d_state_name = d_state_name - - @property - def is_deprecated(self): - """Gets the is_deprecated of this FDSIDList. # noqa: E501 - - Whether the document is deprecated # noqa: E501 - - :return: The is_deprecated of this FDSIDList. # noqa: E501 - :rtype: bool - """ - return self._is_deprecated - - @is_deprecated.setter - def is_deprecated(self, is_deprecated): - """Sets the is_deprecated of this FDSIDList. - - Whether the document is deprecated # noqa: E501 - - :param is_deprecated: The is_deprecated of this FDSIDList. # noqa: E501 - :type is_deprecated: bool - """ - - self._is_deprecated = is_deprecated - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, FDSIDList): - return False - - return self.to_dict() == other.to_dict() + Extended document type info and Regula's 'Information Reference Systems' links + """ # noqa: E501 + icao_code: Annotated[str, Field(min_length=3, strict=True, max_length=3)] = Field(description="ICAO code of the issuing country", alias="ICAOCode") + count: Union[StrictFloat, StrictInt] = Field(description="Number of elements in the List", alias="Count") + list: List[StrictInt] = Field(description="Document identifiers in 'Information Reference Systems'", alias="List") + d_type: DocumentType = Field(alias="dType") + d_format: DocumentFormat = Field(alias="dFormat") + d_mrz: StrictBool = Field(description="Flag indicating the presence of MRZ on the document", alias="dMRZ") + d_description: Optional[StrictStr] = Field(default=None, description="Document description", alias="dDescription") + d_year: StrictStr = Field(description="Year of publication of the document", alias="dYear") + d_country_name: StrictStr = Field(description="Issuing country name", alias="dCountryName") + d_state_code: Optional[StrictStr] = Field(default=None, description="Issuing state code", alias="dStateCode") + d_state_name: Optional[StrictStr] = Field(default=None, description="Issuing state name", alias="dStateName") + is_deprecated: StrictBool = Field(description="Whether the document is deprecated", alias="isDeprecated") + __properties: ClassVar[List[str]] = ["ICAOCode", "Count", "List", "dType", "dFormat", "dMRZ", "dDescription", "dYear", "dCountryName", "dStateCode", "dStateName", "isDeprecated"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FDSIDList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FDSIDList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ICAOCode": obj.get("ICAOCode"), + "Count": obj.get("Count"), + "List": obj.get("List"), + "dType": obj.get("dType"), + "dFormat": obj.get("dFormat"), + "dMRZ": obj.get("dMRZ"), + "dDescription": obj.get("dDescription"), + "dYear": obj.get("dYear"), + "dCountryName": obj.get("dCountryName"), + "dStateCode": obj.get("dStateCode"), + "dStateName": obj.get("dStateName"), + "isDeprecated": obj.get("isDeprecated") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, FDSIDList): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/fiber_item.py b/regula/documentreader/webclient/gen/models/fiber_item.py new file mode 100644 index 0000000..87c240a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/fiber_item.py @@ -0,0 +1,104 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class FiberItem(BaseModel): + """ + FiberItem + """ # noqa: E501 + rect_count: StrictInt = Field(description="For UV_Fibers authenticity result type", alias="RectCount") + expected_count: StrictInt = Field(description="Expected fibers number. For UV_Fibers authentication result type", alias="ExpectedCount") + light_value: Optional[Light] = Field(default=None, alias="LightValue") + light_disp: Optional[StrictInt] = Field(default=None, description="For UV_Background authentication result type", alias="LightDisp") + rect_array: List[RectangleCoordinates] = Field(description="Coordinates of located areas for defined fibers type", alias="RectArray") + width: List[StrictInt] = Field(description="Fibers width value for located areas (in pixels)", alias="Width") + length: List[StrictInt] = Field(description="Fibers length value for located areas (in pixels)", alias="Length") + area: List[StrictInt] = Field(description="Fibers value for areas (in pixels)", alias="Area") + color_values: List[StrictInt] = Field(description="Fibers color value", alias="ColorValues") + __properties: ClassVar[List[str]] = ["RectCount", "ExpectedCount", "LightValue", "LightDisp", "RectArray", "Width", "Length", "Area", "ColorValues"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FiberItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in rect_array (list) + _items = [] + if self.rect_array: + for _item_rect_array in self.rect_array: + if _item_rect_array: + _items.append(_item_rect_array.to_dict()) + _dict['RectArray'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FiberItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RectCount": obj.get("RectCount"), + "ExpectedCount": obj.get("ExpectedCount"), + "LightValue": obj.get("LightValue"), + "LightDisp": obj.get("LightDisp"), + "RectArray": [RectangleCoordinates.from_dict(_item) for _item in obj["RectArray"]] if obj.get("RectArray") is not None else None, + "Width": obj.get("Width"), + "Length": obj.get("Length"), + "Area": obj.get("Area"), + "ColorValues": obj.get("ColorValues") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/fiber_result.py b/regula/documentreader/webclient/gen/models/fiber_result.py index ceb6149..9ea06e0 100644 --- a/regula/documentreader/webclient/gen/models/fiber_result.py +++ b/regula/documentreader/webclient/gen/models/fiber_result.py @@ -4,447 +4,109 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class FiberResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class FiberResult(AuthenticityCheckResultItem): """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int', - 'rect_count': 'int', - 'expected_count': 'int', - 'light_value': 'Light', - 'light_disp': 'int', - 'rect_array': 'list[RectangleCoordinates]', - 'width': 'list[int]', - 'length': 'list[int]', - 'area': 'list[int]', - 'color_values': 'list[int]' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue', - 'rect_count': 'RectCount', - 'expected_count': 'ExpectedCount', - 'light_value': 'LightValue', - 'light_disp': 'LightDisp', - 'rect_array': 'RectArray', - 'width': 'Width', - 'length': 'Length', - 'area': 'Area', - 'color_values': 'ColorValues' - } - - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, rect_count=None, expected_count=None, light_value=None, light_disp=None, rect_array=None, width=None, length=None, area=None, color_values=None, local_vars_configuration=None): # noqa: E501 - """FiberResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self._rect_count = None - self._expected_count = None - self._light_value = None - self._light_disp = None - self._rect_array = None - self._width = None - self._length = None - self._area = None - self._color_values = None - self.discriminator = None - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - if rect_count is not None: - self.rect_count = rect_count - if expected_count is not None: - self.expected_count = expected_count - if light_value is not None: - self.light_value = light_value - if light_disp is not None: - self.light_disp = light_disp - if rect_array is not None: - self.rect_array = rect_array - if width is not None: - self.width = width - if length is not None: - self.length = length - if area is not None: - self.area = area - if color_values is not None: - self.color_values = color_values - - @property - def type(self): - """Gets the type of this FiberResult. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this FiberResult. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this FiberResult. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this FiberResult. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this FiberResult. # noqa: E501 - - - :return: The element_result of this FiberResult. # noqa: E501 - :rtype: CheckResult - """ - return self._element_result - - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this FiberResult. - - - :param element_result: The element_result of this FiberResult. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this FiberResult. # noqa: E501 - - - :return: The element_diagnose of this FiberResult. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this FiberResult. - - - :param element_diagnose: The element_diagnose of this FiberResult. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this FiberResult. # noqa: E501 - - - :return: The percent_value of this FiberResult. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this FiberResult. - - - :param percent_value: The percent_value of this FiberResult. # noqa: E501 - :type percent_value: int - """ - - self._percent_value = percent_value - - @property - def rect_count(self): - """Gets the rect_count of this FiberResult. # noqa: E501 - - For UV_Fibers authenticity result type # noqa: E501 - - :return: The rect_count of this FiberResult. # noqa: E501 - :rtype: int - """ - return self._rect_count - - @rect_count.setter - def rect_count(self, rect_count): - """Sets the rect_count of this FiberResult. - - For UV_Fibers authenticity result type # noqa: E501 - - :param rect_count: The rect_count of this FiberResult. # noqa: E501 - :type rect_count: int - """ - - self._rect_count = rect_count - - @property - def expected_count(self): - """Gets the expected_count of this FiberResult. # noqa: E501 - - Expected fibers number. For UV_Fibers authentication result type # noqa: E501 - - :return: The expected_count of this FiberResult. # noqa: E501 - :rtype: int - """ - return self._expected_count - - @expected_count.setter - def expected_count(self, expected_count): - """Sets the expected_count of this FiberResult. - - Expected fibers number. For UV_Fibers authentication result type # noqa: E501 - - :param expected_count: The expected_count of this FiberResult. # noqa: E501 - :type expected_count: int - """ - - self._expected_count = expected_count - - @property - def light_value(self): - """Gets the light_value of this FiberResult. # noqa: E501 - - - :return: The light_value of this FiberResult. # noqa: E501 - :rtype: Light - """ - return self._light_value - - @light_value.setter - def light_value(self, light_value): - """Sets the light_value of this FiberResult. - - - :param light_value: The light_value of this FiberResult. # noqa: E501 - :type light_value: Light - """ - - self._light_value = light_value - - @property - def light_disp(self): - """Gets the light_disp of this FiberResult. # noqa: E501 - - For UV_Background authentication result type # noqa: E501 - - :return: The light_disp of this FiberResult. # noqa: E501 - :rtype: int - """ - return self._light_disp - - @light_disp.setter - def light_disp(self, light_disp): - """Sets the light_disp of this FiberResult. - - For UV_Background authentication result type # noqa: E501 - - :param light_disp: The light_disp of this FiberResult. # noqa: E501 - :type light_disp: int - """ - - self._light_disp = light_disp - - @property - def rect_array(self): - """Gets the rect_array of this FiberResult. # noqa: E501 - - Coordinates of located areas for defined fibers type # noqa: E501 - - :return: The rect_array of this FiberResult. # noqa: E501 - :rtype: list[RectangleCoordinates] - """ - return self._rect_array - - @rect_array.setter - def rect_array(self, rect_array): - """Sets the rect_array of this FiberResult. - - Coordinates of located areas for defined fibers type # noqa: E501 - - :param rect_array: The rect_array of this FiberResult. # noqa: E501 - :type rect_array: list[RectangleCoordinates] - """ - - self._rect_array = rect_array - - @property - def width(self): - """Gets the width of this FiberResult. # noqa: E501 - - Fibers width value for located areas (in pixels) # noqa: E501 - - :return: The width of this FiberResult. # noqa: E501 - :rtype: list[int] - """ - return self._width - - @width.setter - def width(self, width): - """Sets the width of this FiberResult. - - Fibers width value for located areas (in pixels) # noqa: E501 - - :param width: The width of this FiberResult. # noqa: E501 - :type width: list[int] - """ - - self._width = width - - @property - def length(self): - """Gets the length of this FiberResult. # noqa: E501 - - Fibers length value for located areas (in pixels) # noqa: E501 - - :return: The length of this FiberResult. # noqa: E501 - :rtype: list[int] - """ - return self._length - - @length.setter - def length(self, length): - """Sets the length of this FiberResult. - - Fibers length value for located areas (in pixels) # noqa: E501 - - :param length: The length of this FiberResult. # noqa: E501 - :type length: list[int] - """ - - self._length = length - - @property - def area(self): - """Gets the area of this FiberResult. # noqa: E501 - - Fibers value for areas (in pixels) # noqa: E501 - - :return: The area of this FiberResult. # noqa: E501 - :rtype: list[int] - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this FiberResult. - - Fibers value for areas (in pixels) # noqa: E501 - - :param area: The area of this FiberResult. # noqa: E501 - :type area: list[int] - """ - - self._area = area - - @property - def color_values(self): - """Gets the color_values of this FiberResult. # noqa: E501 - - Fibers color value # noqa: E501 - - :return: The color_values of this FiberResult. # noqa: E501 - :rtype: list[int] - """ - return self._color_values - - @color_values.setter - def color_values(self, color_values): - """Sets the color_values of this FiberResult. - - Fibers color value # noqa: E501 - - :param color_values: The color_values of this FiberResult. # noqa: E501 - :type color_values: list[int] - """ - - self._color_values = color_values - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, FiberResult): - return False - - return self.to_dict() == other.to_dict() + FiberResult + """ # noqa: E501 + rect_count: StrictInt = Field(description="For UV_Fibers authenticity result type", alias="RectCount") + expected_count: StrictInt = Field(description="Expected fibers number. For UV_Fibers authentication result type", alias="ExpectedCount") + light_value: Optional[Light] = Field(default=None, alias="LightValue") + light_disp: Optional[StrictInt] = Field(default=None, description="For UV_Background authentication result type", alias="LightDisp") + rect_array: List[RectangleCoordinates] = Field(description="Coordinates of located areas for defined fibers type", alias="RectArray") + width: List[StrictInt] = Field(description="Fibers width value for located areas (in pixels)", alias="Width") + length: List[StrictInt] = Field(description="Fibers length value for located areas (in pixels)", alias="Length") + area: List[StrictInt] = Field(description="Fibers value for areas (in pixels)", alias="Area") + color_values: List[StrictInt] = Field(description="Fibers color value", alias="ColorValues") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue", "RectCount", "ExpectedCount", "LightValue", "LightDisp", "RectArray", "Width", "Length", "Area", "ColorValues"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FiberResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in rect_array (list) + _items = [] + if self.rect_array: + for _item_rect_array in self.rect_array: + if _item_rect_array: + _items.append(_item_rect_array.to_dict()) + _dict['RectArray'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FiberResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "ElementResult": obj.get("ElementResult"), + "ElementDiagnose": obj.get("ElementDiagnose"), + "PercentValue": obj.get("PercentValue"), + "RectCount": obj.get("RectCount"), + "ExpectedCount": obj.get("ExpectedCount"), + "LightValue": obj.get("LightValue"), + "LightDisp": obj.get("LightDisp"), + "RectArray": [RectangleCoordinates.from_dict(_item) for _item in obj["RectArray"]] if obj.get("RectArray") is not None else None, + "Width": obj.get("Width"), + "Length": obj.get("Length"), + "Area": obj.get("Area"), + "ColorValues": obj.get("ColorValues") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, FiberResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/fiber_result_all_of.py b/regula/documentreader/webclient/gen/models/fiber_result_all_of.py deleted file mode 100644 index cfaa6f5..0000000 --- a/regula/documentreader/webclient/gen/models/fiber_result_all_of.py +++ /dev/null @@ -1,343 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class FiberResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'rect_count': 'int', - 'expected_count': 'int', - 'light_value': 'Light', - 'light_disp': 'int', - 'rect_array': 'list[RectangleCoordinates]', - 'width': 'list[int]', - 'length': 'list[int]', - 'area': 'list[int]', - 'color_values': 'list[int]' - } - - attribute_map = { - 'rect_count': 'RectCount', - 'expected_count': 'ExpectedCount', - 'light_value': 'LightValue', - 'light_disp': 'LightDisp', - 'rect_array': 'RectArray', - 'width': 'Width', - 'length': 'Length', - 'area': 'Area', - 'color_values': 'ColorValues' - } - - def __init__(self, rect_count=None, expected_count=None, light_value=None, light_disp=None, rect_array=None, width=None, length=None, area=None, color_values=None, local_vars_configuration=None): # noqa: E501 - """FiberResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._rect_count = None - self._expected_count = None - self._light_value = None - self._light_disp = None - self._rect_array = None - self._width = None - self._length = None - self._area = None - self._color_values = None - self.discriminator = None - - if rect_count is not None: - self.rect_count = rect_count - if expected_count is not None: - self.expected_count = expected_count - if light_value is not None: - self.light_value = light_value - if light_disp is not None: - self.light_disp = light_disp - if rect_array is not None: - self.rect_array = rect_array - if width is not None: - self.width = width - if length is not None: - self.length = length - if area is not None: - self.area = area - if color_values is not None: - self.color_values = color_values - - @property - def rect_count(self): - """Gets the rect_count of this FiberResultAllOf. # noqa: E501 - - For UV_Fibers authenticity result type # noqa: E501 - - :return: The rect_count of this FiberResultAllOf. # noqa: E501 - :rtype: int - """ - return self._rect_count - - @rect_count.setter - def rect_count(self, rect_count): - """Sets the rect_count of this FiberResultAllOf. - - For UV_Fibers authenticity result type # noqa: E501 - - :param rect_count: The rect_count of this FiberResultAllOf. # noqa: E501 - :type rect_count: int - """ - - self._rect_count = rect_count - - @property - def expected_count(self): - """Gets the expected_count of this FiberResultAllOf. # noqa: E501 - - Expected fibers number. For UV_Fibers authentication result type # noqa: E501 - - :return: The expected_count of this FiberResultAllOf. # noqa: E501 - :rtype: int - """ - return self._expected_count - - @expected_count.setter - def expected_count(self, expected_count): - """Sets the expected_count of this FiberResultAllOf. - - Expected fibers number. For UV_Fibers authentication result type # noqa: E501 - - :param expected_count: The expected_count of this FiberResultAllOf. # noqa: E501 - :type expected_count: int - """ - - self._expected_count = expected_count - - @property - def light_value(self): - """Gets the light_value of this FiberResultAllOf. # noqa: E501 - - - :return: The light_value of this FiberResultAllOf. # noqa: E501 - :rtype: Light - """ - return self._light_value - - @light_value.setter - def light_value(self, light_value): - """Sets the light_value of this FiberResultAllOf. - - - :param light_value: The light_value of this FiberResultAllOf. # noqa: E501 - :type light_value: Light - """ - - self._light_value = light_value - - @property - def light_disp(self): - """Gets the light_disp of this FiberResultAllOf. # noqa: E501 - - For UV_Background authentication result type # noqa: E501 - - :return: The light_disp of this FiberResultAllOf. # noqa: E501 - :rtype: int - """ - return self._light_disp - - @light_disp.setter - def light_disp(self, light_disp): - """Sets the light_disp of this FiberResultAllOf. - - For UV_Background authentication result type # noqa: E501 - - :param light_disp: The light_disp of this FiberResultAllOf. # noqa: E501 - :type light_disp: int - """ - - self._light_disp = light_disp - - @property - def rect_array(self): - """Gets the rect_array of this FiberResultAllOf. # noqa: E501 - - Coordinates of located areas for defined fibers type # noqa: E501 - - :return: The rect_array of this FiberResultAllOf. # noqa: E501 - :rtype: list[RectangleCoordinates] - """ - return self._rect_array - - @rect_array.setter - def rect_array(self, rect_array): - """Sets the rect_array of this FiberResultAllOf. - - Coordinates of located areas for defined fibers type # noqa: E501 - - :param rect_array: The rect_array of this FiberResultAllOf. # noqa: E501 - :type rect_array: list[RectangleCoordinates] - """ - - self._rect_array = rect_array - - @property - def width(self): - """Gets the width of this FiberResultAllOf. # noqa: E501 - - Fibers width value for located areas (in pixels) # noqa: E501 - - :return: The width of this FiberResultAllOf. # noqa: E501 - :rtype: list[int] - """ - return self._width - - @width.setter - def width(self, width): - """Sets the width of this FiberResultAllOf. - - Fibers width value for located areas (in pixels) # noqa: E501 - - :param width: The width of this FiberResultAllOf. # noqa: E501 - :type width: list[int] - """ - - self._width = width - - @property - def length(self): - """Gets the length of this FiberResultAllOf. # noqa: E501 - - Fibers length value for located areas (in pixels) # noqa: E501 - - :return: The length of this FiberResultAllOf. # noqa: E501 - :rtype: list[int] - """ - return self._length - - @length.setter - def length(self, length): - """Sets the length of this FiberResultAllOf. - - Fibers length value for located areas (in pixels) # noqa: E501 - - :param length: The length of this FiberResultAllOf. # noqa: E501 - :type length: list[int] - """ - - self._length = length - - @property - def area(self): - """Gets the area of this FiberResultAllOf. # noqa: E501 - - Fibers value for areas (in pixels) # noqa: E501 - - :return: The area of this FiberResultAllOf. # noqa: E501 - :rtype: list[int] - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this FiberResultAllOf. - - Fibers value for areas (in pixels) # noqa: E501 - - :param area: The area of this FiberResultAllOf. # noqa: E501 - :type area: list[int] - """ - - self._area = area - - @property - def color_values(self): - """Gets the color_values of this FiberResultAllOf. # noqa: E501 - - Fibers color value # noqa: E501 - - :return: The color_values of this FiberResultAllOf. # noqa: E501 - :rtype: list[int] - """ - return self._color_values - - @color_values.setter - def color_values(self, color_values): - """Sets the color_values of this FiberResultAllOf. - - Fibers color value # noqa: E501 - - :param color_values: The color_values of this FiberResultAllOf. # noqa: E501 - :type color_values: list[int] - """ - - self._color_values = color_values - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, FiberResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, FiberResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/field_item.py b/regula/documentreader/webclient/gen/models/field_item.py new file mode 100644 index 0000000..a28bb90 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/field_item.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class FieldItem(BaseModel): + """ + FieldItem + """ # noqa: E501 + field_length: StrictInt = Field(alias="FieldLength") + field_pos: StrictInt = Field(alias="FieldPos") + field_type: StrictInt = Field(alias="FieldType") + test_result: StrictInt = Field(alias="TEST_RESULT") + valid_check_sum: StrictInt = Field(alias="ValidCheckSum") + reserved: StrictInt + __properties: ClassVar[List[str]] = ["FieldLength", "FieldPos", "FieldType", "TEST_RESULT", "ValidCheckSum", "reserved"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FieldItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FieldItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldLength": obj.get("FieldLength"), + "FieldPos": obj.get("FieldPos"), + "FieldType": obj.get("FieldType"), + "TEST_RESULT": obj.get("TEST_RESULT"), + "ValidCheckSum": obj.get("ValidCheckSum"), + "reserved": obj.get("reserved") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/file_image.py b/regula/documentreader/webclient/gen/models/file_image.py new file mode 100644 index 0000000..23cd938 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/file_image.py @@ -0,0 +1,81 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class FileImage(BaseModel): + """ + FileImage + """ # noqa: E501 + data: StrictStr = Field(alias="Data") + length: StrictInt = Field(alias="Length") + __properties: ClassVar[List[str]] = ["Data", "Length"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of FileImage from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of FileImage from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Data": obj.get("Data"), + "Length": obj.get("Length") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/get_transactions_by_tag_response.py b/regula/documentreader/webclient/gen/models/get_transactions_by_tag_response.py index c7f78dd..bd0d9d7 100644 --- a/regula/documentreader/webclient/gen/models/get_transactions_by_tag_response.py +++ b/regula/documentreader/webclient/gen/models/get_transactions_by_tag_response.py @@ -4,174 +4,81 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class GetTransactionsByTagResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class GetTransactionsByTagResponse(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'state': 'int', - 'updated_at': 'datetime' - } - - attribute_map = { - 'id': 'id', - 'state': 'state', - 'updated_at': 'updatedAt' - } - - def __init__(self, id=None, state=None, updated_at=None, local_vars_configuration=None): # noqa: E501 - """GetTransactionsByTagResponse - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._id = None - self._state = None - self._updated_at = None - self.discriminator = None - - if id is not None: - self.id = id - if state is not None: - self.state = state - if updated_at is not None: - self.updated_at = updated_at - - @property - def id(self): - """Gets the id of this GetTransactionsByTagResponse. # noqa: E501 - - Transaction id # noqa: E501 - - :return: The id of this GetTransactionsByTagResponse. # noqa: E501 - :rtype: str - """ - return self._id - - @id.setter - def id(self, id): - """Sets the id of this GetTransactionsByTagResponse. - - Transaction id # noqa: E501 - - :param id: The id of this GetTransactionsByTagResponse. # noqa: E501 - :type id: str + GetTransactionsByTagResponse + """ # noqa: E501 + id: Optional[StrictStr] = Field(default=None, description="Transaction id") + state: Optional[StrictInt] = Field(default=None, description="Transaction status") + updated_at: Optional[datetime] = Field(default=None, description="Last time updated", alias="updatedAt") + __properties: ClassVar[List[str]] = ["id", "state", "updatedAt"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GetTransactionsByTagResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ + excluded_fields: Set[str] = set([ + ]) - self._id = id + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - @property - def state(self): - """Gets the state of this GetTransactionsByTagResponse. # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GetTransactionsByTagResponse from a dict""" + if obj is None: + return None - Transaction status # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The state of this GetTransactionsByTagResponse. # noqa: E501 - :rtype: int - """ - return self._state - - @state.setter - def state(self, state): - """Sets the state of this GetTransactionsByTagResponse. - - Transaction status # noqa: E501 - - :param state: The state of this GetTransactionsByTagResponse. # noqa: E501 - :type state: int - """ - - self._state = state - - @property - def updated_at(self): - """Gets the updated_at of this GetTransactionsByTagResponse. # noqa: E501 + _obj = cls.model_validate({ + "id": obj.get("id"), + "state": obj.get("state"), + "updatedAt": obj.get("updatedAt") + }) + return _obj - Last time updated # noqa: E501 - - :return: The updated_at of this GetTransactionsByTagResponse. # noqa: E501 - :rtype: datetime - """ - return self._updated_at - - @updated_at.setter - def updated_at(self, updated_at): - """Sets the updated_at of this GetTransactionsByTagResponse. - - Last time updated # noqa: E501 - - :param updated_at: The updated_at of this GetTransactionsByTagResponse. # noqa: E501 - :type updated_at: datetime - """ - self._updated_at = updated_at - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GetTransactionsByTagResponse): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GetTransactionsByTagResponse): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/graph_data.py b/regula/documentreader/webclient/gen/models/graph_data.py new file mode 100644 index 0000000..98d99b2 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/graph_data.py @@ -0,0 +1,95 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.file_image import FileImage +from typing import Optional, Set +from typing_extensions import Self + +class GraphData(BaseModel): + """ + GraphData + """ # noqa: E501 + field_type: StrictInt = Field(alias="FieldType") + file_image: FileImage = Field(alias="File_Image") + graphics_type: StrictInt = Field(alias="GraphicsType") + origin_dg: StrictInt = Field(alias="OriginDG") + origin_dg_tag: StrictInt = Field(alias="OriginDGTag") + origin_entry_view: StrictInt = Field(alias="OriginEntryView") + origin_tag_entry: StrictInt = Field(alias="OriginTagEntry") + __properties: ClassVar[List[str]] = ["FieldType", "File_Image", "GraphicsType", "OriginDG", "OriginDGTag", "OriginEntryView", "OriginTagEntry"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GraphData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of file_image + if self.file_image: + _dict['File_Image'] = self.file_image.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GraphData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldType": obj.get("FieldType"), + "File_Image": FileImage.from_dict(obj["File_Image"]) if obj.get("File_Image") is not None else None, + "GraphicsType": obj.get("GraphicsType"), + "OriginDG": obj.get("OriginDG"), + "OriginDGTag": obj.get("OriginDGTag"), + "OriginEntryView": obj.get("OriginEntryView"), + "OriginTagEntry": obj.get("OriginTagEntry") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/graphic_field.py b/regula/documentreader/webclient/gen/models/graphic_field.py old mode 100755 new mode 100644 index e2cffa2..0defc35 --- a/regula/documentreader/webclient/gen/models/graphic_field.py +++ b/regula/documentreader/webclient/gen/models/graphic_field.py @@ -4,282 +4,91 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class GraphicField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class GraphicField(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'field_type': 'GraphicFieldType', - 'image': 'ImageData', - 'field_rect': 'RectangleCoordinates', - 'rfid_origin_dg': 'int', - 'rfid_origin_dg_tag': 'int', - 'rfid_origin_tag_entry': 'int', - 'rfid_origin_entry_view': 'int' - } - - attribute_map = { - 'field_type': 'FieldType', - 'image': 'image', - 'field_rect': 'FieldRect', - 'rfid_origin_dg': 'RFID_OriginDG', - 'rfid_origin_dg_tag': 'RFID_OriginDGTag', - 'rfid_origin_tag_entry': 'RFID_OriginTagEntry', - 'rfid_origin_entry_view': 'RFID_OriginEntryView' - } - - def __init__(self, field_type=None, image=None, field_rect=None, rfid_origin_dg=None, rfid_origin_dg_tag=None, rfid_origin_tag_entry=None, rfid_origin_entry_view=None, local_vars_configuration=None): # noqa: E501 - """GraphicField - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._field_type = None - self._image = None - self._field_rect = None - self._rfid_origin_dg = None - self._rfid_origin_dg_tag = None - self._rfid_origin_tag_entry = None - self._rfid_origin_entry_view = None - self.discriminator = None - - self.field_type = field_type - self.image = image - if field_rect is not None: - self.field_rect = field_rect - if rfid_origin_dg is not None: - self.rfid_origin_dg = rfid_origin_dg - if rfid_origin_dg_tag is not None: - self.rfid_origin_dg_tag = rfid_origin_dg_tag - if rfid_origin_tag_entry is not None: - self.rfid_origin_tag_entry = rfid_origin_tag_entry - if rfid_origin_entry_view is not None: - self.rfid_origin_entry_view = rfid_origin_entry_view - - @property - def field_type(self): - """Gets the field_type of this GraphicField. # noqa: E501 - - - :return: The field_type of this GraphicField. # noqa: E501 - :rtype: GraphicFieldType - """ - return self._field_type - - @field_type.setter - def field_type(self, field_type): - """Sets the field_type of this GraphicField. - - - :param field_type: The field_type of this GraphicField. # noqa: E501 - :type field_type: GraphicFieldType - """ - if self.local_vars_configuration.client_side_validation and field_type is None: # noqa: E501 - raise ValueError("Invalid value for `field_type`, must not be `None`") # noqa: E501 - - self._field_type = field_type - - @property - def image(self): - """Gets the image of this GraphicField. # noqa: E501 - - - :return: The image of this GraphicField. # noqa: E501 - :rtype: ImageData - """ - return self._image - - @image.setter - def image(self, image): - """Sets the image of this GraphicField. - - - :param image: The image of this GraphicField. # noqa: E501 - :type image: ImageData - """ - if self.local_vars_configuration.client_side_validation and image is None: # noqa: E501 - raise ValueError("Invalid value for `image`, must not be `None`") # noqa: E501 - - self._image = image - - @property - def field_rect(self): - """Gets the field_rect of this GraphicField. # noqa: E501 - - - :return: The field_rect of this GraphicField. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this GraphicField. - - - :param field_rect: The field_rect of this GraphicField. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def rfid_origin_dg(self): - """Gets the rfid_origin_dg of this GraphicField. # noqa: E501 - - Source data group file. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :return: The rfid_origin_dg of this GraphicField. # noqa: E501 - :rtype: int - """ - return self._rfid_origin_dg - - @rfid_origin_dg.setter - def rfid_origin_dg(self, rfid_origin_dg): - """Sets the rfid_origin_dg of this GraphicField. - - Source data group file. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :param rfid_origin_dg: The rfid_origin_dg of this GraphicField. # noqa: E501 - :type rfid_origin_dg: int - """ - - self._rfid_origin_dg = rfid_origin_dg - - @property - def rfid_origin_dg_tag(self): - """Gets the rfid_origin_dg_tag of this GraphicField. # noqa: E501 - - Index of the source record of the image with biometric information in the information data group. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :return: The rfid_origin_dg_tag of this GraphicField. # noqa: E501 - :rtype: int + Information about one graphic field - abstract class + """ # noqa: E501 + field_rect: RectangleCoordinates = Field(alias="FieldRect") + field_type: GraphicFieldType = Field(alias="FieldType") + field_name: StrictStr = Field(description="Graphic field symbolic name", alias="FieldName") + image: ImageData + __properties: ClassVar[List[str]] = ["FieldRect", "FieldType", "FieldName", "image"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GraphicField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._rfid_origin_dg_tag - - @rfid_origin_dg_tag.setter - def rfid_origin_dg_tag(self, rfid_origin_dg_tag): - """Sets the rfid_origin_dg_tag of this GraphicField. - - Index of the source record of the image with biometric information in the information data group. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :param rfid_origin_dg_tag: The rfid_origin_dg_tag of this GraphicField. # noqa: E501 - :type rfid_origin_dg_tag: int - """ - - self._rfid_origin_dg_tag = rfid_origin_dg_tag - - @property - def rfid_origin_tag_entry(self): - """Gets the rfid_origin_tag_entry of this GraphicField. # noqa: E501 - - Index of the template in the record with biometric data. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :return: The rfid_origin_tag_entry of this GraphicField. # noqa: E501 - :rtype: int - """ - return self._rfid_origin_tag_entry - - @rfid_origin_tag_entry.setter - def rfid_origin_tag_entry(self, rfid_origin_tag_entry): - """Sets the rfid_origin_tag_entry of this GraphicField. - - Index of the template in the record with biometric data. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :param rfid_origin_tag_entry: The rfid_origin_tag_entry of this GraphicField. # noqa: E501 - :type rfid_origin_tag_entry: int - """ - - self._rfid_origin_tag_entry = rfid_origin_tag_entry - - @property - def rfid_origin_entry_view(self): - """Gets the rfid_origin_entry_view of this GraphicField. # noqa: E501 - - Index of the variant of the biometric data template. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :return: The rfid_origin_entry_view of this GraphicField. # noqa: E501 - :rtype: int - """ - return self._rfid_origin_entry_view - - @rfid_origin_entry_view.setter - def rfid_origin_entry_view(self, rfid_origin_entry_view): - """Sets the rfid_origin_entry_view of this GraphicField. - - Index of the variant of the biometric data template. Only for Result.RFID_GRAPHICS result. # noqa: E501 - - :param rfid_origin_entry_view: The rfid_origin_entry_view of this GraphicField. # noqa: E501 - :type rfid_origin_entry_view: int - """ - - self._rfid_origin_entry_view = rfid_origin_entry_view - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GraphicField): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of image + if self.image: + _dict['image'] = self.image.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GraphicField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None, + "FieldType": obj.get("FieldType"), + "FieldName": obj.get("FieldName"), + "image": ImageData.from_dict(obj["image"]) if obj.get("image") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GraphicField): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/graphic_field_type.py b/regula/documentreader/webclient/gen/models/graphic_field_type.py old mode 100755 new mode 100644 index 5aa1756..4688515 --- a/regula/documentreader/webclient/gen/models/graphic_field_type.py +++ b/regula/documentreader/webclient/gen/models/graphic_field_type.py @@ -4,142 +4,51 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class GraphicFieldType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class GraphicFieldType(int, Enum): + """ + GraphicFieldType """ - - PORTRAIT = int("201") - - FINGERPRINT = int("202") - - EYE = int("203") - - SIGNATURE = int("204") - - BAR_CODE = int("205") - - PROOF_OF_CITIZENSHIP = int("206") - - DOCUMENT_FRONT = int("207") - - DOCUMENT_REAR = int("208") - - COLOR_DYNAMIC = int("209") - - GHOST_PORTRAIT = int("210") - - STAMP = int("211") - - CONTACT_CHIP = int("213") - - OTHER = int("250") - - FINGER_LEFT_THUMB = int("300") - - FINGER_LEFT_INDEX = int("301") - - FINGER_LEFT_MIDDLE = int("302") - - FINGER_LEFT_RING = int("303") - - FINGER_LEFT_LITTLE = int("304") - - FINGER_RIGHT_THUMB = int("305") - - FINGER_RIGHT_INDEX = int("306") - - FINGER_RIGHT_MIDDLE = int("307") - - FINGER_RIGHT_RING = int("308") - - FINGER_RIGHT_LITTLE = int("309") - - FINGER_RIGHT_FOUR_FINGERS = int("313") - - FINGER_LEFT_FOUR_FINGERS = int("314") - - FINGER_TWO_THUMBS = int("315") - - allowable_values = [PORTRAIT, FINGERPRINT, EYE, SIGNATURE, BAR_CODE, PROOF_OF_CITIZENSHIP, DOCUMENT_FRONT, DOCUMENT_REAR, COLOR_DYNAMIC, GHOST_PORTRAIT, STAMP, CONTACT_CHIP, OTHER, FINGER_LEFT_THUMB, FINGER_LEFT_INDEX, FINGER_LEFT_MIDDLE, FINGER_LEFT_RING, FINGER_LEFT_LITTLE, FINGER_RIGHT_THUMB, FINGER_RIGHT_INDEX, FINGER_RIGHT_MIDDLE, FINGER_RIGHT_RING, FINGER_RIGHT_LITTLE, FINGER_RIGHT_FOUR_FINGERS, FINGER_LEFT_FOUR_FINGERS, FINGER_TWO_THUMBS] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """GraphicFieldType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GraphicFieldType): - return False - - return self.to_dict() == other.to_dict() + PORTRAIT = 201 + FINGERPRINT = 202 + EYE = 203 + SIGNATURE = 204 + BAR_CODE = 205 + PROOF_OF_CITIZENSHIP = 206 + DOCUMENT_FRONT = 207 + DOCUMENT_REAR = 208 + COLOR_DYNAMIC = 209 + GHOST_PORTRAIT = 210 + STAMP = 211 + PORTRAIT_OF_CHILD = 212 + CONTACT_CHIP = 213 + OTHER = 250 + FINGER_LEFT_THUMB = 300 + FINGER_LEFT_INDEX = 301 + FINGER_LEFT_MIDDLE = 302 + FINGER_LEFT_RING = 303 + FINGER_LEFT_LITTLE = 304 + FINGER_RIGHT_THUMB = 305 + FINGER_RIGHT_INDEX = 306 + FINGER_RIGHT_MIDDLE = 307 + FINGER_RIGHT_RING = 308 + FINGER_RIGHT_LITTLE = 309 + FINGER_RIGHT_FOUR_FINGERS = 313 + FINGER_LEFT_FOUR_FINGERS = 314 + FINGER_TWO_THUMBS = 315 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of GraphicFieldType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GraphicFieldType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/graphic_fields_list.py b/regula/documentreader/webclient/gen/models/graphic_fields_list.py old mode 100755 new mode 100644 index aa2b8f4..b1894dd --- a/regula/documentreader/webclient/gen/models/graphic_fields_list.py +++ b/regula/documentreader/webclient/gen/models/graphic_fields_list.py @@ -4,117 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.graphic_field import GraphicField +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class GraphicFieldsList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class GraphicFieldsList(BaseModel): """ - openapi_types = { - 'p_array_fields': 'list[GraphicField]' - } - - attribute_map = { - 'p_array_fields': 'pArrayFields' - } - - def __init__(self, p_array_fields=None, local_vars_configuration=None): # noqa: E501 - """GraphicFieldsList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._p_array_fields = None - self.discriminator = None - - self.p_array_fields = p_array_fields - - @property - def p_array_fields(self): - """Gets the p_array_fields of this GraphicFieldsList. # noqa: E501 - - - :return: The p_array_fields of this GraphicFieldsList. # noqa: E501 - :rtype: list[GraphicField] + GraphicFieldsList + """ # noqa: E501 + p_array_fields: List[GraphicField] = Field(alias="pArrayFields") + n_fields: Union[StrictFloat, StrictInt] = Field(description="Number of pArrayFields array elements", alias="nFields") + __properties: ClassVar[List[str]] = ["pArrayFields", "nFields"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GraphicFieldsList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._p_array_fields + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in p_array_fields (list) + _items = [] + if self.p_array_fields: + for _item_p_array_fields in self.p_array_fields: + if _item_p_array_fields: + _items.append(_item_p_array_fields.to_dict()) + _dict['pArrayFields'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GraphicFieldsList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "pArrayFields": [GraphicField.from_dict(_item) for _item in obj["pArrayFields"]] if obj.get("pArrayFields") is not None else None, + "nFields": obj.get("nFields") + }) + return _obj - @p_array_fields.setter - def p_array_fields(self, p_array_fields): - """Sets the p_array_fields of this GraphicFieldsList. - - :param p_array_fields: The p_array_fields of this GraphicFieldsList. # noqa: E501 - :type p_array_fields: list[GraphicField] - """ - if self.local_vars_configuration.client_side_validation and p_array_fields is None: # noqa: E501 - raise ValueError("Invalid value for `p_array_fields`, must not be `None`") # noqa: E501 - - self._p_array_fields = p_array_fields - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GraphicFieldsList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GraphicFieldsList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/graphics_result.py b/regula/documentreader/webclient/gen/models/graphics_result.py old mode 100755 new mode 100644 index de5c20b..17cccf2 --- a/regula/documentreader/webclient/gen/models/graphics_result.py +++ b/regula/documentreader/webclient/gen/models/graphics_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.graphic_fields_list import GraphicFieldsList +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Graphic fields extracted from one of the document sources. Returns separate results for each provided page. -""" -class GraphicsResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class GraphicsResult(ResultItem): """ - openapi_types = { - 'doc_graphics_info': 'GraphicFieldsList', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'doc_graphics_info': 'DocGraphicsInfo', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, doc_graphics_info=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """GraphicsResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_graphics_info = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.doc_graphics_info = doc_graphics_info - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def doc_graphics_info(self): - """Gets the doc_graphics_info of this GraphicsResult. # noqa: E501 - - - :return: The doc_graphics_info of this GraphicsResult. # noqa: E501 - :rtype: GraphicFieldsList - """ - return self._doc_graphics_info - - @doc_graphics_info.setter - def doc_graphics_info(self, doc_graphics_info): - """Sets the doc_graphics_info of this GraphicsResult. - - - :param doc_graphics_info: The doc_graphics_info of this GraphicsResult. # noqa: E501 - :type doc_graphics_info: GraphicFieldsList - """ - if self.local_vars_configuration.client_side_validation and doc_graphics_info is None: # noqa: E501 - raise ValueError("Invalid value for `doc_graphics_info`, must not be `None`") # noqa: E501 - - self._doc_graphics_info = doc_graphics_info - - @property - def buf_length(self): - """Gets the buf_length of this GraphicsResult. # noqa: E501 - - - :return: The buf_length of this GraphicsResult. # noqa: E501 - :rtype: int - """ - return self._buf_length + Graphic fields extracted from one of the document sources. Returns separate results for each provided page. + """ # noqa: E501 + doc_graphics_info: GraphicFieldsList = Field(alias="DocGraphicsInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "DocGraphicsInfo"] - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this GraphicsResult. + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :param buf_length: The buf_length of this GraphicsResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this GraphicsResult. # noqa: E501 + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - :return: The light of this GraphicsResult. # noqa: E501 - :rtype: int - """ - return self._light + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of GraphicsResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @light.setter - def light(self, light): - """Sets the light of this GraphicsResult. + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :param light: The light of this GraphicsResult. # noqa: E501 - :type light: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this GraphicsResult. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_graphics_info + if self.doc_graphics_info: + _dict['DocGraphicsInfo'] = self.doc_graphics_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of GraphicsResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "DocGraphicsInfo": GraphicFieldsList.from_dict(obj["DocGraphicsInfo"]) if obj.get("DocGraphicsInfo") is not None else None + }) + return _obj - :return: The list_idx of this GraphicsResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this GraphicsResult. - - - :param list_idx: The list_idx of this GraphicsResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this GraphicsResult. # noqa: E501 - - - :return: The page_idx of this GraphicsResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this GraphicsResult. - - - :param page_idx: The page_idx of this GraphicsResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this GraphicsResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this GraphicsResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this GraphicsResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this GraphicsResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GraphicsResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GraphicsResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/graphics_result_all_of.py b/regula/documentreader/webclient/gen/models/graphics_result_all_of.py deleted file mode 100755 index 234af05..0000000 --- a/regula/documentreader/webclient/gen/models/graphics_result_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class GraphicsResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'doc_graphics_info': 'GraphicFieldsList' - } - - attribute_map = { - 'doc_graphics_info': 'DocGraphicsInfo' - } - - def __init__(self, doc_graphics_info=None, local_vars_configuration=None): # noqa: E501 - """GraphicsResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_graphics_info = None - self.discriminator = None - - if doc_graphics_info is not None: - self.doc_graphics_info = doc_graphics_info - - @property - def doc_graphics_info(self): - """Gets the doc_graphics_info of this GraphicsResultAllOf. # noqa: E501 - - - :return: The doc_graphics_info of this GraphicsResultAllOf. # noqa: E501 - :rtype: GraphicFieldsList - """ - return self._doc_graphics_info - - @doc_graphics_info.setter - def doc_graphics_info(self, doc_graphics_info): - """Sets the doc_graphics_info of this GraphicsResultAllOf. - - - :param doc_graphics_info: The doc_graphics_info of this GraphicsResultAllOf. # noqa: E501 - :type doc_graphics_info: GraphicFieldsList - """ - - self._doc_graphics_info = doc_graphics_info - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, GraphicsResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, GraphicsResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/healthcheck.py b/regula/documentreader/webclient/gen/models/healthcheck.py index e6232b4..83f97ba 100644 --- a/regula/documentreader/webclient/gen/models/healthcheck.py +++ b/regula/documentreader/webclient/gen/models/healthcheck.py @@ -4,307 +4,127 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.healthcheck_documents_database import HealthcheckDocumentsDatabase +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class Healthcheck(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Healthcheck(BaseModel): """ + Healthcheck + """ # noqa: E501 + app: StrictStr = Field(description="Application name.") + license_id: Optional[StrictStr] = Field(description="Unique license identifier.", alias="licenseId") + license_type: Optional[StrictStr] = Field(description="License type.", alias="licenseType") + license_serial: Optional[StrictStr] = Field(description="License serial number.", alias="licenseSerial") + license_valid_until: Optional[datetime] = Field(description="License validity date.", alias="licenseValidUntil") + scenarios: Optional[List[StrictStr]] = Field(description="List of supported scenarios.") + version: Optional[StrictStr] = Field(description="Product version.") + metadata: Optional[Dict[str, Any]] = None + documents_database: Optional[HealthcheckDocumentsDatabase] = Field(default=None, alias="documentsDatabase") + __properties: ClassVar[List[str]] = ["app", "licenseId", "licenseType", "licenseSerial", "licenseValidUntil", "scenarios", "version", "metadata", "documentsDatabase"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Healthcheck from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of documents_database + if self.documents_database: + _dict['documentsDatabase'] = self.documents_database.to_dict() + # set to None if license_id (nullable) is None + # and model_fields_set contains the field + if self.license_id is None and "license_id" in self.model_fields_set: + _dict['licenseId'] = None + + # set to None if license_type (nullable) is None + # and model_fields_set contains the field + if self.license_type is None and "license_type" in self.model_fields_set: + _dict['licenseType'] = None + + # set to None if license_serial (nullable) is None + # and model_fields_set contains the field + if self.license_serial is None and "license_serial" in self.model_fields_set: + _dict['licenseSerial'] = None + + # set to None if license_valid_until (nullable) is None + # and model_fields_set contains the field + if self.license_valid_until is None and "license_valid_until" in self.model_fields_set: + _dict['licenseValidUntil'] = None + + # set to None if scenarios (nullable) is None + # and model_fields_set contains the field + if self.scenarios is None and "scenarios" in self.model_fields_set: + _dict['scenarios'] = None + + # set to None if version (nullable) is None + # and model_fields_set contains the field + if self.version is None and "version" in self.model_fields_set: + _dict['version'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Healthcheck from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "app": obj.get("app"), + "licenseId": obj.get("licenseId"), + "licenseType": obj.get("licenseType"), + "licenseSerial": obj.get("licenseSerial"), + "licenseValidUntil": obj.get("licenseValidUntil"), + "scenarios": obj.get("scenarios"), + "version": obj.get("version"), + "metadata": obj.get("metadata"), + "documentsDatabase": HealthcheckDocumentsDatabase.from_dict(obj["documentsDatabase"]) if obj.get("documentsDatabase") is not None else None + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'app': 'str', - 'license_id': 'str', - 'license_type': 'str', - 'license_serial': 'str', - 'license_valid_until': 'datetime', - 'scenarios': 'list[str]', - 'version': 'str', - 'documents_database': 'HealthcheckDocumentsDatabase' - } - - attribute_map = { - 'app': 'app', - 'license_id': 'licenseId', - 'license_type': 'licenseType', - 'license_serial': 'licenseSerial', - 'license_valid_until': 'licenseValidUntil', - 'scenarios': 'scenarios', - 'version': 'version', - 'documents_database': 'documentsDatabase' - } - - def __init__(self, app=None, license_id=None, license_type=None, license_serial=None, license_valid_until=None, scenarios=None, version=None, documents_database=None, local_vars_configuration=None): # noqa: E501 - """Healthcheck - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._app = None - self._license_id = None - self._license_type = None - self._license_serial = None - self._license_valid_until = None - self._scenarios = None - self._version = None - self._documents_database = None - self.discriminator = None - - self.app = app - self.license_id = license_id - self.license_type = license_type - self.license_serial = license_serial - self.license_valid_until = license_valid_until - self.scenarios = scenarios - self.version = version - if documents_database is not None: - self.documents_database = documents_database - - @property - def app(self): - """Gets the app of this Healthcheck. # noqa: E501 - - Application name. # noqa: E501 - - :return: The app of this Healthcheck. # noqa: E501 - :rtype: str - """ - return self._app - - @app.setter - def app(self, app): - """Sets the app of this Healthcheck. - - Application name. # noqa: E501 - - :param app: The app of this Healthcheck. # noqa: E501 - :type app: str - """ - if self.local_vars_configuration.client_side_validation and app is None: # noqa: E501 - raise ValueError("Invalid value for `app`, must not be `None`") # noqa: E501 - - self._app = app - - @property - def license_id(self): - """Gets the license_id of this Healthcheck. # noqa: E501 - - Unique license identifier. # noqa: E501 - - :return: The license_id of this Healthcheck. # noqa: E501 - :rtype: str - """ - return self._license_id - - @license_id.setter - def license_id(self, license_id): - """Sets the license_id of this Healthcheck. - - Unique license identifier. # noqa: E501 - - :param license_id: The license_id of this Healthcheck. # noqa: E501 - :type license_id: str - """ - - self._license_id = license_id - - @property - def license_type(self): - """Gets the license_type of this Healthcheck. # noqa: E501 - - License type. # noqa: E501 - - :return: The license_type of this Healthcheck. # noqa: E501 - :rtype: str - """ - return self._license_type - - @license_type.setter - def license_type(self, license_type): - """Sets the license_type of this Healthcheck. - - License type. # noqa: E501 - - :param license_type: The license_type of this Healthcheck. # noqa: E501 - :type license_type: str - """ - - self._license_type = license_type - - @property - def license_serial(self): - """Gets the license_serial of this Healthcheck. # noqa: E501 - - License serial number. # noqa: E501 - - :return: The license_serial of this Healthcheck. # noqa: E501 - :rtype: str - """ - return self._license_serial - - @license_serial.setter - def license_serial(self, license_serial): - """Sets the license_serial of this Healthcheck. - - License serial number. # noqa: E501 - - :param license_serial: The license_serial of this Healthcheck. # noqa: E501 - :type license_serial: str - """ - - self._license_serial = license_serial - - @property - def license_valid_until(self): - """Gets the license_valid_until of this Healthcheck. # noqa: E501 - - License validity date. # noqa: E501 - - :return: The license_valid_until of this Healthcheck. # noqa: E501 - :rtype: datetime - """ - return self._license_valid_until - - @license_valid_until.setter - def license_valid_until(self, license_valid_until): - """Sets the license_valid_until of this Healthcheck. - - License validity date. # noqa: E501 - - :param license_valid_until: The license_valid_until of this Healthcheck. # noqa: E501 - :type license_valid_until: datetime - """ - - self._license_valid_until = license_valid_until - - @property - def scenarios(self): - """Gets the scenarios of this Healthcheck. # noqa: E501 - - List of supported scenarios. # noqa: E501 - - :return: The scenarios of this Healthcheck. # noqa: E501 - :rtype: list[str] - """ - return self._scenarios - - @scenarios.setter - def scenarios(self, scenarios): - """Sets the scenarios of this Healthcheck. - - List of supported scenarios. # noqa: E501 - - :param scenarios: The scenarios of this Healthcheck. # noqa: E501 - :type scenarios: list[str] - """ - - self._scenarios = scenarios - - @property - def version(self): - """Gets the version of this Healthcheck. # noqa: E501 - - Product version. # noqa: E501 - - :return: The version of this Healthcheck. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this Healthcheck. - - Product version. # noqa: E501 - - :param version: The version of this Healthcheck. # noqa: E501 - :type version: str - """ - - self._version = version - - @property - def documents_database(self): - """Gets the documents_database of this Healthcheck. # noqa: E501 - - - :return: The documents_database of this Healthcheck. # noqa: E501 - :rtype: HealthcheckDocumentsDatabase - """ - return self._documents_database - - @documents_database.setter - def documents_database(self, documents_database): - """Sets the documents_database of this Healthcheck. - - - :param documents_database: The documents_database of this Healthcheck. # noqa: E501 - :type documents_database: HealthcheckDocumentsDatabase - """ - - self._documents_database = documents_database - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Healthcheck): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Healthcheck): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/healthcheck_documents_database.py b/regula/documentreader/webclient/gen/models/healthcheck_documents_database.py index 5433e08..57b4641 100644 --- a/regula/documentreader/webclient/gen/models/healthcheck_documents_database.py +++ b/regula/documentreader/webclient/gen/models/healthcheck_documents_database.py @@ -4,198 +4,102 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Database information. -""" -class HealthcheckDocumentsDatabase(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class HealthcheckDocumentsDatabase(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'id': 'str', - 'version': 'str', - 'export_date': 'date', - 'description': 'str' - } - - attribute_map = { - 'id': 'id', - 'version': 'version', - 'export_date': 'exportDate', - 'description': 'description' - } - - def __init__(self, id=None, version=None, export_date=None, description=None, local_vars_configuration=None): # noqa: E501 - """HealthcheckDocumentsDatabase - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._id = None - self._version = None - self._export_date = None - self._description = None - self.discriminator = None - - self.id = id - self.version = version - self.export_date = export_date - self.description = description - - @property - def id(self): - """Gets the id of this HealthcheckDocumentsDatabase. # noqa: E501 - - Database identifier. # noqa: E501 - - :return: The id of this HealthcheckDocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._id - - @id.setter - def id(self, id): - """Sets the id of this HealthcheckDocumentsDatabase. - - Database identifier. # noqa: E501 - - :param id: The id of this HealthcheckDocumentsDatabase. # noqa: E501 - :type id: str - """ - - self._id = id - - @property - def version(self): - """Gets the version of this HealthcheckDocumentsDatabase. # noqa: E501 - - Database version. # noqa: E501 - - :return: The version of this HealthcheckDocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this HealthcheckDocumentsDatabase. - - Database version. # noqa: E501 - - :param version: The version of this HealthcheckDocumentsDatabase. # noqa: E501 - :type version: str - """ - - self._version = version - - @property - def export_date(self): - """Gets the export_date of this HealthcheckDocumentsDatabase. # noqa: E501 - - Date of database creation. # noqa: E501 - - :return: The export_date of this HealthcheckDocumentsDatabase. # noqa: E501 - :rtype: date + Database information. + """ # noqa: E501 + id: Optional[StrictStr] = Field(description="Database identifier.") + version: Optional[StrictStr] = Field(description="Database version.") + export_date: Optional[StrictStr] = Field(description="Date of database creation.", alias="exportDate") + description: Optional[StrictStr] = Field(description="Description of the database contents, such as the list of supported countries and documents.") + __properties: ClassVar[List[str]] = ["id", "version", "exportDate", "description"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of HealthcheckDocumentsDatabase from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._export_date - - @export_date.setter - def export_date(self, export_date): - """Sets the export_date of this HealthcheckDocumentsDatabase. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if id (nullable) is None + # and model_fields_set contains the field + if self.id is None and "id" in self.model_fields_set: + _dict['id'] = None + + # set to None if version (nullable) is None + # and model_fields_set contains the field + if self.version is None and "version" in self.model_fields_set: + _dict['version'] = None + + # set to None if export_date (nullable) is None + # and model_fields_set contains the field + if self.export_date is None and "export_date" in self.model_fields_set: + _dict['exportDate'] = None + + # set to None if description (nullable) is None + # and model_fields_set contains the field + if self.description is None and "description" in self.model_fields_set: + _dict['description'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of HealthcheckDocumentsDatabase from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "id": obj.get("id"), + "version": obj.get("version"), + "exportDate": obj.get("exportDate"), + "description": obj.get("description") + }) + return _obj - Date of database creation. # noqa: E501 - - :param export_date: The export_date of this HealthcheckDocumentsDatabase. # noqa: E501 - :type export_date: date - """ - - self._export_date = export_date - - @property - def description(self): - """Gets the description of this HealthcheckDocumentsDatabase. # noqa: E501 - - Description of the database contents, such as the list of supported countries and documents. # noqa: E501 - - :return: The description of this HealthcheckDocumentsDatabase. # noqa: E501 - :rtype: str - """ - return self._description - - @description.setter - def description(self, description): - """Sets the description of this HealthcheckDocumentsDatabase. - - Description of the database contents, such as the list of supported countries and documents. # noqa: E501 - - :param description: The description of this HealthcheckDocumentsDatabase. # noqa: E501 - :type description: str - """ - self._description = description - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, HealthcheckDocumentsDatabase): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, HealthcheckDocumentsDatabase): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/ident_item.py b/regula/documentreader/webclient/gen/models/ident_item.py new file mode 100644 index 0000000..5add572 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/ident_item.py @@ -0,0 +1,106 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.area_container import AreaContainer +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from typing import Optional, Set +from typing_extensions import Self + +class IdentItem(BaseModel): + """ + IdentItem + """ # noqa: E501 + element_type: SecurityFeatureType = Field(alias="ElementType") + light_index: Light = Field(alias="LightIndex") + area: Optional[RectangleCoordinates] = Field(default=None, alias="Area") + image: ImageData = Field(alias="Image") + etalon_image: ImageData = Field(alias="EtalonImage") + area_list: Optional[AreaContainer] = Field(default=None, alias="AreaList") + __properties: ClassVar[List[str]] = ["ElementType", "LightIndex", "Area", "Image", "EtalonImage", "AreaList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of IdentItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of area + if self.area: + _dict['Area'] = self.area.to_dict() + # override the default output from pydantic by calling `to_dict()` of image + if self.image: + _dict['Image'] = self.image.to_dict() + # override the default output from pydantic by calling `to_dict()` of etalon_image + if self.etalon_image: + _dict['EtalonImage'] = self.etalon_image.to_dict() + # override the default output from pydantic by calling `to_dict()` of area_list + if self.area_list: + _dict['AreaList'] = self.area_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of IdentItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ElementType": obj.get("ElementType"), + "LightIndex": obj.get("LightIndex"), + "Area": RectangleCoordinates.from_dict(obj["Area"]) if obj.get("Area") is not None else None, + "Image": ImageData.from_dict(obj["Image"]) if obj.get("Image") is not None else None, + "EtalonImage": ImageData.from_dict(obj["EtalonImage"]) if obj.get("EtalonImage") is not None else None, + "AreaList": AreaContainer.from_dict(obj["AreaList"]) if obj.get("AreaList") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/ident_result.py b/regula/documentreader/webclient/gen/models/ident_result.py index c005f01..1b94a03 100644 --- a/regula/documentreader/webclient/gen/models/ident_result.py +++ b/regula/documentreader/webclient/gen/models/ident_result.py @@ -4,353 +4,111 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class IdentResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.area_container import AreaContainer +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from typing import Optional, Set +from typing_extensions import Self + +class IdentResult(AuthenticityCheckResultItem): """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int', - 'element_type': 'SecurityFeatureType', - 'light_index': 'Light', - 'area': 'RectangleCoordinates', - 'image': 'ImageData', - 'etalon_image': 'ImageData', - 'area_list': 'AreaContainer' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue', - 'element_type': 'ElementType', - 'light_index': 'LightIndex', - 'area': 'Area', - 'image': 'Image', - 'etalon_image': 'EtalonImage', - 'area_list': 'AreaList' - } - - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, element_type=None, light_index=None, area=None, image=None, etalon_image=None, area_list=None, local_vars_configuration=None): # noqa: E501 - """IdentResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self._element_type = None - self._light_index = None - self._area = None - self._image = None - self._etalon_image = None - self._area_list = None - self.discriminator = None - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - if element_type is not None: - self.element_type = element_type - if light_index is not None: - self.light_index = light_index - if area is not None: - self.area = area - if image is not None: - self.image = image - if etalon_image is not None: - self.etalon_image = etalon_image - if area_list is not None: - self.area_list = area_list - - @property - def type(self): - """Gets the type of this IdentResult. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this IdentResult. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this IdentResult. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this IdentResult. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this IdentResult. # noqa: E501 - - - :return: The element_result of this IdentResult. # noqa: E501 - :rtype: CheckResult - """ - return self._element_result - - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this IdentResult. - - - :param element_result: The element_result of this IdentResult. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this IdentResult. # noqa: E501 - - - :return: The element_diagnose of this IdentResult. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this IdentResult. - - - :param element_diagnose: The element_diagnose of this IdentResult. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this IdentResult. # noqa: E501 - - - :return: The percent_value of this IdentResult. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this IdentResult. - - - :param percent_value: The percent_value of this IdentResult. # noqa: E501 - :type percent_value: int - """ - - self._percent_value = percent_value - - @property - def element_type(self): - """Gets the element_type of this IdentResult. # noqa: E501 - - - :return: The element_type of this IdentResult. # noqa: E501 - :rtype: SecurityFeatureType - """ - return self._element_type - - @element_type.setter - def element_type(self, element_type): - """Sets the element_type of this IdentResult. - - - :param element_type: The element_type of this IdentResult. # noqa: E501 - :type element_type: SecurityFeatureType - """ - - self._element_type = element_type - - @property - def light_index(self): - """Gets the light_index of this IdentResult. # noqa: E501 - - - :return: The light_index of this IdentResult. # noqa: E501 - :rtype: Light - """ - return self._light_index - - @light_index.setter - def light_index(self, light_index): - """Sets the light_index of this IdentResult. - - - :param light_index: The light_index of this IdentResult. # noqa: E501 - :type light_index: Light - """ - - self._light_index = light_index - - @property - def area(self): - """Gets the area of this IdentResult. # noqa: E501 - - - :return: The area of this IdentResult. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this IdentResult. - - - :param area: The area of this IdentResult. # noqa: E501 - :type area: RectangleCoordinates - """ - - self._area = area - - @property - def image(self): - """Gets the image of this IdentResult. # noqa: E501 - - - :return: The image of this IdentResult. # noqa: E501 - :rtype: ImageData - """ - return self._image - - @image.setter - def image(self, image): - """Sets the image of this IdentResult. - - - :param image: The image of this IdentResult. # noqa: E501 - :type image: ImageData - """ - - self._image = image - - @property - def etalon_image(self): - """Gets the etalon_image of this IdentResult. # noqa: E501 - - - :return: The etalon_image of this IdentResult. # noqa: E501 - :rtype: ImageData - """ - return self._etalon_image - - @etalon_image.setter - def etalon_image(self, etalon_image): - """Sets the etalon_image of this IdentResult. - - - :param etalon_image: The etalon_image of this IdentResult. # noqa: E501 - :type etalon_image: ImageData - """ - - self._etalon_image = etalon_image - - @property - def area_list(self): - """Gets the area_list of this IdentResult. # noqa: E501 - - - :return: The area_list of this IdentResult. # noqa: E501 - :rtype: AreaContainer - """ - return self._area_list - - @area_list.setter - def area_list(self, area_list): - """Sets the area_list of this IdentResult. - - - :param area_list: The area_list of this IdentResult. # noqa: E501 - :type area_list: AreaContainer - """ - - self._area_list = area_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, IdentResult): - return False - - return self.to_dict() == other.to_dict() + IdentResult + """ # noqa: E501 + element_type: SecurityFeatureType = Field(alias="ElementType") + light_index: Light = Field(alias="LightIndex") + area: Optional[RectangleCoordinates] = Field(default=None, alias="Area") + image: ImageData = Field(alias="Image") + etalon_image: ImageData = Field(alias="EtalonImage") + area_list: Optional[AreaContainer] = Field(default=None, alias="AreaList") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue", "ElementType", "LightIndex", "Area", "Image", "EtalonImage", "AreaList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of IdentResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of area + if self.area: + _dict['Area'] = self.area.to_dict() + # override the default output from pydantic by calling `to_dict()` of image + if self.image: + _dict['Image'] = self.image.to_dict() + # override the default output from pydantic by calling `to_dict()` of etalon_image + if self.etalon_image: + _dict['EtalonImage'] = self.etalon_image.to_dict() + # override the default output from pydantic by calling `to_dict()` of area_list + if self.area_list: + _dict['AreaList'] = self.area_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of IdentResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "ElementResult": obj.get("ElementResult"), + "ElementDiagnose": obj.get("ElementDiagnose"), + "PercentValue": obj.get("PercentValue"), + "ElementType": obj.get("ElementType"), + "LightIndex": obj.get("LightIndex"), + "Area": RectangleCoordinates.from_dict(obj["Area"]) if obj.get("Area") is not None else None, + "Image": ImageData.from_dict(obj["Image"]) if obj.get("Image") is not None else None, + "EtalonImage": ImageData.from_dict(obj["EtalonImage"]) if obj.get("EtalonImage") is not None else None, + "AreaList": AreaContainer.from_dict(obj["AreaList"]) if obj.get("AreaList") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, IdentResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/ident_result_all_of.py b/regula/documentreader/webclient/gen/models/ident_result_all_of.py deleted file mode 100644 index 2686db8..0000000 --- a/regula/documentreader/webclient/gen/models/ident_result_all_of.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class IdentResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'element_type': 'SecurityFeatureType', - 'light_index': 'Light', - 'area': 'RectangleCoordinates', - 'image': 'ImageData', - 'etalon_image': 'ImageData', - 'area_list': 'AreaContainer' - } - - attribute_map = { - 'element_type': 'ElementType', - 'light_index': 'LightIndex', - 'area': 'Area', - 'image': 'Image', - 'etalon_image': 'EtalonImage', - 'area_list': 'AreaList' - } - - def __init__(self, element_type=None, light_index=None, area=None, image=None, etalon_image=None, area_list=None, local_vars_configuration=None): # noqa: E501 - """IdentResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._element_type = None - self._light_index = None - self._area = None - self._image = None - self._etalon_image = None - self._area_list = None - self.discriminator = None - - if element_type is not None: - self.element_type = element_type - if light_index is not None: - self.light_index = light_index - if area is not None: - self.area = area - if image is not None: - self.image = image - if etalon_image is not None: - self.etalon_image = etalon_image - if area_list is not None: - self.area_list = area_list - - @property - def element_type(self): - """Gets the element_type of this IdentResultAllOf. # noqa: E501 - - - :return: The element_type of this IdentResultAllOf. # noqa: E501 - :rtype: SecurityFeatureType - """ - return self._element_type - - @element_type.setter - def element_type(self, element_type): - """Sets the element_type of this IdentResultAllOf. - - - :param element_type: The element_type of this IdentResultAllOf. # noqa: E501 - :type element_type: SecurityFeatureType - """ - - self._element_type = element_type - - @property - def light_index(self): - """Gets the light_index of this IdentResultAllOf. # noqa: E501 - - - :return: The light_index of this IdentResultAllOf. # noqa: E501 - :rtype: Light - """ - return self._light_index - - @light_index.setter - def light_index(self, light_index): - """Sets the light_index of this IdentResultAllOf. - - - :param light_index: The light_index of this IdentResultAllOf. # noqa: E501 - :type light_index: Light - """ - - self._light_index = light_index - - @property - def area(self): - """Gets the area of this IdentResultAllOf. # noqa: E501 - - - :return: The area of this IdentResultAllOf. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this IdentResultAllOf. - - - :param area: The area of this IdentResultAllOf. # noqa: E501 - :type area: RectangleCoordinates - """ - - self._area = area - - @property - def image(self): - """Gets the image of this IdentResultAllOf. # noqa: E501 - - - :return: The image of this IdentResultAllOf. # noqa: E501 - :rtype: ImageData - """ - return self._image - - @image.setter - def image(self, image): - """Sets the image of this IdentResultAllOf. - - - :param image: The image of this IdentResultAllOf. # noqa: E501 - :type image: ImageData - """ - - self._image = image - - @property - def etalon_image(self): - """Gets the etalon_image of this IdentResultAllOf. # noqa: E501 - - - :return: The etalon_image of this IdentResultAllOf. # noqa: E501 - :rtype: ImageData - """ - return self._etalon_image - - @etalon_image.setter - def etalon_image(self, etalon_image): - """Sets the etalon_image of this IdentResultAllOf. - - - :param etalon_image: The etalon_image of this IdentResultAllOf. # noqa: E501 - :type etalon_image: ImageData - """ - - self._etalon_image = etalon_image - - @property - def area_list(self): - """Gets the area_list of this IdentResultAllOf. # noqa: E501 - - - :return: The area_list of this IdentResultAllOf. # noqa: E501 - :rtype: AreaContainer - """ - return self._area_list - - @area_list.setter - def area_list(self, area_list): - """Sets the area_list of this IdentResultAllOf. - - - :param area_list: The area_list of this IdentResultAllOf. # noqa: E501 - :type area_list: AreaContainer - """ - - self._area_list = area_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, IdentResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, IdentResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_data.py b/regula/documentreader/webclient/gen/models/image_data.py old mode 100755 new mode 100644 index 8a8a349..fbdd739 --- a/regula/documentreader/webclient/gen/models/image_data.py +++ b/regula/documentreader/webclient/gen/models/image_data.py @@ -4,147 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageData(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class ImageData(BaseModel): """ - openapi_types = { - 'image': 'str', - 'format': 'str' - } - - attribute_map = { - 'image': 'image', - 'format': 'format' - } - - def __init__(self, image=None, format=None, local_vars_configuration=None): # noqa: E501 - """ImageData - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._image = None - self._format = None - self.discriminator = None - - self.image = image - if format is not None: - self.format = format - - @property - def image(self): - """Gets the image of this ImageData. # noqa: E501 - - Base64 encoded image # noqa: E501 - - :return: The image of this ImageData. # noqa: E501 - :rtype: str + ImageData + """ # noqa: E501 + image: StrictStr = Field(description="Base64 encoded image") + format: Optional[StrictStr] = Field(default=None, description="Image format") + __properties: ClassVar[List[str]] = ["image", "format"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._image + excluded_fields: Set[str] = set([ + ]) - @image.setter - def image(self, image): - """Sets the image of this ImageData. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - Base64 encoded image # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageData from a dict""" + if obj is None: + return None - :param image: The image of this ImageData. # noqa: E501 - :type image: str - """ - if self.local_vars_configuration.client_side_validation and image is None: # noqa: E501 - raise ValueError("Invalid value for `image`, must not be `None`") # noqa: E501 - - self._image = image - - @property - def format(self): - """Gets the format of this ImageData. # noqa: E501 - - Image format # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The format of this ImageData. # noqa: E501 - :rtype: str - """ - return self._format - - @format.setter - def format(self, format): - """Sets the format of this ImageData. + _obj = cls.model_validate({ + "image": obj.get("image"), + "format": obj.get("format") + }) + return _obj - Image format # noqa: E501 - - :param format: The format of this ImageData. # noqa: E501 - :type format: str - """ - self._format = format - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageData): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageData): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_qa.py b/regula/documentreader/webclient/gen/models/image_qa.py index 6f0ed7f..6bd827e 100644 --- a/regula/documentreader/webclient/gen/models/image_qa.py +++ b/regula/documentreader/webclient/gen/models/image_qa.py @@ -4,314 +4,93 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.input_image_quality_checks import InputImageQualityChecks +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageQA(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ImageQA(BaseModel): """ + ImageQA + """ # noqa: E501 + brightness_threshold: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Set the threshold for an actual document brightness below which the check fails", alias="brightnessThreshold") + dpi_threshold: Optional[StrictInt] = Field(default=None, description="This parameter sets threshold for Image QA check of the presented document physical dpi. If actual document dpi is below this threshold, check will fail.", alias="dpiThreshold") + angle_threshold: Optional[StrictInt] = Field(default=None, description="This parameter sets threshold for Image QA check of the presented document perspective angle in degrees. If actual document perspective angle is above this threshold, check will fail.", alias="angleThreshold") + focus_check: Optional[StrictBool] = Field(default=None, description="This option enables focus check while performing image quality validation.", alias="focusCheck") + glares_check: Optional[StrictBool] = Field(default=None, description="This option enables glares check while performing image quality validation.", alias="glaresCheck") + colorness_check: Optional[StrictBool] = Field(default=None, description="This option enables colorness check while performing image quality validation.", alias="colornessCheck") + moire_check: Optional[StrictBool] = Field(default=None, description="This option enables screen capture (moire patterns) check while performing image quality validation.", alias="moireCheck") + document_position_indent: Optional[StrictInt] = Field(default=None, description="This parameter specifies the necessary margin. Default 0.", alias="documentPositionIndent") + expected_pass: Optional[List[InputImageQualityChecks]] = Field(default=None, description="This parameter controls the quality checks that the image should pass to be considered a valid input during the scanning process.", alias="expectedPass") + __properties: ClassVar[List[str]] = ["brightnessThreshold", "dpiThreshold", "angleThreshold", "focusCheck", "glaresCheck", "colornessCheck", "moireCheck", "documentPositionIndent", "expectedPass"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageQA from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageQA from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "brightnessThreshold": obj.get("brightnessThreshold"), + "dpiThreshold": obj.get("dpiThreshold"), + "angleThreshold": obj.get("angleThreshold"), + "focusCheck": obj.get("focusCheck"), + "glaresCheck": obj.get("glaresCheck"), + "colornessCheck": obj.get("colornessCheck"), + "moireCheck": obj.get("moireCheck"), + "documentPositionIndent": obj.get("documentPositionIndent"), + "expectedPass": obj.get("expectedPass") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'brightness_threshold': 'float', - 'dpi_threshold': 'int', - 'angle_threshold': 'int', - 'focus_check': 'bool', - 'glares_check': 'bool', - 'colorness_check': 'bool', - 'document_position_indent': 'int', - 'expected_pass': 'list[InputImageQualityChecks]' - } - - attribute_map = { - 'brightness_threshold': 'brightnessThreshold', - 'dpi_threshold': 'dpiThreshold', - 'angle_threshold': 'angleThreshold', - 'focus_check': 'focusCheck', - 'glares_check': 'glaresCheck', - 'colorness_check': 'colornessCheck', - 'document_position_indent': 'documentPositionIndent', - 'expected_pass': 'expectedPass' - } - - def __init__(self, brightness_threshold=None, dpi_threshold=None, angle_threshold=None, focus_check=None, glares_check=None, colorness_check=None, document_position_indent=None, expected_pass=None, local_vars_configuration=None): # noqa: E501 - """ImageQA - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._brightness_threshold = None - self._dpi_threshold = None - self._angle_threshold = None - self._focus_check = None - self._glares_check = None - self._colorness_check = None - self._document_position_indent = None - self._expected_pass = None - self.discriminator = None - - if brightness_threshold is not None: - self.brightness_threshold = brightness_threshold - if dpi_threshold is not None: - self.dpi_threshold = dpi_threshold - if angle_threshold is not None: - self.angle_threshold = angle_threshold - if focus_check is not None: - self.focus_check = focus_check - if glares_check is not None: - self.glares_check = glares_check - if colorness_check is not None: - self.colorness_check = colorness_check - if document_position_indent is not None: - self.document_position_indent = document_position_indent - if expected_pass is not None: - self.expected_pass = expected_pass - - @property - def brightness_threshold(self): - """Gets the brightness_threshold of this ImageQA. # noqa: E501 - - Set the threshold for an actual document brightness below which the check fails # noqa: E501 - - :return: The brightness_threshold of this ImageQA. # noqa: E501 - :rtype: float - """ - return self._brightness_threshold - - @brightness_threshold.setter - def brightness_threshold(self, brightness_threshold): - """Sets the brightness_threshold of this ImageQA. - - Set the threshold for an actual document brightness below which the check fails # noqa: E501 - - :param brightness_threshold: The brightness_threshold of this ImageQA. # noqa: E501 - :type brightness_threshold: float - """ - - self._brightness_threshold = brightness_threshold - - @property - def dpi_threshold(self): - """Gets the dpi_threshold of this ImageQA. # noqa: E501 - - This parameter sets threshold for Image QA check of the presented document physical dpi. If actual document dpi is below this threshold, check will fail. # noqa: E501 - - :return: The dpi_threshold of this ImageQA. # noqa: E501 - :rtype: int - """ - return self._dpi_threshold - - @dpi_threshold.setter - def dpi_threshold(self, dpi_threshold): - """Sets the dpi_threshold of this ImageQA. - - This parameter sets threshold for Image QA check of the presented document physical dpi. If actual document dpi is below this threshold, check will fail. # noqa: E501 - - :param dpi_threshold: The dpi_threshold of this ImageQA. # noqa: E501 - :type dpi_threshold: int - """ - - self._dpi_threshold = dpi_threshold - - @property - def angle_threshold(self): - """Gets the angle_threshold of this ImageQA. # noqa: E501 - - This parameter sets threshold for Image QA check of the presented document perspective angle in degrees. If actual document perspective angle is above this threshold, check will fail. # noqa: E501 - - :return: The angle_threshold of this ImageQA. # noqa: E501 - :rtype: int - """ - return self._angle_threshold - - @angle_threshold.setter - def angle_threshold(self, angle_threshold): - """Sets the angle_threshold of this ImageQA. - - This parameter sets threshold for Image QA check of the presented document perspective angle in degrees. If actual document perspective angle is above this threshold, check will fail. # noqa: E501 - - :param angle_threshold: The angle_threshold of this ImageQA. # noqa: E501 - :type angle_threshold: int - """ - - self._angle_threshold = angle_threshold - - @property - def focus_check(self): - """Gets the focus_check of this ImageQA. # noqa: E501 - - This option enables focus check while performing image quality validation. # noqa: E501 - - :return: The focus_check of this ImageQA. # noqa: E501 - :rtype: bool - """ - return self._focus_check - - @focus_check.setter - def focus_check(self, focus_check): - """Sets the focus_check of this ImageQA. - - This option enables focus check while performing image quality validation. # noqa: E501 - - :param focus_check: The focus_check of this ImageQA. # noqa: E501 - :type focus_check: bool - """ - - self._focus_check = focus_check - - @property - def glares_check(self): - """Gets the glares_check of this ImageQA. # noqa: E501 - - This option enables glares check while performing image quality validation. # noqa: E501 - - :return: The glares_check of this ImageQA. # noqa: E501 - :rtype: bool - """ - return self._glares_check - - @glares_check.setter - def glares_check(self, glares_check): - """Sets the glares_check of this ImageQA. - - This option enables glares check while performing image quality validation. # noqa: E501 - - :param glares_check: The glares_check of this ImageQA. # noqa: E501 - :type glares_check: bool - """ - - self._glares_check = glares_check - - @property - def colorness_check(self): - """Gets the colorness_check of this ImageQA. # noqa: E501 - - This option enables colorness check while performing image quality validation. # noqa: E501 - - :return: The colorness_check of this ImageQA. # noqa: E501 - :rtype: bool - """ - return self._colorness_check - - @colorness_check.setter - def colorness_check(self, colorness_check): - """Sets the colorness_check of this ImageQA. - - This option enables colorness check while performing image quality validation. # noqa: E501 - - :param colorness_check: The colorness_check of this ImageQA. # noqa: E501 - :type colorness_check: bool - """ - - self._colorness_check = colorness_check - - @property - def document_position_indent(self): - """Gets the document_position_indent of this ImageQA. # noqa: E501 - - This parameter specifies the necessary margin. Default 0. # noqa: E501 - - :return: The document_position_indent of this ImageQA. # noqa: E501 - :rtype: int - """ - return self._document_position_indent - - @document_position_indent.setter - def document_position_indent(self, document_position_indent): - """Sets the document_position_indent of this ImageQA. - - This parameter specifies the necessary margin. Default 0. # noqa: E501 - - :param document_position_indent: The document_position_indent of this ImageQA. # noqa: E501 - :type document_position_indent: int - """ - - self._document_position_indent = document_position_indent - - @property - def expected_pass(self): - """Gets the expected_pass of this ImageQA. # noqa: E501 - - This parameter controls the quality checks that the image should pass to be considered a valid input during the scanning process. # noqa: E501 - - :return: The expected_pass of this ImageQA. # noqa: E501 - :rtype: list[InputImageQualityChecks] - """ - return self._expected_pass - - @expected_pass.setter - def expected_pass(self, expected_pass): - """Sets the expected_pass of this ImageQA. - - This parameter controls the quality checks that the image should pass to be considered a valid input during the scanning process. # noqa: E501 - - :param expected_pass: The expected_pass of this ImageQA. # noqa: E501 - :type expected_pass: list[InputImageQualityChecks] - """ - - self._expected_pass = expected_pass - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQA): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQA): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_quality_check.py b/regula/documentreader/webclient/gen/models/image_quality_check.py index 37ec24c..5ac03c1 100644 --- a/regula/documentreader/webclient/gen/models/image_quality_check.py +++ b/regula/documentreader/webclient/gen/models/image_quality_check.py @@ -4,272 +4,95 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageQualityCheck(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.area_array import AreaArray +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.image_quality_check_type import ImageQualityCheckType +from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from typing import Optional, Set +from typing_extensions import Self + +class ImageQualityCheck(BaseModel): """ - openapi_types = { - 'type': 'ImageQualityCheckType', - 'result': 'CheckResult', - 'feature_type': 'SecurityFeatureType', - 'areas': 'AreaArray', - 'mean': 'float', - 'std_dev': 'float', - 'probability': 'int' - } - - attribute_map = { - 'type': 'type', - 'result': 'result', - 'feature_type': 'featureType', - 'areas': 'areas', - 'mean': 'mean', - 'std_dev': 'std_dev', - 'probability': 'probability' - } - - def __init__(self, type=None, result=None, feature_type=None, areas=None, mean=None, std_dev=None, probability=None, local_vars_configuration=None): # noqa: E501 - """ImageQualityCheck - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._result = None - self._feature_type = None - self._areas = None - self._mean = None - self._std_dev = None - self._probability = None - self.discriminator = None - - if type is not None: - self.type = type - if result is not None: - self.result = result - if feature_type is not None: - self.feature_type = feature_type - if areas is not None: - self.areas = areas - if mean is not None: - self.mean = mean - if std_dev is not None: - self.std_dev = std_dev - if probability is not None: - self.probability = probability - - @property - def type(self): - """Gets the type of this ImageQualityCheck. # noqa: E501 - - - :return: The type of this ImageQualityCheck. # noqa: E501 - :rtype: ImageQualityCheckType - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this ImageQualityCheck. - - - :param type: The type of this ImageQualityCheck. # noqa: E501 - :type type: ImageQualityCheckType - """ - - self._type = type - - @property - def result(self): - """Gets the result of this ImageQualityCheck. # noqa: E501 - - - :return: The result of this ImageQualityCheck. # noqa: E501 - :rtype: CheckResult - """ - return self._result - - @result.setter - def result(self, result): - """Sets the result of this ImageQualityCheck. - - - :param result: The result of this ImageQualityCheck. # noqa: E501 - :type result: CheckResult - """ - - self._result = result - - @property - def feature_type(self): - """Gets the feature_type of this ImageQualityCheck. # noqa: E501 - - - :return: The feature_type of this ImageQualityCheck. # noqa: E501 - :rtype: SecurityFeatureType - """ - return self._feature_type - - @feature_type.setter - def feature_type(self, feature_type): - """Sets the feature_type of this ImageQualityCheck. - - - :param feature_type: The feature_type of this ImageQualityCheck. # noqa: E501 - :type feature_type: SecurityFeatureType - """ - - self._feature_type = feature_type - - @property - def areas(self): - """Gets the areas of this ImageQualityCheck. # noqa: E501 - - - :return: The areas of this ImageQualityCheck. # noqa: E501 - :rtype: AreaArray - """ - return self._areas - - @areas.setter - def areas(self, areas): - """Sets the areas of this ImageQualityCheck. - - - :param areas: The areas of this ImageQualityCheck. # noqa: E501 - :type areas: AreaArray - """ - - self._areas = areas - - @property - def mean(self): - """Gets the mean of this ImageQualityCheck. # noqa: E501 - - - :return: The mean of this ImageQualityCheck. # noqa: E501 - :rtype: float - """ - return self._mean - - @mean.setter - def mean(self, mean): - """Sets the mean of this ImageQualityCheck. - - - :param mean: The mean of this ImageQualityCheck. # noqa: E501 - :type mean: float - """ - - self._mean = mean - - @property - def std_dev(self): - """Gets the std_dev of this ImageQualityCheck. # noqa: E501 - - - :return: The std_dev of this ImageQualityCheck. # noqa: E501 - :rtype: float + ImageQualityCheck + """ # noqa: E501 + type: ImageQualityCheckType + result: CheckResult + feature_type: SecurityFeatureType = Field(alias="featureType") + areas: Optional[AreaArray] = None + mean: Union[StrictFloat, StrictInt] = Field(description="Check mean value") + std_dev: Union[StrictFloat, StrictInt] = Field(description="Check deviation value") + probability: StrictInt = Field(description="Check probability value") + __properties: ClassVar[List[str]] = ["type", "result", "featureType", "areas", "mean", "std_dev", "probability"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageQualityCheck from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._std_dev - - @std_dev.setter - def std_dev(self, std_dev): - """Sets the std_dev of this ImageQualityCheck. - - - :param std_dev: The std_dev of this ImageQualityCheck. # noqa: E501 - :type std_dev: float - """ - - self._std_dev = std_dev - - @property - def probability(self): - """Gets the probability of this ImageQualityCheck. # noqa: E501 - - - :return: The probability of this ImageQualityCheck. # noqa: E501 - :rtype: int - """ - return self._probability - - @probability.setter - def probability(self, probability): - """Sets the probability of this ImageQualityCheck. - - - :param probability: The probability of this ImageQualityCheck. # noqa: E501 - :type probability: int - """ - - self._probability = probability - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQualityCheck): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of areas + if self.areas: + _dict['areas'] = self.areas.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageQualityCheck from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "type": obj.get("type"), + "result": obj.get("result"), + "featureType": obj.get("featureType"), + "areas": AreaArray.from_dict(obj["areas"]) if obj.get("areas") is not None else None, + "mean": obj.get("mean"), + "std_dev": obj.get("std_dev"), + "probability": obj.get("probability") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQualityCheck): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_quality_check_list.py b/regula/documentreader/webclient/gen/models/image_quality_check_list.py index 0dca268..a961313 100644 --- a/regula/documentreader/webclient/gen/models/image_quality_check_list.py +++ b/regula/documentreader/webclient/gen/models/image_quality_check_list.py @@ -4,144 +4,89 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.image_quality_check import ImageQualityCheck +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageQualityCheckList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class ImageQualityCheckList(BaseModel): """ - openapi_types = { - 'result': 'CheckResult', - 'list': 'list[ImageQualityCheck]' - } - - attribute_map = { - 'result': 'result', - 'list': 'List' - } - - def __init__(self, result=None, list=None, local_vars_configuration=None): # noqa: E501 - """ImageQualityCheckList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._result = None - self._list = None - self.discriminator = None - - self.result = result - self.list = list - - @property - def result(self): - """Gets the result of this ImageQualityCheckList. # noqa: E501 - - - :return: The result of this ImageQualityCheckList. # noqa: E501 - :rtype: CheckResult + ImageQualityCheckList + """ # noqa: E501 + result: CheckResult + list: List[ImageQualityCheck] = Field(alias="List") + count: Union[StrictFloat, StrictInt] = Field(description="Number of List array elements", alias="Count") + __properties: ClassVar[List[str]] = ["result", "List", "Count"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageQualityCheckList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result - - @result.setter - def result(self, result): - """Sets the result of this ImageQualityCheckList. - - - :param result: The result of this ImageQualityCheckList. # noqa: E501 - :type result: CheckResult - """ - if self.local_vars_configuration.client_side_validation and result is None: # noqa: E501 - raise ValueError("Invalid value for `result`, must not be `None`") # noqa: E501 - - self._result = result + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageQualityCheckList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "result": obj.get("result"), + "List": [ImageQualityCheck.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None, + "Count": obj.get("Count") + }) + return _obj - @property - def list(self): - """Gets the list of this ImageQualityCheckList. # noqa: E501 - - :return: The list of this ImageQualityCheckList. # noqa: E501 - :rtype: list[ImageQualityCheck] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this ImageQualityCheckList. - - - :param list: The list of this ImageQualityCheckList. # noqa: E501 - :type list: list[ImageQualityCheck] - """ - if self.local_vars_configuration.client_side_validation and list is None: # noqa: E501 - raise ValueError("Invalid value for `list`, must not be `None`") # noqa: E501 - - self._list = list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQualityCheckList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQualityCheckList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_quality_check_list_item.py b/regula/documentreader/webclient/gen/models/image_quality_check_list_item.py new file mode 100644 index 0000000..c074aab --- /dev/null +++ b/regula/documentreader/webclient/gen/models/image_quality_check_list_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.image_quality_check_list import ImageQualityCheckList +from typing import Optional, Set +from typing_extensions import Self + +class ImageQualityCheckListItem(BaseModel): + """ + ImageQualityCheckListItem + """ # noqa: E501 + image_quality_check_list: ImageQualityCheckList = Field(alias="ImageQualityCheckList") + __properties: ClassVar[List[str]] = ["ImageQualityCheckList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageQualityCheckListItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of image_quality_check_list + if self.image_quality_check_list: + _dict['ImageQualityCheckList'] = self.image_quality_check_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageQualityCheckListItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ImageQualityCheckList": ImageQualityCheckList.from_dict(obj["ImageQualityCheckList"]) if obj.get("ImageQualityCheckList") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/image_quality_check_type.py b/regula/documentreader/webclient/gen/models/image_quality_check_type.py index 7305191..a9312b7 100644 --- a/regula/documentreader/webclient/gen/models/image_quality_check_type.py +++ b/regula/documentreader/webclient/gen/models/image_quality_check_type.py @@ -4,108 +4,33 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Image quality check type -""" -class ImageQualityCheckType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ImageQualityCheckType(int, Enum): + """ + Image quality check type """ - - ImageGlares = int("0") - - ImageFocus = int("1") - - ImageResolution = int("2") - - ImageColorness = int("3") - - Perspective = int("4") - - Bounds = int("5") - - Portrait = int("7") - - Brightness = int("9") - - Occlusion = int("10") - - allowable_values = [ImageGlares, ImageFocus, ImageResolution, ImageColorness, Perspective, Bounds, Portrait, Brightness, Occlusion] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """ImageQualityCheckType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQualityCheckType): - return False - - return self.to_dict() == other.to_dict() + ImageGlares = 0 + ImageFocus = 1 + ImageResolution = 2 + ImageColorness = 3 + Perspective = 4 + Bounds = 5 + Portrait = 7 + Brightness = 9 + Occlusion = 10 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ImageQualityCheckType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQualityCheckType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_quality_result.py b/regula/documentreader/webclient/gen/models/image_quality_result.py index f0a0c0b..324313a 100644 --- a/regula/documentreader/webclient/gen/models/image_quality_result.py +++ b/regula/documentreader/webclient/gen/models/image_quality_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.image_quality_check_list import ImageQualityCheckList +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageQualityResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ImageQualityResult(ResultItem): """ + ImageQualityResult + """ # noqa: E501 + image_quality_check_list: ImageQualityCheckList = Field(alias="ImageQualityCheckList") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "ImageQualityCheckList"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'image_quality_check_list': 'ImageQualityCheckList', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'image_quality_check_list': 'ImageQualityCheckList', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, image_quality_check_list=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """ImageQualityResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._image_quality_check_list = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.image_quality_check_list = image_quality_check_list - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def image_quality_check_list(self): - """Gets the image_quality_check_list of this ImageQualityResult. # noqa: E501 - - - :return: The image_quality_check_list of this ImageQualityResult. # noqa: E501 - :rtype: ImageQualityCheckList - """ - return self._image_quality_check_list - - @image_quality_check_list.setter - def image_quality_check_list(self, image_quality_check_list): - """Sets the image_quality_check_list of this ImageQualityResult. - - - :param image_quality_check_list: The image_quality_check_list of this ImageQualityResult. # noqa: E501 - :type image_quality_check_list: ImageQualityCheckList - """ - if self.local_vars_configuration.client_side_validation and image_quality_check_list is None: # noqa: E501 - raise ValueError("Invalid value for `image_quality_check_list`, must not be `None`") # noqa: E501 - - self._image_quality_check_list = image_quality_check_list - - @property - def buf_length(self): - """Gets the buf_length of this ImageQualityResult. # noqa: E501 - - - :return: The buf_length of this ImageQualityResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this ImageQualityResult. - - - :param buf_length: The buf_length of this ImageQualityResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this ImageQualityResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this ImageQualityResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ImageQualityResult. - - - :param light: The light of this ImageQualityResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this ImageQualityResult. # noqa: E501 - - - :return: The list_idx of this ImageQualityResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this ImageQualityResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this ImageQualityResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this ImageQualityResult. # noqa: E501 - - - :return: The page_idx of this ImageQualityResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ImageQualityResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageQualityResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this ImageQualityResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this ImageQualityResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this ImageQualityResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this ImageQualityResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of image_quality_check_list + if self.image_quality_check_list: + _dict['ImageQualityCheckList'] = self.image_quality_check_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageQualityResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "ImageQualityCheckList": ImageQualityCheckList.from_dict(obj["ImageQualityCheckList"]) if obj.get("ImageQualityCheckList") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this ImageQualityResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQualityResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQualityResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_quality_result_all_of.py b/regula/documentreader/webclient/gen/models/image_quality_result_all_of.py deleted file mode 100644 index 79faa96..0000000 --- a/regula/documentreader/webclient/gen/models/image_quality_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageQualityResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'image_quality_check_list': 'ImageQualityCheckList' - } - - attribute_map = { - 'image_quality_check_list': 'ImageQualityCheckList' - } - - def __init__(self, image_quality_check_list=None, local_vars_configuration=None): # noqa: E501 - """ImageQualityResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._image_quality_check_list = None - self.discriminator = None - - self.image_quality_check_list = image_quality_check_list - - @property - def image_quality_check_list(self): - """Gets the image_quality_check_list of this ImageQualityResultAllOf. # noqa: E501 - - - :return: The image_quality_check_list of this ImageQualityResultAllOf. # noqa: E501 - :rtype: ImageQualityCheckList - """ - return self._image_quality_check_list - - @image_quality_check_list.setter - def image_quality_check_list(self, image_quality_check_list): - """Sets the image_quality_check_list of this ImageQualityResultAllOf. - - - :param image_quality_check_list: The image_quality_check_list of this ImageQualityResultAllOf. # noqa: E501 - :type image_quality_check_list: ImageQualityCheckList - """ - if self.local_vars_configuration.client_side_validation and image_quality_check_list is None: # noqa: E501 - raise ValueError("Invalid value for `image_quality_check_list`, must not be `None`") # noqa: E501 - - self._image_quality_check_list = image_quality_check_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageQualityResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageQualityResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/image_transaction_data.py b/regula/documentreader/webclient/gen/models/image_transaction_data.py index 8ae6f62..ec1b2e9 100644 --- a/regula/documentreader/webclient/gen/models/image_transaction_data.py +++ b/regula/documentreader/webclient/gen/models/image_transaction_data.py @@ -4,116 +4,80 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.images_field_value import ImagesFieldValue +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImageTransactionData(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ImageTransactionData(BaseModel): """ + ImageTransactionData + """ # noqa: E501 + image: Optional[ImagesFieldValue] = None + __properties: ClassVar[List[str]] = ["image"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'image': 'ImagesFieldValue' - } + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - attribute_map = { - 'image': 'image' - } - def __init__(self, image=None, local_vars_configuration=None): # noqa: E501 - """ImageTransactionData - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - self._image = None - self.discriminator = None + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - if image is not None: - self.image = image + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImageTransactionData from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @property - def image(self): - """Gets the image of this ImageTransactionData. # noqa: E501 + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :return: The image of this ImageTransactionData. # noqa: E501 - :rtype: ImagesFieldValue + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._image - - @image.setter - def image(self, image): - """Sets the image of this ImageTransactionData. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of image + if self.image: + _dict['image'] = self.image.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImageTransactionData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "image": ImagesFieldValue.from_dict(obj["image"]) if obj.get("image") is not None else None + }) + return _obj - :param image: The image of this ImageTransactionData. # noqa: E501 - :type image: ImagesFieldValue - """ - - self._image = image - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImageTransactionData): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImageTransactionData): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images.py b/regula/documentreader/webclient/gen/models/images.py old mode 100755 new mode 100644 index cb32470..defa36f --- a/regula/documentreader/webclient/gen/models/images.py +++ b/regula/documentreader/webclient/gen/models/images.py @@ -4,144 +4,98 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.images_available_source import ImagesAvailableSource +from regula.documentreader.webclient.gen.models.images_field import ImagesField +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class Images(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class Images(BaseModel): """ - openapi_types = { - 'available_source_list': 'list[ImagesAvailableSource]', - 'field_list': 'list[ImagesField]' - } - - attribute_map = { - 'available_source_list': 'availableSourceList', - 'field_list': 'fieldList' - } - - def __init__(self, available_source_list=None, field_list=None, local_vars_configuration=None): # noqa: E501 - """Images - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._available_source_list = None - self._field_list = None - self.discriminator = None - - self.available_source_list = available_source_list - self.field_list = field_list - - @property - def available_source_list(self): - """Gets the available_source_list of this Images. # noqa: E501 - - - :return: The available_source_list of this Images. # noqa: E501 - :rtype: list[ImagesAvailableSource] + Images + """ # noqa: E501 + field_count: Optional[StrictInt] = Field(default=None, description="Fields count", alias="fieldCount") + available_source_count: Optional[StrictInt] = Field(default=None, description="Available sources count", alias="availableSourceCount") + available_source_list: List[ImagesAvailableSource] = Field(alias="availableSourceList") + field_list: List[ImagesField] = Field(alias="fieldList") + __properties: ClassVar[List[str]] = ["fieldCount", "availableSourceCount", "availableSourceList", "fieldList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Images from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._available_source_list - - @available_source_list.setter - def available_source_list(self, available_source_list): - """Sets the available_source_list of this Images. - - - :param available_source_list: The available_source_list of this Images. # noqa: E501 - :type available_source_list: list[ImagesAvailableSource] - """ - if self.local_vars_configuration.client_side_validation and available_source_list is None: # noqa: E501 - raise ValueError("Invalid value for `available_source_list`, must not be `None`") # noqa: E501 - - self._available_source_list = available_source_list + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in available_source_list (list) + _items = [] + if self.available_source_list: + for _item_available_source_list in self.available_source_list: + if _item_available_source_list: + _items.append(_item_available_source_list.to_dict()) + _dict['availableSourceList'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in field_list (list) + _items = [] + if self.field_list: + for _item_field_list in self.field_list: + if _item_field_list: + _items.append(_item_field_list.to_dict()) + _dict['fieldList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Images from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "fieldCount": obj.get("fieldCount"), + "availableSourceCount": obj.get("availableSourceCount"), + "availableSourceList": [ImagesAvailableSource.from_dict(_item) for _item in obj["availableSourceList"]] if obj.get("availableSourceList") is not None else None, + "fieldList": [ImagesField.from_dict(_item) for _item in obj["fieldList"]] if obj.get("fieldList") is not None else None + }) + return _obj - @property - def field_list(self): - """Gets the field_list of this Images. # noqa: E501 - - :return: The field_list of this Images. # noqa: E501 - :rtype: list[ImagesField] - """ - return self._field_list - - @field_list.setter - def field_list(self, field_list): - """Sets the field_list of this Images. - - - :param field_list: The field_list of this Images. # noqa: E501 - :type field_list: list[ImagesField] - """ - if self.local_vars_configuration.client_side_validation and field_list is None: # noqa: E501 - raise ValueError("Invalid value for `field_list`, must not be `None`") # noqa: E501 - - self._field_list = field_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Images): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Images): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images_available_source.py b/regula/documentreader/webclient/gen/models/images_available_source.py old mode 100755 new mode 100644 index f50413b..af0e0dc --- a/regula/documentreader/webclient/gen/models/images_available_source.py +++ b/regula/documentreader/webclient/gen/models/images_available_source.py @@ -4,145 +4,79 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImagesAvailableSource(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self +class ImagesAvailableSource(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'container_type': 'int', - 'source': 'Source' - } - - attribute_map = { - 'container_type': 'containerType', - 'source': 'source' - } - - def __init__(self, container_type=0, source=None, local_vars_configuration=None): # noqa: E501 - """ImagesAvailableSource - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._container_type = None - self._source = None - self.discriminator = None - - if container_type is not None: - self.container_type = container_type - self.source = source - - @property - def container_type(self): - """Gets the container_type of this ImagesAvailableSource. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The container_type of this ImagesAvailableSource. # noqa: E501 - :rtype: int - """ - return self._container_type - - @container_type.setter - def container_type(self, container_type): - """Sets the container_type of this ImagesAvailableSource. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param container_type: The container_type of this ImagesAvailableSource. # noqa: E501 - :type container_type: int + ImagesAvailableSource + """ # noqa: E501 + container_type: StrictInt = Field(description="Same as Result type, but used for safe parsing of not-described values. See Result type.", alias="containerType") + source: Source + __properties: ClassVar[List[str]] = ["containerType", "source"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImagesAvailableSource from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ + excluded_fields: Set[str] = set([ + ]) - self._container_type = container_type - - @property - def source(self): - """Gets the source of this ImagesAvailableSource. # noqa: E501 + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImagesAvailableSource from a dict""" + if obj is None: + return None - :return: The source of this ImagesAvailableSource. # noqa: E501 - :rtype: Source - """ - return self._source + if not isinstance(obj, dict): + return cls.model_validate(obj) - @source.setter - def source(self, source): - """Sets the source of this ImagesAvailableSource. + _obj = cls.model_validate({ + "containerType": obj.get("containerType") if obj.get("containerType") is not None else 0, + "source": obj.get("source") + }) + return _obj - :param source: The source of this ImagesAvailableSource. # noqa: E501 - :type source: Source - """ - if self.local_vars_configuration.client_side_validation and source is None: # noqa: E501 - raise ValueError("Invalid value for `source`, must not be `None`") # noqa: E501 - - self._source = source - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImagesAvailableSource): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImagesAvailableSource): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images_field.py b/regula/documentreader/webclient/gen/models/images_field.py old mode 100755 new mode 100644 index 6e808e4..67f0ef0 --- a/regula/documentreader/webclient/gen/models/images_field.py +++ b/regula/documentreader/webclient/gen/models/images_field.py @@ -4,173 +4,91 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImagesField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType +from regula.documentreader.webclient.gen.models.images_field_value import ImagesFieldValue +from typing import Optional, Set +from typing_extensions import Self +class ImagesField(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'field_name': 'str', - 'field_type': 'GraphicFieldType', - 'value_list': 'list[ImagesFieldValue]' - } - - attribute_map = { - 'field_name': 'fieldName', - 'field_type': 'fieldType', - 'value_list': 'valueList' - } - - def __init__(self, field_name=None, field_type=None, value_list=None, local_vars_configuration=None): # noqa: E501 - """ImagesField - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._field_name = None - self._field_type = None - self._value_list = None - self.discriminator = None - - self.field_name = field_name - self.field_type = field_type - self.value_list = value_list - - @property - def field_name(self): - """Gets the field_name of this ImagesField. # noqa: E501 - - Human readable field name. Do not bind to this name - use GraphicFieldType instead. # noqa: E501 - - :return: The field_name of this ImagesField. # noqa: E501 - :rtype: str + ImagesField + """ # noqa: E501 + field_name: StrictStr = Field(description="Human readable field name. Do not bind to this name - use GraphicFieldType instead.", alias="fieldName") + field_type: GraphicFieldType = Field(alias="fieldType") + value_list: List[ImagesFieldValue] = Field(alias="valueList") + value_count: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Field value count", alias="valueCount") + __properties: ClassVar[List[str]] = ["fieldName", "fieldType", "valueList", "valueCount"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImagesField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._field_name - - @field_name.setter - def field_name(self, field_name): - """Sets the field_name of this ImagesField. - - Human readable field name. Do not bind to this name - use GraphicFieldType instead. # noqa: E501 - - :param field_name: The field_name of this ImagesField. # noqa: E501 - :type field_name: str - """ - if self.local_vars_configuration.client_side_validation and field_name is None: # noqa: E501 - raise ValueError("Invalid value for `field_name`, must not be `None`") # noqa: E501 - - self._field_name = field_name - - @property - def field_type(self): - """Gets the field_type of this ImagesField. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in value_list (list) + _items = [] + if self.value_list: + for _item_value_list in self.value_list: + if _item_value_list: + _items.append(_item_value_list.to_dict()) + _dict['valueList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImagesField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "fieldName": obj.get("fieldName"), + "fieldType": obj.get("fieldType"), + "valueList": [ImagesFieldValue.from_dict(_item) for _item in obj["valueList"]] if obj.get("valueList") is not None else None, + "valueCount": obj.get("valueCount") + }) + return _obj - :return: The field_type of this ImagesField. # noqa: E501 - :rtype: GraphicFieldType - """ - return self._field_type - - @field_type.setter - def field_type(self, field_type): - """Sets the field_type of this ImagesField. - - - :param field_type: The field_type of this ImagesField. # noqa: E501 - :type field_type: GraphicFieldType - """ - if self.local_vars_configuration.client_side_validation and field_type is None: # noqa: E501 - raise ValueError("Invalid value for `field_type`, must not be `None`") # noqa: E501 - - self._field_type = field_type - - @property - def value_list(self): - """Gets the value_list of this ImagesField. # noqa: E501 - - - :return: The value_list of this ImagesField. # noqa: E501 - :rtype: list[ImagesFieldValue] - """ - return self._value_list - - @value_list.setter - def value_list(self, value_list): - """Sets the value_list of this ImagesField. - - - :param value_list: The value_list of this ImagesField. # noqa: E501 - :type value_list: list[ImagesFieldValue] - """ - if self.local_vars_configuration.client_side_validation and value_list is None: # noqa: E501 - raise ValueError("Invalid value for `value_list`, must not be `None`") # noqa: E501 - - self._value_list = value_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImagesField): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImagesField): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images_field_value.py b/regula/documentreader/webclient/gen/models/images_field_value.py old mode 100755 new mode 100644 index c9e6e4e..7e08d8e --- a/regula/documentreader/webclient/gen/models/images_field_value.py +++ b/regula/documentreader/webclient/gen/models/images_field_value.py @@ -4,339 +4,102 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImagesFieldValue(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.rfid_origin import RfidOrigin +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self + +class ImagesFieldValue(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'source': 'Source', - 'value': 'str', - 'original_value': 'str', - 'original_page_index': 'int', - 'page_index': 'int', - 'light_index': 'Light', - 'container_type': 'int', - 'field_rect': 'RectangleCoordinates', - 'rfid_origin': 'RfidOrigin' - } - - attribute_map = { - 'source': 'source', - 'value': 'value', - 'original_value': 'originalValue', - 'original_page_index': 'originalPageIndex', - 'page_index': 'pageIndex', - 'light_index': 'lightIndex', - 'container_type': 'containerType', - 'field_rect': 'fieldRect', - 'rfid_origin': 'rfidOrigin' - } - - def __init__(self, source=None, value=None, original_value=None, original_page_index=None, page_index=None, light_index=None, container_type=0, field_rect=None, rfid_origin=None, local_vars_configuration=None): # noqa: E501 - """ImagesFieldValue - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._source = None - self._value = None - self._original_value = None - self._original_page_index = None - self._page_index = None - self._light_index = None - self._container_type = None - self._field_rect = None - self._rfid_origin = None - self.discriminator = None - - self.source = source - self.value = value - if original_value is not None: - self.original_value = original_value - if original_page_index is not None: - self.original_page_index = original_page_index - self.page_index = page_index - self.light_index = light_index - self.container_type = container_type - if field_rect is not None: - self.field_rect = field_rect - if rfid_origin is not None: - self.rfid_origin = rfid_origin - - @property - def source(self): - """Gets the source of this ImagesFieldValue. # noqa: E501 - - - :return: The source of this ImagesFieldValue. # noqa: E501 - :rtype: Source - """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this ImagesFieldValue. - - - :param source: The source of this ImagesFieldValue. # noqa: E501 - :type source: Source - """ - if self.local_vars_configuration.client_side_validation and source is None: # noqa: E501 - raise ValueError("Invalid value for `source`, must not be `None`") # noqa: E501 - - self._source = source - - @property - def value(self): - """Gets the value of this ImagesFieldValue. # noqa: E501 - - Base64 encoded image # noqa: E501 - - :return: The value of this ImagesFieldValue. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this ImagesFieldValue. - - Base64 encoded image # noqa: E501 - - :param value: The value of this ImagesFieldValue. # noqa: E501 - :type value: str - """ - if self.local_vars_configuration.client_side_validation and value is None: # noqa: E501 - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - - self._value = value - - @property - def original_value(self): - """Gets the original_value of this ImagesFieldValue. # noqa: E501 - - Base64 encoded image # noqa: E501 - - :return: The original_value of this ImagesFieldValue. # noqa: E501 - :rtype: str - """ - return self._original_value - - @original_value.setter - def original_value(self, original_value): - """Sets the original_value of this ImagesFieldValue. - - Base64 encoded image # noqa: E501 - - :param original_value: The original_value of this ImagesFieldValue. # noqa: E501 - :type original_value: str - """ - - self._original_value = original_value - - @property - def original_page_index(self): - """Gets the original_page_index of this ImagesFieldValue. # noqa: E501 - - Original page index # noqa: E501 - - :return: The original_page_index of this ImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._original_page_index - - @original_page_index.setter - def original_page_index(self, original_page_index): - """Sets the original_page_index of this ImagesFieldValue. - - Original page index # noqa: E501 - - :param original_page_index: The original_page_index of this ImagesFieldValue. # noqa: E501 - :type original_page_index: int - """ - - self._original_page_index = original_page_index - - @property - def page_index(self): - """Gets the page_index of this ImagesFieldValue. # noqa: E501 - - Page index of the image from input list # noqa: E501 - - :return: The page_index of this ImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._page_index - - @page_index.setter - def page_index(self, page_index): - """Sets the page_index of this ImagesFieldValue. - - Page index of the image from input list # noqa: E501 - - :param page_index: The page_index of this ImagesFieldValue. # noqa: E501 - :type page_index: int - """ - if self.local_vars_configuration.client_side_validation and page_index is None: # noqa: E501 - raise ValueError("Invalid value for `page_index`, must not be `None`") # noqa: E501 - - self._page_index = page_index - - @property - def light_index(self): - """Gets the light_index of this ImagesFieldValue. # noqa: E501 - - - :return: The light_index of this ImagesFieldValue. # noqa: E501 - :rtype: Light - """ - return self._light_index - - @light_index.setter - def light_index(self, light_index): - """Sets the light_index of this ImagesFieldValue. - - - :param light_index: The light_index of this ImagesFieldValue. # noqa: E501 - :type light_index: Light - """ - if self.local_vars_configuration.client_side_validation and light_index is None: # noqa: E501 - raise ValueError("Invalid value for `light_index`, must not be `None`") # noqa: E501 - - self._light_index = light_index - - @property - def container_type(self): - """Gets the container_type of this ImagesFieldValue. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The container_type of this ImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._container_type - - @container_type.setter - def container_type(self, container_type): - """Sets the container_type of this ImagesFieldValue. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param container_type: The container_type of this ImagesFieldValue. # noqa: E501 - :type container_type: int - """ - if self.local_vars_configuration.client_side_validation and container_type is None: # noqa: E501 - raise ValueError("Invalid value for `container_type`, must not be `None`") # noqa: E501 - - self._container_type = container_type - - @property - def field_rect(self): - """Gets the field_rect of this ImagesFieldValue. # noqa: E501 - - - :return: The field_rect of this ImagesFieldValue. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this ImagesFieldValue. - - - :param field_rect: The field_rect of this ImagesFieldValue. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def rfid_origin(self): - """Gets the rfid_origin of this ImagesFieldValue. # noqa: E501 - - - :return: The rfid_origin of this ImagesFieldValue. # noqa: E501 - :rtype: RfidOrigin - """ - return self._rfid_origin - - @rfid_origin.setter - def rfid_origin(self, rfid_origin): - """Sets the rfid_origin of this ImagesFieldValue. - - - :param rfid_origin: The rfid_origin of this ImagesFieldValue. # noqa: E501 - :type rfid_origin: RfidOrigin - """ - - self._rfid_origin = rfid_origin - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImagesFieldValue): - return False - - return self.to_dict() == other.to_dict() + ImagesFieldValue + """ # noqa: E501 + source: Source + value: Optional[StrictStr] = Field(default=None, description="Base64 encoded image") + original_value: Optional[StrictStr] = Field(default=None, description="Base64 encoded image", alias="originalValue") + original_page_index: Optional[StrictInt] = Field(default=None, description="Original page index", alias="originalPageIndex") + page_index: StrictInt = Field(description="Page index of the image from input list", alias="pageIndex") + light_index: Light = Field(alias="lightIndex") + container_type: StrictInt = Field(description="Same as Result type, but used for safe parsing of not-described values. See Result type.", alias="containerType") + field_rect: Optional[RectangleCoordinates] = Field(default=None, alias="fieldRect") + rfid_origin: Optional[RfidOrigin] = Field(default=None, alias="rfidOrigin") + __properties: ClassVar[List[str]] = ["source", "value", "originalValue", "originalPageIndex", "pageIndex", "lightIndex", "containerType", "fieldRect", "rfidOrigin"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImagesFieldValue from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['fieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of rfid_origin + if self.rfid_origin: + _dict['rfidOrigin'] = self.rfid_origin.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImagesFieldValue from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "source": obj.get("source"), + "value": obj.get("value"), + "originalValue": obj.get("originalValue"), + "originalPageIndex": obj.get("originalPageIndex"), + "pageIndex": obj.get("pageIndex"), + "lightIndex": obj.get("lightIndex"), + "containerType": obj.get("containerType") if obj.get("containerType") is not None else 0, + "fieldRect": RectangleCoordinates.from_dict(obj["fieldRect"]) if obj.get("fieldRect") is not None else None, + "rfidOrigin": RfidOrigin.from_dict(obj["rfidOrigin"]) if obj.get("rfidOrigin") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImagesFieldValue): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images_item.py b/regula/documentreader/webclient/gen/models/images_item.py new file mode 100644 index 0000000..a29aa2f --- /dev/null +++ b/regula/documentreader/webclient/gen/models/images_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.images import Images +from typing import Optional, Set +from typing_extensions import Self + +class ImagesItem(BaseModel): + """ + ImagesItem + """ # noqa: E501 + images: Images = Field(alias="Images") + __properties: ClassVar[List[str]] = ["Images"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImagesItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of images + if self.images: + _dict['Images'] = self.images.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImagesItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Images": Images.from_dict(obj["Images"]) if obj.get("Images") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/images_result.py b/regula/documentreader/webclient/gen/models/images_result.py old mode 100755 new mode 100644 index c385008..5f72b1c --- a/regula/documentreader/webclient/gen/models/images_result.py +++ b/regula/documentreader/webclient/gen/models/images_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.images import Images +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImagesResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ImagesResult(ResultItem): """ + ImagesResult + """ # noqa: E501 + images: Images = Field(alias="Images") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "Images"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'images': 'Images', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'images': 'Images', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, images=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """ImagesResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._images = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.images = images - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def images(self): - """Gets the images of this ImagesResult. # noqa: E501 - - - :return: The images of this ImagesResult. # noqa: E501 - :rtype: Images - """ - return self._images - - @images.setter - def images(self, images): - """Sets the images of this ImagesResult. - - - :param images: The images of this ImagesResult. # noqa: E501 - :type images: Images - """ - if self.local_vars_configuration.client_side_validation and images is None: # noqa: E501 - raise ValueError("Invalid value for `images`, must not be `None`") # noqa: E501 - - self._images = images - - @property - def buf_length(self): - """Gets the buf_length of this ImagesResult. # noqa: E501 - - - :return: The buf_length of this ImagesResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this ImagesResult. - - - :param buf_length: The buf_length of this ImagesResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this ImagesResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this ImagesResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ImagesResult. - - - :param light: The light of this ImagesResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this ImagesResult. # noqa: E501 - - - :return: The list_idx of this ImagesResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this ImagesResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this ImagesResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this ImagesResult. # noqa: E501 - - - :return: The page_idx of this ImagesResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ImagesResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ImagesResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this ImagesResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this ImagesResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this ImagesResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this ImagesResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of images + if self.images: + _dict['Images'] = self.images.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ImagesResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "Images": Images.from_dict(obj["Images"]) if obj.get("Images") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this ImagesResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImagesResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImagesResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/images_result_all_of.py b/regula/documentreader/webclient/gen/models/images_result_all_of.py deleted file mode 100755 index 6abb321..0000000 --- a/regula/documentreader/webclient/gen/models/images_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ImagesResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'images': 'Images' - } - - attribute_map = { - 'images': 'Images' - } - - def __init__(self, images=None, local_vars_configuration=None): # noqa: E501 - """ImagesResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._images = None - self.discriminator = None - - self.images = images - - @property - def images(self): - """Gets the images of this ImagesResultAllOf. # noqa: E501 - - - :return: The images of this ImagesResultAllOf. # noqa: E501 - :rtype: Images - """ - return self._images - - @images.setter - def images(self, images): - """Sets the images of this ImagesResultAllOf. - - - :param images: The images of this ImagesResultAllOf. # noqa: E501 - :type images: Images - """ - if self.local_vars_configuration.client_side_validation and images is None: # noqa: E501 - raise ValueError("Invalid value for `images`, must not be `None`") # noqa: E501 - - self._images = images - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ImagesResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ImagesResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/in_data.py b/regula/documentreader/webclient/gen/models/in_data.py index 3486414..4f4113c 100644 --- a/regula/documentreader/webclient/gen/models/in_data.py +++ b/regula/documentreader/webclient/gen/models/in_data.py @@ -4,142 +4,90 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.in_data_transaction_images_field_value import InDataTransactionImagesFieldValue +from regula.documentreader.webclient.gen.models.in_data_video import InDataVideo +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class InData(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class InData(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'video': 'InDataVideo', - 'images': 'list[InDataTransactionImagesFieldValue]' - } - - attribute_map = { - 'video': 'video', - 'images': 'images' - } - - def __init__(self, video=None, images=None, local_vars_configuration=None): # noqa: E501 - """InData - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._video = None - self._images = None - self.discriminator = None - - if video is not None: - self.video = video - if images is not None: - self.images = images - - @property - def video(self): - """Gets the video of this InData. # noqa: E501 - - - :return: The video of this InData. # noqa: E501 - :rtype: InDataVideo + InData + """ # noqa: E501 + video: Optional[InDataVideo] = None + images: Optional[List[InDataTransactionImagesFieldValue]] = None + __properties: ClassVar[List[str]] = ["video", "images"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._video - - @video.setter - def video(self, video): - """Sets the video of this InData. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of video + if self.video: + _dict['video'] = self.video.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in images (list) + _items = [] + if self.images: + for _item_images in self.images: + if _item_images: + _items.append(_item_images.to_dict()) + _dict['images'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "video": InDataVideo.from_dict(obj["video"]) if obj.get("video") is not None else None, + "images": [InDataTransactionImagesFieldValue.from_dict(_item) for _item in obj["images"]] if obj.get("images") is not None else None + }) + return _obj - :param video: The video of this InData. # noqa: E501 - :type video: InDataVideo - """ - - self._video = video - - @property - def images(self): - """Gets the images of this InData. # noqa: E501 - - - :return: The images of this InData. # noqa: E501 - :rtype: list[InDataTransactionImagesFieldValue] - """ - return self._images - - @images.setter - def images(self, images): - """Sets the images of this InData. - - - :param images: The images of this InData. # noqa: E501 - :type images: list[InDataTransactionImagesFieldValue] - """ - self._images = images - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InData): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InData): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/in_data_rfid_session.py b/regula/documentreader/webclient/gen/models/in_data_rfid_session.py deleted file mode 100644 index 6591d53..0000000 --- a/regula/documentreader/webclient/gen/models/in_data_rfid_session.py +++ /dev/null @@ -1,121 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class InDataRfidSession(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'url': 'str' - } - - attribute_map = { - 'url': 'url' - } - - def __init__(self, url=None, local_vars_configuration=None): # noqa: E501 - """InDataRfidSession - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._url = None - self.discriminator = None - - if url is not None: - self.url = url - - @property - def url(self): - """Gets the url of this InDataRfidSession. # noqa: E501 - - Image url # noqa: E501 - - :return: The url of this InDataRfidSession. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this InDataRfidSession. - - Image url # noqa: E501 - - :param url: The url of this InDataRfidSession. # noqa: E501 - :type url: str - """ - - self._url = url - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InDataRfidSession): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InDataRfidSession): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/in_data_transaction_images_field_value.py b/regula/documentreader/webclient/gen/models/in_data_transaction_images_field_value.py index a958de2..045f440 100644 --- a/regula/documentreader/webclient/gen/models/in_data_transaction_images_field_value.py +++ b/regula/documentreader/webclient/gen/models/in_data_transaction_images_field_value.py @@ -4,198 +4,83 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class InDataTransactionImagesFieldValue(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.light import Light +from typing import Optional, Set +from typing_extensions import Self +class InDataTransactionImagesFieldValue(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'light': 'Light', - 'list_idx': 'int', - 'page_idx': 'int', - 'url': 'str' - } - - attribute_map = { - 'light': 'light', - 'list_idx': 'listIdx', - 'page_idx': 'pageIdx', - 'url': 'url' - } - - def __init__(self, light=None, list_idx=None, page_idx=None, url=None, local_vars_configuration=None): # noqa: E501 - """InDataTransactionImagesFieldValue - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._light = None - self._list_idx = None - self._page_idx = None - self._url = None - self.discriminator = None - - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - if url is not None: - self.url = url - - @property - def light(self): - """Gets the light of this InDataTransactionImagesFieldValue. # noqa: E501 - - - :return: The light of this InDataTransactionImagesFieldValue. # noqa: E501 - :rtype: Light - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this InDataTransactionImagesFieldValue. - - - :param light: The light of this InDataTransactionImagesFieldValue. # noqa: E501 - :type light: Light - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - - - :return: The list_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - :rtype: int + InDataTransactionImagesFieldValue + """ # noqa: E501 + light: Optional[Light] = None + list_idx: Optional[StrictInt] = Field(default=None, alias="listIdx") + page_idx: Optional[StrictInt] = Field(default=None, description="Page index of the image from input list", alias="pageIdx") + url: Optional[StrictStr] = Field(default=None, description="Image url") + __properties: ClassVar[List[str]] = ["light", "listIdx", "pageIdx", "url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InDataTransactionImagesFieldValue from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this InDataTransactionImagesFieldValue. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InDataTransactionImagesFieldValue from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "light": obj.get("light"), + "listIdx": obj.get("listIdx"), + "pageIdx": obj.get("pageIdx"), + "url": obj.get("url") + }) + return _obj - :param list_idx: The list_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - - Page index of the image from input list # noqa: E501 - - :return: The page_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this InDataTransactionImagesFieldValue. - - Page index of the image from input list # noqa: E501 - - :param page_idx: The page_idx of this InDataTransactionImagesFieldValue. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def url(self): - """Gets the url of this InDataTransactionImagesFieldValue. # noqa: E501 - - Image url # noqa: E501 - - :return: The url of this InDataTransactionImagesFieldValue. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this InDataTransactionImagesFieldValue. - - Image url # noqa: E501 - - :param url: The url of this InDataTransactionImagesFieldValue. # noqa: E501 - :type url: str - """ - self._url = url - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InDataTransactionImagesFieldValue): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InDataTransactionImagesFieldValue): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/in_data_video.py b/regula/documentreader/webclient/gen/models/in_data_video.py index 05c0f5d..acc0446 100644 --- a/regula/documentreader/webclient/gen/models/in_data_video.py +++ b/regula/documentreader/webclient/gen/models/in_data_video.py @@ -4,146 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Video -""" -class InDataVideo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class InDataVideo(BaseModel): """ - openapi_types = { - 'metadata': 'dict(str, object)', - 'url': 'str' - } - - attribute_map = { - 'metadata': 'metadata', - 'url': 'url' - } - - def __init__(self, metadata=None, url=None, local_vars_configuration=None): # noqa: E501 - """InDataVideo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._metadata = None - self._url = None - self.discriminator = None - - if metadata is not None: - self.metadata = metadata - if url is not None: - self.url = url - - @property - def metadata(self): - """Gets the metadata of this InDataVideo. # noqa: E501 - - A free-form object containing video's extended attributes. # noqa: E501 - - :return: The metadata of this InDataVideo. # noqa: E501 - :rtype: dict(str, object) + Video + """ # noqa: E501 + metadata: Optional[Dict[str, Any]] = Field(default=None, description="A free-form object containing video's extended attributes.") + url: Optional[StrictStr] = Field(default=None, description="Video url") + __properties: ClassVar[List[str]] = ["metadata", "url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of InDataVideo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._metadata + excluded_fields: Set[str] = set([ + ]) - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this InDataVideo. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - A free-form object containing video's extended attributes. # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of InDataVideo from a dict""" + if obj is None: + return None - :param metadata: The metadata of this InDataVideo. # noqa: E501 - :type metadata: dict(str, object) - """ - - self._metadata = metadata - - @property - def url(self): - """Gets the url of this InDataVideo. # noqa: E501 - - Video url # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The url of this InDataVideo. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this InDataVideo. + _obj = cls.model_validate({ + "metadata": obj.get("metadata"), + "url": obj.get("url") + }) + return _obj - Video url # noqa: E501 - - :param url: The url of this InDataVideo. # noqa: E501 - :type url: str - """ - self._url = url - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InDataVideo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InDataVideo): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/inline_response200.py b/regula/documentreader/webclient/gen/models/inline_response200.py deleted file mode 100644 index 64c1fe9..0000000 --- a/regula/documentreader/webclient/gen/models/inline_response200.py +++ /dev/null @@ -1,197 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class InlineResponse200(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'out_data': 'OutData', - 'in_data': 'InData', - 'tag': 'str', - 'transaction_id': 'str' - } - - attribute_map = { - 'out_data': 'OutData', - 'in_data': 'InData', - 'tag': 'tag', - 'transaction_id': 'transactionId' - } - - def __init__(self, out_data=None, in_data=None, tag=None, transaction_id=None, local_vars_configuration=None): # noqa: E501 - """InlineResponse200 - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._out_data = None - self._in_data = None - self._tag = None - self._transaction_id = None - self.discriminator = None - - if out_data is not None: - self.out_data = out_data - if in_data is not None: - self.in_data = in_data - if tag is not None: - self.tag = tag - if transaction_id is not None: - self.transaction_id = transaction_id - - @property - def out_data(self): - """Gets the out_data of this InlineResponse200. # noqa: E501 - - - :return: The out_data of this InlineResponse200. # noqa: E501 - :rtype: OutData - """ - return self._out_data - - @out_data.setter - def out_data(self, out_data): - """Sets the out_data of this InlineResponse200. - - - :param out_data: The out_data of this InlineResponse200. # noqa: E501 - :type out_data: OutData - """ - - self._out_data = out_data - - @property - def in_data(self): - """Gets the in_data of this InlineResponse200. # noqa: E501 - - - :return: The in_data of this InlineResponse200. # noqa: E501 - :rtype: InData - """ - return self._in_data - - @in_data.setter - def in_data(self, in_data): - """Sets the in_data of this InlineResponse200. - - - :param in_data: The in_data of this InlineResponse200. # noqa: E501 - :type in_data: InData - """ - - self._in_data = in_data - - @property - def tag(self): - """Gets the tag of this InlineResponse200. # noqa: E501 - - - :return: The tag of this InlineResponse200. # noqa: E501 - :rtype: str - """ - return self._tag - - @tag.setter - def tag(self, tag): - """Sets the tag of this InlineResponse200. - - - :param tag: The tag of this InlineResponse200. # noqa: E501 - :type tag: str - """ - - self._tag = tag - - @property - def transaction_id(self): - """Gets the transaction_id of this InlineResponse200. # noqa: E501 - - - :return: The transaction_id of this InlineResponse200. # noqa: E501 - :rtype: str - """ - return self._transaction_id - - @transaction_id.setter - def transaction_id(self, transaction_id): - """Sets the transaction_id of this InlineResponse200. - - - :param transaction_id: The transaction_id of this InlineResponse200. # noqa: E501 - :type transaction_id: str - """ - - self._transaction_id = transaction_id - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InlineResponse200): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InlineResponse200): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/inline_response2001.py b/regula/documentreader/webclient/gen/models/inline_response2001.py deleted file mode 100644 index ac71284..0000000 --- a/regula/documentreader/webclient/gen/models/inline_response2001.py +++ /dev/null @@ -1,333 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class InlineResponse2001(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'chip_page': 'RfidLocation', - 'processing_finished': 'ProcessingStatus', - 'container_list': 'ContainerList', - 'transaction_info': 'TransactionInfo', - 'log': 'str', - 'pass_back_object': 'dict(str, object)', - 'more_pages_available': 'int', - 'elapsed_time': 'int', - 'core_lib_result_code': 'int' - } - - attribute_map = { - 'chip_page': 'ChipPage', - 'processing_finished': 'ProcessingFinished', - 'container_list': 'ContainerList', - 'transaction_info': 'TransactionInfo', - 'log': 'log', - 'pass_back_object': 'passBackObject', - 'more_pages_available': 'morePagesAvailable', - 'elapsed_time': 'elapsedTime', - 'core_lib_result_code': 'CoreLibResultCode' - } - - def __init__(self, chip_page=None, processing_finished=None, container_list=None, transaction_info=None, log=None, pass_back_object=None, more_pages_available=None, elapsed_time=None, core_lib_result_code=None, local_vars_configuration=None): # noqa: E501 - """InlineResponse2001 - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._chip_page = None - self._processing_finished = None - self._container_list = None - self._transaction_info = None - self._log = None - self._pass_back_object = None - self._more_pages_available = None - self._elapsed_time = None - self._core_lib_result_code = None - self.discriminator = None - - if chip_page is not None: - self.chip_page = chip_page - if processing_finished is not None: - self.processing_finished = processing_finished - if container_list is not None: - self.container_list = container_list - if transaction_info is not None: - self.transaction_info = transaction_info - if log is not None: - self.log = log - if pass_back_object is not None: - self.pass_back_object = pass_back_object - if more_pages_available is not None: - self.more_pages_available = more_pages_available - if elapsed_time is not None: - self.elapsed_time = elapsed_time - if core_lib_result_code is not None: - self.core_lib_result_code = core_lib_result_code - - @property - def chip_page(self): - """Gets the chip_page of this InlineResponse2001. # noqa: E501 - - - :return: The chip_page of this InlineResponse2001. # noqa: E501 - :rtype: RfidLocation - """ - return self._chip_page - - @chip_page.setter - def chip_page(self, chip_page): - """Sets the chip_page of this InlineResponse2001. - - - :param chip_page: The chip_page of this InlineResponse2001. # noqa: E501 - :type chip_page: RfidLocation - """ - - self._chip_page = chip_page - - @property - def processing_finished(self): - """Gets the processing_finished of this InlineResponse2001. # noqa: E501 - - - :return: The processing_finished of this InlineResponse2001. # noqa: E501 - :rtype: ProcessingStatus - """ - return self._processing_finished - - @processing_finished.setter - def processing_finished(self, processing_finished): - """Sets the processing_finished of this InlineResponse2001. - - - :param processing_finished: The processing_finished of this InlineResponse2001. # noqa: E501 - :type processing_finished: ProcessingStatus - """ - - self._processing_finished = processing_finished - - @property - def container_list(self): - """Gets the container_list of this InlineResponse2001. # noqa: E501 - - - :return: The container_list of this InlineResponse2001. # noqa: E501 - :rtype: ContainerList - """ - return self._container_list - - @container_list.setter - def container_list(self, container_list): - """Sets the container_list of this InlineResponse2001. - - - :param container_list: The container_list of this InlineResponse2001. # noqa: E501 - :type container_list: ContainerList - """ - - self._container_list = container_list - - @property - def transaction_info(self): - """Gets the transaction_info of this InlineResponse2001. # noqa: E501 - - - :return: The transaction_info of this InlineResponse2001. # noqa: E501 - :rtype: TransactionInfo - """ - return self._transaction_info - - @transaction_info.setter - def transaction_info(self, transaction_info): - """Sets the transaction_info of this InlineResponse2001. - - - :param transaction_info: The transaction_info of this InlineResponse2001. # noqa: E501 - :type transaction_info: TransactionInfo - """ - - self._transaction_info = transaction_info - - @property - def log(self): - """Gets the log of this InlineResponse2001. # noqa: E501 - - Base64 encoded transaction processing log # noqa: E501 - - :return: The log of this InlineResponse2001. # noqa: E501 - :rtype: str - """ - return self._log - - @log.setter - def log(self, log): - """Sets the log of this InlineResponse2001. - - Base64 encoded transaction processing log # noqa: E501 - - :param log: The log of this InlineResponse2001. # noqa: E501 - :type log: str - """ - - self._log = log - - @property - def pass_back_object(self): - """Gets the pass_back_object of this InlineResponse2001. # noqa: E501 - - Free-form object provided in request. See passBackObject property of ProcessRequest. # noqa: E501 - - :return: The pass_back_object of this InlineResponse2001. # noqa: E501 - :rtype: dict(str, object) - """ - return self._pass_back_object - - @pass_back_object.setter - def pass_back_object(self, pass_back_object): - """Sets the pass_back_object of this InlineResponse2001. - - Free-form object provided in request. See passBackObject property of ProcessRequest. # noqa: E501 - - :param pass_back_object: The pass_back_object of this InlineResponse2001. # noqa: E501 - :type pass_back_object: dict(str, object) - """ - - self._pass_back_object = pass_back_object - - @property - def more_pages_available(self): - """Gets the more_pages_available of this InlineResponse2001. # noqa: E501 - - - :return: The more_pages_available of this InlineResponse2001. # noqa: E501 - :rtype: int - """ - return self._more_pages_available - - @more_pages_available.setter - def more_pages_available(self, more_pages_available): - """Sets the more_pages_available of this InlineResponse2001. - - - :param more_pages_available: The more_pages_available of this InlineResponse2001. # noqa: E501 - :type more_pages_available: int - """ - - self._more_pages_available = more_pages_available - - @property - def elapsed_time(self): - """Gets the elapsed_time of this InlineResponse2001. # noqa: E501 - - Time the document processing has taken, ms. # noqa: E501 - - :return: The elapsed_time of this InlineResponse2001. # noqa: E501 - :rtype: int - """ - return self._elapsed_time - - @elapsed_time.setter - def elapsed_time(self, elapsed_time): - """Sets the elapsed_time of this InlineResponse2001. - - Time the document processing has taken, ms. # noqa: E501 - - :param elapsed_time: The elapsed_time of this InlineResponse2001. # noqa: E501 - :type elapsed_time: int - """ - - self._elapsed_time = elapsed_time - - @property - def core_lib_result_code(self): - """Gets the core_lib_result_code of this InlineResponse2001. # noqa: E501 - - - :return: The core_lib_result_code of this InlineResponse2001. # noqa: E501 - :rtype: int - """ - return self._core_lib_result_code - - @core_lib_result_code.setter - def core_lib_result_code(self, core_lib_result_code): - """Sets the core_lib_result_code of this InlineResponse2001. - - - :param core_lib_result_code: The core_lib_result_code of this InlineResponse2001. # noqa: E501 - :type core_lib_result_code: int - """ - - self._core_lib_result_code = core_lib_result_code - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InlineResponse2001): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InlineResponse2001): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/input_barcode_type.py b/regula/documentreader/webclient/gen/models/input_barcode_type.py index d818cb1..fb0ca4f 100644 --- a/regula/documentreader/webclient/gen/models/input_barcode_type.py +++ b/regula/documentreader/webclient/gen/models/input_barcode_type.py @@ -4,130 +4,44 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration contains the types of barcodes that can be processed -""" -class InputBarcodeType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class InputBarcodeType(str, Enum): + """ + Enumeration contains the types of barcodes that can be processed """ - - UNKNOWN = "bct_unknown" - - CODE128 = "bct_Code128" - - CODE39 = "bct_Code39" - - EAN8 = "bct_EAN8" - - ITF = "bct_ITF" - - PDF417 = "bct_PDF417" - - STF = "bct_STF" - - MTF = "bct_MTF" - - IATA = "bct_IATA" - - CODABAR = "bct_CODABAR" - - UPCA = "bct_UPCA" - - CODE93 = "bct_CODE93" - - UPCE = "bct_UPCE" - - EAN13 = "bct_EAN13" - - QRCODE = "bct_QRCODE" - - AZTEC = "bct_AZTEC" - - DATAMATRIX = "bct_DATAMATRIX" - - ALL_1D = "bct_ALL_1D" - - CODE11 = "bct_Code11" - - JABCODE = "bct_JABCODE" - - allowable_values = [UNKNOWN, CODE128, CODE39, EAN8, ITF, PDF417, STF, MTF, IATA, CODABAR, UPCA, CODE93, UPCE, EAN13, QRCODE, AZTEC, DATAMATRIX, ALL_1D, CODE11, JABCODE] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """InputBarcodeType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InputBarcodeType): - return False - - return self.to_dict() == other.to_dict() + BCT_UNKNOWN = 'bct_unknown' + BCT_CODE128 = 'bct_Code128' + BCT_CODE39 = 'bct_Code39' + BCT_EAN8 = 'bct_EAN8' + BCT_ITF = 'bct_ITF' + BCT_PDF417 = 'bct_PDF417' + BCT_STF = 'bct_STF' + BCT_MTF = 'bct_MTF' + BCT_IATA = 'bct_IATA' + BCT_CODABAR = 'bct_CODABAR' + BCT_UPCA = 'bct_UPCA' + BCT_CODE93 = 'bct_CODE93' + BCT_UPCE = 'bct_UPCE' + BCT_EAN13 = 'bct_EAN13' + BCT_QRCODE = 'bct_QRCODE' + BCT_AZTEC = 'bct_AZTEC' + BCT_DATAMATRIX = 'bct_DATAMATRIX' + BCT_ALL_1_D = 'bct_ALL_1D' + BCT_CODE11 = 'bct_Code11' + BCT_JABCODE = 'bct_JABCODE' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of InputBarcodeType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InputBarcodeType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/input_image_quality_checks.py b/regula/documentreader/webclient/gen/models/input_image_quality_checks.py index 424b720..d0c9ec3 100644 --- a/regula/documentreader/webclient/gen/models/input_image_quality_checks.py +++ b/regula/documentreader/webclient/gen/models/input_image_quality_checks.py @@ -4,108 +4,33 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Input image quality checks for the document processing -""" -class InputImageQualityChecks(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class InputImageQualityChecks(str, Enum): + """ + Input image quality checks for the document processing """ - - Glares = "glaresCheck" - - Focus = "focusCheck" - - Resolution = "dpiThreshold" - - Colorness = "colornessCheck" - - Perspective = "perspectiveCheck" - - Bounds = "documentPosition" - - Portrait = "portraitCheck" - - Brightness = "brightnessCheck" - - Occlusion = "occlusionCheck" - - allowable_values = [Glares, Focus, Resolution, Colorness, Perspective, Bounds, Portrait, Brightness, Occlusion] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """InputImageQualityChecks - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, InputImageQualityChecks): - return False - - return self.to_dict() == other.to_dict() + GLARESCHECK = 'glaresCheck' + FOCUSCHECK = 'focusCheck' + DPITHRESHOLD = 'dpiThreshold' + COLORNESSCHECK = 'colornessCheck' + PERSPECTIVECHECK = 'perspectiveCheck' + DOCUMENTPOSITION = 'documentPosition' + PORTRAITCHECK = 'portraitCheck' + BRIGHTNESSCHECK = 'brightnessCheck' + OCCLUSIONCHECK = 'occlusionCheck' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of InputImageQualityChecks from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, InputImageQualityChecks): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/lcid.py b/regula/documentreader/webclient/gen/models/lcid.py old mode 100755 new mode 100644 index cda3f96..1127220 --- a/regula/documentreader/webclient/gen/models/lcid.py +++ b/regula/documentreader/webclient/gen/models/lcid.py @@ -4,413 +4,190 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Locale id. Used to tag same typed fields declared in several languages. -For example: name can be provided in both native and latin variants. -Based on Microsoft locale id (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f). - -""" -class LCID(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class LCID(int, Enum): + """ + Locale id. Used to tag same typed fields declared in several languages. For example: name can be provided in both native and latin variants. Based on Microsoft locale id (https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f). """ - - LATIN = int("0") - - AFRIKAANS = int("1078") - - ALBANIAN = int("1052") - - ARABIC_ALGERIA = int("5121") - - ARABIC_BAHRAIN = int("15361") - - ARABIC_EGYPT = int("3073") - - ARABIC_IRAQ = int("2049") - - ARABIC_JORDAN = int("11265") - - ARABIC_KUWAIT = int("13313") - - ARABIC_LEBANON = int("12289") - - ARABIC_LIBYA = int("4097") - - ARABIC_MOROCCO = int("6145") - - ARABIC_OMAN = int("8193") - - ARABIC_QATAR = int("16385") - - ARABIC_SAUDI_ARABIA = int("1025") - - ARABIC_SYRIA = int("10241") - - ARABIC_TUNISIA = int("7169") - - ARABIC_UAE = int("14337") - - ARABIC_YEMEN = int("9217") - - ARABIC_ARMENIAN = int("1067") - - AZERI_CYRILIC = int("2092") - - AZERI_LATIN = int("1068") - - BASQUE = int("1069") - - BELARUSIAN = int("1059") - - BULGARIAN = int("1026") - - BURMESE = int("1109") - - CATALAN = int("1027") - - CHINESE = int("2052") - - CROATIAN = int("1050") - - CZECH = int("1029") - - DANISH = int("1030") - - DUTCH_BELGIUM = int("2067") - - DUTCH_NETHERLANDS = int("1043") - - ENGLISH_AUSTRALIA = int("3081") - - ENGLISH_BELIZE = int("10249") - - ENGLISH_CANADA = int("4105") - - ENGLISH_CARRIBEAN = int("9225") - - ENGLISH_IRELAND = int("6153") - - ENGLISH_JAMAICA = int("8201") - - ENGLISH_NEW_ZEALAND = int("5129") - - ENGLISH_PHILIPPINES = int("13321") - - ENGLISH_SOUTH_AFRICA = int("7177") - - ENGLISH_TRINIDAD = int("11273") - - ENGLISH_UK = int("2057") - - ENGLISH_US = int("1033") - - ENGLISH_ZIMBABWE = int("12297") - - ESTONIAN = int("1061") - - FAEROESE = int("1080") - - FARSI = int("1065") - - FINNISH = int("1035") - - FRENCH_BELGIUM = int("2060") - - FRENCH_CANADA = int("3084") - - FRENCH_FRANCE = int("1036") - - FRENCH_LUXEMBOURG = int("5132") - - FRENCH_MONACO = int("6156") - - FRENCH_SWITZERLAND = int("4108") - - FYRO_MACEDONIAN = int("1071") - - GALICIAN = int("1110") - - GEORGIAN = int("1079") - - GERMAN_AUSTRIA = int("3079") - - GERMAN_GERMANY = int("1031") - - GERMAN_LIECHTENSTEIN = int("5127") - - GERMAN_LUXEMBOURG = int("4103") - - GERMAN_SWITZERLAND = int("2055") - - GREEK = int("1032") - - GUJARATI = int("1095") - - HEBREW = int("1037") - - HINDI_INDIA = int("1081") - - HUNGARIAN = int("1038") - - ICELANDIC = int("1039") - - INDONESIAN = int("1057") - - ITALIAN_ITALY = int("1040") - - ITALIAN_SWITZERLAND = int("2064") - - JAPANESE = int("1041") - - KANNADA = int("1099") - - KAZAKH = int("1087") - - KHMER = int("1107") - - KONKANI = int("1111") - - KOREAN = int("1042") - - KYRGYZ_CYRILICK = int("1088") - - LATVIAN = int("1062") - - LITHUANIAN = int("1063") - - MALAY_MALAYSIA = int("1086") - - MALAY_BRUNEI_DARUSSALAM = int("2110") - - MALTESE = int("1082") - - MARATHI = int("1102") - - MONGOLIAN_CYRILIC = int("1104") - - NORWEGIAN_BOKMAL = int("1044") - - NORWEGIAN_NYORSK = int("2068") - - POLISH = int("1045") - - PORTUGUESE_BRAZIL = int("1046") - - PORTUGUESE_PORTUGAL = int("2070") - - PUNJABI = int("1094") - - RHAETO_ROMANIC = int("1047") - - ROMANIAN = int("1048") - - RUSSIAN = int("1049") - - SANSKRIT = int("1103") - - SERBIAN_CYRILIC = int("3098") - - SERBIAN_LATIN = int("2074") - - SINHALA = int("1115") - - SLOVAK = int("1051") - - SLOVENIAN = int("1060") - - SPANISH_ARGENTINA = int("11274") - - SPANISH_BOLIVIA = int("16394") - - SPANISH_CHILE = int("13322") - - SPANICH_COLOMBIA = int("9226") - - SPANISH_COSTA_RICA = int("5130") - - SPANISH_DOMINICAN_REPUBLIC = int("7178") - - SPANISH_ECUADOR = int("12298") - - SPANISH_EL_SALVADOR = int("17418") - - SPANISH_GUATEMALA = int("4106") - - SPANISH_HONDURAS = int("18442") - - SPANISH_MEXICO = int("2058") - - SPANISH_NICARAGUA = int("19466") - - SPANISH_PANAMA = int("6154") - - SPANISH_PARAGUAY = int("15370") - - SPANISH_PERU = int("10250") - - SPANISH_PUERTO_RICO = int("20490") - - SPANISH_TRADITIONAL_SORT = int("1034") - - SPANISH_INTERNATIONAL_SORT = int("3082") - - SPANISH_URUGUAY = int("14346") - - SPANISH_VENEZUELA = int("8202") - - SWAHILI = int("1089") - - SWEDISH = int("1053") - - SWEDISH_FINLAND = int("2077") - - TAMIL = int("1097") - - TATAR = int("1092") - - TELUGU = int("1098") - - THAI_THAILAND = int("1054") - - TURKISH = int("1055") - - TAJIK_CYRILLIC = int("1064") - - TURKMEN = int("1090") - - UKRAINIAN = int("1058") - - URDU = int("1056") - - UZBEK_CYRILIC = int("2115") - - UZBEK_LATIN = int("1091") - - VIETNAMESE = int("1066") - - CTC_SIMPLIFIED = int("50001") - - CTC_TRADITIONAL = int("50002") - - BengaliBangladesh = int("2117") - - BengaliIndia = int("1093") - - Assamese = int("1101") - - ORIYA = int("1096") - - MALAYALAM = int("1100") - - LAO = int("1108") - - SINDHI_INDIA = int("1113") - - AMHARIC = int("1118") - - KASHMIRI = int("1120") - - NEPALI = int("1121") - - PASHTO = int("1123") - - SINDHI = int("2137") - - ARABIC = int("4096") - - BANK_CARD_NUMBER = int("10000") - - BANK_CARD_EXPIRY_DATE = int("10001") - - BANK_CARD_NAME = int("10002") - - BANK_CARD = int("10003") - - BANK_CARD_CVV2 = int("10004") - - ABKHAZIAN = int("10011") - - KARAKALPAK = int("10012") - - URDU_DETECTION = int("10560") - - allowable_values = [LATIN, AFRIKAANS, ALBANIAN, ARABIC_ALGERIA, ARABIC_BAHRAIN, ARABIC_EGYPT, ARABIC_IRAQ, ARABIC_JORDAN, ARABIC_KUWAIT, ARABIC_LEBANON, ARABIC_LIBYA, ARABIC_MOROCCO, ARABIC_OMAN, ARABIC_QATAR, ARABIC_SAUDI_ARABIA, ARABIC_SYRIA, ARABIC_TUNISIA, ARABIC_UAE, ARABIC_YEMEN, ARABIC_ARMENIAN, AZERI_CYRILIC, AZERI_LATIN, BASQUE, BELARUSIAN, BULGARIAN, BURMESE, CATALAN, CHINESE, CROATIAN, CZECH, DANISH, DUTCH_BELGIUM, DUTCH_NETHERLANDS, ENGLISH_AUSTRALIA, ENGLISH_BELIZE, ENGLISH_CANADA, ENGLISH_CARRIBEAN, ENGLISH_IRELAND, ENGLISH_JAMAICA, ENGLISH_NEW_ZEALAND, ENGLISH_PHILIPPINES, ENGLISH_SOUTH_AFRICA, ENGLISH_TRINIDAD, ENGLISH_UK, ENGLISH_US, ENGLISH_ZIMBABWE, ESTONIAN, FAEROESE, FARSI, FINNISH, FRENCH_BELGIUM, FRENCH_CANADA, FRENCH_FRANCE, FRENCH_LUXEMBOURG, FRENCH_MONACO, FRENCH_SWITZERLAND, FYRO_MACEDONIAN, GALICIAN, GEORGIAN, GERMAN_AUSTRIA, GERMAN_GERMANY, GERMAN_LIECHTENSTEIN, GERMAN_LUXEMBOURG, GERMAN_SWITZERLAND, GREEK, GUJARATI, HEBREW, HINDI_INDIA, HUNGARIAN, ICELANDIC, INDONESIAN, ITALIAN_ITALY, ITALIAN_SWITZERLAND, JAPANESE, KANNADA, KAZAKH, KHMER, KONKANI, KOREAN, KYRGYZ_CYRILICK, LATVIAN, LITHUANIAN, MALAY_MALAYSIA, MALAY_BRUNEI_DARUSSALAM, MALTESE, MARATHI, MONGOLIAN_CYRILIC, NORWEGIAN_BOKMAL, NORWEGIAN_NYORSK, POLISH, PORTUGUESE_BRAZIL, PORTUGUESE_PORTUGAL, PUNJABI, RHAETO_ROMANIC, ROMANIAN, RUSSIAN, SANSKRIT, SERBIAN_CYRILIC, SERBIAN_LATIN, SINHALA, SLOVAK, SLOVENIAN, SPANISH_ARGENTINA, SPANISH_BOLIVIA, SPANISH_CHILE, SPANICH_COLOMBIA, SPANISH_COSTA_RICA, SPANISH_DOMINICAN_REPUBLIC, SPANISH_ECUADOR, SPANISH_EL_SALVADOR, SPANISH_GUATEMALA, SPANISH_HONDURAS, SPANISH_MEXICO, SPANISH_NICARAGUA, SPANISH_PANAMA, SPANISH_PARAGUAY, SPANISH_PERU, SPANISH_PUERTO_RICO, SPANISH_TRADITIONAL_SORT, SPANISH_INTERNATIONAL_SORT, SPANISH_URUGUAY, SPANISH_VENEZUELA, SWAHILI, SWEDISH, SWEDISH_FINLAND, TAMIL, TATAR, TELUGU, THAI_THAILAND, TURKISH, TAJIK_CYRILLIC, TURKMEN, UKRAINIAN, URDU, UZBEK_CYRILIC, UZBEK_LATIN, VIETNAMESE, CTC_SIMPLIFIED, CTC_TRADITIONAL, BengaliBangladesh, BengaliIndia, Assamese, ORIYA, MALAYALAM, LAO, SINDHI_INDIA, AMHARIC, KASHMIRI, NEPALI, PASHTO, SINDHI, ARABIC, BANK_CARD_NUMBER, BANK_CARD_EXPIRY_DATE, BANK_CARD_NAME, BANK_CARD, BANK_CARD_CVV2, ABKHAZIAN, KARAKALPAK, URDU_DETECTION] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """LCID - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LCID): - return False - - return self.to_dict() == other.to_dict() + LATIN = 0 + AFRIKAANS = 1078 + ALBANIAN = 1052 + ARABIC_ALGERIA = 5121 + ARABIC_BAHRAIN = 15361 + ARABIC_EGYPT = 3073 + ARABIC_IRAQ = 2049 + ARABIC_JORDAN = 11265 + ARABIC_KUWAIT = 13313 + ARABIC_LEBANON = 12289 + ARABIC_LIBYA = 4097 + ARABIC_MOROCCO = 6145 + ARABIC_OMAN = 8193 + ARABIC_QATAR = 16385 + ARABIC_SAUDI_ARABIA = 1025 + ARABIC_SYRIA = 10241 + ARABIC_TUNISIA = 7169 + ARABIC_UAE = 14337 + ARABIC_YEMEN = 9217 + ARABIC_ARMENIAN = 1067 + AZERI_CYRILIC = 2092 + AZERI_LATIN = 1068 + BASQUE = 1069 + BELARUSIAN = 1059 + BULGARIAN = 1026 + BURMESE = 1109 + CATALAN = 1027 + CHINESE_HONGKONG_SAR = 3076 + CHINESE_MACAO_SAR = 5124 + CHINESE = 2052 + CHINESE_SINGAPORE = 4100 + CHINESE_TAIWAN = 1028 + CROATIAN = 1050 + CZECH = 1029 + DANISH = 1030 + DIVEHI = 1125 + DUTCH_BELGIUM = 2067 + DUTCH_NETHERLANDS = 1043 + ENGLISH_AUSTRALIA = 3081 + ENGLISH_BELIZE = 10249 + ENGLISH_CANADA = 4105 + ENGLISH_CARRIBEAN = 9225 + ENGLISH_IRELAND = 6153 + ENGLISH_JAMAICA = 8201 + ENGLISH_NEW_ZEALAND = 5129 + ENGLISH_PHILIPPINES = 13321 + ENGLISH_SOUTH_AFRICA = 7177 + ENGLISH_TRINIDAD = 11273 + ENGLISH_UK = 2057 + ENGLISH_US = 1033 + ENGLISH_ZIMBABWE = 12297 + ESTONIAN = 1061 + FAEROESE = 1080 + FARSI = 1065 + FINNISH = 1035 + FRENCH_BELGIUM = 2060 + FRENCH_CANADA = 3084 + FRENCH_FRANCE = 1036 + FRENCH_LUXEMBOURG = 5132 + FRENCH_MONACO = 6156 + FRENCH_SWITZERLAND = 4108 + FYRO_MACEDONIAN = 1071 + GALICIAN = 1110 + GEORGIAN = 1079 + GERMAN_AUSTRIA = 3079 + GERMAN_GERMANY = 1031 + GERMAN_LIECHTENSTEIN = 5127 + GERMAN_LUXEMBOURG = 4103 + GERMAN_SWITZERLAND = 2055 + GREEK = 1032 + GUJARATI = 1095 + HEBREW = 1037 + HINDI_INDIA = 1081 + HUNGARIAN = 1038 + ICELANDIC = 1039 + INDONESIAN = 1057 + ITALIAN_ITALY = 1040 + ITALIAN_SWITZERLAND = 2064 + JAPANESE = 1041 + KANNADA = 1099 + KAZAKH = 1087 + KHMER = 1107 + KONKANI = 1111 + KOREAN = 1042 + KYRGYZ_CYRILICK = 1088 + LATVIAN = 1062 + LITHUANIAN = 1063 + MALAY_MALAYSIA = 1086 + MALAY_BRUNEI_DARUSSALAM = 2110 + MALTESE = 1082 + MARATHI = 1102 + MONGOLIAN_CYRILIC = 1104 + NORWEGIAN_BOKMAL = 1044 + NORWEGIAN_NYORSK = 2068 + POLISH = 1045 + PORTUGUESE_BRAZIL = 1046 + PORTUGUESE_PORTUGAL = 2070 + PUNJABI = 1094 + RHAETO_ROMANIC = 1047 + ROMANIAN = 1048 + RUSSIAN = 1049 + SANSKRIT = 1103 + SERBIAN_CYRILIC = 3098 + SERBIAN_LATIN = 2074 + SINHALA = 1115 + SLOVAK = 1051 + SLOVENIAN = 1060 + SPANISH_ARGENTINA = 11274 + SPANISH_BOLIVIA = 16394 + SPANISH_CHILE = 13322 + SPANICH_COLOMBIA = 9226 + SPANISH_COSTA_RICA = 5130 + SPANISH_DOMINICAN_REPUBLIC = 7178 + SPANISH_ECUADOR = 12298 + SPANISH_EL_SALVADOR = 17418 + SPANISH_GUATEMALA = 4106 + SPANISH_HONDURAS = 18442 + SPANISH_MEXICO = 2058 + SPANISH_NICARAGUA = 19466 + SPANISH_PANAMA = 6154 + SPANISH_PARAGUAY = 15370 + SPANISH_PERU = 10250 + SPANISH_PUERTO_RICO = 20490 + SPANISH_TRADITIONAL_SORT = 1034 + SPANISH_INTERNATIONAL_SORT = 3082 + SPANISH_URUGUAY = 14346 + SPANISH_VENEZUELA = 8202 + SWAHILI = 1089 + SWEDISH = 1053 + SWEDISH_FINLAND = 2077 + SYRIAC = 1114 + TAMIL = 1097 + TATAR = 1092 + TELUGU = 1098 + THAI_THAILAND = 1054 + TURKISH = 1055 + TAJIK_CYRILLIC = 1064 + TURKMEN = 1090 + UKRAINIAN = 1058 + URDU = 1056 + UZBEK_CYRILIC = 2115 + UZBEK_LATIN = 1091 + VIETNAMESE = 1066 + CTC_SIMPLIFIED = 50001 + CTC_TRADITIONAL = 50002 + BENGALI_BANGLADESH = 2117 + BENGALI_INDIA = 1093 + ASSAMESE = 1101 + ORIYA = 1096 + MALAYALAM = 1100 + LAO = 1108 + SINDHI_INDIA = 1113 + AMHARIC = 1118 + KASHMIRI = 1120 + NEPALI = 1121 + PASHTO = 1123 + SINDHI = 2137 + ARABIC = 4096 + BANK_CARD_NUMBER = 10000 + BANK_CARD_EXPIRY_DATE = 10001 + BANK_CARD_NAME = 10002 + BANK_CARD = 10003 + BANK_CARD_CVV2 = 10004 + ABKHAZIAN = 10011 + KARAKALPAK = 10012 + URDU_DETECTION = 10560 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of LCID from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LCID): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/lexical_analysis_result.py b/regula/documentreader/webclient/gen/models/lexical_analysis_result.py old mode 100755 new mode 100644 index e63f429..672ddbf --- a/regula/documentreader/webclient/gen/models/lexical_analysis_result.py +++ b/regula/documentreader/webclient/gen/models/lexical_analysis_result.py @@ -4,253 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.list_verified_fields import ListVerifiedFields +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Lexical data analysis allows you to compare the results of reading the text data of the MRZ, -the document filling area, barcodes and data from the memory of the RFID chip for an additional -assessment of the authenticity of the document. Single result for all pages. -Consider using Result.TEXT type for more simplicity. - -""" -class LexicalAnalysisResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class LexicalAnalysisResult(ResultItem): """ - openapi_types = { - 'list_verified_fields': 'ListVerifiedFields', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } + Lexical data analysis allows you to compare the results of reading the text data of the MRZ, the document filling area, barcodes and data from the memory of the RFID chip for an additional assessment of the authenticity of the document. Single result for all pages. Consider using Result.TEXT type for more simplicity. + """ # noqa: E501 + list_verified_fields: ListVerifiedFields = Field(alias="ListVerifiedFields") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "ListVerifiedFields"] - attribute_map = { - 'list_verified_fields': 'ListVerifiedFields', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - def __init__(self, list_verified_fields=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """LexicalAnalysisResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self._list_verified_fields = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - if list_verified_fields is not None: - self.list_verified_fields = list_verified_fields - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def list_verified_fields(self): - """Gets the list_verified_fields of this LexicalAnalysisResult. # noqa: E501 - - - :return: The list_verified_fields of this LexicalAnalysisResult. # noqa: E501 - :rtype: ListVerifiedFields - """ - return self._list_verified_fields - - @list_verified_fields.setter - def list_verified_fields(self, list_verified_fields): - """Sets the list_verified_fields of this LexicalAnalysisResult. - - - :param list_verified_fields: The list_verified_fields of this LexicalAnalysisResult. # noqa: E501 - :type list_verified_fields: ListVerifiedFields - """ + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - self._list_verified_fields = list_verified_fields + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of LexicalAnalysisResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @property - def buf_length(self): - """Gets the buf_length of this LexicalAnalysisResult. # noqa: E501 + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :return: The buf_length of this LexicalAnalysisResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this LexicalAnalysisResult. - - - :param buf_length: The buf_length of this LexicalAnalysisResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this LexicalAnalysisResult. # noqa: E501 - - - :return: The light of this LexicalAnalysisResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this LexicalAnalysisResult. - - - :param light: The light of this LexicalAnalysisResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this LexicalAnalysisResult. # noqa: E501 - - - :return: The list_idx of this LexicalAnalysisResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this LexicalAnalysisResult. - - - :param list_idx: The list_idx of this LexicalAnalysisResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this LexicalAnalysisResult. # noqa: E501 - - - :return: The page_idx of this LexicalAnalysisResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this LexicalAnalysisResult. - - - :param page_idx: The page_idx of this LexicalAnalysisResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this LexicalAnalysisResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this LexicalAnalysisResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this LexicalAnalysisResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this LexicalAnalysisResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LexicalAnalysisResult): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of list_verified_fields + if self.list_verified_fields: + _dict['ListVerifiedFields'] = self.list_verified_fields.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of LexicalAnalysisResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "ListVerifiedFields": ListVerifiedFields.from_dict(obj["ListVerifiedFields"]) if obj.get("ListVerifiedFields") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LexicalAnalysisResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/lexical_analysis_result_all_of.py b/regula/documentreader/webclient/gen/models/lexical_analysis_result_all_of.py deleted file mode 100755 index 9af1d22..0000000 --- a/regula/documentreader/webclient/gen/models/lexical_analysis_result_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class LexicalAnalysisResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'list_verified_fields': 'ListVerifiedFields' - } - - attribute_map = { - 'list_verified_fields': 'ListVerifiedFields' - } - - def __init__(self, list_verified_fields=None, local_vars_configuration=None): # noqa: E501 - """LexicalAnalysisResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._list_verified_fields = None - self.discriminator = None - - if list_verified_fields is not None: - self.list_verified_fields = list_verified_fields - - @property - def list_verified_fields(self): - """Gets the list_verified_fields of this LexicalAnalysisResultAllOf. # noqa: E501 - - - :return: The list_verified_fields of this LexicalAnalysisResultAllOf. # noqa: E501 - :rtype: ListVerifiedFields - """ - return self._list_verified_fields - - @list_verified_fields.setter - def list_verified_fields(self, list_verified_fields): - """Sets the list_verified_fields of this LexicalAnalysisResultAllOf. - - - :param list_verified_fields: The list_verified_fields of this LexicalAnalysisResultAllOf. # noqa: E501 - :type list_verified_fields: ListVerifiedFields - """ - - self._list_verified_fields = list_verified_fields - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LexicalAnalysisResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LexicalAnalysisResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/license_item.py b/regula/documentreader/webclient/gen/models/license_item.py new file mode 100644 index 0000000..0c9e4ae --- /dev/null +++ b/regula/documentreader/webclient/gen/models/license_item.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictBytes, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from typing import Optional, Set +from typing_extensions import Self + +class LicenseItem(BaseModel): + """ + LicenseItem + """ # noqa: E501 + license: Union[StrictBytes, StrictStr] = Field(description="Base64 encoded data", alias="License") + __properties: ClassVar[List[str]] = ["License"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of LicenseItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of LicenseItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "License": obj.get("License") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/license_result.py b/regula/documentreader/webclient/gen/models/license_result.py index acab473..367483e 100644 --- a/regula/documentreader/webclient/gen/models/license_result.py +++ b/regula/documentreader/webclient/gen/models/license_result.py @@ -4,252 +4,83 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field, StrictBytes, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class LicenseResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class LicenseResult(ResultItem): """ + Contains license + """ # noqa: E501 + license: Union[StrictBytes, StrictStr] = Field(description="Base64 encoded data", alias="License") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "License"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'license': 'str', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'license': 'License', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, license=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """LicenseResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._license = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.license = license - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def license(self): - """Gets the license of this LicenseResult. # noqa: E501 - - Base64 encoded data # noqa: E501 - - :return: The license of this LicenseResult. # noqa: E501 - :rtype: str - """ - return self._license - - @license.setter - def license(self, license): - """Sets the license of this LicenseResult. - - Base64 encoded data # noqa: E501 - - :param license: The license of this LicenseResult. # noqa: E501 - :type license: str - """ - if self.local_vars_configuration.client_side_validation and license is None: # noqa: E501 - raise ValueError("Invalid value for `license`, must not be `None`") # noqa: E501 - - self._license = license - - @property - def buf_length(self): - """Gets the buf_length of this LicenseResult. # noqa: E501 - - - :return: The buf_length of this LicenseResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this LicenseResult. - - - :param buf_length: The buf_length of this LicenseResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this LicenseResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this LicenseResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this LicenseResult. - - - :param light: The light of this LicenseResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this LicenseResult. # noqa: E501 - - - :return: The list_idx of this LicenseResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this LicenseResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this LicenseResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this LicenseResult. # noqa: E501 - - - :return: The page_idx of this LicenseResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this LicenseResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of LicenseResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this LicenseResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this LicenseResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this LicenseResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this LicenseResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of LicenseResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "License": obj.get("License") + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this LicenseResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LicenseResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LicenseResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/license_result_all_of.py b/regula/documentreader/webclient/gen/models/license_result_all_of.py deleted file mode 100644 index dac2d5b..0000000 --- a/regula/documentreader/webclient/gen/models/license_result_all_of.py +++ /dev/null @@ -1,122 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains license -""" -class LicenseResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'license': 'str' - } - - attribute_map = { - 'license': 'License' - } - - def __init__(self, license=None, local_vars_configuration=None): # noqa: E501 - """LicenseResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._license = None - self.discriminator = None - - self.license = license - - @property - def license(self): - """Gets the license of this LicenseResultAllOf. # noqa: E501 - - Base64 encoded data # noqa: E501 - - :return: The license of this LicenseResultAllOf. # noqa: E501 - :rtype: str - """ - return self._license - - @license.setter - def license(self, license): - """Sets the license of this LicenseResultAllOf. - - Base64 encoded data # noqa: E501 - - :param license: The license of this LicenseResultAllOf. # noqa: E501 - :type license: str - """ - if self.local_vars_configuration.client_side_validation and license is None: # noqa: E501 - raise ValueError("Invalid value for `license`, must not be `None`") # noqa: E501 - - self._license = license - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LicenseResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LicenseResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/light.py b/regula/documentreader/webclient/gen/models/light.py old mode 100755 new mode 100644 index f51a96b..bb3ee63 --- a/regula/documentreader/webclient/gen/models/light.py +++ b/regula/documentreader/webclient/gen/models/light.py @@ -4,98 +4,66 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Image light index -""" -class Light(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Light(int, Enum): + """ + Image light index """ - - OFF = int("0") - - WHITE = int("6") - - IR = int("24") - - UV = int("128") - - allowable_values = [OFF, WHITE, IR, UV] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Light - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Light): - return False - - return self.to_dict() == other.to_dict() + OFF = 0 + OVI = 1 + WHITE_TOP = 2 + WHITE_SIDE = 4 + WHITE_FRONT = 8388608 + WHITE = 6 + IR_TOP = 8 + IR_SIDE = 16 + IR_FRONT = 16777216 + IR = 24 + WHITE_GRAY = 33554432 + UV = 128 + OVD = 67108864 + VIDEODETECTION = 134217728 + IR_870_OBL = 268435456 + IR_LUMINESCENCE = 256 + AXIAL_WHITE_LEFT = 1024 + AXIAL_WHITE_RIGHT = 2048 + AXIAL_WHITE_FRONT = 512 + IR_720 = 4096 + IR_940 = 8192 + AXIAL_WHITE_FULL = 3072 + RAW_DATA = 2147483648 + RAW_DATA_GRBG = 2415919104 + RAW_DATA_GBGR = 2684354560 + RAW_DATA_RGGB = 2952790016 + RAW_DATA_BGGR = 3221225472 + TRANSMITTED = 32 + TRANSMITTED_IR = 64 + ANTI_STOKES = 65536 + TRANSMITTED_IR940 = 16384 + OVD_RIGHT = 262144 + OVD_LEFT = 131072 + IR_700 = 32768 + IR_870 = 16777216 + HOLO = 67108864 + IR_BOTTOM = 64 + WHITE_BOTTOM = 32 + UVC = 524288 + UVB = 1048576 + WHITE_OBL = 2097152 + WHITE_SPECIAL = 4194304 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Light from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Light): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/list_transactions_by_tag_response.py b/regula/documentreader/webclient/gen/models/list_transactions_by_tag_response.py index 3ad24f1..98df378 100644 --- a/regula/documentreader/webclient/gen/models/list_transactions_by_tag_response.py +++ b/regula/documentreader/webclient/gen/models/list_transactions_by_tag_response.py @@ -4,142 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.get_transactions_by_tag_response import GetTransactionsByTagResponse +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ListTransactionsByTagResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ListTransactionsByTagResponse(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'items': 'list[GetTransactionsByTagResponse]', - 'metadata': 'dict(str, object)' - } - - attribute_map = { - 'items': 'items', - 'metadata': 'metadata' - } - - def __init__(self, items=None, metadata=None, local_vars_configuration=None): # noqa: E501 - """ListTransactionsByTagResponse - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._items = None - self._metadata = None - self.discriminator = None - - if items is not None: - self.items = items - if metadata is not None: - self.metadata = metadata - - @property - def items(self): - """Gets the items of this ListTransactionsByTagResponse. # noqa: E501 - - - :return: The items of this ListTransactionsByTagResponse. # noqa: E501 - :rtype: list[GetTransactionsByTagResponse] + ListTransactionsByTagResponse + """ # noqa: E501 + items: Optional[List[GetTransactionsByTagResponse]] = None + metadata: Optional[Dict[str, Any]] = None + __properties: ClassVar[List[str]] = ["items", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ListTransactionsByTagResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._items - - @items.setter - def items(self, items): - """Sets the items of this ListTransactionsByTagResponse. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in items (list) + _items = [] + if self.items: + for _item_items in self.items: + if _item_items: + _items.append(_item_items.to_dict()) + _dict['items'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ListTransactionsByTagResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "items": [GetTransactionsByTagResponse.from_dict(_item) for _item in obj["items"]] if obj.get("items") is not None else None, + "metadata": obj.get("metadata") + }) + return _obj - :param items: The items of this ListTransactionsByTagResponse. # noqa: E501 - :type items: list[GetTransactionsByTagResponse] - """ - - self._items = items - - @property - def metadata(self): - """Gets the metadata of this ListTransactionsByTagResponse. # noqa: E501 - - - :return: The metadata of this ListTransactionsByTagResponse. # noqa: E501 - :rtype: dict(str, object) - """ - return self._metadata - - @metadata.setter - def metadata(self, metadata): - """Sets the metadata of this ListTransactionsByTagResponse. - - - :param metadata: The metadata of this ListTransactionsByTagResponse. # noqa: E501 - :type metadata: dict(str, object) - """ - self._metadata = metadata - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ListTransactionsByTagResponse): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ListTransactionsByTagResponse): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/list_verified_fields.py b/regula/documentreader/webclient/gen/models/list_verified_fields.py old mode 100755 new mode 100644 index 0d6c81f..21a6cd2 --- a/regula/documentreader/webclient/gen/models/list_verified_fields.py +++ b/regula/documentreader/webclient/gen/models/list_verified_fields.py @@ -4,116 +4,88 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ListVerifiedFields(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.verified_field_map import VerifiedFieldMap +from typing import Optional, Set +from typing_extensions import Self +class ListVerifiedFields(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'p_field_maps': 'list[VerifiedFieldMap]' - } - - attribute_map = { - 'p_field_maps': 'pFieldMaps' - } - - def __init__(self, p_field_maps=None, local_vars_configuration=None): # noqa: E501 - """ListVerifiedFields - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._p_field_maps = None - self.discriminator = None - - if p_field_maps is not None: - self.p_field_maps = p_field_maps - - @property - def p_field_maps(self): - """Gets the p_field_maps of this ListVerifiedFields. # noqa: E501 - - - :return: The p_field_maps of this ListVerifiedFields. # noqa: E501 - :rtype: list[VerifiedFieldMap] + ListVerifiedFields + """ # noqa: E501 + count: Union[StrictFloat, StrictInt] = Field(description="Number of pFieldMaps array elements", alias="Count") + p_field_maps: List[VerifiedFieldMap] = Field(alias="pFieldMaps") + p_date_format: Optional[StrictStr] = Field(default=None, alias="pDateFormat") + __properties: ClassVar[List[str]] = ["Count", "pFieldMaps", "pDateFormat"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ListVerifiedFields from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._p_field_maps - - @p_field_maps.setter - def p_field_maps(self, p_field_maps): - """Sets the p_field_maps of this ListVerifiedFields. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in p_field_maps (list) + _items = [] + if self.p_field_maps: + for _item_p_field_maps in self.p_field_maps: + if _item_p_field_maps: + _items.append(_item_p_field_maps.to_dict()) + _dict['pFieldMaps'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ListVerifiedFields from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "pFieldMaps": [VerifiedFieldMap.from_dict(_item) for _item in obj["pFieldMaps"]] if obj.get("pFieldMaps") is not None else None, + "pDateFormat": obj.get("pDateFormat") + }) + return _obj - :param p_field_maps: The p_field_maps of this ListVerifiedFields. # noqa: E501 - :type p_field_maps: list[VerifiedFieldMap] - """ - - self._p_field_maps = p_field_maps - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ListVerifiedFields): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ListVerifiedFields): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/list_verified_fields_item.py b/regula/documentreader/webclient/gen/models/list_verified_fields_item.py new file mode 100644 index 0000000..f6b738e --- /dev/null +++ b/regula/documentreader/webclient/gen/models/list_verified_fields_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.list_verified_fields import ListVerifiedFields +from typing import Optional, Set +from typing_extensions import Self + +class ListVerifiedFieldsItem(BaseModel): + """ + ListVerifiedFieldsItem + """ # noqa: E501 + list_verified_fields: ListVerifiedFields = Field(alias="ListVerifiedFields") + __properties: ClassVar[List[str]] = ["ListVerifiedFields"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ListVerifiedFieldsItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of list_verified_fields + if self.list_verified_fields: + _dict['ListVerifiedFields'] = self.list_verified_fields.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ListVerifiedFieldsItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ListVerifiedFields": ListVerifiedFields.from_dict(obj["ListVerifiedFields"]) if obj.get("ListVerifiedFields") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/liveness_params.py b/regula/documentreader/webclient/gen/models/liveness_params.py index 8e30eb2..819d283 100644 --- a/regula/documentreader/webclient/gen/models/liveness_params.py +++ b/regula/documentreader/webclient/gen/models/liveness_params.py @@ -4,258 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class LivenessParams(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictBool +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self +class LivenessParams(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'check_ovi': 'bool', - 'check_mli': 'bool', - 'check_holo': 'bool', - 'check_ed': 'bool', - 'check_black_and_white_copy': 'bool', - 'check_dynaprint': 'bool' - } - - attribute_map = { - 'check_ovi': 'checkOVI', - 'check_mli': 'checkMLI', - 'check_holo': 'checkHolo', - 'check_ed': 'checkED', - 'check_black_and_white_copy': 'checkBlackAndWhiteCopy', - 'check_dynaprint': 'checkDynaprint' - } - - def __init__(self, check_ovi=None, check_mli=None, check_holo=None, check_ed=None, check_black_and_white_copy=None, check_dynaprint=None, local_vars_configuration=None): # noqa: E501 - """LivenessParams - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._check_ovi = None - self._check_mli = None - self._check_holo = None - self._check_ed = None - self._check_black_and_white_copy = None - self._check_dynaprint = None - self.discriminator = None - - if check_ovi is not None: - self.check_ovi = check_ovi - if check_mli is not None: - self.check_mli = check_mli - if check_holo is not None: - self.check_holo = check_holo - if check_ed is not None: - self.check_ed = check_ed - if check_black_and_white_copy is not None: - self.check_black_and_white_copy = check_black_and_white_copy - if check_dynaprint is not None: - self.check_dynaprint = check_dynaprint - - @property - def check_ovi(self): - """Gets the check_ovi of this LivenessParams. # noqa: E501 - - This parameter is used to enable OVI check # noqa: E501 - - :return: The check_ovi of this LivenessParams. # noqa: E501 - :rtype: bool + LivenessParams + """ # noqa: E501 + check_ovi: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable OVI check", alias="checkOVI") + check_mli: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable MLI check", alias="checkMLI") + check_holo: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Hologram detection", alias="checkHolo") + check_ed: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Electronic device detection", alias="checkED") + check_black_and_white_copy: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Black and white copy check", alias="checkBlackAndWhiteCopy") + check_dynaprint: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable Dynaprint check", alias="checkDynaprint") + __properties: ClassVar[List[str]] = ["checkOVI", "checkMLI", "checkHolo", "checkED", "checkBlackAndWhiteCopy", "checkDynaprint"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of LivenessParams from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._check_ovi - - @check_ovi.setter - def check_ovi(self, check_ovi): - """Sets the check_ovi of this LivenessParams. - - This parameter is used to enable OVI check # noqa: E501 - - :param check_ovi: The check_ovi of this LivenessParams. # noqa: E501 - :type check_ovi: bool - """ - - self._check_ovi = check_ovi - - @property - def check_mli(self): - """Gets the check_mli of this LivenessParams. # noqa: E501 - - This parameter is used to enable MLI check # noqa: E501 - - :return: The check_mli of this LivenessParams. # noqa: E501 - :rtype: bool - """ - return self._check_mli - - @check_mli.setter - def check_mli(self, check_mli): - """Sets the check_mli of this LivenessParams. - - This parameter is used to enable MLI check # noqa: E501 - - :param check_mli: The check_mli of this LivenessParams. # noqa: E501 - :type check_mli: bool - """ - - self._check_mli = check_mli - - @property - def check_holo(self): - """Gets the check_holo of this LivenessParams. # noqa: E501 - - This parameter is used to enable Hologram detection # noqa: E501 - - :return: The check_holo of this LivenessParams. # noqa: E501 - :rtype: bool - """ - return self._check_holo - - @check_holo.setter - def check_holo(self, check_holo): - """Sets the check_holo of this LivenessParams. - - This parameter is used to enable Hologram detection # noqa: E501 - - :param check_holo: The check_holo of this LivenessParams. # noqa: E501 - :type check_holo: bool - """ - - self._check_holo = check_holo - - @property - def check_ed(self): - """Gets the check_ed of this LivenessParams. # noqa: E501 - - This parameter is used to enable Electronic device detection # noqa: E501 - - :return: The check_ed of this LivenessParams. # noqa: E501 - :rtype: bool - """ - return self._check_ed - - @check_ed.setter - def check_ed(self, check_ed): - """Sets the check_ed of this LivenessParams. - - This parameter is used to enable Electronic device detection # noqa: E501 - - :param check_ed: The check_ed of this LivenessParams. # noqa: E501 - :type check_ed: bool - """ - - self._check_ed = check_ed - - @property - def check_black_and_white_copy(self): - """Gets the check_black_and_white_copy of this LivenessParams. # noqa: E501 - - This parameter is used to enable Black and white copy check # noqa: E501 - - :return: The check_black_and_white_copy of this LivenessParams. # noqa: E501 - :rtype: bool - """ - return self._check_black_and_white_copy - - @check_black_and_white_copy.setter - def check_black_and_white_copy(self, check_black_and_white_copy): - """Sets the check_black_and_white_copy of this LivenessParams. - - This parameter is used to enable Black and white copy check # noqa: E501 - - :param check_black_and_white_copy: The check_black_and_white_copy of this LivenessParams. # noqa: E501 - :type check_black_and_white_copy: bool - """ - - self._check_black_and_white_copy = check_black_and_white_copy - - @property - def check_dynaprint(self): - """Gets the check_dynaprint of this LivenessParams. # noqa: E501 - - This parameter is used to enable Dynaprint check # noqa: E501 - - :return: The check_dynaprint of this LivenessParams. # noqa: E501 - :rtype: bool - """ - return self._check_dynaprint - - @check_dynaprint.setter - def check_dynaprint(self, check_dynaprint): - """Sets the check_dynaprint of this LivenessParams. - - This parameter is used to enable Dynaprint check # noqa: E501 - - :param check_dynaprint: The check_dynaprint of this LivenessParams. # noqa: E501 - :type check_dynaprint: bool - """ - - self._check_dynaprint = check_dynaprint - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LivenessParams): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of LivenessParams from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "checkOVI": obj.get("checkOVI"), + "checkMLI": obj.get("checkMLI"), + "checkHolo": obj.get("checkHolo"), + "checkED": obj.get("checkED"), + "checkBlackAndWhiteCopy": obj.get("checkBlackAndWhiteCopy"), + "checkDynaprint": obj.get("checkDynaprint") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LivenessParams): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/log_level.py b/regula/documentreader/webclient/gen/models/log_level.py index cec654e..a27c258 100644 --- a/regula/documentreader/webclient/gen/models/log_level.py +++ b/regula/documentreader/webclient/gen/models/log_level.py @@ -4,100 +4,29 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class LogLevel(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class LogLevel(str, Enum): + """ + LogLevel """ - - FATAL_ERROR = "FatalError" - - ERROR = "Error" - - WARNING = "Warning" - - INFO = "Info" - - DEBUG = "Debug" - - allowable_values = [FATAL_ERROR, ERROR, WARNING, INFO, DEBUG] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """LogLevel - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, LogLevel): - return False + FATALERROR = 'FatalError' + ERROR = 'Error' + WARNING = 'Warning' + INFO = 'Info' + DEBUG = 'Debug' - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of LogLevel from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, LogLevel): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/measure_system.py b/regula/documentreader/webclient/gen/models/measure_system.py index c971331..8190172 100644 --- a/regula/documentreader/webclient/gen/models/measure_system.py +++ b/regula/documentreader/webclient/gen/models/measure_system.py @@ -4,94 +4,26 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class MeasureSystem(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class MeasureSystem(int, Enum): + """ + MeasureSystem """ - - METRIC = int("0") - - IMPERIAL = int("1") - - allowable_values = [METRIC, IMPERIAL] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """MeasureSystem - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, MeasureSystem): - return False + METRIC = 0 + IMPERIAL = 1 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of MeasureSystem from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, MeasureSystem): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/mrz_detect_mode_enum.py b/regula/documentreader/webclient/gen/models/mrz_detect_mode_enum.py index 29794d1..f81b7b2 100644 --- a/regula/documentreader/webclient/gen/models/mrz_detect_mode_enum.py +++ b/regula/documentreader/webclient/gen/models/mrz_detect_mode_enum.py @@ -4,96 +4,27 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Make better MRZ detection on complex noisy backgrounds, like BW photocopy of some documents. -""" -class MrzDetectModeEnum(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class MrzDetectModeEnum(int, Enum): + """ + Make better MRZ detection on complex noisy backgrounds, like BW photocopy of some documents. """ - - eMDM_Default = int("0") - - eMDM_ResizeBinarizeWindow = int("1") - - eMDM_BlurBeforeBinarization = int("2") - - allowable_values = [eMDM_Default, eMDM_ResizeBinarizeWindow, eMDM_BlurBeforeBinarization] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """MrzDetectModeEnum - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, MrzDetectModeEnum): - return False + eMDM_Default = 0 + eMDM_ResizeBinarizeWindow = 1 + eMDM_BlurBeforeBinarization = 2 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of MrzDetectModeEnum from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, MrzDetectModeEnum): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/mrz_detector_result.py b/regula/documentreader/webclient/gen/models/mrz_detector_result.py new file mode 100644 index 0000000..e3e3d5b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_detector_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector +from typing import Optional, Set +from typing_extensions import Self + +class MRZDetectorResult(ResultItem): + """ + MRZDetectorResult + """ # noqa: E501 + result_mrz_detector: ResultMRZDetector = Field(alias="ResultMRZDetector") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "ResultMRZDetector"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZDetectorResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of result_mrz_detector + if self.result_mrz_detector: + _dict['ResultMRZDetector'] = self.result_mrz_detector.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZDetectorResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "ResultMRZDetector": ResultMRZDetector.from_dict(obj["ResultMRZDetector"]) if obj.get("ResultMRZDetector") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_format.py b/regula/documentreader/webclient/gen/models/mrz_format.py index 82695d2..6473711 100644 --- a/regula/documentreader/webclient/gen/models/mrz_format.py +++ b/regula/documentreader/webclient/gen/models/mrz_format.py @@ -4,102 +4,30 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class MRZFormat(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class MRZFormat(str, Enum): + """ + MRZFormat """ - - IDL = "1x30" - - ID1 = "3x30" - - ID2 = "2x36" - - ID3 = "2x44" - - CAN = "1x6" - - ID1_2_30 = "2x30" - - allowable_values = [IDL, ID1, ID2, ID3, CAN, ID1_2_30] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """MRZFormat - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, MRZFormat): - return False + ENUM_1X30 = '1x30' + ENUM_3X30 = '3x30' + ENUM_2X36 = '2x36' + ENUM_2X44 = '2x44' + ENUM_1X6 = '1x6' + ENUM_2X30 = '2x30' - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of MRZFormat from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, MRZFormat): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/mrz_position.py b/regula/documentreader/webclient/gen/models/mrz_position.py new file mode 100644 index 0000000..adf1a25 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_position.py @@ -0,0 +1,124 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.document_format import DocumentFormat +from regula.documentreader.webclient.gen.models.point import Point +from typing import Optional, Set +from typing_extensions import Self + +class MrzPosition(BaseModel): + """ + MrzPosition + """ # noqa: E501 + doc_format: DocumentFormat = Field(alias="docFormat") + angle: Union[StrictFloat, StrictInt] = Field(description="Document rotation angle", alias="Angle") + width: StrictInt = Field(description="Document width", alias="Width") + height: StrictInt = Field(description="Document height", alias="Height") + center: Point = Field(alias="Center") + left_bottom: Point = Field(alias="LeftBottom") + left_top: Point = Field(alias="LeftTop") + right_bottom: Point = Field(alias="RightBottom") + right_top: Point = Field(alias="RightTop") + dpi: StrictInt = Field(alias="Dpi") + inverse: Optional[StrictInt] = Field(default=None, alias="Inverse") + obj_area: Optional[StrictInt] = Field(default=None, alias="ObjArea") + obj_int_angle_dev: Optional[StrictInt] = Field(default=None, alias="ObjIntAngleDev") + perspective_tr: Optional[StrictInt] = Field(default=None, alias="PerspectiveTr") + result_status: Optional[StrictInt] = Field(default=None, alias="ResultStatus") + __properties: ClassVar[List[str]] = ["docFormat", "Angle", "Width", "Height", "Center", "LeftBottom", "LeftTop", "RightBottom", "RightTop", "Dpi", "Inverse", "ObjArea", "ObjIntAngleDev", "PerspectiveTr", "ResultStatus"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MrzPosition from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of center + if self.center: + _dict['Center'] = self.center.to_dict() + # override the default output from pydantic by calling `to_dict()` of left_bottom + if self.left_bottom: + _dict['LeftBottom'] = self.left_bottom.to_dict() + # override the default output from pydantic by calling `to_dict()` of left_top + if self.left_top: + _dict['LeftTop'] = self.left_top.to_dict() + # override the default output from pydantic by calling `to_dict()` of right_bottom + if self.right_bottom: + _dict['RightBottom'] = self.right_bottom.to_dict() + # override the default output from pydantic by calling `to_dict()` of right_top + if self.right_top: + _dict['RightTop'] = self.right_top.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MrzPosition from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "docFormat": obj.get("docFormat"), + "Angle": obj.get("Angle"), + "Width": obj.get("Width"), + "Height": obj.get("Height"), + "Center": Point.from_dict(obj["Center"]) if obj.get("Center") is not None else None, + "LeftBottom": Point.from_dict(obj["LeftBottom"]) if obj.get("LeftBottom") is not None else None, + "LeftTop": Point.from_dict(obj["LeftTop"]) if obj.get("LeftTop") is not None else None, + "RightBottom": Point.from_dict(obj["RightBottom"]) if obj.get("RightBottom") is not None else None, + "RightTop": Point.from_dict(obj["RightTop"]) if obj.get("RightTop") is not None else None, + "Dpi": obj.get("Dpi"), + "Inverse": obj.get("Inverse"), + "ObjArea": obj.get("ObjArea"), + "ObjIntAngleDev": obj.get("ObjIntAngleDev"), + "PerspectiveTr": obj.get("PerspectiveTr"), + "ResultStatus": obj.get("ResultStatus") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_position_item.py b/regula/documentreader/webclient/gen/models/mrz_position_item.py new file mode 100644 index 0000000..66d2299 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_position_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.mrz_position import MrzPosition +from typing import Optional, Set +from typing_extensions import Self + +class MrzPositionItem(BaseModel): + """ + MrzPositionItem + """ # noqa: E501 + mrz_position: MrzPosition = Field(alias="MrzPosition") + __properties: ClassVar[List[str]] = ["MrzPosition"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MrzPositionItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of mrz_position + if self.mrz_position: + _dict['MrzPosition'] = self.mrz_position.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MrzPositionItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "MrzPosition": MrzPosition.from_dict(obj["MrzPosition"]) if obj.get("MrzPosition") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_position_result.py b/regula/documentreader/webclient/gen/models/mrz_position_result.py new file mode 100644 index 0000000..f7eebed --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_position_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.mrz_position import MrzPosition +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self + +class MRZPositionResult(ResultItem): + """ + MRZPositionResult + """ # noqa: E501 + mrz_position: MrzPosition = Field(alias="MrzPosition") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "MrzPosition"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZPositionResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of mrz_position + if self.mrz_position: + _dict['MrzPosition'] = self.mrz_position.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZPositionResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "MrzPosition": MrzPosition.from_dict(obj["MrzPosition"]) if obj.get("MrzPosition") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_rows_item.py b/regula/documentreader/webclient/gen/models/mrz_rows_item.py new file mode 100644 index 0000000..269205e --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_rows_item.py @@ -0,0 +1,91 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.symbol import Symbol +from typing import Optional, Set +from typing_extensions import Self + +class MRZRowsItem(BaseModel): + """ + MRZRowsItem + """ # noqa: E501 + length: StrictInt + max_length: StrictInt = Field(alias="maxLength") + symbols: List[Symbol] + __properties: ClassVar[List[str]] = ["length", "maxLength", "symbols"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZRowsItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in symbols (list) + _items = [] + if self.symbols: + for _item_symbols in self.symbols: + if _item_symbols: + _items.append(_item_symbols.to_dict()) + _dict['symbols'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZRowsItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "length": obj.get("length"), + "maxLength": obj.get("maxLength"), + "symbols": [Symbol.from_dict(_item) for _item in obj["symbols"]] if obj.get("symbols") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_test_quality.py b/regula/documentreader/webclient/gen/models/mrz_test_quality.py new file mode 100644 index 0000000..b5ab351 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_test_quality.py @@ -0,0 +1,105 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.string_item import StringItem +from typing import Optional, Set +from typing_extensions import Self + +class MRZTestQuality(BaseModel): + """ + MRZTestQuality + """ # noqa: E501 + check_sums: StrictInt = Field(alias="CHECK_SUMS") + contrast_print: StrictInt = Field(alias="CONTRAST_PRINT") + doc_format: StrictInt = Field(alias="DOC_FORMAT") + mrz_format: StrictInt = Field(alias="MRZ_FORMAT") + print_position: StrictInt = Field(alias="PRINT_POSITION") + stain_mrz: StrictInt = Field(alias="STAIN_MRZ") + symbols_param: StrictInt = Field(alias="SYMBOLS_PARAM") + str_count: StrictInt = Field(alias="StrCount") + strings: List[StringItem] = Field(alias="Strings") + textual_filling: StrictInt = Field(alias="TEXTUAL_FILLING") + __properties: ClassVar[List[str]] = ["CHECK_SUMS", "CONTRAST_PRINT", "DOC_FORMAT", "MRZ_FORMAT", "PRINT_POSITION", "STAIN_MRZ", "SYMBOLS_PARAM", "StrCount", "Strings", "TEXTUAL_FILLING"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZTestQuality from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in strings (list) + _items = [] + if self.strings: + for _item_strings in self.strings: + if _item_strings: + _items.append(_item_strings.to_dict()) + _dict['Strings'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZTestQuality from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "CHECK_SUMS": obj.get("CHECK_SUMS"), + "CONTRAST_PRINT": obj.get("CONTRAST_PRINT"), + "DOC_FORMAT": obj.get("DOC_FORMAT"), + "MRZ_FORMAT": obj.get("MRZ_FORMAT"), + "PRINT_POSITION": obj.get("PRINT_POSITION"), + "STAIN_MRZ": obj.get("STAIN_MRZ"), + "SYMBOLS_PARAM": obj.get("SYMBOLS_PARAM"), + "StrCount": obj.get("StrCount"), + "Strings": [StringItem.from_dict(_item) for _item in obj["Strings"]] if obj.get("Strings") is not None else None, + "TEXTUAL_FILLING": obj.get("TEXTUAL_FILLING") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_test_quality_item.py b/regula/documentreader/webclient/gen/models/mrz_test_quality_item.py new file mode 100644 index 0000000..2c22f9c --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_test_quality_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.mrz_test_quality import MRZTestQuality +from typing import Optional, Set +from typing_extensions import Self + +class MRZTestQualityItem(BaseModel): + """ + MRZTestQualityItem + """ # noqa: E501 + mrz_test_quality: MRZTestQuality = Field(alias="MRZTestQuality") + __properties: ClassVar[List[str]] = ["MRZTestQuality"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZTestQualityItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of mrz_test_quality + if self.mrz_test_quality: + _dict['MRZTestQuality'] = self.mrz_test_quality.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZTestQualityItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "MRZTestQuality": MRZTestQuality.from_dict(obj["MRZTestQuality"]) if obj.get("MRZTestQuality") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/mrz_test_quality_result.py b/regula/documentreader/webclient/gen/models/mrz_test_quality_result.py new file mode 100644 index 0000000..37367cb --- /dev/null +++ b/regula/documentreader/webclient/gen/models/mrz_test_quality_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.mrz_test_quality import MRZTestQuality +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self + +class MRZTestQualityResult(ResultItem): + """ + MRZTestQualityResult + """ # noqa: E501 + mrz_test_quality: MRZTestQuality = Field(alias="MRZTestQuality") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "MRZTestQuality"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of MRZTestQualityResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of mrz_test_quality + if self.mrz_test_quality: + _dict['MRZTestQuality'] = self.mrz_test_quality.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of MRZTestQualityResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "MRZTestQuality": MRZTestQuality.from_dict(obj["MRZTestQuality"]) if obj.get("MRZTestQuality") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/ocr_security_text_item.py b/regula/documentreader/webclient/gen/models/ocr_security_text_item.py new file mode 100644 index 0000000..b1d43c7 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/ocr_security_text_item.py @@ -0,0 +1,108 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.critical import Critical +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class OCRSecurityTextItem(BaseModel): + """ + OCRSecurityTextItem + """ # noqa: E501 + critical_flag: Critical = Field(alias="CriticalFlag") + light_type: Light = Field(alias="LightType") + field_rect: RectangleCoordinates = Field(alias="FieldRect") + etalon_result_type: StrictInt = Field(alias="EtalonResultType") + etalon_field_type: StrictInt = Field(alias="EtalonFieldType") + etalon_light_type: StrictInt = Field(alias="EtalonLightType") + etalon_field_rect: RectangleCoordinates = Field(alias="EtalonFieldRect") + security_text_result_ocr: StrictStr = Field(alias="SecurityTextResultOCR") + etalon_result_ocr: StrictStr = Field(alias="EtalonResultOCR") + reserved1: Optional[StrictInt] = Field(default=None, alias="Reserved1") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + __properties: ClassVar[List[str]] = ["CriticalFlag", "LightType", "FieldRect", "EtalonResultType", "EtalonFieldType", "EtalonLightType", "EtalonFieldRect", "SecurityTextResultOCR", "EtalonResultOCR", "Reserved1", "Reserved2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OCRSecurityTextItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of etalon_field_rect + if self.etalon_field_rect: + _dict['EtalonFieldRect'] = self.etalon_field_rect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OCRSecurityTextItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "CriticalFlag": obj.get("CriticalFlag"), + "LightType": obj.get("LightType"), + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None, + "EtalonResultType": obj.get("EtalonResultType"), + "EtalonFieldType": obj.get("EtalonFieldType"), + "EtalonLightType": obj.get("EtalonLightType"), + "EtalonFieldRect": RectangleCoordinates.from_dict(obj["EtalonFieldRect"]) if obj.get("EtalonFieldRect") is not None else None, + "SecurityTextResultOCR": obj.get("SecurityTextResultOCR"), + "EtalonResultOCR": obj.get("EtalonResultOCR"), + "Reserved1": obj.get("Reserved1"), + "Reserved2": obj.get("Reserved2") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/ocr_security_text_result.py b/regula/documentreader/webclient/gen/models/ocr_security_text_result.py index 19f40b1..67f8a22 100644 --- a/regula/documentreader/webclient/gen/models/ocr_security_text_result.py +++ b/regula/documentreader/webclient/gen/models/ocr_security_text_result.py @@ -4,457 +4,113 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class OCRSecurityTextResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - +import json + +from pydantic import ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.critical import Critical +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class OCRSecurityTextResult(AuthenticityCheckResultItem): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int', - 'critical_flag': 'Critical', - 'light_type': 'Light', - 'field_rect': 'RectangleCoordinates', - 'etalon_result_type': 'int', - 'etalon_field_type': 'int', - 'etalon_light_type': 'int', - 'security_text_result_ocr': 'str', - 'etalon_result_ocr': 'str', - 'reserved1': 'int', - 'reserved2': 'int' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue', - 'critical_flag': 'CriticalFlag', - 'light_type': 'LightType', - 'field_rect': 'FieldRect', - 'etalon_result_type': 'EtalonResultType', - 'etalon_field_type': 'EtalonFieldType', - 'etalon_light_type': 'EtalonLightType', - 'security_text_result_ocr': 'SecurityTextResultOCR', - 'etalon_result_ocr': 'EtalonResultOCR', - 'reserved1': 'Reserved1', - 'reserved2': 'Reserved2' - } - - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, critical_flag=None, light_type=None, field_rect=None, etalon_result_type=None, etalon_field_type=None, etalon_light_type=None, security_text_result_ocr=None, etalon_result_ocr=None, reserved1=None, reserved2=None, local_vars_configuration=None): # noqa: E501 - """OCRSecurityTextResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self._critical_flag = None - self._light_type = None - self._field_rect = None - self._etalon_result_type = None - self._etalon_field_type = None - self._etalon_light_type = None - self._security_text_result_ocr = None - self._etalon_result_ocr = None - self._reserved1 = None - self._reserved2 = None - self.discriminator = None - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - if critical_flag is not None: - self.critical_flag = critical_flag - if light_type is not None: - self.light_type = light_type - if field_rect is not None: - self.field_rect = field_rect - if etalon_result_type is not None: - self.etalon_result_type = etalon_result_type - if etalon_field_type is not None: - self.etalon_field_type = etalon_field_type - if etalon_light_type is not None: - self.etalon_light_type = etalon_light_type - if security_text_result_ocr is not None: - self.security_text_result_ocr = security_text_result_ocr - if etalon_result_ocr is not None: - self.etalon_result_ocr = etalon_result_ocr - if reserved1 is not None: - self.reserved1 = reserved1 - if reserved2 is not None: - self.reserved2 = reserved2 - - @property - def type(self): - """Gets the type of this OCRSecurityTextResult. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this OCRSecurityTextResult. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this OCRSecurityTextResult. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this OCRSecurityTextResult. # noqa: E501 - - - :return: The element_result of this OCRSecurityTextResult. # noqa: E501 - :rtype: CheckResult - """ - return self._element_result - - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this OCRSecurityTextResult. - - - :param element_result: The element_result of this OCRSecurityTextResult. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this OCRSecurityTextResult. # noqa: E501 - - - :return: The element_diagnose of this OCRSecurityTextResult. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this OCRSecurityTextResult. - - - :param element_diagnose: The element_diagnose of this OCRSecurityTextResult. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this OCRSecurityTextResult. # noqa: E501 - - - :return: The percent_value of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this OCRSecurityTextResult. - - - :param percent_value: The percent_value of this OCRSecurityTextResult. # noqa: E501 - :type percent_value: int - """ - - self._percent_value = percent_value - - @property - def critical_flag(self): - """Gets the critical_flag of this OCRSecurityTextResult. # noqa: E501 - - - :return: The critical_flag of this OCRSecurityTextResult. # noqa: E501 - :rtype: Critical - """ - return self._critical_flag - - @critical_flag.setter - def critical_flag(self, critical_flag): - """Sets the critical_flag of this OCRSecurityTextResult. - - - :param critical_flag: The critical_flag of this OCRSecurityTextResult. # noqa: E501 - :type critical_flag: Critical - """ - - self._critical_flag = critical_flag - - @property - def light_type(self): - """Gets the light_type of this OCRSecurityTextResult. # noqa: E501 - - - :return: The light_type of this OCRSecurityTextResult. # noqa: E501 - :rtype: Light - """ - return self._light_type - - @light_type.setter - def light_type(self, light_type): - """Sets the light_type of this OCRSecurityTextResult. - - - :param light_type: The light_type of this OCRSecurityTextResult. # noqa: E501 - :type light_type: Light - """ - - self._light_type = light_type - - @property - def field_rect(self): - """Gets the field_rect of this OCRSecurityTextResult. # noqa: E501 - - - :return: The field_rect of this OCRSecurityTextResult. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this OCRSecurityTextResult. - - - :param field_rect: The field_rect of this OCRSecurityTextResult. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def etalon_result_type(self): - """Gets the etalon_result_type of this OCRSecurityTextResult. # noqa: E501 - - - :return: The etalon_result_type of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._etalon_result_type - - @etalon_result_type.setter - def etalon_result_type(self, etalon_result_type): - """Sets the etalon_result_type of this OCRSecurityTextResult. - - - :param etalon_result_type: The etalon_result_type of this OCRSecurityTextResult. # noqa: E501 - :type etalon_result_type: int - """ - - self._etalon_result_type = etalon_result_type - - @property - def etalon_field_type(self): - """Gets the etalon_field_type of this OCRSecurityTextResult. # noqa: E501 - - - :return: The etalon_field_type of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._etalon_field_type - - @etalon_field_type.setter - def etalon_field_type(self, etalon_field_type): - """Sets the etalon_field_type of this OCRSecurityTextResult. - - - :param etalon_field_type: The etalon_field_type of this OCRSecurityTextResult. # noqa: E501 - :type etalon_field_type: int - """ - - self._etalon_field_type = etalon_field_type - - @property - def etalon_light_type(self): - """Gets the etalon_light_type of this OCRSecurityTextResult. # noqa: E501 - - - :return: The etalon_light_type of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._etalon_light_type - - @etalon_light_type.setter - def etalon_light_type(self, etalon_light_type): - """Sets the etalon_light_type of this OCRSecurityTextResult. - - - :param etalon_light_type: The etalon_light_type of this OCRSecurityTextResult. # noqa: E501 - :type etalon_light_type: int - """ - - self._etalon_light_type = etalon_light_type - - @property - def security_text_result_ocr(self): - """Gets the security_text_result_ocr of this OCRSecurityTextResult. # noqa: E501 - - - :return: The security_text_result_ocr of this OCRSecurityTextResult. # noqa: E501 - :rtype: str - """ - return self._security_text_result_ocr - - @security_text_result_ocr.setter - def security_text_result_ocr(self, security_text_result_ocr): - """Sets the security_text_result_ocr of this OCRSecurityTextResult. - - - :param security_text_result_ocr: The security_text_result_ocr of this OCRSecurityTextResult. # noqa: E501 - :type security_text_result_ocr: str - """ - - self._security_text_result_ocr = security_text_result_ocr - - @property - def etalon_result_ocr(self): - """Gets the etalon_result_ocr of this OCRSecurityTextResult. # noqa: E501 - - - :return: The etalon_result_ocr of this OCRSecurityTextResult. # noqa: E501 - :rtype: str - """ - return self._etalon_result_ocr - - @etalon_result_ocr.setter - def etalon_result_ocr(self, etalon_result_ocr): - """Sets the etalon_result_ocr of this OCRSecurityTextResult. - - - :param etalon_result_ocr: The etalon_result_ocr of this OCRSecurityTextResult. # noqa: E501 - :type etalon_result_ocr: str - """ - - self._etalon_result_ocr = etalon_result_ocr - - @property - def reserved1(self): - """Gets the reserved1 of this OCRSecurityTextResult. # noqa: E501 - - - :return: The reserved1 of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._reserved1 - - @reserved1.setter - def reserved1(self, reserved1): - """Sets the reserved1 of this OCRSecurityTextResult. - - - :param reserved1: The reserved1 of this OCRSecurityTextResult. # noqa: E501 - :type reserved1: int - """ - - self._reserved1 = reserved1 - - @property - def reserved2(self): - """Gets the reserved2 of this OCRSecurityTextResult. # noqa: E501 - - - :return: The reserved2 of this OCRSecurityTextResult. # noqa: E501 - :rtype: int - """ - return self._reserved2 - - @reserved2.setter - def reserved2(self, reserved2): - """Sets the reserved2 of this OCRSecurityTextResult. - - - :param reserved2: The reserved2 of this OCRSecurityTextResult. # noqa: E501 - :type reserved2: int - """ - - self._reserved2 = reserved2 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OCRSecurityTextResult): - return False - - return self.to_dict() == other.to_dict() + OCRSecurityTextResult + """ # noqa: E501 + critical_flag: Critical = Field(alias="CriticalFlag") + light_type: Light = Field(alias="LightType") + field_rect: RectangleCoordinates = Field(alias="FieldRect") + etalon_result_type: StrictInt = Field(alias="EtalonResultType") + etalon_field_type: StrictInt = Field(alias="EtalonFieldType") + etalon_light_type: StrictInt = Field(alias="EtalonLightType") + etalon_field_rect: RectangleCoordinates = Field(alias="EtalonFieldRect") + security_text_result_ocr: StrictStr = Field(alias="SecurityTextResultOCR") + etalon_result_ocr: StrictStr = Field(alias="EtalonResultOCR") + reserved1: Optional[StrictInt] = Field(default=None, alias="Reserved1") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue", "CriticalFlag", "LightType", "FieldRect", "EtalonResultType", "EtalonFieldType", "EtalonLightType", "EtalonFieldRect", "SecurityTextResultOCR", "EtalonResultOCR", "Reserved1", "Reserved2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OCRSecurityTextResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['FieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of etalon_field_rect + if self.etalon_field_rect: + _dict['EtalonFieldRect'] = self.etalon_field_rect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OCRSecurityTextResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "ElementResult": obj.get("ElementResult"), + "ElementDiagnose": obj.get("ElementDiagnose"), + "PercentValue": obj.get("PercentValue"), + "CriticalFlag": obj.get("CriticalFlag"), + "LightType": obj.get("LightType"), + "FieldRect": RectangleCoordinates.from_dict(obj["FieldRect"]) if obj.get("FieldRect") is not None else None, + "EtalonResultType": obj.get("EtalonResultType"), + "EtalonFieldType": obj.get("EtalonFieldType"), + "EtalonLightType": obj.get("EtalonLightType"), + "EtalonFieldRect": RectangleCoordinates.from_dict(obj["EtalonFieldRect"]) if obj.get("EtalonFieldRect") is not None else None, + "SecurityTextResultOCR": obj.get("SecurityTextResultOCR"), + "EtalonResultOCR": obj.get("EtalonResultOCR"), + "Reserved1": obj.get("Reserved1"), + "Reserved2": obj.get("Reserved2") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OCRSecurityTextResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/ocr_security_text_result_all_of.py b/regula/documentreader/webclient/gen/models/ocr_security_text_result_all_of.py deleted file mode 100644 index 8748cd8..0000000 --- a/regula/documentreader/webclient/gen/models/ocr_security_text_result_all_of.py +++ /dev/null @@ -1,353 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class OCRSecurityTextResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'critical_flag': 'Critical', - 'light_type': 'Light', - 'field_rect': 'RectangleCoordinates', - 'etalon_result_type': 'int', - 'etalon_field_type': 'int', - 'etalon_light_type': 'int', - 'security_text_result_ocr': 'str', - 'etalon_result_ocr': 'str', - 'reserved1': 'int', - 'reserved2': 'int' - } - - attribute_map = { - 'critical_flag': 'CriticalFlag', - 'light_type': 'LightType', - 'field_rect': 'FieldRect', - 'etalon_result_type': 'EtalonResultType', - 'etalon_field_type': 'EtalonFieldType', - 'etalon_light_type': 'EtalonLightType', - 'security_text_result_ocr': 'SecurityTextResultOCR', - 'etalon_result_ocr': 'EtalonResultOCR', - 'reserved1': 'Reserved1', - 'reserved2': 'Reserved2' - } - - def __init__(self, critical_flag=None, light_type=None, field_rect=None, etalon_result_type=None, etalon_field_type=None, etalon_light_type=None, security_text_result_ocr=None, etalon_result_ocr=None, reserved1=None, reserved2=None, local_vars_configuration=None): # noqa: E501 - """OCRSecurityTextResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._critical_flag = None - self._light_type = None - self._field_rect = None - self._etalon_result_type = None - self._etalon_field_type = None - self._etalon_light_type = None - self._security_text_result_ocr = None - self._etalon_result_ocr = None - self._reserved1 = None - self._reserved2 = None - self.discriminator = None - - if critical_flag is not None: - self.critical_flag = critical_flag - if light_type is not None: - self.light_type = light_type - if field_rect is not None: - self.field_rect = field_rect - if etalon_result_type is not None: - self.etalon_result_type = etalon_result_type - if etalon_field_type is not None: - self.etalon_field_type = etalon_field_type - if etalon_light_type is not None: - self.etalon_light_type = etalon_light_type - if security_text_result_ocr is not None: - self.security_text_result_ocr = security_text_result_ocr - if etalon_result_ocr is not None: - self.etalon_result_ocr = etalon_result_ocr - if reserved1 is not None: - self.reserved1 = reserved1 - if reserved2 is not None: - self.reserved2 = reserved2 - - @property - def critical_flag(self): - """Gets the critical_flag of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The critical_flag of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: Critical - """ - return self._critical_flag - - @critical_flag.setter - def critical_flag(self, critical_flag): - """Sets the critical_flag of this OCRSecurityTextResultAllOf. - - - :param critical_flag: The critical_flag of this OCRSecurityTextResultAllOf. # noqa: E501 - :type critical_flag: Critical - """ - - self._critical_flag = critical_flag - - @property - def light_type(self): - """Gets the light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: Light - """ - return self._light_type - - @light_type.setter - def light_type(self, light_type): - """Sets the light_type of this OCRSecurityTextResultAllOf. - - - :param light_type: The light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :type light_type: Light - """ - - self._light_type = light_type - - @property - def field_rect(self): - """Gets the field_rect of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The field_rect of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this OCRSecurityTextResultAllOf. - - - :param field_rect: The field_rect of this OCRSecurityTextResultAllOf. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def etalon_result_type(self): - """Gets the etalon_result_type of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The etalon_result_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: int - """ - return self._etalon_result_type - - @etalon_result_type.setter - def etalon_result_type(self, etalon_result_type): - """Sets the etalon_result_type of this OCRSecurityTextResultAllOf. - - - :param etalon_result_type: The etalon_result_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :type etalon_result_type: int - """ - - self._etalon_result_type = etalon_result_type - - @property - def etalon_field_type(self): - """Gets the etalon_field_type of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The etalon_field_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: int - """ - return self._etalon_field_type - - @etalon_field_type.setter - def etalon_field_type(self, etalon_field_type): - """Sets the etalon_field_type of this OCRSecurityTextResultAllOf. - - - :param etalon_field_type: The etalon_field_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :type etalon_field_type: int - """ - - self._etalon_field_type = etalon_field_type - - @property - def etalon_light_type(self): - """Gets the etalon_light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The etalon_light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: int - """ - return self._etalon_light_type - - @etalon_light_type.setter - def etalon_light_type(self, etalon_light_type): - """Sets the etalon_light_type of this OCRSecurityTextResultAllOf. - - - :param etalon_light_type: The etalon_light_type of this OCRSecurityTextResultAllOf. # noqa: E501 - :type etalon_light_type: int - """ - - self._etalon_light_type = etalon_light_type - - @property - def security_text_result_ocr(self): - """Gets the security_text_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The security_text_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: str - """ - return self._security_text_result_ocr - - @security_text_result_ocr.setter - def security_text_result_ocr(self, security_text_result_ocr): - """Sets the security_text_result_ocr of this OCRSecurityTextResultAllOf. - - - :param security_text_result_ocr: The security_text_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - :type security_text_result_ocr: str - """ - - self._security_text_result_ocr = security_text_result_ocr - - @property - def etalon_result_ocr(self): - """Gets the etalon_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The etalon_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: str - """ - return self._etalon_result_ocr - - @etalon_result_ocr.setter - def etalon_result_ocr(self, etalon_result_ocr): - """Sets the etalon_result_ocr of this OCRSecurityTextResultAllOf. - - - :param etalon_result_ocr: The etalon_result_ocr of this OCRSecurityTextResultAllOf. # noqa: E501 - :type etalon_result_ocr: str - """ - - self._etalon_result_ocr = etalon_result_ocr - - @property - def reserved1(self): - """Gets the reserved1 of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The reserved1 of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: int - """ - return self._reserved1 - - @reserved1.setter - def reserved1(self, reserved1): - """Sets the reserved1 of this OCRSecurityTextResultAllOf. - - - :param reserved1: The reserved1 of this OCRSecurityTextResultAllOf. # noqa: E501 - :type reserved1: int - """ - - self._reserved1 = reserved1 - - @property - def reserved2(self): - """Gets the reserved2 of this OCRSecurityTextResultAllOf. # noqa: E501 - - - :return: The reserved2 of this OCRSecurityTextResultAllOf. # noqa: E501 - :rtype: int - """ - return self._reserved2 - - @reserved2.setter - def reserved2(self, reserved2): - """Sets the reserved2 of this OCRSecurityTextResultAllOf. - - - :param reserved2: The reserved2 of this OCRSecurityTextResultAllOf. # noqa: E501 - :type reserved2: int - """ - - self._reserved2 = reserved2 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OCRSecurityTextResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OCRSecurityTextResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/one_candidate.py b/regula/documentreader/webclient/gen/models/one_candidate.py old mode 100755 new mode 100644 index 1c79f4a..2e4eb2a --- a/regula/documentreader/webclient/gen/models/one_candidate.py +++ b/regula/documentreader/webclient/gen/models/one_candidate.py @@ -4,344 +4,104 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains information about one document type candidate -""" -class OneCandidate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.fdsid_list import FDSIDList +from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation +from typing import Optional, Set +from typing_extensions import Self +class OneCandidate(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'document_name': 'str', - 'id': 'int', - 'p': 'float', - 'rfid_presence': 'RfidLocation', - 'fdsid_list': 'FDSIDList', - 'necessary_lights': 'int', - 'check_authenticity': 'int', - 'uv_exp': 'int', - 'authenticity_necessary_lights': 'int' - } - - attribute_map = { - 'document_name': 'DocumentName', - 'id': 'ID', - 'p': 'P', - 'rfid_presence': 'RFID_Presence', - 'fdsid_list': 'FDSIDList', - 'necessary_lights': 'NecessaryLights', - 'check_authenticity': 'CheckAuthenticity', - 'uv_exp': 'UVExp', - 'authenticity_necessary_lights': 'AuthenticityNecessaryLights' - } - - def __init__(self, document_name=None, id=None, p=None, rfid_presence=None, fdsid_list=None, necessary_lights=None, check_authenticity=None, uv_exp=None, authenticity_necessary_lights=None, local_vars_configuration=None): # noqa: E501 - """OneCandidate - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._document_name = None - self._id = None - self._p = None - self._rfid_presence = None - self._fdsid_list = None - self._necessary_lights = None - self._check_authenticity = None - self._uv_exp = None - self._authenticity_necessary_lights = None - self.discriminator = None - - if document_name is not None: - self.document_name = document_name - if id is not None: - self.id = id - if p is not None: - self.p = p - if rfid_presence is not None: - self.rfid_presence = rfid_presence - if fdsid_list is not None: - self.fdsid_list = fdsid_list - if necessary_lights is not None: - self.necessary_lights = necessary_lights - if check_authenticity is not None: - self.check_authenticity = check_authenticity - if uv_exp is not None: - self.uv_exp = uv_exp - if authenticity_necessary_lights is not None: - self.authenticity_necessary_lights = authenticity_necessary_lights - - @property - def document_name(self): - """Gets the document_name of this OneCandidate. # noqa: E501 - - Document name # noqa: E501 - - :return: The document_name of this OneCandidate. # noqa: E501 - :rtype: str - """ - return self._document_name - - @document_name.setter - def document_name(self, document_name): - """Sets the document_name of this OneCandidate. - - Document name # noqa: E501 - - :param document_name: The document_name of this OneCandidate. # noqa: E501 - :type document_name: str - """ - - self._document_name = document_name - - @property - def id(self): - """Gets the id of this OneCandidate. # noqa: E501 - - Unique document type template identifier (Regula's internal numeric code) # noqa: E501 - - :return: The id of this OneCandidate. # noqa: E501 - :rtype: int - """ - return self._id - - @id.setter - def id(self, id): - """Sets the id of this OneCandidate. - - Unique document type template identifier (Regula's internal numeric code) # noqa: E501 - - :param id: The id of this OneCandidate. # noqa: E501 - :type id: int - """ - - self._id = id - - @property - def p(self): - """Gets the p of this OneCandidate. # noqa: E501 - - A measure of the likelihood of correct recognition in the analysis of this type of document # noqa: E501 - - :return: The p of this OneCandidate. # noqa: E501 - :rtype: float - """ - return self._p - - @p.setter - def p(self, p): - """Sets the p of this OneCandidate. - - A measure of the likelihood of correct recognition in the analysis of this type of document # noqa: E501 - - :param p: The p of this OneCandidate. # noqa: E501 - :type p: float - """ - if (self.local_vars_configuration.client_side_validation and - p is not None and p > 1): # noqa: E501 - raise ValueError("Invalid value for `p`, must be a value less than or equal to `1`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - p is not None and p < 0): # noqa: E501 - raise ValueError("Invalid value for `p`, must be a value greater than or equal to `0`") # noqa: E501 - - self._p = p - - @property - def rfid_presence(self): - """Gets the rfid_presence of this OneCandidate. # noqa: E501 - - - :return: The rfid_presence of this OneCandidate. # noqa: E501 - :rtype: RfidLocation - """ - return self._rfid_presence - - @rfid_presence.setter - def rfid_presence(self, rfid_presence): - """Sets the rfid_presence of this OneCandidate. - - - :param rfid_presence: The rfid_presence of this OneCandidate. # noqa: E501 - :type rfid_presence: RfidLocation - """ - - self._rfid_presence = rfid_presence - - @property - def fdsid_list(self): - """Gets the fdsid_list of this OneCandidate. # noqa: E501 - - - :return: The fdsid_list of this OneCandidate. # noqa: E501 - :rtype: FDSIDList - """ - return self._fdsid_list - - @fdsid_list.setter - def fdsid_list(self, fdsid_list): - """Sets the fdsid_list of this OneCandidate. - - - :param fdsid_list: The fdsid_list of this OneCandidate. # noqa: E501 - :type fdsid_list: FDSIDList - """ - - self._fdsid_list = fdsid_list - - @property - def necessary_lights(self): - """Gets the necessary_lights of this OneCandidate. # noqa: E501 - - Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document # noqa: E501 - - :return: The necessary_lights of this OneCandidate. # noqa: E501 - :rtype: int - """ - return self._necessary_lights - - @necessary_lights.setter - def necessary_lights(self, necessary_lights): - """Sets the necessary_lights of this OneCandidate. - - Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document # noqa: E501 - - :param necessary_lights: The necessary_lights of this OneCandidate. # noqa: E501 - :type necessary_lights: int - """ - - self._necessary_lights = necessary_lights - - @property - def check_authenticity(self): - """Gets the check_authenticity of this OneCandidate. # noqa: E501 - - Set of authentication options provided for this type of document (combination of Authenticity enum) # noqa: E501 - - :return: The check_authenticity of this OneCandidate. # noqa: E501 - :rtype: int - """ - return self._check_authenticity - - @check_authenticity.setter - def check_authenticity(self, check_authenticity): - """Sets the check_authenticity of this OneCandidate. - - Set of authentication options provided for this type of document (combination of Authenticity enum) # noqa: E501 - - :param check_authenticity: The check_authenticity of this OneCandidate. # noqa: E501 - :type check_authenticity: int - """ - - self._check_authenticity = check_authenticity - - @property - def uv_exp(self): - """Gets the uv_exp of this OneCandidate. # noqa: E501 - - The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme # noqa: E501 - - :return: The uv_exp of this OneCandidate. # noqa: E501 - :rtype: int - """ - return self._uv_exp - - @uv_exp.setter - def uv_exp(self, uv_exp): - """Sets the uv_exp of this OneCandidate. - - The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme # noqa: E501 - - :param uv_exp: The uv_exp of this OneCandidate. # noqa: E501 - :type uv_exp: int - """ - - self._uv_exp = uv_exp - - @property - def authenticity_necessary_lights(self): - """Gets the authenticity_necessary_lights of this OneCandidate. # noqa: E501 - - Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity # noqa: E501 - - :return: The authenticity_necessary_lights of this OneCandidate. # noqa: E501 - :rtype: int - """ - return self._authenticity_necessary_lights - - @authenticity_necessary_lights.setter - def authenticity_necessary_lights(self, authenticity_necessary_lights): - """Sets the authenticity_necessary_lights of this OneCandidate. - - Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity # noqa: E501 - - :param authenticity_necessary_lights: The authenticity_necessary_lights of this OneCandidate. # noqa: E501 - :type authenticity_necessary_lights: int - """ - - self._authenticity_necessary_lights = authenticity_necessary_lights - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OneCandidate): - return False - - return self.to_dict() == other.to_dict() + Contains information about one document type candidate + """ # noqa: E501 + document_name: StrictStr = Field(description="Document name", alias="DocumentName") + id: StrictInt = Field(description="Unique document type template identifier (Regula's internal numeric code)", alias="ID") + p: Union[Annotated[float, Field(le=1, strict=True, ge=0)], Annotated[int, Field(le=1, strict=True, ge=0)]] = Field(description="A measure of the likelihood of correct recognition in the analysis of this type of document", alias="P") + rotated180: StrictInt = Field(description="true if the document of the given type is rotated by 180 degrees", alias="Rotated180") + rfid_presence: RfidLocation = Field(alias="RFID_Presence") + fdsid_list: FDSIDList = Field(alias="FDSIDList") + necessary_lights: StrictInt = Field(description="Combination of lighting scheme identifiers (Light enum) required to conduct OCR for this type of document", alias="NecessaryLights") + check_authenticity: StrictInt = Field(description="Set of authentication options provided for this type of document (combination of Authenticity enum)", alias="CheckAuthenticity") + uv_exp: StrictInt = Field(description="The required exposure value of the camera when receiving images of a document of this type for a UV lighting scheme", alias="UVExp") + authenticity_necessary_lights: StrictInt = Field(description="Combination of lighting scheme identifiers (combination of Light enum) needed to perform all authenticity checks specified in CheckAuthenticity", alias="AuthenticityNecessaryLights") + ovi_exp: Union[StrictFloat, StrictInt] = Field(description="Camera exposure value necessary when obtaining document images of the given type for AXIAL lighting scheme", alias="OVIExp") + rotation_angle: Optional[StrictInt] = Field(default=None, alias="RotationAngle") + __properties: ClassVar[List[str]] = ["DocumentName", "ID", "P", "Rotated180", "RFID_Presence", "FDSIDList", "NecessaryLights", "CheckAuthenticity", "UVExp", "AuthenticityNecessaryLights", "OVIExp", "RotationAngle"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OneCandidate from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of fdsid_list + if self.fdsid_list: + _dict['FDSIDList'] = self.fdsid_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OneCandidate from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocumentName": obj.get("DocumentName"), + "ID": obj.get("ID"), + "P": obj.get("P"), + "Rotated180": obj.get("Rotated180"), + "RFID_Presence": obj.get("RFID_Presence"), + "FDSIDList": FDSIDList.from_dict(obj["FDSIDList"]) if obj.get("FDSIDList") is not None else None, + "NecessaryLights": obj.get("NecessaryLights"), + "CheckAuthenticity": obj.get("CheckAuthenticity"), + "UVExp": obj.get("UVExp"), + "AuthenticityNecessaryLights": obj.get("AuthenticityNecessaryLights"), + "OVIExp": obj.get("OVIExp"), + "RotationAngle": obj.get("RotationAngle") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OneCandidate): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/one_candidate_item.py b/regula/documentreader/webclient/gen/models/one_candidate_item.py new file mode 100644 index 0000000..675cde4 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/one_candidate_item.py @@ -0,0 +1,87 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate +from typing import Optional, Set +from typing_extensions import Self + +class OneCandidateItem(BaseModel): + """ + OneCandidateItem + """ # noqa: E501 + one_candidate: OneCandidate = Field(alias="OneCandidate") + xml_buffer: Optional[StrictStr] = Field(default=None, alias="XML_buffer") + __properties: ClassVar[List[str]] = ["OneCandidate", "XML_buffer"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OneCandidateItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + * OpenAPI `readOnly` fields are excluded. + """ + excluded_fields: Set[str] = set([ + "xml_buffer", + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of one_candidate + if self.one_candidate: + _dict['OneCandidate'] = self.one_candidate.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OneCandidateItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "OneCandidate": OneCandidate.from_dict(obj["OneCandidate"]) if obj.get("OneCandidate") is not None else None, + "XML_buffer": obj.get("XML_buffer") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/original_symbol.py b/regula/documentreader/webclient/gen/models/original_symbol.py old mode 100755 new mode 100644 index d92a11d..88df32e --- a/regula/documentreader/webclient/gen/models/original_symbol.py +++ b/regula/documentreader/webclient/gen/models/original_symbol.py @@ -4,178 +4,85 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class OriginalSymbol(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self +class OriginalSymbol(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'code': 'int', - 'probability': 'int', - 'rect': 'RectangleCoordinates' - } - - attribute_map = { - 'code': 'code', - 'probability': 'probability', - 'rect': 'rect' - } - - def __init__(self, code=None, probability=None, rect=None, local_vars_configuration=None): # noqa: E501 - """OriginalSymbol - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._code = None - self._probability = None - self._rect = None - self.discriminator = None - - if code is not None: - self.code = code - if probability is not None: - self.probability = probability - if rect is not None: - self.rect = rect - - @property - def code(self): - """Gets the code of this OriginalSymbol. # noqa: E501 - - Unicode symbol code # noqa: E501 - - :return: The code of this OriginalSymbol. # noqa: E501 - :rtype: int - """ - return self._code - - @code.setter - def code(self, code): - """Sets the code of this OriginalSymbol. - - Unicode symbol code # noqa: E501 - - :param code: The code of this OriginalSymbol. # noqa: E501 - :type code: int - """ - - self._code = code - - @property - def probability(self): - """Gets the probability of this OriginalSymbol. # noqa: E501 - - Probability of correctness reading of a single character # noqa: E501 - - :return: The probability of this OriginalSymbol. # noqa: E501 - :rtype: int - """ - return self._probability - - @probability.setter - def probability(self, probability): - """Sets the probability of this OriginalSymbol. - - Probability of correctness reading of a single character # noqa: E501 - - :param probability: The probability of this OriginalSymbol. # noqa: E501 - :type probability: int + OriginalSymbol + """ # noqa: E501 + code: StrictInt = Field(description="Unicode symbol code") + probability: Annotated[int, Field(le=100, strict=True, ge=0)] = Field(description="Probability of correctness reading of a single character") + rect: Optional[RectangleCoordinates] = None + __properties: ClassVar[List[str]] = ["code", "probability", "rect"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OriginalSymbol from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - if (self.local_vars_configuration.client_side_validation and - probability is not None and probability > 100): # noqa: E501 - raise ValueError("Invalid value for `probability`, must be a value less than or equal to `100`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - probability is not None and probability < 0): # noqa: E501 - raise ValueError("Invalid value for `probability`, must be a value greater than or equal to `0`") # noqa: E501 - - self._probability = probability + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of rect + if self.rect: + _dict['rect'] = self.rect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OriginalSymbol from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "code": obj.get("code"), + "probability": obj.get("probability"), + "rect": RectangleCoordinates.from_dict(obj["rect"]) if obj.get("rect") is not None else None + }) + return _obj - @property - def rect(self): - """Gets the rect of this OriginalSymbol. # noqa: E501 - - - :return: The rect of this OriginalSymbol. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._rect - - @rect.setter - def rect(self, rect): - """Sets the rect of this OriginalSymbol. - - - :param rect: The rect of this OriginalSymbol. # noqa: E501 - :type rect: RectangleCoordinates - """ - self._rect = rect - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OriginalSymbol): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OriginalSymbol): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/out_data.py b/regula/documentreader/webclient/gen/models/out_data.py index 755214d..9135d62 100644 --- a/regula/documentreader/webclient/gen/models/out_data.py +++ b/regula/documentreader/webclient/gen/models/out_data.py @@ -4,144 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.out_data_transaction_images_field_value import OutDataTransactionImagesFieldValue +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class OutData(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class OutData(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'url': 'str', - 'images': 'list[OutDataTransactionImagesFieldValue]' - } - - attribute_map = { - 'url': 'url', - 'images': 'images' - } - - def __init__(self, url=None, images=None, local_vars_configuration=None): # noqa: E501 - """OutData - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._url = None - self._images = None - self.discriminator = None - - if url is not None: - self.url = url - if images is not None: - self.images = images - - @property - def url(self): - """Gets the url of this OutData. # noqa: E501 - - Response url # noqa: E501 - - :return: The url of this OutData. # noqa: E501 - :rtype: str + OutData + """ # noqa: E501 + url: Optional[StrictStr] = Field(default=None, description="Response url") + images: Optional[List[OutDataTransactionImagesFieldValue]] = None + __properties: ClassVar[List[str]] = ["url", "images"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this OutData. - - Response url # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in images (list) + _items = [] + if self.images: + for _item_images in self.images: + if _item_images: + _items.append(_item_images.to_dict()) + _dict['images'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "url": obj.get("url"), + "images": [OutDataTransactionImagesFieldValue.from_dict(_item) for _item in obj["images"]] if obj.get("images") is not None else None + }) + return _obj - :param url: The url of this OutData. # noqa: E501 - :type url: str - """ - - self._url = url - - @property - def images(self): - """Gets the images of this OutData. # noqa: E501 - - - :return: The images of this OutData. # noqa: E501 - :rtype: list[OutDataTransactionImagesFieldValue] - """ - return self._images - - @images.setter - def images(self, images): - """Sets the images of this OutData. - - - :param images: The images of this OutData. # noqa: E501 - :type images: list[OutDataTransactionImagesFieldValue] - """ - self._images = images - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OutData): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OutData): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/out_data_transaction_images_field_value.py b/regula/documentreader/webclient/gen/models/out_data_transaction_images_field_value.py index 6b1f81b..f80116c 100644 --- a/regula/documentreader/webclient/gen/models/out_data_transaction_images_field_value.py +++ b/regula/documentreader/webclient/gen/models/out_data_transaction_images_field_value.py @@ -4,224 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType +from regula.documentreader.webclient.gen.models.light import Light +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class OutDataTransactionImagesFieldValue(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class OutDataTransactionImagesFieldValue(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'field_type': 'GraphicFieldType', - 'light': 'Light', - 'list_idx': 'int', - 'page_idx': 'int', - 'url': 'str' - } - - attribute_map = { - 'field_type': 'fieldType', - 'light': 'light', - 'list_idx': 'listIdx', - 'page_idx': 'pageIdx', - 'url': 'url' - } - - def __init__(self, field_type=None, light=None, list_idx=None, page_idx=None, url=None, local_vars_configuration=None): # noqa: E501 - """OutDataTransactionImagesFieldValue - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._field_type = None - self._light = None - self._list_idx = None - self._page_idx = None - self._url = None - self.discriminator = None - - if field_type is not None: - self.field_type = field_type - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - if url is not None: - self.url = url - - @property - def field_type(self): - """Gets the field_type of this OutDataTransactionImagesFieldValue. # noqa: E501 - - - :return: The field_type of this OutDataTransactionImagesFieldValue. # noqa: E501 - :rtype: GraphicFieldType - """ - return self._field_type - - @field_type.setter - def field_type(self, field_type): - """Sets the field_type of this OutDataTransactionImagesFieldValue. - - - :param field_type: The field_type of this OutDataTransactionImagesFieldValue. # noqa: E501 - :type field_type: GraphicFieldType - """ - - self._field_type = field_type - - @property - def light(self): - """Gets the light of this OutDataTransactionImagesFieldValue. # noqa: E501 - - - :return: The light of this OutDataTransactionImagesFieldValue. # noqa: E501 - :rtype: Light - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this OutDataTransactionImagesFieldValue. - - - :param light: The light of this OutDataTransactionImagesFieldValue. # noqa: E501 - :type light: Light - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - - - :return: The list_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this OutDataTransactionImagesFieldValue. - - - :param list_idx: The list_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - - Page index of the image from input list # noqa: E501 - - :return: The page_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - :rtype: int + OutDataTransactionImagesFieldValue + """ # noqa: E501 + field_type: Optional[GraphicFieldType] = Field(default=None, alias="fieldType") + light: Optional[Light] = None + list_idx: Optional[StrictInt] = Field(default=None, alias="listIdx") + page_idx: Optional[StrictInt] = Field(default=None, description="Page index of the image from input list", alias="pageIdx") + url: Optional[StrictStr] = Field(default=None, description="Image url") + __properties: ClassVar[List[str]] = ["fieldType", "light", "listIdx", "pageIdx", "url"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OutDataTransactionImagesFieldValue from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._page_idx + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OutDataTransactionImagesFieldValue from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "fieldType": obj.get("fieldType"), + "light": obj.get("light"), + "listIdx": obj.get("listIdx"), + "pageIdx": obj.get("pageIdx"), + "url": obj.get("url") + }) + return _obj - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this OutDataTransactionImagesFieldValue. - - Page index of the image from input list # noqa: E501 - - :param page_idx: The page_idx of this OutDataTransactionImagesFieldValue. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def url(self): - """Gets the url of this OutDataTransactionImagesFieldValue. # noqa: E501 - - Image url # noqa: E501 - - :return: The url of this OutDataTransactionImagesFieldValue. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this OutDataTransactionImagesFieldValue. - - Image url # noqa: E501 - - :param url: The url of this OutDataTransactionImagesFieldValue. # noqa: E501 - :type url: str - """ - self._url = url - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, OutDataTransactionImagesFieldValue): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, OutDataTransactionImagesFieldValue): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/p_array_field.py b/regula/documentreader/webclient/gen/models/p_array_field.py index 164e6de..5baac5e 100644 --- a/regula/documentreader/webclient/gen/models/p_array_field.py +++ b/regula/documentreader/webclient/gen/models/p_array_field.py @@ -4,350 +4,111 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PArrayField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.barcode_type import BarcodeType +from regula.documentreader.webclient.gen.models.bc_pdf417_info import BcPDF417INFO +from regula.documentreader.webclient.gen.models.bc_roidetect import BcROIDETECT +from regula.documentreader.webclient.gen.models.data_module import DataModule +from typing import Optional, Set +from typing_extensions import Self + +class PArrayField(BaseModel): """ - openapi_types = { - 'bc_angle_detect': 'float', - 'bc_code_result': 'int', - 'bc_count_module': 'int', - 'bc_data_module': 'list[DataModule]', - 'bc_pdf417_info': 'BcPDF417INFO', - 'bc_roi_detect': 'BcROIDETECT', - 'bc_text_decoder_types': 'int', - 'bc_text_field_type': 'int', - 'bc_type_decode': 'int', - 'bc_type_detect': 'int' - } - - attribute_map = { - 'bc_angle_detect': 'bcAngle_DETECT', - 'bc_code_result': 'bcCodeResult', - 'bc_count_module': 'bcCountModule', - 'bc_data_module': 'bcDataModule', - 'bc_pdf417_info': 'bcPDF417INFO', - 'bc_roi_detect': 'bcROI_DETECT', - 'bc_text_decoder_types': 'bcTextDecoderTypes', - 'bc_text_field_type': 'bcTextFieldType', - 'bc_type_decode': 'bcType_DECODE', - 'bc_type_detect': 'bcType_DETECT' - } - - def __init__(self, bc_angle_detect=None, bc_code_result=None, bc_count_module=None, bc_data_module=None, bc_pdf417_info=None, bc_roi_detect=None, bc_text_decoder_types=None, bc_text_field_type=None, bc_type_decode=None, bc_type_detect=None, local_vars_configuration=None): # noqa: E501 - """PArrayField - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._bc_angle_detect = None - self._bc_code_result = None - self._bc_count_module = None - self._bc_data_module = None - self._bc_pdf417_info = None - self._bc_roi_detect = None - self._bc_text_decoder_types = None - self._bc_text_field_type = None - self._bc_type_decode = None - self._bc_type_detect = None - self.discriminator = None - - if bc_angle_detect is not None: - self.bc_angle_detect = bc_angle_detect - if bc_code_result is not None: - self.bc_code_result = bc_code_result - if bc_count_module is not None: - self.bc_count_module = bc_count_module - if bc_data_module is not None: - self.bc_data_module = bc_data_module - if bc_pdf417_info is not None: - self.bc_pdf417_info = bc_pdf417_info - if bc_roi_detect is not None: - self.bc_roi_detect = bc_roi_detect - if bc_text_decoder_types is not None: - self.bc_text_decoder_types = bc_text_decoder_types - if bc_text_field_type is not None: - self.bc_text_field_type = bc_text_field_type - if bc_type_decode is not None: - self.bc_type_decode = bc_type_decode - if bc_type_detect is not None: - self.bc_type_detect = bc_type_detect - - @property - def bc_angle_detect(self): - """Gets the bc_angle_detect of this PArrayField. # noqa: E501 - - - :return: The bc_angle_detect of this PArrayField. # noqa: E501 - :rtype: float - """ - return self._bc_angle_detect - - @bc_angle_detect.setter - def bc_angle_detect(self, bc_angle_detect): - """Sets the bc_angle_detect of this PArrayField. - - - :param bc_angle_detect: The bc_angle_detect of this PArrayField. # noqa: E501 - :type bc_angle_detect: float - """ - - self._bc_angle_detect = bc_angle_detect - - @property - def bc_code_result(self): - """Gets the bc_code_result of this PArrayField. # noqa: E501 - - - :return: The bc_code_result of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_code_result - - @bc_code_result.setter - def bc_code_result(self, bc_code_result): - """Sets the bc_code_result of this PArrayField. - - - :param bc_code_result: The bc_code_result of this PArrayField. # noqa: E501 - :type bc_code_result: int - """ - - self._bc_code_result = bc_code_result - - @property - def bc_count_module(self): - """Gets the bc_count_module of this PArrayField. # noqa: E501 - - - :return: The bc_count_module of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_count_module - - @bc_count_module.setter - def bc_count_module(self, bc_count_module): - """Sets the bc_count_module of this PArrayField. - - - :param bc_count_module: The bc_count_module of this PArrayField. # noqa: E501 - :type bc_count_module: int - """ - - self._bc_count_module = bc_count_module - - @property - def bc_data_module(self): - """Gets the bc_data_module of this PArrayField. # noqa: E501 - - - :return: The bc_data_module of this PArrayField. # noqa: E501 - :rtype: list[DataModule] - """ - return self._bc_data_module - - @bc_data_module.setter - def bc_data_module(self, bc_data_module): - """Sets the bc_data_module of this PArrayField. - - - :param bc_data_module: The bc_data_module of this PArrayField. # noqa: E501 - :type bc_data_module: list[DataModule] - """ - - self._bc_data_module = bc_data_module - - @property - def bc_pdf417_info(self): - """Gets the bc_pdf417_info of this PArrayField. # noqa: E501 - - - :return: The bc_pdf417_info of this PArrayField. # noqa: E501 - :rtype: BcPDF417INFO - """ - return self._bc_pdf417_info - - @bc_pdf417_info.setter - def bc_pdf417_info(self, bc_pdf417_info): - """Sets the bc_pdf417_info of this PArrayField. - - - :param bc_pdf417_info: The bc_pdf417_info of this PArrayField. # noqa: E501 - :type bc_pdf417_info: BcPDF417INFO - """ - - self._bc_pdf417_info = bc_pdf417_info - - @property - def bc_roi_detect(self): - """Gets the bc_roi_detect of this PArrayField. # noqa: E501 - - - :return: The bc_roi_detect of this PArrayField. # noqa: E501 - :rtype: BcROIDETECT - """ - return self._bc_roi_detect - - @bc_roi_detect.setter - def bc_roi_detect(self, bc_roi_detect): - """Sets the bc_roi_detect of this PArrayField. - - - :param bc_roi_detect: The bc_roi_detect of this PArrayField. # noqa: E501 - :type bc_roi_detect: BcROIDETECT - """ - - self._bc_roi_detect = bc_roi_detect - - @property - def bc_text_decoder_types(self): - """Gets the bc_text_decoder_types of this PArrayField. # noqa: E501 - - - :return: The bc_text_decoder_types of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_text_decoder_types - - @bc_text_decoder_types.setter - def bc_text_decoder_types(self, bc_text_decoder_types): - """Sets the bc_text_decoder_types of this PArrayField. - - - :param bc_text_decoder_types: The bc_text_decoder_types of this PArrayField. # noqa: E501 - :type bc_text_decoder_types: int - """ - - self._bc_text_decoder_types = bc_text_decoder_types - - @property - def bc_text_field_type(self): - """Gets the bc_text_field_type of this PArrayField. # noqa: E501 - - - :return: The bc_text_field_type of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_text_field_type - - @bc_text_field_type.setter - def bc_text_field_type(self, bc_text_field_type): - """Sets the bc_text_field_type of this PArrayField. - - - :param bc_text_field_type: The bc_text_field_type of this PArrayField. # noqa: E501 - :type bc_text_field_type: int - """ - - self._bc_text_field_type = bc_text_field_type - - @property - def bc_type_decode(self): - """Gets the bc_type_decode of this PArrayField. # noqa: E501 - - - :return: The bc_type_decode of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_type_decode - - @bc_type_decode.setter - def bc_type_decode(self, bc_type_decode): - """Sets the bc_type_decode of this PArrayField. - - - :param bc_type_decode: The bc_type_decode of this PArrayField. # noqa: E501 - :type bc_type_decode: int - """ - - self._bc_type_decode = bc_type_decode - - @property - def bc_type_detect(self): - """Gets the bc_type_detect of this PArrayField. # noqa: E501 - - - :return: The bc_type_detect of this PArrayField. # noqa: E501 - :rtype: int - """ - return self._bc_type_detect - - @bc_type_detect.setter - def bc_type_detect(self, bc_type_detect): - """Sets the bc_type_detect of this PArrayField. - - - :param bc_type_detect: The bc_type_detect of this PArrayField. # noqa: E501 - :type bc_type_detect: int - """ - - self._bc_type_detect = bc_type_detect - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PArrayField): - return False - - return self.to_dict() == other.to_dict() + PArrayField + """ # noqa: E501 + bc_angle_detect: Union[StrictFloat, StrictInt] = Field(alias="bcAngle_DETECT") + bc_code_result: StrictInt = Field(alias="bcCodeResult") + bc_count_module: StrictInt = Field(alias="bcCountModule") + bc_data_module: List[DataModule] = Field(alias="bcDataModule") + bc_pdf417_info: Optional[BcPDF417INFO] = Field(default=None, alias="bcPDF417INFO") + bc_roi_detect: BcROIDETECT = Field(alias="bcROI_DETECT") + bc_text_decoder_types: Optional[StrictInt] = Field(default=None, alias="bcTextDecoderTypes") + bc_text_field_type: Optional[StrictInt] = Field(default=None, alias="bcTextFieldType") + bc_type_decode: BarcodeType = Field(alias="bcType_DECODE") + bc_type_detect: StrictInt = Field(alias="bcType_DETECT") + __properties: ClassVar[List[str]] = ["bcAngle_DETECT", "bcCodeResult", "bcCountModule", "bcDataModule", "bcPDF417INFO", "bcROI_DETECT", "bcTextDecoderTypes", "bcTextFieldType", "bcType_DECODE", "bcType_DETECT"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PArrayField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in bc_data_module (list) + _items = [] + if self.bc_data_module: + for _item_bc_data_module in self.bc_data_module: + if _item_bc_data_module: + _items.append(_item_bc_data_module.to_dict()) + _dict['bcDataModule'] = _items + # override the default output from pydantic by calling `to_dict()` of bc_pdf417_info + if self.bc_pdf417_info: + _dict['bcPDF417INFO'] = self.bc_pdf417_info.to_dict() + # override the default output from pydantic by calling `to_dict()` of bc_roi_detect + if self.bc_roi_detect: + _dict['bcROI_DETECT'] = self.bc_roi_detect.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PArrayField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "bcAngle_DETECT": obj.get("bcAngle_DETECT"), + "bcCodeResult": obj.get("bcCodeResult"), + "bcCountModule": obj.get("bcCountModule"), + "bcDataModule": [DataModule.from_dict(_item) for _item in obj["bcDataModule"]] if obj.get("bcDataModule") is not None else None, + "bcPDF417INFO": BcPDF417INFO.from_dict(obj["bcPDF417INFO"]) if obj.get("bcPDF417INFO") is not None else None, + "bcROI_DETECT": BcROIDETECT.from_dict(obj["bcROI_DETECT"]) if obj.get("bcROI_DETECT") is not None else None, + "bcTextDecoderTypes": obj.get("bcTextDecoderTypes"), + "bcTextFieldType": obj.get("bcTextFieldType"), + "bcType_DECODE": obj.get("bcType_DECODE"), + "bcType_DETECT": obj.get("bcType_DETECT") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PArrayField): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/parsed_data.py b/regula/documentreader/webclient/gen/models/parsed_data.py new file mode 100644 index 0000000..351eca8 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/parsed_data.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class ParsedData(BaseModel): + """ + ParsedData + """ # noqa: E501 + parsing_notifications: Optional[List[StrictInt]] = Field(default=None, alias="ParsingNotifications") + __properties: ClassVar[List[str]] = ["ParsingNotifications"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ParsedData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ParsedData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ParsingNotifications": obj.get("ParsingNotifications") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/parsing_notification_codes.py b/regula/documentreader/webclient/gen/models/parsing_notification_codes.py index 9b66ae5..907a46b 100644 --- a/regula/documentreader/webclient/gen/models/parsing_notification_codes.py +++ b/regula/documentreader/webclient/gen/models/parsing_notification_codes.py @@ -4,534 +4,246 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -The enumeration contains possible values of notification codes returned during the RFID chip processing. -""" -class ParsingNotificationCodes(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ParsingNotificationCodes(int, Enum): + """ + The enumeration contains possible values of notification codes returned during the RFID chip processing. """ - - ntfLDS_ASN_Certificate_IncorrectVersion = int("-1879048191") - - ntfLDS_ASN_Certificate_NonMatchingSignatureAlgorithm = int("-1879048190") - - ntfLDS_ASN_Certificate_IncorrectTimeCoding = int("-1879048189") - - ntfLDS_ASN_Certificate_IncorrectUseOfGeneralizedTime = int("-1879048188") - - ntfLDS_ASN_Certificate_EmptyIssuer = int("-1879048187") - - ntfLDS_ASN_Certificate_EmptySubject = int("-1879048186") - - ntfLDS_ASN_Certificate_UnsupportedCriticalExtension = int("-1879048184") - - ntfLDS_ASN_Certificate_ForcedDefaultCSCARole = int("-1879048178") - - ntfLDS_ASN_Certificate_ForcedDefaultDSRole = int("-1879048177") - - ntfLDS_ASN_Certificate_IncorrectIssuerSubjectDS = int("-1879048176") - - ntfLDS_ASN_Certificate_DuplicatingExtensions = int("-1879048169") - - ntfLDS_ICAO_Certificate_Version_Missed = int("-1879047680") - - ntfLDS_ICAO_Certificate_Version_Incorrect = int("-1879047679") - - ntfLDS_ICAO_Certificate_Issuer_Country_Missed = int("-1879047678") - - ntfLDS_ICAO_Certificate_Issuer_CommonName_Missed = int("-1879047677") - - ntfLDS_ICAO_Certificate_Issuer_CountryNonCompliant = int("-1879047676") - - ntfLDS_ICAO_Certificate_Subject_Country_Missed = int("-1879047675") - - ntfLDS_ICAO_Certificate_Subject_CommonName_Missed = int("-1879047674") - - ntfLDS_ICAO_Certificate_Subject_CountryNonCompliant = int("-1879047673") - - ntfLDS_ICAO_Certificate_UsingNonCompliantData = int("-1879047672") - - ntfLDS_ICAO_Certificate_UnsupportedSignatureAlgorithm = int("-1879047671") - - ntfLDS_ICAO_Certificate_UnsupportedPublicKeyAlgorithm = int("-1879047670") - - ntfLDS_ICAO_Certificate_MissedExtensions = int("-1879047669") - - ntfLDS_ICAO_Certificate_Validity = int("-1879047668") - - ntfLDS_ICAO_Certificate_Ext_UsingNonCompliantData = int("-1879047667") - - ntfLDS_ICAO_Certificate_Ext_KeyUsage_Missed = int("-1879047666") - - ntfLDS_ICAO_Certificate_Ext_KeyUsage_NotCritical = int("-1879047665") - - ntfLDS_ICAO_Certificate_Ext_KeyUsage_IncorrectData = int("-1879047664") - - ntfLDS_ICAO_Certificate_Ext_BasicC_Missed = int("-1879047663") - - ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage1 = int("-1879047662") - - ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage2 = int("-1879047661") - - ntfLDS_ICAO_Certificate_Ext_BasicC_NotCritical = int("-1879047660") - - ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectData = int("-1879047659") - - ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Missed = int("-1879047658") - - ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Incorrect = int("-1879047657") - - ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_NotCritical = int("-1879047656") - - ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectUsage = int("-1879047655") - - ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectData = int("-1879047654") - - ntfLDS_ICAO_Certificate_Ext_AuthKeyID_Missed = int("-1879047653") - - ntfLDS_ICAO_Certificate_Ext_AuthKeyID_IncorrectData = int("-1879047652") - - ntfLDS_ICAO_Certificate_Ext_AuthKeyID_KeyID_Missed = int("-1879047651") - - ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_Missed = int("-1879047650") - - ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_IncorrectData = int("-1879047649") - - ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Missed = int("-1879047648") - - ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_IncorrectData = int("-1879047647") - - ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Empty = int("-1879047646") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Missed = int("-1879047645") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_IncorrectData = int("-1879047644") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Empty = int("-1879047643") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_NonCompliant = int("-1879047642") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Critical = int("-1879047640") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Empty = int("-1879047639") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Incorrect = int("-1879047638") - - ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_NonCompliant = int("-1879047637") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Missed = int("-1879047636") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_IncorrectData = int("-1879047635") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Empty = int("-1879047634") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_NonCompliant = int("-1879047633") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Critical = int("-1879047631") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Empty = int("-1879047630") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Incorrect = int("-1879047629") - - ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_NonCompliant = int("-1879047628") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_Missed = int("-1879047627") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_IncorrectData = int("-1879047626") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_Version = int("-1879047625") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes = int("-1879047624") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes_Empty = int("-1879047623") - - ntfLDS_ICAO_Certificate_Ext_CertPolicies_IncorrectData = int("-1879047622") - - ntfLDS_ICAO_Certificate_Ext_CertPolicies_Empty = int("-1879047621") - - ntfLDS_ICAO_Certificate_Ext_CertPolicies_PolicyID_Missed = int("-1879047620") - - ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Missed = int("-1879047619") - - ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_IncorrectData = int("-1879047618") - - ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Empty = int("-1879047617") - - ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_PointMissed = int("-1879047616") - - ntfLDS_ICAO_Certificate_SN_NonCompliant = int("-1879047615") - - ntfLDS_ICAO_Certificate_Issuer_SN_NonCompliant = int("-1879047614") - - ntfLDS_ICAO_Certificate_Subject_SN_NonCompliant = int("-1879047613") - - ntfLDS_ICAO_Certificate_Issuer_AttributeNonCompliant = int("-1879047612") - - ntfLDS_ICAO_Certificate_Subject_AttributeNonCompliant = int("-1879047611") - - ntfLDS_ICAO_Certificate_IssuerSubject_Country_NonMatching = int("-1879047610") - - ntfLDS_ICAO_Certificate_Ext_CSCA_AltNames_NonMatching = int("-1879047609") - - ntfLDS_ICAO_Certificate_Ext_NameChange_IncorrectData = int("-1879047608") - - ntfLDS_ICAO_Certificate_Ext_NameChange_NonCompliant = int("-1879047607") - - ntfLDS_ICAO_Certificate_Ext_NameChange_Critical = int("-1879047606") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_NonCompliant = int("-1879047605") - - ntfLDS_ICAO_Certificate_Ext_DocTypeList_Critical = int("-1879047604") - - ntfLDS_ICAO_Certificate_Ext_Optional_Critical = int("-1879047603") - - ntfLDS_ICAO_Certificate_Subject_NonCompliant = int("-1879047602") - - ntfLDS_ICAO_Certificate_Subject_CommonNameNonCompliant = int("-1879047601") - - ntfLDS_ICAO_COM_LDS_Version_Incorrect = int("-1879048160") - - ntfLDS_ICAO_COM_LDS_Version_Missing = int("-1879048159") - - ntfLDS_ICAO_COM_Unicode_Version_Incorrect = int("-1879048158") - - ntfLDS_ICAO_COM_Unicode_Version_Missing = int("-1879048157") - - ntfLDS_ICAO_COM_DGPM_Incorrect = int("-1879048156") - - ntfLDS_ICAO_COM_DGPM_Missing = int("-1879048155") - - ntfLDS_ICAO_COM_DGPM_Unexpected = int("-1879048154") - - ntfLDS_ICAO_Application_LDSVersion_Unsupported = int("-1879048144") - - ntfLDS_ICAO_Application_UnicodeVersion_Unsupported = int("-1879048143") - - ntfLDS_ICAO_Application_LDSVersion_Inconsistent = int("-1879048142") - - ntfLDS_ICAO_Application_UnicodeVersion_Inconsistent = int("-1879048141") - - ntfLDS_ASN_SignedData_OID_Incorrect = int("-1879047936") - - ntfLDS_ASN_SignedData_Version_Incorrect = int("-1879047776") - - ntfLDS_ASN_SignedData_ContentOID_Incorrect = int("-1879047775") - - ntfLDS_ICAO_SignedData_Version_Incorrect = int("-1879047935") - - ntfLDS_ICAO_SignedData_DigestAlgorithms_Empty = int("-1879047934") - - ntfLDS_ICAO_SignedData_DigestAlgorithms_Unsupported = int("-1879047933") - - ntfLDS_ICAO_SignedData_SignerInfos_MultipleEntries = int("-1879047927") - - ntfLDS_ICAO_SignedData_Certificates_Missed = int("-1879047760") - - ntfLDS_ICAO_SignedData_Certificates_Empty = int("-1879047759") - - ntfLDS_ICAO_SignedData_CRLs_IncorrectUsage = int("-1879047758") - - ntfLDS_ICAO_LDSObject_IncorrectContentOID = int("-1879047932") - - ntfLDS_ICAO_LDSObject_DGNumber_Incorrect = int("-1879047931") - - ntfLDS_ICAO_LDSObject_DGHash_Missing = int("-1879047930") - - ntfLDS_ICAO_LDSObject_DGHash_Extra = int("-1879047929") - - ntfLDS_ICAO_LDSObject_Version_Incorrect = int("-1879047928") - - ntfLDS_ICAO_MasterList_Version_Incorrect = int("-1879047744") - - ntfLDS_ICAO_DeviationList_Version_Incorrect = int("-1879047736") - - ntfLDS_BSI_DefectList_Version_Incorrect = int("-1879047728") - - ntfLDS_BSI_BlackList_Version_Incorrect = int("-1879047720") - - ntfLDS_ASN_SignerInfo_Version_Incorrect = int("-1879047926") - - ntfLDS_ASN_SignerInfo_SID_IncorrectChoice = int("-1879047925") - - ntfLDS_ASN_SignerInfo_SID_DigestAlgorithmNotListed = int("-1879047924") - - ntfLDS_ASN_SignerInfo_MessageDigestAttr_Missing = int("-1879047923") - - ntfLDS_ASN_SignerInfo_MessageDigestAttr_Data = int("-1879047922") - - ntfLDS_ASN_SignerInfo_MessageDigestAttr_Value = int("-1879047921") - - ntfLDS_ASN_SignerInfo_ContentTypeAttr_Missing = int("-1879047920") - - ntfLDS_ASN_SignerInfo_ContentTypeAttr_Data = int("-1879047919") - - ntfLDS_ASN_SignerInfo_ContentTypeAttr_Value = int("-1879047918") - - ntfLDS_ASN_SignerInfo_SigningTimeAttr_Missing = int("-1879047909") - - ntfLDS_ASN_SignerInfo_SigningTimeAttr_Data = int("-1879047908") - - ntfLDS_ASN_SignerInfo_SigningTimeAttr_Value = int("-1879047907") - - ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Missing = int("-1879047906") - - ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Data = int("-1879047905") - - ntfLDS_Auth_SignerInfo_Certificate_Validity = int("-1879047915") - - ntfLDS_Auth_SignerInfo_Certificate_RootIsNotTrusted = int("-1879047914") - - ntfLDS_Auth_SignerInfo_Certificate_CantFindCSCA = int("-1879047913") - - ntfLDS_Auth_SignerInfo_Certificate_Revoked = int("-1879047912") - - ntfLDS_Auth_SignerInfo_Certificate_SignatureInvalid = int("-1879047911") - - ntfLDS_UnsupportedImageFormat = int("-1879047910") - - ntfLDS_MRZ_DocumentType_Unknown = int("139272") - - ntfLDS_MRZ_IssuingState_SyntaxError = int("139273") - - ntfLDS_MRZ_Name_IsVoid = int("139274") - - ntfLDS_MRZ_Number_IncorrectChecksum = int("139277") - - ntfLDS_MRZ_Nationality_SyntaxError = int("139278") - - ntfLDS_MRZ_DOB_SyntaxError = int("139279") - - ntfLDS_MRZ_DOB_Error = int("139280") - - ntfLDS_MRZ_DOB_IncorrectChecksum = int("139281") - - ntfLDS_MRZ_Sex_Incorrect = int("139282") - - ntfLDS_MRZ_DOE_SyntaxError = int("139283") - - ntfLDS_MRZ_DOE_Error = int("139284") - - ntfLDS_MRZ_DOE_IncorrectChecksum = int("139285") - - ntfLDS_MRZ_OptionalData_IncorrectChecksum = int("139286") - - ntfLDS_MRZ_IncorrectChecksum = int("139287") - - ntfLDS_MRZ_Incorrect = int("139288") - - ntfLDS_Biometrics_FormatOwner_Missing = int("-1878982656") - - ntfLDS_Biometrics_FormatOwner_Incorrect = int("-1878917120") - - ntfLDS_Biometrics_FormatType_Missing = int("-1878851584") - - ntfLDS_Biometrics_FormatType_Incorrect = int("-1878786048") - - ntfLDS_Biometrics_Type_Incorrect = int("-1878720512") - - ntfLDS_Biometrics_SubType_Missing = int("-1878654976") - - ntfLDS_Biometrics_SubType_Incorrect = int("-1878589440") - - ntfLDS_Biometrics_BDB_Image_Missing = int("-1878523904") - - ntfLDS_Biometrics_BDB_FormatID_Incorrect = int("-1878458368") - - ntfLDS_Biometrics_BDB_Version_Incorrect = int("-1878392832") - - ntfLDS_Biometrics_BDB_DataLength_Incorrect = int("-1878327296") - - ntfLDS_Biometrics_BDB_Data_Gender = int("-1877999616") - - ntfLDS_Biometrics_BDB_Data_EyeColor = int("-1877934080") - - ntfLDS_Biometrics_BDB_Data_HairColor = int("-1877868544") - - ntfLDS_Biometrics_BDB_Data_PoseAngle_Yaw = int("-1877803008") - - ntfLDS_Biometrics_BDB_Data_PoseAngle_Pitch = int("-1877737472") - - ntfLDS_Biometrics_BDB_Data_PoseAngle_Roll = int("-1877671936") - - ntfLDS_Biometrics_BDB_Data_PoseAngleU_Yaw = int("-1877606400") - - ntfLDS_Biometrics_BDB_Data_PoseAngleU_Pitch = int("-1877540864") - - ntfLDS_Biometrics_BDB_Data_PoseAngleU_Roll = int("-1877475328") - - ntfLDS_Biometrics_BDB_Data_FaceImageType = int("-1877409792") - - ntfLDS_Biometrics_BDB_Data_ImageDataType = int("-1877344256") - - ntfLDS_SI_PACE_Info_UnsupportedStdParameters = int("-1862270976") - - ntfLDS_SI_PACE_Info_DeprecatedVersion = int("-1862270975") - - ntfLDS_SI_PACE_DomainParams_UsingStdRef = int("-1862270974") - - ntfLDS_SI_PACE_DomainParams_UnsupportedAlgorithm = int("-1862270973") - - ntfLDS_SI_CA_Info_IncorrectVersion = int("-1862270972") - - ntfLDS_SI_CA_PublicKey_UnsupportedAlgorithm = int("-1862270971") - - ntfLDS_SI_CA_DomainParams_UnsupportedAlgorithm = int("-1862270970") - - ntfLDS_SI_TA_Info_IncorrectVersion = int("-1862270969") - - ntfLDS_SI_TA_Info_FileIDForVersion2 = int("-1862270968") - - ntfLDS_SI_eIDSecurity_UnsupportedDigestAlgorithm = int("-1862270967") - - ntfLDS_SI_RI_Info_IncorrectVersion = int("-1862270966") - - ntfLDS_SI_RI_DomainParams_UnsupportedAlgorithm = int("-1862270965") - - ntfLDS_SI_AA_Info_IncorrectVersion = int("-1862270964") - - ntfLDS_SI_AA_Info_UnsupportedAlgorithm = int("-1862270963") - - ntfLDS_SI_AA_Info_InconsistentAlgorithmReference = int("-1862270962") - - ntfLDS_SI_Storage_PACE_Info_NotAvailable = int("-1862270720") - - ntfLDS_SI_Storage_PACE_Info_NoStdParameters = int("-1862270719") - - ntfLDS_SI_Storage_PACE_Info_NoMatchingDomainParams = int("-1862270718") - - ntfLDS_SI_Storage_CA_Info_NotAvailable = int("-1862270717") - - ntfLDS_SI_Storage_CA_DomainParams_NoRequiredOption = int("-1862270716") - - ntfLDS_SI_Storage_CA_DomainParams_NotAvailable = int("-1862270715") - - ntfLDS_SI_Storage_CA_AnonymousInfos = int("-1862270714") - - ntfLDS_SI_Storage_CA_Info_NoMatchingDomainParams = int("-1862270713") - - ntfLDS_SI_Storage_CA_Info_NoMatchingPublicKey = int("-1862270712") - - ntfLDS_SI_Storage_CA_IncorrectInfosQuantity = int("-1862270711") - - ntfLDS_SI_Storage_TA_Info_NotAvailable = int("-1862270710") - - ntfLDS_SI_Storage_CardInfoLocator_MultipleEntries = int("-1862270709") - - ntfLDS_SI_Storage_eIDSecurityInfo_MultipleEntries = int("-1862270708") - - ntfLDS_SI_Storage_PrivilegedTI_MultipleEntries = int("-1862270707") - - ntfLDS_SI_Storage_PrivilegedTI_IncorrectUsage = int("-1862270706") - - ntfLDS_SI_Storage_RI_DomainParams_MultipleEntries = int("-1862270705") - - ntfLDS_SI_Storage_PACEInfos_NonConsistant = int("-1862270704") - - ntfLDS_CVCertificate_Profile_IncorrectVersion = int("-1862270463") - - ntfLDS_CVCertificate_Validity = int("-1862270462") - - ntfLDS_CVCertificate_NonCVCADomainParameters = int("-1862270461") - - ntfLDS_CV_Certificate_PrivateKey_IncorrectVersion = int("-1862270460") - - ntfLDS_TA_PACEStaticBindingUsed = int("-1862270208") - - ntfLDS_Auth_MLSignerInfo_Certificate_Validity = int("-1845493483") - - ntfLDS_Auth_MLSignerInfo_Certificate_RootIsNotTrusted = int("-1845493482") - - ntfLDS_Auth_MLSignerInfo_Certificate_CantFindCSCA = int("-1845493481") - - ntfLDS_Auth_MLSignerInfo_Certificate_Revoked = int("-1845493480") - - ntfLDS_Auth_MLSignerInfo_Certificate_SignatureInvalid = int("-1845493479") - - ntfLDS_ICAO_Certificate_Chain_Country_NonMatching = int("-1879047600") - - ntfLDS_ICAO_Certificate_VisualMrz_Country_NonMatching = int("-1879047599") - - ntfLDS_MRZ_CountryCode_VisualMrz_NonMatching = int("139289") - - ntfLDS_ICAO_Certificate_MRZ_Country_NonMatching = int("-1879047598") - - allowable_values = [ntfLDS_ASN_Certificate_IncorrectVersion, ntfLDS_ASN_Certificate_NonMatchingSignatureAlgorithm, ntfLDS_ASN_Certificate_IncorrectTimeCoding, ntfLDS_ASN_Certificate_IncorrectUseOfGeneralizedTime, ntfLDS_ASN_Certificate_EmptyIssuer, ntfLDS_ASN_Certificate_EmptySubject, ntfLDS_ASN_Certificate_UnsupportedCriticalExtension, ntfLDS_ASN_Certificate_ForcedDefaultCSCARole, ntfLDS_ASN_Certificate_ForcedDefaultDSRole, ntfLDS_ASN_Certificate_IncorrectIssuerSubjectDS, ntfLDS_ASN_Certificate_DuplicatingExtensions, ntfLDS_ICAO_Certificate_Version_Missed, ntfLDS_ICAO_Certificate_Version_Incorrect, ntfLDS_ICAO_Certificate_Issuer_Country_Missed, ntfLDS_ICAO_Certificate_Issuer_CommonName_Missed, ntfLDS_ICAO_Certificate_Issuer_CountryNonCompliant, ntfLDS_ICAO_Certificate_Subject_Country_Missed, ntfLDS_ICAO_Certificate_Subject_CommonName_Missed, ntfLDS_ICAO_Certificate_Subject_CountryNonCompliant, ntfLDS_ICAO_Certificate_UsingNonCompliantData, ntfLDS_ICAO_Certificate_UnsupportedSignatureAlgorithm, ntfLDS_ICAO_Certificate_UnsupportedPublicKeyAlgorithm, ntfLDS_ICAO_Certificate_MissedExtensions, ntfLDS_ICAO_Certificate_Validity, ntfLDS_ICAO_Certificate_Ext_UsingNonCompliantData, ntfLDS_ICAO_Certificate_Ext_KeyUsage_Missed, ntfLDS_ICAO_Certificate_Ext_KeyUsage_NotCritical, ntfLDS_ICAO_Certificate_Ext_KeyUsage_IncorrectData, ntfLDS_ICAO_Certificate_Ext_BasicC_Missed, ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage1, ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage2, ntfLDS_ICAO_Certificate_Ext_BasicC_NotCritical, ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectData, ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Missed, ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Incorrect, ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_NotCritical, ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectUsage, ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectData, ntfLDS_ICAO_Certificate_Ext_AuthKeyID_Missed, ntfLDS_ICAO_Certificate_Ext_AuthKeyID_IncorrectData, ntfLDS_ICAO_Certificate_Ext_AuthKeyID_KeyID_Missed, ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_Missed, ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_IncorrectData, ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Missed, ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_IncorrectData, ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Empty, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Missed, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_IncorrectData, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Empty, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_NonCompliant, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Critical, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Empty, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Incorrect, ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_NonCompliant, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Missed, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_IncorrectData, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Empty, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_NonCompliant, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Critical, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Empty, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Incorrect, ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_NonCompliant, ntfLDS_ICAO_Certificate_Ext_DocTypeList_Missed, ntfLDS_ICAO_Certificate_Ext_DocTypeList_IncorrectData, ntfLDS_ICAO_Certificate_Ext_DocTypeList_Version, ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes, ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes_Empty, ntfLDS_ICAO_Certificate_Ext_CertPolicies_IncorrectData, ntfLDS_ICAO_Certificate_Ext_CertPolicies_Empty, ntfLDS_ICAO_Certificate_Ext_CertPolicies_PolicyID_Missed, ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Missed, ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_IncorrectData, ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Empty, ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_PointMissed, ntfLDS_ICAO_Certificate_SN_NonCompliant, ntfLDS_ICAO_Certificate_Issuer_SN_NonCompliant, ntfLDS_ICAO_Certificate_Subject_SN_NonCompliant, ntfLDS_ICAO_Certificate_Issuer_AttributeNonCompliant, ntfLDS_ICAO_Certificate_Subject_AttributeNonCompliant, ntfLDS_ICAO_Certificate_IssuerSubject_Country_NonMatching, ntfLDS_ICAO_Certificate_Ext_CSCA_AltNames_NonMatching, ntfLDS_ICAO_Certificate_Ext_NameChange_IncorrectData, ntfLDS_ICAO_Certificate_Ext_NameChange_NonCompliant, ntfLDS_ICAO_Certificate_Ext_NameChange_Critical, ntfLDS_ICAO_Certificate_Ext_DocTypeList_NonCompliant, ntfLDS_ICAO_Certificate_Ext_DocTypeList_Critical, ntfLDS_ICAO_Certificate_Ext_Optional_Critical, ntfLDS_ICAO_Certificate_Subject_NonCompliant, ntfLDS_ICAO_Certificate_Subject_CommonNameNonCompliant, ntfLDS_ICAO_COM_LDS_Version_Incorrect, ntfLDS_ICAO_COM_LDS_Version_Missing, ntfLDS_ICAO_COM_Unicode_Version_Incorrect, ntfLDS_ICAO_COM_Unicode_Version_Missing, ntfLDS_ICAO_COM_DGPM_Incorrect, ntfLDS_ICAO_COM_DGPM_Missing, ntfLDS_ICAO_COM_DGPM_Unexpected, ntfLDS_ICAO_Application_LDSVersion_Unsupported, ntfLDS_ICAO_Application_UnicodeVersion_Unsupported, ntfLDS_ICAO_Application_LDSVersion_Inconsistent, ntfLDS_ICAO_Application_UnicodeVersion_Inconsistent, ntfLDS_ASN_SignedData_OID_Incorrect, ntfLDS_ASN_SignedData_Version_Incorrect, ntfLDS_ASN_SignedData_ContentOID_Incorrect, ntfLDS_ICAO_SignedData_Version_Incorrect, ntfLDS_ICAO_SignedData_DigestAlgorithms_Empty, ntfLDS_ICAO_SignedData_DigestAlgorithms_Unsupported, ntfLDS_ICAO_SignedData_SignerInfos_MultipleEntries, ntfLDS_ICAO_SignedData_Certificates_Missed, ntfLDS_ICAO_SignedData_Certificates_Empty, ntfLDS_ICAO_SignedData_CRLs_IncorrectUsage, ntfLDS_ICAO_LDSObject_IncorrectContentOID, ntfLDS_ICAO_LDSObject_DGNumber_Incorrect, ntfLDS_ICAO_LDSObject_DGHash_Missing, ntfLDS_ICAO_LDSObject_DGHash_Extra, ntfLDS_ICAO_LDSObject_Version_Incorrect, ntfLDS_ICAO_MasterList_Version_Incorrect, ntfLDS_ICAO_DeviationList_Version_Incorrect, ntfLDS_BSI_DefectList_Version_Incorrect, ntfLDS_BSI_BlackList_Version_Incorrect, ntfLDS_ASN_SignerInfo_Version_Incorrect, ntfLDS_ASN_SignerInfo_SID_IncorrectChoice, ntfLDS_ASN_SignerInfo_SID_DigestAlgorithmNotListed, ntfLDS_ASN_SignerInfo_MessageDigestAttr_Missing, ntfLDS_ASN_SignerInfo_MessageDigestAttr_Data, ntfLDS_ASN_SignerInfo_MessageDigestAttr_Value, ntfLDS_ASN_SignerInfo_ContentTypeAttr_Missing, ntfLDS_ASN_SignerInfo_ContentTypeAttr_Data, ntfLDS_ASN_SignerInfo_ContentTypeAttr_Value, ntfLDS_ASN_SignerInfo_SigningTimeAttr_Missing, ntfLDS_ASN_SignerInfo_SigningTimeAttr_Data, ntfLDS_ASN_SignerInfo_SigningTimeAttr_Value, ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Missing, ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Data, ntfLDS_Auth_SignerInfo_Certificate_Validity, ntfLDS_Auth_SignerInfo_Certificate_RootIsNotTrusted, ntfLDS_Auth_SignerInfo_Certificate_CantFindCSCA, ntfLDS_Auth_SignerInfo_Certificate_Revoked, ntfLDS_Auth_SignerInfo_Certificate_SignatureInvalid, ntfLDS_UnsupportedImageFormat, ntfLDS_MRZ_DocumentType_Unknown, ntfLDS_MRZ_IssuingState_SyntaxError, ntfLDS_MRZ_Name_IsVoid, ntfLDS_MRZ_Number_IncorrectChecksum, ntfLDS_MRZ_Nationality_SyntaxError, ntfLDS_MRZ_DOB_SyntaxError, ntfLDS_MRZ_DOB_Error, ntfLDS_MRZ_DOB_IncorrectChecksum, ntfLDS_MRZ_Sex_Incorrect, ntfLDS_MRZ_DOE_SyntaxError, ntfLDS_MRZ_DOE_Error, ntfLDS_MRZ_DOE_IncorrectChecksum, ntfLDS_MRZ_OptionalData_IncorrectChecksum, ntfLDS_MRZ_IncorrectChecksum, ntfLDS_MRZ_Incorrect, ntfLDS_Biometrics_FormatOwner_Missing, ntfLDS_Biometrics_FormatOwner_Incorrect, ntfLDS_Biometrics_FormatType_Missing, ntfLDS_Biometrics_FormatType_Incorrect, ntfLDS_Biometrics_Type_Incorrect, ntfLDS_Biometrics_SubType_Missing, ntfLDS_Biometrics_SubType_Incorrect, ntfLDS_Biometrics_BDB_Image_Missing, ntfLDS_Biometrics_BDB_FormatID_Incorrect, ntfLDS_Biometrics_BDB_Version_Incorrect, ntfLDS_Biometrics_BDB_DataLength_Incorrect, ntfLDS_Biometrics_BDB_Data_Gender, ntfLDS_Biometrics_BDB_Data_EyeColor, ntfLDS_Biometrics_BDB_Data_HairColor, ntfLDS_Biometrics_BDB_Data_PoseAngle_Yaw, ntfLDS_Biometrics_BDB_Data_PoseAngle_Pitch, ntfLDS_Biometrics_BDB_Data_PoseAngle_Roll, ntfLDS_Biometrics_BDB_Data_PoseAngleU_Yaw, ntfLDS_Biometrics_BDB_Data_PoseAngleU_Pitch, ntfLDS_Biometrics_BDB_Data_PoseAngleU_Roll, ntfLDS_Biometrics_BDB_Data_FaceImageType, ntfLDS_Biometrics_BDB_Data_ImageDataType, ntfLDS_SI_PACE_Info_UnsupportedStdParameters, ntfLDS_SI_PACE_Info_DeprecatedVersion, ntfLDS_SI_PACE_DomainParams_UsingStdRef, ntfLDS_SI_PACE_DomainParams_UnsupportedAlgorithm, ntfLDS_SI_CA_Info_IncorrectVersion, ntfLDS_SI_CA_PublicKey_UnsupportedAlgorithm, ntfLDS_SI_CA_DomainParams_UnsupportedAlgorithm, ntfLDS_SI_TA_Info_IncorrectVersion, ntfLDS_SI_TA_Info_FileIDForVersion2, ntfLDS_SI_eIDSecurity_UnsupportedDigestAlgorithm, ntfLDS_SI_RI_Info_IncorrectVersion, ntfLDS_SI_RI_DomainParams_UnsupportedAlgorithm, ntfLDS_SI_AA_Info_IncorrectVersion, ntfLDS_SI_AA_Info_UnsupportedAlgorithm, ntfLDS_SI_AA_Info_InconsistentAlgorithmReference, ntfLDS_SI_Storage_PACE_Info_NotAvailable, ntfLDS_SI_Storage_PACE_Info_NoStdParameters, ntfLDS_SI_Storage_PACE_Info_NoMatchingDomainParams, ntfLDS_SI_Storage_CA_Info_NotAvailable, ntfLDS_SI_Storage_CA_DomainParams_NoRequiredOption, ntfLDS_SI_Storage_CA_DomainParams_NotAvailable, ntfLDS_SI_Storage_CA_AnonymousInfos, ntfLDS_SI_Storage_CA_Info_NoMatchingDomainParams, ntfLDS_SI_Storage_CA_Info_NoMatchingPublicKey, ntfLDS_SI_Storage_CA_IncorrectInfosQuantity, ntfLDS_SI_Storage_TA_Info_NotAvailable, ntfLDS_SI_Storage_CardInfoLocator_MultipleEntries, ntfLDS_SI_Storage_eIDSecurityInfo_MultipleEntries, ntfLDS_SI_Storage_PrivilegedTI_MultipleEntries, ntfLDS_SI_Storage_PrivilegedTI_IncorrectUsage, ntfLDS_SI_Storage_RI_DomainParams_MultipleEntries, ntfLDS_SI_Storage_PACEInfos_NonConsistant, ntfLDS_CVCertificate_Profile_IncorrectVersion, ntfLDS_CVCertificate_Validity, ntfLDS_CVCertificate_NonCVCADomainParameters, ntfLDS_CV_Certificate_PrivateKey_IncorrectVersion, ntfLDS_TA_PACEStaticBindingUsed, ntfLDS_Auth_MLSignerInfo_Certificate_Validity, ntfLDS_Auth_MLSignerInfo_Certificate_RootIsNotTrusted, ntfLDS_Auth_MLSignerInfo_Certificate_CantFindCSCA, ntfLDS_Auth_MLSignerInfo_Certificate_Revoked, ntfLDS_Auth_MLSignerInfo_Certificate_SignatureInvalid, ntfLDS_ICAO_Certificate_Chain_Country_NonMatching, ntfLDS_ICAO_Certificate_VisualMrz_Country_NonMatching, ntfLDS_MRZ_CountryCode_VisualMrz_NonMatching, ntfLDS_ICAO_Certificate_MRZ_Country_NonMatching] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """ParsingNotificationCodes - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ParsingNotificationCodes): - return False - - return self.to_dict() == other.to_dict() + ntfLDS_ASN_Certificate_IncorrectVersion = 2415919105 + ntfLDS_ASN_Certificate_NonMatchingSignatureAlgorithm = 2415919106 + ntfLDS_ASN_Certificate_IncorrectTimeCoding = 2415919107 + ntfLDS_ASN_Certificate_IncorrectUseOfGeneralizedTime = 2415919108 + ntfLDS_ASN_Certificate_EmptyIssuer = 2415919109 + ntfLDS_ASN_Certificate_EmptySubject = 2415919110 + ntfLDS_ASN_Certificate_UnsupportedCriticalExtension = 2415919112 + ntfLDS_ASN_Certificate_ForcedDefaultCSCARole = 2415919118 + ntfLDS_ASN_Certificate_ForcedDefaultDSRole = 2415919119 + ntfLDS_ASN_Certificate_IncorrectIssuerSubjectDS = 2415919120 + ntfLDS_ASN_Certificate_DuplicatingExtensions = 2415919127 + ntfLDS_ICAO_Certificate_Version_Missed = 2415919616 + ntfLDS_ICAO_Certificate_Version_Incorrect = 2415919617 + ntfLDS_ICAO_Certificate_Issuer_Country_Missed = 2415919618 + ntfLDS_ICAO_Certificate_Issuer_CommonName_Missed = 2415919619 + ntfLDS_ICAO_Certificate_Issuer_CountryNonCompliant = 2415919620 + ntfLDS_ICAO_Certificate_Subject_Country_Missed = 2415919621 + ntfLDS_ICAO_Certificate_Subject_CommonName_Missed = 2415919622 + ntfLDS_ICAO_Certificate_Subject_CountryNonCompliant = 2415919623 + ntfLDS_ICAO_Certificate_UsingNonCompliantData = 2415919624 + ntfLDS_ICAO_Certificate_UnsupportedSignatureAlgorithm = 2415919625 + ntfLDS_ICAO_Certificate_UnsupportedPublicKeyAlgorithm = 2415919626 + ntfLDS_ICAO_Certificate_MissedExtensions = 2415919627 + ntfLDS_ICAO_Certificate_Validity = 2415919628 + ntfLDS_ICAO_Certificate_Ext_UsingNonCompliantData = 2415919629 + ntfLDS_ICAO_Certificate_Ext_KeyUsage_Missed = 2415919630 + ntfLDS_ICAO_Certificate_Ext_KeyUsage_NotCritical = 2415919631 + ntfLDS_ICAO_Certificate_Ext_KeyUsage_IncorrectData = 2415919632 + ntfLDS_ICAO_Certificate_Ext_BasicC_Missed = 2415919633 + ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage1 = 2415919634 + ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectUsage2 = 2415919635 + ntfLDS_ICAO_Certificate_Ext_BasicC_NotCritical = 2415919636 + ntfLDS_ICAO_Certificate_Ext_BasicC_IncorrectData = 2415919637 + ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Missed = 2415919638 + ntfLDS_ICAO_Certificate_Ext_BasicC_PathLenC_Incorrect = 2415919639 + ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_NotCritical = 2415919640 + ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectUsage = 2415919641 + ntfLDS_ICAO_Certificate_Ext_ExtKeyUsage_IncorrectData = 2415919642 + ntfLDS_ICAO_Certificate_Ext_AuthKeyID_Missed = 2415919643 + ntfLDS_ICAO_Certificate_Ext_AuthKeyID_IncorrectData = 2415919644 + ntfLDS_ICAO_Certificate_Ext_AuthKeyID_KeyID_Missed = 2415919645 + ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_Missed = 2415919646 + ntfLDS_ICAO_Certificate_Ext_SubjectKeyID_IncorrectData = 2415919647 + ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Missed = 2415919648 + ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_IncorrectData = 2415919649 + ntfLDS_ICAO_Certificate_Ext_PrivateKeyUP_Empty = 2415919650 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Missed = 2415919651 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_IncorrectData = 2415919652 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Empty = 2415919653 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_NonCompliant = 2415919654 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_Critical = 2415919656 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Empty = 2415919657 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_Incorrect = 2415919658 + ntfLDS_ICAO_Certificate_Ext_SubjectAltName_DN_NonCompliant = 2415919659 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Missed = 2415919660 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_IncorrectData = 2415919661 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Empty = 2415919662 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_NonCompliant = 2415919663 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_Critical = 2415919665 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Empty = 2415919666 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_Incorrect = 2415919667 + ntfLDS_ICAO_Certificate_Ext_IssuerAltName_DN_NonCompliant = 2415919668 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_Missed = 2415919669 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_IncorrectData = 2415919670 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_Version = 2415919671 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes = 2415919672 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_DocTypes_Empty = 2415919673 + ntfLDS_ICAO_Certificate_Ext_CertPolicies_IncorrectData = 2415919674 + ntfLDS_ICAO_Certificate_Ext_CertPolicies_Empty = 2415919675 + ntfLDS_ICAO_Certificate_Ext_CertPolicies_PolicyID_Missed = 2415919676 + ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Missed = 2415919677 + ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_IncorrectData = 2415919678 + ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_Empty = 2415919679 + ntfLDS_ICAO_Certificate_Ext_CRLDistPoint_PointMissed = 2415919680 + ntfLDS_ICAO_Certificate_SN_NonCompliant = 2415919681 + ntfLDS_ICAO_Certificate_Issuer_SN_NonCompliant = 2415919682 + ntfLDS_ICAO_Certificate_Subject_SN_NonCompliant = 2415919683 + ntfLDS_ICAO_Certificate_Issuer_AttributeNonCompliant = 2415919684 + ntfLDS_ICAO_Certificate_Subject_AttributeNonCompliant = 2415919685 + ntfLDS_ICAO_Certificate_IssuerSubject_Country_NonMatching = 2415919686 + ntfLDS_ICAO_Certificate_Ext_CSCA_AltNames_NonMatching = 2415919687 + ntfLDS_ICAO_Certificate_Ext_NameChange_IncorrectData = 2415919688 + ntfLDS_ICAO_Certificate_Ext_NameChange_NonCompliant = 2415919689 + ntfLDS_ICAO_Certificate_Ext_NameChange_Critical = 2415919690 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_NonCompliant = 2415919691 + ntfLDS_ICAO_Certificate_Ext_DocTypeList_Critical = 2415919692 + ntfLDS_ICAO_Certificate_Ext_Optional_Critical = 2415919693 + ntfLDS_ICAO_Certificate_Subject_NonCompliant = 2415919694 + ntfLDS_ICAO_Certificate_Subject_CommonNameNonCompliant = 2415919695 + ntfLDS_ICAO_COM_LDS_Version_Incorrect = 2415919136 + ntfLDS_ICAO_COM_LDS_Version_Missing = 2415919137 + ntfLDS_ICAO_COM_Unicode_Version_Incorrect = 2415919138 + ntfLDS_ICAO_COM_Unicode_Version_Missing = 2415919139 + ntfLDS_ICAO_COM_DGPM_Incorrect = 2415919140 + ntfLDS_ICAO_COM_DGPM_Missing = 2415919141 + ntfLDS_ICAO_COM_DGPM_Unexpected = 2415919142 + ntfLDS_ICAO_Application_LDSVersion_Unsupported = 2415919152 + ntfLDS_ICAO_Application_UnicodeVersion_Unsupported = 2415919153 + ntfLDS_ICAO_Application_LDSVersion_Inconsistent = 2415919154 + ntfLDS_ICAO_Application_UnicodeVersion_Inconsistent = 2415919155 + ntfLDS_ASN_SignedData_OID_Incorrect = 2415919360 + ntfLDS_ASN_SignedData_Version_Incorrect = 2415919520 + ntfLDS_ASN_SignedData_ContentOID_Incorrect = 2415919521 + ntfLDS_ICAO_SignedData_Version_Incorrect = 2415919361 + ntfLDS_ICAO_SignedData_DigestAlgorithms_Empty = 2415919362 + ntfLDS_ICAO_SignedData_DigestAlgorithms_Unsupported = 2415919363 + ntfLDS_ICAO_SignedData_SignerInfos_MultipleEntries = 2415919369 + ntfLDS_ICAO_SignedData_Certificates_Missed = 2415919536 + ntfLDS_ICAO_SignedData_Certificates_Empty = 2415919537 + ntfLDS_ICAO_SignedData_CRLs_IncorrectUsage = 2415919538 + ntfLDS_ICAO_LDSObject_IncorrectContentOID = 2415919364 + ntfLDS_ICAO_LDSObject_DGNumber_Incorrect = 2415919365 + ntfLDS_ICAO_LDSObject_DGHash_Missing = 2415919366 + ntfLDS_ICAO_LDSObject_DGHash_Extra = 2415919367 + ntfLDS_ICAO_LDSObject_Version_Incorrect = 2415919368 + ntfLDS_ICAO_MasterList_Version_Incorrect = 2415919552 + ntfLDS_ICAO_DeviationList_Version_Incorrect = 2415919560 + ntfLDS_BSI_DefectList_Version_Incorrect = 2415919568 + ntfLDS_BSI_BlackList_Version_Incorrect = 2415919576 + ntfLDS_ASN_SignerInfo_Version_Incorrect = 2415919370 + ntfLDS_ASN_SignerInfo_SID_IncorrectChoice = 2415919371 + ntfLDS_ASN_SignerInfo_SID_DigestAlgorithmNotListed = 2415919372 + ntfLDS_ASN_SignerInfo_MessageDigestAttr_Missing = 2415919373 + ntfLDS_ASN_SignerInfo_MessageDigestAttr_Data = 2415919374 + ntfLDS_ASN_SignerInfo_MessageDigestAttr_Value = 2415919375 + ntfLDS_ASN_SignerInfo_ContentTypeAttr_Missing = 2415919376 + ntfLDS_ASN_SignerInfo_ContentTypeAttr_Data = 2415919377 + ntfLDS_ASN_SignerInfo_ContentTypeAttr_Value = 2415919378 + ntfLDS_ASN_SignerInfo_SigningTimeAttr_Missing = 2415919387 + ntfLDS_ASN_SignerInfo_SigningTimeAttr_Data = 2415919388 + ntfLDS_ASN_SignerInfo_SigningTimeAttr_Value = 2415919389 + ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Missing = 2415919390 + ntfLDS_ASN_SignerInfo_ListContentDescriptionAttr_Data = 2415919391 + ntfLDS_Auth_SignerInfo_Certificate_Validity = 2415919381 + ntfLDS_Auth_SignerInfo_Certificate_RootIsNotTrusted = 2415919382 + ntfLDS_Auth_SignerInfo_Certificate_CantFindCSCA = 2415919383 + ntfLDS_Auth_SignerInfo_Certificate_Revoked = 2415919384 + ntfLDS_Auth_SignerInfo_Certificate_SignatureInvalid = 2415919385 + ntfLDS_UnsupportedImageFormat = 2415919386 + ntfLDS_MRZ_DocumentType_Unknown = 139272 + ntfLDS_MRZ_IssuingState_SyntaxError = 139273 + ntfLDS_MRZ_Name_IsVoid = 139274 + ntfLDS_MRZ_Number_IncorrectChecksum = 139277 + ntfLDS_MRZ_Nationality_SyntaxError = 139278 + ntfLDS_MRZ_DOB_SyntaxError = 139279 + ntfLDS_MRZ_DOB_Error = 139280 + ntfLDS_MRZ_DOB_IncorrectChecksum = 139281 + ntfLDS_MRZ_Sex_Incorrect = 139282 + ntfLDS_MRZ_DOE_SyntaxError = 139283 + ntfLDS_MRZ_DOE_Error = 139284 + ntfLDS_MRZ_DOE_IncorrectChecksum = 139285 + ntfLDS_MRZ_OptionalData_IncorrectChecksum = 139286 + ntfLDS_MRZ_IncorrectChecksum = 139287 + ntfLDS_MRZ_Incorrect = 139288 + ntfLDS_Biometrics_FormatOwner_Missing = 2415984640 + ntfLDS_Biometrics_FormatOwner_Incorrect = 2416050176 + ntfLDS_Biometrics_FormatType_Missing = 2416115712 + ntfLDS_Biometrics_FormatType_Incorrect = 2416181248 + ntfLDS_Biometrics_Type_Incorrect = 2416246784 + ntfLDS_Biometrics_SubType_Missing = 2416312320 + ntfLDS_Biometrics_SubType_Incorrect = 2416377856 + ntfLDS_Biometrics_BDB_Image_Missing = 2416443392 + ntfLDS_Biometrics_BDB_FormatID_Incorrect = 2416508928 + ntfLDS_Biometrics_BDB_Version_Incorrect = 2416574464 + ntfLDS_Biometrics_BDB_DataLength_Incorrect = 2416640000 + ntfLDS_Biometrics_BDB_Data_Gender = 2416967680 + ntfLDS_Biometrics_BDB_Data_EyeColor = 2417033216 + ntfLDS_Biometrics_BDB_Data_HairColor = 2417098752 + ntfLDS_Biometrics_BDB_Data_PoseAngle_Yaw = 2417164288 + ntfLDS_Biometrics_BDB_Data_PoseAngle_Pitch = 2417229824 + ntfLDS_Biometrics_BDB_Data_PoseAngle_Roll = 2417295360 + ntfLDS_Biometrics_BDB_Data_PoseAngleU_Yaw = 2417360896 + ntfLDS_Biometrics_BDB_Data_PoseAngleU_Pitch = 2417426432 + ntfLDS_Biometrics_BDB_Data_PoseAngleU_Roll = 2417491968 + ntfLDS_Biometrics_BDB_Data_FaceImageType = 2417557504 + ntfLDS_Biometrics_BDB_Data_ImageDataType = 2417623040 + ntfLDS_SI_PACE_Info_UnsupportedStdParameters = 2432696320 + ntfLDS_SI_PACE_Info_DeprecatedVersion = 2432696321 + ntfLDS_SI_PACE_DomainParams_UsingStdRef = 2432696322 + ntfLDS_SI_PACE_DomainParams_UnsupportedAlgorithm = 2432696323 + ntfLDS_SI_CA_Info_IncorrectVersion = 2432696324 + ntfLDS_SI_CA_PublicKey_UnsupportedAlgorithm = 2432696325 + ntfLDS_SI_CA_DomainParams_UnsupportedAlgorithm = 2432696326 + ntfLDS_SI_TA_Info_IncorrectVersion = 2432696327 + ntfLDS_SI_TA_Info_FileIDForVersion2 = 2432696328 + ntfLDS_SI_eIDSecurity_UnsupportedDigestAlgorithm = 2432696329 + ntfLDS_SI_RI_Info_IncorrectVersion = 2432696330 + ntfLDS_SI_RI_DomainParams_UnsupportedAlgorithm = 2432696331 + ntfLDS_SI_AA_Info_IncorrectVersion = 2432696332 + ntfLDS_SI_AA_Info_UnsupportedAlgorithm = 2432696333 + ntfLDS_SI_AA_Info_InconsistentAlgorithmReference = 2432696334 + ntfLDS_SI_Storage_PACE_Info_NotAvailable = 2432696576 + ntfLDS_SI_Storage_PACE_Info_NoStdParameters = 2432696577 + ntfLDS_SI_Storage_PACE_Info_NoMatchingDomainParams = 2432696578 + ntfLDS_SI_Storage_CA_Info_NotAvailable = 2432696579 + ntfLDS_SI_Storage_CA_DomainParams_NoRequiredOption = 2432696580 + ntfLDS_SI_Storage_CA_DomainParams_NotAvailable = 2432696581 + ntfLDS_SI_Storage_CA_AnonymousInfos = 2432696582 + ntfLDS_SI_Storage_CA_Info_NoMatchingDomainParams = 2432696583 + ntfLDS_SI_Storage_CA_Info_NoMatchingPublicKey = 2432696584 + ntfLDS_SI_Storage_CA_IncorrectInfosQuantity = 2432696585 + ntfLDS_SI_Storage_TA_Info_NotAvailable = 2432696586 + ntfLDS_SI_Storage_CardInfoLocator_MultipleEntries = 2432696587 + ntfLDS_SI_Storage_eIDSecurityInfo_MultipleEntries = 2432696588 + ntfLDS_SI_Storage_PrivilegedTI_MultipleEntries = 2432696589 + ntfLDS_SI_Storage_PrivilegedTI_IncorrectUsage = 2432696590 + ntfLDS_SI_Storage_RI_DomainParams_MultipleEntries = 2432696591 + ntfLDS_SI_Storage_PACEInfos_NonConsistant = 2432696592 + ntfLDS_CVCertificate_Profile_IncorrectVersion = 2432696833 + ntfLDS_CVCertificate_Validity = 2432696834 + ntfLDS_CVCertificate_NonCVCADomainParameters = 2432696835 + ntfLDS_CV_Certificate_PrivateKey_IncorrectVersion = 2432696836 + ntfLDS_TA_PACEStaticBindingUsed = 2432697088 + ntfLDS_Auth_MLSignerInfo_Certificate_Validity = 2449473813 + ntfLDS_Auth_MLSignerInfo_Certificate_RootIsNotTrusted = 2449473814 + ntfLDS_Auth_MLSignerInfo_Certificate_CantFindCSCA = 2449473815 + ntfLDS_Auth_MLSignerInfo_Certificate_Revoked = 2449473816 + ntfLDS_Auth_MLSignerInfo_Certificate_SignatureInvalid = 2449473817 + ntfLDS_ICAO_Certificate_Chain_Country_NonMatching = 2415919696 + ntfLDS_ICAO_Certificate_VisualMrz_Country_NonMatching = 2415919697 + ntfLDS_MRZ_CountryCode_VisualMrz_NonMatching = 139289 + ntfLDS_ICAO_Certificate_MRZ_Country_NonMatching = 2415919698 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ParsingNotificationCodes from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ParsingNotificationCodes): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/per_document_config.py b/regula/documentreader/webclient/gen/models/per_document_config.py index cae13ea..a0a719a 100644 --- a/regula/documentreader/webclient/gen/models/per_document_config.py +++ b/regula/documentreader/webclient/gen/models/per_document_config.py @@ -4,146 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PerDocumentConfig(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class PerDocumentConfig(BaseModel): """ - openapi_types = { - 'doc_id': 'list[int]', - 'exclude_auth_checks': 'int' - } - - attribute_map = { - 'doc_id': 'docID', - 'exclude_auth_checks': 'excludeAuthChecks' - } - - def __init__(self, doc_id=None, exclude_auth_checks=None, local_vars_configuration=None): # noqa: E501 - """PerDocumentConfig - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_id = None - self._exclude_auth_checks = None - self.discriminator = None - - if doc_id is not None: - self.doc_id = doc_id - if exclude_auth_checks is not None: - self.exclude_auth_checks = exclude_auth_checks - - @property - def doc_id(self): - """Gets the doc_id of this PerDocumentConfig. # noqa: E501 - - Specific template IDs, for which apply current custom configuration # noqa: E501 - - :return: The doc_id of this PerDocumentConfig. # noqa: E501 - :rtype: list[int] + PerDocumentConfig + """ # noqa: E501 + doc_id: Optional[List[StrictInt]] = Field(default=None, description="Specific template IDs, for which apply current custom configuration", alias="docID") + exclude_auth_checks: Optional[StrictInt] = Field(default=None, description="Contains items from AuthenticityResultType as sum via OR operation", alias="excludeAuthChecks") + __properties: ClassVar[List[str]] = ["docID", "excludeAuthChecks"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PerDocumentConfig from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._doc_id + excluded_fields: Set[str] = set([ + ]) - @doc_id.setter - def doc_id(self, doc_id): - """Sets the doc_id of this PerDocumentConfig. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - Specific template IDs, for which apply current custom configuration # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PerDocumentConfig from a dict""" + if obj is None: + return None - :param doc_id: The doc_id of this PerDocumentConfig. # noqa: E501 - :type doc_id: list[int] - """ - - self._doc_id = doc_id - - @property - def exclude_auth_checks(self): - """Gets the exclude_auth_checks of this PerDocumentConfig. # noqa: E501 - - Contains items from AuthenticityResultType as sum via OR operation # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The exclude_auth_checks of this PerDocumentConfig. # noqa: E501 - :rtype: int - """ - return self._exclude_auth_checks - - @exclude_auth_checks.setter - def exclude_auth_checks(self, exclude_auth_checks): - """Sets the exclude_auth_checks of this PerDocumentConfig. + _obj = cls.model_validate({ + "docID": obj.get("docID"), + "excludeAuthChecks": obj.get("excludeAuthChecks") + }) + return _obj - Contains items from AuthenticityResultType as sum via OR operation # noqa: E501 - - :param exclude_auth_checks: The exclude_auth_checks of this PerDocumentConfig. # noqa: E501 - :type exclude_auth_checks: int - """ - self._exclude_auth_checks = exclude_auth_checks - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PerDocumentConfig): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PerDocumentConfig): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/photo_ident_item.py b/regula/documentreader/webclient/gen/models/photo_ident_item.py new file mode 100644 index 0000000..fa0985c --- /dev/null +++ b/regula/documentreader/webclient/gen/models/photo_ident_item.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.raw_image_container_list import RawImageContainerList +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class PhotoIdentItem(BaseModel): + """ + PhotoIdentItem + """ # noqa: E501 + light_index: Light = Field(alias="LightIndex") + area: RectangleCoordinates = Field(alias="Area") + source_image: ImageData = Field(alias="SourceImage") + result_images: RawImageContainerList = Field(alias="ResultImages") + field_types_count: Optional[StrictInt] = Field(default=None, alias="FieldTypesCount") + field_types_list: Optional[List[StrictInt]] = Field(default=None, alias="FieldTypesList") + step: Optional[StrictInt] = Field(default=None, alias="Step") + angle: Optional[StrictInt] = Field(default=None, alias="Angle") + reserved1: Optional[StrictInt] = Field(default=None, alias="Reserved1") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + reserved3: Optional[StrictInt] = Field(default=None, alias="Reserved3") + __properties: ClassVar[List[str]] = ["LightIndex", "Area", "SourceImage", "ResultImages", "FieldTypesCount", "FieldTypesList", "Step", "Angle", "Reserved1", "Reserved2", "Reserved3"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PhotoIdentItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of area + if self.area: + _dict['Area'] = self.area.to_dict() + # override the default output from pydantic by calling `to_dict()` of source_image + if self.source_image: + _dict['SourceImage'] = self.source_image.to_dict() + # override the default output from pydantic by calling `to_dict()` of result_images + if self.result_images: + _dict['ResultImages'] = self.result_images.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PhotoIdentItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "LightIndex": obj.get("LightIndex"), + "Area": RectangleCoordinates.from_dict(obj["Area"]) if obj.get("Area") is not None else None, + "SourceImage": ImageData.from_dict(obj["SourceImage"]) if obj.get("SourceImage") is not None else None, + "ResultImages": RawImageContainerList.from_dict(obj["ResultImages"]) if obj.get("ResultImages") is not None else None, + "FieldTypesCount": obj.get("FieldTypesCount"), + "FieldTypesList": obj.get("FieldTypesList"), + "Step": obj.get("Step"), + "Angle": obj.get("Angle"), + "Reserved1": obj.get("Reserved1"), + "Reserved2": obj.get("Reserved2"), + "Reserved3": obj.get("Reserved3") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/photo_ident_result.py b/regula/documentreader/webclient/gen/models/photo_ident_result.py index 6b14d4e..2f23d80 100644 --- a/regula/documentreader/webclient/gen/models/photo_ident_result.py +++ b/regula/documentreader/webclient/gen/models/photo_ident_result.py @@ -4,431 +4,117 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PhotoIdentResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.light import Light +from regula.documentreader.webclient.gen.models.raw_image_container_list import RawImageContainerList +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class PhotoIdentResult(AuthenticityCheckResultItem): """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int', - 'light_index': 'Light', - 'area': 'RectangleCoordinates', - 'source_image': 'ImageData', - 'result_images': 'RawImageContainerList', - 'field_types_count': 'int', - 'field_types_list': 'list[int]', - 'step': 'int', - 'angle': 'int', - 'reserved3': 'int' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue', - 'light_index': 'LightIndex', - 'area': 'Area', - 'source_image': 'SourceImage', - 'result_images': 'ResultImages', - 'field_types_count': 'FieldTypesCount', - 'field_types_list': 'FieldTypesList', - 'step': 'Step', - 'angle': 'Angle', - 'reserved3': 'Reserved3' - } - - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, light_index=None, area=None, source_image=None, result_images=None, field_types_count=None, field_types_list=None, step=None, angle=None, reserved3=None, local_vars_configuration=None): # noqa: E501 - """PhotoIdentResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self._light_index = None - self._area = None - self._source_image = None - self._result_images = None - self._field_types_count = None - self._field_types_list = None - self._step = None - self._angle = None - self._reserved3 = None - self.discriminator = None - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - if light_index is not None: - self.light_index = light_index - if area is not None: - self.area = area - if source_image is not None: - self.source_image = source_image - if result_images is not None: - self.result_images = result_images - if field_types_count is not None: - self.field_types_count = field_types_count - if field_types_list is not None: - self.field_types_list = field_types_list - if step is not None: - self.step = step - if angle is not None: - self.angle = angle - if reserved3 is not None: - self.reserved3 = reserved3 - - @property - def type(self): - """Gets the type of this PhotoIdentResult. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this PhotoIdentResult. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this PhotoIdentResult. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this PhotoIdentResult. # noqa: E501 - - - :return: The element_result of this PhotoIdentResult. # noqa: E501 - :rtype: CheckResult - """ - return self._element_result - - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this PhotoIdentResult. - - - :param element_result: The element_result of this PhotoIdentResult. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this PhotoIdentResult. # noqa: E501 - - - :return: The element_diagnose of this PhotoIdentResult. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this PhotoIdentResult. - - - :param element_diagnose: The element_diagnose of this PhotoIdentResult. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this PhotoIdentResult. # noqa: E501 - - - :return: The percent_value of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this PhotoIdentResult. - - - :param percent_value: The percent_value of this PhotoIdentResult. # noqa: E501 - :type percent_value: int - """ - - self._percent_value = percent_value - - @property - def light_index(self): - """Gets the light_index of this PhotoIdentResult. # noqa: E501 - - - :return: The light_index of this PhotoIdentResult. # noqa: E501 - :rtype: Light - """ - return self._light_index - - @light_index.setter - def light_index(self, light_index): - """Sets the light_index of this PhotoIdentResult. - - - :param light_index: The light_index of this PhotoIdentResult. # noqa: E501 - :type light_index: Light - """ - - self._light_index = light_index - - @property - def area(self): - """Gets the area of this PhotoIdentResult. # noqa: E501 - - - :return: The area of this PhotoIdentResult. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this PhotoIdentResult. - - - :param area: The area of this PhotoIdentResult. # noqa: E501 - :type area: RectangleCoordinates - """ - - self._area = area - - @property - def source_image(self): - """Gets the source_image of this PhotoIdentResult. # noqa: E501 - - - :return: The source_image of this PhotoIdentResult. # noqa: E501 - :rtype: ImageData - """ - return self._source_image - - @source_image.setter - def source_image(self, source_image): - """Sets the source_image of this PhotoIdentResult. - - - :param source_image: The source_image of this PhotoIdentResult. # noqa: E501 - :type source_image: ImageData - """ - - self._source_image = source_image - - @property - def result_images(self): - """Gets the result_images of this PhotoIdentResult. # noqa: E501 - - - :return: The result_images of this PhotoIdentResult. # noqa: E501 - :rtype: RawImageContainerList - """ - return self._result_images - - @result_images.setter - def result_images(self, result_images): - """Sets the result_images of this PhotoIdentResult. - - - :param result_images: The result_images of this PhotoIdentResult. # noqa: E501 - :type result_images: RawImageContainerList - """ - - self._result_images = result_images - - @property - def field_types_count(self): - """Gets the field_types_count of this PhotoIdentResult. # noqa: E501 - - - :return: The field_types_count of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._field_types_count - - @field_types_count.setter - def field_types_count(self, field_types_count): - """Sets the field_types_count of this PhotoIdentResult. - - - :param field_types_count: The field_types_count of this PhotoIdentResult. # noqa: E501 - :type field_types_count: int - """ - - self._field_types_count = field_types_count - - @property - def field_types_list(self): - """Gets the field_types_list of this PhotoIdentResult. # noqa: E501 - - - :return: The field_types_list of this PhotoIdentResult. # noqa: E501 - :rtype: list[int] - """ - return self._field_types_list - - @field_types_list.setter - def field_types_list(self, field_types_list): - """Sets the field_types_list of this PhotoIdentResult. - - - :param field_types_list: The field_types_list of this PhotoIdentResult. # noqa: E501 - :type field_types_list: list[int] - """ - - self._field_types_list = field_types_list - - @property - def step(self): - """Gets the step of this PhotoIdentResult. # noqa: E501 - - - :return: The step of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._step - - @step.setter - def step(self, step): - """Sets the step of this PhotoIdentResult. - - - :param step: The step of this PhotoIdentResult. # noqa: E501 - :type step: int - """ - - self._step = step - - @property - def angle(self): - """Gets the angle of this PhotoIdentResult. # noqa: E501 - - - :return: The angle of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._angle - - @angle.setter - def angle(self, angle): - """Sets the angle of this PhotoIdentResult. - - - :param angle: The angle of this PhotoIdentResult. # noqa: E501 - :type angle: int - """ - - self._angle = angle - - @property - def reserved3(self): - """Gets the reserved3 of this PhotoIdentResult. # noqa: E501 - - - :return: The reserved3 of this PhotoIdentResult. # noqa: E501 - :rtype: int - """ - return self._reserved3 - - @reserved3.setter - def reserved3(self, reserved3): - """Sets the reserved3 of this PhotoIdentResult. - - - :param reserved3: The reserved3 of this PhotoIdentResult. # noqa: E501 - :type reserved3: int - """ - - self._reserved3 = reserved3 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PhotoIdentResult): - return False - - return self.to_dict() == other.to_dict() + PhotoIdentResult + """ # noqa: E501 + light_index: Light = Field(alias="LightIndex") + area: RectangleCoordinates = Field(alias="Area") + source_image: ImageData = Field(alias="SourceImage") + result_images: RawImageContainerList = Field(alias="ResultImages") + field_types_count: Optional[StrictInt] = Field(default=None, alias="FieldTypesCount") + field_types_list: Optional[List[StrictInt]] = Field(default=None, alias="FieldTypesList") + step: Optional[StrictInt] = Field(default=None, alias="Step") + angle: Optional[StrictInt] = Field(default=None, alias="Angle") + reserved1: Optional[StrictInt] = Field(default=None, alias="Reserved1") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + reserved3: Optional[StrictInt] = Field(default=None, alias="Reserved3") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue", "LightIndex", "Area", "SourceImage", "ResultImages", "FieldTypesCount", "FieldTypesList", "Step", "Angle", "Reserved1", "Reserved2", "Reserved3"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PhotoIdentResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of area + if self.area: + _dict['Area'] = self.area.to_dict() + # override the default output from pydantic by calling `to_dict()` of source_image + if self.source_image: + _dict['SourceImage'] = self.source_image.to_dict() + # override the default output from pydantic by calling `to_dict()` of result_images + if self.result_images: + _dict['ResultImages'] = self.result_images.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PhotoIdentResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "ElementResult": obj.get("ElementResult"), + "ElementDiagnose": obj.get("ElementDiagnose"), + "PercentValue": obj.get("PercentValue"), + "LightIndex": obj.get("LightIndex"), + "Area": RectangleCoordinates.from_dict(obj["Area"]) if obj.get("Area") is not None else None, + "SourceImage": ImageData.from_dict(obj["SourceImage"]) if obj.get("SourceImage") is not None else None, + "ResultImages": RawImageContainerList.from_dict(obj["ResultImages"]) if obj.get("ResultImages") is not None else None, + "FieldTypesCount": obj.get("FieldTypesCount"), + "FieldTypesList": obj.get("FieldTypesList"), + "Step": obj.get("Step"), + "Angle": obj.get("Angle"), + "Reserved1": obj.get("Reserved1"), + "Reserved2": obj.get("Reserved2"), + "Reserved3": obj.get("Reserved3") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PhotoIdentResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/photo_ident_result_all_of.py b/regula/documentreader/webclient/gen/models/photo_ident_result_all_of.py deleted file mode 100644 index 3ad9dd6..0000000 --- a/regula/documentreader/webclient/gen/models/photo_ident_result_all_of.py +++ /dev/null @@ -1,327 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PhotoIdentResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'light_index': 'Light', - 'area': 'RectangleCoordinates', - 'source_image': 'ImageData', - 'result_images': 'RawImageContainerList', - 'field_types_count': 'int', - 'field_types_list': 'list[int]', - 'step': 'int', - 'angle': 'int', - 'reserved3': 'int' - } - - attribute_map = { - 'light_index': 'LightIndex', - 'area': 'Area', - 'source_image': 'SourceImage', - 'result_images': 'ResultImages', - 'field_types_count': 'FieldTypesCount', - 'field_types_list': 'FieldTypesList', - 'step': 'Step', - 'angle': 'Angle', - 'reserved3': 'Reserved3' - } - - def __init__(self, light_index=None, area=None, source_image=None, result_images=None, field_types_count=None, field_types_list=None, step=None, angle=None, reserved3=None, local_vars_configuration=None): # noqa: E501 - """PhotoIdentResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._light_index = None - self._area = None - self._source_image = None - self._result_images = None - self._field_types_count = None - self._field_types_list = None - self._step = None - self._angle = None - self._reserved3 = None - self.discriminator = None - - if light_index is not None: - self.light_index = light_index - if area is not None: - self.area = area - if source_image is not None: - self.source_image = source_image - if result_images is not None: - self.result_images = result_images - if field_types_count is not None: - self.field_types_count = field_types_count - if field_types_list is not None: - self.field_types_list = field_types_list - if step is not None: - self.step = step - if angle is not None: - self.angle = angle - if reserved3 is not None: - self.reserved3 = reserved3 - - @property - def light_index(self): - """Gets the light_index of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The light_index of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: Light - """ - return self._light_index - - @light_index.setter - def light_index(self, light_index): - """Sets the light_index of this PhotoIdentResultAllOf. - - - :param light_index: The light_index of this PhotoIdentResultAllOf. # noqa: E501 - :type light_index: Light - """ - - self._light_index = light_index - - @property - def area(self): - """Gets the area of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The area of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._area - - @area.setter - def area(self, area): - """Sets the area of this PhotoIdentResultAllOf. - - - :param area: The area of this PhotoIdentResultAllOf. # noqa: E501 - :type area: RectangleCoordinates - """ - - self._area = area - - @property - def source_image(self): - """Gets the source_image of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The source_image of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: ImageData - """ - return self._source_image - - @source_image.setter - def source_image(self, source_image): - """Sets the source_image of this PhotoIdentResultAllOf. - - - :param source_image: The source_image of this PhotoIdentResultAllOf. # noqa: E501 - :type source_image: ImageData - """ - - self._source_image = source_image - - @property - def result_images(self): - """Gets the result_images of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The result_images of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: RawImageContainerList - """ - return self._result_images - - @result_images.setter - def result_images(self, result_images): - """Sets the result_images of this PhotoIdentResultAllOf. - - - :param result_images: The result_images of this PhotoIdentResultAllOf. # noqa: E501 - :type result_images: RawImageContainerList - """ - - self._result_images = result_images - - @property - def field_types_count(self): - """Gets the field_types_count of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The field_types_count of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: int - """ - return self._field_types_count - - @field_types_count.setter - def field_types_count(self, field_types_count): - """Sets the field_types_count of this PhotoIdentResultAllOf. - - - :param field_types_count: The field_types_count of this PhotoIdentResultAllOf. # noqa: E501 - :type field_types_count: int - """ - - self._field_types_count = field_types_count - - @property - def field_types_list(self): - """Gets the field_types_list of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The field_types_list of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: list[int] - """ - return self._field_types_list - - @field_types_list.setter - def field_types_list(self, field_types_list): - """Sets the field_types_list of this PhotoIdentResultAllOf. - - - :param field_types_list: The field_types_list of this PhotoIdentResultAllOf. # noqa: E501 - :type field_types_list: list[int] - """ - - self._field_types_list = field_types_list - - @property - def step(self): - """Gets the step of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The step of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: int - """ - return self._step - - @step.setter - def step(self, step): - """Sets the step of this PhotoIdentResultAllOf. - - - :param step: The step of this PhotoIdentResultAllOf. # noqa: E501 - :type step: int - """ - - self._step = step - - @property - def angle(self): - """Gets the angle of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The angle of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: int - """ - return self._angle - - @angle.setter - def angle(self, angle): - """Sets the angle of this PhotoIdentResultAllOf. - - - :param angle: The angle of this PhotoIdentResultAllOf. # noqa: E501 - :type angle: int - """ - - self._angle = angle - - @property - def reserved3(self): - """Gets the reserved3 of this PhotoIdentResultAllOf. # noqa: E501 - - - :return: The reserved3 of this PhotoIdentResultAllOf. # noqa: E501 - :rtype: int - """ - return self._reserved3 - - @reserved3.setter - def reserved3(self, reserved3): - """Sets the reserved3 of this PhotoIdentResultAllOf. - - - :param reserved3: The reserved3 of this PhotoIdentResultAllOf. # noqa: E501 - :type reserved3: int - """ - - self._reserved3 = reserved3 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PhotoIdentResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PhotoIdentResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/point.py b/regula/documentreader/webclient/gen/models/point.py index 8880c36..ea35b9e 100644 --- a/regula/documentreader/webclient/gen/models/point.py +++ b/regula/documentreader/webclient/gen/models/point.py @@ -4,142 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class Point(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class Point(BaseModel): """ - openapi_types = { - 'x': 'int', - 'y': 'int' - } - - attribute_map = { - 'x': 'x', - 'y': 'y' - } - - def __init__(self, x=None, y=None, local_vars_configuration=None): # noqa: E501 - """Point - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._x = None - self._y = None - self.discriminator = None - - if x is not None: - self.x = x - if y is not None: - self.y = y - - @property - def x(self): - """Gets the x of this Point. # noqa: E501 - - - :return: The x of this Point. # noqa: E501 - :rtype: int + Point + """ # noqa: E501 + x: StrictInt + y: StrictInt + __properties: ClassVar[List[str]] = ["x", "y"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Point from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._x + excluded_fields: Set[str] = set([ + ]) - @x.setter - def x(self, x): - """Sets the x of this Point. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Point from a dict""" + if obj is None: + return None - :param x: The x of this Point. # noqa: E501 - :type x: int - """ - - self._x = x - - @property - def y(self): - """Gets the y of this Point. # noqa: E501 - + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The y of this Point. # noqa: E501 - :rtype: int - """ - return self._y - - @y.setter - def y(self, y): - """Sets the y of this Point. + _obj = cls.model_validate({ + "x": obj.get("x"), + "y": obj.get("y") + }) + return _obj - :param y: The y of this Point. # noqa: E501 - :type y: int - """ - - self._y = y - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Point): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Point): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/point_array.py b/regula/documentreader/webclient/gen/models/point_array.py index 14ae95b..0475601 100644 --- a/regula/documentreader/webclient/gen/models/point_array.py +++ b/regula/documentreader/webclient/gen/models/point_array.py @@ -4,116 +4,84 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.point import Point +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PointArray(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class PointArray(BaseModel): """ + PointArray + """ # noqa: E501 + points_list: List[Point] = Field(alias="PointsList") + __properties: ClassVar[List[str]] = ["PointsList"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'points_list': 'list[Point]' - } + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - attribute_map = { - 'points_list': 'PointsList' - } - def __init__(self, points_list=None, local_vars_configuration=None): # noqa: E501 - """PointArray - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - self._points_list = None - self.discriminator = None + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - if points_list is not None: - self.points_list = points_list + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PointArray from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @property - def points_list(self): - """Gets the points_list of this PointArray. # noqa: E501 + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :return: The points_list of this PointArray. # noqa: E501 - :rtype: list[Point] + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._points_list - - @points_list.setter - def points_list(self, points_list): - """Sets the points_list of this PointArray. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in points_list (list) + _items = [] + if self.points_list: + for _item_points_list in self.points_list: + if _item_points_list: + _items.append(_item_points_list.to_dict()) + _dict['PointsList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PointArray from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "PointsList": [Point.from_dict(_item) for _item in obj["PointsList"]] if obj.get("PointsList") is not None else None + }) + return _obj - :param points_list: The points_list of this PointArray. # noqa: E501 - :type points_list: list[Point] - """ - - self._points_list = points_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PointArray): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PointArray): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/points_container.py b/regula/documentreader/webclient/gen/models/points_container.py index ab0a33f..f7641ab 100644 --- a/regula/documentreader/webclient/gen/models/points_container.py +++ b/regula/documentreader/webclient/gen/models/points_container.py @@ -4,142 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.point import Point +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class PointsContainer(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class PointsContainer(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'point_count': 'int', - 'points_list': 'list[Point]' - } - - attribute_map = { - 'point_count': 'PointCount', - 'points_list': 'PointsList' - } - - def __init__(self, point_count=None, points_list=None, local_vars_configuration=None): # noqa: E501 - """PointsContainer - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._point_count = None - self._points_list = None - self.discriminator = None - - if point_count is not None: - self.point_count = point_count - if points_list is not None: - self.points_list = points_list - - @property - def point_count(self): - """Gets the point_count of this PointsContainer. # noqa: E501 - - - :return: The point_count of this PointsContainer. # noqa: E501 - :rtype: int + PointsContainer + """ # noqa: E501 + point_count: Optional[StrictInt] = Field(default=None, alias="PointCount") + points_list: List[Point] = Field(alias="PointsList") + __properties: ClassVar[List[str]] = ["PointCount", "PointsList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of PointsContainer from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._point_count - - @point_count.setter - def point_count(self, point_count): - """Sets the point_count of this PointsContainer. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in points_list (list) + _items = [] + if self.points_list: + for _item_points_list in self.points_list: + if _item_points_list: + _items.append(_item_points_list.to_dict()) + _dict['PointsList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of PointsContainer from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "PointCount": obj.get("PointCount"), + "PointsList": [Point.from_dict(_item) for _item in obj["PointsList"]] if obj.get("PointsList") is not None else None + }) + return _obj - :param point_count: The point_count of this PointsContainer. # noqa: E501 - :type point_count: int - """ - - self._point_count = point_count - - @property - def points_list(self): - """Gets the points_list of this PointsContainer. # noqa: E501 - - - :return: The points_list of this PointsContainer. # noqa: E501 - :rtype: list[Point] - """ - return self._points_list - - @points_list.setter - def points_list(self, points_list): - """Sets the points_list of this PointsContainer. - - - :param points_list: The points_list of this PointsContainer. # noqa: E501 - :type points_list: list[Point] - """ - self._points_list = points_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, PointsContainer): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, PointsContainer): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_params.py b/regula/documentreader/webclient/gen/models/process_params.py old mode 100755 new mode 100644 index 714a69a..149ab68 --- a/regula/documentreader/webclient/gen/models/process_params.py +++ b/regula/documentreader/webclient/gen/models/process_params.py @@ -4,1751 +4,233 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessParams(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.auth_params import AuthParams +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.document_format import DocumentFormat +from regula.documentreader.webclient.gen.models.document_type import DocumentType +from regula.documentreader.webclient.gen.models.face_api import FaceApi +from regula.documentreader.webclient.gen.models.image_qa import ImageQA +from regula.documentreader.webclient.gen.models.input_barcode_type import InputBarcodeType +from regula.documentreader.webclient.gen.models.lcid import LCID +from regula.documentreader.webclient.gen.models.log_level import LogLevel +from regula.documentreader.webclient.gen.models.measure_system import MeasureSystem +from regula.documentreader.webclient.gen.models.mrz_detect_mode_enum import MrzDetectModeEnum +from regula.documentreader.webclient.gen.models.mrz_format import MRZFormat +from regula.documentreader.webclient.gen.models.per_document_config import PerDocumentConfig +from regula.documentreader.webclient.gen.models.process_params_rfid import ProcessParamsRfid +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.scenario import Scenario +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from regula.documentreader.webclient.gen.models.text_post_processing import TextPostProcessing +from typing import Optional, Set +from typing_extensions import Self + +class ProcessParams(BaseModel): """ + ProcessParams + """ # noqa: E501 + generate_dtcvc: Optional[StrictBool] = Field(default=None, description="This parameter is used to generate separate DTC-VC data container from RFID session data.", alias="generateDTCVC") + lcid_filter: Optional[List[LCID]] = Field(default=None, description="The list of LCID types to recognize. If empty, values with all LCID types will be extracted. Empty by default.", alias="lcidFilter") + check_liveness: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable document liveness check.", alias="checkLiveness") + lcid_ignore_filter: Optional[List[LCID]] = Field(default=None, description="The list of LCID types to ignore during the recognition. If empty, values with all LCID types will be extracted. Narrowing down the list can reduce processing time. Empty by default.", alias="lcidIgnoreFilter") + one_shot_identification: Optional[StrictBool] = Field(default=None, description="This parameter allows processing an image that contains a person and a document and compare the portrait photo from the document with the person's face", alias="oneShotIdentification") + use_face_api: Optional[StrictBool] = Field(default=None, description="This parameter allows comparing faces on Regula Face Web Service", alias="useFaceApi") + face_api: Optional[FaceApi] = Field(default=None, alias="faceApi") + do_detect_can: Optional[StrictBool] = Field(default=None, description="This parameter allows enabling the CAN (Card Access Number) detection and recognition when using scenarios with document location and MRZ reading, such as the MrzAndLocate scenario.", alias="doDetectCan") + image_output_max_height: Optional[StrictInt] = Field(default=None, description="This parameter allows setting maximum height in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0.", alias="imageOutputMaxHeight") + image_output_max_width: Optional[StrictInt] = Field(default=None, description="This parameter allows setting maximum width in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0.", alias="imageOutputMaxWidth") + scenario: Scenario + result_type_output: Optional[List[Result]] = Field(default=None, description="Types of results to return in response. See 'Result' enum for available options", alias="resultTypeOutput") + double_page_spread: Optional[StrictBool] = Field(default=None, description="Enable this option if the image you provide contains double page spread of the passport and you want to process both pages in one go. It makes sense to use it for documents that have meaningful information on both pages, like Russian domestic passport, or some others. Disabled by default.", alias="doublePageSpread") + generate_double_page_spread_image: Optional[StrictBool] = Field(default=None, description="When enabled together with \"doublePageSpread\" and there is a passport with two pages spread in the image, pages will be cropped, straightened and aligned together, as if the document was captured on a flatbed scanner. Disabled by default.", alias="generateDoublePageSpreadImage") + field_types_filter: Optional[List[TextFieldType]] = Field(default=None, description="List of text field types to extract. If empty, all text fields from template will be extracted. Narrowing the list can shorten processing time. Empty by default.", alias="fieldTypesFilter") + date_format: Optional[StrictStr] = Field(default=None, description="This option allows you to set dates format so that solution will return dates in this format. For example, if you supply 'MM/dd/yyyy', and document have printed date '09 JUL 2020' for the date os issue, you will get '07/09/2020' as a result. By default it is set to system locale default (where the service is running).", alias="dateFormat") + measure_system: Optional[MeasureSystem] = Field(default=None, alias="measureSystem") + image_dpi_out_max: Optional[StrictInt] = Field(default=None, description="This parameter controls maximum resolution in dpi of output images. Resolution will remain original in case 0 is supplied. By default is set to return images in response with resolution not greater than 300 dpi for all scenarios except FullAuth. In FullAuth scenario this limit is 1000 dpi by default.", alias="imageDpiOutMax") + already_cropped: Optional[StrictBool] = Field(default=None, description="This option can be enabled if you know for sure that the image you provide contains already cropped document by its edges. This was designed to process on the server side images captured and cropped on mobile. Disabled by default.", alias="alreadyCropped") + custom_params: Optional[Dict[str, Any]] = Field(default=None, description="This option allows passing custom processing parameters that can be implemented in future without changing API.", alias="customParams") + config: Optional[List[PerDocumentConfig]] = Field(default=None, description="This option allows setting additional custom configuration per document type. If recognized document has ID specified in config, processing adjusts according to designated configuration.") + log: Optional[StrictBool] = Field(default=None, description="When enabled, results will contain transaction processing log. Disabled by default") + log_level: Optional[LogLevel] = Field(default=None, alias="logLevel") + force_doc_id: Optional[StrictInt] = Field(default=None, description="Force use of specific template ID and skip document type identification step.", alias="forceDocID") + match_text_field_mask: Optional[StrictBool] = Field(default=None, description="When disabled, text field OCR will be done as is and then the recognized value will be matched to the field mask for validity. If enabled, we are trying to read a field value with maximum efforts to match the mask and provide a correctly formatted value, making assumptions based on the provided field mask in the template. Enabled by default.", alias="matchTextFieldMask") + fast_doc_detect: Optional[StrictBool] = Field(default=None, description="When enabled, shorten the list of candidates to process during document detection in a single image process mode. Reduces processing time for specific backgrounds. Enabled by default.", alias="fastDocDetect") + update_ocr_validity_by_glare: Optional[StrictBool] = Field(default=None, description="When enabled, fail OCR field validity, if there is a glare over the text field on the image. Disabled by default.", alias="updateOCRValidityByGlare") + check_required_text_fields: Optional[StrictBool] = Field(default=None, description="When enabled, each field in template will be checked for value presence and if the field is marked as required, but has no value, it will have 'error' in validity status. Disabled by default.", alias="checkRequiredTextFields") + return_cropped_barcode: Optional[StrictBool] = Field(default=None, description="When enabled, returns cropped barcode images for unknown documents. Disabled by default.", alias="returnCroppedBarcode") + image_qa: Optional[ImageQA] = Field(default=None, alias="imageQa") + strict_image_quality: Optional[StrictBool] = Field(default=None, description="When enabled, the image quality check status affects the document optical and overall status. Disabled by default.", alias="strictImageQuality") + respect_image_quality: Optional[StrictBool] = Field(default=None, description="Deprecated. Please use strictImageQuality instead. When enabled, image quality checks status affects document optical and overall status. Disabled by default.", alias="respectImageQuality") + force_doc_format: Optional[DocumentFormat] = Field(default=None, alias="forceDocFormat") + no_graphics: Optional[StrictBool] = Field(default=None, description="When enabled, no graphic fields will be cropped from document image. Disabled by default.", alias="noGraphics") + depersonalize_log: Optional[StrictBool] = Field(default=None, description="When enabled, all personal data will be forcibly removed from the logs. Disabled by default.", alias="depersonalizeLog") + multi_doc_on_image: Optional[StrictBool] = Field(default=None, description="This option allows locating and cropping multiple documents from one image if enabled. Disabled by default.", alias="multiDocOnImage") + shift_expiry_date: Optional[StrictInt] = Field(default=None, description="This option allows shifting the date of expiry into the future or past for number of months specified. This is useful, for example, in some cases when document might be still valid for some period after original expiration date to prevent negative validity status for such documents. Or by shifting the date to the past will set negative validity for the documents that is about to expire in a specified number of months. 0 by default", alias="shiftExpiryDate") + minimal_holder_age: Optional[StrictInt] = Field(default=None, description="This options allows specifying the minimal age in years of the document holder for the document to be considered valid.", alias="minimalHolderAge") + return_uncropped_image: Optional[StrictBool] = Field(default=None, description="When enabled, returns input images in output. Disabled by default.", alias="returnUncroppedImage") + mrz_formats_filter: Optional[List[MRZFormat]] = Field(default=None, description="This option allows limiting MRZ formats to be recognized by specifying them in array.", alias="mrzFormatsFilter") + force_read_mrz_before_locate: Optional[StrictBool] = Field(default=None, description="When enabled, make sure that in series processing MRZ is located fully inside the result document image, if present on the document. Enabling this option may add extra processing time, by disabling optimizations, but allows more stability in output image quality. Disabled by default.", alias="forceReadMrzBeforeLocate") + parse_barcodes: Optional[StrictBool] = Field(default=None, description="This option can be disabled to stop parsing after barcode is read. Enabled by default.", alias="parseBarcodes") + convert_case: Optional[TextPostProcessing] = Field(default=None, alias="convertCase") + split_names: Optional[StrictBool] = Field(default=None, description="When enabled, the Surname and GivenNames fields from MRZ will be divided into ft_First_Name, ft_Second_Name, ft_Third_Name, ft_Fourth_Name, ft_Last_Name fields. Disabled by default.", alias="splitNames") + disable_perforation_ocr: Optional[StrictBool] = Field(default=None, description="When enabled, OCR of perforated fields in the document template will not be performed. Disabled by default.", alias="disablePerforationOCR") + document_group_filter: Optional[List[DocumentType]] = Field(default=None, description="List of specific eligible document types from DocumentType enum to recognize from. You may, for example, specify only passports to be recognized by setting this property. Empty by default.", alias="documentGroupFilter") + process_auth: Optional[AuthenticityResultType] = Field(default=None, alias="processAuth") + device_id: Optional[StrictInt] = Field(default=None, description="This parameter is used to specify the document reader device type from which input images were captured. Default 0.", alias="deviceId") + device_type: Optional[StrictInt] = Field(default=None, description="This parameter is used to specify the document reader device type from which input images were captured. Default 0.", alias="deviceType") + device_type_hex: Optional[StrictStr] = Field(default=None, description="This parameter is used to specify the document reader device type from which input images were captured", alias="deviceTypeHex") + ignore_device_id_from_image: Optional[StrictBool] = Field(default=None, description="This parameter is used to tell the processing engine to ignore any parameters saved in the image when scanned from the document reader device. Default false", alias="ignoreDeviceIdFromImage") + document_id_list: Optional[List[StrictInt]] = Field(default=None, description="List of the document ID's to process. All documents will be processed, if empty.", alias="documentIdList") + rfid: Optional[ProcessParamsRfid] = None + check_auth: Optional[StrictBool] = Field(default=None, description="This parameter is used to enable authenticity checks", alias="checkAuth") + auth_params: Optional[AuthParams] = Field(default=None, alias="authParams") + mrz_detect_mode: Optional[MrzDetectModeEnum] = Field(default=None, alias="mrzDetectMode") + generate_numeric_codes: Optional[StrictBool] = Field(default=None, description="This parameter is used to generate numeric representation for issuing state and nationality codes", alias="generateNumericCodes") + strict_barcode_digital_signature_check: Optional[StrictBool] = Field(default=None, description="This parameter if enabled will require all necessary certificates to verify digital signature in barcode data to be present in order for the Barcode format check to succeed.", alias="strictBarcodeDigitalSignatureCheck") + select_longest_names: Optional[StrictBool] = Field(default=None, description="Select the longest value from the different value sources and write it to the value field if comparison is done successfully. The parameter applies this logic to the personal names, such as given name, surname, surname and given name, middle name and etc.", alias="selectLongestNames") + do_barcodes: Optional[List[InputBarcodeType]] = Field(default=None, description="Set the types of barcodes to process.", alias="doBarcodes") + strict_dl_category_expiry: Optional[StrictBool] = Field(default=None, description="Set to force DL categories expiry date to affect the overall status or not. As documents usually have their own date of expiry, which might be less or greater than category expiry date, this might be handy for specific cases.", alias="strictDLCategoryExpiry") + __properties: ClassVar[List[str]] = ["generateDTCVC", "lcidFilter", "checkLiveness", "lcidIgnoreFilter", "oneShotIdentification", "useFaceApi", "faceApi", "doDetectCan", "imageOutputMaxHeight", "imageOutputMaxWidth", "scenario", "resultTypeOutput", "doublePageSpread", "generateDoublePageSpreadImage", "fieldTypesFilter", "dateFormat", "measureSystem", "imageDpiOutMax", "alreadyCropped", "customParams", "config", "log", "logLevel", "forceDocID", "matchTextFieldMask", "fastDocDetect", "updateOCRValidityByGlare", "checkRequiredTextFields", "returnCroppedBarcode", "imageQa", "strictImageQuality", "respectImageQuality", "forceDocFormat", "noGraphics", "depersonalizeLog", "multiDocOnImage", "shiftExpiryDate", "minimalHolderAge", "returnUncroppedImage", "mrzFormatsFilter", "forceReadMrzBeforeLocate", "parseBarcodes", "convertCase", "splitNames", "disablePerforationOCR", "documentGroupFilter", "processAuth", "deviceId", "deviceType", "deviceTypeHex", "ignoreDeviceIdFromImage", "documentIdList", "rfid", "checkAuth", "authParams", "mrzDetectMode", "generateNumericCodes", "strictBarcodeDigitalSignatureCheck", "selectLongestNames", "doBarcodes", "strictDLCategoryExpiry"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessParams from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of face_api + if self.face_api: + _dict['faceApi'] = self.face_api.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in config (list) + _items = [] + if self.config: + for _item_config in self.config: + if _item_config: + _items.append(_item_config.to_dict()) + _dict['config'] = _items + # override the default output from pydantic by calling `to_dict()` of image_qa + if self.image_qa: + _dict['imageQa'] = self.image_qa.to_dict() + # override the default output from pydantic by calling `to_dict()` of rfid + if self.rfid: + _dict['rfid'] = self.rfid.to_dict() + # override the default output from pydantic by calling `to_dict()` of auth_params + if self.auth_params: + _dict['authParams'] = self.auth_params.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessParams from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "generateDTCVC": obj.get("generateDTCVC"), + "lcidFilter": obj.get("lcidFilter"), + "checkLiveness": obj.get("checkLiveness"), + "lcidIgnoreFilter": obj.get("lcidIgnoreFilter"), + "oneShotIdentification": obj.get("oneShotIdentification"), + "useFaceApi": obj.get("useFaceApi"), + "faceApi": FaceApi.from_dict(obj["faceApi"]) if obj.get("faceApi") is not None else None, + "doDetectCan": obj.get("doDetectCan"), + "imageOutputMaxHeight": obj.get("imageOutputMaxHeight"), + "imageOutputMaxWidth": obj.get("imageOutputMaxWidth"), + "scenario": obj.get("scenario"), + "resultTypeOutput": obj.get("resultTypeOutput"), + "doublePageSpread": obj.get("doublePageSpread"), + "generateDoublePageSpreadImage": obj.get("generateDoublePageSpreadImage"), + "fieldTypesFilter": obj.get("fieldTypesFilter"), + "dateFormat": obj.get("dateFormat"), + "measureSystem": obj.get("measureSystem"), + "imageDpiOutMax": obj.get("imageDpiOutMax"), + "alreadyCropped": obj.get("alreadyCropped"), + "customParams": obj.get("customParams"), + "config": [PerDocumentConfig.from_dict(_item) for _item in obj["config"]] if obj.get("config") is not None else None, + "log": obj.get("log"), + "logLevel": obj.get("logLevel"), + "forceDocID": obj.get("forceDocID"), + "matchTextFieldMask": obj.get("matchTextFieldMask"), + "fastDocDetect": obj.get("fastDocDetect"), + "updateOCRValidityByGlare": obj.get("updateOCRValidityByGlare"), + "checkRequiredTextFields": obj.get("checkRequiredTextFields"), + "returnCroppedBarcode": obj.get("returnCroppedBarcode"), + "imageQa": ImageQA.from_dict(obj["imageQa"]) if obj.get("imageQa") is not None else None, + "strictImageQuality": obj.get("strictImageQuality"), + "respectImageQuality": obj.get("respectImageQuality"), + "forceDocFormat": obj.get("forceDocFormat"), + "noGraphics": obj.get("noGraphics"), + "depersonalizeLog": obj.get("depersonalizeLog"), + "multiDocOnImage": obj.get("multiDocOnImage"), + "shiftExpiryDate": obj.get("shiftExpiryDate"), + "minimalHolderAge": obj.get("minimalHolderAge"), + "returnUncroppedImage": obj.get("returnUncroppedImage"), + "mrzFormatsFilter": obj.get("mrzFormatsFilter"), + "forceReadMrzBeforeLocate": obj.get("forceReadMrzBeforeLocate"), + "parseBarcodes": obj.get("parseBarcodes"), + "convertCase": obj.get("convertCase"), + "splitNames": obj.get("splitNames"), + "disablePerforationOCR": obj.get("disablePerforationOCR"), + "documentGroupFilter": obj.get("documentGroupFilter"), + "processAuth": obj.get("processAuth"), + "deviceId": obj.get("deviceId"), + "deviceType": obj.get("deviceType"), + "deviceTypeHex": obj.get("deviceTypeHex"), + "ignoreDeviceIdFromImage": obj.get("ignoreDeviceIdFromImage"), + "documentIdList": obj.get("documentIdList"), + "rfid": ProcessParamsRfid.from_dict(obj["rfid"]) if obj.get("rfid") is not None else None, + "checkAuth": obj.get("checkAuth"), + "authParams": AuthParams.from_dict(obj["authParams"]) if obj.get("authParams") is not None else None, + "mrzDetectMode": obj.get("mrzDetectMode"), + "generateNumericCodes": obj.get("generateNumericCodes"), + "strictBarcodeDigitalSignatureCheck": obj.get("strictBarcodeDigitalSignatureCheck"), + "selectLongestNames": obj.get("selectLongestNames"), + "doBarcodes": obj.get("doBarcodes"), + "strictDLCategoryExpiry": obj.get("strictDLCategoryExpiry") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'generate_dtcvc': 'bool', - 'lcid_filter': 'list[int]', - 'lcid_ignore_filter': 'list[int]', - 'one_shot_identification': 'bool', - 'use_face_api': 'bool', - 'face_api': 'FaceApi', - 'do_detect_can': 'bool', - 'image_output_max_height': 'int', - 'image_output_max_width': 'int', - 'scenario': 'Scenario', - 'result_type_output': 'list[Result]', - 'double_page_spread': 'bool', - 'generate_double_page_spread_image': 'bool', - 'field_types_filter': 'list[TextFieldType]', - 'date_format': 'str', - 'measure_system': 'MeasureSystem', - 'image_dpi_out_max': 'int', - 'already_cropped': 'bool', - 'custom_params': 'dict(str, object)', - 'config': 'list[PerDocumentConfig]', - 'log': 'bool', - 'log_level': 'LogLevel', - 'force_doc_id': 'int', - 'match_text_field_mask': 'bool', - 'fast_doc_detect': 'bool', - 'update_ocr_validity_by_glare': 'bool', - 'check_required_text_fields': 'bool', - 'return_cropped_barcode': 'bool', - 'image_qa': 'ImageQA', - 'strict_image_quality': 'bool', - 'respect_image_quality': 'bool', - 'force_doc_format': 'DocumentFormat', - 'no_graphics': 'bool', - 'depersonalize_log': 'bool', - 'multi_doc_on_image': 'bool', - 'shift_expiry_date': 'int', - 'minimal_holder_age': 'int', - 'return_uncropped_image': 'bool', - 'mrz_formats_filter': 'list[MRZFormat]', - 'force_read_mrz_before_locate': 'bool', - 'parse_barcodes': 'bool', - 'convert_case': 'TextPostProcessing', - 'split_names': 'bool', - 'disable_perforation_ocr': 'bool', - 'document_group_filter': 'list[DocumentType]', - 'process_auth': 'int', - 'device_id': 'int', - 'device_type': 'int', - 'device_type_hex': 'str', - 'ignore_device_id_from_image': 'bool', - 'document_id_list': 'list[int]', - 'rfid': 'ProcessParamsRfid', - 'check_auth': 'bool', - 'auth_params': 'AuthParams', - 'mrz_detect_mode': 'MrzDetectModeEnum', - 'generate_numeric_codes': 'bool', - 'strict_barcode_digital_signature_check': 'bool', - 'select_longest_names': 'bool', - 'do_barcodes': 'list[InputBarcodeType]', - 'strict_dl_category_expiry': 'bool' - } - - attribute_map = { - 'generate_dtcvc': 'generateDTCVC', - 'lcid_filter': 'lcidFilter', - 'lcid_ignore_filter': 'lcidIgnoreFilter', - 'one_shot_identification': 'oneShotIdentification', - 'use_face_api': 'useFaceApi', - 'face_api': 'faceApi', - 'do_detect_can': 'doDetectCan', - 'image_output_max_height': 'imageOutputMaxHeight', - 'image_output_max_width': 'imageOutputMaxWidth', - 'scenario': 'scenario', - 'result_type_output': 'resultTypeOutput', - 'double_page_spread': 'doublePageSpread', - 'generate_double_page_spread_image': 'generateDoublePageSpreadImage', - 'field_types_filter': 'fieldTypesFilter', - 'date_format': 'dateFormat', - 'measure_system': 'measureSystem', - 'image_dpi_out_max': 'imageDpiOutMax', - 'already_cropped': 'alreadyCropped', - 'custom_params': 'customParams', - 'config': 'config', - 'log': 'log', - 'log_level': 'logLevel', - 'force_doc_id': 'forceDocID', - 'match_text_field_mask': 'matchTextFieldMask', - 'fast_doc_detect': 'fastDocDetect', - 'update_ocr_validity_by_glare': 'updateOCRValidityByGlare', - 'check_required_text_fields': 'checkRequiredTextFields', - 'return_cropped_barcode': 'returnCroppedBarcode', - 'image_qa': 'imageQa', - 'strict_image_quality': 'strictImageQuality', - 'respect_image_quality': 'respectImageQuality', - 'force_doc_format': 'forceDocFormat', - 'no_graphics': 'noGraphics', - 'depersonalize_log': 'depersonalizeLog', - 'multi_doc_on_image': 'multiDocOnImage', - 'shift_expiry_date': 'shiftExpiryDate', - 'minimal_holder_age': 'minimalHolderAge', - 'return_uncropped_image': 'returnUncroppedImage', - 'mrz_formats_filter': 'mrzFormatsFilter', - 'force_read_mrz_before_locate': 'forceReadMrzBeforeLocate', - 'parse_barcodes': 'parseBarcodes', - 'convert_case': 'convertCase', - 'split_names': 'splitNames', - 'disable_perforation_ocr': 'disablePerforationOCR', - 'document_group_filter': 'documentGroupFilter', - 'process_auth': 'processAuth', - 'device_id': 'deviceId', - 'device_type': 'deviceType', - 'device_type_hex': 'deviceTypeHex', - 'ignore_device_id_from_image': 'ignoreDeviceIdFromImage', - 'document_id_list': 'documentIdList', - 'rfid': 'rfid', - 'check_auth': 'checkAuth', - 'auth_params': 'authParams', - 'mrz_detect_mode': 'mrzDetectMode', - 'generate_numeric_codes': 'generateNumericCodes', - 'strict_barcode_digital_signature_check': 'strictBarcodeDigitalSignatureCheck', - 'select_longest_names': 'selectLongestNames', - 'do_barcodes': 'doBarcodes', - 'strict_dl_category_expiry': 'strictDLCategoryExpiry' - } - - def __init__(self, generate_dtcvc=None, lcid_filter=None, lcid_ignore_filter=None, one_shot_identification=None, use_face_api=None, face_api=None, do_detect_can=None, image_output_max_height=None, image_output_max_width=None, scenario=None, result_type_output=None, double_page_spread=None, generate_double_page_spread_image=None, field_types_filter=None, date_format=None, measure_system=None, image_dpi_out_max=None, already_cropped=None, custom_params=None, config=None, log=None, log_level=None, force_doc_id=None, match_text_field_mask=None, fast_doc_detect=None, update_ocr_validity_by_glare=None, check_required_text_fields=None, return_cropped_barcode=None, image_qa=None, strict_image_quality=None, respect_image_quality=None, force_doc_format=None, no_graphics=None, depersonalize_log=None, multi_doc_on_image=None, shift_expiry_date=None, minimal_holder_age=None, return_uncropped_image=None, mrz_formats_filter=None, force_read_mrz_before_locate=None, parse_barcodes=None, convert_case=None, split_names=None, disable_perforation_ocr=None, document_group_filter=None, process_auth=None, device_id=None, device_type=None, device_type_hex=None, ignore_device_id_from_image=None, document_id_list=None, rfid=None, check_auth=None, auth_params=None, mrz_detect_mode=None, generate_numeric_codes=None, strict_barcode_digital_signature_check=None, select_longest_names=None, do_barcodes=None, strict_dl_category_expiry=None, local_vars_configuration=None): # noqa: E501 - """ProcessParams - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._generate_dtcvc = None - self._lcid_filter = None - self._lcid_ignore_filter = None - self._one_shot_identification = None - self._use_face_api = None - self._face_api = None - self._do_detect_can = None - self._image_output_max_height = None - self._image_output_max_width = None - self._scenario = None - self._result_type_output = None - self._double_page_spread = None - self._generate_double_page_spread_image = None - self._field_types_filter = None - self._date_format = None - self._measure_system = None - self._image_dpi_out_max = None - self._already_cropped = None - self._custom_params = None - self._config = None - self._log = None - self._log_level = None - self._force_doc_id = None - self._match_text_field_mask = None - self._fast_doc_detect = None - self._update_ocr_validity_by_glare = None - self._check_required_text_fields = None - self._return_cropped_barcode = None - self._image_qa = None - self._strict_image_quality = None - self._respect_image_quality = None - self._force_doc_format = None - self._no_graphics = None - self._depersonalize_log = None - self._multi_doc_on_image = None - self._shift_expiry_date = None - self._minimal_holder_age = None - self._return_uncropped_image = None - self._mrz_formats_filter = None - self._force_read_mrz_before_locate = None - self._parse_barcodes = None - self._convert_case = None - self._split_names = None - self._disable_perforation_ocr = None - self._document_group_filter = None - self._process_auth = None - self._device_id = None - self._device_type = None - self._device_type_hex = None - self._ignore_device_id_from_image = None - self._document_id_list = None - self._rfid = None - self._check_auth = None - self._auth_params = None - self._mrz_detect_mode = None - self._generate_numeric_codes = None - self._strict_barcode_digital_signature_check = None - self._select_longest_names = None - self._do_barcodes = None - self._strict_dl_category_expiry = None - self.discriminator = None - - if generate_dtcvc is not None: - self.generate_dtcvc = generate_dtcvc - if lcid_filter is not None: - self.lcid_filter = lcid_filter - if lcid_ignore_filter is not None: - self.lcid_ignore_filter = lcid_ignore_filter - if one_shot_identification is not None: - self.one_shot_identification = one_shot_identification - if use_face_api is not None: - self.use_face_api = use_face_api - if face_api is not None: - self.face_api = face_api - if do_detect_can is not None: - self.do_detect_can = do_detect_can - if image_output_max_height is not None: - self.image_output_max_height = image_output_max_height - if image_output_max_width is not None: - self.image_output_max_width = image_output_max_width - self.scenario = scenario - if result_type_output is not None: - self.result_type_output = result_type_output - if double_page_spread is not None: - self.double_page_spread = double_page_spread - if generate_double_page_spread_image is not None: - self.generate_double_page_spread_image = generate_double_page_spread_image - if field_types_filter is not None: - self.field_types_filter = field_types_filter - if date_format is not None: - self.date_format = date_format - if measure_system is not None: - self.measure_system = measure_system - if image_dpi_out_max is not None: - self.image_dpi_out_max = image_dpi_out_max - if already_cropped is not None: - self.already_cropped = already_cropped - if custom_params is not None: - self.custom_params = custom_params - if config is not None: - self.config = config - if log is not None: - self.log = log - if log_level is not None: - self.log_level = log_level - if force_doc_id is not None: - self.force_doc_id = force_doc_id - if match_text_field_mask is not None: - self.match_text_field_mask = match_text_field_mask - if fast_doc_detect is not None: - self.fast_doc_detect = fast_doc_detect - if update_ocr_validity_by_glare is not None: - self.update_ocr_validity_by_glare = update_ocr_validity_by_glare - if check_required_text_fields is not None: - self.check_required_text_fields = check_required_text_fields - if return_cropped_barcode is not None: - self.return_cropped_barcode = return_cropped_barcode - if image_qa is not None: - self.image_qa = image_qa - if strict_image_quality is not None: - self.strict_image_quality = strict_image_quality - if respect_image_quality is not None: - self.respect_image_quality = respect_image_quality - if force_doc_format is not None: - self.force_doc_format = force_doc_format - if no_graphics is not None: - self.no_graphics = no_graphics - if depersonalize_log is not None: - self.depersonalize_log = depersonalize_log - if multi_doc_on_image is not None: - self.multi_doc_on_image = multi_doc_on_image - if shift_expiry_date is not None: - self.shift_expiry_date = shift_expiry_date - if minimal_holder_age is not None: - self.minimal_holder_age = minimal_holder_age - if return_uncropped_image is not None: - self.return_uncropped_image = return_uncropped_image - if mrz_formats_filter is not None: - self.mrz_formats_filter = mrz_formats_filter - if force_read_mrz_before_locate is not None: - self.force_read_mrz_before_locate = force_read_mrz_before_locate - if parse_barcodes is not None: - self.parse_barcodes = parse_barcodes - if convert_case is not None: - self.convert_case = convert_case - if split_names is not None: - self.split_names = split_names - if disable_perforation_ocr is not None: - self.disable_perforation_ocr = disable_perforation_ocr - if document_group_filter is not None: - self.document_group_filter = document_group_filter - if process_auth is not None: - self.process_auth = process_auth - if device_id is not None: - self.device_id = device_id - if device_type is not None: - self.device_type = device_type - if device_type_hex is not None: - self.device_type_hex = device_type_hex - if ignore_device_id_from_image is not None: - self.ignore_device_id_from_image = ignore_device_id_from_image - if document_id_list is not None: - self.document_id_list = document_id_list - if rfid is not None: - self.rfid = rfid - if check_auth is not None: - self.check_auth = check_auth - if auth_params is not None: - self.auth_params = auth_params - if mrz_detect_mode is not None: - self.mrz_detect_mode = mrz_detect_mode - if generate_numeric_codes is not None: - self.generate_numeric_codes = generate_numeric_codes - if strict_barcode_digital_signature_check is not None: - self.strict_barcode_digital_signature_check = strict_barcode_digital_signature_check - if select_longest_names is not None: - self.select_longest_names = select_longest_names - if do_barcodes is not None: - self.do_barcodes = do_barcodes - if strict_dl_category_expiry is not None: - self.strict_dl_category_expiry = strict_dl_category_expiry - - @property - def generate_dtcvc(self): - """Gets the generate_dtcvc of this ProcessParams. # noqa: E501 - - This parameter is used to generate separate DTC-VC data container from RFID session data. # noqa: E501 - - :return: The generate_dtcvc of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._generate_dtcvc - - @generate_dtcvc.setter - def generate_dtcvc(self, generate_dtcvc): - """Sets the generate_dtcvc of this ProcessParams. - - This parameter is used to generate separate DTC-VC data container from RFID session data. # noqa: E501 - - :param generate_dtcvc: The generate_dtcvc of this ProcessParams. # noqa: E501 - :type generate_dtcvc: bool - """ - - self._generate_dtcvc = generate_dtcvc - - @property - def lcid_filter(self): - """Gets the lcid_filter of this ProcessParams. # noqa: E501 - - The list of LCID types to recognize. If empty, values with all LCID types will be extracted. Empty by default. # noqa: E501 - - :return: The lcid_filter of this ProcessParams. # noqa: E501 - :rtype: list[int] - """ - return self._lcid_filter - - @lcid_filter.setter - def lcid_filter(self, lcid_filter): - """Sets the lcid_filter of this ProcessParams. - - The list of LCID types to recognize. If empty, values with all LCID types will be extracted. Empty by default. # noqa: E501 - - :param lcid_filter: The lcid_filter of this ProcessParams. # noqa: E501 - :type lcid_filter: list[int] - """ - - self._lcid_filter = lcid_filter - - @property - def lcid_ignore_filter(self): - """Gets the lcid_ignore_filter of this ProcessParams. # noqa: E501 - - The list of LCID types to ignore during the recognition. If empty, values with all LCID types will be extracted. Narrowing down the list can reduce processing time. Empty by default. # noqa: E501 - - :return: The lcid_ignore_filter of this ProcessParams. # noqa: E501 - :rtype: list[int] - """ - return self._lcid_ignore_filter - - @lcid_ignore_filter.setter - def lcid_ignore_filter(self, lcid_ignore_filter): - """Sets the lcid_ignore_filter of this ProcessParams. - - The list of LCID types to ignore during the recognition. If empty, values with all LCID types will be extracted. Narrowing down the list can reduce processing time. Empty by default. # noqa: E501 - - :param lcid_ignore_filter: The lcid_ignore_filter of this ProcessParams. # noqa: E501 - :type lcid_ignore_filter: list[int] - """ - - self._lcid_ignore_filter = lcid_ignore_filter - - @property - def one_shot_identification(self): - """Gets the one_shot_identification of this ProcessParams. # noqa: E501 - - This parameter allows processing an image that contains a person and a document and compare the portrait photo from the document with the person's face # noqa: E501 - - :return: The one_shot_identification of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._one_shot_identification - - @one_shot_identification.setter - def one_shot_identification(self, one_shot_identification): - """Sets the one_shot_identification of this ProcessParams. - - This parameter allows processing an image that contains a person and a document and compare the portrait photo from the document with the person's face # noqa: E501 - - :param one_shot_identification: The one_shot_identification of this ProcessParams. # noqa: E501 - :type one_shot_identification: bool - """ - - self._one_shot_identification = one_shot_identification - - @property - def use_face_api(self): - """Gets the use_face_api of this ProcessParams. # noqa: E501 - - This parameter allows comparing faces on Regula Face Web Service # noqa: E501 - - :return: The use_face_api of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._use_face_api - - @use_face_api.setter - def use_face_api(self, use_face_api): - """Sets the use_face_api of this ProcessParams. - - This parameter allows comparing faces on Regula Face Web Service # noqa: E501 - - :param use_face_api: The use_face_api of this ProcessParams. # noqa: E501 - :type use_face_api: bool - """ - - self._use_face_api = use_face_api - - @property - def face_api(self): - """Gets the face_api of this ProcessParams. # noqa: E501 - - - :return: The face_api of this ProcessParams. # noqa: E501 - :rtype: FaceApi - """ - return self._face_api - - @face_api.setter - def face_api(self, face_api): - """Sets the face_api of this ProcessParams. - - - :param face_api: The face_api of this ProcessParams. # noqa: E501 - :type face_api: FaceApi - """ - - self._face_api = face_api - - @property - def do_detect_can(self): - """Gets the do_detect_can of this ProcessParams. # noqa: E501 - - This parameter allows enabling the CAN (Card Access Number) detection and recognition when using scenarios with document location and MRZ reading, such as the MrzAndLocate scenario. # noqa: E501 - - :return: The do_detect_can of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._do_detect_can - - @do_detect_can.setter - def do_detect_can(self, do_detect_can): - """Sets the do_detect_can of this ProcessParams. - - This parameter allows enabling the CAN (Card Access Number) detection and recognition when using scenarios with document location and MRZ reading, such as the MrzAndLocate scenario. # noqa: E501 - - :param do_detect_can: The do_detect_can of this ProcessParams. # noqa: E501 - :type do_detect_can: bool - """ - - self._do_detect_can = do_detect_can - - @property - def image_output_max_height(self): - """Gets the image_output_max_height of this ProcessParams. # noqa: E501 - - This parameter allows setting maximum height in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0. # noqa: E501 - - :return: The image_output_max_height of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._image_output_max_height - - @image_output_max_height.setter - def image_output_max_height(self, image_output_max_height): - """Sets the image_output_max_height of this ProcessParams. - - This parameter allows setting maximum height in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0. # noqa: E501 - - :param image_output_max_height: The image_output_max_height of this ProcessParams. # noqa: E501 - :type image_output_max_height: int - """ - - self._image_output_max_height = image_output_max_height - - @property - def image_output_max_width(self): - """Gets the image_output_max_width of this ProcessParams. # noqa: E501 - - This parameter allows setting maximum width in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0. # noqa: E501 - - :return: The image_output_max_width of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._image_output_max_width - - @image_output_max_width.setter - def image_output_max_width(self, image_output_max_width): - """Sets the image_output_max_width of this ProcessParams. - - This parameter allows setting maximum width in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0. # noqa: E501 - - :param image_output_max_width: The image_output_max_width of this ProcessParams. # noqa: E501 - :type image_output_max_width: int - """ - - self._image_output_max_width = image_output_max_width - - @property - def scenario(self): - """Gets the scenario of this ProcessParams. # noqa: E501 - - - :return: The scenario of this ProcessParams. # noqa: E501 - :rtype: Scenario - """ - return self._scenario - - @scenario.setter - def scenario(self, scenario): - """Sets the scenario of this ProcessParams. - - - :param scenario: The scenario of this ProcessParams. # noqa: E501 - :type scenario: Scenario - """ - if self.local_vars_configuration.client_side_validation and scenario is None: # noqa: E501 - raise ValueError("Invalid value for `scenario`, must not be `None`") # noqa: E501 - - self._scenario = scenario - - @property - def result_type_output(self): - """Gets the result_type_output of this ProcessParams. # noqa: E501 - - Types of results to return in response. See 'Result' enum for available options # noqa: E501 - - :return: The result_type_output of this ProcessParams. # noqa: E501 - :rtype: list[Result] - """ - return self._result_type_output - - @result_type_output.setter - def result_type_output(self, result_type_output): - """Sets the result_type_output of this ProcessParams. - - Types of results to return in response. See 'Result' enum for available options # noqa: E501 - - :param result_type_output: The result_type_output of this ProcessParams. # noqa: E501 - :type result_type_output: list[Result] - """ - - self._result_type_output = result_type_output - - @property - def double_page_spread(self): - """Gets the double_page_spread of this ProcessParams. # noqa: E501 - - Enable this option if the image you provide contains double page spread of the passport and you want to process both pages in one go. It makes sense to use it for documents that have meaningful information on both pages, like Russian domestic passport, or some others. Disabled by default. # noqa: E501 - - :return: The double_page_spread of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._double_page_spread - - @double_page_spread.setter - def double_page_spread(self, double_page_spread): - """Sets the double_page_spread of this ProcessParams. - - Enable this option if the image you provide contains double page spread of the passport and you want to process both pages in one go. It makes sense to use it for documents that have meaningful information on both pages, like Russian domestic passport, or some others. Disabled by default. # noqa: E501 - - :param double_page_spread: The double_page_spread of this ProcessParams. # noqa: E501 - :type double_page_spread: bool - """ - - self._double_page_spread = double_page_spread - - @property - def generate_double_page_spread_image(self): - """Gets the generate_double_page_spread_image of this ProcessParams. # noqa: E501 - - When enabled together with \"doublePageSpread\" and there is a passport with two pages spread in the image, pages will be cropped, straightened and aligned together, as if the document was captured on a flatbed scanner. Disabled by default. # noqa: E501 - - :return: The generate_double_page_spread_image of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._generate_double_page_spread_image - - @generate_double_page_spread_image.setter - def generate_double_page_spread_image(self, generate_double_page_spread_image): - """Sets the generate_double_page_spread_image of this ProcessParams. - - When enabled together with \"doublePageSpread\" and there is a passport with two pages spread in the image, pages will be cropped, straightened and aligned together, as if the document was captured on a flatbed scanner. Disabled by default. # noqa: E501 - - :param generate_double_page_spread_image: The generate_double_page_spread_image of this ProcessParams. # noqa: E501 - :type generate_double_page_spread_image: bool - """ - - self._generate_double_page_spread_image = generate_double_page_spread_image - - @property - def field_types_filter(self): - """Gets the field_types_filter of this ProcessParams. # noqa: E501 - - List of text field types to extract. If empty, all text fields from template will be extracted. Narrowing the list can shorten processing time. Empty by default. # noqa: E501 - - :return: The field_types_filter of this ProcessParams. # noqa: E501 - :rtype: list[TextFieldType] - """ - return self._field_types_filter - - @field_types_filter.setter - def field_types_filter(self, field_types_filter): - """Sets the field_types_filter of this ProcessParams. - - List of text field types to extract. If empty, all text fields from template will be extracted. Narrowing the list can shorten processing time. Empty by default. # noqa: E501 - - :param field_types_filter: The field_types_filter of this ProcessParams. # noqa: E501 - :type field_types_filter: list[TextFieldType] - """ - - self._field_types_filter = field_types_filter - - @property - def date_format(self): - """Gets the date_format of this ProcessParams. # noqa: E501 - - This option allows you to set dates format so that solution will return dates in this format. For example, if you supply 'MM/dd/yyyy', and document have printed date '09 JUL 2020' for the date os issue, you will get '07/09/2020' as a result. By default it is set to system locale default (where the service is running). # noqa: E501 - - :return: The date_format of this ProcessParams. # noqa: E501 - :rtype: str - """ - return self._date_format - - @date_format.setter - def date_format(self, date_format): - """Sets the date_format of this ProcessParams. - - This option allows you to set dates format so that solution will return dates in this format. For example, if you supply 'MM/dd/yyyy', and document have printed date '09 JUL 2020' for the date os issue, you will get '07/09/2020' as a result. By default it is set to system locale default (where the service is running). # noqa: E501 - - :param date_format: The date_format of this ProcessParams. # noqa: E501 - :type date_format: str - """ - - self._date_format = date_format - - @property - def measure_system(self): - """Gets the measure_system of this ProcessParams. # noqa: E501 - - - :return: The measure_system of this ProcessParams. # noqa: E501 - :rtype: MeasureSystem - """ - return self._measure_system - - @measure_system.setter - def measure_system(self, measure_system): - """Sets the measure_system of this ProcessParams. - - - :param measure_system: The measure_system of this ProcessParams. # noqa: E501 - :type measure_system: MeasureSystem - """ - - self._measure_system = measure_system - - @property - def image_dpi_out_max(self): - """Gets the image_dpi_out_max of this ProcessParams. # noqa: E501 - - This parameter controls maximum resolution in dpi of output images. Resolution will remain original in case 0 is supplied. By default is set to return images in response with resolution not greater than 300 dpi for all scenarios except FullAuth. In FullAuth scenario this limit is 1000 dpi by default. # noqa: E501 - - :return: The image_dpi_out_max of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._image_dpi_out_max - - @image_dpi_out_max.setter - def image_dpi_out_max(self, image_dpi_out_max): - """Sets the image_dpi_out_max of this ProcessParams. - - This parameter controls maximum resolution in dpi of output images. Resolution will remain original in case 0 is supplied. By default is set to return images in response with resolution not greater than 300 dpi for all scenarios except FullAuth. In FullAuth scenario this limit is 1000 dpi by default. # noqa: E501 - - :param image_dpi_out_max: The image_dpi_out_max of this ProcessParams. # noqa: E501 - :type image_dpi_out_max: int - """ - - self._image_dpi_out_max = image_dpi_out_max - - @property - def already_cropped(self): - """Gets the already_cropped of this ProcessParams. # noqa: E501 - - This option can be enabled if you know for sure that the image you provide contains already cropped document by its edges. This was designed to process on the server side images captured and cropped on mobile. Disabled by default. # noqa: E501 - - :return: The already_cropped of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._already_cropped - - @already_cropped.setter - def already_cropped(self, already_cropped): - """Sets the already_cropped of this ProcessParams. - - This option can be enabled if you know for sure that the image you provide contains already cropped document by its edges. This was designed to process on the server side images captured and cropped on mobile. Disabled by default. # noqa: E501 - - :param already_cropped: The already_cropped of this ProcessParams. # noqa: E501 - :type already_cropped: bool - """ - - self._already_cropped = already_cropped - - @property - def custom_params(self): - """Gets the custom_params of this ProcessParams. # noqa: E501 - - This option allows passing custom processing parameters that can be implemented in future without changing API. # noqa: E501 - - :return: The custom_params of this ProcessParams. # noqa: E501 - :rtype: dict(str, object) - """ - return self._custom_params - - @custom_params.setter - def custom_params(self, custom_params): - """Sets the custom_params of this ProcessParams. - - This option allows passing custom processing parameters that can be implemented in future without changing API. # noqa: E501 - - :param custom_params: The custom_params of this ProcessParams. # noqa: E501 - :type custom_params: dict(str, object) - """ - - self._custom_params = custom_params - - @property - def config(self): - """Gets the config of this ProcessParams. # noqa: E501 - - This option allows setting additional custom configuration per document type. If recognized document has ID specified in config, processing adjusts according to designated configuration. # noqa: E501 - - :return: The config of this ProcessParams. # noqa: E501 - :rtype: list[PerDocumentConfig] - """ - return self._config - - @config.setter - def config(self, config): - """Sets the config of this ProcessParams. - - This option allows setting additional custom configuration per document type. If recognized document has ID specified in config, processing adjusts according to designated configuration. # noqa: E501 - - :param config: The config of this ProcessParams. # noqa: E501 - :type config: list[PerDocumentConfig] - """ - - self._config = config - - @property - def log(self): - """Gets the log of this ProcessParams. # noqa: E501 - - When enabled, results will contain transaction processing log. Disabled by default # noqa: E501 - - :return: The log of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._log - - @log.setter - def log(self, log): - """Sets the log of this ProcessParams. - - When enabled, results will contain transaction processing log. Disabled by default # noqa: E501 - - :param log: The log of this ProcessParams. # noqa: E501 - :type log: bool - """ - - self._log = log - - @property - def log_level(self): - """Gets the log_level of this ProcessParams. # noqa: E501 - - - :return: The log_level of this ProcessParams. # noqa: E501 - :rtype: LogLevel - """ - return self._log_level - - @log_level.setter - def log_level(self, log_level): - """Sets the log_level of this ProcessParams. - - - :param log_level: The log_level of this ProcessParams. # noqa: E501 - :type log_level: LogLevel - """ - - self._log_level = log_level - - @property - def force_doc_id(self): - """Gets the force_doc_id of this ProcessParams. # noqa: E501 - - Force use of specific template ID and skip document type identification step. # noqa: E501 - - :return: The force_doc_id of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._force_doc_id - - @force_doc_id.setter - def force_doc_id(self, force_doc_id): - """Sets the force_doc_id of this ProcessParams. - - Force use of specific template ID and skip document type identification step. # noqa: E501 - - :param force_doc_id: The force_doc_id of this ProcessParams. # noqa: E501 - :type force_doc_id: int - """ - - self._force_doc_id = force_doc_id - - @property - def match_text_field_mask(self): - """Gets the match_text_field_mask of this ProcessParams. # noqa: E501 - - When disabled, text field OCR will be done as is and then the recognized value will be matched to the field mask for validity. If enabled, we are trying to read a field value with maximum efforts to match the mask and provide a correctly formatted value, making assumptions based on the provided field mask in the template. Enabled by default. # noqa: E501 - - :return: The match_text_field_mask of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._match_text_field_mask - - @match_text_field_mask.setter - def match_text_field_mask(self, match_text_field_mask): - """Sets the match_text_field_mask of this ProcessParams. - - When disabled, text field OCR will be done as is and then the recognized value will be matched to the field mask for validity. If enabled, we are trying to read a field value with maximum efforts to match the mask and provide a correctly formatted value, making assumptions based on the provided field mask in the template. Enabled by default. # noqa: E501 - - :param match_text_field_mask: The match_text_field_mask of this ProcessParams. # noqa: E501 - :type match_text_field_mask: bool - """ - - self._match_text_field_mask = match_text_field_mask - - @property - def fast_doc_detect(self): - """Gets the fast_doc_detect of this ProcessParams. # noqa: E501 - - When enabled, shorten the list of candidates to process during document detection in a single image process mode. Reduces processing time for specific backgrounds. Enabled by default. # noqa: E501 - - :return: The fast_doc_detect of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._fast_doc_detect - - @fast_doc_detect.setter - def fast_doc_detect(self, fast_doc_detect): - """Sets the fast_doc_detect of this ProcessParams. - - When enabled, shorten the list of candidates to process during document detection in a single image process mode. Reduces processing time for specific backgrounds. Enabled by default. # noqa: E501 - - :param fast_doc_detect: The fast_doc_detect of this ProcessParams. # noqa: E501 - :type fast_doc_detect: bool - """ - - self._fast_doc_detect = fast_doc_detect - - @property - def update_ocr_validity_by_glare(self): - """Gets the update_ocr_validity_by_glare of this ProcessParams. # noqa: E501 - - When enabled, fail OCR field validity, if there is a glare over the text field on the image. Disabled by default. # noqa: E501 - - :return: The update_ocr_validity_by_glare of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._update_ocr_validity_by_glare - - @update_ocr_validity_by_glare.setter - def update_ocr_validity_by_glare(self, update_ocr_validity_by_glare): - """Sets the update_ocr_validity_by_glare of this ProcessParams. - - When enabled, fail OCR field validity, if there is a glare over the text field on the image. Disabled by default. # noqa: E501 - - :param update_ocr_validity_by_glare: The update_ocr_validity_by_glare of this ProcessParams. # noqa: E501 - :type update_ocr_validity_by_glare: bool - """ - - self._update_ocr_validity_by_glare = update_ocr_validity_by_glare - - @property - def check_required_text_fields(self): - """Gets the check_required_text_fields of this ProcessParams. # noqa: E501 - - When enabled, each field in template will be checked for value presence and if the field is marked as required, but has no value, it will have 'error' in validity status. Disabled by default. # noqa: E501 - - :return: The check_required_text_fields of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._check_required_text_fields - - @check_required_text_fields.setter - def check_required_text_fields(self, check_required_text_fields): - """Sets the check_required_text_fields of this ProcessParams. - - When enabled, each field in template will be checked for value presence and if the field is marked as required, but has no value, it will have 'error' in validity status. Disabled by default. # noqa: E501 - - :param check_required_text_fields: The check_required_text_fields of this ProcessParams. # noqa: E501 - :type check_required_text_fields: bool - """ - - self._check_required_text_fields = check_required_text_fields - - @property - def return_cropped_barcode(self): - """Gets the return_cropped_barcode of this ProcessParams. # noqa: E501 - - When enabled, returns cropped barcode images for unknown documents. Disabled by default. # noqa: E501 - - :return: The return_cropped_barcode of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._return_cropped_barcode - - @return_cropped_barcode.setter - def return_cropped_barcode(self, return_cropped_barcode): - """Sets the return_cropped_barcode of this ProcessParams. - - When enabled, returns cropped barcode images for unknown documents. Disabled by default. # noqa: E501 - - :param return_cropped_barcode: The return_cropped_barcode of this ProcessParams. # noqa: E501 - :type return_cropped_barcode: bool - """ - - self._return_cropped_barcode = return_cropped_barcode - - @property - def image_qa(self): - """Gets the image_qa of this ProcessParams. # noqa: E501 - - - :return: The image_qa of this ProcessParams. # noqa: E501 - :rtype: ImageQA - """ - return self._image_qa - - @image_qa.setter - def image_qa(self, image_qa): - """Sets the image_qa of this ProcessParams. - - - :param image_qa: The image_qa of this ProcessParams. # noqa: E501 - :type image_qa: ImageQA - """ - - self._image_qa = image_qa - - @property - def strict_image_quality(self): - """Gets the strict_image_quality of this ProcessParams. # noqa: E501 - - When enabled, the image quality check status affects the document optical and overall status. Disabled by default. # noqa: E501 - - :return: The strict_image_quality of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._strict_image_quality - - @strict_image_quality.setter - def strict_image_quality(self, strict_image_quality): - """Sets the strict_image_quality of this ProcessParams. - - When enabled, the image quality check status affects the document optical and overall status. Disabled by default. # noqa: E501 - - :param strict_image_quality: The strict_image_quality of this ProcessParams. # noqa: E501 - :type strict_image_quality: bool - """ - - self._strict_image_quality = strict_image_quality - - @property - def respect_image_quality(self): - """Gets the respect_image_quality of this ProcessParams. # noqa: E501 - - Deprecated. Please use strictImageQuality instead. When enabled, image quality checks status affects document optical and overall status. Disabled by default. # noqa: E501 - - :return: The respect_image_quality of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._respect_image_quality - - @respect_image_quality.setter - def respect_image_quality(self, respect_image_quality): - """Sets the respect_image_quality of this ProcessParams. - - Deprecated. Please use strictImageQuality instead. When enabled, image quality checks status affects document optical and overall status. Disabled by default. # noqa: E501 - - :param respect_image_quality: The respect_image_quality of this ProcessParams. # noqa: E501 - :type respect_image_quality: bool - """ - - self._respect_image_quality = respect_image_quality - - @property - def force_doc_format(self): - """Gets the force_doc_format of this ProcessParams. # noqa: E501 - - - :return: The force_doc_format of this ProcessParams. # noqa: E501 - :rtype: DocumentFormat - """ - return self._force_doc_format - - @force_doc_format.setter - def force_doc_format(self, force_doc_format): - """Sets the force_doc_format of this ProcessParams. - - - :param force_doc_format: The force_doc_format of this ProcessParams. # noqa: E501 - :type force_doc_format: DocumentFormat - """ - - self._force_doc_format = force_doc_format - - @property - def no_graphics(self): - """Gets the no_graphics of this ProcessParams. # noqa: E501 - - When enabled, no graphic fields will be cropped from document image. Disabled by default. # noqa: E501 - - :return: The no_graphics of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._no_graphics - - @no_graphics.setter - def no_graphics(self, no_graphics): - """Sets the no_graphics of this ProcessParams. - - When enabled, no graphic fields will be cropped from document image. Disabled by default. # noqa: E501 - - :param no_graphics: The no_graphics of this ProcessParams. # noqa: E501 - :type no_graphics: bool - """ - - self._no_graphics = no_graphics - - @property - def depersonalize_log(self): - """Gets the depersonalize_log of this ProcessParams. # noqa: E501 - - When enabled, all personal data will be forcibly removed from the logs. Disabled by default. # noqa: E501 - - :return: The depersonalize_log of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._depersonalize_log - - @depersonalize_log.setter - def depersonalize_log(self, depersonalize_log): - """Sets the depersonalize_log of this ProcessParams. - - When enabled, all personal data will be forcibly removed from the logs. Disabled by default. # noqa: E501 - - :param depersonalize_log: The depersonalize_log of this ProcessParams. # noqa: E501 - :type depersonalize_log: bool - """ - - self._depersonalize_log = depersonalize_log - - @property - def multi_doc_on_image(self): - """Gets the multi_doc_on_image of this ProcessParams. # noqa: E501 - - This option allows locating and cropping multiple documents from one image if enabled. Disabled by default. # noqa: E501 - - :return: The multi_doc_on_image of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._multi_doc_on_image - - @multi_doc_on_image.setter - def multi_doc_on_image(self, multi_doc_on_image): - """Sets the multi_doc_on_image of this ProcessParams. - - This option allows locating and cropping multiple documents from one image if enabled. Disabled by default. # noqa: E501 - - :param multi_doc_on_image: The multi_doc_on_image of this ProcessParams. # noqa: E501 - :type multi_doc_on_image: bool - """ - - self._multi_doc_on_image = multi_doc_on_image - - @property - def shift_expiry_date(self): - """Gets the shift_expiry_date of this ProcessParams. # noqa: E501 - - This option allows shifting the date of expiry into the future or past for number of months specified. This is useful, for example, in some cases when document might be still valid for some period after original expiration date to prevent negative validity status for such documents. Or by shifting the date to the past will set negative validity for the documents that is about to expire in a specified number of months. 0 by default # noqa: E501 - - :return: The shift_expiry_date of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._shift_expiry_date - - @shift_expiry_date.setter - def shift_expiry_date(self, shift_expiry_date): - """Sets the shift_expiry_date of this ProcessParams. - - This option allows shifting the date of expiry into the future or past for number of months specified. This is useful, for example, in some cases when document might be still valid for some period after original expiration date to prevent negative validity status for such documents. Or by shifting the date to the past will set negative validity for the documents that is about to expire in a specified number of months. 0 by default # noqa: E501 - - :param shift_expiry_date: The shift_expiry_date of this ProcessParams. # noqa: E501 - :type shift_expiry_date: int - """ - - self._shift_expiry_date = shift_expiry_date - - @property - def minimal_holder_age(self): - """Gets the minimal_holder_age of this ProcessParams. # noqa: E501 - - This options allows specifying the minimal age in years of the document holder for the document to be considered valid. # noqa: E501 - - :return: The minimal_holder_age of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._minimal_holder_age - - @minimal_holder_age.setter - def minimal_holder_age(self, minimal_holder_age): - """Sets the minimal_holder_age of this ProcessParams. - - This options allows specifying the minimal age in years of the document holder for the document to be considered valid. # noqa: E501 - - :param minimal_holder_age: The minimal_holder_age of this ProcessParams. # noqa: E501 - :type minimal_holder_age: int - """ - - self._minimal_holder_age = minimal_holder_age - - @property - def return_uncropped_image(self): - """Gets the return_uncropped_image of this ProcessParams. # noqa: E501 - - When enabled, returns input images in output. Disabled by default. # noqa: E501 - - :return: The return_uncropped_image of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._return_uncropped_image - - @return_uncropped_image.setter - def return_uncropped_image(self, return_uncropped_image): - """Sets the return_uncropped_image of this ProcessParams. - - When enabled, returns input images in output. Disabled by default. # noqa: E501 - - :param return_uncropped_image: The return_uncropped_image of this ProcessParams. # noqa: E501 - :type return_uncropped_image: bool - """ - - self._return_uncropped_image = return_uncropped_image - - @property - def mrz_formats_filter(self): - """Gets the mrz_formats_filter of this ProcessParams. # noqa: E501 - - This option allows limiting MRZ formats to be recognized by specifying them in array. # noqa: E501 - - :return: The mrz_formats_filter of this ProcessParams. # noqa: E501 - :rtype: list[MRZFormat] - """ - return self._mrz_formats_filter - - @mrz_formats_filter.setter - def mrz_formats_filter(self, mrz_formats_filter): - """Sets the mrz_formats_filter of this ProcessParams. - - This option allows limiting MRZ formats to be recognized by specifying them in array. # noqa: E501 - - :param mrz_formats_filter: The mrz_formats_filter of this ProcessParams. # noqa: E501 - :type mrz_formats_filter: list[MRZFormat] - """ - - self._mrz_formats_filter = mrz_formats_filter - - @property - def force_read_mrz_before_locate(self): - """Gets the force_read_mrz_before_locate of this ProcessParams. # noqa: E501 - - When enabled, make sure that in series processing MRZ is located fully inside the result document image, if present on the document. Enabling this option may add extra processing time, by disabling optimizations, but allows more stability in output image quality. Disabled by default. # noqa: E501 - - :return: The force_read_mrz_before_locate of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._force_read_mrz_before_locate - - @force_read_mrz_before_locate.setter - def force_read_mrz_before_locate(self, force_read_mrz_before_locate): - """Sets the force_read_mrz_before_locate of this ProcessParams. - - When enabled, make sure that in series processing MRZ is located fully inside the result document image, if present on the document. Enabling this option may add extra processing time, by disabling optimizations, but allows more stability in output image quality. Disabled by default. # noqa: E501 - - :param force_read_mrz_before_locate: The force_read_mrz_before_locate of this ProcessParams. # noqa: E501 - :type force_read_mrz_before_locate: bool - """ - - self._force_read_mrz_before_locate = force_read_mrz_before_locate - - @property - def parse_barcodes(self): - """Gets the parse_barcodes of this ProcessParams. # noqa: E501 - - This option can be disabled to stop parsing after barcode is read. Enabled by default. # noqa: E501 - - :return: The parse_barcodes of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._parse_barcodes - - @parse_barcodes.setter - def parse_barcodes(self, parse_barcodes): - """Sets the parse_barcodes of this ProcessParams. - - This option can be disabled to stop parsing after barcode is read. Enabled by default. # noqa: E501 - - :param parse_barcodes: The parse_barcodes of this ProcessParams. # noqa: E501 - :type parse_barcodes: bool - """ - - self._parse_barcodes = parse_barcodes - - @property - def convert_case(self): - """Gets the convert_case of this ProcessParams. # noqa: E501 - - - :return: The convert_case of this ProcessParams. # noqa: E501 - :rtype: TextPostProcessing - """ - return self._convert_case - - @convert_case.setter - def convert_case(self, convert_case): - """Sets the convert_case of this ProcessParams. - - - :param convert_case: The convert_case of this ProcessParams. # noqa: E501 - :type convert_case: TextPostProcessing - """ - - self._convert_case = convert_case - - @property - def split_names(self): - """Gets the split_names of this ProcessParams. # noqa: E501 - - When enabled, the Surname and GivenNames fields from MRZ will be divided into ft_First_Name, ft_Second_Name, ft_Third_Name, ft_Fourth_Name, ft_Last_Name fields. Disabled by default. # noqa: E501 - - :return: The split_names of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._split_names - - @split_names.setter - def split_names(self, split_names): - """Sets the split_names of this ProcessParams. - - When enabled, the Surname and GivenNames fields from MRZ will be divided into ft_First_Name, ft_Second_Name, ft_Third_Name, ft_Fourth_Name, ft_Last_Name fields. Disabled by default. # noqa: E501 - - :param split_names: The split_names of this ProcessParams. # noqa: E501 - :type split_names: bool - """ - - self._split_names = split_names - - @property - def disable_perforation_ocr(self): - """Gets the disable_perforation_ocr of this ProcessParams. # noqa: E501 - - When enabled, OCR of perforated fields in the document template will not be performed. Disabled by default. # noqa: E501 - - :return: The disable_perforation_ocr of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._disable_perforation_ocr - - @disable_perforation_ocr.setter - def disable_perforation_ocr(self, disable_perforation_ocr): - """Sets the disable_perforation_ocr of this ProcessParams. - - When enabled, OCR of perforated fields in the document template will not be performed. Disabled by default. # noqa: E501 - - :param disable_perforation_ocr: The disable_perforation_ocr of this ProcessParams. # noqa: E501 - :type disable_perforation_ocr: bool - """ - - self._disable_perforation_ocr = disable_perforation_ocr - - @property - def document_group_filter(self): - """Gets the document_group_filter of this ProcessParams. # noqa: E501 - - List of specific eligible document types from DocumentType enum to recognize from. You may, for example, specify only passports to be recognized by setting this property. Empty by default. # noqa: E501 - - :return: The document_group_filter of this ProcessParams. # noqa: E501 - :rtype: list[DocumentType] - """ - return self._document_group_filter - - @document_group_filter.setter - def document_group_filter(self, document_group_filter): - """Sets the document_group_filter of this ProcessParams. - - List of specific eligible document types from DocumentType enum to recognize from. You may, for example, specify only passports to be recognized by setting this property. Empty by default. # noqa: E501 - - :param document_group_filter: The document_group_filter of this ProcessParams. # noqa: E501 - :type document_group_filter: list[DocumentType] - """ - - self._document_group_filter = document_group_filter - - @property - def process_auth(self): - """Gets the process_auth of this ProcessParams. # noqa: E501 - - Authenticity checks that should be performed regardless of the document type. The available checks are listed in the eRPRM_Authenticity enum. Note that only supported by your license checks can be added. # noqa: E501 - - :return: The process_auth of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._process_auth - - @process_auth.setter - def process_auth(self, process_auth): - """Sets the process_auth of this ProcessParams. - - Authenticity checks that should be performed regardless of the document type. The available checks are listed in the eRPRM_Authenticity enum. Note that only supported by your license checks can be added. # noqa: E501 - - :param process_auth: The process_auth of this ProcessParams. # noqa: E501 - :type process_auth: int - """ - - self._process_auth = process_auth - - @property - def device_id(self): - """Gets the device_id of this ProcessParams. # noqa: E501 - - This parameter is used to specify the document reader device type from which input images were captured. Default 0. # noqa: E501 - - :return: The device_id of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._device_id - - @device_id.setter - def device_id(self, device_id): - """Sets the device_id of this ProcessParams. - - This parameter is used to specify the document reader device type from which input images were captured. Default 0. # noqa: E501 - - :param device_id: The device_id of this ProcessParams. # noqa: E501 - :type device_id: int - """ - - self._device_id = device_id - - @property - def device_type(self): - """Gets the device_type of this ProcessParams. # noqa: E501 - - This parameter is used to specify the document reader device type from which input images were captured. Default 0. # noqa: E501 - - :return: The device_type of this ProcessParams. # noqa: E501 - :rtype: int - """ - return self._device_type - - @device_type.setter - def device_type(self, device_type): - """Sets the device_type of this ProcessParams. - - This parameter is used to specify the document reader device type from which input images were captured. Default 0. # noqa: E501 - - :param device_type: The device_type of this ProcessParams. # noqa: E501 - :type device_type: int - """ - - self._device_type = device_type - - @property - def device_type_hex(self): - """Gets the device_type_hex of this ProcessParams. # noqa: E501 - - This parameter is used to specify the document reader device type from which input images were captured # noqa: E501 - - :return: The device_type_hex of this ProcessParams. # noqa: E501 - :rtype: str - """ - return self._device_type_hex - - @device_type_hex.setter - def device_type_hex(self, device_type_hex): - """Sets the device_type_hex of this ProcessParams. - - This parameter is used to specify the document reader device type from which input images were captured # noqa: E501 - - :param device_type_hex: The device_type_hex of this ProcessParams. # noqa: E501 - :type device_type_hex: str - """ - - self._device_type_hex = device_type_hex - - @property - def ignore_device_id_from_image(self): - """Gets the ignore_device_id_from_image of this ProcessParams. # noqa: E501 - - This parameter is used to tell the processing engine to ignore any parameters saved in the image when scanned from the document reader device. Default false # noqa: E501 - - :return: The ignore_device_id_from_image of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._ignore_device_id_from_image - - @ignore_device_id_from_image.setter - def ignore_device_id_from_image(self, ignore_device_id_from_image): - """Sets the ignore_device_id_from_image of this ProcessParams. - - This parameter is used to tell the processing engine to ignore any parameters saved in the image when scanned from the document reader device. Default false # noqa: E501 - - :param ignore_device_id_from_image: The ignore_device_id_from_image of this ProcessParams. # noqa: E501 - :type ignore_device_id_from_image: bool - """ - - self._ignore_device_id_from_image = ignore_device_id_from_image - - @property - def document_id_list(self): - """Gets the document_id_list of this ProcessParams. # noqa: E501 - - List of the document ID's to process. All documents will be processed, if empty. # noqa: E501 - - :return: The document_id_list of this ProcessParams. # noqa: E501 - :rtype: list[int] - """ - return self._document_id_list - - @document_id_list.setter - def document_id_list(self, document_id_list): - """Sets the document_id_list of this ProcessParams. - - List of the document ID's to process. All documents will be processed, if empty. # noqa: E501 - - :param document_id_list: The document_id_list of this ProcessParams. # noqa: E501 - :type document_id_list: list[int] - """ - - self._document_id_list = document_id_list - - @property - def rfid(self): - """Gets the rfid of this ProcessParams. # noqa: E501 - - - :return: The rfid of this ProcessParams. # noqa: E501 - :rtype: ProcessParamsRfid - """ - return self._rfid - - @rfid.setter - def rfid(self, rfid): - """Sets the rfid of this ProcessParams. - - - :param rfid: The rfid of this ProcessParams. # noqa: E501 - :type rfid: ProcessParamsRfid - """ - - self._rfid = rfid - - @property - def check_auth(self): - """Gets the check_auth of this ProcessParams. # noqa: E501 - - This parameter is used to enable authenticity checks # noqa: E501 - - :return: The check_auth of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._check_auth - - @check_auth.setter - def check_auth(self, check_auth): - """Sets the check_auth of this ProcessParams. - - This parameter is used to enable authenticity checks # noqa: E501 - - :param check_auth: The check_auth of this ProcessParams. # noqa: E501 - :type check_auth: bool - """ - - self._check_auth = check_auth - - @property - def auth_params(self): - """Gets the auth_params of this ProcessParams. # noqa: E501 - - - :return: The auth_params of this ProcessParams. # noqa: E501 - :rtype: AuthParams - """ - return self._auth_params - - @auth_params.setter - def auth_params(self, auth_params): - """Sets the auth_params of this ProcessParams. - - - :param auth_params: The auth_params of this ProcessParams. # noqa: E501 - :type auth_params: AuthParams - """ - - self._auth_params = auth_params - - @property - def mrz_detect_mode(self): - """Gets the mrz_detect_mode of this ProcessParams. # noqa: E501 - - - :return: The mrz_detect_mode of this ProcessParams. # noqa: E501 - :rtype: MrzDetectModeEnum - """ - return self._mrz_detect_mode - - @mrz_detect_mode.setter - def mrz_detect_mode(self, mrz_detect_mode): - """Sets the mrz_detect_mode of this ProcessParams. - - - :param mrz_detect_mode: The mrz_detect_mode of this ProcessParams. # noqa: E501 - :type mrz_detect_mode: MrzDetectModeEnum - """ - - self._mrz_detect_mode = mrz_detect_mode - - @property - def generate_numeric_codes(self): - """Gets the generate_numeric_codes of this ProcessParams. # noqa: E501 - - This parameter is used to generate numeric representation for issuing state and nationality codes # noqa: E501 - - :return: The generate_numeric_codes of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._generate_numeric_codes - - @generate_numeric_codes.setter - def generate_numeric_codes(self, generate_numeric_codes): - """Sets the generate_numeric_codes of this ProcessParams. - - This parameter is used to generate numeric representation for issuing state and nationality codes # noqa: E501 - - :param generate_numeric_codes: The generate_numeric_codes of this ProcessParams. # noqa: E501 - :type generate_numeric_codes: bool - """ - - self._generate_numeric_codes = generate_numeric_codes - - @property - def strict_barcode_digital_signature_check(self): - """Gets the strict_barcode_digital_signature_check of this ProcessParams. # noqa: E501 - - This parameter if enabled will require all necessary certificates to verify digital signature in barcode data to be present in order for the Barcode format check to succeed. # noqa: E501 - - :return: The strict_barcode_digital_signature_check of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._strict_barcode_digital_signature_check - - @strict_barcode_digital_signature_check.setter - def strict_barcode_digital_signature_check(self, strict_barcode_digital_signature_check): - """Sets the strict_barcode_digital_signature_check of this ProcessParams. - - This parameter if enabled will require all necessary certificates to verify digital signature in barcode data to be present in order for the Barcode format check to succeed. # noqa: E501 - - :param strict_barcode_digital_signature_check: The strict_barcode_digital_signature_check of this ProcessParams. # noqa: E501 - :type strict_barcode_digital_signature_check: bool - """ - - self._strict_barcode_digital_signature_check = strict_barcode_digital_signature_check - - @property - def select_longest_names(self): - """Gets the select_longest_names of this ProcessParams. # noqa: E501 - - Select the longest value from the different value sources and write it to the value field if comparison is done successfully. The parameter applies this logic to the personal names, such as given name, surname, surname and given name, middle name and etc. # noqa: E501 - - :return: The select_longest_names of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._select_longest_names - - @select_longest_names.setter - def select_longest_names(self, select_longest_names): - """Sets the select_longest_names of this ProcessParams. - - Select the longest value from the different value sources and write it to the value field if comparison is done successfully. The parameter applies this logic to the personal names, such as given name, surname, surname and given name, middle name and etc. # noqa: E501 - - :param select_longest_names: The select_longest_names of this ProcessParams. # noqa: E501 - :type select_longest_names: bool - """ - - self._select_longest_names = select_longest_names - - @property - def do_barcodes(self): - """Gets the do_barcodes of this ProcessParams. # noqa: E501 - - Set the types of barcodes to process. # noqa: E501 - - :return: The do_barcodes of this ProcessParams. # noqa: E501 - :rtype: list[InputBarcodeType] - """ - return self._do_barcodes - - @do_barcodes.setter - def do_barcodes(self, do_barcodes): - """Sets the do_barcodes of this ProcessParams. - - Set the types of barcodes to process. # noqa: E501 - - :param do_barcodes: The do_barcodes of this ProcessParams. # noqa: E501 - :type do_barcodes: list[InputBarcodeType] - """ - - self._do_barcodes = do_barcodes - - @property - def strict_dl_category_expiry(self): - """Gets the strict_dl_category_expiry of this ProcessParams. # noqa: E501 - - Set to force DL categories expiry date to affect the overall status or not. As documents usually have their own date of expiry, which might be less or greater than category expiry date, this might be handy for specific cases. # noqa: E501 - - :return: The strict_dl_category_expiry of this ProcessParams. # noqa: E501 - :rtype: bool - """ - return self._strict_dl_category_expiry - - @strict_dl_category_expiry.setter - def strict_dl_category_expiry(self, strict_dl_category_expiry): - """Sets the strict_dl_category_expiry of this ProcessParams. - - Set to force DL categories expiry date to affect the overall status or not. As documents usually have their own date of expiry, which might be less or greater than category expiry date, this might be handy for specific cases. # noqa: E501 - - :param strict_dl_category_expiry: The strict_dl_category_expiry of this ProcessParams. # noqa: E501 - :type strict_dl_category_expiry: bool - """ - - self._strict_dl_category_expiry = strict_dl_category_expiry - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessParams): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessParams): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_params_rfid.py b/regula/documentreader/webclient/gen/models/process_params_rfid.py index 4d679b8..d42f84e 100644 --- a/regula/documentreader/webclient/gen/models/process_params_rfid.py +++ b/regula/documentreader/webclient/gen/models/process_params_rfid.py @@ -4,118 +4,77 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Params for the RFID chip data reprocessing -""" -class ProcessParamsRfid(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ProcessParamsRfid(BaseModel): """ + Params for the RFID chip data reprocessing + """ # noqa: E501 + pa_sensitive_codes_disable: Optional[List[ParsingNotificationCodes]] = Field(default=None, description="A list of notification codes that should be ignored during passive authentication (PA)", alias="paSensitiveCodesDisable") + __properties: ClassVar[List[str]] = ["paSensitiveCodesDisable"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'pa_sensitive_codes_disable': 'list[ParsingNotificationCodes]' - } + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - attribute_map = { - 'pa_sensitive_codes_disable': 'paSensitiveCodesDisable' - } - def __init__(self, pa_sensitive_codes_disable=None, local_vars_configuration=None): # noqa: E501 - """ProcessParamsRfid - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - self._pa_sensitive_codes_disable = None - self.discriminator = None + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - if pa_sensitive_codes_disable is not None: - self.pa_sensitive_codes_disable = pa_sensitive_codes_disable + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessParamsRfid from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @property - def pa_sensitive_codes_disable(self): - """Gets the pa_sensitive_codes_disable of this ProcessParamsRfid. # noqa: E501 + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - A list of notification codes that should be ignored during passive authentication (PA) # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :return: The pa_sensitive_codes_disable of this ProcessParamsRfid. # noqa: E501 - :rtype: list[ParsingNotificationCodes] + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._pa_sensitive_codes_disable + excluded_fields: Set[str] = set([ + ]) - @pa_sensitive_codes_disable.setter - def pa_sensitive_codes_disable(self, pa_sensitive_codes_disable): - """Sets the pa_sensitive_codes_disable of this ProcessParamsRfid. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - A list of notification codes that should be ignored during passive authentication (PA) # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessParamsRfid from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "paSensitiveCodesDisable": obj.get("paSensitiveCodesDisable") + }) + return _obj - :param pa_sensitive_codes_disable: The pa_sensitive_codes_disable of this ProcessParamsRfid. # noqa: E501 - :type pa_sensitive_codes_disable: list[ParsingNotificationCodes] - """ - self._pa_sensitive_codes_disable = pa_sensitive_codes_disable - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessParamsRfid): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessParamsRfid): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_request.py b/regula/documentreader/webclient/gen/models/process_request.py old mode 100755 new mode 100644 index a83294c..a552f50 --- a/regula/documentreader/webclient/gen/models/process_request.py +++ b/regula/documentreader/webclient/gen/models/process_request.py @@ -4,419 +4,121 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.lcid import LCID +from regula.documentreader.webclient.gen.models.process_params import ProcessParams +from regula.documentreader.webclient.gen.models.process_request_image import ProcessRequestImage +from regula.documentreader.webclient.gen.models.process_system_info import ProcessSystemInfo +from typing import Optional, Set +from typing_extensions import Self + +class ProcessRequest(BaseModel): """ + ProcessRequest + """ # noqa: E501 + process_param: ProcessParams = Field(alias="processParam") + list: Optional[List[ProcessRequestImage]] = Field(default=None, alias="List") + tag: Optional[StrictStr] = Field(default=None, description="Session ID") + tenant: Optional[StrictStr] = Field(default=None, description="Customer name") + env: Optional[StrictStr] = Field(default=None, description="Environment type") + live_portrait: Optional[StrictStr] = Field(default=None, description="Live portrait photo", alias="livePortrait") + ext_portrait: Optional[StrictStr] = Field(default=None, description="Portrait photo from an external source", alias="extPortrait") + container_list: Optional[ContainerList] = Field(default=None, alias="ContainerList") + system_info: Optional[ProcessSystemInfo] = Field(default=None, alias="systemInfo") + pass_back_object: Optional[Dict[str, Any]] = Field(default=None, description="Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs.", alias="passBackObject") + dtc: Optional[StrictStr] = Field(default=None, description="Digital Travel Credential (DTC-VC) data in base64 format for processing") + image_urls: Optional[List[StrictStr]] = Field(default=None, description="URLs to the document images for processing.", alias="ImageUrls") + lcid_filter: Optional[List[LCID]] = Field(default=None, description="The list of LCID types to recognize. If empty, values with all LCID types will be extracted. Empty by default.", alias="lcidFilter") + __properties: ClassVar[List[str]] = ["processParam", "List", "tag", "tenant", "env", "livePortrait", "extPortrait", "ContainerList", "systemInfo", "passBackObject", "dtc", "ImageUrls", "lcidFilter"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of process_param + if self.process_param: + _dict['processParam'] = self.process_param.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + # override the default output from pydantic by calling `to_dict()` of container_list + if self.container_list: + _dict['ContainerList'] = self.container_list.to_dict() + # override the default output from pydantic by calling `to_dict()` of system_info + if self.system_info: + _dict['systemInfo'] = self.system_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "processParam": ProcessParams.from_dict(obj["processParam"]) if obj.get("processParam") is not None else None, + "List": [ProcessRequestImage.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None, + "tag": obj.get("tag"), + "tenant": obj.get("tenant"), + "env": obj.get("env"), + "livePortrait": obj.get("livePortrait"), + "extPortrait": obj.get("extPortrait"), + "ContainerList": ContainerList.from_dict(obj["ContainerList"]) if obj.get("ContainerList") is not None else None, + "systemInfo": ProcessSystemInfo.from_dict(obj["systemInfo"]) if obj.get("systemInfo") is not None else None, + "passBackObject": obj.get("passBackObject"), + "dtc": obj.get("dtc"), + "ImageUrls": obj.get("ImageUrls"), + "lcidFilter": obj.get("lcidFilter") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'process_param': 'ProcessParams', - 'list': 'list[ProcessRequestImage]', - 'tag': 'str', - 'tenant': 'str', - 'env': 'str', - 'live_portrait': 'str', - 'ext_portrait': 'str', - 'container_list': 'ContainerList', - 'system_info': 'ProcessSystemInfo', - 'pass_back_object': 'dict(str, object)', - 'dtc': 'str', - 'image_urls': 'list[str]' - } - - attribute_map = { - 'process_param': 'processParam', - 'list': 'List', - 'tag': 'tag', - 'tenant': 'tenant', - 'env': 'env', - 'live_portrait': 'livePortrait', - 'ext_portrait': 'extPortrait', - 'container_list': 'ContainerList', - 'system_info': 'systemInfo', - 'pass_back_object': 'passBackObject', - 'dtc': 'dtc', - 'image_urls': 'ImageUrls' - } - - def __init__(self, process_param=None, list=None, tag=None, tenant=None, env=None, live_portrait=None, ext_portrait=None, container_list=None, system_info=None, pass_back_object=None, dtc=None, image_urls=None, local_vars_configuration=None): # noqa: E501 - """ProcessRequest - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._process_param = None - self._list = None - self._tag = None - self._tenant = None - self._env = None - self._live_portrait = None - self._ext_portrait = None - self._container_list = None - self._system_info = None - self._pass_back_object = None - self._dtc = None - self._image_urls = None - self.discriminator = None - - self.process_param = process_param - if list is not None: - self.list = list - if tag is not None: - self.tag = tag - if tenant is not None: - self.tenant = tenant - if env is not None: - self.env = env - if live_portrait is not None: - self.live_portrait = live_portrait - if ext_portrait is not None: - self.ext_portrait = ext_portrait - if container_list is not None: - self.container_list = container_list - if system_info is not None: - self.system_info = system_info - if pass_back_object is not None: - self.pass_back_object = pass_back_object - if dtc is not None: - self.dtc = dtc - if image_urls is not None: - self.image_urls = image_urls - - @property - def process_param(self): - """Gets the process_param of this ProcessRequest. # noqa: E501 - - - :return: The process_param of this ProcessRequest. # noqa: E501 - :rtype: ProcessParams - """ - return self._process_param - - @process_param.setter - def process_param(self, process_param): - """Sets the process_param of this ProcessRequest. - - - :param process_param: The process_param of this ProcessRequest. # noqa: E501 - :type process_param: ProcessParams - """ - if self.local_vars_configuration.client_side_validation and process_param is None: # noqa: E501 - raise ValueError("Invalid value for `process_param`, must not be `None`") # noqa: E501 - - self._process_param = process_param - - @property - def list(self): - """Gets the list of this ProcessRequest. # noqa: E501 - - - :return: The list of this ProcessRequest. # noqa: E501 - :rtype: list[ProcessRequestImage] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this ProcessRequest. - - - :param list: The list of this ProcessRequest. # noqa: E501 - :type list: list[ProcessRequestImage] - """ - - self._list = list - - @property - def tag(self): - """Gets the tag of this ProcessRequest. # noqa: E501 - - Session ID # noqa: E501 - - :return: The tag of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._tag - - @tag.setter - def tag(self, tag): - """Sets the tag of this ProcessRequest. - - Session ID # noqa: E501 - - :param tag: The tag of this ProcessRequest. # noqa: E501 - :type tag: str - """ - - self._tag = tag - - @property - def tenant(self): - """Gets the tenant of this ProcessRequest. # noqa: E501 - - Customer name # noqa: E501 - - :return: The tenant of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._tenant - - @tenant.setter - def tenant(self, tenant): - """Sets the tenant of this ProcessRequest. - - Customer name # noqa: E501 - - :param tenant: The tenant of this ProcessRequest. # noqa: E501 - :type tenant: str - """ - - self._tenant = tenant - - @property - def env(self): - """Gets the env of this ProcessRequest. # noqa: E501 - - Environment type # noqa: E501 - - :return: The env of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._env - - @env.setter - def env(self, env): - """Sets the env of this ProcessRequest. - - Environment type # noqa: E501 - - :param env: The env of this ProcessRequest. # noqa: E501 - :type env: str - """ - - self._env = env - - @property - def live_portrait(self): - """Gets the live_portrait of this ProcessRequest. # noqa: E501 - - Live portrait photo # noqa: E501 - - :return: The live_portrait of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._live_portrait - - @live_portrait.setter - def live_portrait(self, live_portrait): - """Sets the live_portrait of this ProcessRequest. - - Live portrait photo # noqa: E501 - - :param live_portrait: The live_portrait of this ProcessRequest. # noqa: E501 - :type live_portrait: str - """ - - self._live_portrait = live_portrait - - @property - def ext_portrait(self): - """Gets the ext_portrait of this ProcessRequest. # noqa: E501 - - Portrait photo from an external source # noqa: E501 - - :return: The ext_portrait of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._ext_portrait - - @ext_portrait.setter - def ext_portrait(self, ext_portrait): - """Sets the ext_portrait of this ProcessRequest. - - Portrait photo from an external source # noqa: E501 - - :param ext_portrait: The ext_portrait of this ProcessRequest. # noqa: E501 - :type ext_portrait: str - """ - - self._ext_portrait = ext_portrait - - @property - def container_list(self): - """Gets the container_list of this ProcessRequest. # noqa: E501 - - - :return: The container_list of this ProcessRequest. # noqa: E501 - :rtype: ContainerList - """ - return self._container_list - - @container_list.setter - def container_list(self, container_list): - """Sets the container_list of this ProcessRequest. - - - :param container_list: The container_list of this ProcessRequest. # noqa: E501 - :type container_list: ContainerList - """ - - self._container_list = container_list - - @property - def system_info(self): - """Gets the system_info of this ProcessRequest. # noqa: E501 - - - :return: The system_info of this ProcessRequest. # noqa: E501 - :rtype: ProcessSystemInfo - """ - return self._system_info - - @system_info.setter - def system_info(self, system_info): - """Sets the system_info of this ProcessRequest. - - - :param system_info: The system_info of this ProcessRequest. # noqa: E501 - :type system_info: ProcessSystemInfo - """ - - self._system_info = system_info - - @property - def pass_back_object(self): - """Gets the pass_back_object of this ProcessRequest. # noqa: E501 - - Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs. # noqa: E501 - - :return: The pass_back_object of this ProcessRequest. # noqa: E501 - :rtype: dict(str, object) - """ - return self._pass_back_object - - @pass_back_object.setter - def pass_back_object(self, pass_back_object): - """Sets the pass_back_object of this ProcessRequest. - - Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs. # noqa: E501 - - :param pass_back_object: The pass_back_object of this ProcessRequest. # noqa: E501 - :type pass_back_object: dict(str, object) - """ - - self._pass_back_object = pass_back_object - - @property - def dtc(self): - """Gets the dtc of this ProcessRequest. # noqa: E501 - - Digital Travel Credential (DTC-VC) data in base64 format for processing # noqa: E501 - - :return: The dtc of this ProcessRequest. # noqa: E501 - :rtype: str - """ - return self._dtc - - @dtc.setter - def dtc(self, dtc): - """Sets the dtc of this ProcessRequest. - - Digital Travel Credential (DTC-VC) data in base64 format for processing # noqa: E501 - - :param dtc: The dtc of this ProcessRequest. # noqa: E501 - :type dtc: str - """ - - self._dtc = dtc - - @property - def image_urls(self): - """Gets the image_urls of this ProcessRequest. # noqa: E501 - - URLs to the document images for processing. # noqa: E501 - - :return: The image_urls of this ProcessRequest. # noqa: E501 - :rtype: list[str] - """ - return self._image_urls - - @image_urls.setter - def image_urls(self, image_urls): - """Sets the image_urls of this ProcessRequest. - - URLs to the document images for processing. # noqa: E501 - - :param image_urls: The image_urls of this ProcessRequest. # noqa: E501 - :type image_urls: list[str] - """ - - self._image_urls = image_urls - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessRequest): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessRequest): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_request_image.py b/regula/documentreader/webclient/gen/models/process_request_image.py old mode 100755 new mode 100644 index 6cd2c40..8a78a61 --- a/regula/documentreader/webclient/gen/models/process_request_image.py +++ b/regula/documentreader/webclient/gen/models/process_request_image.py @@ -4,170 +4,85 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessRequestImage(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.image_data import ImageData +from regula.documentreader.webclient.gen.models.light import Light +from typing import Optional, Set +from typing_extensions import Self +class ProcessRequestImage(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'image_data': 'ImageData', - 'light': 'Light', - 'page_idx': 'int' - } - - attribute_map = { - 'image_data': 'ImageData', - 'light': 'light', - 'page_idx': 'page_idx' - } - - def __init__(self, image_data=None, light=None, page_idx=None, local_vars_configuration=None): # noqa: E501 - """ProcessRequestImage - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._image_data = None - self._light = None - self._page_idx = None - self.discriminator = None - - if image_data is not None: - self.image_data = image_data - if light is not None: - self.light = light - if page_idx is not None: - self.page_idx = page_idx - - @property - def image_data(self): - """Gets the image_data of this ProcessRequestImage. # noqa: E501 - - - :return: The image_data of this ProcessRequestImage. # noqa: E501 - :rtype: ImageData - """ - return self._image_data - - @image_data.setter - def image_data(self, image_data): - """Sets the image_data of this ProcessRequestImage. - - - :param image_data: The image_data of this ProcessRequestImage. # noqa: E501 - :type image_data: ImageData - """ - - self._image_data = image_data - - @property - def light(self): - """Gets the light of this ProcessRequestImage. # noqa: E501 - - - :return: The light of this ProcessRequestImage. # noqa: E501 - :rtype: Light - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ProcessRequestImage. - - - :param light: The light of this ProcessRequestImage. # noqa: E501 - :type light: Light + ProcessRequestImage + """ # noqa: E501 + image_data: Optional[ImageData] = Field(default=None, alias="ImageData") + light: Optional[Light] = None + page_idx: Optional[StrictInt] = Field(default=None, description="page/image number") + __properties: ClassVar[List[str]] = ["ImageData", "light", "page_idx"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessRequestImage from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of image_data + if self.image_data: + _dict['ImageData'] = self.image_data.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessRequestImage from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ImageData": ImageData.from_dict(obj["ImageData"]) if obj.get("ImageData") is not None else None, + "light": obj.get("light"), + "page_idx": obj.get("page_idx") + }) + return _obj - self._light = light - - @property - def page_idx(self): - """Gets the page_idx of this ProcessRequestImage. # noqa: E501 - - page/image number # noqa: E501 - - :return: The page_idx of this ProcessRequestImage. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ProcessRequestImage. - - page/image number # noqa: E501 - - :param page_idx: The page_idx of this ProcessRequestImage. # noqa: E501 - :type page_idx: int - """ - self._page_idx = page_idx - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessRequestImage): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessRequestImage): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_response.py b/regula/documentreader/webclient/gen/models/process_response.py old mode 100755 new mode 100644 index 2514753..c5ab3d7 --- a/regula/documentreader/webclient/gen/models/process_response.py +++ b/regula/documentreader/webclient/gen/models/process_response.py @@ -4,307 +4,104 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.processing_status import ProcessingStatus +from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation +from regula.documentreader.webclient.gen.models.transaction_info import TransactionInfo +from typing import Optional, Set +from typing_extensions import Self + +class ProcessResponse(BaseModel): """ - openapi_types = { - 'chip_page': 'RfidLocation', - 'processing_finished': 'ProcessingStatus', - 'container_list': 'ContainerList', - 'transaction_info': 'TransactionInfo', - 'log': 'str', - 'pass_back_object': 'dict(str, object)', - 'more_pages_available': 'int', - 'elapsed_time': 'int' - } - - attribute_map = { - 'chip_page': 'ChipPage', - 'processing_finished': 'ProcessingFinished', - 'container_list': 'ContainerList', - 'transaction_info': 'TransactionInfo', - 'log': 'log', - 'pass_back_object': 'passBackObject', - 'more_pages_available': 'morePagesAvailable', - 'elapsed_time': 'elapsedTime' - } - - def __init__(self, chip_page=None, processing_finished=None, container_list=None, transaction_info=None, log=None, pass_back_object=None, more_pages_available=None, elapsed_time=None, local_vars_configuration=None): # noqa: E501 - """ProcessResponse - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._chip_page = None - self._processing_finished = None - self._container_list = None - self._transaction_info = None - self._log = None - self._pass_back_object = None - self._more_pages_available = None - self._elapsed_time = None - self.discriminator = None - - if chip_page is not None: - self.chip_page = chip_page - self.processing_finished = processing_finished - self.container_list = container_list - self.transaction_info = transaction_info - if log is not None: - self.log = log - if pass_back_object is not None: - self.pass_back_object = pass_back_object - if more_pages_available is not None: - self.more_pages_available = more_pages_available - if elapsed_time is not None: - self.elapsed_time = elapsed_time - - @property - def chip_page(self): - """Gets the chip_page of this ProcessResponse. # noqa: E501 - - - :return: The chip_page of this ProcessResponse. # noqa: E501 - :rtype: RfidLocation - """ - return self._chip_page - - @chip_page.setter - def chip_page(self, chip_page): - """Sets the chip_page of this ProcessResponse. - - - :param chip_page: The chip_page of this ProcessResponse. # noqa: E501 - :type chip_page: RfidLocation - """ - - self._chip_page = chip_page - - @property - def processing_finished(self): - """Gets the processing_finished of this ProcessResponse. # noqa: E501 - - - :return: The processing_finished of this ProcessResponse. # noqa: E501 - :rtype: ProcessingStatus - """ - return self._processing_finished - - @processing_finished.setter - def processing_finished(self, processing_finished): - """Sets the processing_finished of this ProcessResponse. - - - :param processing_finished: The processing_finished of this ProcessResponse. # noqa: E501 - :type processing_finished: ProcessingStatus - """ - if self.local_vars_configuration.client_side_validation and processing_finished is None: # noqa: E501 - raise ValueError("Invalid value for `processing_finished`, must not be `None`") # noqa: E501 - - self._processing_finished = processing_finished - - @property - def container_list(self): - """Gets the container_list of this ProcessResponse. # noqa: E501 - - - :return: The container_list of this ProcessResponse. # noqa: E501 - :rtype: ContainerList - """ - return self._container_list - - @container_list.setter - def container_list(self, container_list): - """Sets the container_list of this ProcessResponse. - - - :param container_list: The container_list of this ProcessResponse. # noqa: E501 - :type container_list: ContainerList - """ - if self.local_vars_configuration.client_side_validation and container_list is None: # noqa: E501 - raise ValueError("Invalid value for `container_list`, must not be `None`") # noqa: E501 - - self._container_list = container_list - - @property - def transaction_info(self): - """Gets the transaction_info of this ProcessResponse. # noqa: E501 - - - :return: The transaction_info of this ProcessResponse. # noqa: E501 - :rtype: TransactionInfo - """ - return self._transaction_info - - @transaction_info.setter - def transaction_info(self, transaction_info): - """Sets the transaction_info of this ProcessResponse. - - - :param transaction_info: The transaction_info of this ProcessResponse. # noqa: E501 - :type transaction_info: TransactionInfo - """ - if self.local_vars_configuration.client_side_validation and transaction_info is None: # noqa: E501 - raise ValueError("Invalid value for `transaction_info`, must not be `None`") # noqa: E501 - - self._transaction_info = transaction_info - - @property - def log(self): - """Gets the log of this ProcessResponse. # noqa: E501 - - Base64 encoded transaction processing log # noqa: E501 - - :return: The log of this ProcessResponse. # noqa: E501 - :rtype: str - """ - return self._log - - @log.setter - def log(self, log): - """Sets the log of this ProcessResponse. - - Base64 encoded transaction processing log # noqa: E501 - - :param log: The log of this ProcessResponse. # noqa: E501 - :type log: str - """ - - self._log = log - - @property - def pass_back_object(self): - """Gets the pass_back_object of this ProcessResponse. # noqa: E501 - - Free-form object provided in request. See passBackObject property of ProcessRequest. # noqa: E501 - - :return: The pass_back_object of this ProcessResponse. # noqa: E501 - :rtype: dict(str, object) - """ - return self._pass_back_object - - @pass_back_object.setter - def pass_back_object(self, pass_back_object): - """Sets the pass_back_object of this ProcessResponse. - - Free-form object provided in request. See passBackObject property of ProcessRequest. # noqa: E501 - - :param pass_back_object: The pass_back_object of this ProcessResponse. # noqa: E501 - :type pass_back_object: dict(str, object) - """ - - self._pass_back_object = pass_back_object - - @property - def more_pages_available(self): - """Gets the more_pages_available of this ProcessResponse. # noqa: E501 - - - :return: The more_pages_available of this ProcessResponse. # noqa: E501 - :rtype: int - """ - return self._more_pages_available - - @more_pages_available.setter - def more_pages_available(self, more_pages_available): - """Sets the more_pages_available of this ProcessResponse. - - - :param more_pages_available: The more_pages_available of this ProcessResponse. # noqa: E501 - :type more_pages_available: int - """ - - self._more_pages_available = more_pages_available - - @property - def elapsed_time(self): - """Gets the elapsed_time of this ProcessResponse. # noqa: E501 - - Time the document processing has taken, ms. # noqa: E501 - - :return: The elapsed_time of this ProcessResponse. # noqa: E501 - :rtype: int - """ - return self._elapsed_time - - @elapsed_time.setter - def elapsed_time(self, elapsed_time): - """Sets the elapsed_time of this ProcessResponse. - - Time the document processing has taken, ms. # noqa: E501 - - :param elapsed_time: The elapsed_time of this ProcessResponse. # noqa: E501 - :type elapsed_time: int - """ - - self._elapsed_time = elapsed_time - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessResponse): - return False - - return self.to_dict() == other.to_dict() + ProcessResponse + """ # noqa: E501 + chip_page: RfidLocation = Field(alias="ChipPage") + core_lib_result_code: Optional[StrictInt] = Field(default=None, alias="CoreLibResultCode") + processing_finished: ProcessingStatus = Field(alias="ProcessingFinished") + container_list: ContainerList = Field(alias="ContainerList") + transaction_info: TransactionInfo = Field(alias="TransactionInfo") + log: Optional[StrictStr] = Field(default=None, description="Base64 encoded transaction processing log") + pass_back_object: Optional[Dict[str, Any]] = Field(default=None, description="Free-form object provided in request. See passBackObject property of ProcessRequest.", alias="passBackObject") + more_pages_available: StrictInt = Field(alias="morePagesAvailable") + elapsed_time: StrictInt = Field(description="Time the document processing has taken, ms.", alias="elapsedTime") + metadata: Optional[Dict[str, Any]] = None + __properties: ClassVar[List[str]] = ["ChipPage", "CoreLibResultCode", "ProcessingFinished", "ContainerList", "TransactionInfo", "log", "passBackObject", "morePagesAvailable", "elapsedTime", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of container_list + if self.container_list: + _dict['ContainerList'] = self.container_list.to_dict() + # override the default output from pydantic by calling `to_dict()` of transaction_info + if self.transaction_info: + _dict['TransactionInfo'] = self.transaction_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ChipPage": obj.get("ChipPage"), + "CoreLibResultCode": obj.get("CoreLibResultCode"), + "ProcessingFinished": obj.get("ProcessingFinished"), + "ContainerList": ContainerList.from_dict(obj["ContainerList"]) if obj.get("ContainerList") is not None else None, + "TransactionInfo": TransactionInfo.from_dict(obj["TransactionInfo"]) if obj.get("TransactionInfo") is not None else None, + "log": obj.get("log"), + "passBackObject": obj.get("passBackObject"), + "morePagesAvailable": obj.get("morePagesAvailable"), + "elapsedTime": obj.get("elapsedTime"), + "metadata": obj.get("metadata") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessResponse): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/process_system_info.py b/regula/documentreader/webclient/gen/models/process_system_info.py old mode 100755 new mode 100644 index 2fd8e25..e80c854 --- a/regula/documentreader/webclient/gen/models/process_system_info.py +++ b/regula/documentreader/webclient/gen/models/process_system_info.py @@ -4,146 +4,78 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessSystemInfo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class ProcessSystemInfo(BaseModel): """ - openapi_types = { - 'license': 'str', - 'recaptcha_token': 'str' - } - - attribute_map = { - 'license': 'license', - 'recaptcha_token': 'recaptcha_token' - } - - def __init__(self, license=None, recaptcha_token=None, local_vars_configuration=None): # noqa: E501 - """ProcessSystemInfo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._license = None - self._recaptcha_token = None - self.discriminator = None - - if license is not None: - self.license = license - if recaptcha_token is not None: - self.recaptcha_token = recaptcha_token - - @property - def license(self): - """Gets the license of this ProcessSystemInfo. # noqa: E501 - - Base64 encoded license file # noqa: E501 - - :return: The license of this ProcessSystemInfo. # noqa: E501 - :rtype: str + ProcessSystemInfo + """ # noqa: E501 + license: Optional[StrictStr] = Field(default=None, description="Base64 encoded license file") + recaptcha_token: Optional[StrictStr] = Field(default=None, description="For internal use. Demo-sites recaptcha token.") + __properties: ClassVar[List[str]] = ["license", "recaptcha_token"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ProcessSystemInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._license + excluded_fields: Set[str] = set([ + ]) - @license.setter - def license(self, license): - """Sets the license of this ProcessSystemInfo. + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - Base64 encoded license file # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ProcessSystemInfo from a dict""" + if obj is None: + return None - :param license: The license of this ProcessSystemInfo. # noqa: E501 - :type license: str - """ - - self._license = license - - @property - def recaptcha_token(self): - """Gets the recaptcha_token of this ProcessSystemInfo. # noqa: E501 - - For internal use. Demo-sites recaptcha token. # noqa: E501 + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The recaptcha_token of this ProcessSystemInfo. # noqa: E501 - :rtype: str - """ - return self._recaptcha_token - - @recaptcha_token.setter - def recaptcha_token(self, recaptcha_token): - """Sets the recaptcha_token of this ProcessSystemInfo. + _obj = cls.model_validate({ + "license": obj.get("license"), + "recaptcha_token": obj.get("recaptcha_token") + }) + return _obj - For internal use. Demo-sites recaptcha token. # noqa: E501 - - :param recaptcha_token: The recaptcha_token of this ProcessSystemInfo. # noqa: E501 - :type recaptcha_token: str - """ - self._recaptcha_token = recaptcha_token - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessSystemInfo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessSystemInfo): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/processing_status.py b/regula/documentreader/webclient/gen/models/processing_status.py old mode 100755 new mode 100644 index 359cd81..3f80669 --- a/regula/documentreader/webclient/gen/models/processing_status.py +++ b/regula/documentreader/webclient/gen/models/processing_status.py @@ -4,96 +4,27 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class ProcessingStatus(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class ProcessingStatus(int, Enum): + """ + ProcessingStatus """ - - NOT_FINISHED = int("0") - - FINISHED = int("1") - - TIMEOUT = int("2") - - allowable_values = [NOT_FINISHED, FINISHED, TIMEOUT] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """ProcessingStatus - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ProcessingStatus): - return False + NOT_FINISHED = 0 + FINISHED = 1 + TIMEOUT = 2 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of ProcessingStatus from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ProcessingStatus): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/raw_image_container_item.py b/regula/documentreader/webclient/gen/models/raw_image_container_item.py new file mode 100644 index 0000000..80aed25 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/raw_image_container_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.image_data import ImageData +from typing import Optional, Set +from typing_extensions import Self + +class RawImageContainerItem(BaseModel): + """ + RawImageContainerItem + """ # noqa: E501 + raw_image_container: ImageData = Field(alias="RawImageContainer") + __properties: ClassVar[List[str]] = ["RawImageContainer"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RawImageContainerItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of raw_image_container + if self.raw_image_container: + _dict['RawImageContainer'] = self.raw_image_container.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RawImageContainerItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RawImageContainer": ImageData.from_dict(obj["RawImageContainer"]) if obj.get("RawImageContainer") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/raw_image_container_list.py b/regula/documentreader/webclient/gen/models/raw_image_container_list.py index 1f75ce4..946343a 100644 --- a/regula/documentreader/webclient/gen/models/raw_image_container_list.py +++ b/regula/documentreader/webclient/gen/models/raw_image_container_list.py @@ -4,142 +4,86 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.image_data import ImageData +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class RawImageContainerList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class RawImageContainerList(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'count': 'int', - 'images': 'list[ImageData]' - } - - attribute_map = { - 'count': 'Count', - 'images': 'Images' - } - - def __init__(self, count=None, images=None, local_vars_configuration=None): # noqa: E501 - """RawImageContainerList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._count = None - self._images = None - self.discriminator = None - - if count is not None: - self.count = count - if images is not None: - self.images = images - - @property - def count(self): - """Gets the count of this RawImageContainerList. # noqa: E501 - - - :return: The count of this RawImageContainerList. # noqa: E501 - :rtype: int + RawImageContainerList + """ # noqa: E501 + count: StrictInt = Field(alias="Count") + images: List[ImageData] = Field(alias="Images") + __properties: ClassVar[List[str]] = ["Count", "Images"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RawImageContainerList from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._count - - @count.setter - def count(self, count): - """Sets the count of this RawImageContainerList. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in images (list) + _items = [] + if self.images: + for _item_images in self.images: + if _item_images: + _items.append(_item_images.to_dict()) + _dict['Images'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RawImageContainerList from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Count": obj.get("Count"), + "Images": [ImageData.from_dict(_item) for _item in obj["Images"]] if obj.get("Images") is not None else None + }) + return _obj - :param count: The count of this RawImageContainerList. # noqa: E501 - :type count: int - """ - - self._count = count - - @property - def images(self): - """Gets the images of this RawImageContainerList. # noqa: E501 - - - :return: The images of this RawImageContainerList. # noqa: E501 - :rtype: list[ImageData] - """ - return self._images - - @images.setter - def images(self, images): - """Sets the images of this RawImageContainerList. - - - :param images: The images of this RawImageContainerList. # noqa: E501 - :type images: list[ImageData] - """ - self._images = images - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, RawImageContainerList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, RawImageContainerList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/rectangle_coordinates.py b/regula/documentreader/webclient/gen/models/rectangle_coordinates.py old mode 100755 new mode 100644 index 2dd0063..a00f24e --- a/regula/documentreader/webclient/gen/models/rectangle_coordinates.py +++ b/regula/documentreader/webclient/gen/models/rectangle_coordinates.py @@ -4,198 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Coordinates of the rectangle region on a document image(result type 1). Represented by two points - (left, top) + (right, bottom) -""" -class RectangleCoordinates(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class RectangleCoordinates(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'left': 'int', - 'top': 'int', - 'right': 'int', - 'bottom': 'int' - } - - attribute_map = { - 'left': 'left', - 'top': 'top', - 'right': 'right', - 'bottom': 'bottom' - } - - def __init__(self, left=None, top=None, right=None, bottom=None, local_vars_configuration=None): # noqa: E501 - """RectangleCoordinates - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._left = None - self._top = None - self._right = None - self._bottom = None - self.discriminator = None - - self.left = left - self.top = top - self.right = right - self.bottom = bottom - - @property - def left(self): - """Gets the left of this RectangleCoordinates. # noqa: E501 - - - :return: The left of this RectangleCoordinates. # noqa: E501 - :rtype: int + Coordinates of the rectangle region on a document image(result type 1). Represented by two points - (left, top) + (right, bottom) + """ # noqa: E501 + left: StrictInt + top: StrictInt + right: StrictInt + bottom: StrictInt + __properties: ClassVar[List[str]] = ["left", "top", "right", "bottom"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RectangleCoordinates from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._left + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RectangleCoordinates from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "left": obj.get("left"), + "top": obj.get("top"), + "right": obj.get("right"), + "bottom": obj.get("bottom") + }) + return _obj - @left.setter - def left(self, left): - """Sets the left of this RectangleCoordinates. - - :param left: The left of this RectangleCoordinates. # noqa: E501 - :type left: int - """ - if self.local_vars_configuration.client_side_validation and left is None: # noqa: E501 - raise ValueError("Invalid value for `left`, must not be `None`") # noqa: E501 - - self._left = left - - @property - def top(self): - """Gets the top of this RectangleCoordinates. # noqa: E501 - - - :return: The top of this RectangleCoordinates. # noqa: E501 - :rtype: int - """ - return self._top - - @top.setter - def top(self, top): - """Sets the top of this RectangleCoordinates. - - - :param top: The top of this RectangleCoordinates. # noqa: E501 - :type top: int - """ - if self.local_vars_configuration.client_side_validation and top is None: # noqa: E501 - raise ValueError("Invalid value for `top`, must not be `None`") # noqa: E501 - - self._top = top - - @property - def right(self): - """Gets the right of this RectangleCoordinates. # noqa: E501 - - - :return: The right of this RectangleCoordinates. # noqa: E501 - :rtype: int - """ - return self._right - - @right.setter - def right(self, right): - """Sets the right of this RectangleCoordinates. - - - :param right: The right of this RectangleCoordinates. # noqa: E501 - :type right: int - """ - if self.local_vars_configuration.client_side_validation and right is None: # noqa: E501 - raise ValueError("Invalid value for `right`, must not be `None`") # noqa: E501 - - self._right = right - - @property - def bottom(self): - """Gets the bottom of this RectangleCoordinates. # noqa: E501 - - - :return: The bottom of this RectangleCoordinates. # noqa: E501 - :rtype: int - """ - return self._bottom - - @bottom.setter - def bottom(self, bottom): - """Sets the bottom of this RectangleCoordinates. - - - :param bottom: The bottom of this RectangleCoordinates. # noqa: E501 - :type bottom: int - """ - if self.local_vars_configuration.client_side_validation and bottom is None: # noqa: E501 - raise ValueError("Invalid value for `bottom`, must not be `None`") # noqa: E501 - - self._bottom = bottom - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, RectangleCoordinates): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, RectangleCoordinates): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/result.py b/regula/documentreader/webclient/gen/models/result.py old mode 100755 new mode 100644 index a859011..c40c7ff --- a/regula/documentreader/webclient/gen/models/result.py +++ b/regula/documentreader/webclient/gen/models/result.py @@ -4,144 +4,60 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class Result(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Result(int, Enum): + """ + Result """ - - DOCUMENT_IMAGE = int("1") - - MRZ_TEXT = int("3") - - BARCODES = int("5") - - VISUAL_GRAPHICS = int("6") - - DOCUMENT_TYPE_CANDIDATES = int("8") - - DOCUMENT_TYPE = int("9") - - LEXICAL_ANALYSIS = int("15") - - RAW_UNCROPPED_IMAGE = int("16") - - VISUAL_TEXT = int("17") - - BARCODE_TEXT = int("18") - - BARCODE_GRAPHICS = int("19") - - AUTHENTICITY = int("20") - - IMAGE_QUALITY = int("30") - - STATUS = int("33") - - PORTRAIT_COMPARISON = int("34") - - TEXT = int("36") - - IMAGES = int("37") - - FINGERPRINT_COMPARISON = int("39") - - ENCRYPTED_RCL = int("49") - - LICENSE = int("50") - - DOCUMENT_POSITION = int("85") - - RFID_RAW_DATA = int("101") - - RFID_TEXT = int("102") - - RFID_GRAPHICS = int("103") - - RFID_BINARY_DATA = int("104") - - RFID_ORIGINAL_GRAPHICS = int("105") - - DTC_VC = int("109") - - allowable_values = [DOCUMENT_IMAGE, MRZ_TEXT, BARCODES, VISUAL_GRAPHICS, DOCUMENT_TYPE_CANDIDATES, DOCUMENT_TYPE, LEXICAL_ANALYSIS, RAW_UNCROPPED_IMAGE, VISUAL_TEXT, BARCODE_TEXT, BARCODE_GRAPHICS, AUTHENTICITY, IMAGE_QUALITY, STATUS, PORTRAIT_COMPARISON, TEXT, IMAGES, FINGERPRINT_COMPARISON, ENCRYPTED_RCL, LICENSE, DOCUMENT_POSITION, RFID_RAW_DATA, RFID_TEXT, RFID_GRAPHICS, RFID_BINARY_DATA, RFID_ORIGINAL_GRAPHICS, DTC_VC] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Result - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Result): - return False - - return self.to_dict() == other.to_dict() + DOCUMENT_IMAGE = 1 + MRZ_TEXT = 3 + BARCODES = 5 + VISUAL_GRAPHICS = 6 + MRZ_TEST_QUALITY = 7 + DOCUMENT_TYPE_CANDIDATES = 8 + DOCUMENT_TYPE = 9 + LEXICAL_ANALYSIS = 15 + RAW_UNCROPPED_IMAGE = 16 + VISUAL_TEXT = 17 + BARCODE_TEXT = 18 + BARCODE_GRAPHICS = 19 + AUTHENTICITY = 20 + MAGNETIC_STRIPE_TEXT_DATA = 26 + IMAGE_QUALITY = 30 + LIVE_PORTRAIT = 32 + STATUS = 33 + PORTRAIT_COMPARISON = 34 + EXT_PORTRAIT = 35 + TEXT = 36 + IMAGES = 37 + FINGERPRINTS = 38 + FINGERPRINT_COMPARISON = 39 + ENCRYPTED_RCL = 49 + LICENSE = 50 + MRZ_POSITION = 61 + BARCODE_POSITION = 62 + DOCUMENT_POSITION = 85 + MRZ_DETECTOR = 87 + FACE_DETECTION = 97 + RFID_RAW_DATA = 101 + RFID_TEXT = 102 + RFID_GRAPHICS = 103 + RFID_BINARY_DATA = 104 + RFID_ORIGINAL_GRAPHICS = 105 + DTC_VC = 109 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Result from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Result): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/result_item.py b/regula/documentreader/webclient/gen/models/result_item.py old mode 100755 new mode 100644 index 05ea5dc..417c537 --- a/regula/documentreader/webclient/gen/models/result_item.py +++ b/regula/documentreader/webclient/gen/models/result_item.py @@ -4,256 +4,206 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Common fields for all result objects -""" -class ResultItem(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - +import json + +from importlib import import_module +from pydantic import BaseModel, ConfigDict, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.result import Result +from typing import Optional, Set +from typing_extensions import Self + +from typing import TYPE_CHECKING +if TYPE_CHECKING: + from regula.documentreader.webclient.gen.models.document_image_result import DocumentImageResult + from regula.documentreader.webclient.gen.models.document_binary_info_result import DocumentBinaryInfoResult + from regula.documentreader.webclient.gen.models.rfid_text_data_result import RFIDTextDataResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.document_binary_info_result import DocumentBinaryInfoResult + from regula.documentreader.webclient.gen.models.rfid_graphics_info_result import RFIDGraphicsInfoResult + from regula.documentreader.webclient.gen.models.byte_array_result import ByteArrayResult + from regula.documentreader.webclient.gen.models.lexical_analysis_result import LexicalAnalysisResult + from regula.documentreader.webclient.gen.models.document_image_result import DocumentImageResult + from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult + from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult + from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult + from regula.documentreader.webclient.gen.models.text_data_result import TextDataResult + from regula.documentreader.webclient.gen.models.image_quality_result import ImageQualityResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.status_result import StatusResult + from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.text_result import TextResult + from regula.documentreader.webclient.gen.models.images_result import ImagesResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.authenticity_result import AuthenticityResult + from regula.documentreader.webclient.gen.models.encrypted_rcl_result import EncryptedRCLResult + from regula.documentreader.webclient.gen.models.doc_bar_code_info import DocBarCodeInfo + from regula.documentreader.webclient.gen.models.license_result import LicenseResult + from regula.documentreader.webclient.gen.models.graphics_result import GraphicsResult + from regula.documentreader.webclient.gen.models.mrz_position_result import MRZPositionResult + from regula.documentreader.webclient.gen.models.document_position_result import DocumentPositionResult + from regula.documentreader.webclient.gen.models.mrz_test_quality_result import MRZTestQualityResult + from regula.documentreader.webclient.gen.models.document_types_candidates_result import DocumentTypesCandidatesResult + from regula.documentreader.webclient.gen.models.document_position_result import DocumentPositionResult + from regula.documentreader.webclient.gen.models.mrz_detector_result import MRZDetectorResult + from regula.documentreader.webclient.gen.models.chosen_document_type_result import ChosenDocumentTypeResult + from regula.documentreader.webclient.gen.models.face_detection_result import FaceDetectionResult + +class ResultItem(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - discriminator_value_class_map = { - 1 : 'DocumentImageResult', - 102 : 'TextDataResult', - 103 : 'GraphicsResult', - 109 : 'ByteArrayResult', - 15 : 'LexicalAnalysisResult', - 16 : 'DocumentImageResult', - 17 : 'TextDataResult', - 18 : 'TextDataResult', - 19 : 'GraphicsResult', - 20 : 'AuthenticityResult', - 3 : 'TextDataResult', - 30 : 'ImageQualityResult', - 33 : 'StatusResult', - 34 : 'AuthenticityResult', - 36 : 'TextResult', - 37 : 'ImagesResult', - 39 : 'AuthenticityResult', - 49 : 'EncryptedRCLResult', - 5 : 'DocBarCodeInfo', - 50 : 'LicenseResult', - 6 : 'GraphicsResult', - 8 : 'DocumentTypesCandidatesResult', - 85 : 'DocumentPositionResult', - 9 : 'ChosenDocumentTypeResult', + Common fields for all result objects + """ # noqa: E501 + buf_length: Optional[StrictInt] = None + light: Optional[StrictInt] = None + list_idx: Optional[StrictInt] = None + page_idx: Optional[StrictInt] = None + result_type: Result + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + # JSON field name that stores the object type + __discriminator_property_name: ClassVar[str] = 'result_type' + + # discriminator mappings + __discriminator_value_class_map: ClassVar[Dict[str, str]] = { + '1': 'DocumentImageResult','101': 'DocumentBinaryInfoResult','102': 'RFIDTextDataResult','103': 'GraphicsResult','104': 'DocumentBinaryInfoResult','105': 'RFIDGraphicsInfoResult','109': 'ByteArrayResult','15': 'LexicalAnalysisResult','16': 'DocumentImageResult','17': 'TextDataResult','18': 'TextDataResult','19': 'GraphicsResult','20': 'AuthenticityResult','26': 'TextDataResult','3': 'TextDataResult','30': 'ImageQualityResult','32': 'GraphicsResult','33': 'StatusResult','34': 'AuthenticityResult','35': 'GraphicsResult','36': 'TextResult','37': 'ImagesResult','38': 'GraphicsResult','39': 'AuthenticityResult','49': 'EncryptedRCLResult','5': 'DocBarCodeInfo','50': 'LicenseResult','6': 'GraphicsResult','61': 'MRZPositionResult','62': 'DocumentPositionResult','7': 'MRZTestQualityResult','8': 'DocumentTypesCandidatesResult','85': 'DocumentPositionResult','87': 'MRZDetectorResult','9': 'ChosenDocumentTypeResult','97': 'FaceDetectionResult' } - def __init__(self, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """ResultItem - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = 'result_type' - - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def buf_length(self): - """Gets the buf_length of this ResultItem. # noqa: E501 - - - :return: The buf_length of this ResultItem. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this ResultItem. - - - :param buf_length: The buf_length of this ResultItem. # noqa: E501 - :type buf_length: int + @classmethod + def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]: + """Returns the discriminator value (object type) of the data""" + discriminator_value = obj[cls.__discriminator_property_name] + if discriminator_value: + return cls.__discriminator_value_class_map.get(str(discriminator_value)) + else: + return None + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Union[DocumentImageResult, DocumentBinaryInfoResult, RFIDTextDataResult, GraphicsResult, DocumentBinaryInfoResult, RFIDGraphicsInfoResult, ByteArrayResult, LexicalAnalysisResult, DocumentImageResult, TextDataResult, TextDataResult, GraphicsResult, AuthenticityResult, TextDataResult, TextDataResult, ImageQualityResult, GraphicsResult, StatusResult, AuthenticityResult, GraphicsResult, TextResult, ImagesResult, GraphicsResult, AuthenticityResult, EncryptedRCLResult, DocBarCodeInfo, LicenseResult, GraphicsResult, MRZPositionResult, DocumentPositionResult, MRZTestQualityResult, DocumentTypesCandidatesResult, DocumentPositionResult, MRZDetectorResult, ChosenDocumentTypeResult, FaceDetectionResult]]: + """Create an instance of ResultItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[DocumentImageResult, DocumentBinaryInfoResult, RFIDTextDataResult, GraphicsResult, DocumentBinaryInfoResult, RFIDGraphicsInfoResult, ByteArrayResult, LexicalAnalysisResult, DocumentImageResult, TextDataResult, TextDataResult, GraphicsResult, AuthenticityResult, TextDataResult, TextDataResult, ImageQualityResult, GraphicsResult, StatusResult, AuthenticityResult, GraphicsResult, TextResult, ImagesResult, GraphicsResult, AuthenticityResult, EncryptedRCLResult, DocBarCodeInfo, LicenseResult, GraphicsResult, MRZPositionResult, DocumentPositionResult, MRZTestQualityResult, DocumentTypesCandidatesResult, DocumentPositionResult, MRZDetectorResult, ChosenDocumentTypeResult, FaceDetectionResult]]: + """Create an instance of ResultItem from a dict""" + # look up the object type based on discriminator mapping + object_type = cls.get_discriminator_value(obj) + if object_type == 'DocumentImageResult': + return import_module("regula.documentreader.webclient.gen.models.document_image_result").DocumentImageResult.from_dict(obj) + if object_type == 'DocumentBinaryInfoResult': + return import_module("regula.documentreader.webclient.gen.models.document_binary_info_result").DocumentBinaryInfoResult.from_dict(obj) + if object_type == 'RFIDTextDataResult': + return import_module("regula.documentreader.webclient.gen.models.rfid_text_data_result").RFIDTextDataResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'DocumentBinaryInfoResult': + return import_module("regula.documentreader.webclient.gen.models.document_binary_info_result").DocumentBinaryInfoResult.from_dict(obj) + if object_type == 'RFIDGraphicsInfoResult': + return import_module("regula.documentreader.webclient.gen.models.rfid_graphics_info_result").RFIDGraphicsInfoResult.from_dict(obj) + if object_type == 'ByteArrayResult': + return import_module("regula.documentreader.webclient.gen.models.byte_array_result").ByteArrayResult.from_dict(obj) + if object_type == 'LexicalAnalysisResult': + return import_module("regula.documentreader.webclient.gen.models.lexical_analysis_result").LexicalAnalysisResult.from_dict(obj) + if object_type == 'DocumentImageResult': + return import_module("regula.documentreader.webclient.gen.models.document_image_result").DocumentImageResult.from_dict(obj) + if object_type == 'TextDataResult': + return import_module("regula.documentreader.webclient.gen.models.text_data_result").TextDataResult.from_dict(obj) + if object_type == 'TextDataResult': + return import_module("regula.documentreader.webclient.gen.models.text_data_result").TextDataResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'AuthenticityResult': + return import_module("regula.documentreader.webclient.gen.models.authenticity_result").AuthenticityResult.from_dict(obj) + if object_type == 'TextDataResult': + return import_module("regula.documentreader.webclient.gen.models.text_data_result").TextDataResult.from_dict(obj) + if object_type == 'TextDataResult': + return import_module("regula.documentreader.webclient.gen.models.text_data_result").TextDataResult.from_dict(obj) + if object_type == 'ImageQualityResult': + return import_module("regula.documentreader.webclient.gen.models.image_quality_result").ImageQualityResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'StatusResult': + return import_module("regula.documentreader.webclient.gen.models.status_result").StatusResult.from_dict(obj) + if object_type == 'AuthenticityResult': + return import_module("regula.documentreader.webclient.gen.models.authenticity_result").AuthenticityResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'TextResult': + return import_module("regula.documentreader.webclient.gen.models.text_result").TextResult.from_dict(obj) + if object_type == 'ImagesResult': + return import_module("regula.documentreader.webclient.gen.models.images_result").ImagesResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'AuthenticityResult': + return import_module("regula.documentreader.webclient.gen.models.authenticity_result").AuthenticityResult.from_dict(obj) + if object_type == 'EncryptedRCLResult': + return import_module("regula.documentreader.webclient.gen.models.encrypted_rcl_result").EncryptedRCLResult.from_dict(obj) + if object_type == 'DocBarCodeInfo': + return import_module("regula.documentreader.webclient.gen.models.doc_bar_code_info").DocBarCodeInfo.from_dict(obj) + if object_type == 'LicenseResult': + return import_module("regula.documentreader.webclient.gen.models.license_result").LicenseResult.from_dict(obj) + if object_type == 'GraphicsResult': + return import_module("regula.documentreader.webclient.gen.models.graphics_result").GraphicsResult.from_dict(obj) + if object_type == 'MRZPositionResult': + return import_module("regula.documentreader.webclient.gen.models.mrz_position_result").MRZPositionResult.from_dict(obj) + if object_type == 'DocumentPositionResult': + return import_module("regula.documentreader.webclient.gen.models.document_position_result").DocumentPositionResult.from_dict(obj) + if object_type == 'MRZTestQualityResult': + return import_module("regula.documentreader.webclient.gen.models.mrz_test_quality_result").MRZTestQualityResult.from_dict(obj) + if object_type == 'DocumentTypesCandidatesResult': + return import_module("regula.documentreader.webclient.gen.models.document_types_candidates_result").DocumentTypesCandidatesResult.from_dict(obj) + if object_type == 'DocumentPositionResult': + return import_module("regula.documentreader.webclient.gen.models.document_position_result").DocumentPositionResult.from_dict(obj) + if object_type == 'MRZDetectorResult': + return import_module("regula.documentreader.webclient.gen.models.mrz_detector_result").MRZDetectorResult.from_dict(obj) + if object_type == 'ChosenDocumentTypeResult': + return import_module("regula.documentreader.webclient.gen.models.chosen_document_type_result").ChosenDocumentTypeResult.from_dict(obj) + if object_type == 'FaceDetectionResult': + return import_module("regula.documentreader.webclient.gen.models.face_detection_result").FaceDetectionResult.from_dict(obj) + + raise ValueError("ResultItem failed to lookup discriminator value from " + + json.dumps(obj) + ". Discriminator property name: " + cls.__discriminator_property_name + + ", mapping: " + json.dumps(cls.__discriminator_value_class_map)) - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this ResultItem. # noqa: E501 - - - :return: The light of this ResultItem. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this ResultItem. - - - :param light: The light of this ResultItem. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this ResultItem. # noqa: E501 - - - :return: The list_idx of this ResultItem. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this ResultItem. - - - :param list_idx: The list_idx of this ResultItem. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this ResultItem. # noqa: E501 - - - :return: The page_idx of this ResultItem. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this ResultItem. - - - :param page_idx: The page_idx of this ResultItem. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this ResultItem. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this ResultItem. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this ResultItem. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this ResultItem. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def get_real_child_model(self, data): - """Returns the real base class specified by the discriminator""" - discriminator_key = self.attribute_map[self.discriminator] - discriminator_value = data[discriminator_key] - from regula.documentreader.webclient.ext.models import RawResultItem - return self.discriminator_value_class_map.get(discriminator_value, RawResultItem.__name__) - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, ResultItem): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, ResultItem): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/result_mrz_detector.py b/regula/documentreader/webclient/gen/models/result_mrz_detector.py new file mode 100644 index 0000000..aab0b42 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/result_mrz_detector.py @@ -0,0 +1,93 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.mrz_rows_item import MRZRowsItem +from typing import Optional, Set +from typing_extensions import Self + +class ResultMRZDetector(BaseModel): + """ + ResultMRZDetector + """ # noqa: E501 + mrz_format: StrictInt = Field(alias="MRZFormat") + mrz_rows: List[MRZRowsItem] = Field(alias="MRZRows") + mrz_rows_num: StrictInt = Field(alias="MRZRowsNum") + bounding_quadrangle: List[Union[StrictFloat, StrictInt]] = Field(alias="boundingQuadrangle") + __properties: ClassVar[List[str]] = ["MRZFormat", "MRZRows", "MRZRowsNum", "boundingQuadrangle"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ResultMRZDetector from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in mrz_rows (list) + _items = [] + if self.mrz_rows: + for _item_mrz_rows in self.mrz_rows: + if _item_mrz_rows: + _items.append(_item_mrz_rows.to_dict()) + _dict['MRZRows'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ResultMRZDetector from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "MRZFormat": obj.get("MRZFormat"), + "MRZRows": [MRZRowsItem.from_dict(_item) for _item in obj["MRZRows"]] if obj.get("MRZRows") is not None else None, + "MRZRowsNum": obj.get("MRZRowsNum"), + "boundingQuadrangle": obj.get("boundingQuadrangle") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/result_mrz_detector_item.py b/regula/documentreader/webclient/gen/models/result_mrz_detector_item.py new file mode 100644 index 0000000..9af5e40 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/result_mrz_detector_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector +from typing import Optional, Set +from typing_extensions import Self + +class ResultMRZDetectorItem(BaseModel): + """ + ResultMRZDetectorItem + """ # noqa: E501 + result_mrz_detector: ResultMRZDetector = Field(alias="ResultMRZDetector") + __properties: ClassVar[List[str]] = ["ResultMRZDetector"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of ResultMRZDetectorItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of result_mrz_detector + if self.result_mrz_detector: + _dict['ResultMRZDetector'] = self.result_mrz_detector.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of ResultMRZDetectorItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ResultMRZDetector": ResultMRZDetector.from_dict(obj["ResultMRZDetector"]) if obj.get("ResultMRZDetector") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_a_chip.py b/regula/documentreader/webclient/gen/models/rfid_a_chip.py new file mode 100644 index 0000000..0a3e779 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_a_chip.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidAChip(int, Enum): + """ + Enumeration contains a set of constants specifying the type of the RFIDchip from MIFARE® family (for chips of type A) + """ + + """ + allowed enum values + """ + UNKNOWN = 0 + MIFARE_1K = 1 + MIFARE_4K = 2 + MIFARE_ULTRALIGHT = 3 + MIFARE_DES_FIRE = 4 + MIFARE_PROX = 5 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidAChip from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_access_control_info.py b/regula/documentreader/webclient/gen/models/rfid_access_control_info.py new file mode 100644 index 0000000..7728c0d --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_access_control_info.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from typing import Optional, Set +from typing_extensions import Self + +class RfidAccessControlInfo(BaseModel): + """ + Structure is used to describe the results of a single authentication procedure or a procedure of secure data access within the context of the communication session with electronic document + """ # noqa: E501 + type: RfidAccessControlProcedureType = Field(alias="Type") + status: RFIDErrorCodes = Field(alias="Status") + active_option_idx: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Index of the active variant of the procedure", alias="ActiveOptionIdx") + notifications: List[ParsingNotificationCodes] = Field(description="List of remarks arisen during the procedure.", alias="Notifications") + access_control_options: Optional[List[Any]] = Field(default=None, description="List of structures with are used to describe the variants of the authentication or secure data access procedure performance within the context of the communication session with electronic document", alias="AccessControlOptions") + __properties: ClassVar[List[str]] = ["Type", "Status", "ActiveOptionIdx", "Notifications", "AccessControlOptions"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidAccessControlInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidAccessControlInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Status": obj.get("Status"), + "ActiveOptionIdx": obj.get("ActiveOptionIdx"), + "Notifications": obj.get("Notifications"), + "AccessControlOptions": obj.get("AccessControlOptions") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_access_control_procedure_type.py b/regula/documentreader/webclient/gen/models/rfid_access_control_procedure_type.py new file mode 100644 index 0000000..f52c06e --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_access_control_procedure_type.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidAccessControlProcedureType(int, Enum): + """ + Enumeration contains a set of constants that define the type of authentication or secure data access procedure + """ + + """ + allowed enum values + """ + UNDEFINED = 0 + BAC = 1 + PACE = 2 + CA = 3 + TA = 4 + AA = 5 + RI = 6 + CARD_INFO = 10 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidAccessControlProcedureType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_access_key.py b/regula/documentreader/webclient/gen/models/rfid_access_key.py new file mode 100644 index 0000000..400dc7b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_access_key.py @@ -0,0 +1,87 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType +from regula.documentreader.webclient.gen.models.rfid_password_type import RfidPasswordType +from typing import Optional, Set +from typing_extensions import Self + +class RfidAccessKey(BaseModel): + """ + Structure is used to describe the contents of secure data access key within the context of the communication session with electronic document + """ # noqa: E501 + access_key: StrictStr = Field(description="Key contents", alias="AccessKey") + key_type: RfidPasswordType = Field(alias="KeyType") + access_type: RfidAccessControlProcedureType = Field(alias="AccessType") + check_full_key_matching: StrictBool = Field(description="Logical sign of the need for a full comparison of AccessKey contents with the contents of DG1 (MRZ) data group", alias="CheckFullKeyMatching") + __properties: ClassVar[List[str]] = ["AccessKey", "KeyType", "AccessType", "CheckFullKeyMatching"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidAccessKey from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidAccessKey from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "AccessKey": obj.get("AccessKey"), + "KeyType": obj.get("KeyType"), + "AccessType": obj.get("AccessType"), + "CheckFullKeyMatching": obj.get("CheckFullKeyMatching") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_application.py b/regula/documentreader/webclient/gen/models/rfid_application.py new file mode 100644 index 0000000..dc59162 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_application.py @@ -0,0 +1,101 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.rfid_application_type import RfidApplicationType +from regula.documentreader.webclient.gen.models.rfid_data_file import RfidDataFile +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from typing import Optional, Set +from typing_extensions import Self + +class RfidApplication(BaseModel): + """ + Structure is used to describe the contents of a single LDS application and their analysis within the context of the communication session with electronic document + """ # noqa: E501 + type: RfidApplicationType = Field(alias="Type") + status: RFIDErrorCodes = Field(alias="Status") + application_id: StrictStr = Field(description="Application identifier", alias="ApplicationID") + version: StrictStr = Field(description="Version of the application", alias="Version") + unicode_version: StrictStr = Field(description="Unicode version for application", alias="UnicodeVersion") + data_hash_algorithm: StrictStr = Field(description="Algorithm for calculating hash values for files for the procedure of PA", alias="DataHashAlgorithm") + files: List[RfidDataFile] = Field(description="List of containers to store information about the read files of the application", alias="Files") + __properties: ClassVar[List[str]] = ["Type", "Status", "ApplicationID", "Version", "UnicodeVersion", "DataHashAlgorithm", "Files"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidApplication from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in files (list) + _items = [] + if self.files: + for _item_files in self.files: + if _item_files: + _items.append(_item_files.to_dict()) + _dict['Files'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidApplication from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Status": obj.get("Status"), + "ApplicationID": obj.get("ApplicationID"), + "Version": obj.get("Version"), + "UnicodeVersion": obj.get("UnicodeVersion"), + "DataHashAlgorithm": obj.get("DataHashAlgorithm"), + "Files": [RfidDataFile.from_dict(_item) for _item in obj["Files"]] if obj.get("Files") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_application_type.py b/regula/documentreader/webclient/gen/models/rfid_application_type.py new file mode 100644 index 0000000..aa563c3 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_application_type.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidApplicationType(int, Enum): + """ + Enumeration contains a set of constants that define the type of application within the context of the communication session with electronic document + """ + + """ + allowed enum values + """ + UNSPECIFIED = 0 + E_PASSPORT = 1 + E_ID = 2 + E_SIGN = 3 + E_DL = 4 + LDS2_TravelRecords = 5 + LDS2_VisaRecords = 6 + LDS2_AddBiometrics = 7 + eDTC_PC = 8 + ROOT_FILES = 0 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidApplicationType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_attribute_data.py b/regula/documentreader/webclient/gen/models/rfid_attribute_data.py new file mode 100644 index 0000000..5a89772 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_attribute_data.py @@ -0,0 +1,81 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class RfidAttributeData(BaseModel): + """ + Structure contains the data of one attribute of the digital signature object. + """ # noqa: E501 + type: StrictStr = Field(description="Contents of the identifier in the format S1 (S2), where S1 – attribute name, S2 – identifier (OID string)", alias="Type") + data: StrictStr = Field(description="Attribute binary data. Base64 encoded.", alias="Data") + __properties: ClassVar[List[str]] = ["Type", "Data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidAttributeData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidAttributeData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Data": obj.get("Data") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_attribute_name.py b/regula/documentreader/webclient/gen/models/rfid_attribute_name.py new file mode 100644 index 0000000..95a267a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_attribute_name.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString +from typing import Optional, Set +from typing_extensions import Self + +class RfidAttributeName(BaseModel): + """ + Structure contains information that serves as the distinguished name (identifier) of an object. + """ # noqa: E501 + type: StrictStr = Field(description="Attribute identifier (OID ASCII string); contents of the identifier in the format S1 (S2), where S1 – attribute name, S2 – identifier (OID string)", alias="Type") + value: TrfFtString = Field(alias="Value") + __properties: ClassVar[List[str]] = ["Type", "Value"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidAttributeName from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of value + if self.value: + _dict['Value'] = self.value.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidAttributeName from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Value": TrfFtString.from_dict(obj["Value"]) if obj.get("Value") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_authentication_procedure_type.py b/regula/documentreader/webclient/gen/models/rfid_authentication_procedure_type.py new file mode 100644 index 0000000..4f0be76 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_authentication_procedure_type.py @@ -0,0 +1,31 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidAuthenticationProcedureType(int, Enum): + """ + Enumeration contains a set of constants that define the type of performed procedure of document authentication within the current session + """ + + """ + allowed enum values + """ + UNDEFINED = 0 + STANDARD = 1 + ADVANCED = 2 + GENERAL = 3 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidAuthenticationProcedureType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_baud_rate.py b/regula/documentreader/webclient/gen/models/rfid_baud_rate.py new file mode 100644 index 0000000..54d83ae --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_baud_rate.py @@ -0,0 +1,32 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidBaudRate(int, Enum): + """ + Enumeration contains a set of constants specifying the rate of data exchange between the reader and the RFID-chip + """ + + """ + allowed enum values + """ + UNKNOWN = 0 + RFBR_106 = 1 + RFBR_212 = 2 + RFBR_424 = 4 + RFBR_848 = 8 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidBaudRate from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_card_properties_ext.py b/regula/documentreader/webclient/gen/models/rfid_card_properties_ext.py new file mode 100644 index 0000000..9ed41e4 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_card_properties_ext.py @@ -0,0 +1,123 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictBool, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip +from regula.documentreader.webclient.gen.models.rfid_baud_rate import RfidBaudRate +from regula.documentreader.webclient.gen.models.rfid_type import RfidType +from typing import Optional, Set +from typing_extensions import Self + +class RfidCardPropertiesExt(BaseModel): + """ + Structure is used to store extended information about the characteristics of the RFID-chip located in the scope of the reader + """ # noqa: E501 + rfid_type: RfidType = Field(alias="RFID_Type") + baudrate1: StrictStr = Field(description="Numeric Baudrate1 value in hexadecimal format (e.g. 0x0000000F)", alias="Baudrate1") + baudrate2: StrictStr = Field(description="Numeric Baudrate2 value in hexadecimal format", alias="Baudrate2") + support_4: StrictBool = Field(description="Boolean Support_4 value", alias="Support_4") + chip_type_a: RfidAChip = Field(alias="ChipType_A") + support_mifare: StrictBool = Field(description="Sign of support for ISO/IEC 14443-3 data exchange protocol", alias="Support_Mifare") + mifare_memory: Union[StrictFloat, StrictInt] = Field(description="Amount of operational memory MIFARE® of the chip, kilobytes", alias="MifareMemory") + uid: StrictStr = Field(description="UID contents in text format. Each byte is represented by its hexadecimal value. The individual bytes are separated by spaces (e.g. F9 4F 41 60)", alias="UID") + atq_a: Optional[Any] = Field(description="Reply of the «A» type chip to «REQA» command of ISO/IEC 14443-3 protocol (Answer To Request, Type A – ATQA) – for the internal use by the main control library", alias="ATQ_A") + sak: Optional[Any] = Field(description="Response of type-A RFID-chip to SELECT command of ISO/IEC 14443-3 protocol (Select Acknowledge, SAK).", alias="SAK") + atq_b: Optional[Any] = Field(description="ATQ_B contents in text format. Each byte is represented by its hexadecimal value. The individual bytes are separated by spaces (e.g. 50 F9 4F 41 60 00 00 00 00 77 81 81)", alias="ATQ_B") + bit_rate_s: RfidBaudRate = Field(alias="BitRateS") + bit_rate_r: RfidBaudRate = Field(alias="BitRateR") + atr: StrictStr = Field(description="ATR-string of RFID-chip", alias="ATR") + __properties: ClassVar[List[str]] = ["RFID_Type", "Baudrate1", "Baudrate2", "Support_4", "ChipType_A", "Support_Mifare", "MifareMemory", "UID", "ATQ_A", "SAK", "ATQ_B", "BitRateS", "BitRateR", "ATR"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidCardPropertiesExt from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if atq_a (nullable) is None + # and model_fields_set contains the field + if self.atq_a is None and "atq_a" in self.model_fields_set: + _dict['ATQ_A'] = None + + # set to None if sak (nullable) is None + # and model_fields_set contains the field + if self.sak is None and "sak" in self.model_fields_set: + _dict['SAK'] = None + + # set to None if atq_b (nullable) is None + # and model_fields_set contains the field + if self.atq_b is None and "atq_b" in self.model_fields_set: + _dict['ATQ_B'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidCardPropertiesExt from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RFID_Type": obj.get("RFID_Type"), + "Baudrate1": obj.get("Baudrate1"), + "Baudrate2": obj.get("Baudrate2"), + "Support_4": obj.get("Support_4"), + "ChipType_A": obj.get("ChipType_A"), + "Support_Mifare": obj.get("Support_Mifare"), + "MifareMemory": obj.get("MifareMemory"), + "UID": obj.get("UID"), + "ATQ_A": obj.get("ATQ_A"), + "SAK": obj.get("SAK"), + "ATQ_B": obj.get("ATQ_B"), + "BitRateS": obj.get("BitRateS"), + "BitRateR": obj.get("BitRateR"), + "ATR": obj.get("ATR") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_certificate_ex.py b/regula/documentreader/webclient/gen/models/rfid_certificate_ex.py new file mode 100644 index 0000000..adb1e9a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_certificate_ex.py @@ -0,0 +1,130 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from regula.documentreader.webclient.gen.models.rfid_certificate_origin import RfidCertificateOrigin +from regula.documentreader.webclient.gen.models.rfid_certificate_type import RfidCertificateType +from regula.documentreader.webclient.gen.models.rfid_distinguished_name import RfidDistinguishedName +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.rfid_pki_extension import RfidPkiExtension +from regula.documentreader.webclient.gen.models.rfid_validity import RfidValidity +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString +from typing import Optional, Set +from typing_extensions import Self + +class RfidCertificateEx(BaseModel): + """ + Structure is used to describe the certificate contents used for the digital signature verification of the document security object within the context of the communication session with electronic document. + """ # noqa: E501 + version: Union[StrictFloat, StrictInt] = Field(description="Version of Certificate ASN.1 structure", alias="Version") + serial_number: StrictStr = Field(description="Certificate serial number. Base64 encoded.", alias="SerialNumber") + signature_algorithm: StrictStr = Field(description="Certificate digital signature algorithm identifier (OID); String in the format S1 (S2), where S1 – algorithm name, S2 – identifier (OID string).", alias="SignatureAlgorithm") + issuer: RfidDistinguishedName = Field(alias="Issuer") + validity: RfidValidity = Field(alias="Validity") + subject: RfidDistinguishedName = Field(alias="Subject") + subject_pk_algorithm: StrictStr = Field(description="Certificate public key algorithm identifier (OID); String in the format S1 (S2), where S1 – algorithm name, S2 – identifier (OID string).", alias="SubjectPKAlgorithm") + extensions: List[RfidPkiExtension] = Field(description="List of the certificate extensions", alias="Extensions") + notifications: List[ParsingNotificationCodes] = Field(description="List of remarks arisen during the analysis of the certificate data structure and its validity verification.", alias="Notifications") + origin: RfidCertificateOrigin = Field(alias="Origin") + type: RfidCertificateType = Field(alias="Type") + file_name: TrfFtString = Field(alias="FileName") + pa_status: RFIDErrorCodes = Field(alias="PA_Status") + __properties: ClassVar[List[str]] = ["Version", "SerialNumber", "SignatureAlgorithm", "Issuer", "Validity", "Subject", "SubjectPKAlgorithm", "Extensions", "Notifications", "Origin", "Type", "FileName", "PA_Status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidCertificateEx from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of issuer + if self.issuer: + _dict['Issuer'] = self.issuer.to_dict() + # override the default output from pydantic by calling `to_dict()` of validity + if self.validity: + _dict['Validity'] = self.validity.to_dict() + # override the default output from pydantic by calling `to_dict()` of subject + if self.subject: + _dict['Subject'] = self.subject.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in extensions (list) + _items = [] + if self.extensions: + for _item_extensions in self.extensions: + if _item_extensions: + _items.append(_item_extensions.to_dict()) + _dict['Extensions'] = _items + # override the default output from pydantic by calling `to_dict()` of file_name + if self.file_name: + _dict['FileName'] = self.file_name.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidCertificateEx from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Version": obj.get("Version"), + "SerialNumber": obj.get("SerialNumber"), + "SignatureAlgorithm": obj.get("SignatureAlgorithm"), + "Issuer": RfidDistinguishedName.from_dict(obj["Issuer"]) if obj.get("Issuer") is not None else None, + "Validity": RfidValidity.from_dict(obj["Validity"]) if obj.get("Validity") is not None else None, + "Subject": RfidDistinguishedName.from_dict(obj["Subject"]) if obj.get("Subject") is not None else None, + "SubjectPKAlgorithm": obj.get("SubjectPKAlgorithm"), + "Extensions": [RfidPkiExtension.from_dict(_item) for _item in obj["Extensions"]] if obj.get("Extensions") is not None else None, + "Notifications": obj.get("Notifications"), + "Origin": obj.get("Origin"), + "Type": obj.get("Type"), + "FileName": TrfFtString.from_dict(obj["FileName"]) if obj.get("FileName") is not None else None, + "PA_Status": obj.get("PA_Status") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_certificate_origin.py b/regula/documentreader/webclient/gen/models/rfid_certificate_origin.py new file mode 100644 index 0000000..83a102a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_certificate_origin.py @@ -0,0 +1,36 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidCertificateOrigin(int, Enum): + """ + Enumeration contains a set of constants that define the source of certificate used in the procedure of document security object digital signature verification + """ + + """ + allowed enum values + """ + UNDEFINED = 0 + PKD = 1 + SECURITY_OBJECT = 2 + USER_DEFINED = 3 + MASTER_LIST_PKD = 4 + MASTER_LIST_SO = 5 + DEFECT_LIST_SO = 6 + DEVIATION_LIST_SO = 7 + BLACK_LIST_SO = 8 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidCertificateOrigin from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_certificate_type.py b/regula/documentreader/webclient/gen/models/rfid_certificate_type.py new file mode 100644 index 0000000..77a54e3 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_certificate_type.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidCertificateType(int, Enum): + """ + Enumeration contains a set of constants that define the type of certificate used in the procedure of document security object digital signature verification + """ + + """ + allowed enum values + """ + UNDEFINED = 0 + CSCA = 1 + CSCA_LINK = 2 + DS = 3 + MLS = 4 + DEV_LS = 5 + DEF_LS = 6 + BLS = 7 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidCertificateType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_data_file.py b/regula/documentreader/webclient/gen/models/rfid_data_file.py new file mode 100644 index 0000000..eeaab3f --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_data_file.py @@ -0,0 +1,118 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.graphic_field_type import GraphicFieldType +from regula.documentreader.webclient.gen.models.parsed_data import ParsedData +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from regula.documentreader.webclient.gen.models.rfid_data_file_type import RfidDataFileType +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.security_object_certificates import SecurityObjectCertificates +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from regula.documentreader.webclient.gen.models.trf_ft_bytes import TrfFtBytes +from typing import Optional, Set +from typing_extensions import Self + +class RfidDataFile(BaseModel): + """ + Structure is used to describe the contents of a single file of the LDS of electronic document and the analysis of its contents within the context of the communication session with electronic document + """ # noqa: E501 + file_id: Optional[StrictStr] = Field(default=None, description="File identifier. Each byte of FileID represented by its hexadecimal value. The individual bytes are separated by spaces (e.g. 01 1E)", alias="FileID") + type: RfidDataFileType = Field(alias="Type") + file_data: Optional[TrfFtBytes] = Field(default=None, alias="FileData") + reading_status: RFIDErrorCodes = Field(alias="ReadingStatus") + reading_time: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Time of reading, milliseconds", alias="ReadingTime") + pa_status: Optional[RFIDErrorCodes] = Field(default=None, alias="PA_Status") + notifications: Optional[List[ParsingNotificationCodes]] = Field(default=None, description="List of remarks arisen when reading data from the memory of the chip and analysing their ASN.1-structure.", alias="Notifications") + doc_fields_text: Optional[List[TextFieldType]] = Field(default=None, description="List of document text fields formed on the basis of the file contents", alias="DocFields_Text") + doc_fields_graphics: Optional[List[GraphicFieldType]] = Field(default=None, description="List of document graphic fields formed on the basis of the file contents", alias="DocFields_Graphics") + doc_fields_originals: Optional[List[GraphicFieldType]] = Field(default=None, description="List of the original binary representation of graphic document fields formed on the basis of the file contents", alias="DocFields_Originals") + parsed_data: Optional[ParsedData] = Field(default=None, alias="ParsedData") + security_object_certificates: Optional[SecurityObjectCertificates] = Field(default=None, alias="SecurityObject_Certificates") + __properties: ClassVar[List[str]] = ["FileID", "Type", "FileData", "ReadingStatus", "ReadingTime", "PA_Status", "Notifications", "DocFields_Text", "DocFields_Graphics", "DocFields_Originals", "ParsedData", "SecurityObject_Certificates"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidDataFile from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of file_data + if self.file_data: + _dict['FileData'] = self.file_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of parsed_data + if self.parsed_data: + _dict['ParsedData'] = self.parsed_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of security_object_certificates + if self.security_object_certificates: + _dict['SecurityObject_Certificates'] = self.security_object_certificates.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidDataFile from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FileID": obj.get("FileID"), + "Type": obj.get("Type"), + "FileData": TrfFtBytes.from_dict(obj["FileData"]) if obj.get("FileData") is not None else None, + "ReadingStatus": obj.get("ReadingStatus"), + "ReadingTime": obj.get("ReadingTime"), + "PA_Status": obj.get("PA_Status"), + "Notifications": obj.get("Notifications"), + "DocFields_Text": obj.get("DocFields_Text"), + "DocFields_Graphics": obj.get("DocFields_Graphics"), + "DocFields_Originals": obj.get("DocFields_Originals"), + "ParsedData": ParsedData.from_dict(obj["ParsedData"]) if obj.get("ParsedData") is not None else None, + "SecurityObject_Certificates": SecurityObjectCertificates.from_dict(obj["SecurityObject_Certificates"]) if obj.get("SecurityObject_Certificates") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_data_file_type.py b/regula/documentreader/webclient/gen/models/rfid_data_file_type.py new file mode 100644 index 0000000..a3d5242 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_data_file_type.py @@ -0,0 +1,119 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidDataFileType(int, Enum): + """ + Enumeration contains a set of constants that define the file type (or logical belonging of the data object) within the context of the communication session with electronic document + """ + + """ + allowed enum values + """ + UNSPECIFIED = 0 + PASSPORT_DG1 = 1 + PASSPORT_DG2 = 2 + PASSPORT_DG3 = 3 + PASSPORT_DG4 = 4 + PASSPORT_DG5 = 5 + PASSPORT_DG6 = 6 + PASSPORT_DG7 = 7 + PASSPORT_DG8 = 8 + PASSPORT_DG9 = 9 + PASSPORT_DG10 = 10 + PASSPORT_DG11 = 11 + PASSPORT_DG12 = 12 + PASSPORT_DG13 = 13 + PASSPORT_DG14 = 14 + PASSPORT_DG15 = 15 + PASSPORT_DG16 = 16 + PASSPORT_DG17 = 17 + PASSPORT_DG18 = 18 + PASSPORT_DG19 = 19 + PASSPORT_DG20 = 20 + PASSPORT_SOD = 21 + PASSPORT_CVCA = 22 + PASSPORT_COM = 23 + DTC_DG17 = 57 + DTC_DG18 = 58 + DTC_DG22 = 62 + DTC_DG23 = 63 + DTC_DG24 = 64 + ID_DG1 = 101 + ID_DG2 = 102 + ID_DG3 = 103 + ID_DG4 = 104 + ID_DG5 = 105 + ID_DG6 = 106 + ID_DG7 = 107 + ID_DG8 = 108 + ID_DG9 = 109 + ID_DG10 = 110 + ID_DG11 = 111 + ID_DG12 = 112 + ID_DG13 = 113 + ID_DG14 = 114 + ID_DG15 = 115 + ID_DG16 = 116 + ID_DG17 = 117 + ID_DG18 = 118 + ID_DG19 = 119 + ID_DG20 = 120 + ID_DG21 = 121 + DL_COM = 150 + DL_DG1 = 151 + DL_DG2 = 152 + DL_DG3 = 153 + DL_DG4 = 154 + DL_DG5 = 155 + DL_DG6 = 156 + DL_DG7 = 157 + DL_DG8 = 158 + DL_DG9 = 159 + DL_DG10 = 160 + DL_DG11 = 161 + DL_DG12 = 162 + DL_DG13 = 163 + DL_DG14 = 164 + DL_SOD = 165 + DL_CE = 166 + DL_CVCA = 167 + PACE_CARD_ACCESS = 200 + PACE_CARD_SECURITY = 201 + PACE_CHIP_SECURITY = 202 + MIFARE_DATA = 300 + MIFARE_VALIDITY = 301 + AUTHENTICITY_V2 = 302 + ATR = 400 + _E_SIGN_PK = 500 + _E_SIGN_SIGNED_DATA = 501 + CERTIFICATE = 600 + MASTER_LIST = 601 + DEFECT_LIST = 602 + BLACK_LIST = 603 + APP_DIRECTORY = 700 + SESSION = 701 + LOG_DATA = 702 + CHIP_PROPERTIES = 703 + POST_CA_RESPONSE = 710 + POST_CA_PUBLIC_KEY = 711 + POST_CA_INFO = 712 + POST_CA_D_PARAMS = 713 + POST_CA_CHECK_PK = 714 + POST_CA_CHECK_SK = 715 + USER_DEFINED = 1000 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidDataFileType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_data_group_type_tag.py b/regula/documentreader/webclient/gen/models/rfid_data_group_type_tag.py new file mode 100644 index 0000000..01a1c4d --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_data_group_type_tag.py @@ -0,0 +1,82 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidDataGroupTypeTag(int, Enum): + """ + Enumeration representing RFID Data Group Types. Constants with prefix correspond to the informational data groups of ePassport application, with prefix EID_ – those of eID application, with prefix EDL_ – eDL application + """ + + """ + allowed enum values + """ + COM = 96 + DG1 = 97 + DG2 = 117 + DG3 = 99 + DG4 = 118 + DG5 = 101 + DG6 = 102 + DG7 = 103 + DG8 = 104 + DG9 = 105 + DG10 = 106 + DG11 = 107 + DG12 = 108 + DG13 = 109 + DG14 = 110 + DG15 = 111 + DG16 = 112 + SOD = 119 + EID_DG1 = 97 + EID_DG2 = 98 + EID_DG3 = 99 + EID_DG4 = 100 + EID_DG5 = 101 + EID_DG6 = 102 + EID_DG7 = 103 + EID_DG8 = 104 + EID_DG9 = 105 + EID_DG10 = 106 + EID_DG11 = 107 + EID_DG12 = 108 + EID_DG13 = 109 + EID_DG14 = 110 + EID_DG15 = 111 + EID_DG16 = 112 + EID_DG17 = 113 + EID_DG18 = 114 + EID_DG19 = 115 + EID_DG20 = 116 + EID_DG21 = 117 + EDL_COM = 96 + EDL_SOD = 119 + EDL_CE = 119 + EDL_DG1 = 97 + EDL_DG2 = 107 + EDL_DG3 = 108 + EDL_DG4 = 101 + EDL_DG5 = 103 + EDL_DG6 = 117 + EDL_DG7 = 99 + EDL_DG8 = 118 + EDL_DG9 = 112 + EDL_DG11 = 109 + EDL_DG12 = 113 + EDL_DG13 = 111 + EDL_DG14 = 110 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidDataGroupTypeTag from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_dg1.py b/regula/documentreader/webclient/gen/models/rfid_dg1.py new file mode 100644 index 0000000..0127773 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_dg1.py @@ -0,0 +1,111 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.document_format import DocumentFormat +from regula.documentreader.webclient.gen.models.rfid_data_group_type_tag import RfidDataGroupTypeTag +from typing import Optional, Set +from typing_extensions import Self + +class RfidDG1(BaseModel): + """ + Structure used to store the contents of EF.DG1 informational data group of ePassport application – document MRZ data + """ # noqa: E501 + type: RfidDataGroupTypeTag = Field(alias="Type") + document_id: DocumentFormat = Field(alias="DocumentID") + document_type: StrictStr = Field(description="Symbolic code of document type", alias="DocumentType") + state: StrictStr = Field(description="Symbolic code of document issuing state", alias="State") + holder: StrictStr = Field(description="DO’s name and surname", alias="Holder") + document_number: StrictStr = Field(description="Document number", alias="DocumentNumber") + check_digit_document_number: Union[StrictFloat, StrictInt] = Field(description="Check digit of document number", alias="CheckDigitDocumentNumber") + nationality: StrictStr = Field(description="Symbolic code of DO’s nationality", alias="Nationality") + birthday: StrictStr = Field(description="DO’s date of birth", alias="Birthday") + check_digit_birthday: Union[StrictFloat, StrictInt] = Field(description="Check digit of DO’s date of birth", alias="CheckDigitBirthday") + sex: StrictStr = Field(description="DO’s sex", alias="Sex") + expiry_date: StrictStr = Field(description="Term of validity of the document", alias="ExpiryDate") + check_digit_expiry_date: Union[StrictFloat, StrictInt] = Field(description="Check digit of term of validity of the document", alias="CheckDigitExpiryDate") + optional_data: StrictStr = Field(description="DO’s personal number or other additional data", alias="OptionalData") + check_digit_optional_data: Union[StrictFloat, StrictInt] = Field(description="Check digit of additional data", alias="CheckDigitOptionalData") + check_digit_composite: Union[StrictFloat, StrictInt] = Field(description="General check digit", alias="CheckDigitComposite") + __properties: ClassVar[List[str]] = ["Type", "DocumentID", "DocumentType", "State", "Holder", "DocumentNumber", "CheckDigitDocumentNumber", "Nationality", "Birthday", "CheckDigitBirthday", "Sex", "ExpiryDate", "CheckDigitExpiryDate", "OptionalData", "CheckDigitOptionalData", "CheckDigitComposite"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidDG1 from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidDG1 from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "DocumentID": obj.get("DocumentID"), + "DocumentType": obj.get("DocumentType"), + "State": obj.get("State"), + "Holder": obj.get("Holder"), + "DocumentNumber": obj.get("DocumentNumber"), + "CheckDigitDocumentNumber": obj.get("CheckDigitDocumentNumber"), + "Nationality": obj.get("Nationality"), + "Birthday": obj.get("Birthday"), + "CheckDigitBirthday": obj.get("CheckDigitBirthday"), + "Sex": obj.get("Sex"), + "ExpiryDate": obj.get("ExpiryDate"), + "CheckDigitExpiryDate": obj.get("CheckDigitExpiryDate"), + "OptionalData": obj.get("OptionalData"), + "CheckDigitOptionalData": obj.get("CheckDigitOptionalData"), + "CheckDigitComposite": obj.get("CheckDigitComposite") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_distinguished_name.py b/regula/documentreader/webclient/gen/models/rfid_distinguished_name.py new file mode 100644 index 0000000..78ec7a1 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_distinguished_name.py @@ -0,0 +1,95 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.rfid_attribute_name import RfidAttributeName +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString +from typing import Optional, Set +from typing_extensions import Self + +class RfidDistinguishedName(BaseModel): + """ + Contents of the identifier in binary form. Base64 encoded. + """ # noqa: E501 + data: StrictStr = Field(description="Contents of the identifier in binary form. Base64 encoded.", alias="Data") + friendly_name: TrfFtString = Field(alias="FriendlyName") + attributes: List[RfidAttributeName] = Field(description="List of individual attributes contained in the identifier", alias="Attributes") + __properties: ClassVar[List[str]] = ["Data", "FriendlyName", "Attributes"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidDistinguishedName from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of friendly_name + if self.friendly_name: + _dict['FriendlyName'] = self.friendly_name.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in attributes (list) + _items = [] + if self.attributes: + for _item_attributes in self.attributes: + if _item_attributes: + _items.append(_item_attributes.to_dict()) + _dict['Attributes'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidDistinguishedName from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Data": obj.get("Data"), + "FriendlyName": TrfFtString.from_dict(obj["FriendlyName"]) if obj.get("FriendlyName") is not None else None, + "Attributes": [RfidAttributeName.from_dict(_item) for _item in obj["Attributes"]] if obj.get("Attributes") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field.py b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field.py new file mode 100644 index 0000000..48fd023 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field.py @@ -0,0 +1,120 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.string_recognition_result import StringRecognitionResult +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from typing import Optional, Set +from typing_extensions import Self + +class RFIDDocVisualExtendedField(BaseModel): + """ + RFIDDocVisualExtendedField + """ # noqa: E501 + field_type: StrictInt = Field(alias="FieldType") + w_field_type: TextFieldType = Field(alias="wFieldType") + field_name: StrictStr = Field(description="Field symbolic name (null-terminated string)", alias="FieldName") + strings_count: Union[StrictFloat, StrictInt] = Field(description="Number of StringsResult array elements", alias="StringsCount") + strings_result: List[StringRecognitionResult] = Field(description="Array of recognizing probabilities for a each line of text field. Only for Result.VISUAL_TEXT and Result.MRZ_TEXT results.", alias="StringsResult") + buf_length: Union[StrictFloat, StrictInt] = Field(description="Buf_Text text string length", alias="Buf_Length") + buf_text: StrictStr = Field(description="Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^'", alias="Buf_Text") + field_mask: Optional[StrictStr] = Field(default=None, alias="FieldMask") + validity: Optional[StrictInt] = Field(default=None, alias="Validity") + in_comparison: Optional[StrictInt] = Field(default=None, alias="InComparison") + w_lcid: Optional[StrictInt] = Field(default=None, alias="wLCID") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + reserved3: Optional[StrictInt] = Field(default=None, alias="Reserved3") + origin_dg: StrictInt = Field(alias="OriginDG") + origin_dg_tag: Optional[StrictInt] = Field(default=None, alias="OriginDGTag") + origin_tag_entry: Union[StrictFloat, StrictInt] = Field(description="Record index of the text field source in the data group", alias="OriginTagEntry") + origin_entry_view: Optional[StrictInt] = Field(default=None, alias="OriginEntryView") + __properties: ClassVar[List[str]] = ["FieldType", "wFieldType", "FieldName", "StringsCount", "StringsResult", "Buf_Length", "Buf_Text", "FieldMask", "Validity", "InComparison", "wLCID", "Reserved2", "Reserved3", "OriginDG", "OriginDGTag", "OriginTagEntry", "OriginEntryView"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in strings_result (list) + _items = [] + if self.strings_result: + for _item_strings_result in self.strings_result: + if _item_strings_result: + _items.append(_item_strings_result.to_dict()) + _dict['StringsResult'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldType": obj.get("FieldType"), + "wFieldType": obj.get("wFieldType"), + "FieldName": obj.get("FieldName"), + "StringsCount": obj.get("StringsCount"), + "StringsResult": [StringRecognitionResult.from_dict(_item) for _item in obj["StringsResult"]] if obj.get("StringsResult") is not None else None, + "Buf_Length": obj.get("Buf_Length"), + "Buf_Text": obj.get("Buf_Text"), + "FieldMask": obj.get("FieldMask"), + "Validity": obj.get("Validity"), + "InComparison": obj.get("InComparison"), + "wLCID": obj.get("wLCID"), + "Reserved2": obj.get("Reserved2"), + "Reserved3": obj.get("Reserved3"), + "OriginDG": obj.get("OriginDG"), + "OriginDGTag": obj.get("OriginDGTag"), + "OriginTagEntry": obj.get("OriginTagEntry"), + "OriginEntryView": obj.get("OriginEntryView") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field_item.py b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field_item.py new file mode 100644 index 0000000..b4581c1 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_field_item.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing import Optional, Set +from typing_extensions import Self + +class RFIDDocVisualExtendedFieldItem(BaseModel): + """ + RFIDDocVisualExtendedFieldItem + """ # noqa: E501 + origin_dg: StrictInt = Field(alias="OriginDG") + origin_dg_tag: Optional[StrictInt] = Field(default=None, alias="OriginDGTag") + origin_tag_entry: Union[StrictFloat, StrictInt] = Field(description="Record index of the text field source in the data group", alias="OriginTagEntry") + origin_entry_view: Optional[StrictInt] = Field(default=None, alias="OriginEntryView") + __properties: ClassVar[List[str]] = ["OriginDG", "OriginDGTag", "OriginTagEntry", "OriginEntryView"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedFieldItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedFieldItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "OriginDG": obj.get("OriginDG"), + "OriginDGTag": obj.get("OriginDGTag"), + "OriginTagEntry": obj.get("OriginTagEntry"), + "OriginEntryView": obj.get("OriginEntryView") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info.py b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info.py new file mode 100644 index 0000000..6fa88bb --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info.py @@ -0,0 +1,89 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_field import RFIDDocVisualExtendedField +from typing import Optional, Set +from typing_extensions import Self + +class RFIDDocVisualExtendedInfo(BaseModel): + """ + Container for extracted text fields. Fields are identified by type and language + """ # noqa: E501 + n_fields: Union[StrictFloat, StrictInt] = Field(description="Number of pArrayFields array elements", alias="nFields") + p_array_fields: List[RFIDDocVisualExtendedField] = Field(alias="pArrayFields") + __properties: ClassVar[List[str]] = ["nFields", "pArrayFields"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in p_array_fields (list) + _items = [] + if self.p_array_fields: + for _item_p_array_fields in self.p_array_fields: + if _item_p_array_fields: + _items.append(_item_p_array_fields.to_dict()) + _dict['pArrayFields'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "nFields": obj.get("nFields"), + "pArrayFields": [RFIDDocVisualExtendedField.from_dict(_item) for _item in obj["pArrayFields"]] if obj.get("pArrayFields") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info_item.py b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info_item.py new file mode 100644 index 0000000..907a54b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_doc_visual_extended_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info import RFIDDocVisualExtendedInfo +from typing import Optional, Set +from typing_extensions import Self + +class RFIDDocVisualExtendedInfoItem(BaseModel): + """ + RFIDDocVisualExtendedInfoItem + """ # noqa: E501 + doc_visual_extended_info: RFIDDocVisualExtendedInfo = Field(alias="DocVisualExtendedInfo") + __properties: ClassVar[List[str]] = ["DocVisualExtendedInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_visual_extended_info + if self.doc_visual_extended_info: + _dict['DocVisualExtendedInfo'] = self.doc_visual_extended_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDDocVisualExtendedInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "DocVisualExtendedInfo": RFIDDocVisualExtendedInfo.from_dict(obj["DocVisualExtendedInfo"]) if obj.get("DocVisualExtendedInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_error_codes.py b/regula/documentreader/webclient/gen/models/rfid_error_codes.py new file mode 100644 index 0000000..3e34e24 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_error_codes.py @@ -0,0 +1,141 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RFIDErrorCodes(int, Enum): + """ + Enumeration contains a set of error codes returned by SDK + """ + + """ + allowed enum values + """ + RFID_ERROR_LAYER6_FILE_EOF1 = 2147508866 + RFID_ERROR_LAYER6_PWD_DEACTIVATED = 2147508867 + RFID_ERROR_LAYER6_PWD_BLOCKED = 2147509184 + RFID_ERROR_LAYER6_PWD_SUSPEND = 2147509185 + RFID_ERROR_LAYER6_PWD_BLOCKED2 = 2147510659 + RFID_ERROR_LAYER6_PWD_DEACTIVATED2 = 2147510660 + RFID_ERROR_LAYER6_PWD_SUSPEND2 = 2147510661 + RFID_ERROR_LAYER6_INCORRECT_PARAMS = 2147510912 + RFID_ERROR_LAYER6_FILE_NOT_FOUND = 2147510914 + RFID_ERROR_LAYER6_NO_REFERENCE_DATA = 2147510920 + RFID_ERROR_LAYER6_FILE_EOF2 = 2147511040 + RFID_ERROR_NO_CHIP_DETECTED = 2147549185 + RFID_ERROR_NOT_AVAILABLE = 2147549186 + RFID_ERROR_INVALID_PARAMETER = 2147549188 + RFID_ERROR_NOT_INITIALIZED = 2147549189 + RFID_ERROR_NOT_ENOUGH_MEMORY = 2147549190 + RFID_ERROR_INVALID_DIRECTORY = 2147549192 + RFID_ERROR_UNKNOWN_COMMAND = 2147549193 + RFID_ERROR_FILE_IO_ERROR = 2147549194 + RFID_ERROR_BUSY = 2147549195 + RFID_ERROR_OLD_FIRMWARE = 2147549196 + RFID_ERROR_PCSC_FAILED = 2147614720 + RFID_ERROR_PCSC_READER_NOT_AVAILABLE = 2147614721 + RFID_ERROR_PCSC_CANT_CONNECT_CARD = 2147614722 + RFID_ERROR_PCSC_CARD_IS_NOT_CONNECTED = 2147614723 + RFID_ERROR_PCSC_OPERATION_CANCELLED = 2147614724 + RFID_ERROR_PCSC_CARD_IS_BUSY = 2147614725 + RFID_ERROR_PCSC_FAILED_SCARD = 2147614726 + RFID_ERROR_PCSC_EXT_LE_FAILED = 2147614736 + RFID_ERROR_LAYER6_PWD_FAILED = 2148557760 + RFID_ERROR_NOT_PERFORMED = 2197815296 + RFID_ERROR_SESSION_IS_CLOSED = 2197815297 + RFID_ERROR_SESSION_TERMINAL_UNSUPPORTED_OPERATION = 2197815298 + RFID_ERROR_SESSION_TERMINAL_TYPE_UNKNOWN = 2197815312 + RFID_ERROR_SESSION_TERMINAL_TYPE_BAD_CERTIFICATE = 2197815313 + RFID_ERROR_SESSION_TERMINAL_TYPE_NOT_SET = 2197815314 + RFID_ERROR_SESSION_PROCEDURE_TYPE_UNKNOWN = 2197815315 + RFID_ERROR_Session_Procedure_Type_Unsupported = 2197815316 + RFID_ERROR_SESSION_PROCEDURE_TYPE_NOT_SET = 2197815317 + RFID_ERROR_SESSION_ACCESS_KEY_UNKNOWN_TYPE = 2197815318 + RFID_ERROR_SESSION_ACCESS_KEY_UNSUPPORTED_SM_TYPE = 2197815319 + RFID_ERROR_SESSION_ACCESS_KEY_INCORRECT_SM_TYPE = 2197815320 + RFID_ERROR_SESSION_ACCESS_KEY_RESTRICTED = 2197815321 + RFID_ERROR_SESSION_ACCESS_KEY_INCORRECT_DATA = 2197815322 + RFID_ERROR_SESSION_ACCESS_KEY_NOT_SET = 2197815323 + RFID_ERROR_SESSION_PWD_MANAGEMENT_NOT_AUTHORIZED = 2197815324 + RFID_ERROR_SESSION_ACCESS_CONTROL_UNKNOWN_TYPE = 2197815328 + RFID_ERROR_SESSION_ACCESS_CONTROL_REQUIRES_SM = 2197815329 + RFID_ERROR_SESSION_ACCESS_CONTROL_REQUIRES_PACE = 2197815330 + RFID_ERROR_SESSION_ACCESS_CONTROL_REQUIRES_CA_KEYS = 2197815331 + RFID_ERROR_SESSION_ACCESS_CONTROL_REQUIRES_TA = 2197815332 + RFID_ERROR_SESSION_ACCESS_CONTROL_REQUIRES_CA = 2197815333 + RFID_ERROR_SESSION_ACCESS_CONTROL_INCORRECT_OPTION_CA = 2197815334 + RFID_ERROR_SESSION_ACCESS_CONTROL_CA_FAILED = 2197815335 + RFID_ERROR_SESSION_ACCESS_CONTROL_TA_FAILED = 2197815336 + RFID_ERROR_SESSION_ACCESS_CONTROL_AA_FAILED = 2197815337 + RFID_ERROR_SESSION_ACCESS_CONTROL_RI_FAILED = 2197815338 + RFID_ERROR_SESSION_PA_SIGNATURE_CHECK_FAILED = 2197815344 + RFID_ERROR_SESSION_PA_HASH_CHECK_FAILED = 2197815345 + RFID_ERROR_SESSION_INVALID_AUX_DATA_DATE_OF_EXPIRY = 2197815360 + RFID_ERROR_SESSION_INVALID_AUX_DATA_DATE_OF_BIRTH = 2197815361 + RFID_ERROR_SESSION_INVALID_AUX_DATA_COMMUNITY_ID = 2197815362 + RFID_ERROR_SESSION_E_SIGN_REQUIRES_APP_SELECTION = 2197815376 + RFID_ERROR_SESSION_E_SIGN_PIN_NOT_SET = 2197815377 + RFID_ERROR_SESSION_E_SIGN_PIN_NOT_VERIFIED = 2197815378 + RFID_ERROR_SESSION_INCORRECT_DATA = 2197815392 + RFID_ERROR_SESSION_FILE_NOT_ENOUGH_DATA = 2197880832 + RFID_ERROR_SESSION_FILE_INCORRECT_DATA = 2197946368 + RFID_ERROR_SESSION_FILE_UNEXPECTED_DATA = 2198011904 + RFID_ERROR_SESSION_FILE_CONTENTS_UNEXPECTED_DATA = 2198077440 + RFID_ERROR_SESSION_FILE_WRONG_TAG = 2198142976 + RFID_ERROR_SESSION_FILE_CANT_USE_DATA = 2198208512 + RFID_ERROR_SESSION_FILE_CANT_READ_DATA = 2198274048 + RFID_ERROR_SESSION_FILE_ACCESS_DENIED = 2198339584 + RFID_ERROR_LAYER34_NO_ERROR = 2214592512 + RFID_ERROR_LAYER34_TIME_OUT = 2214658048 + RFID_ERROR_LAYER34_COLLISION = 2214723584 + RFID_ERROR_LAYER34_CRC = 2214789120 + RFID_ERROR_LAYER34_DATA_INTEGRITY = 2214854656 + RFID_ERROR_LAYER34_DATA_LENGTH = 2214920192 + RFID_ERROR_Layer34_RFU = 2214985728 + RFID_ERROR_LAYER34_COLLISION_TOO_MANY = 2215051264 + RFID_ERROR_LAYER34_PROTOCOL_B = 2215116800 + RFID_ERROR_LAYER34_DATA_CONTENTS = 2215182336 + RFID_ERROR_LAYER34_PROTOCOL = 2215247872 + RFID_ERROR_LAYER34_GLOBAL_TIME_OUT = 2215313408 + RFID_ERROR_LAYER34_MIFARE_AUTH = 2215378944 + RFID_ERROR_LAYER34_SAM_ERROR = 2215444480 + RFID_ERROR_LAYER34_SAM_COLLISION = 2215510016 + RFID_ERROR_LAYER34_SAM_ACKNOWLEDGE = 2215575552 + RFID_ERROR_LAYER6_SECURITY_MANAGER = 2248146944 + RFID_ERROR_LAYER6_APP_SELECTION_FAILURE = 2248146945 + RFID_ERROR_LAYER6_MUTUAL_AUTH_MAC_FAIL = 2248147200 + RFID_ERROR_LAYER6_MUTUAL_AUTH_ENC_FAIL = 2248147201 + RFID_ERROR_LAYER6_MUTUAL_AUTH_FAILURE = 2248147202 + RFID_ERROR_LAYER6_MUTUAL_AUTH_FAILURE_DATA = 2248147203 + RFID_ERROR_LAYER6_SM_DO_8E_MISSING = 2248147456 + RFID_ERROR_LAYER6_SM_DO_87_MISSING = 2248147457 + RFID_ERROR_LAYER6_SM_DO_99_MISSING = 2248147458 + RFID_ERROR_LAYER6_SM_MAC_INCORRECT = 2248147459 + RFID_ERROR_LAYER6_SM_DO_87_INCORRECT = 2248147460 + RFID_ERROR_LAYER6_NON_TLV_RESPONSE_DATA = 2248147712 + RFID_ERROR_LAYER6_WRONG_RND_ICC_LENGTH = 2248147713 + RFID_ERROR_LAYER6_INT_AUTH_FAILURE = 2248147714 + RFID_ERROR_LAYER6_MSE_SET_KAT_FAILURE = 2248147715 + RFID_ERROR_LAYER6_MSE_SET_DST_FAILURE = 2248147716 + RFID_ERROR_LAYER6_PSO_CERTIFICATE_FAILURE = 2248147717 + RFID_ERROR_LAYER6_MSE_SET_AT_FAILURE = 2248147718 + RFID_ERROR_LAYER6_GET_CHALLENGE_FAILURE = 2248147719 + RFID_ERROR_LAYER6_EXT_AUTH_FAILURE = 2248147720 + RFID_ERROR_LAYER6_GENERAL_AUTH_FAILURE = 2248147721 + RFID_ERROR_FAILED = 4294967295 + RFID_ERROR_NO_ERROR = 1 + RFID_ERROR_ALREADY_DONE = 2 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RFIDErrorCodes from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_graphics_info_result.py b/regula/documentreader/webclient/gen/models/rfid_graphics_info_result.py new file mode 100644 index 0000000..51f8f2e --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_graphics_info_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info import TOriginalRFIDGraphicsInfo +from typing import Optional, Set +from typing_extensions import Self + +class RFIDGraphicsInfoResult(ResultItem): + """ + RFIDGraphicsInfoResult + """ # noqa: E501 + t_original_rfid_graphics_info: TOriginalRFIDGraphicsInfo = Field(alias="TOriginalRFIDGraphicsInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "TOriginalRFIDGraphicsInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDGraphicsInfoResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of t_original_rfid_graphics_info + if self.t_original_rfid_graphics_info: + _dict['TOriginalRFIDGraphicsInfo'] = self.t_original_rfid_graphics_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDGraphicsInfoResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "TOriginalRFIDGraphicsInfo": TOriginalRFIDGraphicsInfo.from_dict(obj["TOriginalRFIDGraphicsInfo"]) if obj.get("TOriginalRFIDGraphicsInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_location.py b/regula/documentreader/webclient/gen/models/rfid_location.py old mode 100755 new mode 100644 index 2a0f438..4b4118a --- a/regula/documentreader/webclient/gen/models/rfid_location.py +++ b/regula/documentreader/webclient/gen/models/rfid_location.py @@ -4,96 +4,27 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Determines the presence and location of an RFID chip in a document. 0 - no rfid chip; 1 - chip is located in the document data page; 2 - chip is located in the back page or inlay of the document -""" -class RfidLocation(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class RfidLocation(int, Enum): + """ + Determines the presence and location of an RFID chip in a document. 0 - no rfid chip; 1 - chip is located in the document data page; 2 - chip is located in the back page or inlay of the document """ - - NONE = int("0") - - MAIN_PAGE = int("1") - - BACK_PAGE = int("2") - - allowable_values = [NONE, MAIN_PAGE, BACK_PAGE] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """RfidLocation - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, RfidLocation): - return False + NONE = 0 + MAIN_PAGE = 1 + BACK_PAGE = 2 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidLocation from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, RfidLocation): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/rfid_origin.py b/regula/documentreader/webclient/gen/models/rfid_origin.py old mode 100755 new mode 100644 index 0313e5b..298971f --- a/regula/documentreader/webclient/gen/models/rfid_origin.py +++ b/regula/documentreader/webclient/gen/models/rfid_origin.py @@ -4,203 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Location of data in RFID chip -""" -class RfidOrigin(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class RfidOrigin(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'dg': 'int', - 'dg_tag': 'int', - 'tag_entry': 'int', - 'entry_view': 'int' - } - - attribute_map = { - 'dg': 'dg', - 'dg_tag': 'dgTag', - 'tag_entry': 'tagEntry', - 'entry_view': 'entryView' - } - - def __init__(self, dg=None, dg_tag=None, tag_entry=None, entry_view=None, local_vars_configuration=None): # noqa: E501 - """RfidOrigin - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._dg = None - self._dg_tag = None - self._tag_entry = None - self._entry_view = None - self.discriminator = None - - self.dg = dg - if dg_tag is not None: - self.dg_tag = dg_tag - if tag_entry is not None: - self.tag_entry = tag_entry - if entry_view is not None: - self.entry_view = entry_view - - @property - def dg(self): - """Gets the dg of this RfidOrigin. # noqa: E501 - - Source data group file # noqa: E501 - - :return: The dg of this RfidOrigin. # noqa: E501 - :rtype: int - """ - return self._dg - - @dg.setter - def dg(self, dg): - """Sets the dg of this RfidOrigin. - - Source data group file # noqa: E501 - - :param dg: The dg of this RfidOrigin. # noqa: E501 - :type dg: int - """ - if self.local_vars_configuration.client_side_validation and dg is None: # noqa: E501 - raise ValueError("Invalid value for `dg`, must not be `None`") # noqa: E501 - - self._dg = dg - - @property - def dg_tag(self): - """Gets the dg_tag of this RfidOrigin. # noqa: E501 - - Index of the source record of the image with biometric information in the information data group # noqa: E501 - - :return: The dg_tag of this RfidOrigin. # noqa: E501 - :rtype: int - """ - return self._dg_tag - - @dg_tag.setter - def dg_tag(self, dg_tag): - """Sets the dg_tag of this RfidOrigin. - - Index of the source record of the image with biometric information in the information data group # noqa: E501 - - :param dg_tag: The dg_tag of this RfidOrigin. # noqa: E501 - :type dg_tag: int - """ - - self._dg_tag = dg_tag - - @property - def tag_entry(self): - """Gets the tag_entry of this RfidOrigin. # noqa: E501 - - Index of the template in the record with biometric data # noqa: E501 - - :return: The tag_entry of this RfidOrigin. # noqa: E501 - :rtype: int + Location of data in RFID chip + """ # noqa: E501 + dg: StrictInt = Field(description="Source data group file") + dg_tag: StrictInt = Field(description="Index of the source record of the image with biometric information in the information data group", alias="dgTag") + tag_entry: StrictInt = Field(description="Index of the template in the record with biometric data", alias="tagEntry") + entry_view: StrictInt = Field(description="Index of the variant of the biometric data template", alias="entryView") + __properties: ClassVar[List[str]] = ["dg", "dgTag", "tagEntry", "entryView"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidOrigin from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._tag_entry - - @tag_entry.setter - def tag_entry(self, tag_entry): - """Sets the tag_entry of this RfidOrigin. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidOrigin from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "dg": obj.get("dg"), + "dgTag": obj.get("dgTag"), + "tagEntry": obj.get("tagEntry"), + "entryView": obj.get("entryView") + }) + return _obj - Index of the template in the record with biometric data # noqa: E501 - - :param tag_entry: The tag_entry of this RfidOrigin. # noqa: E501 - :type tag_entry: int - """ - - self._tag_entry = tag_entry - - @property - def entry_view(self): - """Gets the entry_view of this RfidOrigin. # noqa: E501 - - Index of the variant of the biometric data template # noqa: E501 - - :return: The entry_view of this RfidOrigin. # noqa: E501 - :rtype: int - """ - return self._entry_view - - @entry_view.setter - def entry_view(self, entry_view): - """Sets the entry_view of this RfidOrigin. - - Index of the variant of the biometric data template # noqa: E501 - - :param entry_view: The entry_view of this RfidOrigin. # noqa: E501 - :type entry_view: int - """ - self._entry_view = entry_view - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, RfidOrigin): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, RfidOrigin): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/rfid_password_type.py b/regula/documentreader/webclient/gen/models/rfid_password_type.py new file mode 100644 index 0000000..b175463 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_password_type.py @@ -0,0 +1,34 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidPasswordType(int, Enum): + """ + Enumeration contains a set of constants specifying the rate of data exchange between the reader and the RFID-chip + """ + + """ + allowed enum values + """ + UNKNOWN = 0 + MRZ = 1 + CAN = 2 + PIN = 3 + PUK = 4 + PIN_E_SIGN = 5 + SAI = 6 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidPasswordType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_pki_extension.py b/regula/documentreader/webclient/gen/models/rfid_pki_extension.py new file mode 100644 index 0000000..031b270 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_pki_extension.py @@ -0,0 +1,81 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class RfidPkiExtension(BaseModel): + """ + Extension identifier (OID, ASCII string); Contents of the identifier in the format S1 (S2), where S1 – attribute name, S2 – identifier (OID string) + """ # noqa: E501 + type: StrictStr = Field(description="Extension identifier (OID, ASCII string); Contents of the identifier in the format S1 (S2), where S1 – attribute name, S2 – identifier (OID string)", alias="Type") + data: StrictStr = Field(description="Extension binary data. Base64 encoded.", alias="Data") + __properties: ClassVar[List[str]] = ["Type", "Data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidPkiExtension from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidPkiExtension from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Data": obj.get("Data") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_raw_data.py b/regula/documentreader/webclient/gen/models/rfid_raw_data.py new file mode 100644 index 0000000..8e8f207 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_raw_data.py @@ -0,0 +1,81 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class RfidRawData(BaseModel): + """ + RfidRawData + """ # noqa: E501 + data: StrictStr = Field(alias="Data") + field_type: StrictInt = Field(alias="FieldType") + __properties: ClassVar[List[str]] = ["Data", "FieldType"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidRawData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidRawData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Data": obj.get("Data"), + "FieldType": obj.get("FieldType") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_security_object.py b/regula/documentreader/webclient/gen/models/rfid_security_object.py new file mode 100644 index 0000000..3307a47 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_security_object.py @@ -0,0 +1,96 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from regula.documentreader.webclient.gen.models.rfid_signer_info_ex import RfidSignerInfoEx +from typing import Optional, Set +from typing_extensions import Self + +class RfidSecurityObject(BaseModel): + """ + Structure is used to describe the contents of a single document security object (SO) and the results of its check within the context of the communication session with electronic document + """ # noqa: E501 + version: Union[StrictFloat, StrictInt] = Field(description="Security object version", alias="Version") + object_type: StrictStr = Field(description="Identifier of the security object", alias="ObjectType") + file_reference: Union[StrictFloat, StrictInt] = Field(description="Reference to the source file of the security object data", alias="FileReference") + notifications: List[ParsingNotificationCodes] = Field(description="List of remarks arisen during the analysis of SO data structure.", alias="Notifications") + signer_infos: List[RfidSignerInfoEx] = Field(description="List of containers to store information about digital signature objects contained in the SO", alias="SignerInfos") + __properties: ClassVar[List[str]] = ["Version", "ObjectType", "FileReference", "Notifications", "SignerInfos"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidSecurityObject from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in signer_infos (list) + _items = [] + if self.signer_infos: + for _item_signer_infos in self.signer_infos: + if _item_signer_infos: + _items.append(_item_signer_infos.to_dict()) + _dict['SignerInfos'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidSecurityObject from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Version": obj.get("Version"), + "ObjectType": obj.get("ObjectType"), + "FileReference": obj.get("FileReference"), + "Notifications": obj.get("Notifications"), + "SignerInfos": [RfidSignerInfoEx.from_dict(_item) for _item in obj["SignerInfos"]] if obj.get("SignerInfos") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_session_data.py b/regula/documentreader/webclient/gen/models/rfid_session_data.py new file mode 100644 index 0000000..bcc95a4 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_session_data.py @@ -0,0 +1,150 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo +from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey +from regula.documentreader.webclient.gen.models.rfid_application import RfidApplication +from regula.documentreader.webclient.gen.models.rfid_authentication_procedure_type import RfidAuthenticationProcedureType +from regula.documentreader.webclient.gen.models.rfid_card_properties_ext import RfidCardPropertiesExt +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.rfid_security_object import RfidSecurityObject +from regula.documentreader.webclient.gen.models.rfid_terminal import RfidTerminal +from typing import Optional, Set +from typing_extensions import Self + +class RfidSessionData(BaseModel): + """ + Structure is used to describe the results of work with the SDK within the context of the current communication session with electronic document + """ # noqa: E501 + virtual_mode: Optional[StrictStr] = Field(default=None, description="Sign of virtual session when working with loaded data from a previous communication session with the electronic document", alias="VirtualMode") + sdk_version: Optional[StrictStr] = Field(default=None, description="Text SDKVersion value in format A.B (e.g. 3.1)", alias="SDKVersion") + driver_version: Optional[StrictStr] = Field(default=None, description="Text DriverVersion value in format A.B.C.D (e.g. 6.2.5.4)", alias="DriverVersion") + firmware_version: Optional[StrictStr] = Field(default=None, description="Text FirmwareVersion value in format A.B (e.g. 5.19)", alias="FirmwareVersion") + applications: List[RfidApplication] = Field(description="List of containers to store information about the involved applications of electronic document", alias="Applications") + access_controls: List[RfidAccessControlInfo] = Field(description="List of containers to store information about the supported procedures of authentication and secure data access within the context of the session", alias="AccessControls") + card_properties: RfidCardPropertiesExt = Field(alias="CardProperties") + ext_le_support: RFIDErrorCodes = Field(alias="ExtLeSupport") + process_time: Union[StrictFloat, StrictInt] = Field(description="Time of processing, milliseconds", alias="ProcessTime") + root_files: List[Any] = Field(description="List of containers to store information about the read files of the root Master File", alias="RootFiles") + total_bytes_sent: Union[StrictFloat, StrictInt] = Field(description="Total number of bytes transmitted to the RFID-chip during the whole session", alias="TotalBytesSent") + total_bytes_received: Union[StrictFloat, StrictInt] = Field(description="Total number of bytes received from the RFID-chip during the whole session", alias="TotalBytesReceived") + session_key: RfidAccessKey = Field(alias="Session_key") + session_terminal: RfidTerminal = Field(alias="Session_terminal") + session_procedure: RfidAuthenticationProcedureType = Field(alias="Session_procedure") + security_objects: List[RfidSecurityObject] = Field(description="List of containers to store information about the detected document security objects", alias="SecurityObjects") + status: Optional[CheckResult] = Field(default=None, alias="Status") + __properties: ClassVar[List[str]] = ["VirtualMode", "SDKVersion", "DriverVersion", "FirmwareVersion", "Applications", "AccessControls", "CardProperties", "ExtLeSupport", "ProcessTime", "RootFiles", "TotalBytesSent", "TotalBytesReceived", "Session_key", "Session_terminal", "Session_procedure", "SecurityObjects", "Status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidSessionData from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in applications (list) + _items = [] + if self.applications: + for _item_applications in self.applications: + if _item_applications: + _items.append(_item_applications.to_dict()) + _dict['Applications'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in access_controls (list) + _items = [] + if self.access_controls: + for _item_access_controls in self.access_controls: + if _item_access_controls: + _items.append(_item_access_controls.to_dict()) + _dict['AccessControls'] = _items + # override the default output from pydantic by calling `to_dict()` of card_properties + if self.card_properties: + _dict['CardProperties'] = self.card_properties.to_dict() + # override the default output from pydantic by calling `to_dict()` of session_key + if self.session_key: + _dict['Session_key'] = self.session_key.to_dict() + # override the default output from pydantic by calling `to_dict()` of session_terminal + if self.session_terminal: + _dict['Session_terminal'] = self.session_terminal.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in security_objects (list) + _items = [] + if self.security_objects: + for _item_security_objects in self.security_objects: + if _item_security_objects: + _items.append(_item_security_objects.to_dict()) + _dict['SecurityObjects'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidSessionData from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "VirtualMode": obj.get("VirtualMode"), + "SDKVersion": obj.get("SDKVersion"), + "DriverVersion": obj.get("DriverVersion"), + "FirmwareVersion": obj.get("FirmwareVersion"), + "Applications": [RfidApplication.from_dict(_item) for _item in obj["Applications"]] if obj.get("Applications") is not None else None, + "AccessControls": [RfidAccessControlInfo.from_dict(_item) for _item in obj["AccessControls"]] if obj.get("AccessControls") is not None else None, + "CardProperties": RfidCardPropertiesExt.from_dict(obj["CardProperties"]) if obj.get("CardProperties") is not None else None, + "ExtLeSupport": obj.get("ExtLeSupport"), + "ProcessTime": obj.get("ProcessTime"), + "RootFiles": obj.get("RootFiles"), + "TotalBytesSent": obj.get("TotalBytesSent"), + "TotalBytesReceived": obj.get("TotalBytesReceived"), + "Session_key": RfidAccessKey.from_dict(obj["Session_key"]) if obj.get("Session_key") is not None else None, + "Session_terminal": RfidTerminal.from_dict(obj["Session_terminal"]) if obj.get("Session_terminal") is not None else None, + "Session_procedure": obj.get("Session_procedure"), + "SecurityObjects": [RfidSecurityObject.from_dict(_item) for _item in obj["SecurityObjects"]] if obj.get("SecurityObjects") is not None else None, + "Status": obj.get("Status") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_signer_info_ex.py b/regula/documentreader/webclient/gen/models/rfid_signer_info_ex.py new file mode 100644 index 0000000..e595dc2 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_signer_info_ex.py @@ -0,0 +1,133 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.parsing_notification_codes import ParsingNotificationCodes +from regula.documentreader.webclient.gen.models.rfid_attribute_data import RfidAttributeData +from regula.documentreader.webclient.gen.models.rfid_certificate_ex import RfidCertificateEx +from regula.documentreader.webclient.gen.models.rfid_distinguished_name import RfidDistinguishedName +from regula.documentreader.webclient.gen.models.rfid_error_codes import RFIDErrorCodes +from regula.documentreader.webclient.gen.models.trf_ft_bytes import TrfFtBytes +from typing import Optional, Set +from typing_extensions import Self + +class RfidSignerInfoEx(BaseModel): + """ + Structure is used to describe the contents of a single copy of digital signature of the document security object and the results of its check within the context of the communication session with electronic document + """ # noqa: E501 + version: Union[StrictFloat, StrictInt] = Field(description="Version of SignerInfo ASN.1 structure", alias="Version") + issuer: RfidDistinguishedName = Field(alias="Issuer") + serial_number: TrfFtBytes = Field(alias="SerialNumber") + subject_key_identifier: TrfFtBytes = Field(alias="SubjectKeyIdentifier") + digest_algorithm: StrictStr = Field(description="Hash algorithm identifier (OID) for digital signature generation", alias="DigestAlgorithm") + signed_attributes: List[RfidAttributeData] = Field(description="List of the signed attributes", alias="SignedAttributes") + signature_algorithm: StrictStr = Field(description="Digital signature algorithm identifier (OID)", alias="SignatureAlgorithm") + signature: TrfFtBytes = Field(alias="Signature") + pa_status: RFIDErrorCodes = Field(alias="PA_Status") + certificate_chain: List[RfidCertificateEx] = Field(description="Certificate chain, used for the digital signature verification.", alias="CertificateChain") + data_to_hash: StrictStr = Field(description="Binary data array used to calculate the hash value for digital signature verification. Base64 encoded.", alias="DataToHash") + notifications: List[ParsingNotificationCodes] = Field(alias="Notifications") + __properties: ClassVar[List[str]] = ["Version", "Issuer", "SerialNumber", "SubjectKeyIdentifier", "DigestAlgorithm", "SignedAttributes", "SignatureAlgorithm", "Signature", "PA_Status", "CertificateChain", "DataToHash", "Notifications"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidSignerInfoEx from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of issuer + if self.issuer: + _dict['Issuer'] = self.issuer.to_dict() + # override the default output from pydantic by calling `to_dict()` of serial_number + if self.serial_number: + _dict['SerialNumber'] = self.serial_number.to_dict() + # override the default output from pydantic by calling `to_dict()` of subject_key_identifier + if self.subject_key_identifier: + _dict['SubjectKeyIdentifier'] = self.subject_key_identifier.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in signed_attributes (list) + _items = [] + if self.signed_attributes: + for _item_signed_attributes in self.signed_attributes: + if _item_signed_attributes: + _items.append(_item_signed_attributes.to_dict()) + _dict['SignedAttributes'] = _items + # override the default output from pydantic by calling `to_dict()` of signature + if self.signature: + _dict['Signature'] = self.signature.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in certificate_chain (list) + _items = [] + if self.certificate_chain: + for _item_certificate_chain in self.certificate_chain: + if _item_certificate_chain: + _items.append(_item_certificate_chain.to_dict()) + _dict['CertificateChain'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidSignerInfoEx from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Version": obj.get("Version"), + "Issuer": RfidDistinguishedName.from_dict(obj["Issuer"]) if obj.get("Issuer") is not None else None, + "SerialNumber": TrfFtBytes.from_dict(obj["SerialNumber"]) if obj.get("SerialNumber") is not None else None, + "SubjectKeyIdentifier": TrfFtBytes.from_dict(obj["SubjectKeyIdentifier"]) if obj.get("SubjectKeyIdentifier") is not None else None, + "DigestAlgorithm": obj.get("DigestAlgorithm"), + "SignedAttributes": [RfidAttributeData.from_dict(_item) for _item in obj["SignedAttributes"]] if obj.get("SignedAttributes") is not None else None, + "SignatureAlgorithm": obj.get("SignatureAlgorithm"), + "Signature": TrfFtBytes.from_dict(obj["Signature"]) if obj.get("Signature") is not None else None, + "PA_Status": obj.get("PA_Status"), + "CertificateChain": [RfidCertificateEx.from_dict(_item) for _item in obj["CertificateChain"]] if obj.get("CertificateChain") is not None else None, + "DataToHash": obj.get("DataToHash"), + "Notifications": obj.get("Notifications") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_terminal.py b/regula/documentreader/webclient/gen/models/rfid_terminal.py new file mode 100644 index 0000000..de85af0 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_terminal.py @@ -0,0 +1,84 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.rfid_terminal_type import RfidTerminalType +from typing import Optional, Set +from typing_extensions import Self + +class RfidTerminal(BaseModel): + """ + Structure is used to describe the terminal type within the context of the communication session with electronic document + """ # noqa: E501 + term_type: RfidTerminalType = Field(alias="TermType") + auth_req: Union[StrictFloat, StrictInt] = Field(description="Declared (set) combination of flags of access rights to the functionality of the document (combination of eRfidTerminalAuthorizationRequirement values)", alias="AuthReq") + auth_req2: Union[StrictFloat, StrictInt] = Field(description="Declared (set) combination of flags of access rights to the functionality of the document (combination of RfidTerminalAuthorizationRequirement values)", alias="AuthReq2") + __properties: ClassVar[List[str]] = ["TermType", "AuthReq", "AuthReq2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidTerminal from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidTerminal from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "TermType": obj.get("TermType"), + "AuthReq": obj.get("AuthReq"), + "AuthReq2": obj.get("AuthReq2") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_terminal_type.py b/regula/documentreader/webclient/gen/models/rfid_terminal_type.py new file mode 100644 index 0000000..4ef988a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_terminal_type.py @@ -0,0 +1,32 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidTerminalType(int, Enum): + """ + Enumeration contains a set of constants that define the type of terminal within the context of the communication session with electronic document + """ + + """ + allowed enum values + """ + UNDEFINED = 0 + INSPECTION_SYSTEM = 1 + AUTHENTICATION_TERMINAL = 2 + SIGNATURE_TERMINAL = 3 + UNAUTHENTICATED_TERMINAL = 4 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidTerminalType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_text_data_result.py b/regula/documentreader/webclient/gen/models/rfid_text_data_result.py new file mode 100644 index 0000000..5f5d0f3 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_text_data_result.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.rfid_doc_visual_extended_info import RFIDDocVisualExtendedInfo +from typing import Optional, Set +from typing_extensions import Self + +class RFIDTextDataResult(ResultItem): + """ + RFIDTextDataResult + """ # noqa: E501 + doc_visual_extended_info: RFIDDocVisualExtendedInfo = Field(alias="DocVisualExtendedInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "DocVisualExtendedInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RFIDTextDataResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_visual_extended_info + if self.doc_visual_extended_info: + _dict['DocVisualExtendedInfo'] = self.doc_visual_extended_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RFIDTextDataResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "DocVisualExtendedInfo": RFIDDocVisualExtendedInfo.from_dict(obj["DocVisualExtendedInfo"]) if obj.get("DocVisualExtendedInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfid_type.py b/regula/documentreader/webclient/gen/models/rfid_type.py new file mode 100644 index 0000000..c48cad4 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_type.py @@ -0,0 +1,30 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidType(int, Enum): + """ + Enumeration contains a set of constants specifying the type of the RFID-chip by the physical parameters of connection between antennas of the chip and the reader + """ + + """ + allowed enum values + """ + UNKNOWN = 0 + A = 1 + B = 2 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_validity.py b/regula/documentreader/webclient/gen/models/rfid_validity.py new file mode 100644 index 0000000..7d7199b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_validity.py @@ -0,0 +1,88 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.trf_ft_string import TrfFtString +from typing import Optional, Set +from typing_extensions import Self + +class RfidValidity(BaseModel): + """ + Structure contains information on a certificate validity. + """ # noqa: E501 + not_before: TrfFtString = Field(alias="NotBefore") + not_after: TrfFtString = Field(alias="NotAfter") + __properties: ClassVar[List[str]] = ["NotBefore", "NotAfter"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of RfidValidity from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of not_before + if self.not_before: + _dict['NotBefore'] = self.not_before.to_dict() + # override the default output from pydantic by calling `to_dict()` of not_after + if self.not_after: + _dict['NotAfter'] = self.not_after.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of RfidValidity from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "NotBefore": TrfFtString.from_dict(obj["NotBefore"]) if obj.get("NotBefore") is not None else None, + "NotAfter": TrfFtString.from_dict(obj["NotAfter"]) if obj.get("NotAfter") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/rfidpkd_resource_type.py b/regula/documentreader/webclient/gen/models/rfidpkd_resource_type.py new file mode 100644 index 0000000..5a819b7 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfidpkd_resource_type.py @@ -0,0 +1,35 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RFIDPKDResourceType(int, Enum): + """ + Enumeration contains a set of constants that define the type of certificate + """ + + """ + allowed enum values + """ + CERTIFICATE_PA = 0 + CERTIFICATE_TA = 1 + LDIF = 2 + CRL = 3 + ML = 4 + DEFL = 5 + DEVL = 6 + BL = 7 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RFIDPKDResourceType from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/scenario.py b/regula/documentreader/webclient/gen/models/scenario.py old mode 100755 new mode 100644 index d7a700d..3a86179 --- a/regula/documentreader/webclient/gen/models/scenario.py +++ b/regula/documentreader/webclient/gen/models/scenario.py @@ -4,128 +4,43 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Document processing scenario -""" -class Scenario(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Scenario(str, Enum): + """ + Document processing scenario """ - - MRZ = "Mrz" - - BARCODE = "Barcode" - - LOCATE = "Locate" - - OCR = "Ocr" - - DOCTYPE = "DocType" - - MRZ_OR_BARCODE = "MrzOrBarcode" - - MRZ_OR_LOCATE = "MrzOrLocate" - - MRZ_AND_LOCATE = "MrzAndLocate" - - BARCODE_AND_LOCATE = "BarcodeAndLocate" - - MRZ_OR_OCR = "MrzOrOcr" - - MRZ_OR_BARCODE_OR_OCR = "MrzOrBarcodeOrOcr" - - LOCATE_VISUAL_AND_MRZ_OR_OCR = "LocateVisual_And_MrzOrOcr" - - FULL_PROCESS = "FullProcess" - - FULL_AUTH = "FullAuth" - - RUS_STAMP = "RusStamp" - - OCR_FREE = "OcrFree" - - CREDIT_CARD = "CreditCard" - - CAPTURE = "Capture" - - DTC = "DTC" - - allowable_values = [MRZ, BARCODE, LOCATE, OCR, DOCTYPE, MRZ_OR_BARCODE, MRZ_OR_LOCATE, MRZ_AND_LOCATE, BARCODE_AND_LOCATE, MRZ_OR_OCR, MRZ_OR_BARCODE_OR_OCR, LOCATE_VISUAL_AND_MRZ_OR_OCR, FULL_PROCESS, FULL_AUTH, RUS_STAMP, OCR_FREE, CREDIT_CARD, CAPTURE, DTC] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Scenario - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Scenario): - return False - - return self.to_dict() == other.to_dict() + MRZ = 'Mrz' + BARCODE = 'Barcode' + LOCATE = 'Locate' + OCR = 'Ocr' + DOCTYPE = 'DocType' + MRZORBARCODE = 'MrzOrBarcode' + MRZORLOCATE = 'MrzOrLocate' + MRZANDLOCATE = 'MrzAndLocate' + BARCODEANDLOCATE = 'BarcodeAndLocate' + MRZOROCR = 'MrzOrOcr' + MRZORBARCODEOROCR = 'MrzOrBarcodeOrOcr' + LOCATE_VISUAL_AND_MRZ_OR_OCR = 'LocateVisual_And_MrzOrOcr' + FULLPROCESS = 'FullProcess' + FULLAUTH = 'FullAuth' + RUSSTAMP = 'RusStamp' + OCRFREE = 'OcrFree' + CREDITCARD = 'CreditCard' + CAPTURE = 'Capture' + DTC = 'DTC' + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Scenario from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Scenario): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/security_feature_item.py b/regula/documentreader/webclient/gen/models/security_feature_item.py new file mode 100644 index 0000000..8f304b6 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/security_feature_item.py @@ -0,0 +1,100 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.area_container import AreaContainer +from regula.documentreader.webclient.gen.models.critical import Critical +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from regula.documentreader.webclient.gen.models.visibility import Visibility +from typing import Optional, Set +from typing_extensions import Self + +class SecurityFeatureItem(BaseModel): + """ + SecurityFeatureItem + """ # noqa: E501 + element_type: SecurityFeatureType = Field(alias="ElementType") + element_rect: RectangleCoordinates = Field(alias="ElementRect") + visibility: Visibility = Field(alias="Visibility") + critical_flag: Critical = Field(alias="CriticalFlag") + area_list: Optional[AreaContainer] = Field(default=None, alias="AreaList") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + __properties: ClassVar[List[str]] = ["ElementType", "ElementRect", "Visibility", "CriticalFlag", "AreaList", "Reserved2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SecurityFeatureItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of element_rect + if self.element_rect: + _dict['ElementRect'] = self.element_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of area_list + if self.area_list: + _dict['AreaList'] = self.area_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SecurityFeatureItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ElementType": obj.get("ElementType"), + "ElementRect": RectangleCoordinates.from_dict(obj["ElementRect"]) if obj.get("ElementRect") is not None else None, + "Visibility": obj.get("Visibility"), + "CriticalFlag": obj.get("CriticalFlag"), + "AreaList": AreaContainer.from_dict(obj["AreaList"]) if obj.get("AreaList") is not None else None, + "Reserved2": obj.get("Reserved2") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/security_feature_result.py b/regula/documentreader/webclient/gen/models/security_feature_result.py index 4f60065..5648bac 100644 --- a/regula/documentreader/webclient/gen/models/security_feature_result.py +++ b/regula/documentreader/webclient/gen/models/security_feature_result.py @@ -4,353 +4,105 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class SecurityFeatureResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.area_container import AreaContainer +from regula.documentreader.webclient.gen.models.authenticity_check_result_item import AuthenticityCheckResultItem +from regula.documentreader.webclient.gen.models.authenticity_result_type import AuthenticityResultType +from regula.documentreader.webclient.gen.models.check_diagnose import CheckDiagnose +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.critical import Critical +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.security_feature_type import SecurityFeatureType +from regula.documentreader.webclient.gen.models.visibility import Visibility +from typing import Optional, Set +from typing_extensions import Self + +class SecurityFeatureResult(AuthenticityCheckResultItem): """ - openapi_types = { - 'type': 'int', - 'element_result': 'CheckResult', - 'element_diagnose': 'CheckDiagnose', - 'percent_value': 'int', - 'element_type': 'SecurityFeatureType', - 'element_rect': 'RectangleCoordinates', - 'visibility': 'Visibility', - 'critical_flag': 'Critical', - 'area_list': 'AreaContainer', - 'reserved2': 'int' - } - - attribute_map = { - 'type': 'Type', - 'element_result': 'ElementResult', - 'element_diagnose': 'ElementDiagnose', - 'percent_value': 'PercentValue', - 'element_type': 'ElementType', - 'element_rect': 'ElementRect', - 'visibility': 'Visibility', - 'critical_flag': 'CriticalFlag', - 'area_list': 'AreaList', - 'reserved2': 'Reserved2' - } - - def __init__(self, type=0, element_result=None, element_diagnose=None, percent_value=None, element_type=None, element_rect=None, visibility=None, critical_flag=None, area_list=None, reserved2=None, local_vars_configuration=None): # noqa: E501 - """SecurityFeatureResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._type = None - self._element_result = None - self._element_diagnose = None - self._percent_value = None - self._element_type = None - self._element_rect = None - self._visibility = None - self._critical_flag = None - self._area_list = None - self._reserved2 = None - self.discriminator = None - - self.type = type - if element_result is not None: - self.element_result = element_result - if element_diagnose is not None: - self.element_diagnose = element_diagnose - if percent_value is not None: - self.percent_value = percent_value - if element_type is not None: - self.element_type = element_type - if element_rect is not None: - self.element_rect = element_rect - if visibility is not None: - self.visibility = visibility - if critical_flag is not None: - self.critical_flag = critical_flag - if area_list is not None: - self.area_list = area_list - if reserved2 is not None: - self.reserved2 = reserved2 - - @property - def type(self): - """Gets the type of this SecurityFeatureResult. # noqa: E501 - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :return: The type of this SecurityFeatureResult. # noqa: E501 - :rtype: int - """ - return self._type - - @type.setter - def type(self, type): - """Sets the type of this SecurityFeatureResult. - - Same as authenticity result type, but used for safe parsing of not-described values: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/authenticity-result-type/ # noqa: E501 - - :param type: The type of this SecurityFeatureResult. # noqa: E501 - :type type: int - """ - if self.local_vars_configuration.client_side_validation and type is None: # noqa: E501 - raise ValueError("Invalid value for `type`, must not be `None`") # noqa: E501 - - self._type = type - - @property - def element_result(self): - """Gets the element_result of this SecurityFeatureResult. # noqa: E501 - - - :return: The element_result of this SecurityFeatureResult. # noqa: E501 - :rtype: CheckResult - """ - return self._element_result - - @element_result.setter - def element_result(self, element_result): - """Sets the element_result of this SecurityFeatureResult. - - - :param element_result: The element_result of this SecurityFeatureResult. # noqa: E501 - :type element_result: CheckResult - """ - - self._element_result = element_result - - @property - def element_diagnose(self): - """Gets the element_diagnose of this SecurityFeatureResult. # noqa: E501 - - - :return: The element_diagnose of this SecurityFeatureResult. # noqa: E501 - :rtype: CheckDiagnose - """ - return self._element_diagnose - - @element_diagnose.setter - def element_diagnose(self, element_diagnose): - """Sets the element_diagnose of this SecurityFeatureResult. - - - :param element_diagnose: The element_diagnose of this SecurityFeatureResult. # noqa: E501 - :type element_diagnose: CheckDiagnose - """ - - self._element_diagnose = element_diagnose - - @property - def percent_value(self): - """Gets the percent_value of this SecurityFeatureResult. # noqa: E501 - - - :return: The percent_value of this SecurityFeatureResult. # noqa: E501 - :rtype: int - """ - return self._percent_value - - @percent_value.setter - def percent_value(self, percent_value): - """Sets the percent_value of this SecurityFeatureResult. - - - :param percent_value: The percent_value of this SecurityFeatureResult. # noqa: E501 - :type percent_value: int - """ - - self._percent_value = percent_value - - @property - def element_type(self): - """Gets the element_type of this SecurityFeatureResult. # noqa: E501 - - - :return: The element_type of this SecurityFeatureResult. # noqa: E501 - :rtype: SecurityFeatureType - """ - return self._element_type - - @element_type.setter - def element_type(self, element_type): - """Sets the element_type of this SecurityFeatureResult. - - - :param element_type: The element_type of this SecurityFeatureResult. # noqa: E501 - :type element_type: SecurityFeatureType - """ - - self._element_type = element_type - - @property - def element_rect(self): - """Gets the element_rect of this SecurityFeatureResult. # noqa: E501 - - - :return: The element_rect of this SecurityFeatureResult. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._element_rect - - @element_rect.setter - def element_rect(self, element_rect): - """Sets the element_rect of this SecurityFeatureResult. - - - :param element_rect: The element_rect of this SecurityFeatureResult. # noqa: E501 - :type element_rect: RectangleCoordinates - """ - - self._element_rect = element_rect - - @property - def visibility(self): - """Gets the visibility of this SecurityFeatureResult. # noqa: E501 - - - :return: The visibility of this SecurityFeatureResult. # noqa: E501 - :rtype: Visibility - """ - return self._visibility - - @visibility.setter - def visibility(self, visibility): - """Sets the visibility of this SecurityFeatureResult. - - - :param visibility: The visibility of this SecurityFeatureResult. # noqa: E501 - :type visibility: Visibility - """ - - self._visibility = visibility - - @property - def critical_flag(self): - """Gets the critical_flag of this SecurityFeatureResult. # noqa: E501 - - - :return: The critical_flag of this SecurityFeatureResult. # noqa: E501 - :rtype: Critical - """ - return self._critical_flag - - @critical_flag.setter - def critical_flag(self, critical_flag): - """Sets the critical_flag of this SecurityFeatureResult. - - - :param critical_flag: The critical_flag of this SecurityFeatureResult. # noqa: E501 - :type critical_flag: Critical - """ - - self._critical_flag = critical_flag - - @property - def area_list(self): - """Gets the area_list of this SecurityFeatureResult. # noqa: E501 - - - :return: The area_list of this SecurityFeatureResult. # noqa: E501 - :rtype: AreaContainer - """ - return self._area_list - - @area_list.setter - def area_list(self, area_list): - """Sets the area_list of this SecurityFeatureResult. - - - :param area_list: The area_list of this SecurityFeatureResult. # noqa: E501 - :type area_list: AreaContainer - """ - - self._area_list = area_list - - @property - def reserved2(self): - """Gets the reserved2 of this SecurityFeatureResult. # noqa: E501 - - - :return: The reserved2 of this SecurityFeatureResult. # noqa: E501 - :rtype: int - """ - return self._reserved2 - - @reserved2.setter - def reserved2(self, reserved2): - """Sets the reserved2 of this SecurityFeatureResult. - - - :param reserved2: The reserved2 of this SecurityFeatureResult. # noqa: E501 - :type reserved2: int - """ - - self._reserved2 = reserved2 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SecurityFeatureResult): - return False - - return self.to_dict() == other.to_dict() + SecurityFeatureResult + """ # noqa: E501 + element_type: SecurityFeatureType = Field(alias="ElementType") + element_rect: RectangleCoordinates = Field(alias="ElementRect") + visibility: Visibility = Field(alias="Visibility") + critical_flag: Critical = Field(alias="CriticalFlag") + area_list: Optional[AreaContainer] = Field(default=None, alias="AreaList") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + __properties: ClassVar[List[str]] = ["Type", "ElementResult", "ElementDiagnose", "PercentValue", "ElementType", "ElementRect", "Visibility", "CriticalFlag", "AreaList", "Reserved2"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SecurityFeatureResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of element_rect + if self.element_rect: + _dict['ElementRect'] = self.element_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of area_list + if self.area_list: + _dict['AreaList'] = self.area_list.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SecurityFeatureResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "ElementResult": obj.get("ElementResult"), + "ElementDiagnose": obj.get("ElementDiagnose"), + "PercentValue": obj.get("PercentValue"), + "ElementType": obj.get("ElementType"), + "ElementRect": RectangleCoordinates.from_dict(obj["ElementRect"]) if obj.get("ElementRect") is not None else None, + "Visibility": obj.get("Visibility"), + "CriticalFlag": obj.get("CriticalFlag"), + "AreaList": AreaContainer.from_dict(obj["AreaList"]) if obj.get("AreaList") is not None else None, + "Reserved2": obj.get("Reserved2") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SecurityFeatureResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/security_feature_result_all_of.py b/regula/documentreader/webclient/gen/models/security_feature_result_all_of.py deleted file mode 100644 index eb0e081..0000000 --- a/regula/documentreader/webclient/gen/models/security_feature_result_all_of.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class SecurityFeatureResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'element_type': 'SecurityFeatureType', - 'element_rect': 'RectangleCoordinates', - 'visibility': 'Visibility', - 'critical_flag': 'Critical', - 'area_list': 'AreaContainer', - 'reserved2': 'int' - } - - attribute_map = { - 'element_type': 'ElementType', - 'element_rect': 'ElementRect', - 'visibility': 'Visibility', - 'critical_flag': 'CriticalFlag', - 'area_list': 'AreaList', - 'reserved2': 'Reserved2' - } - - def __init__(self, element_type=None, element_rect=None, visibility=None, critical_flag=None, area_list=None, reserved2=None, local_vars_configuration=None): # noqa: E501 - """SecurityFeatureResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._element_type = None - self._element_rect = None - self._visibility = None - self._critical_flag = None - self._area_list = None - self._reserved2 = None - self.discriminator = None - - if element_type is not None: - self.element_type = element_type - if element_rect is not None: - self.element_rect = element_rect - if visibility is not None: - self.visibility = visibility - if critical_flag is not None: - self.critical_flag = critical_flag - if area_list is not None: - self.area_list = area_list - if reserved2 is not None: - self.reserved2 = reserved2 - - @property - def element_type(self): - """Gets the element_type of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The element_type of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: SecurityFeatureType - """ - return self._element_type - - @element_type.setter - def element_type(self, element_type): - """Sets the element_type of this SecurityFeatureResultAllOf. - - - :param element_type: The element_type of this SecurityFeatureResultAllOf. # noqa: E501 - :type element_type: SecurityFeatureType - """ - - self._element_type = element_type - - @property - def element_rect(self): - """Gets the element_rect of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The element_rect of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._element_rect - - @element_rect.setter - def element_rect(self, element_rect): - """Sets the element_rect of this SecurityFeatureResultAllOf. - - - :param element_rect: The element_rect of this SecurityFeatureResultAllOf. # noqa: E501 - :type element_rect: RectangleCoordinates - """ - - self._element_rect = element_rect - - @property - def visibility(self): - """Gets the visibility of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The visibility of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: Visibility - """ - return self._visibility - - @visibility.setter - def visibility(self, visibility): - """Sets the visibility of this SecurityFeatureResultAllOf. - - - :param visibility: The visibility of this SecurityFeatureResultAllOf. # noqa: E501 - :type visibility: Visibility - """ - - self._visibility = visibility - - @property - def critical_flag(self): - """Gets the critical_flag of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The critical_flag of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: Critical - """ - return self._critical_flag - - @critical_flag.setter - def critical_flag(self, critical_flag): - """Sets the critical_flag of this SecurityFeatureResultAllOf. - - - :param critical_flag: The critical_flag of this SecurityFeatureResultAllOf. # noqa: E501 - :type critical_flag: Critical - """ - - self._critical_flag = critical_flag - - @property - def area_list(self): - """Gets the area_list of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The area_list of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: AreaContainer - """ - return self._area_list - - @area_list.setter - def area_list(self, area_list): - """Sets the area_list of this SecurityFeatureResultAllOf. - - - :param area_list: The area_list of this SecurityFeatureResultAllOf. # noqa: E501 - :type area_list: AreaContainer - """ - - self._area_list = area_list - - @property - def reserved2(self): - """Gets the reserved2 of this SecurityFeatureResultAllOf. # noqa: E501 - - - :return: The reserved2 of this SecurityFeatureResultAllOf. # noqa: E501 - :rtype: int - """ - return self._reserved2 - - @reserved2.setter - def reserved2(self, reserved2): - """Sets the reserved2 of this SecurityFeatureResultAllOf. - - - :param reserved2: The reserved2 of this SecurityFeatureResultAllOf. # noqa: E501 - :type reserved2: int - """ - - self._reserved2 = reserved2 - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SecurityFeatureResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SecurityFeatureResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/security_feature_type.py b/regula/documentreader/webclient/gen/models/security_feature_type.py index 7c81060..d7b6a35 100644 --- a/regula/documentreader/webclient/gen/models/security_feature_type.py +++ b/regula/documentreader/webclient/gen/models/security_feature_type.py @@ -4,196 +4,77 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration contains identifiers determining type of features for a document authenticity checks: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/security-feature-type/ -""" -class SecurityFeatureType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class SecurityFeatureType(int, Enum): + """ + Enumeration contains identifiers determining type of features for a document authenticity checks: https://docs.regulaforensics.com/develop/doc-reader-sdk/web-service/development/enums/security-feature-type/ """ - - BLANK = int("0") - - FILL = int("1") - - PHOTO = int("2") - - MRZ = int("3") - - FALSE_LUMINESCENCE = int("4") - - HOLO_SIMPLE = int("5") - - HOLO_VERIFY_STATIC = int("6") - - HOLO_VERIFY_MULTI_STATIC = int("7") - - HOLO_VERIFY_DYNAMIC = int("8") - - PATTERN_NOT_INTERRUPTED = int("9") - - PATTERN_NOT_SHIFTED = int("10") - - PATTERN_SAME_COLORS = int("11") - - PATTERN_IR_INVISIBLE = int("12") - - PHOTO_SIZE_CHECK = int("13") - - PORTRAIT_COMPARISON_VS_GHOST = int("14") - - PORTRAIT_COMPARISON_VS_RFID = int("15") - - PORTRAIT_COMPARISON_VS_VISUAL = int("16") - - BARCODE = int("17") - - PATTERN_DIFFERENT_LINES_THICKNESS = int("18") - - PORTRAIT_COMPARISON_VS_CAMERA = int("19") - - PORTRAIT_COMPARISON_RFID_VS_CAMERA = int("20") - - GHOST_PHOTO = int("21") - - CLEAR_GHOST_PHOTO = int("22") - - INVISIBLE_OBJECT = int("23") - - LOW_CONTRAST_OBJECT = int("24") - - PHOTO_COLOR = int("25") - - PHOTO_SHAPE = int("26") - - PHOTO_CORNERS = int("27") - - OCR = int("28") - - PORTRAIT_COMPARISON_EXT_VS_VISUAL = int("29") - - PORTRAIT_COMPARISON_EXT_VS_RFID = int("30") - - PORTRAIT_COMPARISON_EXT_VS_CAMERA = int("31") - - LIVENESS_DEPTH = int("32") - - MICRO_TEXT = int("33") - - FLUORESCENT_OBJECT = int("34") - - LANDMARK_CHECK = int("35") - - FACE_PRESENCE = int("36") - - FACE_ABSENCE = int("38") - - LIVENESS_SCREEN_CAPTURE = int("39") - - LIVENESS_ELECTRONIC_DEVICE = int("40") - - LIVENESS_OVI = int("41") - - BARCODE_SIZE_CHECK = int("42") - - LASINK = int("43") - - LIVENESS_MLI = int("44") - - LIVENESS_BARCODE_BACKGROUND = int("45") - - PORTRAIT_COMPARISON_VS_BARCODE = int("46") - - PORTRAIT_COMPARISON_RFID_VS_BARCODE = int("47") - - PORTRAIT_COMPARISON_EXT_VS_BARCODE = int("48") - - PORTRAIT_COMPARISON_BARCODE_VS_CAMERA = int("49") - - CHECK_DIGITAL_SIGNATURE = int("50") - - CONTACT_CHIP_CLASSIFICATION = int("51") - - HEAD_POSITION_CHECK = int("52") - - LIVENESS_BLACK_AND_WHITE_COPY_CHECK = int("53") - - allowable_values = [BLANK, FILL, PHOTO, MRZ, FALSE_LUMINESCENCE, HOLO_SIMPLE, HOLO_VERIFY_STATIC, HOLO_VERIFY_MULTI_STATIC, HOLO_VERIFY_DYNAMIC, PATTERN_NOT_INTERRUPTED, PATTERN_NOT_SHIFTED, PATTERN_SAME_COLORS, PATTERN_IR_INVISIBLE, PHOTO_SIZE_CHECK, PORTRAIT_COMPARISON_VS_GHOST, PORTRAIT_COMPARISON_VS_RFID, PORTRAIT_COMPARISON_VS_VISUAL, BARCODE, PATTERN_DIFFERENT_LINES_THICKNESS, PORTRAIT_COMPARISON_VS_CAMERA, PORTRAIT_COMPARISON_RFID_VS_CAMERA, GHOST_PHOTO, CLEAR_GHOST_PHOTO, INVISIBLE_OBJECT, LOW_CONTRAST_OBJECT, PHOTO_COLOR, PHOTO_SHAPE, PHOTO_CORNERS, OCR, PORTRAIT_COMPARISON_EXT_VS_VISUAL, PORTRAIT_COMPARISON_EXT_VS_RFID, PORTRAIT_COMPARISON_EXT_VS_CAMERA, LIVENESS_DEPTH, MICRO_TEXT, FLUORESCENT_OBJECT, LANDMARK_CHECK, FACE_PRESENCE, FACE_ABSENCE, LIVENESS_SCREEN_CAPTURE, LIVENESS_ELECTRONIC_DEVICE, LIVENESS_OVI, BARCODE_SIZE_CHECK, LASINK, LIVENESS_MLI, LIVENESS_BARCODE_BACKGROUND, PORTRAIT_COMPARISON_VS_BARCODE, PORTRAIT_COMPARISON_RFID_VS_BARCODE, PORTRAIT_COMPARISON_EXT_VS_BARCODE, PORTRAIT_COMPARISON_BARCODE_VS_CAMERA, CHECK_DIGITAL_SIGNATURE, CONTACT_CHIP_CLASSIFICATION, HEAD_POSITION_CHECK, LIVENESS_BLACK_AND_WHITE_COPY_CHECK] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """SecurityFeatureType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SecurityFeatureType): - return False - - return self.to_dict() == other.to_dict() + BLANK = 0 + FILL = 1 + PHOTO = 2 + MRZ = 3 + FALSE_LUMINESCENCE = 4 + HOLO_SIMPLE = 5 + HOLO_VERIFY_STATIC = 6 + HOLO_VERIFY_MULTI_STATIC = 7 + HOLO_VERIFY_DYNAMIC = 8 + PATTERN_NOT_INTERRUPTED = 9 + PATTERN_NOT_SHIFTED = 10 + PATTERN_SAME_COLORS = 11 + PATTERN_IR_INVISIBLE = 12 + PHOTO_SIZE_CHECK = 13 + PORTRAIT_COMPARISON_VS_GHOST = 14 + PORTRAIT_COMPARISON_VS_RFID = 15 + PORTRAIT_COMPARISON_VS_VISUAL = 16 + BARCODE = 17 + PATTERN_DIFFERENT_LINES_THICKNESS = 18 + PORTRAIT_COMPARISON_VS_CAMERA = 19 + PORTRAIT_COMPARISON_RFID_VS_CAMERA = 20 + GHOST_PHOTO = 21 + CLEAR_GHOST_PHOTO = 22 + INVISIBLE_OBJECT = 23 + LOW_CONTRAST_OBJECT = 24 + PHOTO_COLOR = 25 + PHOTO_SHAPE = 26 + PHOTO_CORNERS = 27 + OCR = 28 + PORTRAIT_COMPARISON_EXT_VS_VISUAL = 29 + PORTRAIT_COMPARISON_EXT_VS_RFID = 30 + PORTRAIT_COMPARISON_EXT_VS_CAMERA = 31 + LIVENESS_DEPTH = 32 + MICRO_TEXT = 33 + FLUORESCENT_OBJECT = 34 + LANDMARK_CHECK = 35 + FACE_PRESENCE = 36 + FACE_ABSENCE = 38 + LIVENESS_SCREEN_CAPTURE = 39 + LIVENESS_ELECTRONIC_DEVICE = 40 + LIVENESS_OVI = 41 + BARCODE_SIZE_CHECK = 42 + LASINK = 43 + LIVENESS_MLI = 44 + LIVENESS_BARCODE_BACKGROUND = 45 + PORTRAIT_COMPARISON_VS_BARCODE = 46 + PORTRAIT_COMPARISON_RFID_VS_BARCODE = 47 + PORTRAIT_COMPARISON_EXT_VS_BARCODE = 48 + PORTRAIT_COMPARISON_BARCODE_VS_CAMERA = 49 + CHECK_DIGITAL_SIGNATURE = 50 + CONTACT_CHIP_CLASSIFICATION = 51 + HEAD_POSITION_CHECK = 52 + LIVENESS_BLACK_AND_WHITE_COPY_CHECK = 53 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of SecurityFeatureType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SecurityFeatureType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/security_object_certificates.py b/regula/documentreader/webclient/gen/models/security_object_certificates.py new file mode 100644 index 0000000..a5c7211 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/security_object_certificates.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.certificate_data import CertificateData +from typing import Optional, Set +from typing_extensions import Self + +class SecurityObjectCertificates(BaseModel): + """ + SecurityObjectCertificates + """ # noqa: E501 + certificate_data: Optional[CertificateData] = Field(default=None, alias="Certificate_Data") + __properties: ClassVar[List[str]] = ["Certificate_Data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SecurityObjectCertificates from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of certificate_data + if self.certificate_data: + _dict['Certificate_Data'] = self.certificate_data.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SecurityObjectCertificates from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Certificate_Data": CertificateData.from_dict(obj["Certificate_Data"]) if obj.get("Certificate_Data") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/source.py b/regula/documentreader/webclient/gen/models/source.py old mode 100755 new mode 100644 index 2072ee9..dd9866c --- a/regula/documentreader/webclient/gen/models/source.py +++ b/regula/documentreader/webclient/gen/models/source.py @@ -4,100 +4,30 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Document data sources -""" -class Source(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Source(str, Enum): + """ + Document data sources """ - - MRZ = "MRZ" - - VISUAL = "VISUAL" - - BARCODE = "BARCODE" - - RFID = "RFID" - - MAGNETIC = "MAGNETIC" - - allowable_values = [MRZ, VISUAL, BARCODE, RFID, MAGNETIC] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Source - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Source): - return False + MRZ = 'MRZ' + VISUAL = 'VISUAL' + BARCODE = 'BARCODE' + RFID = 'RFID' + MAGNETIC = 'MAGNETIC' + EXTERNAL = 'EXTERNAL' - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Source from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Source): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/source_validity.py b/regula/documentreader/webclient/gen/models/source_validity.py old mode 100755 new mode 100644 index c959975..e5cda8f --- a/regula/documentreader/webclient/gen/models/source_validity.py +++ b/regula/documentreader/webclient/gen/models/source_validity.py @@ -4,144 +4,80 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class SourceValidity(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class SourceValidity(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'source': 'Source', - 'status': 'CheckResult' - } - - attribute_map = { - 'source': 'source', - 'status': 'status' - } - - def __init__(self, source=None, status=None, local_vars_configuration=None): # noqa: E501 - """SourceValidity - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._source = None - self._status = None - self.discriminator = None - - self.source = source - self.status = status - - @property - def source(self): - """Gets the source of this SourceValidity. # noqa: E501 - - - :return: The source of this SourceValidity. # noqa: E501 - :rtype: Source + SourceValidity + """ # noqa: E501 + source: Source + status: CheckResult + __properties: ClassVar[List[str]] = ["source", "status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SourceValidity from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this SourceValidity. + excluded_fields: Set[str] = set([ + ]) + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - :param source: The source of this SourceValidity. # noqa: E501 - :type source: Source - """ - if self.local_vars_configuration.client_side_validation and source is None: # noqa: E501 - raise ValueError("Invalid value for `source`, must not be `None`") # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SourceValidity from a dict""" + if obj is None: + return None - self._source = source + if not isinstance(obj, dict): + return cls.model_validate(obj) - @property - def status(self): - """Gets the status of this SourceValidity. # noqa: E501 + _obj = cls.model_validate({ + "source": obj.get("source"), + "status": obj.get("status") + }) + return _obj - :return: The status of this SourceValidity. # noqa: E501 - :rtype: CheckResult - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this SourceValidity. - - - :param status: The status of this SourceValidity. # noqa: E501 - :type status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SourceValidity): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SourceValidity): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/status.py b/regula/documentreader/webclient/gen/models/status.py old mode 100755 new mode 100644 index 454cbef..821d44c --- a/regula/documentreader/webclient/gen/models/status.py +++ b/regula/documentreader/webclient/gen/models/status.py @@ -4,275 +4,97 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.details_optical import DetailsOptical +from regula.documentreader.webclient.gen.models.details_rfid import DetailsRFID +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class Status(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Status(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'overall_status': 'CheckResult', - 'optical': 'CheckResult', - 'portrait': 'CheckResult', - 'rfid': 'CheckResult', - 'stop_list': 'CheckResult', - 'details_rfid': 'DetailsRFID', - 'details_optical': 'DetailsOptical' - } - - attribute_map = { - 'overall_status': 'overallStatus', - 'optical': 'optical', - 'portrait': 'portrait', - 'rfid': 'rfid', - 'stop_list': 'stopList', - 'details_rfid': 'detailsRFID', - 'details_optical': 'detailsOptical' - } - - def __init__(self, overall_status=None, optical=None, portrait=None, rfid=None, stop_list=None, details_rfid=None, details_optical=None, local_vars_configuration=None): # noqa: E501 - """Status - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._overall_status = None - self._optical = None - self._portrait = None - self._rfid = None - self._stop_list = None - self._details_rfid = None - self._details_optical = None - self.discriminator = None - - self.overall_status = overall_status - self.optical = optical - if portrait is not None: - self.portrait = portrait - if rfid is not None: - self.rfid = rfid - if stop_list is not None: - self.stop_list = stop_list - if details_rfid is not None: - self.details_rfid = details_rfid - self.details_optical = details_optical - - @property - def overall_status(self): - """Gets the overall_status of this Status. # noqa: E501 - - - :return: The overall_status of this Status. # noqa: E501 - :rtype: CheckResult - """ - return self._overall_status - - @overall_status.setter - def overall_status(self, overall_status): - """Sets the overall_status of this Status. - - - :param overall_status: The overall_status of this Status. # noqa: E501 - :type overall_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and overall_status is None: # noqa: E501 - raise ValueError("Invalid value for `overall_status`, must not be `None`") # noqa: E501 - - self._overall_status = overall_status - - @property - def optical(self): - """Gets the optical of this Status. # noqa: E501 - - - :return: The optical of this Status. # noqa: E501 - :rtype: CheckResult - """ - return self._optical - - @optical.setter - def optical(self, optical): - """Sets the optical of this Status. - - - :param optical: The optical of this Status. # noqa: E501 - :type optical: CheckResult - """ - if self.local_vars_configuration.client_side_validation and optical is None: # noqa: E501 - raise ValueError("Invalid value for `optical`, must not be `None`") # noqa: E501 - - self._optical = optical - - @property - def portrait(self): - """Gets the portrait of this Status. # noqa: E501 - - - :return: The portrait of this Status. # noqa: E501 - :rtype: CheckResult - """ - return self._portrait - - @portrait.setter - def portrait(self, portrait): - """Sets the portrait of this Status. - - - :param portrait: The portrait of this Status. # noqa: E501 - :type portrait: CheckResult - """ - - self._portrait = portrait - - @property - def rfid(self): - """Gets the rfid of this Status. # noqa: E501 - - - :return: The rfid of this Status. # noqa: E501 - :rtype: CheckResult - """ - return self._rfid - - @rfid.setter - def rfid(self, rfid): - """Sets the rfid of this Status. - - - :param rfid: The rfid of this Status. # noqa: E501 - :type rfid: CheckResult - """ - - self._rfid = rfid - - @property - def stop_list(self): - """Gets the stop_list of this Status. # noqa: E501 - - - :return: The stop_list of this Status. # noqa: E501 - :rtype: CheckResult + Status + """ # noqa: E501 + overall_status: CheckResult = Field(alias="overallStatus") + optical: CheckResult + portrait: CheckResult + rfid: CheckResult + stop_list: CheckResult = Field(alias="stopList") + details_rfid: Optional[DetailsRFID] = Field(default=None, alias="detailsRFID") + details_optical: DetailsOptical = Field(alias="detailsOptical") + __properties: ClassVar[List[str]] = ["overallStatus", "optical", "portrait", "rfid", "stopList", "detailsRFID", "detailsOptical"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Status from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._stop_list - - @stop_list.setter - def stop_list(self, stop_list): - """Sets the stop_list of this Status. - - - :param stop_list: The stop_list of this Status. # noqa: E501 - :type stop_list: CheckResult - """ - - self._stop_list = stop_list - - @property - def details_rfid(self): - """Gets the details_rfid of this Status. # noqa: E501 - - - :return: The details_rfid of this Status. # noqa: E501 - :rtype: DetailsRFID - """ - return self._details_rfid - - @details_rfid.setter - def details_rfid(self, details_rfid): - """Sets the details_rfid of this Status. - - - :param details_rfid: The details_rfid of this Status. # noqa: E501 - :type details_rfid: DetailsRFID - """ - - self._details_rfid = details_rfid - - @property - def details_optical(self): - """Gets the details_optical of this Status. # noqa: E501 - - - :return: The details_optical of this Status. # noqa: E501 - :rtype: DetailsOptical - """ - return self._details_optical - - @details_optical.setter - def details_optical(self, details_optical): - """Sets the details_optical of this Status. - - - :param details_optical: The details_optical of this Status. # noqa: E501 - :type details_optical: DetailsOptical - """ - if self.local_vars_configuration.client_side_validation and details_optical is None: # noqa: E501 - raise ValueError("Invalid value for `details_optical`, must not be `None`") # noqa: E501 - - self._details_optical = details_optical - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Status): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of details_rfid + if self.details_rfid: + _dict['detailsRFID'] = self.details_rfid.to_dict() + # override the default output from pydantic by calling `to_dict()` of details_optical + if self.details_optical: + _dict['detailsOptical'] = self.details_optical.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Status from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "overallStatus": obj.get("overallStatus"), + "optical": obj.get("optical"), + "portrait": obj.get("portrait"), + "rfid": obj.get("rfid"), + "stopList": obj.get("stopList"), + "detailsRFID": DetailsRFID.from_dict(obj["detailsRFID"]) if obj.get("detailsRFID") is not None else None, + "detailsOptical": DetailsOptical.from_dict(obj["detailsOptical"]) if obj.get("detailsOptical") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Status): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/status_item.py b/regula/documentreader/webclient/gen/models/status_item.py new file mode 100644 index 0000000..2b28fdb --- /dev/null +++ b/regula/documentreader/webclient/gen/models/status_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.status import Status +from typing import Optional, Set +from typing_extensions import Self + +class StatusItem(BaseModel): + """ + StatusItem + """ # noqa: E501 + status: Status = Field(alias="Status") + __properties: ClassVar[List[str]] = ["Status"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of StatusItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of status + if self.status: + _dict['Status'] = self.status.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of StatusItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Status": Status.from_dict(obj["Status"]) if obj.get("Status") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/status_result.py b/regula/documentreader/webclient/gen/models/status_result.py old mode 100755 new mode 100644 index 945a25b..d24b469 --- a/regula/documentreader/webclient/gen/models/status_result.py +++ b/regula/documentreader/webclient/gen/models/status_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.status import Status +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class StatusResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class StatusResult(ResultItem): """ + StatusResult + """ # noqa: E501 + status: Status = Field(alias="Status") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "Status"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'Status', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'status': 'Status', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, status=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """StatusResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._status = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.status = status - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def status(self): - """Gets the status of this StatusResult. # noqa: E501 - - - :return: The status of this StatusResult. # noqa: E501 - :rtype: Status - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this StatusResult. - - - :param status: The status of this StatusResult. # noqa: E501 - :type status: Status - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def buf_length(self): - """Gets the buf_length of this StatusResult. # noqa: E501 - - - :return: The buf_length of this StatusResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this StatusResult. - - - :param buf_length: The buf_length of this StatusResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this StatusResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this StatusResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this StatusResult. - - - :param light: The light of this StatusResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this StatusResult. # noqa: E501 - - - :return: The list_idx of this StatusResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this StatusResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this StatusResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this StatusResult. # noqa: E501 - - - :return: The page_idx of this StatusResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this StatusResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of StatusResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this StatusResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this StatusResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this StatusResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this StatusResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of status + if self.status: + _dict['Status'] = self.status.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of StatusResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "Status": Status.from_dict(obj["Status"]) if obj.get("Status") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this StatusResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, StatusResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, StatusResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/status_result_all_of.py b/regula/documentreader/webclient/gen/models/status_result_all_of.py deleted file mode 100755 index 2a3df7b..0000000 --- a/regula/documentreader/webclient/gen/models/status_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class StatusResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'status': 'Status' - } - - attribute_map = { - 'status': 'Status' - } - - def __init__(self, status=None, local_vars_configuration=None): # noqa: E501 - """StatusResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._status = None - self.discriminator = None - - self.status = status - - @property - def status(self): - """Gets the status of this StatusResultAllOf. # noqa: E501 - - - :return: The status of this StatusResultAllOf. # noqa: E501 - :rtype: Status - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this StatusResultAllOf. - - - :param status: The status of this StatusResultAllOf. # noqa: E501 - :type status: Status - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, StatusResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, StatusResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/string_item.py b/regula/documentreader/webclient/gen/models/string_item.py new file mode 100644 index 0000000..54fe5d4 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/string_item.py @@ -0,0 +1,135 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.error_coordinates import ErrorCoordinates +from regula.documentreader.webclient.gen.models.field_item import FieldItem +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.symbol_estimation_item import SymbolEstimationItem +from typing import Optional, Set +from typing_extensions import Self + +class StringItem(BaseModel): + """ + StringItem + """ # noqa: E501 + alignment_symbols_in_string: StrictInt = Field(alias="ALIGNMENT_SYMBOLS_IN_STRING") + check_sums: StrictInt = Field(alias="CHECK_SUMS") + error_position: ErrorCoordinates = Field(alias="ErrorPOSITION") + field_count: StrictInt = Field(alias="FieldCount") + fields: List[FieldItem] = Field(alias="Fields") + strings_distance: StrictInt = Field(alias="STRINGS_DISTANCE") + strings_interval: StrictInt = Field(alias="STRINGS_INTERVAL") + string_filling: StrictInt = Field(alias="STRING_FILLING") + string_position: StrictInt = Field(alias="STRING_POSITION") + symbols_param: StrictInt = Field(alias="SYMBOLS_PARAM") + size_error_alignment: Union[StrictFloat, StrictInt] = Field(alias="SizeError_ALIGNMENT") + size_error_distance: Union[StrictFloat, StrictInt] = Field(alias="SizeError_DISTANCE") + size_error_interval: Union[StrictFloat, StrictInt] = Field(alias="SizeError_INTERVAL") + string_angle: Union[StrictFloat, StrictInt] = Field(alias="StringAngle") + string_borders: RectangleCoordinates = Field(alias="StringBorders") + symbols_count: StrictInt = Field(alias="SymbolsCount") + symbols_estimations: List[SymbolEstimationItem] = Field(alias="SymbolsEstimations") + __properties: ClassVar[List[str]] = ["ALIGNMENT_SYMBOLS_IN_STRING", "CHECK_SUMS", "ErrorPOSITION", "FieldCount", "Fields", "STRINGS_DISTANCE", "STRINGS_INTERVAL", "STRING_FILLING", "STRING_POSITION", "SYMBOLS_PARAM", "SizeError_ALIGNMENT", "SizeError_DISTANCE", "SizeError_INTERVAL", "StringAngle", "StringBorders", "SymbolsCount", "SymbolsEstimations"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of StringItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of error_position + if self.error_position: + _dict['ErrorPOSITION'] = self.error_position.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in fields (list) + _items = [] + if self.fields: + for _item_fields in self.fields: + if _item_fields: + _items.append(_item_fields.to_dict()) + _dict['Fields'] = _items + # override the default output from pydantic by calling `to_dict()` of string_borders + if self.string_borders: + _dict['StringBorders'] = self.string_borders.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in symbols_estimations (list) + _items = [] + if self.symbols_estimations: + for _item_symbols_estimations in self.symbols_estimations: + if _item_symbols_estimations: + _items.append(_item_symbols_estimations.to_dict()) + _dict['SymbolsEstimations'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of StringItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ALIGNMENT_SYMBOLS_IN_STRING": obj.get("ALIGNMENT_SYMBOLS_IN_STRING"), + "CHECK_SUMS": obj.get("CHECK_SUMS"), + "ErrorPOSITION": ErrorCoordinates.from_dict(obj["ErrorPOSITION"]) if obj.get("ErrorPOSITION") is not None else None, + "FieldCount": obj.get("FieldCount"), + "Fields": [FieldItem.from_dict(_item) for _item in obj["Fields"]] if obj.get("Fields") is not None else None, + "STRINGS_DISTANCE": obj.get("STRINGS_DISTANCE"), + "STRINGS_INTERVAL": obj.get("STRINGS_INTERVAL"), + "STRING_FILLING": obj.get("STRING_FILLING"), + "STRING_POSITION": obj.get("STRING_POSITION"), + "SYMBOLS_PARAM": obj.get("SYMBOLS_PARAM"), + "SizeError_ALIGNMENT": obj.get("SizeError_ALIGNMENT"), + "SizeError_DISTANCE": obj.get("SizeError_DISTANCE"), + "SizeError_INTERVAL": obj.get("SizeError_INTERVAL"), + "StringAngle": obj.get("StringAngle"), + "StringBorders": RectangleCoordinates.from_dict(obj["StringBorders"]) if obj.get("StringBorders") is not None else None, + "SymbolsCount": obj.get("SymbolsCount"), + "SymbolsEstimations": [SymbolEstimationItem.from_dict(_item) for _item in obj["SymbolsEstimations"]] if obj.get("SymbolsEstimations") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/string_recognition_result.py b/regula/documentreader/webclient/gen/models/string_recognition_result.py old mode 100755 new mode 100644 index ee23a97..1801345 --- a/regula/documentreader/webclient/gen/models/string_recognition_result.py +++ b/regula/documentreader/webclient/gen/models/string_recognition_result.py @@ -4,119 +4,92 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.symbol_recognition_result import SymbolRecognitionResult +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Describes single row recognition results in multi-line text field of a document -""" -class StringRecognitionResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class StringRecognitionResult(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'string_result': 'list[SymbolRecognitionResult]' - } - - attribute_map = { - 'string_result': 'StringResult' - } - - def __init__(self, string_result=None, local_vars_configuration=None): # noqa: E501 - """StringRecognitionResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._string_result = None - self.discriminator = None - - self.string_result = string_result - - @property - def string_result(self): - """Gets the string_result of this StringRecognitionResult. # noqa: E501 - - Array of recognition results for individual characters of a string # noqa: E501 - - :return: The string_result of this StringRecognitionResult. # noqa: E501 - :rtype: list[SymbolRecognitionResult] + Describes single row recognition results in multi-line text field of a document + """ # noqa: E501 + symbols_count: Union[StrictFloat, StrictInt] = Field(description="Number of StringResult array elements", alias="SymbolsCount") + string_result: List[SymbolRecognitionResult] = Field(description="Array of recognition results for individual characters of a string", alias="StringResult") + buf_length: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Buf_Text text string length", alias="Buf_Length") + buf_text: Optional[StrictStr] = Field(default=None, description="Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^'", alias="Buf_Text") + reserved: Optional[StrictInt] = Field(default=None, alias="Reserved") + __properties: ClassVar[List[str]] = ["SymbolsCount", "StringResult", "Buf_Length", "Buf_Text", "Reserved"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of StringRecognitionResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._string_result + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in string_result (list) + _items = [] + if self.string_result: + for _item_string_result in self.string_result: + if _item_string_result: + _items.append(_item_string_result.to_dict()) + _dict['StringResult'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of StringRecognitionResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "SymbolsCount": obj.get("SymbolsCount"), + "StringResult": [SymbolRecognitionResult.from_dict(_item) for _item in obj["StringResult"]] if obj.get("StringResult") is not None else None, + "Buf_Length": obj.get("Buf_Length"), + "Buf_Text": obj.get("Buf_Text"), + "Reserved": obj.get("Reserved") + }) + return _obj - @string_result.setter - def string_result(self, string_result): - """Sets the string_result of this StringRecognitionResult. - Array of recognition results for individual characters of a string # noqa: E501 - - :param string_result: The string_result of this StringRecognitionResult. # noqa: E501 - :type string_result: list[SymbolRecognitionResult] - """ - if self.local_vars_configuration.client_side_validation and string_result is None: # noqa: E501 - raise ValueError("Invalid value for `string_result`, must not be `None`") # noqa: E501 - - self._string_result = string_result - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, StringRecognitionResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, StringRecognitionResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/symbol.py b/regula/documentreader/webclient/gen/models/symbol.py new file mode 100644 index 0000000..84fc2e3 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/symbol.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class Symbol(BaseModel): + """ + Symbol + """ # noqa: E501 + bounding_rect: List[StrictInt] = Field(alias="boundingRect") + __properties: ClassVar[List[str]] = ["boundingRect"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Symbol from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Symbol from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "boundingRect": obj.get("boundingRect") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/symbol_candidate.py b/regula/documentreader/webclient/gen/models/symbol_candidate.py old mode 100755 new mode 100644 index dc5a3cc..9b79234 --- a/regula/documentreader/webclient/gen/models/symbol_candidate.py +++ b/regula/documentreader/webclient/gen/models/symbol_candidate.py @@ -4,154 +4,83 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Describes an individual character recognition candidate -""" -class SymbolCandidate(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from typing import Optional, Set +from typing_extensions import Self +class SymbolCandidate(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'symbol_code': 'int', - 'symbol_probability': 'int' - } - - attribute_map = { - 'symbol_code': 'SymbolCode', - 'symbol_probability': 'SymbolProbability' - } - - def __init__(self, symbol_code=None, symbol_probability=None, local_vars_configuration=None): # noqa: E501 - """SymbolCandidate - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._symbol_code = None - self._symbol_probability = None - self.discriminator = None - - self.symbol_code = symbol_code - self.symbol_probability = symbol_probability - - @property - def symbol_code(self): - """Gets the symbol_code of this SymbolCandidate. # noqa: E501 - - Unicode symbol code # noqa: E501 - - :return: The symbol_code of this SymbolCandidate. # noqa: E501 - :rtype: int + Describes an individual character recognition candidate + """ # noqa: E501 + symbol_code: StrictInt = Field(description="Unicode symbol code", alias="SymbolCode") + symbol_probability: Annotated[int, Field(le=100, strict=True, ge=0)] = Field(description="character recognition probability (0–100,%)", alias="SymbolProbability") + var_class: Optional[StrictInt] = Field(default=None, alias="Class") + sub_class: Optional[StrictInt] = Field(default=None, alias="SubClass") + __properties: ClassVar[List[str]] = ["SymbolCode", "SymbolProbability", "Class", "SubClass"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SymbolCandidate from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._symbol_code - - @symbol_code.setter - def symbol_code(self, symbol_code): - """Sets the symbol_code of this SymbolCandidate. - - Unicode symbol code # noqa: E501 - - :param symbol_code: The symbol_code of this SymbolCandidate. # noqa: E501 - :type symbol_code: int - """ - if self.local_vars_configuration.client_side_validation and symbol_code is None: # noqa: E501 - raise ValueError("Invalid value for `symbol_code`, must not be `None`") # noqa: E501 - - self._symbol_code = symbol_code + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SymbolCandidate from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "SymbolCode": obj.get("SymbolCode"), + "SymbolProbability": obj.get("SymbolProbability"), + "Class": obj.get("Class"), + "SubClass": obj.get("SubClass") + }) + return _obj - @property - def symbol_probability(self): - """Gets the symbol_probability of this SymbolCandidate. # noqa: E501 - character recognition probability (0–100,%) # noqa: E501 - - :return: The symbol_probability of this SymbolCandidate. # noqa: E501 - :rtype: int - """ - return self._symbol_probability - - @symbol_probability.setter - def symbol_probability(self, symbol_probability): - """Sets the symbol_probability of this SymbolCandidate. - - character recognition probability (0–100,%) # noqa: E501 - - :param symbol_probability: The symbol_probability of this SymbolCandidate. # noqa: E501 - :type symbol_probability: int - """ - if self.local_vars_configuration.client_side_validation and symbol_probability is None: # noqa: E501 - raise ValueError("Invalid value for `symbol_probability`, must not be `None`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - symbol_probability is not None and symbol_probability > 100): # noqa: E501 - raise ValueError("Invalid value for `symbol_probability`, must be a value less than or equal to `100`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - symbol_probability is not None and symbol_probability < 0): # noqa: E501 - raise ValueError("Invalid value for `symbol_probability`, must be a value greater than or equal to `0`") # noqa: E501 - - self._symbol_probability = symbol_probability - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SymbolCandidate): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SymbolCandidate): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/symbol_estimation_item.py b/regula/documentreader/webclient/gen/models/symbol_estimation_item.py new file mode 100644 index 0000000..5341b4b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/symbol_estimation_item.py @@ -0,0 +1,115 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Union +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from typing import Optional, Set +from typing_extensions import Self + +class SymbolEstimationItem(BaseModel): + """ + SymbolEstimationItem + """ # noqa: E501 + alignment_nearest_symbols: StrictInt = Field(alias="ALIGNMENT_NEAREST_SYMBOLS") + contrast_print: StrictInt = Field(alias="CONTRAST_PRINT") + contrast_symbol: StrictInt = Field(alias="CONTRAST_SYMBOL") + char_symbol: StrictInt = Field(alias="CharSymbol") + edge: StrictInt = Field(alias="EDGE") + emptiness: StrictInt = Field(alias="EMPTINESS") + stain: StrictInt = Field(alias="STAIN") + symbols_interval: StrictInt = Field(alias="SYMBOLS_INTERVAL") + symbol_param: StrictInt = Field(alias="SYMBOL_PARAM") + symbol_size: StrictInt = Field(alias="SYMBOL_SIZE") + size_error_align_with_next: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorAlignWithNext") + size_error_align_with_prev: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorAlignWithPrev") + size_error_interv_with_next: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorIntervWithNext") + size_error_interv_with_prev: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorIntervWithPrev") + size_error_symbol_height: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorSymbolHeight") + size_error_symbol_width: Union[StrictFloat, StrictInt] = Field(alias="SizeErrorSymbolWidth") + symbol_bounds: RectangleCoordinates = Field(alias="SymbolBounds") + __properties: ClassVar[List[str]] = ["ALIGNMENT_NEAREST_SYMBOLS", "CONTRAST_PRINT", "CONTRAST_SYMBOL", "CharSymbol", "EDGE", "EMPTINESS", "STAIN", "SYMBOLS_INTERVAL", "SYMBOL_PARAM", "SYMBOL_SIZE", "SizeErrorAlignWithNext", "SizeErrorAlignWithPrev", "SizeErrorIntervWithNext", "SizeErrorIntervWithPrev", "SizeErrorSymbolHeight", "SizeErrorSymbolWidth", "SymbolBounds"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SymbolEstimationItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of symbol_bounds + if self.symbol_bounds: + _dict['SymbolBounds'] = self.symbol_bounds.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SymbolEstimationItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ALIGNMENT_NEAREST_SYMBOLS": obj.get("ALIGNMENT_NEAREST_SYMBOLS"), + "CONTRAST_PRINT": obj.get("CONTRAST_PRINT"), + "CONTRAST_SYMBOL": obj.get("CONTRAST_SYMBOL"), + "CharSymbol": obj.get("CharSymbol"), + "EDGE": obj.get("EDGE"), + "EMPTINESS": obj.get("EMPTINESS"), + "STAIN": obj.get("STAIN"), + "SYMBOLS_INTERVAL": obj.get("SYMBOLS_INTERVAL"), + "SYMBOL_PARAM": obj.get("SYMBOL_PARAM"), + "SYMBOL_SIZE": obj.get("SYMBOL_SIZE"), + "SizeErrorAlignWithNext": obj.get("SizeErrorAlignWithNext"), + "SizeErrorAlignWithPrev": obj.get("SizeErrorAlignWithPrev"), + "SizeErrorIntervWithNext": obj.get("SizeErrorIntervWithNext"), + "SizeErrorIntervWithPrev": obj.get("SizeErrorIntervWithPrev"), + "SizeErrorSymbolHeight": obj.get("SizeErrorSymbolHeight"), + "SizeErrorSymbolWidth": obj.get("SizeErrorSymbolWidth"), + "SymbolBounds": RectangleCoordinates.from_dict(obj["SymbolBounds"]) if obj.get("SymbolBounds") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/symbol_recognition_result.py b/regula/documentreader/webclient/gen/models/symbol_recognition_result.py old mode 100755 new mode 100644 index f247802..63a0953 --- a/regula/documentreader/webclient/gen/models/symbol_recognition_result.py +++ b/regula/documentreader/webclient/gen/models/symbol_recognition_result.py @@ -4,146 +4,98 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Describes a single character recognition results in the text field line -""" -class SymbolRecognitionResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.symbol_candidate import SymbolCandidate +from typing import Optional, Set +from typing_extensions import Self +class SymbolRecognitionResult(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'symbol_rect': 'RectangleCoordinates', - 'list_of_candidates': 'list[SymbolCandidate]' - } - - attribute_map = { - 'symbol_rect': 'SymbolRect', - 'list_of_candidates': 'ListOfCandidates' - } - - def __init__(self, symbol_rect=None, list_of_candidates=None, local_vars_configuration=None): # noqa: E501 - """SymbolRecognitionResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._symbol_rect = None - self._list_of_candidates = None - self.discriminator = None - - self.symbol_rect = symbol_rect - self.list_of_candidates = list_of_candidates - - @property - def symbol_rect(self): - """Gets the symbol_rect of this SymbolRecognitionResult. # noqa: E501 - - - :return: The symbol_rect of this SymbolRecognitionResult. # noqa: E501 - :rtype: RectangleCoordinates + Describes a single character recognition results in the text field line + """ # noqa: E501 + symbol_rect: RectangleCoordinates = Field(alias="SymbolRect") + candidates_count: Union[StrictFloat, StrictInt] = Field(description="Number of significant elements of ListOfCandidates array", alias="CandidatesCount") + list_of_candidates: List[SymbolCandidate] = Field(description="Array of candidate characters. Sorted in descending order of recognition probabilities (the first element has highest probability)", alias="ListOfCandidates") + base_line_bottom: Optional[StrictInt] = Field(default=None, alias="BaseLineBottom") + base_line_top: Optional[StrictInt] = Field(default=None, alias="BaseLineTop") + reserved: Optional[StrictInt] = Field(default=None, alias="Reserved") + __properties: ClassVar[List[str]] = ["SymbolRect", "CandidatesCount", "ListOfCandidates", "BaseLineBottom", "BaseLineTop", "Reserved"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of SymbolRecognitionResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._symbol_rect - - @symbol_rect.setter - def symbol_rect(self, symbol_rect): - """Sets the symbol_rect of this SymbolRecognitionResult. - - - :param symbol_rect: The symbol_rect of this SymbolRecognitionResult. # noqa: E501 - :type symbol_rect: RectangleCoordinates - """ - if self.local_vars_configuration.client_side_validation and symbol_rect is None: # noqa: E501 - raise ValueError("Invalid value for `symbol_rect`, must not be `None`") # noqa: E501 - - self._symbol_rect = symbol_rect + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of symbol_rect + if self.symbol_rect: + _dict['SymbolRect'] = self.symbol_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in list_of_candidates (list) + _items = [] + if self.list_of_candidates: + for _item_list_of_candidates in self.list_of_candidates: + if _item_list_of_candidates: + _items.append(_item_list_of_candidates.to_dict()) + _dict['ListOfCandidates'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of SymbolRecognitionResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "SymbolRect": RectangleCoordinates.from_dict(obj["SymbolRect"]) if obj.get("SymbolRect") is not None else None, + "CandidatesCount": obj.get("CandidatesCount"), + "ListOfCandidates": [SymbolCandidate.from_dict(_item) for _item in obj["ListOfCandidates"]] if obj.get("ListOfCandidates") is not None else None, + "BaseLineBottom": obj.get("BaseLineBottom"), + "BaseLineTop": obj.get("BaseLineTop"), + "Reserved": obj.get("Reserved") + }) + return _obj - @property - def list_of_candidates(self): - """Gets the list_of_candidates of this SymbolRecognitionResult. # noqa: E501 - Array of candidate characters. Sorted in descending order of recognition probabilities (the first element has highest probability) # noqa: E501 - - :return: The list_of_candidates of this SymbolRecognitionResult. # noqa: E501 - :rtype: list[SymbolCandidate] - """ - return self._list_of_candidates - - @list_of_candidates.setter - def list_of_candidates(self, list_of_candidates): - """Sets the list_of_candidates of this SymbolRecognitionResult. - - Array of candidate characters. Sorted in descending order of recognition probabilities (the first element has highest probability) # noqa: E501 - - :param list_of_candidates: The list_of_candidates of this SymbolRecognitionResult. # noqa: E501 - :type list_of_candidates: list[SymbolCandidate] - """ - if self.local_vars_configuration.client_side_validation and list_of_candidates is None: # noqa: E501 - raise ValueError("Invalid value for `list_of_candidates`, must not be `None`") # noqa: E501 - - self._list_of_candidates = list_of_candidates - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, SymbolRecognitionResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, SymbolRecognitionResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/t_doc_binary_info.py b/regula/documentreader/webclient/gen/models/t_doc_binary_info.py new file mode 100644 index 0000000..a52ce40 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/t_doc_binary_info.py @@ -0,0 +1,93 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.binary_data import BinaryData +from regula.documentreader.webclient.gen.models.rfid_raw_data import RfidRawData +from typing import Optional, Set +from typing_extensions import Self + +class TDocBinaryInfo(BaseModel): + """ + TDocBinaryInfo + """ # noqa: E501 + rfid_binary_data: Optional[BinaryData] = Field(default=None, alias="RFID_BINARY_DATA") + rfid_raw_data: Optional[List[RfidRawData]] = Field(default=None, alias="RFID_RAW_DATA") + __properties: ClassVar[List[str]] = ["RFID_BINARY_DATA", "RFID_RAW_DATA"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TDocBinaryInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of rfid_binary_data + if self.rfid_binary_data: + _dict['RFID_BINARY_DATA'] = self.rfid_binary_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in rfid_raw_data (list) + _items = [] + if self.rfid_raw_data: + for _item_rfid_raw_data in self.rfid_raw_data: + if _item_rfid_raw_data: + _items.append(_item_rfid_raw_data.to_dict()) + _dict['RFID_RAW_DATA'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TDocBinaryInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RFID_BINARY_DATA": BinaryData.from_dict(obj["RFID_BINARY_DATA"]) if obj.get("RFID_BINARY_DATA") is not None else None, + "RFID_RAW_DATA": [RfidRawData.from_dict(_item) for _item in obj["RFID_RAW_DATA"]] if obj.get("RFID_RAW_DATA") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/t_doc_binary_info_item.py b/regula/documentreader/webclient/gen/models/t_doc_binary_info_item.py new file mode 100644 index 0000000..0e76537 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/t_doc_binary_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.t_doc_binary_info import TDocBinaryInfo +from typing import Optional, Set +from typing_extensions import Self + +class TDocBinaryInfoItem(BaseModel): + """ + TDocBinaryInfoItem + """ # noqa: E501 + t_doc_binary_info: TDocBinaryInfo = Field(alias="TDocBinaryInfo") + __properties: ClassVar[List[str]] = ["TDocBinaryInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TDocBinaryInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of t_doc_binary_info + if self.t_doc_binary_info: + _dict['TDocBinaryInfo'] = self.t_doc_binary_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TDocBinaryInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "TDocBinaryInfo": TDocBinaryInfo.from_dict(obj["TDocBinaryInfo"]) if obj.get("TDocBinaryInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info.py b/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info.py new file mode 100644 index 0000000..ab173f3 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info.py @@ -0,0 +1,87 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.graph_data import GraphData +from typing import Optional, Set +from typing_extensions import Self + +class TOriginalRFIDGraphicsInfo(BaseModel): + """ + TOriginalRFIDGraphicsInfo + """ # noqa: E501 + rfid_original_graph_data: List[GraphData] = Field(alias="RFID_ORIGINAL_GRAPH_DATA") + __properties: ClassVar[List[str]] = ["RFID_ORIGINAL_GRAPH_DATA"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TOriginalRFIDGraphicsInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in rfid_original_graph_data (list) + _items = [] + if self.rfid_original_graph_data: + for _item_rfid_original_graph_data in self.rfid_original_graph_data: + if _item_rfid_original_graph_data: + _items.append(_item_rfid_original_graph_data.to_dict()) + _dict['RFID_ORIGINAL_GRAPH_DATA'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TOriginalRFIDGraphicsInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "RFID_ORIGINAL_GRAPH_DATA": [GraphData.from_dict(_item) for _item in obj["RFID_ORIGINAL_GRAPH_DATA"]] if obj.get("RFID_ORIGINAL_GRAPH_DATA") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info_item.py b/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info_item.py new file mode 100644 index 0000000..77bcb36 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/t_original_rfid_graphics_info_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.t_original_rfid_graphics_info import TOriginalRFIDGraphicsInfo +from typing import Optional, Set +from typing_extensions import Self + +class TOriginalRFIDGraphicsInfoItem(BaseModel): + """ + TOriginalRFIDGraphicsInfoItem + """ # noqa: E501 + t_original_rfid_graphics_info: TOriginalRFIDGraphicsInfo = Field(alias="TOriginalRFIDGraphicsInfo") + __properties: ClassVar[List[str]] = ["TOriginalRFIDGraphicsInfo"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TOriginalRFIDGraphicsInfoItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of t_original_rfid_graphics_info + if self.t_original_rfid_graphics_info: + _dict['TOriginalRFIDGraphicsInfo'] = self.t_original_rfid_graphics_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TOriginalRFIDGraphicsInfoItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "TOriginalRFIDGraphicsInfo": TOriginalRFIDGraphicsInfo.from_dict(obj["TOriginalRFIDGraphicsInfo"]) if obj.get("TOriginalRFIDGraphicsInfo") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/text.py b/regula/documentreader/webclient/gen/models/text.py old mode 100755 new mode 100644 index 3dcff59..fc68bbf --- a/regula/documentreader/webclient/gen/models/text.py +++ b/regula/documentreader/webclient/gen/models/text.py @@ -4,225 +4,103 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.text_available_source import TextAvailableSource +from regula.documentreader.webclient.gen.models.text_field import TextField +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Contains all document text fields data with validity and cross-source compare checks -""" -class Text(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class Text(BaseModel): """ - openapi_types = { - 'status': 'CheckResult', - 'validity_status': 'CheckResult', - 'comparison_status': 'CheckResult', - 'field_list': 'list[TextField]', - 'available_source_list': 'list[TextAvailableSource]' - } - - attribute_map = { - 'status': 'status', - 'validity_status': 'validityStatus', - 'comparison_status': 'comparisonStatus', - 'field_list': 'fieldList', - 'available_source_list': 'availableSourceList' - } - - def __init__(self, status=None, validity_status=None, comparison_status=None, field_list=None, available_source_list=None, local_vars_configuration=None): # noqa: E501 - """Text - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._status = None - self._validity_status = None - self._comparison_status = None - self._field_list = None - self._available_source_list = None - self.discriminator = None - - self.status = status - self.validity_status = validity_status - self.comparison_status = comparison_status - self.field_list = field_list - self.available_source_list = available_source_list - - @property - def status(self): - """Gets the status of this Text. # noqa: E501 - - - :return: The status of this Text. # noqa: E501 - :rtype: CheckResult - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this Text. - - - :param status: The status of this Text. # noqa: E501 - :type status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def validity_status(self): - """Gets the validity_status of this Text. # noqa: E501 - - - :return: The validity_status of this Text. # noqa: E501 - :rtype: CheckResult - """ - return self._validity_status - - @validity_status.setter - def validity_status(self, validity_status): - """Sets the validity_status of this Text. - - - :param validity_status: The validity_status of this Text. # noqa: E501 - :type validity_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and validity_status is None: # noqa: E501 - raise ValueError("Invalid value for `validity_status`, must not be `None`") # noqa: E501 - - self._validity_status = validity_status - - @property - def comparison_status(self): - """Gets the comparison_status of this Text. # noqa: E501 - - - :return: The comparison_status of this Text. # noqa: E501 - :rtype: CheckResult - """ - return self._comparison_status - - @comparison_status.setter - def comparison_status(self, comparison_status): - """Sets the comparison_status of this Text. - - - :param comparison_status: The comparison_status of this Text. # noqa: E501 - :type comparison_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and comparison_status is None: # noqa: E501 - raise ValueError("Invalid value for `comparison_status`, must not be `None`") # noqa: E501 - - self._comparison_status = comparison_status - - @property - def field_list(self): - """Gets the field_list of this Text. # noqa: E501 - - - :return: The field_list of this Text. # noqa: E501 - :rtype: list[TextField] + Contains all document text fields data with validity and cross-source compare checks + """ # noqa: E501 + status: CheckResult + validity_status: CheckResult = Field(alias="validityStatus") + comparison_status: CheckResult = Field(alias="comparisonStatus") + date_format: StrictStr = Field(description="Date format", alias="dateFormat") + field_list: List[TextField] = Field(alias="fieldList") + available_source_list: List[TextAvailableSource] = Field(alias="availableSourceList") + __properties: ClassVar[List[str]] = ["status", "validityStatus", "comparisonStatus", "dateFormat", "fieldList", "availableSourceList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of Text from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._field_list + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in field_list (list) + _items = [] + if self.field_list: + for _item_field_list in self.field_list: + if _item_field_list: + _items.append(_item_field_list.to_dict()) + _dict['fieldList'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in available_source_list (list) + _items = [] + if self.available_source_list: + for _item_available_source_list in self.available_source_list: + if _item_available_source_list: + _items.append(_item_available_source_list.to_dict()) + _dict['availableSourceList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of Text from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "status": obj.get("status"), + "validityStatus": obj.get("validityStatus"), + "comparisonStatus": obj.get("comparisonStatus"), + "dateFormat": obj.get("dateFormat"), + "fieldList": [TextField.from_dict(_item) for _item in obj["fieldList"]] if obj.get("fieldList") is not None else None, + "availableSourceList": [TextAvailableSource.from_dict(_item) for _item in obj["availableSourceList"]] if obj.get("availableSourceList") is not None else None + }) + return _obj - @field_list.setter - def field_list(self, field_list): - """Sets the field_list of this Text. - - :param field_list: The field_list of this Text. # noqa: E501 - :type field_list: list[TextField] - """ - if self.local_vars_configuration.client_side_validation and field_list is None: # noqa: E501 - raise ValueError("Invalid value for `field_list`, must not be `None`") # noqa: E501 - - self._field_list = field_list - - @property - def available_source_list(self): - """Gets the available_source_list of this Text. # noqa: E501 - - - :return: The available_source_list of this Text. # noqa: E501 - :rtype: list[TextAvailableSource] - """ - return self._available_source_list - - @available_source_list.setter - def available_source_list(self, available_source_list): - """Sets the available_source_list of this Text. - - - :param available_source_list: The available_source_list of this Text. # noqa: E501 - :type available_source_list: list[TextAvailableSource] - """ - if self.local_vars_configuration.client_side_validation and available_source_list is None: # noqa: E501 - raise ValueError("Invalid value for `available_source_list`, must not be `None`") # noqa: E501 - - self._available_source_list = available_source_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Text): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Text): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_available_source.py b/regula/documentreader/webclient/gen/models/text_available_source.py old mode 100755 new mode 100644 index 71160c6..50ee41c --- a/regula/documentreader/webclient/gen/models/text_available_source.py +++ b/regula/documentreader/webclient/gen/models/text_available_source.py @@ -4,172 +4,82 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextAvailableSource(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class TextAvailableSource(BaseModel): """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'source': 'Source', - 'validity_status': 'CheckResult', - 'container_type': 'int' - } - - attribute_map = { - 'source': 'source', - 'validity_status': 'validityStatus', - 'container_type': 'containerType' - } - - def __init__(self, source=None, validity_status=None, container_type=0, local_vars_configuration=None): # noqa: E501 - """TextAvailableSource - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._source = None - self._validity_status = None - self._container_type = None - self.discriminator = None - - self.source = source - self.validity_status = validity_status - if container_type is not None: - self.container_type = container_type - - @property - def source(self): - """Gets the source of this TextAvailableSource. # noqa: E501 - - - :return: The source of this TextAvailableSource. # noqa: E501 - :rtype: Source - """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this TextAvailableSource. - - - :param source: The source of this TextAvailableSource. # noqa: E501 - :type source: Source + TextAvailableSource + """ # noqa: E501 + source: Source + validity_status: CheckResult = Field(alias="validityStatus") + container_type: Optional[StrictInt] = Field(default=0, description="Same as Result type, but used for safe parsing of not-described values. See Result type.", alias="containerType") + __properties: ClassVar[List[str]] = ["source", "validityStatus", "containerType"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextAvailableSource from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - if self.local_vars_configuration.client_side_validation and source is None: # noqa: E501 - raise ValueError("Invalid value for `source`, must not be `None`") # noqa: E501 + excluded_fields: Set[str] = set([ + ]) - self._source = source + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict - @property - def validity_status(self): - """Gets the validity_status of this TextAvailableSource. # noqa: E501 + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextAvailableSource from a dict""" + if obj is None: + return None + if not isinstance(obj, dict): + return cls.model_validate(obj) - :return: The validity_status of this TextAvailableSource. # noqa: E501 - :rtype: CheckResult - """ - return self._validity_status - - @validity_status.setter - def validity_status(self, validity_status): - """Sets the validity_status of this TextAvailableSource. - - - :param validity_status: The validity_status of this TextAvailableSource. # noqa: E501 - :type validity_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and validity_status is None: # noqa: E501 - raise ValueError("Invalid value for `validity_status`, must not be `None`") # noqa: E501 - - self._validity_status = validity_status - - @property - def container_type(self): - """Gets the container_type of this TextAvailableSource. # noqa: E501 + _obj = cls.model_validate({ + "source": obj.get("source"), + "validityStatus": obj.get("validityStatus"), + "containerType": obj.get("containerType") if obj.get("containerType") is not None else 0 + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The container_type of this TextAvailableSource. # noqa: E501 - :rtype: int - """ - return self._container_type - - @container_type.setter - def container_type(self, container_type): - """Sets the container_type of this TextAvailableSource. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param container_type: The container_type of this TextAvailableSource. # noqa: E501 - :type container_type: int - """ - self._container_type = container_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextAvailableSource): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextAvailableSource): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_data_result.py b/regula/documentreader/webclient/gen/models/text_data_result.py old mode 100755 new mode 100644 index 0677324..f7ee573 --- a/regula/documentreader/webclient/gen/models/text_data_result.py +++ b/regula/documentreader/webclient/gen/models/text_data_result.py @@ -4,249 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.doc_visual_extended_info import DocVisualExtendedInfo +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Text fields extracted from one document source. Contains results of specific source for each provided page. -""" -class TextDataResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +class TextDataResult(ResultItem): """ - openapi_types = { - 'doc_visual_extended_info': 'DocVisualExtendedInfo', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'doc_visual_extended_info': 'DocVisualExtendedInfo', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, doc_visual_extended_info=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """TextDataResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_visual_extended_info = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - if doc_visual_extended_info is not None: - self.doc_visual_extended_info = doc_visual_extended_info - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def doc_visual_extended_info(self): - """Gets the doc_visual_extended_info of this TextDataResult. # noqa: E501 - - - :return: The doc_visual_extended_info of this TextDataResult. # noqa: E501 - :rtype: DocVisualExtendedInfo - """ - return self._doc_visual_extended_info - - @doc_visual_extended_info.setter - def doc_visual_extended_info(self, doc_visual_extended_info): - """Sets the doc_visual_extended_info of this TextDataResult. - - - :param doc_visual_extended_info: The doc_visual_extended_info of this TextDataResult. # noqa: E501 - :type doc_visual_extended_info: DocVisualExtendedInfo - """ - - self._doc_visual_extended_info = doc_visual_extended_info - - @property - def buf_length(self): - """Gets the buf_length of this TextDataResult. # noqa: E501 - - - :return: The buf_length of this TextDataResult. # noqa: E501 - :rtype: int - """ - return self._buf_length + Text fields extracted from one document source. Contains results of specific source for each provided page. + """ # noqa: E501 + doc_visual_extended_info: DocVisualExtendedInfo = Field(alias="DocVisualExtendedInfo") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "DocVisualExtendedInfo"] - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this TextDataResult. + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :param buf_length: The buf_length of this TextDataResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this TextDataResult. # noqa: E501 + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - :return: The light of this TextDataResult. # noqa: E501 - :rtype: int - """ - return self._light + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextDataResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @light.setter - def light(self, light): - """Sets the light of this TextDataResult. + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :param light: The light of this TextDataResult. # noqa: E501 - :type light: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this TextDataResult. # noqa: E501 + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of doc_visual_extended_info + if self.doc_visual_extended_info: + _dict['DocVisualExtendedInfo'] = self.doc_visual_extended_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextDataResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "DocVisualExtendedInfo": DocVisualExtendedInfo.from_dict(obj["DocVisualExtendedInfo"]) if obj.get("DocVisualExtendedInfo") is not None else None + }) + return _obj - :return: The list_idx of this TextDataResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this TextDataResult. - - - :param list_idx: The list_idx of this TextDataResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this TextDataResult. # noqa: E501 - - - :return: The page_idx of this TextDataResult. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this TextDataResult. - - - :param page_idx: The page_idx of this TextDataResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this TextDataResult. # noqa: E501 - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this TextDataResult. # noqa: E501 - :rtype: int - """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this TextDataResult. - - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :param result_type: The result_type of this TextDataResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextDataResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextDataResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_data_result_all_of.py b/regula/documentreader/webclient/gen/models/text_data_result_all_of.py deleted file mode 100755 index d7b6e1c..0000000 --- a/regula/documentreader/webclient/gen/models/text_data_result_all_of.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextDataResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'doc_visual_extended_info': 'DocVisualExtendedInfo' - } - - attribute_map = { - 'doc_visual_extended_info': 'DocVisualExtendedInfo' - } - - def __init__(self, doc_visual_extended_info=None, local_vars_configuration=None): # noqa: E501 - """TextDataResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._doc_visual_extended_info = None - self.discriminator = None - - if doc_visual_extended_info is not None: - self.doc_visual_extended_info = doc_visual_extended_info - - @property - def doc_visual_extended_info(self): - """Gets the doc_visual_extended_info of this TextDataResultAllOf. # noqa: E501 - - - :return: The doc_visual_extended_info of this TextDataResultAllOf. # noqa: E501 - :rtype: DocVisualExtendedInfo - """ - return self._doc_visual_extended_info - - @doc_visual_extended_info.setter - def doc_visual_extended_info(self, doc_visual_extended_info): - """Sets the doc_visual_extended_info of this TextDataResultAllOf. - - - :param doc_visual_extended_info: The doc_visual_extended_info of this TextDataResultAllOf. # noqa: E501 - :type doc_visual_extended_info: DocVisualExtendedInfo - """ - - self._doc_visual_extended_info = doc_visual_extended_info - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextDataResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextDataResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_field.py b/regula/documentreader/webclient/gen/models/text_field.py old mode 100755 new mode 100644 index 7434be5..0e65942 --- a/regula/documentreader/webclient/gen/models/text_field.py +++ b/regula/documentreader/webclient/gen/models/text_field.py @@ -4,365 +4,123 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextField(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.cross_source_value_comparison import CrossSourceValueComparison +from regula.documentreader.webclient.gen.models.lcid import LCID +from regula.documentreader.webclient.gen.models.source_validity import SourceValidity +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from regula.documentreader.webclient.gen.models.text_field_value import TextFieldValue +from typing import Optional, Set +from typing_extensions import Self + +class TextField(BaseModel): """ - openapi_types = { - 'field_type': 'TextFieldType', - 'field_name': 'str', - 'lcid': 'LCID', - 'status': 'CheckResult', - 'validity_status': 'CheckResult', - 'comparison_status': 'CheckResult', - 'value': 'str', - 'value_list': 'list[TextFieldValue]', - 'validity_list': 'list[SourceValidity]', - 'comparison_list': 'list[CrossSourceValueComparison]' - } - - attribute_map = { - 'field_type': 'fieldType', - 'field_name': 'fieldName', - 'lcid': 'lcid', - 'status': 'status', - 'validity_status': 'validityStatus', - 'comparison_status': 'comparisonStatus', - 'value': 'value', - 'value_list': 'valueList', - 'validity_list': 'validityList', - 'comparison_list': 'comparisonList' - } - - def __init__(self, field_type=None, field_name=None, lcid=None, status=None, validity_status=None, comparison_status=None, value=None, value_list=None, validity_list=None, comparison_list=None, local_vars_configuration=None): # noqa: E501 - """TextField - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._field_type = None - self._field_name = None - self._lcid = None - self._status = None - self._validity_status = None - self._comparison_status = None - self._value = None - self._value_list = None - self._validity_list = None - self._comparison_list = None - self.discriminator = None - - self.field_type = field_type - self.field_name = field_name - if lcid is not None: - self.lcid = lcid - self.status = status - self.validity_status = validity_status - self.comparison_status = comparison_status - self.value = value - self.value_list = value_list - self.validity_list = validity_list - self.comparison_list = comparison_list - - @property - def field_type(self): - """Gets the field_type of this TextField. # noqa: E501 - - - :return: The field_type of this TextField. # noqa: E501 - :rtype: TextFieldType - """ - return self._field_type - - @field_type.setter - def field_type(self, field_type): - """Sets the field_type of this TextField. - - - :param field_type: The field_type of this TextField. # noqa: E501 - :type field_type: TextFieldType - """ - if self.local_vars_configuration.client_side_validation and field_type is None: # noqa: E501 - raise ValueError("Invalid value for `field_type`, must not be `None`") # noqa: E501 - - self._field_type = field_type - - @property - def field_name(self): - """Gets the field_name of this TextField. # noqa: E501 - - Field name. Only use to search values for fields with fieldType=50(other). In general, use fieldType for lookup. # noqa: E501 - - :return: The field_name of this TextField. # noqa: E501 - :rtype: str - """ - return self._field_name - - @field_name.setter - def field_name(self, field_name): - """Sets the field_name of this TextField. - - Field name. Only use to search values for fields with fieldType=50(other). In general, use fieldType for lookup. # noqa: E501 - - :param field_name: The field_name of this TextField. # noqa: E501 - :type field_name: str - """ - if self.local_vars_configuration.client_side_validation and field_name is None: # noqa: E501 - raise ValueError("Invalid value for `field_name`, must not be `None`") # noqa: E501 - - self._field_name = field_name - - @property - def lcid(self): - """Gets the lcid of this TextField. # noqa: E501 - - - :return: The lcid of this TextField. # noqa: E501 - :rtype: LCID - """ - return self._lcid - - @lcid.setter - def lcid(self, lcid): - """Sets the lcid of this TextField. - - - :param lcid: The lcid of this TextField. # noqa: E501 - :type lcid: LCID - """ - - self._lcid = lcid - - @property - def status(self): - """Gets the status of this TextField. # noqa: E501 - - - :return: The status of this TextField. # noqa: E501 - :rtype: CheckResult - """ - return self._status - - @status.setter - def status(self, status): - """Sets the status of this TextField. - - - :param status: The status of this TextField. # noqa: E501 - :type status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and status is None: # noqa: E501 - raise ValueError("Invalid value for `status`, must not be `None`") # noqa: E501 - - self._status = status - - @property - def validity_status(self): - """Gets the validity_status of this TextField. # noqa: E501 - - - :return: The validity_status of this TextField. # noqa: E501 - :rtype: CheckResult - """ - return self._validity_status - - @validity_status.setter - def validity_status(self, validity_status): - """Sets the validity_status of this TextField. - - - :param validity_status: The validity_status of this TextField. # noqa: E501 - :type validity_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and validity_status is None: # noqa: E501 - raise ValueError("Invalid value for `validity_status`, must not be `None`") # noqa: E501 - - self._validity_status = validity_status - - @property - def comparison_status(self): - """Gets the comparison_status of this TextField. # noqa: E501 - - - :return: The comparison_status of this TextField. # noqa: E501 - :rtype: CheckResult - """ - return self._comparison_status - - @comparison_status.setter - def comparison_status(self, comparison_status): - """Sets the comparison_status of this TextField. - - - :param comparison_status: The comparison_status of this TextField. # noqa: E501 - :type comparison_status: CheckResult - """ - if self.local_vars_configuration.client_side_validation and comparison_status is None: # noqa: E501 - raise ValueError("Invalid value for `comparison_status`, must not be `None`") # noqa: E501 - - self._comparison_status = comparison_status - - @property - def value(self): - """Gets the value of this TextField. # noqa: E501 - - The most confidence value, selected from valueList # noqa: E501 - - :return: The value of this TextField. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this TextField. - - The most confidence value, selected from valueList # noqa: E501 - - :param value: The value of this TextField. # noqa: E501 - :type value: str - """ - if self.local_vars_configuration.client_side_validation and value is None: # noqa: E501 - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - - self._value = value - - @property - def value_list(self): - """Gets the value_list of this TextField. # noqa: E501 - - - :return: The value_list of this TextField. # noqa: E501 - :rtype: list[TextFieldValue] - """ - return self._value_list - - @value_list.setter - def value_list(self, value_list): - """Sets the value_list of this TextField. - - - :param value_list: The value_list of this TextField. # noqa: E501 - :type value_list: list[TextFieldValue] - """ - if self.local_vars_configuration.client_side_validation and value_list is None: # noqa: E501 - raise ValueError("Invalid value for `value_list`, must not be `None`") # noqa: E501 - - self._value_list = value_list - - @property - def validity_list(self): - """Gets the validity_list of this TextField. # noqa: E501 - - Validity of all field values for given source. If there are two values on different pages for one field-source pair, then validity also will include logical match checking. If such values do not match, validity will return error. # noqa: E501 - - :return: The validity_list of this TextField. # noqa: E501 - :rtype: list[SourceValidity] - """ - return self._validity_list - - @validity_list.setter - def validity_list(self, validity_list): - """Sets the validity_list of this TextField. - - Validity of all field values for given source. If there are two values on different pages for one field-source pair, then validity also will include logical match checking. If such values do not match, validity will return error. # noqa: E501 - - :param validity_list: The validity_list of this TextField. # noqa: E501 - :type validity_list: list[SourceValidity] - """ - if self.local_vars_configuration.client_side_validation and validity_list is None: # noqa: E501 - raise ValueError("Invalid value for `validity_list`, must not be `None`") # noqa: E501 - - self._validity_list = validity_list - - @property - def comparison_list(self): - """Gets the comparison_list of this TextField. # noqa: E501 - - - :return: The comparison_list of this TextField. # noqa: E501 - :rtype: list[CrossSourceValueComparison] - """ - return self._comparison_list - - @comparison_list.setter - def comparison_list(self, comparison_list): - """Sets the comparison_list of this TextField. - - - :param comparison_list: The comparison_list of this TextField. # noqa: E501 - :type comparison_list: list[CrossSourceValueComparison] - """ - if self.local_vars_configuration.client_side_validation and comparison_list is None: # noqa: E501 - raise ValueError("Invalid value for `comparison_list`, must not be `None`") # noqa: E501 - - self._comparison_list = comparison_list - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextField): - return False - - return self.to_dict() == other.to_dict() + TextField + """ # noqa: E501 + field_type: TextFieldType = Field(alias="fieldType") + field_name: StrictStr = Field(description="Field name. Only use to search values for fields with fieldType=50(other). In general, use fieldType for lookup.", alias="fieldName") + lcid: LCID + lcid_name: Optional[StrictStr] = Field(default=None, description="LCID name", alias="lcidName") + status: CheckResult + validity_status: CheckResult = Field(alias="validityStatus") + comparison_status: CheckResult = Field(alias="comparisonStatus") + value: StrictStr = Field(description="The most confidence value, selected from valueList") + value_list: List[TextFieldValue] = Field(alias="valueList") + validity_list: List[SourceValidity] = Field(description="Validity of all field values for given source. If there are two values on different pages for one field-source pair, then validity also will include logical match checking. If such values do not match, validity will return error.", alias="validityList") + comparison_list: List[CrossSourceValueComparison] = Field(alias="comparisonList") + __properties: ClassVar[List[str]] = ["fieldType", "fieldName", "lcid", "lcidName", "status", "validityStatus", "comparisonStatus", "value", "valueList", "validityList", "comparisonList"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextField from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in value_list (list) + _items = [] + if self.value_list: + for _item_value_list in self.value_list: + if _item_value_list: + _items.append(_item_value_list.to_dict()) + _dict['valueList'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in validity_list (list) + _items = [] + if self.validity_list: + for _item_validity_list in self.validity_list: + if _item_validity_list: + _items.append(_item_validity_list.to_dict()) + _dict['validityList'] = _items + # override the default output from pydantic by calling `to_dict()` of each item in comparison_list (list) + _items = [] + if self.comparison_list: + for _item_comparison_list in self.comparison_list: + if _item_comparison_list: + _items.append(_item_comparison_list.to_dict()) + _dict['comparisonList'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextField from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "fieldType": obj.get("fieldType"), + "fieldName": obj.get("fieldName"), + "lcid": obj.get("lcid"), + "lcidName": obj.get("lcidName"), + "status": obj.get("status"), + "validityStatus": obj.get("validityStatus"), + "comparisonStatus": obj.get("comparisonStatus"), + "value": obj.get("value"), + "valueList": [TextFieldValue.from_dict(_item) for _item in obj["valueList"]] if obj.get("valueList") is not None else None, + "validityList": [SourceValidity.from_dict(_item) for _item in obj["validityList"]] if obj.get("validityList") is not None else None, + "comparisonList": [CrossSourceValueComparison.from_dict(_item) for _item in obj["comparisonList"]] if obj.get("comparisonList") is not None else None + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextField): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_field_type.py b/regula/documentreader/webclient/gen/models/text_field_type.py old mode 100755 new mode 100644 index ae3772a..f0f3310 --- a/regula/documentreader/webclient/gen/models/text_field_type.py +++ b/regula/documentreader/webclient/gen/models/text_field_type.py @@ -4,1378 +4,668 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextFieldType(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - DOCUMENT_CLASS_CODE = int("0") - - ISSUING_STATE_CODE = int("1") - - DOCUMENT_NUMBER = int("2") - - DATE_OF_EXPIRY = int("3") - - DATE_OF_ISSUE = int("4") - - DATE_OF_BIRTH = int("5") - - PLACE_OF_BIRTH = int("6") - - PERSONAL_NUMBER = int("7") - - SURNAME = int("8") - - GIVEN_NAMES = int("9") - - MOTHERS_NAME = int("10") - - NATIONALITY = int("11") - - SEX = int("12") - - HEIGHT = int("13") - - WEIGHT = int("14") - - EYES_COLOR = int("15") - - HAIR_COLOR = int("16") - - ADDRESS = int("17") - - DONOR = int("18") - - SOCIAL_SECURITY_NUMBER = int("19") - - DL_CLASS = int("20") - - DL_ENDORSED = int("21") - - DL_RESTRICTION_CODE = int("22") - - DL_UNDER_21_DATE = int("23") - - AUTHORITY = int("24") - - SURNAME_AND_GIVEN_NAMES = int("25") - - NATIONALITY_CODE = int("26") - - PASSPORT_NUMBER = int("27") - - INVITATION_NUMBER = int("28") - - VISA_ID = int("29") - - VISA_CLASS = int("30") - - VISA_SUBCLASS = int("31") - - MRZ_TYPE = int("35") - - OPTIONAL_DATA = int("36") - - DOCUMENT_CLASS_NAME = int("37") - - ISSUING_STATE_NAME = int("38") - - PLACE_OF_ISSUE = int("39") - - DOCUMENT_NUMBER_CHECKSUM = int("40") - - DATE_OF_BIRTH_CHECKSUM = int("41") - - DATE_OF_EXPIRY_CHECKSUM = int("42") - - PERSONAL_NUMBER_CHECKSUM = int("43") - - FINAL_CHECKSUM = int("44") - - PASSPORT_NUMBER_CHECKSUM = int("45") - - INVITATION_NUMBER_CHECKSUM = int("46") - - VISA_ID_CHECKSUM = int("47") - - SURNAME_AND_GIVEN_NAMES_CHECKSUM = int("48") - - VISA_VALID_UNTIL_CHECKSUM = int("49") - - OTHER = int("50") - - MRZ_STRINGS = int("51") - - NAME_SUFFIX = int("52") - - NAME_PREFIX = int("53") - - DATE_OF_ISSUE_CHECKSUM = int("54") - - DATE_OF_ISSUE_CHECK_DIGIT = int("55") - - DOCUMENT_SERIES = int("56") - - REG_CERT_REG_NUMBER = int("57") - - REG_CERT_CAR_MODEL = int("58") - - REG_CERT_CAR_COLOR = int("59") - - REG_CERT_BODY_NUMBER = int("60") - - REG_CERT_CAR_TYPE = int("61") - - REG_CERT_MAX_WEIGHT = int("62") - - REG_CERT_WEIGHT = int("63") - - ADDRESS_AREA = int("64") - - ADDRESS_STATE = int("65") - - ADDRESS_BUILDING = int("66") - - ADDRESS_HOUSE = int("67") - - ADDRESS_FLAT = int("68") - - PLACE_OF_REGISTRATION = int("69") - - DATE_OF_REGISTRATION = int("70") - - RESIDENT_FROM = int("71") - - RESIDENT_UNTIL = int("72") - - AUTHORITY_CODE = int("73") - - PLACE_OF_BIRTH_AREA = int("74") - - PLACE_OF_BIRTH_STATE_CODE = int("75") - - ADDRESS_STREET = int("76") - - ADDRESS_CITY = int("77") - - ADDRESS_JURISDICTION_CODE = int("78") - - ADDRESS_POSTAL_CODE = int("79") - - DOCUMENT_NUMBER_CHECK_DIGIT = int("80") - - DATE_OF_BIRTH_CHECK_DIGIT = int("81") - - DATE_OF_EXPIRY_CHECK_DIGIT = int("82") - - PERSONAL_NUMBER_CHECK_DIGIT = int("83") - - FINAL_CHECK_DIGIT = int("84") - - PASSPORT_NUMBER_CHECK_DIGIT = int("85") - - INVITATION_NUMBER_CHECK_DIGIT = int("86") - - VISA_ID_CHECK_DIGIT = int("87") - - SURNAME_AND_GIVEN_NAMES_CHECK_DIGIT = int("88") - - VISA_VALID_UNTIL_CHECK_DIGIT = int("89") - - PERMIT_DL_CLASS = int("90") - - PERMIT_DATE_OF_EXPIRY = int("91") - - PERMIT_IDENTIFIER = int("92") - - PERMIT_DATE_OF_ISSUE = int("93") - - PERMIT_RESTRICTION_CODE = int("94") - - PERMIT_ENDORSED = int("95") - - ISSUE_TIMESTAMP = int("96") - - NUMBER_OF_DUPLICATES = int("97") - - MEDICAL_INDICATOR_CODES = int("98") - - NON_RESIDENT_INDICATOR = int("99") - - VISA_TYPE = int("100") - - VISA_VALID_FROM = int("101") - - VISA_VALID_UNTIL = int("102") - - DURATION_OF_STAY = int("103") - - NUMBER_OF_ENTRIES = int("104") - - DAY = int("105") - - MONTH = int("106") - - YEAR = int("107") - - UNIQUE_CUSTOMER_IDENTIFIER = int("108") - - COMMERCIAL_VEHICLE_CODES = int("109") - - AKA_DATE_OF_BIRTH = int("110") - - AKA_SOCIAL_SECURITY_NUMBER = int("111") - - AKA_SURNAME = int("112") - - AKA_GIVEN_NAMES = int("113") - - AKA_NAME_SUFFIX = int("114") - - AKA_NAME_PREFIX = int("115") - - MAILING_ADDRESS_STREET = int("116") - - MAILING_ADDRESS_CITY = int("117") - - MAILING_ADDRESS_JURISDICTION_CODE = int("118") - - MAILING_ADDRESS_POSTAL_CODE = int("119") - - AUDIT_INFORMATION = int("120") - - INVENTORY_NUMBER = int("121") - - RACE_ETHNICITY = int("122") - - JURISDICTION_VEHICLE_CLASS = int("123") - - JURISDICTION_ENDORSEMENT_CODE = int("124") - - JURISDICTION_RESTRICTION_CODE = int("125") - - FAMILY_NAME = int("126") - - GIVEN_NAMES_RUS = int("127") - - VISA_ID_RUS = int("128") - - FATHERS_NAME = int("129") - - FATHERS_NAME_RUS = int("130") - - SURNAME_AND_GIVEN_NAMES_RUS = int("131") - - PLACE_OF_BIRTH_RUS = int("132") - - AUTHORITY_RUS = int("133") - - ISSUING_STATE_CODE_NUMERIC = int("134") - - NATIONALITY_CODE_NUMERIC = int("135") - - ENGINE_POWER = int("136") - - ENGINE_VOLUME = int("137") - - CHASSIS_NUMBER = int("138") - - ENGINE_NUMBER = int("139") - - ENGINE_MODEL = int("140") - - VEHICLE_CATEGORY = int("141") - - IDENTITY_CARD_NUMBER = int("142") - - CONTROL_NUMBER = int("143") - - PARENTS_GIVEN_NAMES = int("144") - - SECOND_SURNAME = int("145") - - MIDDLE_NAME = int("146") - - REG_CERT_VIN = int("147") - - REG_CERT_VIN_CHECK_DIGIT = int("148") - - REG_CERT_VIN_CHECKSUM = int("149") - - LINE_1_CHECK_DIGIT = int("150") - - LINE_2_CHECK_DIGIT = int("151") - - LINE_3_CHECK_DIGIT = int("152") - - LINE_1_CHECKSUM = int("153") - - LINE_2_CHECKSUM = int("154") - - LINE_3_CHECKSUM = int("155") - - REG_CERT_REG_NUMBER_CHECK_DIGIT = int("156") - - REG_CERT_REG_NUMBER_CHECKSUM = int("157") - - REG_CERT_VEHICLE_ITS_CODE = int("158") - - CARD_ACCESS_NUMBER = int("159") - - MARITAL_STATUS = int("160") - - COMPANY_NAME = int("161") - - SPECIAL_NOTES = int("162") - - SURNAME_OF_SPOUSE = int("163") - - TRACKING_NUMBER = int("164") - - BOOKLET_NUMBER = int("165") - - CHILDREN = int("166") - - COPY = int("167") - - SERIAL_NUMBER = int("168") - - DOSSIER_NUMBER = int("169") - - AKA_SURNAME_AND_GIVEN_NAMES = int("170") - - TERRITORIAL_VALIDITY = int("171") - - MRZ_STRINGS_WITH_CORRECT_CHECK_SUMS = int("172") - - DL_CDL_RESTRICTION_CODE = int("173") - - DL_UNDER_18_DATE = int("174") - - DL_RECORD_CREATED = int("175") - - DL_DUPLICATE_DATE = int("176") - - DL_ISSUE_TYPE = int("177") - - MILITARY_BOOK_NUMBER = int("178") - - DESTINATION = int("179") - - BLOOD_GROUP = int("180") - - SEQUENCE_NUMBER = int("181") - - REG_CERT_BODY_TYPE = int("182") - - REG_CERT_CAR_MARK = int("183") - - TRANSACTION_NUMBER = int("184") - - AGE = int("185") - - FOLIO_NUMBER = int("186") - - VOTER_KEY = int("187") - - ADDRESS_MUNICIPALITY = int("188") - - ADDRESS_LOCATION = int("189") - - SECTION = int("190") - - OCR_NUMBER = int("191") - - FEDERAL_ELECTIONS = int("192") - - REFERENCE_NUMBER = int("193") - - OPTIONAL_DATA_CHECKSUM = int("194") - - OPTIONAL_DATA_CHECK_DIGIT = int("195") - - VISA_NUMBER = int("196") - - VISA_NUMBER_CHECKSUM = int("197") - - VISA_NUMBER_CHECK_DIGIT = int("198") - - VOTER = int("199") - - PREVIOUS_TYPE = int("200") - - FIELD_FROM_MRZ = int("220") - - CURRENT_DATE = int("221") - - STATUS_DATE_OF_EXPIRY = int("251") - - BANKNOTE_NUMBER = int("252") - - CSC_CODE = int("253") - - ARTISTIC_NAME = int("254") - - ACADEMIC_TITLE = int("255") - - ADDRESS_COUNTRY = int("256") - - ADDRESS_ZIP_CODE = int("257") - - E_ID_RESIDENCE_PERMIT_1 = int("258") - - E_ID_RESIDENCE_PERMIT_2 = int("259") - - E_ID_PLACE_OF_BIRTH_STREET = int("260") - - E_ID_PLACE_OF_BIRTH_CITY = int("261") - - E_ID_PLACE_OF_BIRTH_STATE = int("262") - - E_ID_PLACE_OF_BIRTH_COUNTRY = int("263") - - E_ID_PLACE_OF_BIRTH_ZIP_CODE = int("264") - - CDL_CLASS = int("265") - - DL_UNDER_19_DATE = int("266") - - WEIGHT_POUNDS = int("267") - - LIMITED_DURATION_DOCUMENT_INDICATOR = int("268") - - ENDORSEMENT_EXPIRATION_DATE = int("269") - - REVISION_DATE = int("270") - - COMPLIANCE_TYPE = int("271") - - FAMILY_NAME_TRUNCATION = int("272") - - FIRST_NAME_TRUNCATION = int("273") - - MIDDLE_NAME_TRUNCATION = int("274") - - EXAM_DATE = int("275") - - ORGANIZATION = int("276") - - DEPARTMENT = int("277") - - PAY_GRADE = int("278") - - RANK = int("279") - - BENEFITS_NUMBER = int("280") - - SPONSOR_SERVICE = int("281") - - SPONSOR_STATUS = int("282") - - SPONSOR = int("283") - - RELATIONSHIP = int("284") - - USCIS = int("285") - - CATEGORY = int("286") - - CONDITIONS = int("287") - - IDENTIFIER = int("288") - - CONFIGURATION = int("289") - - DISCRETIONARY_DATA = int("290") - - LINE_1_OPTIONAL_DATA = int("291") - - LINE_2_OPTIONAL_DATA = int("292") - - LINE_3_OPTIONAL_DATA = int("293") - - EQV_CODE = int("294") - - ALT_CODE = int("295") - - BINARY_CODE = int("296") - - PSEUDO_CODE = int("297") - - FEE = int("298") - - STAMP_NUMBER = int("299") - - SBH_SECURITY_OPTIONS = int("300") - - SBH_INTEGRITY_OPTIONS = int("301") - - DATE_OF_CREATION = int("302") - - VALIDITY_PERIOD = int("303") - - PATRON_HEADER_VERSION = int("304") - - BDB_TYPE = int("305") - - BIOMETRIC_TYPE = int("306") - - BIOMETRIC_SUBTYPE = int("307") - - BIOMETRIC_PRODUCT_ID = int("308") - - BIOMETRIC_FORMAT_OWNER = int("309") - - BIOMETRIC_FORMAT_TYPE = int("310") - - PHONE = int("311") - - PROFESSION = int("312") - - TITLE = int("313") - - PERSONAL_SUMMARY = int("314") - - OTHER_VALID_ID = int("315") - - CUSTODY_INFO = int("316") - - OTHER_NAME = int("317") - - OBSERVATIONS = int("318") - - TAX = int("319") - - DATE_OF_PERSONALIZATION = int("320") - - PERSONALIZATION_SN = int("321") - - OTHER_PERSON_NAME = int("322") - - PERSON_TO_NOTIFY_DATE_OF_RECORD = int("323") - - PERSON_TO_NOTIFY_NAME = int("324") - - PERSON_TO_NOTIFY_PHONE = int("325") - - PERSON_TO_NOTIFY_ADDRESS = int("326") - - DS_CERTIFICATE_ISSUER = int("327") - - DS_CERTIFICATE_SUBJECT = int("328") - - DS_CERTIFICATE_VALID_FROM = int("329") - - DS_CERTIFICATE_VALID_TO = int("330") - - VRC_DATA_OBJECT_ENTRY = int("331") - - TYPE_APPROVAL_NUMBER = int("332") - - ADMINISTRATIVE_NUMBER = int("333") - - DOCUMENT_DISCRIMINATOR = int("334") - - DATA_DISCRIMINATOR = int("335") - - ISO_ISSUER_ID_NUMBER = int("336") - - DTC_VERSION = int("337") - - DTC_ID = int("338") - - DTC_DATE_OF_EXPIRY = int("339") - - GNIB_NUMBER = int("340") - - DEPT_NUMBER = int("341") - - TELEX_CODE = int("342") - - ALLERGIES = int("343") - - SP_CODE = int("344") - - COURT_CODE = int("345") - - CTY = int("346") - - SPONSOR_SSN = int("347") - - DOD_NUMBER = int("348") - - MC_NOVICE_DATE = int("349") - - DUF_NUMBER = int("350") - - AGY = int("351") - - PNR_CODE = int("352") - - FROM_AIRPORT_CODE = int("353") - - TO_AIRPORT_CODE = int("354") - - FLIGHT_NUMBER = int("355") - - DATE_OF_FLIGHT = int("356") - - SEAT_NUMBER = int("357") - - DATE_OF_ISSUE_BOARDING_PASS = int("358") - - CCW_UNTIL = int("359") - - REFERENCE_NUMBER_CHECKSUM = int("360") - - REFERENCE_NUMBER_CHECK_DIGIT = int("361") - - ROOM_NUMBER = int("362") - - RELIGION = int("363") - - REMAINDER_TERM = int("364") - - ELECTRONIC_TICKET_INDICATOR = int("365") - - COMPARTMENT_CODE = int("366") - - CHECK_IN_SEQUENCE_NUMBER = int("367") - - AIRLINE_DESIGNATOR_OF_BOARDING_PASS_ISSUER = int("368") - - AIRLINE_NUMERIC_CODE = int("369") - - TICKET_NUMBER = int("370") - - FREQUENT_FLYER_AIRLINE_DESIGNATOR = int("371") - - FREQUENT_FLYER_NUMBER = int("372") - - FREE_BAGGAGE_ALLOWANCE = int("373") - - PDF417_CODEC = int("374") - - IDENTITY_CARD_NUMBER_CHECKSUM = int("375") - - IDENTITY_CARD_NUMBER_CHECK_DIGIT = int("376") - - VETERAN = int("377") - - DL_CLASS_CODE_A1_FROM = int("378") - - DL_CLASS_CODE_A1_TO = int("379") - - DL_CLASS_CODE_A1_NOTES = int("380") - - DL_CLASS_CODE_A_FROM = int("381") - - DL_CLASS_CODE_A_TO = int("382") - - DL_CLASS_CODE_A_NOTES = int("383") - - DL_CLASS_CODE_B_FROM = int("384") - - DL_CLASS_CODE_B_TO = int("385") - - DL_CLASS_CODE_B_NOTES = int("386") - - DL_CLASS_CODE_C1_FROM = int("387") - - DL_CLASS_CODE_C1_TO = int("388") - - DL_CLASS_CODE_C1_NOTES = int("389") - - DL_CLASS_CODE_C_FROM = int("390") - - DL_CLASS_CODE_C_TO = int("391") - - DL_CLASS_CODE_C_NOTES = int("392") - - DL_CLASS_CODE_D1_FROM = int("393") - - DL_CLASS_CODE_D1_TO = int("394") - - DL_CLASS_CODE_D1_NOTES = int("395") - - DL_CLASS_CODE_D_FROM = int("396") - - DL_CLASS_CODE_D_TO = int("397") - - DL_CLASS_CODE_D_NOTES = int("398") - - DL_CLASS_CODE_BE_FROM = int("399") - - DL_CLASS_CODE_BE_TO = int("400") - - DL_CLASS_CODE_BE_NOTES = int("401") - - DL_CLASS_CODE_C1E_FROM = int("402") - - DL_CLASS_CODE_C1E_TO = int("403") - - DL_CLASS_CODE_C1E_NOTES = int("404") - - DL_CLASS_CODE_CE_FROM = int("405") - - DL_CLASS_CODE_CE_TO = int("406") - - DL_CLASS_CODE_CE_NOTES = int("407") - - DL_CLASS_CODE_D1E_FROM = int("408") - - DL_CLASS_CODE_D1E_TO = int("409") - - DL_CLASS_CODE_D1E_NOTES = int("410") - - DL_CLASS_CODE_DE_FROM = int("411") - - DL_CLASS_CODE_DE_TO = int("412") - - DL_CLASS_CODE_DE_NOTES = int("413") - - DL_CLASS_CODE_M_FROM = int("414") - - DL_CLASS_CODE_M_TO = int("415") - - DL_CLASS_CODE_M_NOTES = int("416") - - DL_CLASS_CODE_L_FROM = int("417") - - DL_CLASS_CODE_L_TO = int("418") - - DL_CLASS_CODE_L_NOTES = int("419") - - DL_CLASS_CODE_T_FROM = int("420") - - DL_CLASS_CODE_T_TO = int("421") - - DL_CLASS_CODE_T_NOTES = int("422") - - DL_CLASS_CODE_AM_FROM = int("423") - - DL_CLASS_CODE_AM_TO = int("424") - - DL_CLASS_CODE_AM_NOTES = int("425") - - DL_CLASS_CODE_A2_FROM = int("426") - - DL_CLASS_CODE_A2_TO = int("427") - - DL_CLASS_CODE_A2_NOTES = int("428") - - DL_CLASS_CODE_B1_FROM = int("429") - - DL_CLASS_CODE_B1_TO = int("430") - - DL_CLASS_CODE_B1_NOTES = int("431") - - SURNAME_AT_BIRTH = int("432") - - CIVIL_STATUS = int("433") - - NUMBER_OF_SEATS = int("434") - - NUMBER_OF_STANDING_PLACES = int("435") - - MAX_SPEED = int("436") - - FUEL_TYPE = int("437") - - EC_ENVIRONMENTAL_TYPE = int("438") - - POWER_WEIGHT_RATIO = int("439") - - MAX_MASS_OF_TRAILER_BRAKED = int("440") - - MAX_MASS_OF_TRAILER_UNBRAKED = int("441") - - TRANSMISSION_TYPE = int("442") - - TRAILER_HITCH = int("443") - - ACCOMPANIED_BY = int("444") - - POLICE_DISTRICT = int("445") - - FIRST_ISSUE_DATE = int("446") - - PAYLOAD_CAPACITY = int("447") - - NUMBER_OF_AXLES = int("448") - - PERMISSIBLE_AXLE_LOAD = int("449") - - PRECINCT = int("450") - - INVITED_BY = int("451") - - PURPOSE_OF_ENTRY = int("452") - - SKIN_COLOR = int("453") - - COMPLEXION = int("454") - - AIRPORT_FROM = int("455") - - AIRPORT_TO = int("456") - - AIRLINE_NAME = int("457") - - AIRLINE_NAME_FREQUENT_FLYER = int("458") - - LICENSE_NUMBER = int("459") - - IN_TANKS = int("460") - - EXCEPT_IN_TANKS = int("461") - - FAST_TRACK = int("462") - - OWNER = int("463") - - MRZ_STRINGS_ICAO_RFID = int("464") - - NUMBER_OF_CARD_ISSUANCE = int("465") - - NUMBER_OF_CARD_ISSUANCE_CHECKSUM = int("466") - - NUMBER_OF_CARD_ISSUANCE_CHECK_DIGIT = int("467") - - CENTURY_DATE_OF_BIRTH = int("468") - - DL_CLASS_CODE_A3_FROM = int("469") - - DL_CLASS_CODE_A3_TO = int("470") - - DL_CLASS_CODE_A3_NOTES = int("471") - - DL_CLASS_CODE_C2_FROM = int("472") - - DL_CLASS_CODE_C2_TO = int("473") - - DL_CLASS_CODE_C2_NOTES = int("474") - - DL_CLASS_CODE_B2_FROM = int("475") - - DL_CLASS_CODE_B2_TO = int("476") - - DL_CLASS_CODE_B2_NOTES = int("477") - - DL_CLASS_CODE_D2_FROM = int("478") - - DL_CLASS_CODE_D2_TO = int("479") - - DL_CLASS_CODE_D2_NOTES = int("480") - - DL_CLASS_CODE_B2E_FROM = int("481") - - DL_CLASS_CODE_B2E_TO = int("482") - - DL_CLASS_CODE_B2E_NOTES = int("483") - - DL_CLASS_CODE_G_FROM = int("484") - - DL_CLASS_CODE_G_TO = int("485") - - DL_CLASS_CODE_G_NOTES = int("486") - - DL_CLASS_CODE_J_FROM = int("487") - - DL_CLASS_CODE_J_TO = int("488") - - DL_CLASS_CODE_J_NOTES = int("489") - - DL_CLASS_CODE_LC_FROM = int("490") - - DL_CLASS_CODE_LC_TO = int("491") - - DL_CLASS_CODE_LC_NOTES = int("492") - - BANK_CARD_NUMBER = int("493") - - BANK_CARD_VALID_THRU = int("494") - - TAX_NUMBER = int("495") - - HEALTH_NUMBER = int("496") - - GRANDFATHER_NAME = int("497") - - SELECTEE_INDICATOR = int("498") - - MOTHER_SURNAME = int("499") - - MOTHER_GIVEN_NAME = int("500") - - FATHER_SURNAME = int("501") - - FATHER_GIVEN_NAME = int("502") - - MOTHER_DATE_OF_BIRTH = int("503") - - FATHER_DATE_OF_BIRTH = int("504") - - MOTHER_PERSONAL_NUMBER = int("505") - - FATHER_PERSONAL_NUMBER = int("506") - - MOTHER_PLACE_OF_BIRTH = int("507") - - FATHER_PLACE_OF_BIRTH = int("508") - - MOTHER_COUNTRY_OF_BIRTH = int("509") - - FATHER_COUNTRY_OF_BIRTH = int("510") - - DATE_FIRST_RENEWAL = int("511") - - DATE_SECOND_RENEWAL = int("512") - - PLACE_OF_EXAMINATION = int("513") - - APPLICATION_NUMBER = int("514") - - VOUCHER_NUMBER = int("515") - - AUTHORIZATION_NUMBER = int("516") - - FACULTY = int("517") - - FORM_OF_EDUCATION = int("518") - - DNI_NUMBER = int("519") - - RETIREMENT_NUMBER = int("520") - - PROFESSIONAL_ID_NUMBER = int("521") - - AGE_AT_ISSUE = int("522") - - YEARS_SINCE_ISSUE = int("523") - - DL_CLASS_CODE_BTP_FROM = int("524") - - DL_CLASS_CODE_BTP_NOTES = int("525") - - DL_CLASS_CODE_BTP_TO = int("526") - - DL_CLASS_CODE_C3_FROM = int("527") - - DL_CLASS_CODE_C3_NOTES = int("528") - - DL_CLASS_CODE_C3_TO = int("529") - - DL_CLASS_CODE_E_FROM = int("530") - - DL_CLASS_CODE_E_NOTES = int("531") - - DL_CLASS_CODE_E_TO = int("532") - - DL_CLASS_CODE_F_FROM = int("533") - - DL_CLASS_CODE_F_NOTES = int("534") - - DL_CLASS_CODE_F_TO = int("535") - - DL_CLASS_CODE_FA_FROM = int("536") - - DL_CLASS_CODE_FA_NOTES = int("537") - - DL_CLASS_CODE_FA_TO = int("538") - - DL_CLASS_CODE_FA1_FROM = int("539") - - DL_CLASS_CODE_FA1_NOTES = int("540") - - DL_CLASS_CODE_FA1_TO = int("541") - - DL_CLASS_CODE_FB_FROM = int("542") - - DL_CLASS_CODE_FB_NOTES = int("543") - - DL_CLASS_CODE_FB_TO = int("544") - - DL_CLASS_CODE_G1_FROM = int("545") - - DL_CLASS_CODE_G1_NOTES = int("546") - - DL_CLASS_CODE_G1_TO = int("547") - - DL_CLASS_CODE_H_FROM = int("548") - - DL_CLASS_CODE_H_NOTES = int("549") - - DL_CLASS_CODE_H_TO = int("550") - - DL_CLASS_CODE_I_FROM = int("551") - - DL_CLASS_CODE_I_NOTES = int("552") - - DL_CLASS_CODE_I_TO = int("553") - - DL_CLASS_CODE_K_FROM = int("554") - - DL_CLASS_CODE_K_NOTES = int("555") - - DL_CLASS_CODE_K_TO = int("556") - - DL_CLASS_CODE_LK_FROM = int("557") - - DL_CLASS_CODE_LK_NOTES = int("558") - - DL_CLASS_CODE_LK_TO = int("559") - - DL_CLASS_CODE_N_FROM = int("560") - - DL_CLASS_CODE_N_NOTES = int("561") - - DL_CLASS_CODE_N_TO = int("562") - - DL_CLASS_CODE_S_FROM = int("563") - - DL_CLASS_CODE_S_NOTES = int("564") - - DL_CLASS_CODE_S_TO = int("565") - - DL_CLASS_CODE_TB_FROM = int("566") - - DL_CLASS_CODE_TB_NOTES = int("567") - - DL_CLASS_CODE_TB_TO = int("568") - - DL_CLASS_CODE_TM_FROM = int("569") - - DL_CLASS_CODE_TM_NOTES = int("570") - - DL_CLASS_CODE_TM_TO = int("571") - - DL_CLASS_CODE_TR_FROM = int("572") - - DL_CLASS_CODE_TR_NOTES = int("573") - - DL_CLASS_CODE_TR_TO = int("574") - - DL_CLASS_CODE_TV_FROM = int("575") - - DL_CLASS_CODE_TV_NOTES = int("576") - - DL_CLASS_CODE_TV_TO = int("577") - - DL_CLASS_CODE_V_FROM = int("578") - - DL_CLASS_CODE_V_NOTES = int("579") - - DL_CLASS_CODE_V_TO = int("580") - - DL_CLASS_CODE_W_FROM = int("581") - - DL_CLASS_CODE_W_NOTES = int("582") - - DL_CLASS_CODE_W_TO = int("583") - - URL = int("584") - - CALIBER = int("585") - - MODEL = int("586") - - MAKE = int("587") - - NUMBER_OF_CYLINDERS = int("588") - - SURNAME_OF_HUSBAND_AFTER_REGISTRATION = int("589") - - SURNAME_OF_WIFE_AFTER_REGISTRATION = int("590") - - DATE_OF_BIRTH_OF_WIFE = int("591") - - DATE_OF_BIRTH_OF_HUSBAND = int("592") - - CITIZENSHIP_OF_FIRST_PERSON = int("593") - - CITIZENSHIP_OF_SECOND_PERSON = int("594") - - CVV = int("595") - - DATE_OF_INSURANCE_EXPIRY = int("596") - - MORTGAGE_BY = int("597") - - OLD_DOCUMENT_NUMBER = int("598") - - OLD_DATE_OF_ISSUE = int("599") - - OLD_PLACE_OF_ISSUE = int("600") - - DL_CLASS_CODE_LR_FROM = int("601") - - DL_CLASS_CODE_LR_TO = int("602") - - DL_CLASS_CODE_LR_NOTES = int("603") - - DL_CLASS_CODE_MR_FROM = int("604") - - DL_CLASS_CODE_MR_TO = int("605") - - DL_CLASS_CODE_MR_NOTES = int("606") - - DL_CLASS_CODE_HR_FROM = int("607") - - DL_CLASS_CODE_HR_TO = int("608") - - DL_CLASS_CODE_HR_NOTES = int("609") - - DL_CLASS_CODE_HC_FROM = int("610") - - DL_CLASS_CODE_HC_TO = int("611") - - DL_CLASS_CODE_HC_NOTES = int("612") - - DL_CLASS_CODE_MC_FROM = int("613") - - DL_CLASS_CODE_MC_TO = int("614") - - DL_CLASS_CODE_MC_NOTES = int("615") - - DL_CLASS_CODE_RE_FROM = int("616") - - DL_CLASS_CODE_RE_TO = int("617") - - DL_CLASS_CODE_RE_NOTES = int("618") - - DL_CLASS_CODE_R_FROM = int("619") - - DL_CLASS_CODE_R_TO = int("620") - - DL_CLASS_CODE_R_NOTES = int("621") - - DL_CLASS_CODE_CA_FROM = int("622") - - DL_CLASS_CODE_CA_TO = int("623") - - DL_CLASS_CODE_CA_NOTES = int("624") - - CITIZENSHIP_STATUS = int("625") - - MILITARY_SERVICE_FROM = int("626") - - MILITARY_SERVICE_TO = int("627") - - DL_CLASS_CODE_NT_FROM = int("628") - - DL_CLASS_CODE_NT_TO = int("629") - - DL_CLASS_CODE_NT_NOTES = int("630") - - DL_CLASS_CODE_TN_FROM = int("631") - - DL_CLASS_CODE_TN_TO = int("632") - - DL_CLASS_CODE_TN_NOTES = int("633") - - DL_CLASS_CODE_D3_FROM = int("634") - - DL_CLASS_CODE_D3_TO = int("635") - - DL_CLASS_CODE_D3_NOTES = int("636") - - ALT_DATE_OF_EXPIRY = int("637") - - DL_CLASS_CODE_CD_FROM = int("638") - - DL_CLASS_CODE_CD_TO = int("639") - - DL_CLASS_CODE_CD_NOTES = int("640") - - ISSUER_IDENTIFICATION_NUMBER = int("641") - - PAYMENT_PERIOD_FROM = int("642") - - PAYMENT_PERIOD_TO = int("643") - - VACCINATION_CERTIFICATE_IDENTIFIER = int("644") - - FIRST_NAME = int("645") - - DATE_OF_ARRIVAL = int("646") - - SECOND_NAME = int("647") - - THIRD_NAME = int("648") - - FOURTH_NAME = int("649") - - LAST_NAME = int("650") - - DL_CLASS_CODE_RM_FROM = int("651") - - DL_CLASS_CODE_RM_NOTES = int("652") - - DL_CLASS_CODE_RM_TO = int("653") - - DL_CLASS_CODE_PW_FROM = int("654") - - DL_CLASS_CODE_PW_NOTES = int("655") - - DL_CLASS_CODE_PW_TO = int("656") - - DL_CLASS_CODE_EB_FROM = int("657") - - DL_CLASS_CODE_EB_NOTES = int("658") - - DL_CLASS_CODE_EB_TO = int("659") - - DL_CLASS_CODE_EC_FROM = int("660") - - DL_CLASS_CODE_EC_NOTES = int("661") - - DL_CLASS_CODE_EC_TO = int("662") - - DL_CLASS_CODE_EC1_FROM = int("663") - - DL_CLASS_CODE_EC1_NOTES = int("664") - - DL_CLASS_CODE_EC1_TO = int("665") - - PLACE_OF_BIRTH_CITY = int("666") - - YEAR_OF_BIRTH = int("667") - - YEAR_OF_EXPIRY = int("668") - - GRANDFATHER_NAME_MATERNAL = int("669") - - FIRST_SURNAME = int("670") - - MONTH_OF_BIRTH = int("671") - - ADDRESS_FLOOR_NUMBER = int("672") - - ADDRESS_ENTRANCE = int("673") - - ADDRESS_BLOCK_NUMBER = int("674") - - ADDRESS_STREET_NUMBER = int("675") - - ADDRESS_STREET_TYPE = int("676") - - ADDRESS_CITY_SECTOR = int("677") - - ADDRESS_COUNTY_TYPE = int("678") - - ADDRESS_CITY_TYPE = int("679") - - ADDRESS_BUILDING_TYPE = int("680") - - DATE_OF_RETIREMENT = int("681") - - DOCUMENT_STATUS = int("682") - - SIGNATURE = int("683") - - FT_UNIQUE_CERTIFICATE_IDENTIFIER = int("684") - - FT_EMAIL = int("685") - - FT_DATE_OF_SPECIMEN_COLLECTION = int("686") - - FT_TYPE_OF_TESTING = int("687") - - FT_RESULT_OF_TESTING = int("688") - - FT_METHOD_OF_TESTING = int("689") - - FT_DIGITAL_TRAVEL_AUTHORIZATION_NUMBER = int("690") - - FT_DATE_OF_FIRST_POSITIVE_TEST_RESULT = int("691") - - EF_CARD_ACCESS = int("692") - - SHORT_FLIGHT_NUMBER = int("693") - - AIRLINE_CODE = int("694") - - allowable_values = [DOCUMENT_CLASS_CODE, ISSUING_STATE_CODE, DOCUMENT_NUMBER, DATE_OF_EXPIRY, DATE_OF_ISSUE, DATE_OF_BIRTH, PLACE_OF_BIRTH, PERSONAL_NUMBER, SURNAME, GIVEN_NAMES, MOTHERS_NAME, NATIONALITY, SEX, HEIGHT, WEIGHT, EYES_COLOR, HAIR_COLOR, ADDRESS, DONOR, SOCIAL_SECURITY_NUMBER, DL_CLASS, DL_ENDORSED, DL_RESTRICTION_CODE, DL_UNDER_21_DATE, AUTHORITY, SURNAME_AND_GIVEN_NAMES, NATIONALITY_CODE, PASSPORT_NUMBER, INVITATION_NUMBER, VISA_ID, VISA_CLASS, VISA_SUBCLASS, MRZ_TYPE, OPTIONAL_DATA, DOCUMENT_CLASS_NAME, ISSUING_STATE_NAME, PLACE_OF_ISSUE, DOCUMENT_NUMBER_CHECKSUM, DATE_OF_BIRTH_CHECKSUM, DATE_OF_EXPIRY_CHECKSUM, PERSONAL_NUMBER_CHECKSUM, FINAL_CHECKSUM, PASSPORT_NUMBER_CHECKSUM, INVITATION_NUMBER_CHECKSUM, VISA_ID_CHECKSUM, SURNAME_AND_GIVEN_NAMES_CHECKSUM, VISA_VALID_UNTIL_CHECKSUM, OTHER, MRZ_STRINGS, NAME_SUFFIX, NAME_PREFIX, DATE_OF_ISSUE_CHECKSUM, DATE_OF_ISSUE_CHECK_DIGIT, DOCUMENT_SERIES, REG_CERT_REG_NUMBER, REG_CERT_CAR_MODEL, REG_CERT_CAR_COLOR, REG_CERT_BODY_NUMBER, REG_CERT_CAR_TYPE, REG_CERT_MAX_WEIGHT, REG_CERT_WEIGHT, ADDRESS_AREA, ADDRESS_STATE, ADDRESS_BUILDING, ADDRESS_HOUSE, ADDRESS_FLAT, PLACE_OF_REGISTRATION, DATE_OF_REGISTRATION, RESIDENT_FROM, RESIDENT_UNTIL, AUTHORITY_CODE, PLACE_OF_BIRTH_AREA, PLACE_OF_BIRTH_STATE_CODE, ADDRESS_STREET, ADDRESS_CITY, ADDRESS_JURISDICTION_CODE, ADDRESS_POSTAL_CODE, DOCUMENT_NUMBER_CHECK_DIGIT, DATE_OF_BIRTH_CHECK_DIGIT, DATE_OF_EXPIRY_CHECK_DIGIT, PERSONAL_NUMBER_CHECK_DIGIT, FINAL_CHECK_DIGIT, PASSPORT_NUMBER_CHECK_DIGIT, INVITATION_NUMBER_CHECK_DIGIT, VISA_ID_CHECK_DIGIT, SURNAME_AND_GIVEN_NAMES_CHECK_DIGIT, VISA_VALID_UNTIL_CHECK_DIGIT, PERMIT_DL_CLASS, PERMIT_DATE_OF_EXPIRY, PERMIT_IDENTIFIER, PERMIT_DATE_OF_ISSUE, PERMIT_RESTRICTION_CODE, PERMIT_ENDORSED, ISSUE_TIMESTAMP, NUMBER_OF_DUPLICATES, MEDICAL_INDICATOR_CODES, NON_RESIDENT_INDICATOR, VISA_TYPE, VISA_VALID_FROM, VISA_VALID_UNTIL, DURATION_OF_STAY, NUMBER_OF_ENTRIES, DAY, MONTH, YEAR, UNIQUE_CUSTOMER_IDENTIFIER, COMMERCIAL_VEHICLE_CODES, AKA_DATE_OF_BIRTH, AKA_SOCIAL_SECURITY_NUMBER, AKA_SURNAME, AKA_GIVEN_NAMES, AKA_NAME_SUFFIX, AKA_NAME_PREFIX, MAILING_ADDRESS_STREET, MAILING_ADDRESS_CITY, MAILING_ADDRESS_JURISDICTION_CODE, MAILING_ADDRESS_POSTAL_CODE, AUDIT_INFORMATION, INVENTORY_NUMBER, RACE_ETHNICITY, JURISDICTION_VEHICLE_CLASS, JURISDICTION_ENDORSEMENT_CODE, JURISDICTION_RESTRICTION_CODE, FAMILY_NAME, GIVEN_NAMES_RUS, VISA_ID_RUS, FATHERS_NAME, FATHERS_NAME_RUS, SURNAME_AND_GIVEN_NAMES_RUS, PLACE_OF_BIRTH_RUS, AUTHORITY_RUS, ISSUING_STATE_CODE_NUMERIC, NATIONALITY_CODE_NUMERIC, ENGINE_POWER, ENGINE_VOLUME, CHASSIS_NUMBER, ENGINE_NUMBER, ENGINE_MODEL, VEHICLE_CATEGORY, IDENTITY_CARD_NUMBER, CONTROL_NUMBER, PARENTS_GIVEN_NAMES, SECOND_SURNAME, MIDDLE_NAME, REG_CERT_VIN, REG_CERT_VIN_CHECK_DIGIT, REG_CERT_VIN_CHECKSUM, LINE_1_CHECK_DIGIT, LINE_2_CHECK_DIGIT, LINE_3_CHECK_DIGIT, LINE_1_CHECKSUM, LINE_2_CHECKSUM, LINE_3_CHECKSUM, REG_CERT_REG_NUMBER_CHECK_DIGIT, REG_CERT_REG_NUMBER_CHECKSUM, REG_CERT_VEHICLE_ITS_CODE, CARD_ACCESS_NUMBER, MARITAL_STATUS, COMPANY_NAME, SPECIAL_NOTES, SURNAME_OF_SPOUSE, TRACKING_NUMBER, BOOKLET_NUMBER, CHILDREN, COPY, SERIAL_NUMBER, DOSSIER_NUMBER, AKA_SURNAME_AND_GIVEN_NAMES, TERRITORIAL_VALIDITY, MRZ_STRINGS_WITH_CORRECT_CHECK_SUMS, DL_CDL_RESTRICTION_CODE, DL_UNDER_18_DATE, DL_RECORD_CREATED, DL_DUPLICATE_DATE, DL_ISSUE_TYPE, MILITARY_BOOK_NUMBER, DESTINATION, BLOOD_GROUP, SEQUENCE_NUMBER, REG_CERT_BODY_TYPE, REG_CERT_CAR_MARK, TRANSACTION_NUMBER, AGE, FOLIO_NUMBER, VOTER_KEY, ADDRESS_MUNICIPALITY, ADDRESS_LOCATION, SECTION, OCR_NUMBER, FEDERAL_ELECTIONS, REFERENCE_NUMBER, OPTIONAL_DATA_CHECKSUM, OPTIONAL_DATA_CHECK_DIGIT, VISA_NUMBER, VISA_NUMBER_CHECKSUM, VISA_NUMBER_CHECK_DIGIT, VOTER, PREVIOUS_TYPE, FIELD_FROM_MRZ, CURRENT_DATE, STATUS_DATE_OF_EXPIRY, BANKNOTE_NUMBER, CSC_CODE, ARTISTIC_NAME, ACADEMIC_TITLE, ADDRESS_COUNTRY, ADDRESS_ZIP_CODE, E_ID_RESIDENCE_PERMIT_1, E_ID_RESIDENCE_PERMIT_2, E_ID_PLACE_OF_BIRTH_STREET, E_ID_PLACE_OF_BIRTH_CITY, E_ID_PLACE_OF_BIRTH_STATE, E_ID_PLACE_OF_BIRTH_COUNTRY, E_ID_PLACE_OF_BIRTH_ZIP_CODE, CDL_CLASS, DL_UNDER_19_DATE, WEIGHT_POUNDS, LIMITED_DURATION_DOCUMENT_INDICATOR, ENDORSEMENT_EXPIRATION_DATE, REVISION_DATE, COMPLIANCE_TYPE, FAMILY_NAME_TRUNCATION, FIRST_NAME_TRUNCATION, MIDDLE_NAME_TRUNCATION, EXAM_DATE, ORGANIZATION, DEPARTMENT, PAY_GRADE, RANK, BENEFITS_NUMBER, SPONSOR_SERVICE, SPONSOR_STATUS, SPONSOR, RELATIONSHIP, USCIS, CATEGORY, CONDITIONS, IDENTIFIER, CONFIGURATION, DISCRETIONARY_DATA, LINE_1_OPTIONAL_DATA, LINE_2_OPTIONAL_DATA, LINE_3_OPTIONAL_DATA, EQV_CODE, ALT_CODE, BINARY_CODE, PSEUDO_CODE, FEE, STAMP_NUMBER, SBH_SECURITY_OPTIONS, SBH_INTEGRITY_OPTIONS, DATE_OF_CREATION, VALIDITY_PERIOD, PATRON_HEADER_VERSION, BDB_TYPE, BIOMETRIC_TYPE, BIOMETRIC_SUBTYPE, BIOMETRIC_PRODUCT_ID, BIOMETRIC_FORMAT_OWNER, BIOMETRIC_FORMAT_TYPE, PHONE, PROFESSION, TITLE, PERSONAL_SUMMARY, OTHER_VALID_ID, CUSTODY_INFO, OTHER_NAME, OBSERVATIONS, TAX, DATE_OF_PERSONALIZATION, PERSONALIZATION_SN, OTHER_PERSON_NAME, PERSON_TO_NOTIFY_DATE_OF_RECORD, PERSON_TO_NOTIFY_NAME, PERSON_TO_NOTIFY_PHONE, PERSON_TO_NOTIFY_ADDRESS, DS_CERTIFICATE_ISSUER, DS_CERTIFICATE_SUBJECT, DS_CERTIFICATE_VALID_FROM, DS_CERTIFICATE_VALID_TO, VRC_DATA_OBJECT_ENTRY, TYPE_APPROVAL_NUMBER, ADMINISTRATIVE_NUMBER, DOCUMENT_DISCRIMINATOR, DATA_DISCRIMINATOR, ISO_ISSUER_ID_NUMBER, DTC_VERSION, DTC_ID, DTC_DATE_OF_EXPIRY, GNIB_NUMBER, DEPT_NUMBER, TELEX_CODE, ALLERGIES, SP_CODE, COURT_CODE, CTY, SPONSOR_SSN, DOD_NUMBER, MC_NOVICE_DATE, DUF_NUMBER, AGY, PNR_CODE, FROM_AIRPORT_CODE, TO_AIRPORT_CODE, FLIGHT_NUMBER, DATE_OF_FLIGHT, SEAT_NUMBER, DATE_OF_ISSUE_BOARDING_PASS, CCW_UNTIL, REFERENCE_NUMBER_CHECKSUM, REFERENCE_NUMBER_CHECK_DIGIT, ROOM_NUMBER, RELIGION, REMAINDER_TERM, ELECTRONIC_TICKET_INDICATOR, COMPARTMENT_CODE, CHECK_IN_SEQUENCE_NUMBER, AIRLINE_DESIGNATOR_OF_BOARDING_PASS_ISSUER, AIRLINE_NUMERIC_CODE, TICKET_NUMBER, FREQUENT_FLYER_AIRLINE_DESIGNATOR, FREQUENT_FLYER_NUMBER, FREE_BAGGAGE_ALLOWANCE, PDF417_CODEC, IDENTITY_CARD_NUMBER_CHECKSUM, IDENTITY_CARD_NUMBER_CHECK_DIGIT, VETERAN, DL_CLASS_CODE_A1_FROM, DL_CLASS_CODE_A1_TO, DL_CLASS_CODE_A1_NOTES, DL_CLASS_CODE_A_FROM, DL_CLASS_CODE_A_TO, DL_CLASS_CODE_A_NOTES, DL_CLASS_CODE_B_FROM, DL_CLASS_CODE_B_TO, DL_CLASS_CODE_B_NOTES, DL_CLASS_CODE_C1_FROM, DL_CLASS_CODE_C1_TO, DL_CLASS_CODE_C1_NOTES, DL_CLASS_CODE_C_FROM, DL_CLASS_CODE_C_TO, DL_CLASS_CODE_C_NOTES, DL_CLASS_CODE_D1_FROM, DL_CLASS_CODE_D1_TO, DL_CLASS_CODE_D1_NOTES, DL_CLASS_CODE_D_FROM, DL_CLASS_CODE_D_TO, DL_CLASS_CODE_D_NOTES, DL_CLASS_CODE_BE_FROM, DL_CLASS_CODE_BE_TO, DL_CLASS_CODE_BE_NOTES, DL_CLASS_CODE_C1E_FROM, DL_CLASS_CODE_C1E_TO, DL_CLASS_CODE_C1E_NOTES, DL_CLASS_CODE_CE_FROM, DL_CLASS_CODE_CE_TO, DL_CLASS_CODE_CE_NOTES, DL_CLASS_CODE_D1E_FROM, DL_CLASS_CODE_D1E_TO, DL_CLASS_CODE_D1E_NOTES, DL_CLASS_CODE_DE_FROM, DL_CLASS_CODE_DE_TO, DL_CLASS_CODE_DE_NOTES, DL_CLASS_CODE_M_FROM, DL_CLASS_CODE_M_TO, DL_CLASS_CODE_M_NOTES, DL_CLASS_CODE_L_FROM, DL_CLASS_CODE_L_TO, DL_CLASS_CODE_L_NOTES, DL_CLASS_CODE_T_FROM, DL_CLASS_CODE_T_TO, DL_CLASS_CODE_T_NOTES, DL_CLASS_CODE_AM_FROM, DL_CLASS_CODE_AM_TO, DL_CLASS_CODE_AM_NOTES, DL_CLASS_CODE_A2_FROM, DL_CLASS_CODE_A2_TO, DL_CLASS_CODE_A2_NOTES, DL_CLASS_CODE_B1_FROM, DL_CLASS_CODE_B1_TO, DL_CLASS_CODE_B1_NOTES, SURNAME_AT_BIRTH, CIVIL_STATUS, NUMBER_OF_SEATS, NUMBER_OF_STANDING_PLACES, MAX_SPEED, FUEL_TYPE, EC_ENVIRONMENTAL_TYPE, POWER_WEIGHT_RATIO, MAX_MASS_OF_TRAILER_BRAKED, MAX_MASS_OF_TRAILER_UNBRAKED, TRANSMISSION_TYPE, TRAILER_HITCH, ACCOMPANIED_BY, POLICE_DISTRICT, FIRST_ISSUE_DATE, PAYLOAD_CAPACITY, NUMBER_OF_AXLES, PERMISSIBLE_AXLE_LOAD, PRECINCT, INVITED_BY, PURPOSE_OF_ENTRY, SKIN_COLOR, COMPLEXION, AIRPORT_FROM, AIRPORT_TO, AIRLINE_NAME, AIRLINE_NAME_FREQUENT_FLYER, LICENSE_NUMBER, IN_TANKS, EXCEPT_IN_TANKS, FAST_TRACK, OWNER, MRZ_STRINGS_ICAO_RFID, NUMBER_OF_CARD_ISSUANCE, NUMBER_OF_CARD_ISSUANCE_CHECKSUM, NUMBER_OF_CARD_ISSUANCE_CHECK_DIGIT, CENTURY_DATE_OF_BIRTH, DL_CLASS_CODE_A3_FROM, DL_CLASS_CODE_A3_TO, DL_CLASS_CODE_A3_NOTES, DL_CLASS_CODE_C2_FROM, DL_CLASS_CODE_C2_TO, DL_CLASS_CODE_C2_NOTES, DL_CLASS_CODE_B2_FROM, DL_CLASS_CODE_B2_TO, DL_CLASS_CODE_B2_NOTES, DL_CLASS_CODE_D2_FROM, DL_CLASS_CODE_D2_TO, DL_CLASS_CODE_D2_NOTES, DL_CLASS_CODE_B2E_FROM, DL_CLASS_CODE_B2E_TO, DL_CLASS_CODE_B2E_NOTES, DL_CLASS_CODE_G_FROM, DL_CLASS_CODE_G_TO, DL_CLASS_CODE_G_NOTES, DL_CLASS_CODE_J_FROM, DL_CLASS_CODE_J_TO, DL_CLASS_CODE_J_NOTES, DL_CLASS_CODE_LC_FROM, DL_CLASS_CODE_LC_TO, DL_CLASS_CODE_LC_NOTES, BANK_CARD_NUMBER, BANK_CARD_VALID_THRU, TAX_NUMBER, HEALTH_NUMBER, GRANDFATHER_NAME, SELECTEE_INDICATOR, MOTHER_SURNAME, MOTHER_GIVEN_NAME, FATHER_SURNAME, FATHER_GIVEN_NAME, MOTHER_DATE_OF_BIRTH, FATHER_DATE_OF_BIRTH, MOTHER_PERSONAL_NUMBER, FATHER_PERSONAL_NUMBER, MOTHER_PLACE_OF_BIRTH, FATHER_PLACE_OF_BIRTH, MOTHER_COUNTRY_OF_BIRTH, FATHER_COUNTRY_OF_BIRTH, DATE_FIRST_RENEWAL, DATE_SECOND_RENEWAL, PLACE_OF_EXAMINATION, APPLICATION_NUMBER, VOUCHER_NUMBER, AUTHORIZATION_NUMBER, FACULTY, FORM_OF_EDUCATION, DNI_NUMBER, RETIREMENT_NUMBER, PROFESSIONAL_ID_NUMBER, AGE_AT_ISSUE, YEARS_SINCE_ISSUE, DL_CLASS_CODE_BTP_FROM, DL_CLASS_CODE_BTP_NOTES, DL_CLASS_CODE_BTP_TO, DL_CLASS_CODE_C3_FROM, DL_CLASS_CODE_C3_NOTES, DL_CLASS_CODE_C3_TO, DL_CLASS_CODE_E_FROM, DL_CLASS_CODE_E_NOTES, DL_CLASS_CODE_E_TO, DL_CLASS_CODE_F_FROM, DL_CLASS_CODE_F_NOTES, DL_CLASS_CODE_F_TO, DL_CLASS_CODE_FA_FROM, DL_CLASS_CODE_FA_NOTES, DL_CLASS_CODE_FA_TO, DL_CLASS_CODE_FA1_FROM, DL_CLASS_CODE_FA1_NOTES, DL_CLASS_CODE_FA1_TO, DL_CLASS_CODE_FB_FROM, DL_CLASS_CODE_FB_NOTES, DL_CLASS_CODE_FB_TO, DL_CLASS_CODE_G1_FROM, DL_CLASS_CODE_G1_NOTES, DL_CLASS_CODE_G1_TO, DL_CLASS_CODE_H_FROM, DL_CLASS_CODE_H_NOTES, DL_CLASS_CODE_H_TO, DL_CLASS_CODE_I_FROM, DL_CLASS_CODE_I_NOTES, DL_CLASS_CODE_I_TO, DL_CLASS_CODE_K_FROM, DL_CLASS_CODE_K_NOTES, DL_CLASS_CODE_K_TO, DL_CLASS_CODE_LK_FROM, DL_CLASS_CODE_LK_NOTES, DL_CLASS_CODE_LK_TO, DL_CLASS_CODE_N_FROM, DL_CLASS_CODE_N_NOTES, DL_CLASS_CODE_N_TO, DL_CLASS_CODE_S_FROM, DL_CLASS_CODE_S_NOTES, DL_CLASS_CODE_S_TO, DL_CLASS_CODE_TB_FROM, DL_CLASS_CODE_TB_NOTES, DL_CLASS_CODE_TB_TO, DL_CLASS_CODE_TM_FROM, DL_CLASS_CODE_TM_NOTES, DL_CLASS_CODE_TM_TO, DL_CLASS_CODE_TR_FROM, DL_CLASS_CODE_TR_NOTES, DL_CLASS_CODE_TR_TO, DL_CLASS_CODE_TV_FROM, DL_CLASS_CODE_TV_NOTES, DL_CLASS_CODE_TV_TO, DL_CLASS_CODE_V_FROM, DL_CLASS_CODE_V_NOTES, DL_CLASS_CODE_V_TO, DL_CLASS_CODE_W_FROM, DL_CLASS_CODE_W_NOTES, DL_CLASS_CODE_W_TO, URL, CALIBER, MODEL, MAKE, NUMBER_OF_CYLINDERS, SURNAME_OF_HUSBAND_AFTER_REGISTRATION, SURNAME_OF_WIFE_AFTER_REGISTRATION, DATE_OF_BIRTH_OF_WIFE, DATE_OF_BIRTH_OF_HUSBAND, CITIZENSHIP_OF_FIRST_PERSON, CITIZENSHIP_OF_SECOND_PERSON, CVV, DATE_OF_INSURANCE_EXPIRY, MORTGAGE_BY, OLD_DOCUMENT_NUMBER, OLD_DATE_OF_ISSUE, OLD_PLACE_OF_ISSUE, DL_CLASS_CODE_LR_FROM, DL_CLASS_CODE_LR_TO, DL_CLASS_CODE_LR_NOTES, DL_CLASS_CODE_MR_FROM, DL_CLASS_CODE_MR_TO, DL_CLASS_CODE_MR_NOTES, DL_CLASS_CODE_HR_FROM, DL_CLASS_CODE_HR_TO, DL_CLASS_CODE_HR_NOTES, DL_CLASS_CODE_HC_FROM, DL_CLASS_CODE_HC_TO, DL_CLASS_CODE_HC_NOTES, DL_CLASS_CODE_MC_FROM, DL_CLASS_CODE_MC_TO, DL_CLASS_CODE_MC_NOTES, DL_CLASS_CODE_RE_FROM, DL_CLASS_CODE_RE_TO, DL_CLASS_CODE_RE_NOTES, DL_CLASS_CODE_R_FROM, DL_CLASS_CODE_R_TO, DL_CLASS_CODE_R_NOTES, DL_CLASS_CODE_CA_FROM, DL_CLASS_CODE_CA_TO, DL_CLASS_CODE_CA_NOTES, CITIZENSHIP_STATUS, MILITARY_SERVICE_FROM, MILITARY_SERVICE_TO, DL_CLASS_CODE_NT_FROM, DL_CLASS_CODE_NT_TO, DL_CLASS_CODE_NT_NOTES, DL_CLASS_CODE_TN_FROM, DL_CLASS_CODE_TN_TO, DL_CLASS_CODE_TN_NOTES, DL_CLASS_CODE_D3_FROM, DL_CLASS_CODE_D3_TO, DL_CLASS_CODE_D3_NOTES, ALT_DATE_OF_EXPIRY, DL_CLASS_CODE_CD_FROM, DL_CLASS_CODE_CD_TO, DL_CLASS_CODE_CD_NOTES, ISSUER_IDENTIFICATION_NUMBER, PAYMENT_PERIOD_FROM, PAYMENT_PERIOD_TO, VACCINATION_CERTIFICATE_IDENTIFIER, FIRST_NAME, DATE_OF_ARRIVAL, SECOND_NAME, THIRD_NAME, FOURTH_NAME, LAST_NAME, DL_CLASS_CODE_RM_FROM, DL_CLASS_CODE_RM_NOTES, DL_CLASS_CODE_RM_TO, DL_CLASS_CODE_PW_FROM, DL_CLASS_CODE_PW_NOTES, DL_CLASS_CODE_PW_TO, DL_CLASS_CODE_EB_FROM, DL_CLASS_CODE_EB_NOTES, DL_CLASS_CODE_EB_TO, DL_CLASS_CODE_EC_FROM, DL_CLASS_CODE_EC_NOTES, DL_CLASS_CODE_EC_TO, DL_CLASS_CODE_EC1_FROM, DL_CLASS_CODE_EC1_NOTES, DL_CLASS_CODE_EC1_TO, PLACE_OF_BIRTH_CITY, YEAR_OF_BIRTH, YEAR_OF_EXPIRY, GRANDFATHER_NAME_MATERNAL, FIRST_SURNAME, MONTH_OF_BIRTH, ADDRESS_FLOOR_NUMBER, ADDRESS_ENTRANCE, ADDRESS_BLOCK_NUMBER, ADDRESS_STREET_NUMBER, ADDRESS_STREET_TYPE, ADDRESS_CITY_SECTOR, ADDRESS_COUNTY_TYPE, ADDRESS_CITY_TYPE, ADDRESS_BUILDING_TYPE, DATE_OF_RETIREMENT, DOCUMENT_STATUS, SIGNATURE, FT_UNIQUE_CERTIFICATE_IDENTIFIER, FT_EMAIL, FT_DATE_OF_SPECIMEN_COLLECTION, FT_TYPE_OF_TESTING, FT_RESULT_OF_TESTING, FT_METHOD_OF_TESTING, FT_DIGITAL_TRAVEL_AUTHORIZATION_NUMBER, FT_DATE_OF_FIRST_POSITIVE_TEST_RESULT, EF_CARD_ACCESS, SHORT_FLIGHT_NUMBER, AIRLINE_CODE] # noqa: E501 +class TextFieldType(int, Enum): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + TextFieldType """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """TextFieldType - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextFieldType): - return False - - return self.to_dict() == other.to_dict() + """ + allowed enum values + """ + DOCUMENT_CLASS_CODE = 0 + ISSUING_STATE_CODE = 1 + DOCUMENT_NUMBER = 2 + DATE_OF_EXPIRY = 3 + DATE_OF_ISSUE = 4 + DATE_OF_BIRTH = 5 + PLACE_OF_BIRTH = 6 + PERSONAL_NUMBER = 7 + SURNAME = 8 + GIVEN_NAMES = 9 + MOTHERS_NAME = 10 + NATIONALITY = 11 + SEX = 12 + HEIGHT = 13 + WEIGHT = 14 + EYES_COLOR = 15 + HAIR_COLOR = 16 + ADDRESS = 17 + DONOR = 18 + SOCIAL_SECURITY_NUMBER = 19 + DL_CLASS = 20 + DL_ENDORSED = 21 + DL_RESTRICTION_CODE = 22 + DL_UNDER_21_DATE = 23 + AUTHORITY = 24 + SURNAME_AND_GIVEN_NAMES = 25 + NATIONALITY_CODE = 26 + PASSPORT_NUMBER = 27 + INVITATION_NUMBER = 28 + VISA_ID = 29 + VISA_CLASS = 30 + VISA_SUBCLASS = 31 + MRZ_TYPE = 35 + OPTIONAL_DATA = 36 + DOCUMENT_CLASS_NAME = 37 + ISSUING_STATE_NAME = 38 + PLACE_OF_ISSUE = 39 + DOCUMENT_NUMBER_CHECKSUM = 40 + DATE_OF_BIRTH_CHECKSUM = 41 + DATE_OF_EXPIRY_CHECKSUM = 42 + PERSONAL_NUMBER_CHECKSUM = 43 + FINAL_CHECKSUM = 44 + PASSPORT_NUMBER_CHECKSUM = 45 + INVITATION_NUMBER_CHECKSUM = 46 + VISA_ID_CHECKSUM = 47 + SURNAME_AND_GIVEN_NAMES_CHECKSUM = 48 + VISA_VALID_UNTIL_CHECKSUM = 49 + OTHER = 50 + MRZ_STRINGS = 51 + NAME_SUFFIX = 52 + NAME_PREFIX = 53 + DATE_OF_ISSUE_CHECKSUM = 54 + DATE_OF_ISSUE_CHECK_DIGIT = 55 + DOCUMENT_SERIES = 56 + REG_CERT_REG_NUMBER = 57 + REG_CERT_CAR_MODEL = 58 + REG_CERT_CAR_COLOR = 59 + REG_CERT_BODY_NUMBER = 60 + REG_CERT_CAR_TYPE = 61 + REG_CERT_MAX_WEIGHT = 62 + REG_CERT_WEIGHT = 63 + ADDRESS_AREA = 64 + ADDRESS_STATE = 65 + ADDRESS_BUILDING = 66 + ADDRESS_HOUSE = 67 + ADDRESS_FLAT = 68 + PLACE_OF_REGISTRATION = 69 + DATE_OF_REGISTRATION = 70 + RESIDENT_FROM = 71 + RESIDENT_UNTIL = 72 + AUTHORITY_CODE = 73 + PLACE_OF_BIRTH_AREA = 74 + PLACE_OF_BIRTH_STATE_CODE = 75 + ADDRESS_STREET = 76 + ADDRESS_CITY = 77 + ADDRESS_JURISDICTION_CODE = 78 + ADDRESS_POSTAL_CODE = 79 + DOCUMENT_NUMBER_CHECK_DIGIT = 80 + DATE_OF_BIRTH_CHECK_DIGIT = 81 + DATE_OF_EXPIRY_CHECK_DIGIT = 82 + PERSONAL_NUMBER_CHECK_DIGIT = 83 + FINAL_CHECK_DIGIT = 84 + PASSPORT_NUMBER_CHECK_DIGIT = 85 + INVITATION_NUMBER_CHECK_DIGIT = 86 + VISA_ID_CHECK_DIGIT = 87 + SURNAME_AND_GIVEN_NAMES_CHECK_DIGIT = 88 + VISA_VALID_UNTIL_CHECK_DIGIT = 89 + PERMIT_DL_CLASS = 90 + PERMIT_DATE_OF_EXPIRY = 91 + PERMIT_IDENTIFIER = 92 + PERMIT_DATE_OF_ISSUE = 93 + PERMIT_RESTRICTION_CODE = 94 + PERMIT_ENDORSED = 95 + ISSUE_TIMESTAMP = 96 + NUMBER_OF_DUPLICATES = 97 + MEDICAL_INDICATOR_CODES = 98 + NON_RESIDENT_INDICATOR = 99 + VISA_TYPE = 100 + VISA_VALID_FROM = 101 + VISA_VALID_UNTIL = 102 + DURATION_OF_STAY = 103 + NUMBER_OF_ENTRIES = 104 + DAY = 105 + MONTH = 106 + YEAR = 107 + UNIQUE_CUSTOMER_IDENTIFIER = 108 + COMMERCIAL_VEHICLE_CODES = 109 + AKA_DATE_OF_BIRTH = 110 + AKA_SOCIAL_SECURITY_NUMBER = 111 + AKA_SURNAME = 112 + AKA_GIVEN_NAMES = 113 + AKA_NAME_SUFFIX = 114 + AKA_NAME_PREFIX = 115 + MAILING_ADDRESS_STREET = 116 + MAILING_ADDRESS_CITY = 117 + MAILING_ADDRESS_JURISDICTION_CODE = 118 + MAILING_ADDRESS_POSTAL_CODE = 119 + AUDIT_INFORMATION = 120 + INVENTORY_NUMBER = 121 + RACE_ETHNICITY = 122 + JURISDICTION_VEHICLE_CLASS = 123 + JURISDICTION_ENDORSEMENT_CODE = 124 + JURISDICTION_RESTRICTION_CODE = 125 + FAMILY_NAME = 126 + GIVEN_NAMES_RUS = 127 + VISA_ID_RUS = 128 + FATHERS_NAME = 129 + FATHERS_NAME_RUS = 130 + SURNAME_AND_GIVEN_NAMES_RUS = 131 + PLACE_OF_BIRTH_RUS = 132 + AUTHORITY_RUS = 133 + ISSUING_STATE_CODE_NUMERIC = 134 + NATIONALITY_CODE_NUMERIC = 135 + ENGINE_POWER = 136 + ENGINE_VOLUME = 137 + CHASSIS_NUMBER = 138 + ENGINE_NUMBER = 139 + ENGINE_MODEL = 140 + VEHICLE_CATEGORY = 141 + IDENTITY_CARD_NUMBER = 142 + CONTROL_NUMBER = 143 + PARENTS_GIVEN_NAMES = 144 + SECOND_SURNAME = 145 + MIDDLE_NAME = 146 + REG_CERT_VIN = 147 + REG_CERT_VIN_CHECK_DIGIT = 148 + REG_CERT_VIN_CHECKSUM = 149 + LINE_1_CHECK_DIGIT = 150 + LINE_2_CHECK_DIGIT = 151 + LINE_3_CHECK_DIGIT = 152 + LINE_1_CHECKSUM = 153 + LINE_2_CHECKSUM = 154 + LINE_3_CHECKSUM = 155 + REG_CERT_REG_NUMBER_CHECK_DIGIT = 156 + REG_CERT_REG_NUMBER_CHECKSUM = 157 + REG_CERT_VEHICLE_ITS_CODE = 158 + CARD_ACCESS_NUMBER = 159 + MARITAL_STATUS = 160 + COMPANY_NAME = 161 + SPECIAL_NOTES = 162 + SURNAME_OF_SPOUSE = 163 + TRACKING_NUMBER = 164 + BOOKLET_NUMBER = 165 + CHILDREN = 166 + COPY = 167 + SERIAL_NUMBER = 168 + DOSSIER_NUMBER = 169 + AKA_SURNAME_AND_GIVEN_NAMES = 170 + TERRITORIAL_VALIDITY = 171 + MRZ_STRINGS_WITH_CORRECT_CHECK_SUMS = 172 + DL_CDL_RESTRICTION_CODE = 173 + DL_UNDER_18_DATE = 174 + DL_RECORD_CREATED = 175 + DL_DUPLICATE_DATE = 176 + DL_ISSUE_TYPE = 177 + MILITARY_BOOK_NUMBER = 178 + DESTINATION = 179 + BLOOD_GROUP = 180 + SEQUENCE_NUMBER = 181 + REG_CERT_BODY_TYPE = 182 + REG_CERT_CAR_MARK = 183 + TRANSACTION_NUMBER = 184 + AGE = 185 + FOLIO_NUMBER = 186 + VOTER_KEY = 187 + ADDRESS_MUNICIPALITY = 188 + ADDRESS_LOCATION = 189 + SECTION = 190 + OCR_NUMBER = 191 + FEDERAL_ELECTIONS = 192 + REFERENCE_NUMBER = 193 + OPTIONAL_DATA_CHECKSUM = 194 + OPTIONAL_DATA_CHECK_DIGIT = 195 + VISA_NUMBER = 196 + VISA_NUMBER_CHECKSUM = 197 + VISA_NUMBER_CHECK_DIGIT = 198 + VOTER = 199 + PREVIOUS_TYPE = 200 + FIELD_FROM_MRZ = 220 + CURRENT_DATE = 221 + STATUS_DATE_OF_EXPIRY = 251 + BANKNOTE_NUMBER = 252 + CSC_CODE = 253 + ARTISTIC_NAME = 254 + ACADEMIC_TITLE = 255 + ADDRESS_COUNTRY = 256 + ADDRESS_ZIP_CODE = 257 + E_ID_RESIDENCE_PERMIT_1 = 258 + E_ID_RESIDENCE_PERMIT_2 = 259 + E_ID_PLACE_OF_BIRTH_STREET = 260 + E_ID_PLACE_OF_BIRTH_CITY = 261 + E_ID_PLACE_OF_BIRTH_STATE = 262 + E_ID_PLACE_OF_BIRTH_COUNTRY = 263 + E_ID_PLACE_OF_BIRTH_ZIP_CODE = 264 + CDL_CLASS = 265 + DL_UNDER_19_DATE = 266 + WEIGHT_POUNDS = 267 + LIMITED_DURATION_DOCUMENT_INDICATOR = 268 + ENDORSEMENT_EXPIRATION_DATE = 269 + REVISION_DATE = 270 + COMPLIANCE_TYPE = 271 + FAMILY_NAME_TRUNCATION = 272 + FIRST_NAME_TRUNCATION = 273 + MIDDLE_NAME_TRUNCATION = 274 + EXAM_DATE = 275 + ORGANIZATION = 276 + DEPARTMENT = 277 + PAY_GRADE = 278 + RANK = 279 + BENEFITS_NUMBER = 280 + SPONSOR_SERVICE = 281 + SPONSOR_STATUS = 282 + SPONSOR = 283 + RELATIONSHIP = 284 + USCIS = 285 + CATEGORY = 286 + CONDITIONS = 287 + IDENTIFIER = 288 + CONFIGURATION = 289 + DISCRETIONARY_DATA = 290 + LINE_1_OPTIONAL_DATA = 291 + LINE_2_OPTIONAL_DATA = 292 + LINE_3_OPTIONAL_DATA = 293 + EQV_CODE = 294 + ALT_CODE = 295 + BINARY_CODE = 296 + PSEUDO_CODE = 297 + FEE = 298 + STAMP_NUMBER = 299 + SBH_SECURITY_OPTIONS = 300 + SBH_INTEGRITY_OPTIONS = 301 + DATE_OF_CREATION = 302 + VALIDITY_PERIOD = 303 + PATRON_HEADER_VERSION = 304 + BDB_TYPE = 305 + BIOMETRIC_TYPE = 306 + BIOMETRIC_SUBTYPE = 307 + BIOMETRIC_PRODUCT_ID = 308 + BIOMETRIC_FORMAT_OWNER = 309 + BIOMETRIC_FORMAT_TYPE = 310 + PHONE = 311 + PROFESSION = 312 + TITLE = 313 + PERSONAL_SUMMARY = 314 + OTHER_VALID_ID = 315 + CUSTODY_INFO = 316 + OTHER_NAME = 317 + OBSERVATIONS = 318 + TAX = 319 + DATE_OF_PERSONALIZATION = 320 + PERSONALIZATION_SN = 321 + OTHER_PERSON_NAME = 322 + PERSON_TO_NOTIFY_DATE_OF_RECORD = 323 + PERSON_TO_NOTIFY_NAME = 324 + PERSON_TO_NOTIFY_PHONE = 325 + PERSON_TO_NOTIFY_ADDRESS = 326 + DS_CERTIFICATE_ISSUER = 327 + DS_CERTIFICATE_SUBJECT = 328 + DS_CERTIFICATE_VALID_FROM = 329 + DS_CERTIFICATE_VALID_TO = 330 + VRC_DATA_OBJECT_ENTRY = 331 + TYPE_APPROVAL_NUMBER = 332 + ADMINISTRATIVE_NUMBER = 333 + DOCUMENT_DISCRIMINATOR = 334 + DATA_DISCRIMINATOR = 335 + ISO_ISSUER_ID_NUMBER = 336 + DTC_VERSION = 337 + DTC_ID = 338 + DTC_DATE_OF_EXPIRY = 339 + GNIB_NUMBER = 340 + DEPT_NUMBER = 341 + TELEX_CODE = 342 + ALLERGIES = 343 + SP_CODE = 344 + COURT_CODE = 345 + CTY = 346 + SPONSOR_SSN = 347 + DOD_NUMBER = 348 + MC_NOVICE_DATE = 349 + DUF_NUMBER = 350 + AGY = 351 + PNR_CODE = 352 + FROM_AIRPORT_CODE = 353 + TO_AIRPORT_CODE = 354 + FLIGHT_NUMBER = 355 + DATE_OF_FLIGHT = 356 + SEAT_NUMBER = 357 + DATE_OF_ISSUE_BOARDING_PASS = 358 + CCW_UNTIL = 359 + REFERENCE_NUMBER_CHECKSUM = 360 + REFERENCE_NUMBER_CHECK_DIGIT = 361 + ROOM_NUMBER = 362 + RELIGION = 363 + REMAINDER_TERM = 364 + ELECTRONIC_TICKET_INDICATOR = 365 + COMPARTMENT_CODE = 366 + CHECK_IN_SEQUENCE_NUMBER = 367 + AIRLINE_DESIGNATOR_OF_BOARDING_PASS_ISSUER = 368 + AIRLINE_NUMERIC_CODE = 369 + TICKET_NUMBER = 370 + FREQUENT_FLYER_AIRLINE_DESIGNATOR = 371 + FREQUENT_FLYER_NUMBER = 372 + FREE_BAGGAGE_ALLOWANCE = 373 + PDF417_CODEC = 374 + IDENTITY_CARD_NUMBER_CHECKSUM = 375 + IDENTITY_CARD_NUMBER_CHECK_DIGIT = 376 + VETERAN = 377 + DL_CLASS_CODE_A1_FROM = 378 + DL_CLASS_CODE_A1_TO = 379 + DL_CLASS_CODE_A1_NOTES = 380 + DL_CLASS_CODE_A_FROM = 381 + DL_CLASS_CODE_A_TO = 382 + DL_CLASS_CODE_A_NOTES = 383 + DL_CLASS_CODE_B_FROM = 384 + DL_CLASS_CODE_B_TO = 385 + DL_CLASS_CODE_B_NOTES = 386 + DL_CLASS_CODE_C1_FROM = 387 + DL_CLASS_CODE_C1_TO = 388 + DL_CLASS_CODE_C1_NOTES = 389 + DL_CLASS_CODE_C_FROM = 390 + DL_CLASS_CODE_C_TO = 391 + DL_CLASS_CODE_C_NOTES = 392 + DL_CLASS_CODE_D1_FROM = 393 + DL_CLASS_CODE_D1_TO = 394 + DL_CLASS_CODE_D1_NOTES = 395 + DL_CLASS_CODE_D_FROM = 396 + DL_CLASS_CODE_D_TO = 397 + DL_CLASS_CODE_D_NOTES = 398 + DL_CLASS_CODE_BE_FROM = 399 + DL_CLASS_CODE_BE_TO = 400 + DL_CLASS_CODE_BE_NOTES = 401 + DL_CLASS_CODE_C1E_FROM = 402 + DL_CLASS_CODE_C1E_TO = 403 + DL_CLASS_CODE_C1E_NOTES = 404 + DL_CLASS_CODE_CE_FROM = 405 + DL_CLASS_CODE_CE_TO = 406 + DL_CLASS_CODE_CE_NOTES = 407 + DL_CLASS_CODE_D1E_FROM = 408 + DL_CLASS_CODE_D1E_TO = 409 + DL_CLASS_CODE_D1E_NOTES = 410 + DL_CLASS_CODE_DE_FROM = 411 + DL_CLASS_CODE_DE_TO = 412 + DL_CLASS_CODE_DE_NOTES = 413 + DL_CLASS_CODE_M_FROM = 414 + DL_CLASS_CODE_M_TO = 415 + DL_CLASS_CODE_M_NOTES = 416 + DL_CLASS_CODE_L_FROM = 417 + DL_CLASS_CODE_L_TO = 418 + DL_CLASS_CODE_L_NOTES = 419 + DL_CLASS_CODE_T_FROM = 420 + DL_CLASS_CODE_T_TO = 421 + DL_CLASS_CODE_T_NOTES = 422 + DL_CLASS_CODE_AM_FROM = 423 + DL_CLASS_CODE_AM_TO = 424 + DL_CLASS_CODE_AM_NOTES = 425 + DL_CLASS_CODE_A2_FROM = 426 + DL_CLASS_CODE_A2_TO = 427 + DL_CLASS_CODE_A2_NOTES = 428 + DL_CLASS_CODE_B1_FROM = 429 + DL_CLASS_CODE_B1_TO = 430 + DL_CLASS_CODE_B1_NOTES = 431 + SURNAME_AT_BIRTH = 432 + CIVIL_STATUS = 433 + NUMBER_OF_SEATS = 434 + NUMBER_OF_STANDING_PLACES = 435 + MAX_SPEED = 436 + FUEL_TYPE = 437 + EC_ENVIRONMENTAL_TYPE = 438 + POWER_WEIGHT_RATIO = 439 + MAX_MASS_OF_TRAILER_BRAKED = 440 + MAX_MASS_OF_TRAILER_UNBRAKED = 441 + TRANSMISSION_TYPE = 442 + TRAILER_HITCH = 443 + ACCOMPANIED_BY = 444 + POLICE_DISTRICT = 445 + FIRST_ISSUE_DATE = 446 + PAYLOAD_CAPACITY = 447 + NUMBER_OF_AXLES = 448 + PERMISSIBLE_AXLE_LOAD = 449 + PRECINCT = 450 + INVITED_BY = 451 + PURPOSE_OF_ENTRY = 452 + SKIN_COLOR = 453 + COMPLEXION = 454 + AIRPORT_FROM = 455 + AIRPORT_TO = 456 + AIRLINE_NAME = 457 + AIRLINE_NAME_FREQUENT_FLYER = 458 + LICENSE_NUMBER = 459 + IN_TANKS = 460 + EXCEPT_IN_TANKS = 461 + FAST_TRACK = 462 + OWNER = 463 + MRZ_STRINGS_ICAO_RFID = 464 + NUMBER_OF_CARD_ISSUANCE = 465 + NUMBER_OF_CARD_ISSUANCE_CHECKSUM = 466 + NUMBER_OF_CARD_ISSUANCE_CHECK_DIGIT = 467 + CENTURY_DATE_OF_BIRTH = 468 + DL_CLASS_CODE_A3_FROM = 469 + DL_CLASS_CODE_A3_TO = 470 + DL_CLASS_CODE_A3_NOTES = 471 + DL_CLASS_CODE_C2_FROM = 472 + DL_CLASS_CODE_C2_TO = 473 + DL_CLASS_CODE_C2_NOTES = 474 + DL_CLASS_CODE_B2_FROM = 475 + DL_CLASS_CODE_B2_TO = 476 + DL_CLASS_CODE_B2_NOTES = 477 + DL_CLASS_CODE_D2_FROM = 478 + DL_CLASS_CODE_D2_TO = 479 + DL_CLASS_CODE_D2_NOTES = 480 + DL_CLASS_CODE_B2E_FROM = 481 + DL_CLASS_CODE_B2E_TO = 482 + DL_CLASS_CODE_B2E_NOTES = 483 + DL_CLASS_CODE_G_FROM = 484 + DL_CLASS_CODE_G_TO = 485 + DL_CLASS_CODE_G_NOTES = 486 + DL_CLASS_CODE_J_FROM = 487 + DL_CLASS_CODE_J_TO = 488 + DL_CLASS_CODE_J_NOTES = 489 + DL_CLASS_CODE_LC_FROM = 490 + DL_CLASS_CODE_LC_TO = 491 + DL_CLASS_CODE_LC_NOTES = 492 + BANK_CARD_NUMBER = 493 + BANK_CARD_VALID_THRU = 494 + TAX_NUMBER = 495 + HEALTH_NUMBER = 496 + GRANDFATHER_NAME = 497 + SELECTEE_INDICATOR = 498 + MOTHER_SURNAME = 499 + MOTHER_GIVEN_NAME = 500 + FATHER_SURNAME = 501 + FATHER_GIVEN_NAME = 502 + MOTHER_DATE_OF_BIRTH = 503 + FATHER_DATE_OF_BIRTH = 504 + MOTHER_PERSONAL_NUMBER = 505 + FATHER_PERSONAL_NUMBER = 506 + MOTHER_PLACE_OF_BIRTH = 507 + FATHER_PLACE_OF_BIRTH = 508 + MOTHER_COUNTRY_OF_BIRTH = 509 + FATHER_COUNTRY_OF_BIRTH = 510 + DATE_FIRST_RENEWAL = 511 + DATE_SECOND_RENEWAL = 512 + PLACE_OF_EXAMINATION = 513 + APPLICATION_NUMBER = 514 + VOUCHER_NUMBER = 515 + AUTHORIZATION_NUMBER = 516 + FACULTY = 517 + FORM_OF_EDUCATION = 518 + DNI_NUMBER = 519 + RETIREMENT_NUMBER = 520 + PROFESSIONAL_ID_NUMBER = 521 + AGE_AT_ISSUE = 522 + YEARS_SINCE_ISSUE = 523 + DL_CLASS_CODE_BTP_FROM = 524 + DL_CLASS_CODE_BTP_NOTES = 525 + DL_CLASS_CODE_BTP_TO = 526 + DL_CLASS_CODE_C3_FROM = 527 + DL_CLASS_CODE_C3_NOTES = 528 + DL_CLASS_CODE_C3_TO = 529 + DL_CLASS_CODE_E_FROM = 530 + DL_CLASS_CODE_E_NOTES = 531 + DL_CLASS_CODE_E_TO = 532 + DL_CLASS_CODE_F_FROM = 533 + DL_CLASS_CODE_F_NOTES = 534 + DL_CLASS_CODE_F_TO = 535 + DL_CLASS_CODE_FA_FROM = 536 + DL_CLASS_CODE_FA_NOTES = 537 + DL_CLASS_CODE_FA_TO = 538 + DL_CLASS_CODE_FA1_FROM = 539 + DL_CLASS_CODE_FA1_NOTES = 540 + DL_CLASS_CODE_FA1_TO = 541 + DL_CLASS_CODE_FB_FROM = 542 + DL_CLASS_CODE_FB_NOTES = 543 + DL_CLASS_CODE_FB_TO = 544 + DL_CLASS_CODE_G1_FROM = 545 + DL_CLASS_CODE_G1_NOTES = 546 + DL_CLASS_CODE_G1_TO = 547 + DL_CLASS_CODE_H_FROM = 548 + DL_CLASS_CODE_H_NOTES = 549 + DL_CLASS_CODE_H_TO = 550 + DL_CLASS_CODE_I_FROM = 551 + DL_CLASS_CODE_I_NOTES = 552 + DL_CLASS_CODE_I_TO = 553 + DL_CLASS_CODE_K_FROM = 554 + DL_CLASS_CODE_K_NOTES = 555 + DL_CLASS_CODE_K_TO = 556 + DL_CLASS_CODE_LK_FROM = 557 + DL_CLASS_CODE_LK_NOTES = 558 + DL_CLASS_CODE_LK_TO = 559 + DL_CLASS_CODE_N_FROM = 560 + DL_CLASS_CODE_N_NOTES = 561 + DL_CLASS_CODE_N_TO = 562 + DL_CLASS_CODE_S_FROM = 563 + DL_CLASS_CODE_S_NOTES = 564 + DL_CLASS_CODE_S_TO = 565 + DL_CLASS_CODE_TB_FROM = 566 + DL_CLASS_CODE_TB_NOTES = 567 + DL_CLASS_CODE_TB_TO = 568 + DL_CLASS_CODE_TM_FROM = 569 + DL_CLASS_CODE_TM_NOTES = 570 + DL_CLASS_CODE_TM_TO = 571 + DL_CLASS_CODE_TR_FROM = 572 + DL_CLASS_CODE_TR_NOTES = 573 + DL_CLASS_CODE_TR_TO = 574 + DL_CLASS_CODE_TV_FROM = 575 + DL_CLASS_CODE_TV_NOTES = 576 + DL_CLASS_CODE_TV_TO = 577 + DL_CLASS_CODE_V_FROM = 578 + DL_CLASS_CODE_V_NOTES = 579 + DL_CLASS_CODE_V_TO = 580 + DL_CLASS_CODE_W_FROM = 581 + DL_CLASS_CODE_W_NOTES = 582 + DL_CLASS_CODE_W_TO = 583 + URL = 584 + CALIBER = 585 + MODEL = 586 + MAKE = 587 + NUMBER_OF_CYLINDERS = 588 + SURNAME_OF_HUSBAND_AFTER_REGISTRATION = 589 + SURNAME_OF_WIFE_AFTER_REGISTRATION = 590 + DATE_OF_BIRTH_OF_WIFE = 591 + DATE_OF_BIRTH_OF_HUSBAND = 592 + CITIZENSHIP_OF_FIRST_PERSON = 593 + CITIZENSHIP_OF_SECOND_PERSON = 594 + CVV = 595 + DATE_OF_INSURANCE_EXPIRY = 596 + MORTGAGE_BY = 597 + OLD_DOCUMENT_NUMBER = 598 + OLD_DATE_OF_ISSUE = 599 + OLD_PLACE_OF_ISSUE = 600 + DL_CLASS_CODE_LR_FROM = 601 + DL_CLASS_CODE_LR_TO = 602 + DL_CLASS_CODE_LR_NOTES = 603 + DL_CLASS_CODE_MR_FROM = 604 + DL_CLASS_CODE_MR_TO = 605 + DL_CLASS_CODE_MR_NOTES = 606 + DL_CLASS_CODE_HR_FROM = 607 + DL_CLASS_CODE_HR_TO = 608 + DL_CLASS_CODE_HR_NOTES = 609 + DL_CLASS_CODE_HC_FROM = 610 + DL_CLASS_CODE_HC_TO = 611 + DL_CLASS_CODE_HC_NOTES = 612 + DL_CLASS_CODE_MC_FROM = 613 + DL_CLASS_CODE_MC_TO = 614 + DL_CLASS_CODE_MC_NOTES = 615 + DL_CLASS_CODE_RE_FROM = 616 + DL_CLASS_CODE_RE_TO = 617 + DL_CLASS_CODE_RE_NOTES = 618 + DL_CLASS_CODE_R_FROM = 619 + DL_CLASS_CODE_R_TO = 620 + DL_CLASS_CODE_R_NOTES = 621 + DL_CLASS_CODE_CA_FROM = 622 + DL_CLASS_CODE_CA_TO = 623 + DL_CLASS_CODE_CA_NOTES = 624 + CITIZENSHIP_STATUS = 625 + MILITARY_SERVICE_FROM = 626 + MILITARY_SERVICE_TO = 627 + DL_CLASS_CODE_NT_FROM = 628 + DL_CLASS_CODE_NT_TO = 629 + DL_CLASS_CODE_NT_NOTES = 630 + DL_CLASS_CODE_TN_FROM = 631 + DL_CLASS_CODE_TN_TO = 632 + DL_CLASS_CODE_TN_NOTES = 633 + DL_CLASS_CODE_D3_FROM = 634 + DL_CLASS_CODE_D3_TO = 635 + DL_CLASS_CODE_D3_NOTES = 636 + ALT_DATE_OF_EXPIRY = 637 + DL_CLASS_CODE_CD_FROM = 638 + DL_CLASS_CODE_CD_TO = 639 + DL_CLASS_CODE_CD_NOTES = 640 + ISSUER_IDENTIFICATION_NUMBER = 641 + PAYMENT_PERIOD_FROM = 642 + PAYMENT_PERIOD_TO = 643 + VACCINATION_CERTIFICATE_IDENTIFIER = 644 + FIRST_NAME = 645 + DATE_OF_ARRIVAL = 646 + SECOND_NAME = 647 + THIRD_NAME = 648 + FOURTH_NAME = 649 + LAST_NAME = 650 + DL_CLASS_CODE_RM_FROM = 651 + DL_CLASS_CODE_RM_NOTES = 652 + DL_CLASS_CODE_RM_TO = 653 + DL_CLASS_CODE_PW_FROM = 654 + DL_CLASS_CODE_PW_NOTES = 655 + DL_CLASS_CODE_PW_TO = 656 + DL_CLASS_CODE_EB_FROM = 657 + DL_CLASS_CODE_EB_NOTES = 658 + DL_CLASS_CODE_EB_TO = 659 + DL_CLASS_CODE_EC_FROM = 660 + DL_CLASS_CODE_EC_NOTES = 661 + DL_CLASS_CODE_EC_TO = 662 + DL_CLASS_CODE_EC1_FROM = 663 + DL_CLASS_CODE_EC1_NOTES = 664 + DL_CLASS_CODE_EC1_TO = 665 + PLACE_OF_BIRTH_CITY = 666 + YEAR_OF_BIRTH = 667 + YEAR_OF_EXPIRY = 668 + GRANDFATHER_NAME_MATERNAL = 669 + FIRST_SURNAME = 670 + MONTH_OF_BIRTH = 671 + ADDRESS_FLOOR_NUMBER = 672 + ADDRESS_ENTRANCE = 673 + ADDRESS_BLOCK_NUMBER = 674 + ADDRESS_STREET_NUMBER = 675 + ADDRESS_STREET_TYPE = 676 + ADDRESS_CITY_SECTOR = 677 + ADDRESS_COUNTY_TYPE = 678 + ADDRESS_CITY_TYPE = 679 + ADDRESS_BUILDING_TYPE = 680 + DATE_OF_RETIREMENT = 681 + DOCUMENT_STATUS = 682 + SIGNATURE = 683 + FT_UNIQUE_CERTIFICATE_IDENTIFIER = 684 + FT_EMAIL = 685 + FT_DATE_OF_SPECIMEN_COLLECTION = 686 + FT_TYPE_OF_TESTING = 687 + FT_RESULT_OF_TESTING = 688 + FT_METHOD_OF_TESTING = 689 + FT_DIGITAL_TRAVEL_AUTHORIZATION_NUMBER = 690 + FT_DATE_OF_FIRST_POSITIVE_TEST_RESULT = 691 + EF_CARD_ACCESS = 692 + SHORT_FLIGHT_NUMBER = 693 + AIRLINE_CODE = 694 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of TextFieldType from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextFieldType): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_field_value.py b/regula/documentreader/webclient/gen/models/text_field_value.py old mode 100755 new mode 100644 index a573df3..cd5ab79 --- a/regula/documentreader/webclient/gen/models/text_field_value.py +++ b/regula/documentreader/webclient/gen/models/text_field_value.py @@ -4,315 +4,113 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextFieldValue(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.check_result import CheckResult +from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol +from regula.documentreader.webclient.gen.models.rectangle_coordinates import RectangleCoordinates +from regula.documentreader.webclient.gen.models.rfid_origin import RfidOrigin +from regula.documentreader.webclient.gen.models.source import Source +from typing import Optional, Set +from typing_extensions import Self + +class TextFieldValue(BaseModel): """ - openapi_types = { - 'source': 'Source', - 'value': 'str', - 'original_value': 'str', - 'original_symbols': 'list[OriginalSymbol]', - 'page_index': 'int', - 'probability': 'int', - 'field_rect': 'RectangleCoordinates', - 'rfid_origin': 'RfidOrigin' - } - - attribute_map = { - 'source': 'source', - 'value': 'value', - 'original_value': 'originalValue', - 'original_symbols': 'originalSymbols', - 'page_index': 'pageIndex', - 'probability': 'probability', - 'field_rect': 'fieldRect', - 'rfid_origin': 'rfidOrigin' - } - - def __init__(self, source=None, value=None, original_value=None, original_symbols=None, page_index=None, probability=None, field_rect=None, rfid_origin=None, local_vars_configuration=None): # noqa: E501 - """TextFieldValue - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._source = None - self._value = None - self._original_value = None - self._original_symbols = None - self._page_index = None - self._probability = None - self._field_rect = None - self._rfid_origin = None - self.discriminator = None - - self.source = source - self.value = value - if original_value is not None: - self.original_value = original_value - if original_symbols is not None: - self.original_symbols = original_symbols - self.page_index = page_index - if probability is not None: - self.probability = probability - if field_rect is not None: - self.field_rect = field_rect - if rfid_origin is not None: - self.rfid_origin = rfid_origin - - @property - def source(self): - """Gets the source of this TextFieldValue. # noqa: E501 - - - :return: The source of this TextFieldValue. # noqa: E501 - :rtype: Source - """ - return self._source - - @source.setter - def source(self, source): - """Sets the source of this TextFieldValue. - - - :param source: The source of this TextFieldValue. # noqa: E501 - :type source: Source - """ - if self.local_vars_configuration.client_side_validation and source is None: # noqa: E501 - raise ValueError("Invalid value for `source`, must not be `None`") # noqa: E501 - - self._source = source - - @property - def value(self): - """Gets the value of this TextFieldValue. # noqa: E501 - - Parsed/processed value. Date format converted for output, delimiters removed # noqa: E501 - - :return: The value of this TextFieldValue. # noqa: E501 - :rtype: str - """ - return self._value - - @value.setter - def value(self, value): - """Sets the value of this TextFieldValue. - - Parsed/processed value. Date format converted for output, delimiters removed # noqa: E501 - - :param value: The value of this TextFieldValue. # noqa: E501 - :type value: str - """ - if self.local_vars_configuration.client_side_validation and value is None: # noqa: E501 - raise ValueError("Invalid value for `value`, must not be `None`") # noqa: E501 - - self._value = value - - @property - def original_value(self): - """Gets the original_value of this TextFieldValue. # noqa: E501 - - Original value as seen in the document # noqa: E501 - - :return: The original_value of this TextFieldValue. # noqa: E501 - :rtype: str - """ - return self._original_value - - @original_value.setter - def original_value(self, original_value): - """Sets the original_value of this TextFieldValue. - - Original value as seen in the document # noqa: E501 - - :param original_value: The original_value of this TextFieldValue. # noqa: E501 - :type original_value: str - """ - - self._original_value = original_value - - @property - def original_symbols(self): - """Gets the original_symbols of this TextFieldValue. # noqa: E501 - - - :return: The original_symbols of this TextFieldValue. # noqa: E501 - :rtype: list[OriginalSymbol] - """ - return self._original_symbols - - @original_symbols.setter - def original_symbols(self, original_symbols): - """Sets the original_symbols of this TextFieldValue. - - - :param original_symbols: The original_symbols of this TextFieldValue. # noqa: E501 - :type original_symbols: list[OriginalSymbol] - """ - - self._original_symbols = original_symbols - - @property - def page_index(self): - """Gets the page_index of this TextFieldValue. # noqa: E501 - - Page index of the image from input list # noqa: E501 - - :return: The page_index of this TextFieldValue. # noqa: E501 - :rtype: int - """ - return self._page_index - - @page_index.setter - def page_index(self, page_index): - """Sets the page_index of this TextFieldValue. - - Page index of the image from input list # noqa: E501 - - :param page_index: The page_index of this TextFieldValue. # noqa: E501 - :type page_index: int - """ - if self.local_vars_configuration.client_side_validation and page_index is None: # noqa: E501 - raise ValueError("Invalid value for `page_index`, must not be `None`") # noqa: E501 - - self._page_index = page_index - - @property - def probability(self): - """Gets the probability of this TextFieldValue. # noqa: E501 - - Min recognition probability. Combined minimum probability from single characters probabilities # noqa: E501 - - :return: The probability of this TextFieldValue. # noqa: E501 - :rtype: int - """ - return self._probability - - @probability.setter - def probability(self, probability): - """Sets the probability of this TextFieldValue. - - Min recognition probability. Combined minimum probability from single characters probabilities # noqa: E501 - - :param probability: The probability of this TextFieldValue. # noqa: E501 - :type probability: int - """ - if (self.local_vars_configuration.client_side_validation and - probability is not None and probability > 100): # noqa: E501 - raise ValueError("Invalid value for `probability`, must be a value less than or equal to `100`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - probability is not None and probability < 0): # noqa: E501 - raise ValueError("Invalid value for `probability`, must be a value greater than or equal to `0`") # noqa: E501 - - self._probability = probability - - @property - def field_rect(self): - """Gets the field_rect of this TextFieldValue. # noqa: E501 - - - :return: The field_rect of this TextFieldValue. # noqa: E501 - :rtype: RectangleCoordinates - """ - return self._field_rect - - @field_rect.setter - def field_rect(self, field_rect): - """Sets the field_rect of this TextFieldValue. - - - :param field_rect: The field_rect of this TextFieldValue. # noqa: E501 - :type field_rect: RectangleCoordinates - """ - - self._field_rect = field_rect - - @property - def rfid_origin(self): - """Gets the rfid_origin of this TextFieldValue. # noqa: E501 - - - :return: The rfid_origin of this TextFieldValue. # noqa: E501 - :rtype: RfidOrigin - """ - return self._rfid_origin - - @rfid_origin.setter - def rfid_origin(self, rfid_origin): - """Sets the rfid_origin of this TextFieldValue. - - - :param rfid_origin: The rfid_origin of this TextFieldValue. # noqa: E501 - :type rfid_origin: RfidOrigin - """ - - self._rfid_origin = rfid_origin - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextFieldValue): - return False - - return self.to_dict() == other.to_dict() + TextFieldValue + """ # noqa: E501 + source: Source + value: StrictStr = Field(description="Parsed/processed value. Date format converted for output, delimiters removed") + original_value: Optional[StrictStr] = Field(default=None, description="Original value as seen in the document", alias="originalValue") + original_validity: CheckResult = Field(alias="originalValidity") + original_symbols: Optional[List[OriginalSymbol]] = Field(default=None, alias="originalSymbols") + page_index: StrictInt = Field(description="Page index of the image from input list", alias="pageIndex") + probability: Annotated[int, Field(le=100, strict=True, ge=0)] = Field(description="Min recognition probability. Combined minimum probability from single characters probabilities") + field_rect: Optional[RectangleCoordinates] = Field(default=None, alias="fieldRect") + rfid_origin: Optional[RfidOrigin] = Field(default=None, alias="rfidOrigin") + container_type: Optional[StrictInt] = Field(default=0, description="Same as Result type, but used for safe parsing of not-described values. See Result type.", alias="containerType") + __properties: ClassVar[List[str]] = ["source", "value", "originalValue", "originalValidity", "originalSymbols", "pageIndex", "probability", "fieldRect", "rfidOrigin", "containerType"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextFieldValue from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in original_symbols (list) + _items = [] + if self.original_symbols: + for _item_original_symbols in self.original_symbols: + if _item_original_symbols: + _items.append(_item_original_symbols.to_dict()) + _dict['originalSymbols'] = _items + # override the default output from pydantic by calling `to_dict()` of field_rect + if self.field_rect: + _dict['fieldRect'] = self.field_rect.to_dict() + # override the default output from pydantic by calling `to_dict()` of rfid_origin + if self.rfid_origin: + _dict['rfidOrigin'] = self.rfid_origin.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextFieldValue from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "source": obj.get("source"), + "value": obj.get("value"), + "originalValue": obj.get("originalValue"), + "originalValidity": obj.get("originalValidity"), + "originalSymbols": [OriginalSymbol.from_dict(_item) for _item in obj["originalSymbols"]] if obj.get("originalSymbols") is not None else None, + "pageIndex": obj.get("pageIndex"), + "probability": obj.get("probability"), + "fieldRect": RectangleCoordinates.from_dict(obj["fieldRect"]) if obj.get("fieldRect") is not None else None, + "rfidOrigin": RfidOrigin.from_dict(obj["rfidOrigin"]) if obj.get("rfidOrigin") is not None else None, + "containerType": obj.get("containerType") if obj.get("containerType") is not None else 0 + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextFieldValue): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_item.py b/regula/documentreader/webclient/gen/models/text_item.py new file mode 100644 index 0000000..025277b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/text_item.py @@ -0,0 +1,83 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.text import Text +from typing import Optional, Set +from typing_extensions import Self + +class TextItem(BaseModel): + """ + TextItem + """ # noqa: E501 + text: Text = Field(alias="Text") + __properties: ClassVar[List[str]] = ["Text"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of text + if self.text: + _dict['Text'] = self.text.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Text": Text.from_dict(obj["Text"]) if obj.get("Text") is not None else None + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/text_post_processing.py b/regula/documentreader/webclient/gen/models/text_post_processing.py index 9ebd6a7..d31c758 100644 --- a/regula/documentreader/webclient/gen/models/text_post_processing.py +++ b/regula/documentreader/webclient/gen/models/text_post_processing.py @@ -4,98 +4,28 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextPostProcessing(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class TextPostProcessing(int, Enum): + """ + TextPostProcessing """ - - NO_CHANGE = int("0") - - UPPERCASE = int("1") - - LOWERCASE = int("2") - - CAPITAL = int("3") - - allowable_values = [NO_CHANGE, UPPERCASE, LOWERCASE, CAPITAL] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """TextPostProcessing - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextPostProcessing): - return False + NO_CHANGE = 0 + UPPERCASE = 1 + LOWERCASE = 2 + CAPITAL = 3 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of TextPostProcessing from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextPostProcessing): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_result.py b/regula/documentreader/webclient/gen/models/text_result.py old mode 100755 new mode 100644 index 1fd5652..a5bee75 --- a/regula/documentreader/webclient/gen/models/text_result.py +++ b/regula/documentreader/webclient/gen/models/text_result.py @@ -4,250 +4,87 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import ConfigDict, Field +from typing import Any, ClassVar, Dict, List +from regula.documentreader.webclient.gen.models.result import Result +from regula.documentreader.webclient.gen.models.result_item import ResultItem +from regula.documentreader.webclient.gen.models.text import Text +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class TextResult(ResultItem): """ + TextResult + """ # noqa: E501 + text: Text = Field(alias="Text") + __properties: ClassVar[List[str]] = ["buf_length", "light", "list_idx", "page_idx", "result_type", "Text"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'text': 'Text', - 'buf_length': 'int', - 'light': 'int', - 'list_idx': 'int', - 'page_idx': 'int', - 'result_type': 'int' - } - - attribute_map = { - 'text': 'Text', - 'buf_length': 'buf_length', - 'light': 'light', - 'list_idx': 'list_idx', - 'page_idx': 'page_idx', - 'result_type': 'result_type' - } - - def __init__(self, text=None, buf_length=None, light=None, list_idx=None, page_idx=None, result_type=0, local_vars_configuration=None): # noqa: E501 - """TextResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._text = None - self._buf_length = None - self._light = None - self._list_idx = None - self._page_idx = None - self._result_type = None - self.discriminator = None - - self.text = text - if buf_length is not None: - self.buf_length = buf_length - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - self.result_type = result_type - - @property - def text(self): - """Gets the text of this TextResult. # noqa: E501 - - - :return: The text of this TextResult. # noqa: E501 - :rtype: Text - """ - return self._text - - @text.setter - def text(self, text): - """Sets the text of this TextResult. - - - :param text: The text of this TextResult. # noqa: E501 - :type text: Text - """ - if self.local_vars_configuration.client_side_validation and text is None: # noqa: E501 - raise ValueError("Invalid value for `text`, must not be `None`") # noqa: E501 - - self._text = text - - @property - def buf_length(self): - """Gets the buf_length of this TextResult. # noqa: E501 - - - :return: The buf_length of this TextResult. # noqa: E501 - :rtype: int - """ - return self._buf_length - - @buf_length.setter - def buf_length(self, buf_length): - """Sets the buf_length of this TextResult. - - - :param buf_length: The buf_length of this TextResult. # noqa: E501 - :type buf_length: int - """ - - self._buf_length = buf_length - - @property - def light(self): - """Gets the light of this TextResult. # noqa: E501 + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - :return: The light of this TextResult. # noqa: E501 - :rtype: int - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this TextResult. - - - :param light: The light of this TextResult. # noqa: E501 - :type light: int - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this TextResult. # noqa: E501 - - - :return: The list_idx of this TextResult. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this TextResult. - + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - :param list_idx: The list_idx of this TextResult. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this TextResult. # noqa: E501 - - - :return: The page_idx of this TextResult. # noqa: E501 - :rtype: int - """ - return self._page_idx + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this TextResult. + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TextResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. - :param page_idx: The page_idx of this TextResult. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def result_type(self): - """Gets the result_type of this TextResult. # noqa: E501 + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - - :return: The result_type of this TextResult. # noqa: E501 - :rtype: int + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._result_type - - @result_type.setter - def result_type(self, result_type): - """Sets the result_type of this TextResult. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of text + if self.text: + _dict['Text'] = self.text.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TextResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "buf_length": obj.get("buf_length"), + "light": obj.get("light"), + "list_idx": obj.get("list_idx"), + "page_idx": obj.get("page_idx"), + "result_type": obj.get("result_type"), + "Text": Text.from_dict(obj["Text"]) if obj.get("Text") is not None else None + }) + return _obj - Same as Result type, but used for safe parsing of not-described values. See Result type. # noqa: E501 - :param result_type: The result_type of this TextResult. # noqa: E501 - :type result_type: int - """ - if self.local_vars_configuration.client_side_validation and result_type is None: # noqa: E501 - raise ValueError("Invalid value for `result_type`, must not be `None`") # noqa: E501 - - self._result_type = result_type - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextResult): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextResult): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/text_result_all_of.py b/regula/documentreader/webclient/gen/models/text_result_all_of.py deleted file mode 100755 index b8b682a..0000000 --- a/regula/documentreader/webclient/gen/models/text_result_all_of.py +++ /dev/null @@ -1,120 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TextResultAllOf(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'text': 'Text' - } - - attribute_map = { - 'text': 'Text' - } - - def __init__(self, text=None, local_vars_configuration=None): # noqa: E501 - """TextResultAllOf - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._text = None - self.discriminator = None - - self.text = text - - @property - def text(self): - """Gets the text of this TextResultAllOf. # noqa: E501 - - - :return: The text of this TextResultAllOf. # noqa: E501 - :rtype: Text - """ - return self._text - - @text.setter - def text(self, text): - """Sets the text of this TextResultAllOf. - - - :param text: The text of this TextResultAllOf. # noqa: E501 - :type text: Text - """ - if self.local_vars_configuration.client_side_validation and text is None: # noqa: E501 - raise ValueError("Invalid value for `text`, must not be `None`") # noqa: E501 - - self._text = text - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TextResultAllOf): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TextResultAllOf): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/tfdsid_list.py b/regula/documentreader/webclient/gen/models/tfdsid_list.py deleted file mode 100755 index 7c9e472..0000000 --- a/regula/documentreader/webclient/gen/models/tfdsid_list.py +++ /dev/null @@ -1,372 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -class TFDSIDList(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'icao': 'str', - 'list': 'list[int]', - 'd_type': 'DocumentType', - 'd_format': 'DocumentFormat', - 'd_mrz': 'bool', - 'd_description': 'str', - 'd_year': 'str', - 'd_country_name': 'str', - 'd_state_code': 'str', - 'd_state_name': 'str' - } - - attribute_map = { - 'icao': 'ICAO', - 'list': 'List', - 'd_type': 'dType', - 'd_format': 'dFormat', - 'd_mrz': 'dMRZ', - 'd_description': 'dDescription', - 'd_year': 'dYear', - 'd_country_name': 'dCountryName', - 'd_state_code': 'dStateCode', - 'd_state_name': 'dStateName' - } - - def __init__(self, icao=None, list=None, d_type=None, d_format=None, d_mrz=None, d_description=None, d_year=None, d_country_name=None, d_state_code=None, d_state_name=None, local_vars_configuration=None): # noqa: E501 - """TFDSIDList - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._icao = None - self._list = None - self._d_type = None - self._d_format = None - self._d_mrz = None - self._d_description = None - self._d_year = None - self._d_country_name = None - self._d_state_code = None - self._d_state_name = None - self.discriminator = None - - if icao is not None: - self.icao = icao - if list is not None: - self.list = list - if d_type is not None: - self.d_type = d_type - if d_format is not None: - self.d_format = d_format - if d_mrz is not None: - self.d_mrz = d_mrz - if d_description is not None: - self.d_description = d_description - if d_year is not None: - self.d_year = d_year - if d_country_name is not None: - self.d_country_name = d_country_name - if d_state_code is not None: - self.d_state_code = d_state_code - if d_state_name is not None: - self.d_state_name = d_state_name - - @property - def icao(self): - """Gets the icao of this TFDSIDList. # noqa: E501 - - ICAO code of the issuing country # noqa: E501 - - :return: The icao of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._icao - - @icao.setter - def icao(self, icao): - """Sets the icao of this TFDSIDList. - - ICAO code of the issuing country # noqa: E501 - - :param icao: The icao of this TFDSIDList. # noqa: E501 - :type icao: str - """ - if (self.local_vars_configuration.client_side_validation and - icao is not None and len(icao) > 4): - raise ValueError("Invalid value for `icao`, length must be less than or equal to `4`") # noqa: E501 - if (self.local_vars_configuration.client_side_validation and - icao is not None and len(icao) < 4): - raise ValueError("Invalid value for `icao`, length must be greater than or equal to `4`") # noqa: E501 - - self._icao = icao - - @property - def list(self): - """Gets the list of this TFDSIDList. # noqa: E501 - - Document identifiers in 'Information Reference Systems' # noqa: E501 - - :return: The list of this TFDSIDList. # noqa: E501 - :rtype: list[int] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this TFDSIDList. - - Document identifiers in 'Information Reference Systems' # noqa: E501 - - :param list: The list of this TFDSIDList. # noqa: E501 - :type list: list[int] - """ - - self._list = list - - @property - def d_type(self): - """Gets the d_type of this TFDSIDList. # noqa: E501 - - - :return: The d_type of this TFDSIDList. # noqa: E501 - :rtype: DocumentType - """ - return self._d_type - - @d_type.setter - def d_type(self, d_type): - """Sets the d_type of this TFDSIDList. - - - :param d_type: The d_type of this TFDSIDList. # noqa: E501 - :type d_type: DocumentType - """ - - self._d_type = d_type - - @property - def d_format(self): - """Gets the d_format of this TFDSIDList. # noqa: E501 - - - :return: The d_format of this TFDSIDList. # noqa: E501 - :rtype: DocumentFormat - """ - return self._d_format - - @d_format.setter - def d_format(self, d_format): - """Sets the d_format of this TFDSIDList. - - - :param d_format: The d_format of this TFDSIDList. # noqa: E501 - :type d_format: DocumentFormat - """ - - self._d_format = d_format - - @property - def d_mrz(self): - """Gets the d_mrz of this TFDSIDList. # noqa: E501 - - Flag indicating the presence of MRZ on the document # noqa: E501 - - :return: The d_mrz of this TFDSIDList. # noqa: E501 - :rtype: bool - """ - return self._d_mrz - - @d_mrz.setter - def d_mrz(self, d_mrz): - """Sets the d_mrz of this TFDSIDList. - - Flag indicating the presence of MRZ on the document # noqa: E501 - - :param d_mrz: The d_mrz of this TFDSIDList. # noqa: E501 - :type d_mrz: bool - """ - - self._d_mrz = d_mrz - - @property - def d_description(self): - """Gets the d_description of this TFDSIDList. # noqa: E501 - - Document description # noqa: E501 - - :return: The d_description of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_description - - @d_description.setter - def d_description(self, d_description): - """Sets the d_description of this TFDSIDList. - - Document description # noqa: E501 - - :param d_description: The d_description of this TFDSIDList. # noqa: E501 - :type d_description: str - """ - - self._d_description = d_description - - @property - def d_year(self): - """Gets the d_year of this TFDSIDList. # noqa: E501 - - Year of publication of the document # noqa: E501 - - :return: The d_year of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_year - - @d_year.setter - def d_year(self, d_year): - """Sets the d_year of this TFDSIDList. - - Year of publication of the document # noqa: E501 - - :param d_year: The d_year of this TFDSIDList. # noqa: E501 - :type d_year: str - """ - - self._d_year = d_year - - @property - def d_country_name(self): - """Gets the d_country_name of this TFDSIDList. # noqa: E501 - - Issuing country name # noqa: E501 - - :return: The d_country_name of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_country_name - - @d_country_name.setter - def d_country_name(self, d_country_name): - """Sets the d_country_name of this TFDSIDList. - - Issuing country name # noqa: E501 - - :param d_country_name: The d_country_name of this TFDSIDList. # noqa: E501 - :type d_country_name: str - """ - - self._d_country_name = d_country_name - - @property - def d_state_code(self): - """Gets the d_state_code of this TFDSIDList. # noqa: E501 - - Issuing state code # noqa: E501 - - :return: The d_state_code of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_state_code - - @d_state_code.setter - def d_state_code(self, d_state_code): - """Sets the d_state_code of this TFDSIDList. - - Issuing state code # noqa: E501 - - :param d_state_code: The d_state_code of this TFDSIDList. # noqa: E501 - :type d_state_code: str - """ - - self._d_state_code = d_state_code - - @property - def d_state_name(self): - """Gets the d_state_name of this TFDSIDList. # noqa: E501 - - Issuing state name # noqa: E501 - - :return: The d_state_name of this TFDSIDList. # noqa: E501 - :rtype: str - """ - return self._d_state_name - - @d_state_name.setter - def d_state_name(self, d_state_name): - """Sets the d_state_name of this TFDSIDList. - - Issuing state name # noqa: E501 - - :param d_state_name: The d_state_name of this TFDSIDList. # noqa: E501 - :type d_state_name: str - """ - - self._d_state_name = d_state_name - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TFDSIDList): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TFDSIDList): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_image.py b/regula/documentreader/webclient/gen/models/transaction_image.py index a799922..36efc9b 100644 --- a/regula/documentreader/webclient/gen/models/transaction_image.py +++ b/regula/documentreader/webclient/gen/models/transaction_image.py @@ -4,116 +4,80 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.images_field_value import ImagesFieldValue +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionImage(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class TransactionImage(BaseModel): """ + TransactionImage + """ # noqa: E501 + image: Optional[ImagesFieldValue] = None + __properties: ClassVar[List[str]] = ["image"] - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'image': 'ImagesFieldValue' - } + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) - attribute_map = { - 'image': 'image' - } - def __init__(self, image=None, local_vars_configuration=None): # noqa: E501 - """TransactionImage - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) - self._image = None - self.discriminator = None + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) - if image is not None: - self.image = image + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionImage from a JSON string""" + return cls.from_dict(json.loads(json_str)) - @property - def image(self): - """Gets the image of this TransactionImage. # noqa: E501 + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: - :return: The image of this TransactionImage. # noqa: E501 - :rtype: ImagesFieldValue + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._image - - @image.setter - def image(self, image): - """Sets the image of this TransactionImage. + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of image + if self.image: + _dict['image'] = self.image.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionImage from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "image": ImagesFieldValue.from_dict(obj["image"]) if obj.get("image") is not None else None + }) + return _obj - :param image: The image of this TransactionImage. # noqa: E501 - :type image: ImagesFieldValue - """ - - self._image = image - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionImage): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionImage): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_images_field_value.py b/regula/documentreader/webclient/gen/models/transaction_images_field_value.py deleted file mode 100644 index 90e28f0..0000000 --- a/regula/documentreader/webclient/gen/models/transaction_images_field_value.py +++ /dev/null @@ -1,227 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionImagesFieldValue(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'field_type': 'GraphicFieldType', - 'light': 'Light', - 'list_idx': 'int', - 'page_idx': 'int', - 'url': 'str' - } - - attribute_map = { - 'field_type': 'fieldType', - 'light': 'light', - 'list_idx': 'listIdx', - 'page_idx': 'pageIdx', - 'url': 'url' - } - - def __init__(self, field_type=None, light=None, list_idx=None, page_idx=None, url=None, local_vars_configuration=None): # noqa: E501 - """TransactionImagesFieldValue - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._field_type = None - self._light = None - self._list_idx = None - self._page_idx = None - self._url = None - self.discriminator = None - - if field_type is not None: - self.field_type = field_type - if light is not None: - self.light = light - if list_idx is not None: - self.list_idx = list_idx - if page_idx is not None: - self.page_idx = page_idx - if url is not None: - self.url = url - - @property - def field_type(self): - """Gets the field_type of this TransactionImagesFieldValue. # noqa: E501 - - - :return: The field_type of this TransactionImagesFieldValue. # noqa: E501 - :rtype: GraphicFieldType - """ - return self._field_type - - @field_type.setter - def field_type(self, field_type): - """Sets the field_type of this TransactionImagesFieldValue. - - - :param field_type: The field_type of this TransactionImagesFieldValue. # noqa: E501 - :type field_type: GraphicFieldType - """ - - self._field_type = field_type - - @property - def light(self): - """Gets the light of this TransactionImagesFieldValue. # noqa: E501 - - - :return: The light of this TransactionImagesFieldValue. # noqa: E501 - :rtype: Light - """ - return self._light - - @light.setter - def light(self, light): - """Sets the light of this TransactionImagesFieldValue. - - - :param light: The light of this TransactionImagesFieldValue. # noqa: E501 - :type light: Light - """ - - self._light = light - - @property - def list_idx(self): - """Gets the list_idx of this TransactionImagesFieldValue. # noqa: E501 - - - :return: The list_idx of this TransactionImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._list_idx - - @list_idx.setter - def list_idx(self, list_idx): - """Sets the list_idx of this TransactionImagesFieldValue. - - - :param list_idx: The list_idx of this TransactionImagesFieldValue. # noqa: E501 - :type list_idx: int - """ - - self._list_idx = list_idx - - @property - def page_idx(self): - """Gets the page_idx of this TransactionImagesFieldValue. # noqa: E501 - - Page index of the image from input list # noqa: E501 - - :return: The page_idx of this TransactionImagesFieldValue. # noqa: E501 - :rtype: int - """ - return self._page_idx - - @page_idx.setter - def page_idx(self, page_idx): - """Sets the page_idx of this TransactionImagesFieldValue. - - Page index of the image from input list # noqa: E501 - - :param page_idx: The page_idx of this TransactionImagesFieldValue. # noqa: E501 - :type page_idx: int - """ - - self._page_idx = page_idx - - @property - def url(self): - """Gets the url of this TransactionImagesFieldValue. # noqa: E501 - - Image url # noqa: E501 - - :return: The url of this TransactionImagesFieldValue. # noqa: E501 - :rtype: str - """ - return self._url - - @url.setter - def url(self, url): - """Sets the url of this TransactionImagesFieldValue. - - Image url # noqa: E501 - - :param url: The url of this TransactionImagesFieldValue. # noqa: E501 - :type url: str - """ - - self._url = url - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionImagesFieldValue): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionImagesFieldValue): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_info.py b/regula/documentreader/webclient/gen/models/transaction_info.py old mode 100755 new mode 100644 index 055f545..62874b7 --- a/regula/documentreader/webclient/gen/models/transaction_info.py +++ b/regula/documentreader/webclient/gen/models/transaction_info.py @@ -4,312 +4,94 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.documents_database import DocumentsDatabase +from typing import Optional, Set +from typing_extensions import Self -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionInfo(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class TransactionInfo(BaseModel): """ + TransactionInfo + """ # noqa: E501 + computer_name: Optional[StrictStr] = Field(default=None, description="Computer name", alias="ComputerName") + date_time: Optional[StrictStr] = Field(default=None, description="Date and time", alias="DateTime") + documents_database: Optional[DocumentsDatabase] = Field(default=None, alias="DocumentsDatabase") + system_info: Optional[StrictStr] = Field(default=None, description="System information", alias="SystemInfo") + tag: Optional[StrictStr] = Field(default=None, description="Transaction tag", alias="Tag") + transaction_id: Optional[StrictStr] = Field(default=None, description="Transaction identifier", alias="TransactionID") + user_name: Optional[StrictStr] = Field(default=None, description="User name", alias="UserName") + version: Optional[StrictStr] = Field(default=None, description="SDK version", alias="Version") + __properties: ClassVar[List[str]] = ["ComputerName", "DateTime", "DocumentsDatabase", "SystemInfo", "Tag", "TransactionID", "UserName", "Version"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionInfo from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of documents_database + if self.documents_database: + _dict['DocumentsDatabase'] = self.documents_database.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionInfo from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ComputerName": obj.get("ComputerName"), + "DateTime": obj.get("DateTime"), + "DocumentsDatabase": DocumentsDatabase.from_dict(obj["DocumentsDatabase"]) if obj.get("DocumentsDatabase") is not None else None, + "SystemInfo": obj.get("SystemInfo"), + "Tag": obj.get("Tag"), + "TransactionID": obj.get("TransactionID"), + "UserName": obj.get("UserName"), + "Version": obj.get("Version") + }) + return _obj - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'computer_name': 'str', - 'date_time': 'str', - 'documents_database': 'DocumentsDatabase', - 'system_info': 'str', - 'tag': 'str', - 'transaction_id': 'str', - 'user_name': 'str', - 'version': 'str' - } - - attribute_map = { - 'computer_name': 'ComputerName', - 'date_time': 'DateTime', - 'documents_database': 'DocumentsDatabase', - 'system_info': 'SystemInfo', - 'tag': 'Tag', - 'transaction_id': 'TransactionID', - 'user_name': 'UserName', - 'version': 'Version' - } - - def __init__(self, computer_name=None, date_time=None, documents_database=None, system_info=None, tag=None, transaction_id=None, user_name=None, version=None, local_vars_configuration=None): # noqa: E501 - """TransactionInfo - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._computer_name = None - self._date_time = None - self._documents_database = None - self._system_info = None - self._tag = None - self._transaction_id = None - self._user_name = None - self._version = None - self.discriminator = None - - if computer_name is not None: - self.computer_name = computer_name - if date_time is not None: - self.date_time = date_time - if documents_database is not None: - self.documents_database = documents_database - if system_info is not None: - self.system_info = system_info - if tag is not None: - self.tag = tag - if transaction_id is not None: - self.transaction_id = transaction_id - if user_name is not None: - self.user_name = user_name - if version is not None: - self.version = version - - @property - def computer_name(self): - """Gets the computer_name of this TransactionInfo. # noqa: E501 - - Computer name # noqa: E501 - - :return: The computer_name of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._computer_name - - @computer_name.setter - def computer_name(self, computer_name): - """Sets the computer_name of this TransactionInfo. - - Computer name # noqa: E501 - - :param computer_name: The computer_name of this TransactionInfo. # noqa: E501 - :type computer_name: str - """ - - self._computer_name = computer_name - - @property - def date_time(self): - """Gets the date_time of this TransactionInfo. # noqa: E501 - - Date and time # noqa: E501 - - :return: The date_time of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._date_time - - @date_time.setter - def date_time(self, date_time): - """Sets the date_time of this TransactionInfo. - - Date and time # noqa: E501 - - :param date_time: The date_time of this TransactionInfo. # noqa: E501 - :type date_time: str - """ - - self._date_time = date_time - - @property - def documents_database(self): - """Gets the documents_database of this TransactionInfo. # noqa: E501 - - - :return: The documents_database of this TransactionInfo. # noqa: E501 - :rtype: DocumentsDatabase - """ - return self._documents_database - - @documents_database.setter - def documents_database(self, documents_database): - """Sets the documents_database of this TransactionInfo. - - - :param documents_database: The documents_database of this TransactionInfo. # noqa: E501 - :type documents_database: DocumentsDatabase - """ - - self._documents_database = documents_database - - @property - def system_info(self): - """Gets the system_info of this TransactionInfo. # noqa: E501 - - System information # noqa: E501 - - :return: The system_info of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._system_info - - @system_info.setter - def system_info(self, system_info): - """Sets the system_info of this TransactionInfo. - - System information # noqa: E501 - - :param system_info: The system_info of this TransactionInfo. # noqa: E501 - :type system_info: str - """ - - self._system_info = system_info - - @property - def tag(self): - """Gets the tag of this TransactionInfo. # noqa: E501 - - Transaction tag # noqa: E501 - - :return: The tag of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._tag - - @tag.setter - def tag(self, tag): - """Sets the tag of this TransactionInfo. - - Transaction tag # noqa: E501 - - :param tag: The tag of this TransactionInfo. # noqa: E501 - :type tag: str - """ - - self._tag = tag - - @property - def transaction_id(self): - """Gets the transaction_id of this TransactionInfo. # noqa: E501 - - Transaction identifier # noqa: E501 - - :return: The transaction_id of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._transaction_id - - @transaction_id.setter - def transaction_id(self, transaction_id): - """Sets the transaction_id of this TransactionInfo. - - Transaction identifier # noqa: E501 - - :param transaction_id: The transaction_id of this TransactionInfo. # noqa: E501 - :type transaction_id: str - """ - - self._transaction_id = transaction_id - - @property - def user_name(self): - """Gets the user_name of this TransactionInfo. # noqa: E501 - - User name # noqa: E501 - - :return: The user_name of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._user_name - - @user_name.setter - def user_name(self, user_name): - """Sets the user_name of this TransactionInfo. - - User name # noqa: E501 - - :param user_name: The user_name of this TransactionInfo. # noqa: E501 - :type user_name: str - """ - - self._user_name = user_name - - @property - def version(self): - """Gets the version of this TransactionInfo. # noqa: E501 - - SDK version # noqa: E501 - - :return: The version of this TransactionInfo. # noqa: E501 - :rtype: str - """ - return self._version - - @version.setter - def version(self, version): - """Sets the version of this TransactionInfo. - - SDK version # noqa: E501 - - :param version: The version of this TransactionInfo. # noqa: E501 - :type version: str - """ - - self._version = version - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionInfo): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionInfo): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_process_get_response.py b/regula/documentreader/webclient/gen/models/transaction_process_get_response.py index ed842b8..ff7db0e 100644 --- a/regula/documentreader/webclient/gen/models/transaction_process_get_response.py +++ b/regula/documentreader/webclient/gen/models/transaction_process_get_response.py @@ -4,194 +4,90 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 +import json -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionProcessGetResponse(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.in_data import InData +from regula.documentreader.webclient.gen.models.out_data import OutData +from typing import Optional, Set +from typing_extensions import Self +class TransactionProcessGetResponse(BaseModel): """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'transaction_id': 'str', - 'tag': 'str', - 'out_data': 'OutData', - 'in_data': 'InData' - } - - attribute_map = { - 'transaction_id': 'transactionId', - 'tag': 'tag', - 'out_data': 'outData', - 'in_data': 'inData' - } - - def __init__(self, transaction_id=None, tag=None, out_data=None, in_data=None, local_vars_configuration=None): # noqa: E501 - """TransactionProcessGetResponse - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._transaction_id = None - self._tag = None - self._out_data = None - self._in_data = None - self.discriminator = None - - if transaction_id is not None: - self.transaction_id = transaction_id - if tag is not None: - self.tag = tag - if out_data is not None: - self.out_data = out_data - if in_data is not None: - self.in_data = in_data - - @property - def transaction_id(self): - """Gets the transaction_id of this TransactionProcessGetResponse. # noqa: E501 - - - :return: The transaction_id of this TransactionProcessGetResponse. # noqa: E501 - :rtype: str - """ - return self._transaction_id - - @transaction_id.setter - def transaction_id(self, transaction_id): - """Sets the transaction_id of this TransactionProcessGetResponse. - - - :param transaction_id: The transaction_id of this TransactionProcessGetResponse. # noqa: E501 - :type transaction_id: str - """ - - self._transaction_id = transaction_id - - @property - def tag(self): - """Gets the tag of this TransactionProcessGetResponse. # noqa: E501 - - - :return: The tag of this TransactionProcessGetResponse. # noqa: E501 - :rtype: str + TransactionProcessGetResponse + """ # noqa: E501 + transaction_id: Optional[StrictStr] = Field(default=None, alias="transactionId") + tag: Optional[StrictStr] = None + out_data: Optional[OutData] = Field(default=None, alias="outData") + in_data: Optional[InData] = Field(default=None, alias="inData") + __properties: ClassVar[List[str]] = ["transactionId", "tag", "outData", "inData"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionProcessGetResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._tag - - @tag.setter - def tag(self, tag): - """Sets the tag of this TransactionProcessGetResponse. - + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of out_data + if self.out_data: + _dict['outData'] = self.out_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of in_data + if self.in_data: + _dict['inData'] = self.in_data.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionProcessGetResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "transactionId": obj.get("transactionId"), + "tag": obj.get("tag"), + "outData": OutData.from_dict(obj["outData"]) if obj.get("outData") is not None else None, + "inData": InData.from_dict(obj["inData"]) if obj.get("inData") is not None else None + }) + return _obj - :param tag: The tag of this TransactionProcessGetResponse. # noqa: E501 - :type tag: str - """ - - self._tag = tag - - @property - def out_data(self): - """Gets the out_data of this TransactionProcessGetResponse. # noqa: E501 - - - :return: The out_data of this TransactionProcessGetResponse. # noqa: E501 - :rtype: OutData - """ - return self._out_data - - @out_data.setter - def out_data(self, out_data): - """Sets the out_data of this TransactionProcessGetResponse. - - - :param out_data: The out_data of this TransactionProcessGetResponse. # noqa: E501 - :type out_data: OutData - """ - - self._out_data = out_data - - @property - def in_data(self): - """Gets the in_data of this TransactionProcessGetResponse. # noqa: E501 - - - :return: The in_data of this TransactionProcessGetResponse. # noqa: E501 - :rtype: InData - """ - return self._in_data - - @in_data.setter - def in_data(self, in_data): - """Sets the in_data of this TransactionProcessGetResponse. - - - :param in_data: The in_data of this TransactionProcessGetResponse. # noqa: E501 - :type in_data: InData - """ - self._in_data = in_data - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionProcessGetResponse): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionProcessGetResponse): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_process_request.py b/regula/documentreader/webclient/gen/models/transaction_process_request.py index 4abdb1d..39a726b 100644 --- a/regula/documentreader/webclient/gen/models/transaction_process_request.py +++ b/regula/documentreader/webclient/gen/models/transaction_process_request.py @@ -4,307 +4,110 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionProcessRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.process_params import ProcessParams +from regula.documentreader.webclient.gen.models.process_request_image import ProcessRequestImage +from regula.documentreader.webclient.gen.models.process_system_info import ProcessSystemInfo +from typing import Optional, Set +from typing_extensions import Self + +class TransactionProcessRequest(BaseModel): """ - openapi_types = { - 'process_param': 'ProcessParams', - 'list': 'list[ProcessRequestImage]', - 'live_portrait': 'str', - 'ext_portrait': 'str', - 'container_list': 'ContainerList', - 'system_info': 'ProcessSystemInfo', - 'pass_back_object': 'dict(str, object)', - 'dtc': 'str' - } - - attribute_map = { - 'process_param': 'processParam', - 'list': 'List', - 'live_portrait': 'livePortrait', - 'ext_portrait': 'extPortrait', - 'container_list': 'ContainerList', - 'system_info': 'systemInfo', - 'pass_back_object': 'passBackObject', - 'dtc': 'dtc' - } - - def __init__(self, process_param=None, list=None, live_portrait=None, ext_portrait=None, container_list=None, system_info=None, pass_back_object=None, dtc=None, local_vars_configuration=None): # noqa: E501 - """TransactionProcessRequest - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._process_param = None - self._list = None - self._live_portrait = None - self._ext_portrait = None - self._container_list = None - self._system_info = None - self._pass_back_object = None - self._dtc = None - self.discriminator = None - - self.process_param = process_param - if list is not None: - self.list = list - if live_portrait is not None: - self.live_portrait = live_portrait - if ext_portrait is not None: - self.ext_portrait = ext_portrait - if container_list is not None: - self.container_list = container_list - if system_info is not None: - self.system_info = system_info - if pass_back_object is not None: - self.pass_back_object = pass_back_object - if dtc is not None: - self.dtc = dtc - - @property - def process_param(self): - """Gets the process_param of this TransactionProcessRequest. # noqa: E501 - - - :return: The process_param of this TransactionProcessRequest. # noqa: E501 - :rtype: ProcessParams - """ - return self._process_param - - @process_param.setter - def process_param(self, process_param): - """Sets the process_param of this TransactionProcessRequest. - - - :param process_param: The process_param of this TransactionProcessRequest. # noqa: E501 - :type process_param: ProcessParams - """ - if self.local_vars_configuration.client_side_validation and process_param is None: # noqa: E501 - raise ValueError("Invalid value for `process_param`, must not be `None`") # noqa: E501 - - self._process_param = process_param - - @property - def list(self): - """Gets the list of this TransactionProcessRequest. # noqa: E501 - - - :return: The list of this TransactionProcessRequest. # noqa: E501 - :rtype: list[ProcessRequestImage] - """ - return self._list - - @list.setter - def list(self, list): - """Sets the list of this TransactionProcessRequest. - - - :param list: The list of this TransactionProcessRequest. # noqa: E501 - :type list: list[ProcessRequestImage] - """ - - self._list = list - - @property - def live_portrait(self): - """Gets the live_portrait of this TransactionProcessRequest. # noqa: E501 - - Live portrait photo # noqa: E501 - - :return: The live_portrait of this TransactionProcessRequest. # noqa: E501 - :rtype: str - """ - return self._live_portrait - - @live_portrait.setter - def live_portrait(self, live_portrait): - """Sets the live_portrait of this TransactionProcessRequest. - - Live portrait photo # noqa: E501 - - :param live_portrait: The live_portrait of this TransactionProcessRequest. # noqa: E501 - :type live_portrait: str - """ - - self._live_portrait = live_portrait - - @property - def ext_portrait(self): - """Gets the ext_portrait of this TransactionProcessRequest. # noqa: E501 - - Portrait photo from an external source # noqa: E501 - - :return: The ext_portrait of this TransactionProcessRequest. # noqa: E501 - :rtype: str - """ - return self._ext_portrait - - @ext_portrait.setter - def ext_portrait(self, ext_portrait): - """Sets the ext_portrait of this TransactionProcessRequest. - - Portrait photo from an external source # noqa: E501 - - :param ext_portrait: The ext_portrait of this TransactionProcessRequest. # noqa: E501 - :type ext_portrait: str - """ - - self._ext_portrait = ext_portrait - - @property - def container_list(self): - """Gets the container_list of this TransactionProcessRequest. # noqa: E501 - - - :return: The container_list of this TransactionProcessRequest. # noqa: E501 - :rtype: ContainerList - """ - return self._container_list - - @container_list.setter - def container_list(self, container_list): - """Sets the container_list of this TransactionProcessRequest. - - - :param container_list: The container_list of this TransactionProcessRequest. # noqa: E501 - :type container_list: ContainerList - """ - - self._container_list = container_list - - @property - def system_info(self): - """Gets the system_info of this TransactionProcessRequest. # noqa: E501 - - - :return: The system_info of this TransactionProcessRequest. # noqa: E501 - :rtype: ProcessSystemInfo - """ - return self._system_info - - @system_info.setter - def system_info(self, system_info): - """Sets the system_info of this TransactionProcessRequest. - - - :param system_info: The system_info of this TransactionProcessRequest. # noqa: E501 - :type system_info: ProcessSystemInfo - """ - - self._system_info = system_info - - @property - def pass_back_object(self): - """Gets the pass_back_object of this TransactionProcessRequest. # noqa: E501 - - Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs. # noqa: E501 - - :return: The pass_back_object of this TransactionProcessRequest. # noqa: E501 - :rtype: dict(str, object) - """ - return self._pass_back_object - - @pass_back_object.setter - def pass_back_object(self, pass_back_object): - """Sets the pass_back_object of this TransactionProcessRequest. - - Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs. # noqa: E501 - - :param pass_back_object: The pass_back_object of this TransactionProcessRequest. # noqa: E501 - :type pass_back_object: dict(str, object) - """ - - self._pass_back_object = pass_back_object - - @property - def dtc(self): - """Gets the dtc of this TransactionProcessRequest. # noqa: E501 - - Digital Travel Credential (DTC-VC) data in base64 format for processing # noqa: E501 - - :return: The dtc of this TransactionProcessRequest. # noqa: E501 - :rtype: str - """ - return self._dtc - - @dtc.setter - def dtc(self, dtc): - """Sets the dtc of this TransactionProcessRequest. - - Digital Travel Credential (DTC-VC) data in base64 format for processing # noqa: E501 - - :param dtc: The dtc of this TransactionProcessRequest. # noqa: E501 - :type dtc: str - """ - - self._dtc = dtc - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionProcessRequest): - return False - - return self.to_dict() == other.to_dict() + TransactionProcessRequest + """ # noqa: E501 + process_param: ProcessParams = Field(alias="processParam") + list: Optional[List[ProcessRequestImage]] = Field(default=None, alias="List") + live_portrait: Optional[StrictStr] = Field(default=None, description="Live portrait photo", alias="livePortrait") + ext_portrait: Optional[StrictStr] = Field(default=None, description="Portrait photo from an external source", alias="extPortrait") + container_list: Optional[ContainerList] = Field(default=None, alias="ContainerList") + system_info: Optional[ProcessSystemInfo] = Field(default=None, alias="systemInfo") + pass_back_object: Optional[Dict[str, Any]] = Field(default=None, description="Free-form object to be included in response. Must be object, not list or simple value. Do not affect document processing. Use it freely to pass your app params. Stored in process logs.", alias="passBackObject") + dtc: Optional[StrictStr] = Field(default=None, description="Digital Travel Credential (DTC-VC) data in base64 format for processing") + __properties: ClassVar[List[str]] = ["processParam", "List", "livePortrait", "extPortrait", "ContainerList", "systemInfo", "passBackObject", "dtc"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionProcessRequest from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of process_param + if self.process_param: + _dict['processParam'] = self.process_param.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in list (list) + _items = [] + if self.list: + for _item_list in self.list: + if _item_list: + _items.append(_item_list.to_dict()) + _dict['List'] = _items + # override the default output from pydantic by calling `to_dict()` of container_list + if self.container_list: + _dict['ContainerList'] = self.container_list.to_dict() + # override the default output from pydantic by calling `to_dict()` of system_info + if self.system_info: + _dict['systemInfo'] = self.system_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionProcessRequest from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "processParam": ProcessParams.from_dict(obj["processParam"]) if obj.get("processParam") is not None else None, + "List": [ProcessRequestImage.from_dict(_item) for _item in obj["List"]] if obj.get("List") is not None else None, + "livePortrait": obj.get("livePortrait"), + "extPortrait": obj.get("extPortrait"), + "ContainerList": ContainerList.from_dict(obj["ContainerList"]) if obj.get("ContainerList") is not None else None, + "systemInfo": ProcessSystemInfo.from_dict(obj["systemInfo"]) if obj.get("systemInfo") is not None else None, + "passBackObject": obj.get("passBackObject"), + "dtc": obj.get("dtc") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionProcessRequest): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/transaction_process_response.py b/regula/documentreader/webclient/gen/models/transaction_process_response.py new file mode 100644 index 0000000..0bec62b --- /dev/null +++ b/regula/documentreader/webclient/gen/models/transaction_process_response.py @@ -0,0 +1,107 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.container_list import ContainerList +from regula.documentreader.webclient.gen.models.processing_status import ProcessingStatus +from regula.documentreader.webclient.gen.models.rfid_location import RfidLocation +from regula.documentreader.webclient.gen.models.transaction_info import TransactionInfo +from typing import Optional, Set +from typing_extensions import Self + +class TransactionProcessResponse(BaseModel): + """ + TransactionProcessResponse + """ # noqa: E501 + chip_page: RfidLocation = Field(alias="ChipPage") + core_lib_result_code: StrictInt = Field(alias="CoreLibResultCode") + processing_finished: ProcessingStatus = Field(alias="ProcessingFinished") + container_list: ContainerList = Field(alias="ContainerList") + transaction_info: TransactionInfo = Field(alias="TransactionInfo") + log: Optional[StrictStr] = Field(default=None, description="Base64 encoded transaction processing log") + pass_back_object: Optional[Dict[str, Any]] = Field(default=None, description="Free-form object provided in request. See passBackObject property of ProcessRequest.", alias="passBackObject") + more_pages_available: StrictInt = Field(alias="morePagesAvailable") + elapsed_time: StrictInt = Field(description="Time the document processing has taken, ms.", alias="elapsedTime") + metadata: Optional[Dict[str, Any]] = None + __properties: ClassVar[List[str]] = ["ChipPage", "CoreLibResultCode", "ProcessingFinished", "ContainerList", "TransactionInfo", "log", "passBackObject", "morePagesAvailable", "elapsedTime", "metadata"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionProcessResponse from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of container_list + if self.container_list: + _dict['ContainerList'] = self.container_list.to_dict() + # override the default output from pydantic by calling `to_dict()` of transaction_info + if self.transaction_info: + _dict['TransactionInfo'] = self.transaction_info.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionProcessResponse from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "ChipPage": obj.get("ChipPage"), + "CoreLibResultCode": obj.get("CoreLibResultCode"), + "ProcessingFinished": obj.get("ProcessingFinished"), + "ContainerList": ContainerList.from_dict(obj["ContainerList"]) if obj.get("ContainerList") is not None else None, + "TransactionInfo": TransactionInfo.from_dict(obj["TransactionInfo"]) if obj.get("TransactionInfo") is not None else None, + "log": obj.get("log"), + "passBackObject": obj.get("passBackObject"), + "morePagesAvailable": obj.get("morePagesAvailable"), + "elapsedTime": obj.get("elapsedTime"), + "metadata": obj.get("metadata") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/transaction_process_response_item.py b/regula/documentreader/webclient/gen/models/transaction_process_response_item.py new file mode 100644 index 0000000..dc7aae0 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/transaction_process_response_item.py @@ -0,0 +1,79 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt +from typing import Any, ClassVar, Dict, List +from typing import Optional, Set +from typing_extensions import Self + +class TransactionProcessResponseItem(BaseModel): + """ + TransactionProcessResponseItem + """ # noqa: E501 + core_lib_result_code: StrictInt = Field(alias="CoreLibResultCode") + __properties: ClassVar[List[str]] = ["CoreLibResultCode"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionProcessResponseItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionProcessResponseItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "CoreLibResultCode": obj.get("CoreLibResultCode") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/transaction_process_result.py b/regula/documentreader/webclient/gen/models/transaction_process_result.py new file mode 100644 index 0000000..2175a26 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/transaction_process_result.py @@ -0,0 +1,93 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from regula.documentreader.webclient.gen.models.in_data import InData +from regula.documentreader.webclient.gen.models.out_data import OutData +from typing import Optional, Set +from typing_extensions import Self + +class TransactionProcessResult(BaseModel): + """ + TransactionProcessResult + """ # noqa: E501 + out_data: Optional[OutData] = Field(default=None, alias="OutData") + in_data: Optional[InData] = Field(default=None, alias="InData") + tag: Optional[StrictStr] = None + transaction_id: Optional[StrictStr] = Field(default=None, alias="transactionId") + __properties: ClassVar[List[str]] = ["OutData", "InData", "tag", "transactionId"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TransactionProcessResult from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of out_data + if self.out_data: + _dict['OutData'] = self.out_data.to_dict() + # override the default output from pydantic by calling `to_dict()` of in_data + if self.in_data: + _dict['InData'] = self.in_data.to_dict() + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TransactionProcessResult from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "OutData": OutData.from_dict(obj["OutData"]) if obj.get("OutData") is not None else None, + "InData": InData.from_dict(obj["InData"]) if obj.get("InData") is not None else None, + "tag": obj.get("tag"), + "transactionId": obj.get("transactionId") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/transaction_scenario_request.py b/regula/documentreader/webclient/gen/models/transaction_scenario_request.py deleted file mode 100644 index 4dc3565..0000000 --- a/regula/documentreader/webclient/gen/models/transaction_scenario_request.py +++ /dev/null @@ -1,119 +0,0 @@ -# coding: utf-8 - -""" - Generated by: https://openapi-generator.tech -""" - -import pprint -import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class TransactionScenarioRequest(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. - """ - openapi_types = { - 'scenario': 'Scenario' - } - - attribute_map = { - 'scenario': 'scenario' - } - - def __init__(self, scenario=None, local_vars_configuration=None): # noqa: E501 - """TransactionScenarioRequest - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._scenario = None - self.discriminator = None - - if scenario is not None: - self.scenario = scenario - - @property - def scenario(self): - """Gets the scenario of this TransactionScenarioRequest. # noqa: E501 - - - :return: The scenario of this TransactionScenarioRequest. # noqa: E501 - :rtype: Scenario - """ - return self._scenario - - @scenario.setter - def scenario(self, scenario): - """Sets the scenario of this TransactionScenarioRequest. - - - :param scenario: The scenario of this TransactionScenarioRequest. # noqa: E501 - :type scenario: Scenario - """ - - self._scenario = scenario - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, TransactionScenarioRequest): - return False - - return self.to_dict() == other.to_dict() - - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, TransactionScenarioRequest): - return True - - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/trf_ft_bytes.py b/regula/documentreader/webclient/gen/models/trf_ft_bytes.py new file mode 100644 index 0000000..b25e14f --- /dev/null +++ b/regula/documentreader/webclient/gen/models/trf_ft_bytes.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing import Optional, Set +from typing_extensions import Self + +class TrfFtBytes(BaseModel): + """ + Structure is used to store an array of binary information that is a part of one of the informational data groups + """ # noqa: E501 + type: StrictInt = Field(description="Logical type of the field", alias="Type") + status: Union[StrictFloat, StrictInt] = Field(description="Result of logical analysis of compliance of the contents of the field with the requirements of the specification", alias="Status") + length: Union[StrictFloat, StrictInt] = Field(description="Length of Data array", alias="Length") + data: Optional[StrictStr] = Field(description="Binary data array. Base64 encoded.", alias="Data") + __properties: ClassVar[List[str]] = ["Type", "Status", "Length", "Data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TrfFtBytes from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # set to None if data (nullable) is None + # and model_fields_set contains the field + if self.data is None and "data" in self.model_fields_set: + _dict['Data'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TrfFtBytes from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Status": obj.get("Status"), + "Length": obj.get("Length"), + "Data": obj.get("Data") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/trf_ft_string.py b/regula/documentreader/webclient/gen/models/trf_ft_string.py new file mode 100644 index 0000000..01cfd9a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/trf_ft_string.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing import Optional, Set +from typing_extensions import Self + +class TrfFtString(BaseModel): + """ + Structure is used to store information about the numeric field (4 bytes) that is a part of one of the informational data groups. + """ # noqa: E501 + type: Optional[StrictInt] = Field(default=None, alias="Type") + status: Optional[StrictInt] = Field(default=None, description="Result of logical analysis of compliance of the contents of the field with the requirements of the specification", alias="Status") + format: Optional[StrictStr] = Field(default=None, description="Mask of format of text information (for example, «YYMMDD» for date of birth)", alias="Format") + data: StrictStr = Field(description="Numeric value.", alias="Data") + __properties: ClassVar[List[str]] = ["Type", "Status", "Format", "Data"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of TrfFtString from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of TrfFtString from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "Type": obj.get("Type"), + "Status": obj.get("Status"), + "Format": obj.get("Format"), + "Data": obj.get("Data") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/models/verification_result.py b/regula/documentreader/webclient/gen/models/verification_result.py old mode 100755 new mode 100644 index 3192e82..3c632ff --- a/regula/documentreader/webclient/gen/models/verification_result.py +++ b/regula/documentreader/webclient/gen/models/verification_result.py @@ -4,100 +4,29 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class VerificationResult(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class VerificationResult(int, Enum): + """ + VerificationResult """ - - DISABLED = int("0") - - VERIFIED = int("1") - - NOT_VERIFIED = int("2") - - COMPARE_MATCH = int("3") - - COMPARE_NOT_MATCH = int("4") - - allowable_values = [DISABLED, VERIFIED, NOT_VERIFIED, COMPARE_MATCH, COMPARE_NOT_MATCH] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """VerificationResult - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, VerificationResult): - return False + DISABLED = 0 + VERIFIED = 1 + NOT_VERIFIED = 2 + COMPARE_MATCH = 3 + COMPARE_NOT_MATCH = 4 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of VerificationResult from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, VerificationResult): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/verified_field_map.py b/regula/documentreader/webclient/gen/models/verified_field_map.py old mode 100755 new mode 100644 index 6ec5ad7..c5b1b24 --- a/regula/documentreader/webclient/gen/models/verified_field_map.py +++ b/regula/documentreader/webclient/gen/models/verified_field_map.py @@ -4,282 +4,94 @@ Generated by: https://openapi-generator.tech """ +from __future__ import annotations import pprint import re # noqa: F401 - -import six - -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" - -""" -class VerifiedFieldMap(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. - """ - - """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional +from typing_extensions import Annotated +from regula.documentreader.webclient.gen.models.lcid import LCID +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from regula.documentreader.webclient.gen.models.verification_result import VerificationResult +from typing import Optional, Set +from typing_extensions import Self + +class VerifiedFieldMap(BaseModel): """ - openapi_types = { - 'w_field_type': 'TextFieldType', - 'w_lcid': 'LCID', - 'field_mrz': 'str', - 'field_visual': 'str', - 'field_barcode': 'str', - 'field_rfid': 'str', - 'matrix': 'list[VerificationResult]' - } - - attribute_map = { - 'w_field_type': 'wFieldType', - 'w_lcid': 'wLCID', - 'field_mrz': 'Field_MRZ', - 'field_visual': 'Field_Visual', - 'field_barcode': 'Field_Barcode', - 'field_rfid': 'Field_RFID', - 'matrix': 'Matrix' - } - - def __init__(self, w_field_type=None, w_lcid=None, field_mrz=None, field_visual=None, field_barcode=None, field_rfid=None, matrix=None, local_vars_configuration=None): # noqa: E501 - """VerifiedFieldMap - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - - self._w_field_type = None - self._w_lcid = None - self._field_mrz = None - self._field_visual = None - self._field_barcode = None - self._field_rfid = None - self._matrix = None - self.discriminator = None - - if w_field_type is not None: - self.w_field_type = w_field_type - if w_lcid is not None: - self.w_lcid = w_lcid - if field_mrz is not None: - self.field_mrz = field_mrz - if field_visual is not None: - self.field_visual = field_visual - if field_barcode is not None: - self.field_barcode = field_barcode - if field_rfid is not None: - self.field_rfid = field_rfid - if matrix is not None: - self.matrix = matrix - - @property - def w_field_type(self): - """Gets the w_field_type of this VerifiedFieldMap. # noqa: E501 - - - :return: The w_field_type of this VerifiedFieldMap. # noqa: E501 - :rtype: TextFieldType - """ - return self._w_field_type - - @w_field_type.setter - def w_field_type(self, w_field_type): - """Sets the w_field_type of this VerifiedFieldMap. - - - :param w_field_type: The w_field_type of this VerifiedFieldMap. # noqa: E501 - :type w_field_type: TextFieldType - """ - - self._w_field_type = w_field_type - - @property - def w_lcid(self): - """Gets the w_lcid of this VerifiedFieldMap. # noqa: E501 - - - :return: The w_lcid of this VerifiedFieldMap. # noqa: E501 - :rtype: LCID - """ - return self._w_lcid - - @w_lcid.setter - def w_lcid(self, w_lcid): - """Sets the w_lcid of this VerifiedFieldMap. - - - :param w_lcid: The w_lcid of this VerifiedFieldMap. # noqa: E501 - :type w_lcid: LCID - """ - - self._w_lcid = w_lcid - - @property - def field_mrz(self): - """Gets the field_mrz of this VerifiedFieldMap. # noqa: E501 - - Field data extracted from mrz(machine readable zone) # noqa: E501 - - :return: The field_mrz of this VerifiedFieldMap. # noqa: E501 - :rtype: str - """ - return self._field_mrz - - @field_mrz.setter - def field_mrz(self, field_mrz): - """Sets the field_mrz of this VerifiedFieldMap. - - Field data extracted from mrz(machine readable zone) # noqa: E501 - - :param field_mrz: The field_mrz of this VerifiedFieldMap. # noqa: E501 - :type field_mrz: str - """ - - self._field_mrz = field_mrz - - @property - def field_visual(self): - """Gets the field_visual of this VerifiedFieldMap. # noqa: E501 - - Field data extracted from visual zone # noqa: E501 - - :return: The field_visual of this VerifiedFieldMap. # noqa: E501 - :rtype: str - """ - return self._field_visual - - @field_visual.setter - def field_visual(self, field_visual): - """Sets the field_visual of this VerifiedFieldMap. - - Field data extracted from visual zone # noqa: E501 - - :param field_visual: The field_visual of this VerifiedFieldMap. # noqa: E501 - :type field_visual: str - """ - - self._field_visual = field_visual - - @property - def field_barcode(self): - """Gets the field_barcode of this VerifiedFieldMap. # noqa: E501 - - Field data extracted from barcode # noqa: E501 - - :return: The field_barcode of this VerifiedFieldMap. # noqa: E501 - :rtype: str - """ - return self._field_barcode - - @field_barcode.setter - def field_barcode(self, field_barcode): - """Sets the field_barcode of this VerifiedFieldMap. - - Field data extracted from barcode # noqa: E501 - - :param field_barcode: The field_barcode of this VerifiedFieldMap. # noqa: E501 - :type field_barcode: str - """ - - self._field_barcode = field_barcode - - @property - def field_rfid(self): - """Gets the field_rfid of this VerifiedFieldMap. # noqa: E501 - - Field data extracted from rfid chip # noqa: E501 - - :return: The field_rfid of this VerifiedFieldMap. # noqa: E501 - :rtype: str + VerifiedFieldMap + """ # noqa: E501 + w_field_type: TextFieldType = Field(alias="wFieldType") + w_lcid: LCID = Field(alias="wLCID") + field_mrz: Optional[StrictStr] = Field(default=None, description="Field data extracted from mrz(machine readable zone)", alias="Field_MRZ") + field_visual: Optional[StrictStr] = Field(default=None, description="Field data extracted from visual zone", alias="Field_Visual") + field_barcode: Optional[StrictStr] = Field(default=None, description="Field data extracted from barcode", alias="Field_Barcode") + field_rfid: Optional[StrictStr] = Field(default=None, description="Field data extracted from rfid chip", alias="Field_RFID") + matrix: Annotated[List[VerificationResult], Field(min_length=10, max_length=10)] = Field(description="results comparison matrix. Elements of the matrix with indices 0, 1, 2, 3 take one of the values Disabled(0), Verified(1) or Not_Verified(2), elements with indices 4, 5, 6, 7, 8 are one of the values Disabled(0), Compare_Match(3) or Compare_Not_Match(4). Elements of the Matrix matrix have the following semantic meaning: - element with index 0 –– the result of verification of data from the MRZ; - 1 –– the result of verification of data from the RFID microcircuit; - 2 –– the result of verification of data from text areas of the document; - 3 –– the result of verification data from barcodes; - 4 - the result of comparing MRZ data and RFID microcircuits; - 5 - the result of comparing MRZ data and text areas of document filling; - 6 - the result of comparing MRZ data and bar codes; - 7 - the result of comparing the data of text areas of the document and the RFID chip; - 8 - the result of comparing the data of the text areas of the document and barcodes; - 9 - the result of comparing the data of the RFID chip and barcodes.", alias="Matrix") + field_type: Optional[StrictInt] = Field(default=None, alias="FieldType") + __properties: ClassVar[List[str]] = ["wFieldType", "wLCID", "Field_MRZ", "Field_Visual", "Field_Barcode", "Field_RFID", "Matrix", "FieldType"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of VerifiedFieldMap from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. """ - return self._field_rfid - - @field_rfid.setter - def field_rfid(self, field_rfid): - """Sets the field_rfid of this VerifiedFieldMap. - - Field data extracted from rfid chip # noqa: E501 - - :param field_rfid: The field_rfid of this VerifiedFieldMap. # noqa: E501 - :type field_rfid: str - """ - - self._field_rfid = field_rfid - - @property - def matrix(self): - """Gets the matrix of this VerifiedFieldMap. # noqa: E501 - - results comparison matrix. Elements of the matrix with indices 0, 1, 2, 3 take one of the values Disabled(0), Verified(1) or Not_Verified(2), elements with indices 4, 5, 6, 7, 8 are one of the values Disabled(0), Compare_Match(3) or Compare_Not_Match(4). Elements of the Matrix matrix have the following semantic meaning: - element with index 0 –– the result of verification of data from the MRZ; - 1 –– the result of verification of data from the RFID microcircuit; - 2 –– the result of verification of data from text areas of the document; - 3 –– the result of verification data from barcodes; - 4 - the result of comparing MRZ data and RFID microcircuits; - 5 - the result of comparing MRZ data and text areas of document filling; - 6 - the result of comparing MRZ data and bar codes; - 7 - the result of comparing the data of text areas of the document and the RFID chip; - 8 - the result of comparing the data of the text areas of the document and barcodes; - 9 - the result of comparing the data of the RFID chip and barcodes. # noqa: E501 - - :return: The matrix of this VerifiedFieldMap. # noqa: E501 - :rtype: list[VerificationResult] - """ - return self._matrix - - @matrix.setter - def matrix(self, matrix): - """Sets the matrix of this VerifiedFieldMap. - - results comparison matrix. Elements of the matrix with indices 0, 1, 2, 3 take one of the values Disabled(0), Verified(1) or Not_Verified(2), elements with indices 4, 5, 6, 7, 8 are one of the values Disabled(0), Compare_Match(3) or Compare_Not_Match(4). Elements of the Matrix matrix have the following semantic meaning: - element with index 0 –– the result of verification of data from the MRZ; - 1 –– the result of verification of data from the RFID microcircuit; - 2 –– the result of verification of data from text areas of the document; - 3 –– the result of verification data from barcodes; - 4 - the result of comparing MRZ data and RFID microcircuits; - 5 - the result of comparing MRZ data and text areas of document filling; - 6 - the result of comparing MRZ data and bar codes; - 7 - the result of comparing the data of text areas of the document and the RFID chip; - 8 - the result of comparing the data of the text areas of the document and barcodes; - 9 - the result of comparing the data of the RFID chip and barcodes. # noqa: E501 - - :param matrix: The matrix of this VerifiedFieldMap. # noqa: E501 - :type matrix: list[VerificationResult] - """ - - self._matrix = matrix - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, VerifiedFieldMap): - return False - - return self.to_dict() == other.to_dict() + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of VerifiedFieldMap from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "wFieldType": obj.get("wFieldType"), + "wLCID": obj.get("wLCID"), + "Field_MRZ": obj.get("Field_MRZ"), + "Field_Visual": obj.get("Field_Visual"), + "Field_Barcode": obj.get("Field_Barcode"), + "Field_RFID": obj.get("Field_RFID"), + "Matrix": obj.get("Matrix"), + "FieldType": obj.get("FieldType") + }) + return _obj - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, VerifiedFieldMap): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/visibility.py b/regula/documentreader/webclient/gen/models/visibility.py index 2e2267e..fe9bbcb 100644 --- a/regula/documentreader/webclient/gen/models/visibility.py +++ b/regula/documentreader/webclient/gen/models/visibility.py @@ -4,100 +4,29 @@ Generated by: https://openapi-generator.tech """ -import pprint -import re # noqa: F401 +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self -import six -from regula.documentreader.webclient.gen.configuration import Configuration -# this line was added to enable pycharm type hinting -from regula.documentreader.webclient.gen.models import * - - -""" -Enumeration contains visibility status of the security element -""" -class Visibility(object): - """NOTE: This class is auto generated by OpenAPI Generator. - Ref: https://openapi-generator.tech - - Do not edit the class manually. +class Visibility(int, Enum): + """ + Enumeration contains visibility status of the security element """ - - INVISIBLE = int("0") - - VISIBLE = int("1") - - COLORED = int("2") - - GRAYSCALE = int("4") - - WHITE_IR_MATCHING = int("8") - - allowable_values = [INVISIBLE, VISIBLE, COLORED, GRAYSCALE, WHITE_IR_MATCHING] # noqa: E501 """ - Attributes: - openapi_types (dict): The key is attribute name - and the value is attribute type. - attribute_map (dict): The key is attribute name - and the value is json key in definition. + allowed enum values """ - openapi_types = { - } - - attribute_map = { - } - - def __init__(self, local_vars_configuration=None): # noqa: E501 - """Visibility - a model defined in OpenAPI""" # noqa: E501 - if local_vars_configuration is None: - local_vars_configuration = Configuration() - self.local_vars_configuration = local_vars_configuration - self.discriminator = None - - def to_dict(self): - """Returns the model properties as a dict""" - result = {} - - for attr, _ in six.iteritems(self.openapi_types): - value = getattr(self, attr) - if isinstance(value, list): - result[attr] = list(map( - lambda x: x.to_dict() if hasattr(x, "to_dict") else x, - value - )) - elif hasattr(value, "to_dict"): - result[attr] = value.to_dict() - elif isinstance(value, dict): - result[attr] = dict(map( - lambda item: (item[0], item[1].to_dict()) - if hasattr(item[1], "to_dict") else item, - value.items() - )) - else: - result[attr] = value - - return result - - def to_str(self): - """Returns the string representation of the model""" - return pprint.pformat(self.to_dict()) - - def __repr__(self): - """For `print` and `pprint`""" - return self.to_str() - - def __eq__(self, other): - """Returns true if both objects are equal""" - if not isinstance(other, Visibility): - return False + INVISIBLE = 0 + VISIBLE = 1 + COLORED = 2 + GRAYSCALE = 4 + WHITE_IR_MATCHING = 8 - return self.to_dict() == other.to_dict() + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of Visibility from a JSON string""" + return cls(json.loads(json_str)) - def __ne__(self, other): - """Returns true if both objects are not equal""" - if not isinstance(other, Visibility): - return True - return self.to_dict() != other.to_dict() diff --git a/regula/documentreader/webclient/gen/models/visual_extended_field_item.py b/regula/documentreader/webclient/gen/models/visual_extended_field_item.py new file mode 100644 index 0000000..c8b48e8 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/visual_extended_field_item.py @@ -0,0 +1,112 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr +from typing import Any, ClassVar, Dict, List, Optional, Union +from regula.documentreader.webclient.gen.models.string_recognition_result import StringRecognitionResult +from regula.documentreader.webclient.gen.models.text_field_type import TextFieldType +from typing import Optional, Set +from typing_extensions import Self + +class VisualExtendedFieldItem(BaseModel): + """ + VisualExtendedFieldItem + """ # noqa: E501 + field_type: StrictInt = Field(alias="FieldType") + w_field_type: TextFieldType = Field(alias="wFieldType") + field_name: StrictStr = Field(description="Field symbolic name (null-terminated string)", alias="FieldName") + strings_count: Union[StrictFloat, StrictInt] = Field(description="Number of StringsResult array elements", alias="StringsCount") + strings_result: List[StringRecognitionResult] = Field(description="Array of recognizing probabilities for a each line of text field. Only for Result.VISUAL_TEXT and Result.MRZ_TEXT results.", alias="StringsResult") + buf_length: Union[StrictFloat, StrictInt] = Field(description="Buf_Text text string length", alias="Buf_Length") + buf_text: StrictStr = Field(description="Text field data in UTF8 format. Results of reading different lines of a multi-line field are separated by '^'", alias="Buf_Text") + field_mask: Optional[StrictStr] = Field(default=None, alias="FieldMask") + validity: Optional[StrictInt] = Field(default=None, alias="Validity") + in_comparison: Optional[StrictInt] = Field(default=None, alias="InComparison") + w_lcid: Optional[StrictInt] = Field(default=None, alias="wLCID") + reserved2: Optional[StrictInt] = Field(default=None, alias="Reserved2") + reserved3: Optional[StrictInt] = Field(default=None, alias="Reserved3") + __properties: ClassVar[List[str]] = ["FieldType", "wFieldType", "FieldName", "StringsCount", "StringsResult", "Buf_Length", "Buf_Text", "FieldMask", "Validity", "InComparison", "wLCID", "Reserved2", "Reserved3"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of VisualExtendedFieldItem from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + # override the default output from pydantic by calling `to_dict()` of each item in strings_result (list) + _items = [] + if self.strings_result: + for _item_strings_result in self.strings_result: + if _item_strings_result: + _items.append(_item_strings_result.to_dict()) + _dict['StringsResult'] = _items + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of VisualExtendedFieldItem from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "FieldType": obj.get("FieldType"), + "wFieldType": obj.get("wFieldType"), + "FieldName": obj.get("FieldName"), + "StringsCount": obj.get("StringsCount"), + "StringsResult": [StringRecognitionResult.from_dict(_item) for _item in obj["StringsResult"]] if obj.get("StringsResult") is not None else None, + "Buf_Length": obj.get("Buf_Length"), + "Buf_Text": obj.get("Buf_Text"), + "FieldMask": obj.get("FieldMask"), + "Validity": obj.get("Validity"), + "InComparison": obj.get("InComparison"), + "wLCID": obj.get("wLCID"), + "Reserved2": obj.get("Reserved2"), + "Reserved3": obj.get("Reserved3") + }) + return _obj + + diff --git a/regula/documentreader/webclient/gen/py.typed b/regula/documentreader/webclient/gen/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/regula/documentreader/webclient/gen/rest.py b/regula/documentreader/webclient/gen/rest.py old mode 100755 new mode 100644 index bbb1342..0ba96c9 --- a/regula/documentreader/webclient/gen/rest.py +++ b/regula/documentreader/webclient/gen/rest.py @@ -4,49 +4,57 @@ Generated by: https://openapi-generator.tech """ -from __future__ import absolute_import - import io import json -import logging import re import ssl -# python 2 and python 3 compatibility library -import six -from six.moves.urllib.parse import urlencode import urllib3 -from regula.documentreader.webclient.gen.exceptions import ApiException, UnauthorizedException, ForbiddenException, NotFoundException, ServiceException, ApiValueError +from regula.documentreader.webclient.gen.exceptions import ApiException, ApiValueError + +SUPPORTED_SOCKS_PROXIES = {"socks5", "socks5h", "socks4", "socks4a"} +RESTResponseType = urllib3.HTTPResponse -logger = logging.getLogger(__name__) +def is_socks_proxy_url(url): + if url is None: + return False + split_section = url.split("://") + if len(split_section) < 2: + return False + else: + return split_section[0].lower() in SUPPORTED_SOCKS_PROXIES class RESTResponse(io.IOBase): - def __init__(self, resp): - self.urllib3_response = resp + def __init__(self, resp) -> None: + self.response = resp self.status = resp.status self.reason = resp.reason - self.data = resp.data + self.data = None + + def read(self): + if self.data is None: + self.data = self.response.data + return self.data def getheaders(self): """Returns a dictionary of the response headers.""" - return self.urllib3_response.getheaders() + return self.response.headers def getheader(self, name, default=None): """Returns a given response header.""" - return self.urllib3_response.getheader(name, default) + return self.response.headers.get(name, default) -class RESTClientObject(object): +class RESTClientObject: - def __init__(self, configuration, pools_size=4, maxsize=None): + def __init__(self, configuration) -> None: # urllib3.PoolManager will pass all kw parameters to connectionpool # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75 # noqa: E501 # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680 # noqa: E501 - # maxsize is the number of requests to host that are allowed in parallel # noqa: E501 # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html # noqa: E501 # cert_reqs @@ -55,70 +63,80 @@ def __init__(self, configuration, pools_size=4, maxsize=None): else: cert_reqs = ssl.CERT_NONE - addition_pool_args = {} + pool_args = { + "cert_reqs": cert_reqs, + "ca_certs": configuration.ssl_ca_cert, + "cert_file": configuration.cert_file, + "key_file": configuration.key_file, + "ca_cert_data": configuration.ca_cert_data, + } if configuration.assert_hostname is not None: - addition_pool_args['assert_hostname'] = configuration.assert_hostname # noqa: E501 + pool_args['assert_hostname'] = ( + configuration.assert_hostname + ) if configuration.retries is not None: - addition_pool_args['retries'] = configuration.retries + pool_args['retries'] = configuration.retries + + if configuration.tls_server_name: + pool_args['server_hostname'] = configuration.tls_server_name + if configuration.socket_options is not None: - addition_pool_args['socket_options'] = configuration.socket_options + pool_args['socket_options'] = configuration.socket_options - if maxsize is None: - if configuration.connection_pool_maxsize is not None: - maxsize = configuration.connection_pool_maxsize - else: - maxsize = 4 + if configuration.connection_pool_maxsize is not None: + pool_args['maxsize'] = configuration.connection_pool_maxsize # https pool manager + self.pool_manager: urllib3.PoolManager + if configuration.proxy: - self.pool_manager = urllib3.ProxyManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=configuration.ssl_ca_cert, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - proxy_url=configuration.proxy, - proxy_headers=configuration.proxy_headers, - **addition_pool_args - ) + if is_socks_proxy_url(configuration.proxy): + from urllib3.contrib.socks import SOCKSProxyManager + pool_args["proxy_url"] = configuration.proxy + pool_args["headers"] = configuration.proxy_headers + self.pool_manager = SOCKSProxyManager(**pool_args) + else: + pool_args["proxy_url"] = configuration.proxy + pool_args["proxy_headers"] = configuration.proxy_headers + self.pool_manager = urllib3.ProxyManager(**pool_args) else: - self.pool_manager = urllib3.PoolManager( - num_pools=pools_size, - maxsize=maxsize, - cert_reqs=cert_reqs, - ca_certs=configuration.ssl_ca_cert, - cert_file=configuration.cert_file, - key_file=configuration.key_file, - **addition_pool_args - ) - - def request(self, method, url, query_params=None, headers=None, - body=None, post_params=None, _preload_content=True, - _request_timeout=None): + self.pool_manager = urllib3.PoolManager(**pool_args) + + def request( + self, + method, + url, + headers=None, + body=None, + post_params=None, + _request_timeout=None + ): """Perform requests. :param method: http request method :param url: http request url - :param query_params: query parameters in the url :param headers: http request headers :param body: request json body, for `application/json` :param post_params: request post parameters, `application/x-www-form-urlencoded` and `multipart/form-data` - :param _preload_content: if False, the urllib3.HTTPResponse object will - be returned without reading/decoding response - data. Default is True. :param _request_timeout: timeout setting for this request. If one number provided, it will be total request timeout. It can also be a pair (tuple) of (connection, read) timeouts. """ method = method.upper() - assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT', - 'PATCH', 'OPTIONS'] + assert method in [ + 'GET', + 'HEAD', + 'DELETE', + 'POST', + 'PUT', + 'PATCH', + 'OPTIONS' + ] if post_params and body: raise ApiValueError( @@ -130,60 +148,83 @@ def request(self, method, url, query_params=None, headers=None, timeout = None if _request_timeout: - if isinstance(_request_timeout, six.integer_types + (float, )): # noqa: E501,F821 + if isinstance(_request_timeout, (int, float)): timeout = urllib3.Timeout(total=_request_timeout) - elif (isinstance(_request_timeout, tuple) and - len(_request_timeout) == 2): + elif ( + isinstance(_request_timeout, tuple) + and len(_request_timeout) == 2 + ): timeout = urllib3.Timeout( - connect=_request_timeout[0], read=_request_timeout[1]) - - if 'Content-Type' not in headers: - headers['Content-Type'] = 'application/json' + connect=_request_timeout[0], + read=_request_timeout[1] + ) try: # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE` if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: - if query_params: - url += '?' + urlencode(query_params) - if re.search('json', headers['Content-Type'], re.IGNORECASE): + + # no content type provided or payload is json + content_type = headers.get('Content-Type') + if ( + not content_type + or re.search('json', content_type, re.IGNORECASE) + ): request_body = None if body is not None: request_body = json.dumps(body) r = self.pool_manager.request( - method, url, + method, + url, body=request_body, - preload_content=_preload_content, timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'application/x-www-form-urlencoded': # noqa: E501 + headers=headers, + preload_content=False + ) + elif content_type == 'application/x-www-form-urlencoded': r = self.pool_manager.request( - method, url, + method, + url, fields=post_params, encode_multipart=False, - preload_content=_preload_content, timeout=timeout, - headers=headers) - elif headers['Content-Type'] == 'multipart/form-data': + headers=headers, + preload_content=False + ) + elif content_type == 'multipart/form-data': # must del headers['Content-Type'], or the correct # Content-Type which generated by urllib3 will be # overwritten. del headers['Content-Type'] + # Ensures that dict objects are serialized + post_params = [(a, json.dumps(b)) if isinstance(b, dict) else (a,b) for a, b in post_params] r = self.pool_manager.request( - method, url, + method, + url, fields=post_params, encode_multipart=True, - preload_content=_preload_content, timeout=timeout, - headers=headers) + headers=headers, + preload_content=False + ) # Pass a `string` parameter directly in the body to support - # other content types than Json when `body` argument is - # provided in serialized form + # other content types than JSON when `body` argument is + # provided in serialized form. elif isinstance(body, str) or isinstance(body, bytes): - request_body = body r = self.pool_manager.request( - method, url, + method, + url, + body=body, + timeout=timeout, + headers=headers, + preload_content=False + ) + elif headers['Content-Type'].startswith('text/') and isinstance(body, bool): + request_body = "true" if body else "false" + r = self.pool_manager.request( + method, + url, body=request_body, - preload_content=_preload_content, + preload_content=False, timeout=timeout, headers=headers) else: @@ -194,99 +235,16 @@ def request(self, method, url, query_params=None, headers=None, raise ApiException(status=0, reason=msg) # For `GET`, `HEAD` else: - r = self.pool_manager.request(method, url, - fields=query_params, - preload_content=_preload_content, - timeout=timeout, - headers=headers) + r = self.pool_manager.request( + method, + url, + fields={}, + timeout=timeout, + headers=headers, + preload_content=False + ) except urllib3.exceptions.SSLError as e: - msg = "{0}\n{1}".format(type(e).__name__, str(e)) + msg = "\n".join([type(e).__name__, str(e)]) raise ApiException(status=0, reason=msg) - if _preload_content: - r = RESTResponse(r) - - # log response body - logger.debug("response body: %s", r.data) - - if not 200 <= r.status <= 299: - if r.status == 401: - raise UnauthorizedException(http_resp=r) - - if r.status == 403: - raise ForbiddenException(http_resp=r) - - if r.status == 404: - raise NotFoundException(http_resp=r) - - if 500 <= r.status <= 599: - raise ServiceException(http_resp=r) - - raise ApiException(http_resp=r) - - return r - - def GET(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None): - return self.request("GET", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def HEAD(self, url, headers=None, query_params=None, _preload_content=True, - _request_timeout=None): - return self.request("HEAD", url, - headers=headers, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - query_params=query_params) - - def OPTIONS(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("OPTIONS", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def DELETE(self, url, headers=None, query_params=None, body=None, - _preload_content=True, _request_timeout=None): - return self.request("DELETE", url, - headers=headers, - query_params=query_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def POST(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("POST", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PUT(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("PUT", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) - - def PATCH(self, url, headers=None, query_params=None, post_params=None, - body=None, _preload_content=True, _request_timeout=None): - return self.request("PATCH", url, - headers=headers, - query_params=query_params, - post_params=post_params, - _preload_content=_preload_content, - _request_timeout=_request_timeout, - body=body) + return RESTResponse(r) diff --git a/setup.py b/setup.py index 591646b..a88ba5b 100644 --- a/setup.py +++ b/setup.py @@ -26,11 +26,13 @@ install_requires=[ "certifi>=2024.07.04", "six>=1.10", - "python-dateutil>=2.5.3", - "urllib3>=1.26.19", + "python-dateutil>=2.8.2", + "urllib3>=1.25.3, <3.0.0", "vistir>=0.4.0, <=0.6.1", "idna==3.7", "requests>=2.32.3", + "pydantic>=2", + "typing-extensions>=4.7.1", ], packages=find_packages(exclude=["test", "tests", "example"]), include_package_data=True, diff --git a/update-models.sh b/update-models.sh index 347fd4d..62889f3 100755 --- a/update-models.sh +++ b/update-models.sh @@ -2,13 +2,12 @@ DOCS_DEFINITION_FOLDER="${PWD}/../DocumentReader-web-openapi" \ \ -&& docker run --user "$(id -u):$(id -g)" --rm -v "${PWD}:/client" -v "$DOCS_DEFINITION_FOLDER:/definitions" \ -openapitools/openapi-generator-cli:v5.0.0 generate -g python-legacy \ --i /definitions/index.yml -o /client -c /client/generator-config.json \ +&& docker run --user "$(id -u):$(id -g)" --rm \ +-v "${PWD}:/client" \ +-v "$DOCS_DEFINITION_FOLDER:/definitions" \ +openapitools/openapi-generator-cli:v7.12.0 generate \ +-g python \ +-i /definitions/index.yml \ +-o /client \ -t /client/generator-templates \ ---type-mappings AnyOfDocVisualExtendedFieldRectDocVisualExtendedFieldRfid=DocVisualExtendedField \ ---type-mappings AnyOfSecurityFeatureResultIdentResultFiberResultOCRSecurityTextResultPhotoIdentResult=AuthenticityCheckResultItem \ ---type-mappings AnyOfGraphicFieldRectGraphicFieldRfid=GraphicField \ ---type-mappings AnyOfStatusResultTextResultDocumentImageResultImagesResultChosenDocumentTypeResultDocumentTypesCandidatesResultTextDataResultGraphicsResultLexicalAnalysisResultAuthenticityResultImageQualityResultDocumentPositionResultDocBarCodeInfoLicenseResultEncryptedRCLResultDocumentBinaryInfoResult=ResultItem \ ---type-mappings AnyOfStatusResultTextResultDocumentImageResultImagesResultChosenDocumentTypeResultDocumentTypesCandidatesResultTextDataResultGraphicsResultLexicalAnalysisResultAuthenticityResultImageQualityResultDocumentPositionResultDocBarCodeInfoLicenseResultEncryptedRCLResult=ResultItem \ ---type-mappings AnyOfStatusResultTextResultDocumentImageResultImagesResultChosenDocumentTypeResultDocumentTypesCandidatesResultTextDataResultGraphicsResultLexicalAnalysisResultAuthenticityResultImageQualityResultDocumentPositionResultDocBarCodeInfoLicenseResultEncryptedRCLResultByteArrayResult=ResultItem +-c /client/generator-config.json || exit 1