medicafe 0.250819.0__py3-none-any.whl → 0.250819.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- MediBot/__init__.py +1 -1
- MediCafe/MediLink_ConfigLoader.py +6 -0
- MediCafe/__init__.py +1 -1
- MediLink/MediLink_837p_encoder_library.py +28 -26
- MediLink/MediLink_main.py +10 -44
- MediLink/__init__.py +1 -1
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/METADATA +1 -1
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/RECORD +12 -12
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/LICENSE +0 -0
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/WHEEL +0 -0
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/entry_points.txt +0 -0
- {medicafe-0.250819.0.dist-info → medicafe-0.250819.1.dist-info}/top_level.txt +0 -0
MediBot/__init__.py
CHANGED
@@ -6,6 +6,7 @@ except ImportError:
|
|
6
6
|
yaml = None
|
7
7
|
from datetime import datetime
|
8
8
|
from collections import OrderedDict
|
9
|
+
from functools import reduce
|
9
10
|
|
10
11
|
# Global configuration cache to prevent repeated loading
|
11
12
|
_CONFIG_CACHE = None
|
@@ -166,6 +167,11 @@ def clear_config_cache():
|
|
166
167
|
_CONFIG_CACHE = None
|
167
168
|
_CROSSWALK_CACHE = None
|
168
169
|
|
170
|
+
def require_config_value(key_path, use_cache=True):
|
171
|
+
# TODO This needs expanding a little bit but generally this type of functionality is good to have at this level.
|
172
|
+
config = _CONFIG_CACHE if use_cache and _CONFIG_CACHE else load_configuration()[0]
|
173
|
+
return reduce(lambda d, k: d[k], key_path.split('.'), config)
|
174
|
+
|
169
175
|
# Logs messages with optional error type and claim data.
|
170
176
|
def log(message, config=None, level="INFO", error_type=None, claim=None, verbose=False, console_output=False):
|
171
177
|
|
MediCafe/__init__.py
CHANGED
@@ -199,7 +199,7 @@ def create_nm1_billing_provider_segment(config, endpoint):
|
|
199
199
|
billing_provider_entity_code = endpoint_config.get('billing_provider_entity_code', '85')
|
200
200
|
billing_provider_npi_qualifier = endpoint_config.get('billing_provider_npi_qualifier', 'XX')
|
201
201
|
# Resolve required values with TestMode-aware enforcement
|
202
|
-
billing_provider_lastname =
|
202
|
+
billing_provider_lastname = legacy_require_config_value(
|
203
203
|
[config, endpoint_config],
|
204
204
|
'billing_provider_lastname',
|
205
205
|
config.get('default_billing_provider_name', 'DEFAULT NAME'),
|
@@ -208,7 +208,7 @@ def create_nm1_billing_provider_segment(config, endpoint):
|
|
208
208
|
endpoint
|
209
209
|
)
|
210
210
|
billing_provider_firstname = config.get('billing_provider_firstname', '')
|
211
|
-
billing_provider_npi =
|
211
|
+
billing_provider_npi = legacy_require_config_value(
|
212
212
|
[endpoint_config, config],
|
213
213
|
'billing_provider_npi',
|
214
214
|
config.get('default_billing_provider_npi', 'DEFAULT NPI'),
|
@@ -233,17 +233,17 @@ def create_nm1_billing_provider_segment(config, endpoint):
|
|
233
233
|
# Construct address segments
|
234
234
|
address_segments = []
|
235
235
|
if config.get('billing_provider_address'):
|
236
|
-
addr =
|
237
|
-
city =
|
238
|
-
state =
|
239
|
-
zip_code =
|
236
|
+
addr = legacy_require_config_value([config], 'billing_provider_address', 'NO ADDRESS', '2010AA Billing Address', config, endpoint)
|
237
|
+
city = legacy_require_config_value([config], 'billing_provider_city', 'NO CITY', '2010AA Billing City', config, endpoint)
|
238
|
+
state = legacy_require_config_value([config], 'billing_provider_state', 'NO STATE', '2010AA Billing State', config, endpoint)
|
239
|
+
zip_code = legacy_require_config_value([config], 'billing_provider_zip', 'NO ZIP', '2010AA Billing ZIP', config, endpoint)
|
240
240
|
# N3 segment for address line
|
241
241
|
address_segments.append("N3*{}~".format(addr))
|
242
242
|
# N4 segment for City, State, ZIP
|
243
243
|
address_segments.append("N4*{}*{}*{}~".format(city, state, zip_code))
|
244
244
|
|
245
245
|
# Assuming Tax ID is part of the same loop, otherwise move REF segment to the correct loop
|
246
|
-
billing_tin =
|
246
|
+
billing_tin = legacy_require_config_value([config], 'billing_provider_tin', 'NO TAX ID', '2010AA Billing TIN', config, endpoint)
|
247
247
|
ref_segment = "REF*EI*{}~".format(billing_tin)
|
248
248
|
|
249
249
|
# Construct PRV segment if provider taxonomy is needed
|
@@ -265,12 +265,12 @@ def create_service_facility_location_npi_segment(config):
|
|
265
265
|
Constructs segments for the service facility location, including the NM1 segment for identification
|
266
266
|
and accompanying N3 and N4 segments for address details.
|
267
267
|
"""
|
268
|
-
facility_npi =
|
269
|
-
facility_name =
|
270
|
-
address_line_1 =
|
271
|
-
city =
|
272
|
-
state =
|
273
|
-
zip_code =
|
268
|
+
facility_npi = legacy_require_config_value([config], 'service_facility_npi', 'DEFAULT FACILITY NPI', '2310C Service Facility NPI', config)
|
269
|
+
facility_name = legacy_require_config_value([config], 'service_facility_name', 'DEFAULT FACILITY NAME', '2310C Service Facility Name', config)
|
270
|
+
address_line_1 = legacy_require_config_value([config], 'service_facility_address', 'NO ADDRESS', '2310C Service Facility Address', config)
|
271
|
+
city = legacy_require_config_value([config], 'service_facility_city', 'NO CITY', '2310C Service Facility City', config)
|
272
|
+
state = legacy_require_config_value([config], 'service_facility_state', 'NO STATE', '2310C Service Facility State', config)
|
273
|
+
zip_code = legacy_require_config_value([config], 'service_facility_zip', 'NO ZIP', '2310C Service Facility ZIP', config)
|
274
274
|
|
275
275
|
# NM1 segment for facility identification
|
276
276
|
nm1_segment = "NM1*77*2*{}*****XX*{}~".format(facility_name, facility_npi)
|
@@ -290,20 +290,20 @@ def create_1000A_submitter_name_segment(patient_data, config, endpoint):
|
|
290
290
|
submitter_id_qualifier = endpoint_config.get('submitter_id_qualifier', '46') # '46' for ETIN or 'XX' for NPI
|
291
291
|
|
292
292
|
# Required submitter name
|
293
|
-
submitter_name =
|
293
|
+
submitter_name = legacy_require_config_value([endpoint_config, config], 'nm_103_value', 'DEFAULT NAME', '1000A Submitter Name', config, endpoint)
|
294
294
|
|
295
295
|
# Extract payer_id from patient_data
|
296
296
|
payer_id = patient_data.get('payer_id', '')
|
297
297
|
|
298
298
|
# Check if payer_id is Florida Blue (00590 or BCBSF) and assign submitter_id accordingly
|
299
299
|
if payer_id in ['00590', 'BCBSF']:
|
300
|
-
submitter_id =
|
300
|
+
submitter_id = legacy_require_config_value([endpoint_config], 'nm_109_bcbsf', 'DEFAULT BCBSF ID', '1000A Submitter ID (BCBSF)', config, endpoint)
|
301
301
|
else:
|
302
|
-
submitter_id =
|
302
|
+
submitter_id = legacy_require_config_value([endpoint_config], 'nm_109_value', 'DEFAULT ID', '1000A Submitter ID', config, endpoint)
|
303
303
|
|
304
304
|
# Submitter contact details (required)
|
305
|
-
contact_name =
|
306
|
-
contact_telephone_number =
|
305
|
+
contact_name = legacy_require_config_value([config], 'submitter_name', 'NONE', '1000A Submitter Contact Name', config, endpoint)
|
306
|
+
contact_telephone_number = legacy_require_config_value([config], 'submitter_tel', 'NONE', '1000A Submitter Contact Phone', config, endpoint)
|
307
307
|
|
308
308
|
# Get submitter first name to determine entity type qualifier
|
309
309
|
submitter_first_name = config.get('submitter_first_name', '')
|
@@ -333,8 +333,8 @@ def create_1000B_receiver_name_segment(config, endpoint):
|
|
333
333
|
endpoint_config = config.get('endpoints', {}).get(endpoint.upper(), {})
|
334
334
|
receiver_entity_code = '40'
|
335
335
|
receiver_id_qualifier = endpoint_config.get('receiver_id_qualifier', '46')
|
336
|
-
receiver_name =
|
337
|
-
receiver_edi =
|
336
|
+
receiver_name = legacy_require_config_value([endpoint_config], 'receiver_name', 'DEFAULT RECEIVER NAME', '1000B Receiver Name', config, endpoint)
|
337
|
+
receiver_edi = legacy_require_config_value([endpoint_config], 'receiver_edi', 'DEFAULT EDI', '1000B Receiver EDI', config, endpoint)
|
338
338
|
return "NM1*{entity_code}*2*{receiver_name}*****{id_qualifier}*{receiver_edi}~".format(
|
339
339
|
entity_code=receiver_entity_code,
|
340
340
|
receiver_name=receiver_name,
|
@@ -347,11 +347,11 @@ def create_nm1_payto_address_segments(config):
|
|
347
347
|
Constructs the NM1 segment for the Pay-To Address, N3 for street address, and N4 for city, state, and ZIP.
|
348
348
|
This is used if the Pay-To Address is different from the Billing Provider Address.
|
349
349
|
"""
|
350
|
-
payto_provider_name =
|
351
|
-
payto_address =
|
352
|
-
payto_city =
|
353
|
-
payto_state =
|
354
|
-
payto_zip =
|
350
|
+
payto_provider_name = legacy_require_config_value([config], 'payto_provider_name', 'DEFAULT PAY-TO NAME', '2010AB Pay-To Name', config)
|
351
|
+
payto_address = legacy_require_config_value([config], 'payto_address', 'DEFAULT PAY-TO ADDRESS', '2010AB Pay-To Address', config)
|
352
|
+
payto_city = legacy_require_config_value([config], 'payto_city', 'DEFAULT PAY-TO CITY', '2010AB Pay-To City', config)
|
353
|
+
payto_state = legacy_require_config_value([config], 'payto_state', 'DEFAULT PAY-TO STATE', '2010AB Pay-To State', config)
|
354
|
+
payto_zip = legacy_require_config_value([config], 'payto_zip', 'DEFAULT PAY-TO ZIP', '2010AB Pay-To ZIP', config)
|
355
355
|
|
356
356
|
nm1_segment = "NM1*87*2*{}~".format(payto_provider_name)
|
357
357
|
n3_segment = "N3*{}~".format(payto_address)
|
@@ -1539,12 +1539,14 @@ def _get_value_from_sources(source_dicts, key):
|
|
1539
1539
|
pass
|
1540
1540
|
return None
|
1541
1541
|
|
1542
|
-
def
|
1542
|
+
def legacy_require_config_value(source_dicts, key, default_value, context_label, config, endpoint=None, allow_default_in_test=True):
|
1543
1543
|
"""
|
1544
1544
|
Fetch a configuration value from one or more dicts.
|
1545
1545
|
- If found and equals a known placeholder, allow only in TestMode.
|
1546
1546
|
- If missing, allow default only in TestMode (when allow_default_in_test is True).
|
1547
1547
|
- Otherwise raise ValueError to prevent generating malformed 837p.
|
1548
|
+
|
1549
|
+
TODO Eventually we should get this functionality into configloader in MediCafe so that we can use it in other places.
|
1548
1550
|
"""
|
1549
1551
|
value = _get_value_from_sources(source_dicts, key)
|
1550
1552
|
# Found a value
|
MediLink/MediLink_main.py
CHANGED
@@ -34,13 +34,6 @@ import MediLink_PatientProcessor # Import patient processing functions
|
|
34
34
|
# Use core utilities for standardized config loader
|
35
35
|
MediLink_ConfigLoader = get_shared_config_loader()
|
36
36
|
|
37
|
-
try:
|
38
|
-
from tqdm import tqdm
|
39
|
-
except ImportError:
|
40
|
-
# Fallback for when tqdm is not available
|
41
|
-
def tqdm(iterable, **kwargs):
|
42
|
-
return iterable
|
43
|
-
|
44
37
|
import_time = time.time()
|
45
38
|
if PERFORMANCE_LOGGING:
|
46
39
|
print("Import phase completed in {:.2f} seconds".format(import_time - start_time))
|
@@ -92,8 +85,8 @@ def main_menu():
|
|
92
85
|
Initializes the main menu loop and handles the overall program flow,
|
93
86
|
including loading configurations and managing user input for menu selections.
|
94
87
|
"""
|
88
|
+
global _last_ack_updated_at, _scheduled_ack_checks
|
95
89
|
menu_start_time = time.time()
|
96
|
-
print("Main menu function started...")
|
97
90
|
|
98
91
|
# Load configuration settings and display the initial welcome message.
|
99
92
|
config_start_time = time.time()
|
@@ -149,6 +142,13 @@ def main_menu():
|
|
149
142
|
ack_result = False
|
150
143
|
pass
|
151
144
|
|
145
|
+
# TODO: Once we start building out the whole submission tracking persist structure,
|
146
|
+
# this boot-time scan should check when the last acknowledgement check was run
|
147
|
+
# and skip if it was run recently (e.g., within the last day) to avoid
|
148
|
+
# constantly running it on every startup. The submission tracking system should
|
149
|
+
# store the timestamp of the last successful acknowledgement check and use it
|
150
|
+
# to determine if a new scan is needed.
|
151
|
+
|
152
152
|
# Clear screen before showing menu header
|
153
153
|
try:
|
154
154
|
os.system('cls' if os.name == 'nt' else 'clear')
|
@@ -204,27 +204,7 @@ def main_menu():
|
|
204
204
|
if PERFORMANCE_LOGGING:
|
205
205
|
print("Main menu initialization completed in {:.2f} seconds".format(menu_init_end - menu_start_time))
|
206
206
|
|
207
|
-
|
208
|
-
try:
|
209
|
-
from datetime import datetime, timedelta
|
210
|
-
current_date = datetime.now()
|
211
|
-
start_date = current_date - timedelta(days=15) # Default to 15-day range
|
212
|
-
end_date = current_date - timedelta(days=1)
|
213
|
-
def validate_date_range(start_date, end_date):
|
214
|
-
if start_date > end_date:
|
215
|
-
raise ValueError("Start date cannot be after end date.")
|
216
|
-
if start_date < (current_date - timedelta(days=30)): # Ensure it's not too far in the past
|
217
|
-
raise ValueError("Start date must be within the last 30 days.")
|
218
|
-
if end_date < (current_date - timedelta(days=30)): # Ensure it's not too far in the past
|
219
|
-
raise ValueError("End date must be within the last 30 days.")
|
220
|
-
except ImportError:
|
221
|
-
print("Date validation requires the 'datetime' module. Please ensure it's installed.")
|
222
|
-
# Fallback to a safe date range within 30 days
|
223
|
-
end_date = current_date - timedelta(days=1)
|
224
|
-
start_date = end_date - timedelta(days=15) # 15-day range as fallback
|
225
|
-
|
226
|
-
end_date_str = end_date.strftime('%m/%d/%Y')
|
227
|
-
start_date_str = start_date.strftime('%m/%d/%Y')
|
207
|
+
|
228
208
|
|
229
209
|
while True:
|
230
210
|
# Run any due scheduled ack checks before showing menu
|
@@ -294,7 +274,7 @@ def main_menu():
|
|
294
274
|
|
295
275
|
# UX hint: suggest deeper United details
|
296
276
|
try:
|
297
|
-
print("Tip: For United details, run the United Claims Status
|
277
|
+
print("Tip: For United details, run the United Claims Status checker.")
|
298
278
|
except Exception:
|
299
279
|
pass
|
300
280
|
elif choice == '2':
|
@@ -335,20 +315,6 @@ def main_menu():
|
|
335
315
|
break
|
336
316
|
elif choice == '4':
|
337
317
|
_tools_menu(config, medi)
|
338
|
-
elif choice.lower() == 'tools:index':
|
339
|
-
# Optional maintenance: rebuild submission index now (synchronous)
|
340
|
-
try:
|
341
|
-
receipts_root = medi.get('local_claims_path', None)
|
342
|
-
if not receipts_root:
|
343
|
-
print("No receipts folder configured.")
|
344
|
-
continue
|
345
|
-
from MediCafe.submission_index import build_initial_index
|
346
|
-
receipts_root = os.path.normpath(receipts_root)
|
347
|
-
print("Rebuilding submission index... (this may take a while)")
|
348
|
-
count = build_initial_index(receipts_root)
|
349
|
-
print("Index rebuild complete. Indexed {} records.".format(count))
|
350
|
-
except Exception as e:
|
351
|
-
print("Index rebuild error: {}".format(e))
|
352
318
|
else:
|
353
319
|
# Display an error message if the user's choice does not match any valid option.
|
354
320
|
MediLink_UI.display_invalid_choice()
|
MediLink/__init__.py
CHANGED
@@ -10,12 +10,12 @@ MediBot/MediBot_UI.py,sha256=iG8UK71aHYBmB0lkjwl-C6L9DbsOyLaq-wt9kChV0jo,23781
|
|
10
10
|
MediBot/MediBot_dataformat_library.py,sha256=D46fdPtxcgfWTzaLBtSvjtozzZBNqNiODgu4vKMZrBg,10746
|
11
11
|
MediBot/MediBot_docx_decoder.py,sha256=gn7I7Ng5khVIzU0HTTOqi31YSSn1yW8Pyk-i_P9r1oA,32472
|
12
12
|
MediBot/MediBot_smart_import.py,sha256=Emvz7NwemHGCHvG5kZcUyXMcCheidbGKaPfOTg-YCEs,6684
|
13
|
-
MediBot/__init__.py,sha256=
|
13
|
+
MediBot/__init__.py,sha256=I2JcvQjmAgvDibwv9qIqTmwm8aIx3wLvNrwx25U2ijU,3192
|
14
14
|
MediBot/get_medicafe_version.py,sha256=uyL_UIE42MyFuJ3SRYxJp8sZx8xjTqlYZ3FdQuxLduY,728
|
15
15
|
MediBot/update_json.py,sha256=vvUF4mKCuaVly8MmoadDO59M231fCIInc0KI1EtDtPA,3704
|
16
16
|
MediBot/update_medicafe.py,sha256=09asEEgnGEOq4HH4dmnF18hZdzggqn8zDutQqymdVws,8550
|
17
|
-
MediCafe/MediLink_ConfigLoader.py,sha256=
|
18
|
-
MediCafe/__init__.py,sha256=
|
17
|
+
MediCafe/MediLink_ConfigLoader.py,sha256=fNBFnPbh1YRVCs9WvZp6tPsKTUFzK3f38ePeUQ00QrQ,10161
|
18
|
+
MediCafe/__init__.py,sha256=S7mJnzX4mN7T1iNsjNpdbVQC86cxlifqDv5d-UAEjbE,5721
|
19
19
|
MediCafe/__main__.py,sha256=mRNyk3D9Ilnu2XhgVI_rut7r5Ro7UIKtwV871giAHI8,12992
|
20
20
|
MediCafe/api_core.py,sha256=IZaBXnP4E7eHzxVbCk2HtxywiVBuhaUyHeaqss8llgY,66378
|
21
21
|
MediCafe/api_core_backup.py,sha256=Oy_Fqt0SEvGkQN1Oqw5iUPVFxPEokyju5CuPEb9k0OY,18686
|
@@ -31,7 +31,7 @@ MediCafe/submission_index.py,sha256=35gz8Anx1dIqG1I14GvuLY0nTO4dSBr2YsZwof9aIQg,
|
|
31
31
|
MediLink/InsuranceTypeService.py,sha256=FKWC1nRfKV_OtCDUtZustauXNhmCYDFiY9jsAGHPPUM,2178
|
32
32
|
MediLink/MediLink_837p_cob_library.py,sha256=glc7SJBDx0taCGmwmCs81GFJJcvA_D7nycIkTfmIuwE,30650
|
33
33
|
MediLink/MediLink_837p_encoder.py,sha256=lJnly96LsSBnzEgF8Ne-nQTL7cmRhoFL2fJajtpvOcU,32209
|
34
|
-
MediLink/MediLink_837p_encoder_library.py,sha256=
|
34
|
+
MediLink/MediLink_837p_encoder_library.py,sha256=4rjzKmDcC2f6p2ja5o7cwl2cEXsLkH_0QbqcTT0MoQI,87185
|
35
35
|
MediLink/MediLink_837p_utilities.py,sha256=AJ0F22LoF8du20zPBH4TZXgsdXCD-1qYKBnHJM-mXl0,16260
|
36
36
|
MediLink/MediLink_API_Generator.py,sha256=VZBL9W8yFTMJ4ikSwbUI8ANtaJCLnUyqoF8xQEJQn_E,11176
|
37
37
|
MediLink/MediLink_Azure.py,sha256=Ow70jctiHFIylskBExN7WUoRgrKOvBR6jNTnQMk6lJA,210
|
@@ -51,10 +51,10 @@ MediLink/MediLink_Scheduler.py,sha256=UJvxhDvHraqra2_TlQVlGeh5jRFrrfK6nCVUHnKOEM
|
|
51
51
|
MediLink/MediLink_UI.py,sha256=6OR2obKUuBO12l3k6B53MXu1a3fCiV3FVBE2QrIYRqk,9279
|
52
52
|
MediLink/MediLink_Up.py,sha256=uB6J63hWOn8Ot8iGtc2_OgcejNWVgnX7Se_e_UWBNho,38082
|
53
53
|
MediLink/MediLink_insurance_utils.py,sha256=g741Fj2K26cMy0JX5d_XavMw9LgkK6hjaUJYfysT7t8,9301
|
54
|
-
MediLink/MediLink_main.py,sha256=
|
54
|
+
MediLink/MediLink_main.py,sha256=5llRZ065vhUq5cWePb7Zz7QJUIAmua33BeNe3LjTVuE,21892
|
55
55
|
MediLink/MediLink_smart_import.py,sha256=B5SfBn_4bYEWJJDolXbjnwKx_-MaqGZ76LyXQwWDV80,9838
|
56
56
|
MediLink/Soumit_api.py,sha256=5JfOecK98ZC6NpZklZW2AkOzkjvrbYxpJpZNH3rFxDw,497
|
57
|
-
MediLink/__init__.py,sha256=
|
57
|
+
MediLink/__init__.py,sha256=cmVSGALQVlQ5LSCgzd5e2vnlM4q5_P5Kb8iALK1Yw9k,3888
|
58
58
|
MediLink/gmail_http_utils.py,sha256=gtqCCrzJC7e8JFQzMNrf7EbK8na2h4sfTu-NMaZ_UHc,4006
|
59
59
|
MediLink/gmail_oauth_utils.py,sha256=Ugr-DEqs4_RddRMSCJ_dbgA3TVeaxpbAor-dktcTIgY,3713
|
60
60
|
MediLink/insurance_type_integration_test.py,sha256=pz2OCXitAznqDciYn6OL9M326m9CYU7YiK-ynssdQ5g,15172
|
@@ -64,9 +64,9 @@ MediLink/test_cob_library.py,sha256=wUMv0-Y6fNsKcAs8Z9LwfmEBRO7oBzBAfWmmzwoNd1g,
|
|
64
64
|
MediLink/test_timing.py,sha256=yH2b8QPLDlp1Zy5AhgtjzjnDHNGhAD16ZtXtZzzESZw,2042
|
65
65
|
MediLink/test_validation.py,sha256=FJrfdUFK--xRScIzrHCg1JeGdm0uJEoRnq6CgkP2lwM,4154
|
66
66
|
MediLink/webapp.html,sha256=JPKT559aFVBi1r42Hz7C77Jj0teZZRumPhBev8eSOLk,19806
|
67
|
-
medicafe-0.250819.
|
68
|
-
medicafe-0.250819.
|
69
|
-
medicafe-0.250819.
|
70
|
-
medicafe-0.250819.
|
71
|
-
medicafe-0.250819.
|
72
|
-
medicafe-0.250819.
|
67
|
+
medicafe-0.250819.1.dist-info/LICENSE,sha256=65lb-vVujdQK7uMH3RRJSMwUW-WMrMEsc5sOaUn2xUk,1096
|
68
|
+
medicafe-0.250819.1.dist-info/METADATA,sha256=VXbIzbDxX-2vHAXuT2jHQnujywhvBmAXjE0NLAGulOA,3384
|
69
|
+
medicafe-0.250819.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
70
|
+
medicafe-0.250819.1.dist-info/entry_points.txt,sha256=m3RBUBjr-xRwEkKJ5W4a7NlqHZP_1rllGtjZnrRqKe8,52
|
71
|
+
medicafe-0.250819.1.dist-info/top_level.txt,sha256=U6-WBJ9RCEjyIs0BlzbQq_PwedCp_IV9n1616NNV5zA,26
|
72
|
+
medicafe-0.250819.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|