nv-ingest-api 25.7.7.dev20250707__py3-none-any.whl → 25.8.0rc2__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.
Potentially problematic release.
This version of nv-ingest-api might be problematic. Click here for more details.
- nv_ingest_api/interface/extract.py +18 -18
- nv_ingest_api/internal/enums/common.py +6 -0
- nv_ingest_api/internal/extract/image/chart_extractor.py +80 -75
- nv_ingest_api/internal/extract/image/image_helpers/common.py +5 -6
- nv_ingest_api/internal/extract/image/infographic_extractor.py +59 -35
- nv_ingest_api/internal/extract/image/table_extractor.py +84 -64
- nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py +9 -8
- nv_ingest_api/internal/extract/pdf/engines/pdf_helpers/__init__.py +32 -20
- nv_ingest_api/internal/extract/pdf/engines/pdfium.py +40 -29
- nv_ingest_api/internal/primitives/nim/model_interface/helpers.py +59 -0
- nv_ingest_api/internal/primitives/nim/model_interface/nemoretriever_parse.py +1 -0
- nv_ingest_api/internal/primitives/nim/model_interface/{paddle.py → ocr.py} +132 -39
- nv_ingest_api/internal/primitives/nim/model_interface/yolox.py +44 -236
- nv_ingest_api/internal/primitives/nim/nim_client.py +61 -18
- nv_ingest_api/internal/schemas/extract/extract_chart_schema.py +6 -6
- nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py +6 -6
- nv_ingest_api/internal/schemas/extract/extract_table_schema.py +5 -5
- nv_ingest_api/internal/schemas/meta/ingest_job_schema.py +5 -0
- nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py +1 -1
- nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py +4 -0
- nv_ingest_api/internal/transform/embed_text.py +105 -12
- nv_ingest_api/internal/transform/split_text.py +13 -8
- nv_ingest_api/util/image_processing/table_and_chart.py +97 -42
- nv_ingest_api/util/image_processing/transforms.py +351 -87
- nv_ingest_api/util/message_brokers/simple_message_broker/broker.py +1 -1
- nv_ingest_api/util/message_brokers/simple_message_broker/simple_client.py +51 -48
- nv_ingest_api/util/metadata/aggregators.py +4 -1
- nv_ingest_api/util/pdf/pdfium.py +6 -14
- {nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/METADATA +2 -1
- {nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/RECORD +33 -33
- {nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/WHEEL +0 -0
- {nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/licenses/LICENSE +0 -0
- {nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/top_level.txt +0 -0
|
@@ -14,7 +14,7 @@ import logging
|
|
|
14
14
|
from typing import Optional, Tuple, Union
|
|
15
15
|
|
|
16
16
|
from nv_ingest_api.internal.schemas.message_brokers.response_schema import ResponseSchema
|
|
17
|
-
from nv_ingest_api.util.service_clients.client_base import MessageBrokerClientBase
|
|
17
|
+
from nv_ingest_api.util.service_clients.client_base import MessageBrokerClientBase
|
|
18
18
|
|
|
19
19
|
logger = logging.getLogger(__name__)
|
|
20
20
|
|
|
@@ -108,29 +108,23 @@ class SimpleClient(MessageBrokerClientBase):
|
|
|
108
108
|
return self._handle_push(queue_name, message, timeout, for_nv_ingest)
|
|
109
109
|
|
|
110
110
|
def fetch_message(
|
|
111
|
-
self,
|
|
112
|
-
queue_name: str,
|
|
113
|
-
timeout: Optional[Tuple[int, Union[float]]] = (100, None),
|
|
114
|
-
override_fetch_mode: FetchMode = None,
|
|
111
|
+
self, queue_name: str, timeout: Optional[Tuple[int, Union[float, None]]] = (1200, None)
|
|
115
112
|
) -> ResponseSchema:
|
|
116
113
|
"""
|
|
117
|
-
Fetch a message from
|
|
114
|
+
Fetch a message from a specified queue.
|
|
118
115
|
|
|
119
116
|
Parameters
|
|
120
117
|
----------
|
|
121
118
|
queue_name : str
|
|
122
119
|
The name of the queue.
|
|
123
|
-
timeout :
|
|
124
|
-
|
|
120
|
+
timeout : tuple, optional
|
|
121
|
+
A tuple containing the timeout value and an unused second element.
|
|
125
122
|
|
|
126
123
|
Returns
|
|
127
124
|
-------
|
|
128
125
|
ResponseSchema
|
|
129
|
-
The response
|
|
126
|
+
The response from the broker.
|
|
130
127
|
"""
|
|
131
|
-
if isinstance(timeout, int):
|
|
132
|
-
timeout = (timeout, None)
|
|
133
|
-
|
|
134
128
|
return self._handle_pop(queue_name, timeout)
|
|
135
129
|
|
|
136
130
|
def ping(self) -> ResponseSchema:
|
|
@@ -208,6 +202,7 @@ class SimpleClient(MessageBrokerClientBase):
|
|
|
208
202
|
|
|
209
203
|
try:
|
|
210
204
|
with socket.create_connection((self._host, self._port), timeout=self._connection_timeout) as sock:
|
|
205
|
+
sock.settimeout(self._connection_timeout)
|
|
211
206
|
self._send(sock, json.dumps(command).encode("utf-8"))
|
|
212
207
|
# Receive initial response with transaction ID
|
|
213
208
|
response_data = self._recv(sock)
|
|
@@ -241,8 +236,9 @@ class SimpleClient(MessageBrokerClientBase):
|
|
|
241
236
|
|
|
242
237
|
return ResponseSchema(**final_response)
|
|
243
238
|
|
|
244
|
-
except (ConnectionError, socket.error, BrokenPipeError):
|
|
245
|
-
|
|
239
|
+
except (ConnectionError, socket.error, BrokenPipeError, socket.timeout) as e:
|
|
240
|
+
logger.debug(f"Connection error during PUSH: {e}")
|
|
241
|
+
pass # Will be retried
|
|
246
242
|
except json.JSONDecodeError:
|
|
247
243
|
return ResponseSchema(response_code=1, response_reason="Invalid JSON response from server.")
|
|
248
244
|
except Exception as e:
|
|
@@ -272,61 +268,67 @@ class SimpleClient(MessageBrokerClientBase):
|
|
|
272
268
|
|
|
273
269
|
command = {"command": "POP", "queue_name": queue_name}
|
|
274
270
|
|
|
275
|
-
|
|
271
|
+
timeout_val = timeout[0] if isinstance(timeout, tuple) else timeout
|
|
276
272
|
|
|
277
|
-
if
|
|
278
|
-
command["timeout"] =
|
|
273
|
+
if timeout_val is not None:
|
|
274
|
+
command["timeout"] = timeout_val
|
|
279
275
|
|
|
280
276
|
start_time = time.time()
|
|
277
|
+
backoff_delay = 1 # Start with a 1-second backoff
|
|
278
|
+
|
|
281
279
|
while True:
|
|
282
280
|
elapsed = time.time() - start_time
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
return ResponseSchema(response_code=1, response_reason="POP operation timed out.")
|
|
281
|
+
if timeout_val is not None and elapsed >= timeout_val:
|
|
282
|
+
return ResponseSchema(response_code=2, response_reason="Job not ready.")
|
|
286
283
|
|
|
287
284
|
try:
|
|
288
285
|
with socket.create_connection((self._host, self._port), timeout=self._connection_timeout) as sock:
|
|
286
|
+
sock.settimeout(self._connection_timeout)
|
|
289
287
|
self._send(sock, json.dumps(command).encode("utf-8"))
|
|
290
288
|
# Receive initial response with transaction ID and message
|
|
291
289
|
response_data = self._recv(sock)
|
|
292
290
|
response = json.loads(response_data)
|
|
293
291
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
292
|
+
# The broker now returns a response_code of 2 for a timeout, which the high-level
|
|
293
|
+
# client should handle as a retryable event.
|
|
294
|
+
if response.get("response_code") == 2:
|
|
295
|
+
# Queue is empty or job not ready, continue to backoff and retry
|
|
296
|
+
pass
|
|
297
|
+
elif response.get("response_code") != 0:
|
|
298
|
+
return ResponseSchema(**response)
|
|
299
|
+
else:
|
|
300
|
+
# Success case: we received a message.
|
|
301
|
+
if "transaction_id" not in response:
|
|
302
|
+
return ResponseSchema(response_code=1, response_reason="No transaction_id in response.")
|
|
303
303
|
|
|
304
|
-
|
|
304
|
+
transaction_id = response["transaction_id"]
|
|
305
|
+
message = response.get("response")
|
|
305
306
|
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
# Send ACK
|
|
308
|
+
ack_data = json.dumps({"transaction_id": transaction_id, "ack": True}).encode("utf-8")
|
|
309
|
+
self._send(sock, ack_data)
|
|
308
310
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
311
|
+
# Receive final response
|
|
312
|
+
final_response_data = self._recv(sock)
|
|
313
|
+
final_response = json.loads(final_response_data)
|
|
312
314
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
if final_response.get("response_code") == 0:
|
|
318
|
-
return ResponseSchema(response_code=0, response=message, transaction_id=transaction_id)
|
|
319
|
-
else:
|
|
320
|
-
return ResponseSchema(**final_response)
|
|
315
|
+
if final_response.get("response_code") == 0:
|
|
316
|
+
return ResponseSchema(response_code=0, response=message, transaction_id=transaction_id)
|
|
317
|
+
else:
|
|
318
|
+
return ResponseSchema(**final_response)
|
|
321
319
|
|
|
322
|
-
except (ConnectionError, socket.error, BrokenPipeError):
|
|
323
|
-
|
|
320
|
+
except (ConnectionError, socket.error, BrokenPipeError, socket.timeout) as e:
|
|
321
|
+
# Let the high-level client handle connection errors as retryable.
|
|
322
|
+
logger.debug(f"Connection error during POP: {e}, will retry after backoff.")
|
|
323
|
+
pass # Fall through to backoff and retry
|
|
324
324
|
except json.JSONDecodeError:
|
|
325
325
|
return ResponseSchema(response_code=1, response_reason="Invalid JSON response from server.")
|
|
326
326
|
except Exception as e:
|
|
327
327
|
return ResponseSchema(response_code=1, response_reason=str(e))
|
|
328
328
|
|
|
329
|
-
|
|
329
|
+
# Exponential backoff
|
|
330
|
+
time.sleep(backoff_delay)
|
|
331
|
+
backoff_delay = min(backoff_delay * 2, self._max_backoff)
|
|
330
332
|
|
|
331
333
|
def _execute_simple_command(self, command: dict) -> ResponseSchema:
|
|
332
334
|
"""
|
|
@@ -350,12 +352,13 @@ class SimpleClient(MessageBrokerClientBase):
|
|
|
350
352
|
|
|
351
353
|
try:
|
|
352
354
|
with socket.create_connection((self._host, self._port), timeout=self._connection_timeout) as sock:
|
|
355
|
+
sock.settimeout(self._connection_timeout)
|
|
353
356
|
self._send(sock, data)
|
|
354
357
|
response_data = self._recv(sock)
|
|
355
358
|
response = json.loads(response_data)
|
|
356
359
|
return ResponseSchema(**response)
|
|
357
|
-
except (ConnectionError, socket.error, BrokenPipeError) as e:
|
|
358
|
-
return ResponseSchema(response_code=
|
|
360
|
+
except (ConnectionError, socket.error, BrokenPipeError, socket.timeout) as e:
|
|
361
|
+
return ResponseSchema(response_code=2, response_reason=f"Connection error: {e}")
|
|
359
362
|
except json.JSONDecodeError:
|
|
360
363
|
return ResponseSchema(response_code=1, response_reason="Invalid JSON response from server.")
|
|
361
364
|
except Exception as e:
|
|
@@ -201,6 +201,8 @@ def construct_image_metadata_from_base64(
|
|
|
201
201
|
page_count: int,
|
|
202
202
|
source_metadata: Dict[str, Any],
|
|
203
203
|
base_unified_metadata: Dict[str, Any],
|
|
204
|
+
subtype: None | ContentTypeEnum | str = "",
|
|
205
|
+
text: str = "",
|
|
204
206
|
) -> List[Any]:
|
|
205
207
|
"""
|
|
206
208
|
Extracts image data from a base64-encoded image string, decodes the image to get
|
|
@@ -252,6 +254,7 @@ def construct_image_metadata_from_base64(
|
|
|
252
254
|
"line": -1,
|
|
253
255
|
"span": -1,
|
|
254
256
|
},
|
|
257
|
+
"subtype": subtype or "",
|
|
255
258
|
}
|
|
256
259
|
|
|
257
260
|
# Construct image metadata
|
|
@@ -259,7 +262,7 @@ def construct_image_metadata_from_base64(
|
|
|
259
262
|
"image_type": DocumentTypeEnum.PNG,
|
|
260
263
|
"structured_image_type": ContentTypeEnum.UNKNOWN,
|
|
261
264
|
"caption": "",
|
|
262
|
-
"text":
|
|
265
|
+
"text": text,
|
|
263
266
|
"image_location": bbox,
|
|
264
267
|
"image_location_max_dimensions": (width, height),
|
|
265
268
|
"height": height,
|
nv_ingest_api/util/pdf/pdfium.py
CHANGED
|
@@ -7,7 +7,6 @@ from typing import List, Any
|
|
|
7
7
|
from typing import Optional
|
|
8
8
|
from typing import Tuple
|
|
9
9
|
|
|
10
|
-
import PIL
|
|
11
10
|
import numpy as np
|
|
12
11
|
import pypdfium2 as pdfium
|
|
13
12
|
import pypdfium2.raw as pdfium_c
|
|
@@ -20,8 +19,9 @@ from nv_ingest_api.util.image_processing.clustering import (
|
|
|
20
19
|
combine_groups_into_bboxes,
|
|
21
20
|
remove_superset_bboxes,
|
|
22
21
|
)
|
|
23
|
-
from nv_ingest_api.util.image_processing.transforms import pad_image, numpy_to_base64, crop_image
|
|
22
|
+
from nv_ingest_api.util.image_processing.transforms import pad_image, numpy_to_base64, crop_image, scale_numpy_image
|
|
24
23
|
from nv_ingest_api.util.metadata.aggregators import Base64Image
|
|
24
|
+
from nv_ingest_api.internal.primitives.nim.model_interface.yolox import YOLOX_PAGE_IMAGE_FORMAT
|
|
25
25
|
|
|
26
26
|
logger = logging.getLogger(__name__)
|
|
27
27
|
|
|
@@ -176,18 +176,10 @@ def pdfium_pages_to_numpy(
|
|
|
176
176
|
for idx, page in enumerate(pages):
|
|
177
177
|
# Render the page as a bitmap with the specified scale and rotation
|
|
178
178
|
page_bitmap = page.render(scale=scale, rotation=rotation)
|
|
179
|
-
|
|
180
|
-
# Convert the bitmap to a PIL image
|
|
181
|
-
pil_image = page_bitmap.to_pil()
|
|
182
|
-
|
|
179
|
+
img_arr = convert_bitmap_to_corrected_numpy(page_bitmap)
|
|
183
180
|
# Apply scaling using the thumbnail approach if specified
|
|
184
181
|
if scale_tuple:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# Convert the PIL image to a NumPy array and force a full copy,
|
|
188
|
-
# ensuring the returned array is entirely independent of the original buffer.
|
|
189
|
-
img_arr = np.array(pil_image).copy()
|
|
190
|
-
|
|
182
|
+
img_arr = scale_numpy_image(img_arr, scale_tuple)
|
|
191
183
|
# Apply padding if specified
|
|
192
184
|
if padding_tuple:
|
|
193
185
|
img_arr, (pad_width, pad_height) = pad_image(
|
|
@@ -250,7 +242,7 @@ def extract_simple_images_from_pdfium_page(page, max_depth):
|
|
|
250
242
|
try:
|
|
251
243
|
# Attempt to retrieve the image bitmap
|
|
252
244
|
image_numpy: np.ndarray = pdfium_try_get_bitmap_as_numpy(obj) # noqa
|
|
253
|
-
image_base64: str = numpy_to_base64(image_numpy)
|
|
245
|
+
image_base64: str = numpy_to_base64(image_numpy, format=YOLOX_PAGE_IMAGE_FORMAT)
|
|
254
246
|
image_bbox = obj.get_pos()
|
|
255
247
|
image_size = obj.get_size()
|
|
256
248
|
if image_size[0] < 10 and image_size[1] < 10:
|
|
@@ -394,7 +386,7 @@ def extract_image_like_objects_from_pdfium_page(page, merge=True, **kwargs):
|
|
|
394
386
|
try:
|
|
395
387
|
original_images, _ = pdfium_pages_to_numpy(
|
|
396
388
|
[page], # A batch with a single image.
|
|
397
|
-
render_dpi=
|
|
389
|
+
render_dpi=72, # dpi = 72 is equivalent to scale = 1.
|
|
398
390
|
rotation=rotation, # Without rotation, coordinates from page.get_pos() will not match.
|
|
399
391
|
)
|
|
400
392
|
image_bboxes = extract_merged_images_from_pdfium_page(page, merge=merge, **kwargs)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nv-ingest-api
|
|
3
|
-
Version: 25.
|
|
3
|
+
Version: 25.8.0rc2
|
|
4
4
|
Summary: Python module with core document ingestion functions.
|
|
5
5
|
Author-email: Jeremy Dyer <jdyer@nvidia.com>
|
|
6
6
|
License: Apache License
|
|
@@ -217,6 +217,7 @@ Requires-Dist: backoff==2.2.1
|
|
|
217
217
|
Requires-Dist: pandas>=2.0
|
|
218
218
|
Requires-Dist: pydantic>2.0.0
|
|
219
219
|
Requires-Dist: pydantic-settings>2.0.0
|
|
220
|
+
Requires-Dist: tritonclient
|
|
220
221
|
Dynamic: license-file
|
|
221
222
|
|
|
222
223
|
# nv-ingest-api
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
nv_ingest_api/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
2
2
|
nv_ingest_api/interface/__init__.py,sha256=ltWlfmtCewHSRK4B7DF__QvlSUPuliz58JEcEIeIgI0,10134
|
|
3
|
-
nv_ingest_api/interface/extract.py,sha256=
|
|
3
|
+
nv_ingest_api/interface/extract.py,sha256=o9OdoWxYsj-O4HsDe6wWbyd69OAueb2rlMtKSzOrKZo,38743
|
|
4
4
|
nv_ingest_api/interface/mutate.py,sha256=eZkd3sbHEJQiEPJyMbhewlPxQNMnL_Xur15icclnb-U,5934
|
|
5
5
|
nv_ingest_api/interface/store.py,sha256=aR3Cf19lq9Yo9AHlAy1VVcrOP2dgyN01yYhwxyTprkQ,8207
|
|
6
6
|
nv_ingest_api/interface/transform.py,sha256=g6YnFR7TpEU0xNtzCvv6kqnFbuCwQ6vRMjjBxz3G4n4,15815
|
|
7
7
|
nv_ingest_api/interface/utility.py,sha256=AL4l0cJNvTjG1MAe1YNTk1jbbPED3g4HCewzx6Ffcio,7296
|
|
8
8
|
nv_ingest_api/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
nv_ingest_api/internal/enums/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
10
|
-
nv_ingest_api/internal/enums/common.py,sha256=
|
|
10
|
+
nv_ingest_api/internal/enums/common.py,sha256=lzDJ35VWfIwlL_Lx_q0dfHUuwEB7CXudHIQAilpjoRw,12611
|
|
11
11
|
nv_ingest_api/internal/extract/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
12
12
|
nv_ingest_api/internal/extract/audio/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
13
13
|
nv_ingest_api/internal/extract/audio/audio_extraction.py,sha256=_jf_UC_FTqZr-xEpwG8edwBzdDjM01gGhqm9ulOsDcY,6973
|
|
@@ -20,22 +20,22 @@ nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docxreader.py,sha
|
|
|
20
20
|
nv_ingest_api/internal/extract/html/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
21
21
|
nv_ingest_api/internal/extract/html/html_extractor.py,sha256=I9oWfj6_As4898GDDh0zsSuKxO3lBsvyYzhvUotjzJI,3282
|
|
22
22
|
nv_ingest_api/internal/extract/image/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
23
|
-
nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=
|
|
23
|
+
nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=gk-O-9wjZBoaLVE_6Erb4gMwsSFk4UtPQ2QLpMCW4H4,13212
|
|
24
24
|
nv_ingest_api/internal/extract/image/image_extractor.py,sha256=4tUWinuFMN3ukWa2tZa2_LtzRiTyUAUCBF6BDkUEvm0,8705
|
|
25
|
-
nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=
|
|
26
|
-
nv_ingest_api/internal/extract/image/table_extractor.py,sha256=
|
|
25
|
+
nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=i7zt_ow1gytU4hK2JCRg7T1wlbokaeuUpXX69LIQkzY,9687
|
|
26
|
+
nv_ingest_api/internal/extract/image/table_extractor.py,sha256=O0m3N2Tz9W6X7TBI4o-rbBXc8dFOf9zSZq1v9qC1U4M,13780
|
|
27
27
|
nv_ingest_api/internal/extract/image/image_helpers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
28
|
-
nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=
|
|
28
|
+
nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=80jRhGzisHvQ9Ky3MKUMM7soKUmvZ5LqRVzwNYjgdPY,14988
|
|
29
29
|
nv_ingest_api/internal/extract/pdf/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
30
30
|
nv_ingest_api/internal/extract/pdf/pdf_extractor.py,sha256=CxtWaD6mql9MEqSdk2CfSQ9T-Bn87beBkCOuGGjxGt8,2934
|
|
31
31
|
nv_ingest_api/internal/extract/pdf/engines/__init__.py,sha256=u4GnAZmDKRl0RwYGIRiozIRw70Kybw3A72-lcKFeoTI,582
|
|
32
32
|
nv_ingest_api/internal/extract/pdf/engines/adobe.py,sha256=VT0dEqkU-y2uGkaCqxtKYov_Q8R1028UQVBchgMLca4,17466
|
|
33
33
|
nv_ingest_api/internal/extract/pdf/engines/llama.py,sha256=PpKTqS8jGHBV6mKLGZWwjpfT8ga6Fy8ffrvL-gPAf2c,8182
|
|
34
|
-
nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=
|
|
35
|
-
nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=
|
|
34
|
+
nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=IVbNcH_phMiRSxnkZ04pGfQrPJ-x1zVR3hXyhxv7juc,22977
|
|
35
|
+
nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=SKmias2iZmAE6Q8WXxmFEjvLOZy-vXRoaRIPpi7Tuhs,22962
|
|
36
36
|
nv_ingest_api/internal/extract/pdf/engines/tika.py,sha256=6GyR2l6EsgNZl9jnYDXLeKNK9Fj2Mw9y2UWDq-eSkOc,3169
|
|
37
37
|
nv_ingest_api/internal/extract/pdf/engines/unstructured_io.py,sha256=jrv2B4VZAH4PevAQrFz965qz8UyXq3rViiOTbGLejec,14908
|
|
38
|
-
nv_ingest_api/internal/extract/pdf/engines/pdf_helpers/__init__.py,sha256=
|
|
38
|
+
nv_ingest_api/internal/extract/pdf/engines/pdf_helpers/__init__.py,sha256=4bvN6LsPksLicI6jM0JqbJFiOZNHEcuc8MVVW4XfgV8,5875
|
|
39
39
|
nv_ingest_api/internal/extract/pptx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
|
|
40
40
|
nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=o-0P2dDyRFW37uQi_lKk6-eFozTcZvbq-2Y4I0EBMIY,7749
|
|
41
41
|
nv_ingest_api/internal/extract/pptx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -48,19 +48,19 @@ nv_ingest_api/internal/primitives/control_message_task.py,sha256=nWVB3QsP6p8BKwH
|
|
|
48
48
|
nv_ingest_api/internal/primitives/ingest_control_message.py,sha256=rvipBiiUaHuRhupFCFDCG8rv0PylSJibCiJ7rDeb98A,8514
|
|
49
49
|
nv_ingest_api/internal/primitives/nim/__init__.py,sha256=i_i_fBR2EcRCh2Y19DF6GM3s_Q0VPgo_thPnhEIJUyg,266
|
|
50
50
|
nv_ingest_api/internal/primitives/nim/default_values.py,sha256=W92XjfyeC6uuVxut6J7p00x1kpNsnXIDb97gSVytZJk,380
|
|
51
|
-
nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=
|
|
51
|
+
nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=m8_whtmfXFGSw4-Efu938NKG97nzhygyuHB8Tq-a0Ec,16570
|
|
52
52
|
nv_ingest_api/internal/primitives/nim/nim_model_interface.py,sha256=wMEgoi79YQn_4338MVemkeZgM1J-vnz0aZWpvqDhib4,2392
|
|
53
53
|
nv_ingest_api/internal/primitives/nim/model_interface/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
54
54
|
nv_ingest_api/internal/primitives/nim/model_interface/cached.py,sha256=b1HX-PY1ExW5V6pXC1ZiHdobeG_BmbPr3rBbVJef13s,11003
|
|
55
55
|
nv_ingest_api/internal/primitives/nim/model_interface/decorators.py,sha256=qwubkHs4WjnexM6rI0wkjWCsrVNEbA4Wjk2oKL9OYCU,1499
|
|
56
56
|
nv_ingest_api/internal/primitives/nim/model_interface/deplot.py,sha256=TvKdk6PTuI1WNhRmNNrvygaI_DIutkJkDL-XdtLZQac,10787
|
|
57
|
-
nv_ingest_api/internal/primitives/nim/model_interface/helpers.py,sha256=
|
|
58
|
-
nv_ingest_api/internal/primitives/nim/model_interface/nemoretriever_parse.py,sha256=
|
|
59
|
-
nv_ingest_api/internal/primitives/nim/model_interface/
|
|
57
|
+
nv_ingest_api/internal/primitives/nim/model_interface/helpers.py,sha256=iyGxAr4tG2UZ7LtXXoWO_kF-KsObhPrmZ46Nl0Mi-Ag,11592
|
|
58
|
+
nv_ingest_api/internal/primitives/nim/model_interface/nemoretriever_parse.py,sha256=WysjDZeegclO3mZgVcGOwzWbr8wSI4pWRiYD4iC2EXo,7098
|
|
59
|
+
nv_ingest_api/internal/primitives/nim/model_interface/ocr.py,sha256=Vhim3py_rc5jA0BoKubwfekEqOwxUUePzcmc59pRuOk,21458
|
|
60
60
|
nv_ingest_api/internal/primitives/nim/model_interface/parakeet.py,sha256=5PqD2JuHY2rwd-6SSB4axr2Dd79vm95sAEkcmI3U7ME,12977
|
|
61
61
|
nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py,sha256=lFhppNqrq5X_fzbCWKphvZQMzaJd3gHrkWsyJORzFrU,5010
|
|
62
62
|
nv_ingest_api/internal/primitives/nim/model_interface/vlm.py,sha256=qJ382PU1ZrIM-SR3cqIhtY_W2rmHec2HIa2aUB2SvaU,6031
|
|
63
|
-
nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=
|
|
63
|
+
nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=zpfEZIPctWhNfREnP6e77zffU8vs_RfnMprBj-2jXXk,42847
|
|
64
64
|
nv_ingest_api/internal/primitives/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
65
|
nv_ingest_api/internal/primitives/tracing/latency.py,sha256=5kVTeYRbRdTlT_aI4MeS20N_S7mqCcLqZR6YHtxhXkY,2215
|
|
66
66
|
nv_ingest_api/internal/primitives/tracing/logging.py,sha256=SSzIgS7afLH-e1C7VagYDmkkA6rTXmQ-bmtLjoEguhg,3851
|
|
@@ -68,21 +68,21 @@ nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=O5dD7Z7j43nrjqn0Axhx
|
|
|
68
68
|
nv_ingest_api/internal/schemas/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
69
69
|
nv_ingest_api/internal/schemas/extract/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
70
70
|
nv_ingest_api/internal/schemas/extract/extract_audio_schema.py,sha256=W-nEBriqiNkjpaQ5AT_8LhtVXlW8AhlcftmoeQQtKAs,3812
|
|
71
|
-
nv_ingest_api/internal/schemas/extract/extract_chart_schema.py,sha256=
|
|
71
|
+
nv_ingest_api/internal/schemas/extract/extract_chart_schema.py,sha256=wDcvQ5XtOjIBGSWtNjQPiPtVKrSOYqbf2mnLrhfhue4,4283
|
|
72
72
|
nv_ingest_api/internal/schemas/extract/extract_docx_schema.py,sha256=M2N7WjMNvSemHcJHWeNUD_kFG0wC5VE2W3K6SVrJqvA,3761
|
|
73
73
|
nv_ingest_api/internal/schemas/extract/extract_html_schema.py,sha256=lazpONTGZ6Fl420BGBAr6rogFGtlzBiZTc1uA694OIs,841
|
|
74
74
|
nv_ingest_api/internal/schemas/extract/extract_image_schema.py,sha256=GC4xV8Z9TPLOuxlEtf2fbklSSp8ETGMrDpZgMQ02UwA,3766
|
|
75
|
-
nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py,sha256=
|
|
75
|
+
nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py,sha256=z42cs7w-U-IUCMGByp5e_iBUZ7KCl5vTIXkP64ty6gY,3973
|
|
76
76
|
nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py,sha256=G9g1lEORmryUWTzDyZ0vHAuPnVMK7VaRx0E4xzmAw3Q,6589
|
|
77
77
|
nv_ingest_api/internal/schemas/extract/extract_pptx_schema.py,sha256=5dT0kv-Mmpe5KW-BZc1JOW3rUlgzVZI0rpB79NWytmw,3761
|
|
78
|
-
nv_ingest_api/internal/schemas/extract/extract_table_schema.py,sha256=
|
|
78
|
+
nv_ingest_api/internal/schemas/extract/extract_table_schema.py,sha256=vd_1mf_LmQGvSTpQCuWr6ubsiav4TMhp_SpKGO-6RLc,3935
|
|
79
79
|
nv_ingest_api/internal/schemas/message_brokers/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
80
80
|
nv_ingest_api/internal/schemas/message_brokers/message_broker_client_schema.py,sha256=4xTSFE_vH7yZE9RRJRflFAG9hNXIaF6K020M_xA7ylw,1351
|
|
81
81
|
nv_ingest_api/internal/schemas/message_brokers/request_schema.py,sha256=LZX_wXDxTamVFqTQs2Yd8uvWyPE5mddHAWSU4PtfEIQ,966
|
|
82
82
|
nv_ingest_api/internal/schemas/message_brokers/response_schema.py,sha256=4b275HlzBSzpmuE2wdoeaGKPCdKki3wuWldtRIfrj8w,727
|
|
83
83
|
nv_ingest_api/internal/schemas/meta/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
84
84
|
nv_ingest_api/internal/schemas/meta/base_model_noext.py,sha256=8hXU1uuiqZ6t8EsoZ8vlC5EFf2zSZrKEX133FcfZMwI,316
|
|
85
|
-
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=
|
|
85
|
+
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=ceYQjRjhBSDbbZ6q-Db7Y6GHVOvWPdGAMb3TX1vMWfY,8321
|
|
86
86
|
nv_ingest_api/internal/schemas/meta/metadata_schema.py,sha256=VnAzkSFat_ckI19mlwQTlFrvP6EZVCwyNl9bt51b8oU,7193
|
|
87
87
|
nv_ingest_api/internal/schemas/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
88
88
|
nv_ingest_api/internal/schemas/mutate/mutate_image_dedup_schema.py,sha256=k1JOdlPPpsipc0XhHf-9YxJ_-W0HvpVE1ZhYmr7fzj0,395
|
|
@@ -90,17 +90,17 @@ nv_ingest_api/internal/schemas/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQu
|
|
|
90
90
|
nv_ingest_api/internal/schemas/store/store_embedding_schema.py,sha256=tdKeiraim9CDL9htgp4oUSCoPMoO5PrHBnlXqDyCpMw,956
|
|
91
91
|
nv_ingest_api/internal/schemas/store/store_image_schema.py,sha256=p2LGij9i6sG6RYmsfdiQOiWIc2j-POjxYrNuMrp3ELU,1010
|
|
92
92
|
nv_ingest_api/internal/schemas/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
93
|
-
nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py,sha256=
|
|
93
|
+
nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py,sha256=gRJCfEGrJXErMF_GsZDjyDR8HOrLrUNxz2BVS6LSPY8,542
|
|
94
94
|
nv_ingest_api/internal/schemas/transform/transform_image_filter_schema.py,sha256=31ThI5fr0yyENeJeE1xMAA-pxk1QVJLwM842zMate_k,429
|
|
95
|
-
nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py,sha256=
|
|
95
|
+
nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py,sha256=RZCISA8CUqKiY8eJuk4uWxzo4PZ-fuYdzMO7_LYFkoM,1117
|
|
96
96
|
nv_ingest_api/internal/schemas/transform/transform_text_splitter_schema.py,sha256=D9K8tvu-tkEBQkZo7uuRzgrHdGyM3ZcNycHbHy5HV2E,791
|
|
97
97
|
nv_ingest_api/internal/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
98
98
|
nv_ingest_api/internal/store/embed_text_upload.py,sha256=maxb4FPsBvWgvlrjAPEBlRZEFdJX5NxPG-p8kUbzV7I,9898
|
|
99
99
|
nv_ingest_api/internal/store/image_upload.py,sha256=GNlY4k3pfcHv3lzXxkbmGLeHFsf9PI25bkBn6Xn9h3I,9654
|
|
100
100
|
nv_ingest_api/internal/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
101
101
|
nv_ingest_api/internal/transform/caption_image.py,sha256=0ILCG2F8ESqKtZiPUM-6F1BHUflFZ76Dzi2GNzkE-lU,8517
|
|
102
|
-
nv_ingest_api/internal/transform/embed_text.py,sha256=
|
|
103
|
-
nv_ingest_api/internal/transform/split_text.py,sha256
|
|
102
|
+
nv_ingest_api/internal/transform/embed_text.py,sha256=pVM9gULOrVf3IJrpFDZH0X7lWQbr4BTbrLG3LXp_G7s,20095
|
|
103
|
+
nv_ingest_api/internal/transform/split_text.py,sha256=LAtInGVuydH43UwjNMQWFVC1A6NdhXP_dZup2xX4qEo,7745
|
|
104
104
|
nv_ingest_api/util/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
105
105
|
nv_ingest_api/util/control_message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
106
|
nv_ingest_api/util/control_message/validators.py,sha256=KvvbyheJ5rbzvJbH9JKpMR9VfoI0b0uM6eTAZte1p44,1315
|
|
@@ -122,8 +122,8 @@ nv_ingest_api/util/exception_handlers/schemas.py,sha256=NJngVNf9sk5Uz6CFFfkNO_LB
|
|
|
122
122
|
nv_ingest_api/util/image_processing/__init__.py,sha256=Jiy8C1ZuSrNb_eBM1ZTV9IKFIsnjhZi6Ku3JJhVLimA,104
|
|
123
123
|
nv_ingest_api/util/image_processing/clustering.py,sha256=sUGlZI4cx1q8h4Pns1N9JVpdfSM2BOH8zRmn9QFCtzI,9236
|
|
124
124
|
nv_ingest_api/util/image_processing/processing.py,sha256=LSoDDEmahr7a-qSS12McVcowRe3dOrAZwa1h-PD_JPQ,6554
|
|
125
|
-
nv_ingest_api/util/image_processing/table_and_chart.py,sha256=
|
|
126
|
-
nv_ingest_api/util/image_processing/transforms.py,sha256=
|
|
125
|
+
nv_ingest_api/util/image_processing/table_and_chart.py,sha256=idCIjiLkY-usI2EARchg3omWLtIYmYA-1tdUUV2lbno,16338
|
|
126
|
+
nv_ingest_api/util/image_processing/transforms.py,sha256=FBcORrvjimn3c1naaVxRMm6PMJ2Dt6Uy9AZRUxdbkR0,23829
|
|
127
127
|
nv_ingest_api/util/imports/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
128
128
|
nv_ingest_api/util/imports/callable_signatures.py,sha256=e2bJB1pmkN4Ee-Bf-VggOSBaQ4RXofWF5eKkWXgIj2U,1855
|
|
129
129
|
nv_ingest_api/util/imports/dynamic_resolvers.py,sha256=7GByV_-8z2X0tnVoabCxVioxOP3sYMros3ZllVAW-wY,4343
|
|
@@ -131,16 +131,16 @@ nv_ingest_api/util/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
|
|
|
131
131
|
nv_ingest_api/util/logging/configuration.py,sha256=XUo7yON9V8IDPfN3x8RBwpZ3Gv4zrRq8QwsByf4dGNE,981
|
|
132
132
|
nv_ingest_api/util/message_brokers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
133
133
|
nv_ingest_api/util/message_brokers/simple_message_broker/__init__.py,sha256=WaQ3CWIpIKWEivT5kL-bkmzcSQKLGFNFHdXHUJjqZFs,325
|
|
134
|
-
nv_ingest_api/util/message_brokers/simple_message_broker/broker.py,sha256=
|
|
134
|
+
nv_ingest_api/util/message_brokers/simple_message_broker/broker.py,sha256=PekxaxVcAa9k1wgUtozlr04SW3sAeqYJE-wdVBZf9eo,17264
|
|
135
135
|
nv_ingest_api/util/message_brokers/simple_message_broker/ordered_message_queue.py,sha256=3p-LRqG8qLnsfEhBNf73_DG22C08JKahTqUvPLS2Apg,2554
|
|
136
|
-
nv_ingest_api/util/message_brokers/simple_message_broker/simple_client.py,sha256=
|
|
136
|
+
nv_ingest_api/util/message_brokers/simple_message_broker/simple_client.py,sha256=CCRAbq2EBH2quX9UTfuBbz3tTMDnWqhEF33roFwbyuk,16484
|
|
137
137
|
nv_ingest_api/util/metadata/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
|
|
138
|
-
nv_ingest_api/util/metadata/aggregators.py,sha256=
|
|
138
|
+
nv_ingest_api/util/metadata/aggregators.py,sha256=YYdvJ1E04eGFZKKHUxXoH6mzLg8nor9Smvnv0qzqK5w,15988
|
|
139
139
|
nv_ingest_api/util/multi_processing/__init__.py,sha256=4fojP8Rp_5Hu1YAkqGylqTyEZ-HBVVEunn5Z9I99swA,242
|
|
140
140
|
nv_ingest_api/util/multi_processing/mp_pool_singleton.py,sha256=dTfP82DgGPaXEJH3jywTO8rNlLZUniD4FFzwv84_giE,7372
|
|
141
141
|
nv_ingest_api/util/nim/__init__.py,sha256=UqbiXFCqjWcjNvoduXd_0gOUOGBT8JvppiYHOmMyneA,1775
|
|
142
142
|
nv_ingest_api/util/pdf/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
143
|
-
nv_ingest_api/util/pdf/pdfium.py,sha256=
|
|
143
|
+
nv_ingest_api/util/pdf/pdfium.py,sha256=1aPCnPKXHWnncYoMO8HllYjrhODSXIeRBIsSLDevpYs,15667
|
|
144
144
|
nv_ingest_api/util/schema/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
145
145
|
nv_ingest_api/util/schema/schema_validator.py,sha256=H0yZ_i_HZaiBRUCGmTBfRB9-hURhVqyd10aS_ynM1_0,321
|
|
146
146
|
nv_ingest_api/util/service_clients/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
@@ -153,8 +153,8 @@ nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=dZ-jrk7IK7oNtHoXFS
|
|
|
153
153
|
nv_ingest_api/util/string_processing/__init__.py,sha256=mkwHthyS-IILcLcL1tJYeF6mpqX3pxEw5aUzDGjTSeU,1411
|
|
154
154
|
nv_ingest_api/util/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
155
|
nv_ingest_api/util/system/hardware_info.py,sha256=ORZeKpH9kSGU_vuPhyBwkIiMyCViKUX2CP__MCjrfbU,19463
|
|
156
|
-
nv_ingest_api-25.
|
|
157
|
-
nv_ingest_api-25.
|
|
158
|
-
nv_ingest_api-25.
|
|
159
|
-
nv_ingest_api-25.
|
|
160
|
-
nv_ingest_api-25.
|
|
156
|
+
nv_ingest_api-25.8.0rc2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
157
|
+
nv_ingest_api-25.8.0rc2.dist-info/METADATA,sha256=xEisyVAPeQGxKOHZ8gu9MuDrJYsGVaNxJXeEtCcEII8,13935
|
|
158
|
+
nv_ingest_api-25.8.0rc2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
159
|
+
nv_ingest_api-25.8.0rc2.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
|
|
160
|
+
nv_ingest_api-25.8.0rc2.dist-info/RECORD,,
|
|
File without changes
|
{nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
{nv_ingest_api-25.7.7.dev20250707.dist-info → nv_ingest_api-25.8.0rc2.dist-info}/top_level.txt
RENAMED
|
File without changes
|