From 05f90e2fb3068c610983490e36709bd322be8410 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 14 May 2025 11:45:24 -0500 Subject: [PATCH 01/50] added di to cu migration tool code --- data/new/GoldmanSachs.pdf | Bin 0 -> 132 bytes ...ionofBritishColumbia-annualReport-2012.pdf | Bin 0 -> 132 bytes python/di_to_cu_migration_tool/.sample_env | 24 + python/di_to_cu_migration_tool/README.md | 0 python/di_to_cu_migration_tool/constants.py | 66 +++ .../cu_converter_customGen.py | 519 ++++++++++++++++++ .../cu_converter_customNeural.py | 428 +++++++++++++++ .../di_to_cu_migration_tool.py | 401 ++++++++++++++ .../field_definitions.py | 40 ++ .../field_type_conversion.py | 162 ++++++ python/di_to_cu_migration_tool/get_ocr.py | 172 ++++++ .../di_to_cu_migration_tool/requirements.txt | 8 + 12 files changed, 1820 insertions(+) create mode 100644 data/new/GoldmanSachs.pdf create mode 100644 data/new/InsuranceCorporationofBritishColumbia-annualReport-2012.pdf create mode 100644 python/di_to_cu_migration_tool/.sample_env create mode 100644 python/di_to_cu_migration_tool/README.md create mode 100644 python/di_to_cu_migration_tool/constants.py create mode 100644 python/di_to_cu_migration_tool/cu_converter_customGen.py create mode 100644 python/di_to_cu_migration_tool/cu_converter_customNeural.py create mode 100644 python/di_to_cu_migration_tool/di_to_cu_migration_tool.py create mode 100644 python/di_to_cu_migration_tool/field_definitions.py create mode 100644 python/di_to_cu_migration_tool/field_type_conversion.py create mode 100644 python/di_to_cu_migration_tool/get_ocr.py create mode 100644 python/di_to_cu_migration_tool/requirements.txt diff --git a/data/new/GoldmanSachs.pdf b/data/new/GoldmanSachs.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a90ce6f63c87f73e5036fed00ccf2da1127f8aa0 GIT binary patch literal 132 zcmWN?!41P83;@7CQ?Nh-0SqSF5Q7U+TcSep==6=o^3u}JeK=< z?hEy|8b={@t)jOqM@=13;@u*r{DsWj|R}&kdPE++Ts*+(bLz}TfK|Fy|#}kV;p_g`dP>0C4Igv zC(hK~x*tsXvQw*B^^zR;9lQjPuto#K0SGy}1U49PA;GetMPjfKlO!LE^$~M4E_+@x Pi_p~TkJTOgvYF`*M~o" + +API_VERSION = "2025-05-01-preview" + +SUBSCRIPTION_ID = "" # This is your subscription ID + +# if using an API KEY +API_KEY="" + +# Source blob storage & target blob storage +SOURCE_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" +SOURCE_BLOB_CONTAINER_NAME = "<>" +SOURCE_BLOB_FOLDER_PREFIX = "<>" +SOURCE_BLOB_STORAGE_SAS_TOKEN = "<>" + +TARGET_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" +TARGET_BLOB_CONTAINER_NAME = "<>" +TARGET_BLOB_FOLDER_PREFIX = "<>" +TARGET_BLOB_STORAGE_SAS_TOKEN = "<>" + +# SAS url to the pdf blob that you want to analyzer +ANALYZE_PDF_URL = "<>" +ANALYZER_RESULT_OUTPUT_JSON = "src/CustomGen/src/tests/cu_converter/analyzer_result.json" # where you want to save the analyze result diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md new file mode 100644 index 0000000..e69de29 diff --git a/python/di_to_cu_migration_tool/constants.py b/python/di_to_cu_migration_tool/constants.py new file mode 100644 index 0000000..9712518 --- /dev/null +++ b/python/di_to_cu_migration_tool/constants.py @@ -0,0 +1,66 @@ +# Supported DI versions +DI_VERSIONS = ["CustomGen", "CustomNeural"] +CU_API_VERSION = "2025-05-01-preview" + +# constants +MAX_FIELD_COUNT = 100 +MAX_FIELD_LENGTH = 64 + +# standard file names +FIELDS_JSON = "fields.json" +LABELS_JSON = ".labels.json" +VALIDATION_TXT = "validation.txt" +PDF = ".pdf" +OCR_JSON = ".ocr.json" + +# for field type conversion +SUPPORT_FIELD_TYPE = [ + "string", + "number", + "integer", + "array", + "object", + "date", + "time", + "boolean", +] + +CONVERT_TYPE_MAP = { + "selectionMark": "boolean", + "currency": "number", +} + +FIELD_VALUE_MAP = { + "number": "valueNumber", + "integer": "valueInteger", + "date": "valueDate", + "time": "valueTime", + "selectionMark": "valueSelectionMark", + "address": "valueAddress", + "phoneNumber": "valuePhoneNumber", + "currency": "valueCurrency", + "string": "valueString", + "boolean": "valueBoolean", +} + +CHECKED_SYMBOL = "☒" +UNCHECKED_SYMBOL = "☐" + +# for CU conversion +# spec for valid field types +VALID_CU_FIELD_TYPES = { + "string": "valueString", + "date": "valueDate", + "phoneNumber": "valuePhoneNumber", + "integer": "valueInteger", + "number": "valueNumber", + "array": "valueArray", + "object": "valueObject", + "boolean": "valueBoolean", + "time": "valueTime", + "selectionMark": "valueSelectionMark" # for DI only +} + +DATE_FORMATS_SLASHED = ["%d/%m/%y", "%m/%d/%y", "%y/%m/%d","%d/%m/%Y", "%m/%d/%Y", "%Y/%m/%d"] # %Y is for 4-year format (Ex: 2015) and %y is for 2-year format (Ex: 15) +DATE_FORMATS_DASHED = ["%d-%m-%y", "%m-%d-%y", "%y-%m-%d","%d-%m-%Y", "%m-%d-%Y", "%Y-%m-%d"] # can have dashes, instead of slashes +COMPLETE_DATE_FORMATS = DATE_FORMATS_SLASHED + DATE_FORMATS_DASHED # combine the two formats diff --git a/python/di_to_cu_migration_tool/cu_converter_customGen.py b/python/di_to_cu_migration_tool/cu_converter_customGen.py new file mode 100644 index 0000000..73a6271 --- /dev/null +++ b/python/di_to_cu_migration_tool/cu_converter_customGen.py @@ -0,0 +1,519 @@ +# imports from built-in packages +from dateutil.parser import parse +from datetime import datetime +import json +from pathlib import Path +import re +import sys +import typer +from typing import Optional, Tuple + +# imports from external packages (need to use pip install) +from rich import print # For colored output + +# imports from same project +from constants import CU_API_VERSION, MAX_FIELD_LENGTH, VALID_CU_FIELD_TYPES +from field_definitions import FieldDefinitions + +# schema constants subject to change +ANALYZER_FIELDS = "fieldSchema" +# REPLACE THIS WITH YOUR OWN DESCRIPTION IF NEEDED +# Remember that dynamic tables are arrays and fixed tables are objects +ANALYZER_DESCRIPTION = "1. Define your schema by specifying the fields you want to extract from the input files. Choose clear and simple `field names`. Use `field descriptions` to provide explanations, exceptions, rules of thumb, and other details to clarify the desired behavior.\n\n2. For each field, indicate the `value type` of the desired output. Besides basic types like strings, dates, and numbers, you can define more complex structures such as `tables` (repeated items with subfields) and `fixed tables` (groups of fields with common subfields)." +CU_LABEL_SCHEMA = f"https://schema.ai.azure.com/mmi/{CU_API_VERSION}/labels.json" + +def convert_bounding_regions_to_source(page_number: int, polygon: list) -> str: + # Convert polygon to string format + polygon_str = ",".join(str(coord) for coord in polygon) + source = f"D({page_number},{polygon_str})" + return source + +def format_angle(angle: float) -> float: + rounded_angle = round(angle, 7) + formatted_num = f"{rounded_angle:.7f}".rstrip('0') # Remove trailing zeros + return float(formatted_num) + +def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Path, field_definitions: FieldDefinitions, internal: bool = True) -> dict: + """ + Convert DI 4.0 preview CustomGen fields.json to analyzer.json format. + + Args: + fields_json_path (Path): Path to the input fields.json file. + analyzer_prefix (Optional(str)): Prefix for the analyzer name. + target_dir (Optional[Path]): Output directory for the analyzer.json file. + """ + try: + with open(fields_json_path, 'r') as f: + fields_data = json.load(f) + except FileNotFoundError: + print(f"[red]Error: fields.json file not found at {fields_json_path}.[/red]") + sys.exit(1) + except json.JSONDecodeError: + print("[red]Error: Invalid JSON in fields.json.[/red]") + sys.exit(1) + + doc_type = fields_data.get('docType') + + field_definitions.clear_definitions() + + # Build analyzer.json content + analyzer_id = f"{analyzer_prefix}_{doc_type}" if analyzer_prefix else doc_type + + # build analyzer.json appropriately based on if internal or not + analyzer_data = { + "analyzerId": analyzer_id, + "baseAnalyzerId": "prebuilt-documentAnalyzer", + "config": { + "returnDetails": True, + # Add the following line as a temp workaround before service issue is fixed. + "enableLayout": True, + "enableBarcode": False, + "enableFormula": False, + "estimateFieldSourceAndConfidence": True + }, + ANALYZER_FIELDS: { + "name": doc_type, + "description": ANALYZER_DESCRIPTION, + "fields": {}, + "definitions": {} + }, + "warnings": fields_data.get("warnings", []), + "status": fields_data.get("status", "undefined"), + "templateId": fields_data.get("templateId", "document-2024-12-01") + } + + if internal: + analyzer_data["config"]["_promptId"] = "document" + + # Update field schema to be in CU format + fields = fields_data.get(ANALYZER_FIELDS, {}) + if (len(fields) == 0): + print("[red]Error: Fields.json should not be empty.[/red]") + sys.exit(1) + for key, value in fields.items(): + if len(key) > MAX_FIELD_LENGTH and not internal: + print(f"[red]Error: Field key '{key}' contains {len(key)}, which exceeds the limit of {MAX_FIELD_LENGTH} characters. [/red]") + sys.exit(1) + analyzer_field = recursive_convert_field_to_analyzer_helper(key, value, field_definitions) + + # Add field to fieldLabels + analyzer_data[ANALYZER_FIELDS]["fields"][key] = analyzer_field + + # Update defintions accordingly + analyzer_data[ANALYZER_FIELDS]["definitions"] = field_definitions.get_all_definitions() + # Determine output path + if target_dir: + analyzer_json_path = target_dir / 'analyzer.json' + else: + analyzer_json_path = fields_json_path.parent / 'analyzer.json' + + # Ensure target directory exists + analyzer_json_path.parent.mkdir(parents=True, exist_ok=True) + + # Write analyzer.json + with open(analyzer_json_path, 'w') as f: + json.dump(analyzer_data, f, indent=4) + + print(f"[green]Successfully converted {fields_json_path} to analyzer.json at {analyzer_json_path}[/green]\n") + return analyzer_data + +def recursive_convert_field_to_analyzer_helper(key: str, value: dict, field_definitions: FieldDefinitions) -> dict: + # this is the method that does the conversion of the fields itself + + analyzer_field = { + "type": value.get("type"), + "method": "extract", + } + + if value.get("type") == "array": + analyzer_field["method"] = value.get("method", "generate") + analyzer_field["description"] = value.get("description", "") + analyzer_field["items"] = recursive_convert_field_to_analyzer_helper(key, value.get("items"), field_definitions) + elif value.get("type") == "object": + # if the properties are objects, this is a fixed sized table + # if the properties are not objects, this is a dynamic sized table + fixed_table = False + first_value = next(iter(value.get("properties").values())) + if(first_value.get("type") == "object"): + fixed_table = True + analyzer_field["description"] = value.get("description", "") + analyzer_field["properties"] = {} + + if not fixed_table: + for i, (key, item) in enumerate(value.get("properties").items()): + analyzer_field["properties"][key] = recursive_convert_field_to_analyzer_helper(key, item, field_definitions) + else: + analyzer_field["method"] = value.get("method", "generate") + first_row_key = "" # only need to use the first row for creating a definition, since the rest will be the same as it is a fixed table + for i, (row_key, row_item) in enumerate(value.get("properties").items()): + if i == 0: + first_row_key = row_key + definitions_key = f"{key}_{row_key}" + if len(definitions_key) > MAX_FIELD_LENGTH: + print(f"[red]Error: The fixed table definition '{definitions_key}' will contain {len(definitions_key)}, which exceeds the limit of {MAX_FIELD_LENGTH} characters. Please shorten either the table name or row name. [/red]") + sys.exit(1) + # need to add methods to all the columns + for property_key, property_data in row_item["properties"].items(): + if property_data.get("method") is None: + property_data["method"] = "extract" + if property_data.get("description") is None: + property_data["description"] = "" + definitions_value = row_item + field_definitions.add_definition(definitions_key, definitions_value) + analyzer_field["properties"][row_key] = {} + analyzer_field["properties"][row_key]["$ref"] = f"#/$defs/{key}_{first_row_key}" + + else: + analyzer_field["description"] = value.get("description", "") + + return analyzer_field + +def convert_di_labels_to_cu(di_labels_path: Path, target_dir: Path) -> None: + """ + Convert DI 4.0 preview CustomGen format labels.json to Content Understanding format labels.json. + + Args: + di_labels_path (Path): Path to the Document Intelligence labels.json file. + target_dir (Path): Output directory for the Content Understanding labels.json file. + """ + try: + with open(di_labels_path, 'r', encoding="utf-8") as f: + di_data = json.load(f) + except FileNotFoundError: + print(f"[red]Error: Document Intelligence labels.json file not found at {di_labels_path}.[/red]") + sys.exit(1) + except json.JSONDecodeError: + print("[red]Error: Invalid JSON in Document Intelligence labels.json.[/red]") + sys.exit(1) + + # Start building Content Understanding labels.json + cu_data = { + "$schema": CU_LABEL_SCHEMA, + "fileId": di_data.get("fileId", ""), + "fieldLabels": {}, + "metadata": di_data.get("metadata", {}) + } + + field_labels = di_data.get("fieldLabels", {}) + for key, value in field_labels.items(): + cu_field = recursive_convert_di_label_to_cu_helper(value) + + # Include original label in metadata + + # Add field to fieldLabels + cu_data["fieldLabels"][key] = cu_field + + # Write Content Understanding labels.json + target_dir.mkdir(parents=True, exist_ok=True) + cu_labels_path = target_dir / di_labels_path.name + + with open(cu_labels_path, 'w') as f: + json.dump(cu_data, f, indent=4, ensure_ascii=False) + + print(f"[green]Successfully converted Document Intelligence labels.json to Content Understanding labels.json at {cu_labels_path}[/green]\n") + +def recursive_convert_di_label_to_cu_helper(value: dict) -> dict: + value_type = value.get("type") + if(value_type not in VALID_CU_FIELD_TYPES and value_type != "selectionMark"): + print(f"[red]Unexpected field type: {value_type}. Please refer to the specification for valid field types.[/red]") + sys.exit(1) + + di_label = { + "type": value_type + } + + if value_type == "array": + value_array = value.get("valueArray") + di_label["kind"] = value.get("kind", "confirmed") + di_label["valueArray"] = value_array + for i, item in enumerate(value_array): + value_array[i] = recursive_convert_di_label_to_cu_helper(item) + elif value_type == "object": + value_object = value.get("valueObject") + di_label["kind"] = value.get("kind", "confirmed") + di_label["valueObject"] = value_object + for i, item in value_object.items(): + value_object[i] = recursive_convert_di_label_to_cu_helper(item) + else: + value_part = VALID_CU_FIELD_TYPES[value_type] + if value.get(value_part) is not None and value.get(value_part) != "": + di_label[value_part] = value.get(value_part) + else: + if value_type == "date": + date_string = value.get("content") + formats_to_try = ["%B %d,%Y", "parse", "%B %d, %Y", "%m/%d/%Y"] + finished_date_normalization = False # to keep track of whether we have finished normalizing the date, if not, date will be set to originalDate + for fmt in formats_to_try: + try: + if fmt == "parse": + di_label["valueDate"] = parse(date_string).date().strftime("%Y-%m-%d") + else: + date_obj = datetime.strptime(date_string, fmt) + di_label["valueDate"] = date_obj.strftime("%Y-%m-%d") + finished_date_normalization = True + except Exception as ex: + continue + if not finished_date_normalization: + di_label["valueDate"] = date_string # going with the default + elif value_type == "number": + try: + di_label["valueNumber"] = float(value.get("content")) # content can be easily converted to a float + except Exception as ex: + # strip the string of all non-numerical values and periods + string_value = value.get("content") + cleaned_string = re.sub(r'[^0-9.]', '', string_value) + cleaned_string = cleaned_string.strip('.') # Remove any leading or trailing periods + # if more than one period exists, remove them all + if cleaned_string.count('.') > 1: + print("More than one decimal point exists, so will be removing them all.") + cleaned_string = cleaned_string = re.sub(r'\.', '', string_value) + di_label["valueNumber"] = float(cleaned_string) + elif value_type == "integer": + try: + di_label["valueInteger"] = int(value.get("content")) # content can be easily converted to an int + except Exception as ex: + # strip the string of all non-numerical values + string_value = value.get("content") + cleaned_string = re.sub(r'[^0-9]', '', string_value) + di_label["valueInteger"] = int(cleaned_string) + else: + di_label[value_part] = value.get("content") + di_label["spans"] = value.get("spans", []) + + if(value.get("kind", "confirmed") == "confirmed" and di_label["type"] != "array" and di_label["type"] != "object"): + # Copy confidence if present + di_label["confidence"] = value.get("confidence", None) + + # Convert boundingRegions to source + bounding_regions = value.get("boundingRegions", []) + sources = [] + for region in bounding_regions: + page_number = region.get("pageNumber") + polygon = region.get("polygon") + if page_number is None or polygon is None: + continue + # Convert polygon to string format + source = convert_bounding_regions_to_source(page_number, polygon) + sources.append(source) + if sources: + di_label["source"] = ";".join(sources) + + if(value.get("type") != "array" and value.get("type") != "object"): + di_label["kind"] = value.get("kind", "confirmed") + di_label["metadata"] = value.get("metadata", {}) + + return di_label + +def convert_ocr_to_result(di_ocr_path: Path, target_dir: Path) -> None: + """ + Convert Document Intelligence format ocr.json to Content Understanding format result.json + + Args: + di_ocr_path (Path): Path to the Document Intelligence ocr.json file. + target_dir (Path): Output directory for the Content Undrestanding result.json file. + """ + try: + with open(di_ocr_path, 'r', encoding="utf-8") as f: + ocr_data = json.load(f) + except FileNotFoundError: + print(f"[red]Error: Document Intelligence ocr.json file not found at {di_ocr_path}.[/red]") + sys.exit(1) + except json.JSONDecodeError: + print("[red]Error: Invalid JSON in Document Intelligence ocr.json.[/red]") + sys.exit(1) + + # Start building Content Understanding results.json + cu_results_data = { + "id": ocr_data.get("id", ""), + "status": (ocr_data.get("status", "")).capitalize(), + "result": {} + } + + # Setting up the result section + di_results = ocr_data.get("analyzeResult") + cu_results_data["result"]["analyzerId"] = di_results["modelId"] + cu_results_data["result"]["apiVersion"] = CU_API_VERSION + cu_results_data["result"]["createdAt"] = ocr_data.get("createdDateTime", "") + if ocr_data.get("warnings") is not None: + cu_results_data["result"]["warnings"] = ocr_data.get("warnings") + + # Setting up the contents subsection within result section + cu_results_data["result"]["contents"] = [{}] + cu_results_data["result"]["contents"][0]["markdown"] = di_results["content"] + cu_results_data["result"]["contents"][0]["kind"] = di_results.get("kind", "document") + cu_results_data["result"]["contents"][0]["startPageNumber"] = di_results["pages"][0]["pageNumber"] + cu_results_data["result"]["contents"][0]["endPageNumber"] = di_results["pages"][-1]["pageNumber"] + cu_results_data["result"]["contents"][0]["unit"] = di_results["pages"][0].get("unit", "inch") + + # Configuring pages + if (di_results.get("pages") is not None): + cu_results_data["result"]["contents"][0]["pages"] = [] + for page in di_results["pages"]: + cu_page = { + "pageNumber": page["pageNumber"], + "angle": format_angle(page["angle"]), + "width": page["width"], + "height": page["height"], + "spans": page["spans"], + "words": [], + "lines": [] + } + if(page.get("selectionMarks") is not None): + cu_page["selectionMarks"] = page.get("selectionMarks") + for word in page["words"]: + cu_word = { + "content": word["content"], + "span": word["span"], + "confidence": word["confidence"], + "source": convert_bounding_regions_to_source(page['pageNumber'], word['polygon']) # map str function to each element in polygon and then joins it all together with , + } + cu_page["words"].append(cu_word) + for line in page["lines"]: + cu_line = { + "content": line["content"], + "source": convert_bounding_regions_to_source(page['pageNumber'], line['polygon']), # map str function to each element in polygon and then joins it all together with , + } + if len(line["spans"]) == 1: + cu_line["span"] = line["spans"][0] + else: + # If mulitple spans, offset becomes the lowest offset + # and length becomes max offset + length of max offset - min offset + min_offset = min([span["offset"] for span in line["spans"]]) + max_offset = max([span["offset"] for span in line["spans"]]) + max_length = next(span for span in line["spans"] if span["offset"] == max_offset)["length"] + cu_line["span"] = { + "offset": min_offset, + "length": max_offset + max_length - min_offset + } + cu_page["lines"].append(cu_line) + cu_results_data["result"]["contents"][0]["pages"].append(cu_page) + + # Configuring paragraphs + if (di_results.get("paragraphs") is not None): + cu_results_data["result"]["contents"][0]["paragraphs"] = [] + for paragraph in di_results["paragraphs"]: + cu_paragraph = { + "role": paragraph.get("role", ""), + "content": paragraph["content"], + "source": paragraph.get("boundingRegions", None), + "span": paragraph["spans"][0] + } + if (cu_paragraph["source"] is not None): + cu_paragraph["source"] = convert_bounding_regions_to_source(paragraph['boundingRegions'][0]['pageNumber'], paragraph['boundingRegions'][0]['polygon']) + else: + del cu_paragraph["source"] + if (cu_paragraph["role"] == ""): + del cu_paragraph["role"] + cu_results_data["result"]["contents"][0]["paragraphs"].append(cu_paragraph) + + # Configuring sections + if (di_results.get("sections") is not None): + cu_results_data["result"]["contents"][0]["sections"] = [] + for section in di_results["sections"]: + cu_section = { + "span": section["spans"][0], + "elements": section["elements"] + } + cu_results_data["result"]["contents"][0]["sections"].append(cu_section) + + # Configuring tables + if (di_results.get("tables") is not None): + cu_results_data["result"]["contents"][0]["tables"] = [] + for table in di_results["tables"]: + cu_table = { + "rowCount": table["rowCount"], + "columnCount": table["columnCount"], + "cells": [], + } + # Convert boundingRegions to source for cross page tables + sources = [] + for region in table.get("boundingRegions"): + page_number = region.get("pageNumber") + polygon = region.get("polygon") + if page_number is None or polygon is None: + continue + # Convert polygon to string format + source = convert_bounding_regions_to_source(page_number, polygon) + sources.append(source) + + if sources: + cu_table["source"] = ";".join(sources) + + cu_table["span"] = table["spans"][0] + + # if table has a caption + if table.get("caption") is not None: + caption = table.get("caption") + cu_caption = { + "content": caption.get("content", ""), + "source":convert_bounding_regions_to_source(caption["boundingRegions"][0]['pageNumber'], caption['boundingRegions'][0]['polygon']), + "span": caption["spans"][0], + "elements": caption.get("elements", []) + } + cu_table["caption"] = cu_caption + + # if table has a footnotes --> multiple + if table.get("footnotes") is not None: + footnotes= table.get("footnotes") + cu_footnotes = [] + for footnote in footnotes: + cu_footnote = { + "content": footnote["content"], + "source": convert_bounding_regions_to_source(footnote["boundingRegions"][0]['pageNumber'], footnote['boundingRegions'][0]['polygon']), + "span": footnote["spans"][0], + "elements": footnote.get("elements", []) + } + cu_footnotes.append(cu_footnote) + cu_table["footnotes"] = cu_footnotes + + for cell in table["cells"]: + cu_cell = { + "kind": cell.get("kind", "content"), + "rowIndex": cell["rowIndex"], + "columnIndex": cell["columnIndex"], + "rowSpan": cell.get("rowSpan", 1), + "columnSpan": cell.get("columnSpan", 1), + "content": cell["content"], + "source": convert_bounding_regions_to_source(cell['boundingRegions'][0]['pageNumber'], cell['boundingRegions'][0]['polygon']), + } + + # sometimes spans is empty + if (len(cell["spans"]) == 0): + cu_cell["span"] = [] + else: + cu_cell["span"] = cell["spans"][0] + + # sometimes elements doesn't exist if content isn't blank + if (cell.get("elements") is not None): + cu_cell["elements"] = cell["elements"] + cu_table["cells"].append(cu_cell) + cu_results_data["result"]["contents"][0]["tables"].append(cu_table) + + # Configuring figures + if (di_results.get("figures") is not None): + cu_results_data["result"]["contents"][0]["figures"] = [] + for figure in di_results["figures"]: + if(figure.get("elements") is not None): # using if block to keep the same order as CU + cu_figure = { + "source": convert_bounding_regions_to_source(figure['boundingRegions'][0]['pageNumber'], figure['boundingRegions'][0]['polygon']), + "span": figure["spans"][0], + "elements": figure["elements"], + "id": figure.get("id", "") + } + else: + cu_figure = { + "source": convert_bounding_regions_to_source(figure['boundingRegions'][0]['pageNumber'], figure['boundingRegions'][0]['polygon']), + "span": figure["spans"][0], + "id": figure.get("id", "") + } + cu_results_data["result"]["contents"][0]["figures"].append(cu_figure) + + # Write Content Understanding results.json + target_dir.mkdir(parents=True, exist_ok=True) + new_path_name = di_ocr_path.name.replace('.ocr', '.result') + cu_results_path = target_dir / new_path_name + + with open(cu_results_path, 'w') as f: + json.dump(cu_results_data, f, indent=4,ensure_ascii=False) + + print(f"[green]Successfully converted Document Intelligence ocr.json to Content Understanding results.json at {cu_results_path}[/green]\n") diff --git a/python/di_to_cu_migration_tool/cu_converter_customNeural.py b/python/di_to_cu_migration_tool/cu_converter_customNeural.py new file mode 100644 index 0000000..c998528 --- /dev/null +++ b/python/di_to_cu_migration_tool/cu_converter_customNeural.py @@ -0,0 +1,428 @@ +# imports from built-in packages +from dateutil.parser import parse +from datetime import datetime +import json +from pathlib import Path +import re +import sys +import typer +from typing import Optional, Tuple + +# imports from external packages (need to use pip install) +from rich import print # For colored output + +# imports from same project +from constants import COMPLETE_DATE_FORMATS, CU_API_VERSION, MAX_FIELD_LENGTH, VALID_CU_FIELD_TYPES +from field_definitions import FieldDefinitions + +# schema constants subject to change +ANALYZER_FIELDS = "fieldSchema" +# REPLACE THIS WITH YOUR OWN DESCRIPTION IF NEEDED +# Remember that dynamic tables are arrays and fixed tables are objects +ANALYZER_DESCRIPTION = "1. Define your schema by specifying the fields you want to extract from the input files. Choose clear and simple `field names`. Use `field descriptions` to provide explanations, exceptions, rules of thumb, and other details to clarify the desired behavior.\n\n2. For each field, indicate the `value type` of the desired output. Besides basic types like strings, dates, and numbers, you can define more complex structures such as `tables` (repeated items with subfields) and `fixed tables` (groups of fields with common subfields)." +CU_LABEL_SCHEMA = f"https://schema.ai.azure.com/mmi/{CU_API_VERSION}/labels.json" + +def convert_bounding_regions_to_source(page_number: int, polygon: list) -> str: + # Convert polygon to string format + polygon_str = ",".join(str(coord) for coord in polygon) + source = f"D({page_number},{polygon_str})" + return source + +def convert_fields_to_analyzer_neural(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Optional[Path], field_definitions: FieldDefinitions) -> Tuple[dict, dict]: + """ + Convert DI 3.1/4.0GA Custom Neural fields.json to analyzer.json format. + + Args: + fields_json_path (Path): Path to the input fields.json file. + analyzer_prefix (Optional(str)): Prefix for the analyzer name. + target_dir (Optional[Path]): Output directory for the analyzer.json file. + """ + try: + with open(fields_json_path, 'r', encoding="utf-8") as f: + fields_data = json.load(f) + except FileNotFoundError: + print(f"[red]Error: fields.json file not found at {fields_json_path}.[/red]") + sys.exit(1) + except json.JSONDecodeError: + print("[red]Error: Invalid JSON in fields.json.[/red]") + sys.exit(1) + + # Good to do before each analyzer.json conversion + field_definitions.clear_definitions() + + # Need to store the fields and types, so that we can access them when converting the labels.json files + fields_dict = {} + + # Build analyzer.json content + analyzer_data = { + "analyzerId": analyzer_prefix, + "baseAnalyzerId": "prebuilt-documentAnalyzer", + "config": { + "returnDetails": True, + # Add the following line as a temp workaround before service issue is fixed. + "enableLayout": True, + "enableBarcode": False, + "enableFormula": False, + "estimateFieldSourceAndConfidence": True + }, + ANALYZER_FIELDS: { + "name": analyzer_prefix, + "description": ANALYZER_DESCRIPTION, + "fields": {}, + "definitions": {} + }, + "warnings": fields_data.get("warnings", []), + "status": fields_data.get("status", "undefined"), + "templateId": fields_data.get("templateId", "document-2024-12-01") + } + + # Update field schema to be in CU format + fields = fields_data.get("fields", []) + definitions = fields_data.get("definitions", {}) + + if (len(fields) == 0): + print("[red]Error: Fields.json should not be empty.[/red]") + sys.exit(1) + + for field in fields: + analyzer_key = field.get("fieldKey") + if len(analyzer_key) > MAX_FIELD_LENGTH: + print(f"[red]Error: Field key '{analyzer_key}' contains {len(analyzer_key)}, which exceeds the limit of {MAX_FIELD_LENGTH} characters. [/red]") + sys.exit(1) + analyzer_type = field.get("fieldType") + analyzer_field = { + "type": analyzer_type, + "method": field.get("method", "extract"), + "description": field.get("description", "") + } + + fields_dict[analyzer_key] = analyzer_type # Adds the field type to our dictionary + + if analyzer_type == "array": # for dynamic tables + analyzer_field["method"] = "generate" + # need to get the items from the definition + item_definition = definitions.get(field.get("itemType")) + array_fields_dict, analyzer_field["items"] = convert_array_items(analyzer_key, item_definition) + fields_dict.update(array_fields_dict) + + elif analyzer_type == "object": # for fixed tables + analyzer_field["method"] = "generate" + object_fields_dict, analyzer_field["properties"] = convert_object_properties(field, definitions, analyzer_key, field_definitions) + fields_dict.update(object_fields_dict) + + # Add to analyzer fields + analyzer_data[ANALYZER_FIELDS]["fields"][analyzer_key] = analyzer_field + + analyzer_data[ANALYZER_FIELDS]["definitions"] = field_definitions.get_all_definitions() + + # Determine output path + if target_dir: + analyzer_json_path = target_dir / 'analyzer.json' + else: + analyzer_json_path = fields_json_path.parent / 'analyzer.json' + + # Ensure target directory exists + analyzer_json_path.parent.mkdir(parents=True, exist_ok=True) + + # Write analyzer.json + with open(analyzer_json_path, 'w') as f: + json.dump(analyzer_data, f, indent=4) + + print(f"[green]Successfully converted {fields_json_path} to analyzer.json at {analyzer_json_path}[/green]\n") + + return analyzer_data, fields_dict + +def convert_array_items(analyzer_key: str, item_definition: dict) -> Tuple[dict, dict]: + """ + Helper function to convert array items for the analyzer. + """ + array_fields_dict = {} + items = { + "type": item_definition.get("fieldType"), + "method": item_definition.get("method", "extract"), + "properties": {} + } + + for column in item_definition.get("fields", []): + column_key = column.get("fieldKey") + column_type = column.get("fieldType") + items["properties"][column_key] = { + "type": column_type, + "method": column.get("method", "extract"), + "description": column.get("description", ""), + } + if column.get("fieldFormat") != "not-specified": + items["properties"][column_key]["format"] = column.get("fieldFormat") + array_fields_dict[f"{analyzer_key}/{column_key}"] = column_type + + return array_fields_dict, items + +def convert_object_properties(field: dict, definitions: dict, analyzer_key: str, field_definitions: FieldDefinitions) -> Tuple[dict, dict]: + """ + Helper function to convert object properties for the analyzer. + """ + object_fields_dict = {} + properties = {} + di_rows = field.get("fields", []) + first_row_name = di_rows[0].get("fieldKey") if di_rows else "" + + for i, di_row in enumerate(di_rows): + if i == 0: + row_definition = definitions.get(di_row.get("fieldType")) + column_fields_dict = _add_object_definition(row_definition, analyzer_key, first_row_name, field_definitions) + row_name = di_row.get("fieldKey") + properties[row_name] = {"$ref": f"#/$defs/{analyzer_key}_{first_row_name}"} + for column_name, column_type in column_fields_dict.items(): + object_fields_dict[f"{analyzer_key}\\{row_name}\\{column_name}"] = column_type # we're flipping the direction of the slash (from / to \) to cause a miss in the dictionary when looking up the field + + return object_fields_dict, properties + +def _add_object_definition(row_definition: dict, analyzer_key: str, first_row_name: str, field_definitions: FieldDefinitions) -> dict: + """ + Helper function to add object definitions to the analyzer. + """ + column_fields_dict = {} + definition = { + "type": "object", + "properties": {} + } + + for column in row_definition.get("fields", []): + column_key = column.get("fieldKey") + column_type = column.get("fieldType") + definition["properties"][column_key] = { + "type": column_type, + "method": column.get("method", "extract"), + "description": column.get("description", ""), + } + if column.get("fieldFormat") != "not-specified": + definition["properties"][column_key]["format"] = column.get("fieldFormat") + column_fields_dict[column_key] = column_type + definitions_key = f"{analyzer_key}_{first_row_name}" + if len(definitions_key) > MAX_FIELD_LENGTH: + print(f"[red]Error: The fixed table definition '{definitions_key}' will contain {len(definitions_key)}, which exceeds the limit of {MAX_FIELD_LENGTH} characters. Please shorten either the table name or row name. [/red]") + sys.exit(1) + field_definitions.add_definition(definitions_key, definition) + return column_fields_dict + +def convert_di_labels_to_cu_neural(di_labels_path: Path, target_dir: Path, fields_dict: dict, removed_signatures: list) -> dict: + """ + Convert DI 3.1/4.0 GA Custom Neural format labels.json to Content Understanding format labels.json. + + Args: + di_labels_path (Path): Path to the Document Intelligence labels.json file. + target_dir (Path): Output directory for the Content Understanding labels.json file. + """ + try: + with open(di_labels_path, 'r', encoding="utf-8") as f: + di_data = json.load(f) + except FileNotFoundError: + print(f"[red]Error: Document Intelligence labels.json file not found at {di_labels_path}.[/red]") + sys.exit(1) + except json.JSONDecodeError: + print("[red]Error: Invalid JSON in Document Intelligence labels.json.[/red]") + sys.exit(1) + + # Start building Content Understanding labels.json + cu_data = { + "$schema": CU_LABEL_SCHEMA, + "fileId": di_data.get("fileId", ""), + "fieldLabels": {}, + "metadata": di_data.get("metadata", {}) + } + + labels = di_data.get("labels", {}) + + for label in labels: + label_name = label.get("label", None) + converted_label_name = label_name # for escape logic + converted_label_name = converted_label_name.replace("~1", "/") # if a slash exists in the label_name, it is replaced with ~1 + converted_label_name = converted_label_name.replace("~0", "~") # if a ~ exists in the label_name, it is replaced with ~0 + + label_type = fields_dict.get(label_name, None) # if primitive type, label_type will not be None + converted_label_type = fields_dict.get(converted_label_name, None) + + if label_name in removed_signatures or converted_label_name in removed_signatures: + # Skip the label if it is in the removed_signatures list + continue + + if label_type is None and converted_label_type is None: # for dynamic and fixed tables + # divide the label_name into table_name, rowNumber/Name, and column_name + # Example for dynamic tables: ItemList/0/NumOfPackage --> row is number + # Example for fixed tables: table/wiring/part --> row is name + + parts = label_name.split("/",2) + table_name = parts[0].replace("~1", "/").replace("~0", "~") + row = parts[1].replace("~1", "/").replace("~0", "~") + column_name = parts[2].replace("~1", "/").replace("~0", "~") + + # determine if the table is a fixed or dynamic table + table_type = fields_dict.get(table_name) + label_type = table_type + + if label_type == "array": # for dynamic tables + # need to check if the table already exists & if it doesnt, need to create the cu_label for the table + if table_name not in cu_data["fieldLabels"]: + cu_label = { + "type": label_type, + "kind": label.get("kind", "confirmed"), + "valueArray": [] + } + # Add table to fieldLabels + cu_data["fieldLabels"][table_name] = cu_label + # need to check if any rows have been defined yet in valueArray + if len(cu_data["fieldLabels"][table_name]["valueArray"]) == 0: + value_object = { + "type": "object", + "kind": label.get("kind", "confirmed"), + "valueObject": {} + } + cu_data["fieldLabels"][table_name]["valueArray"].append(value_object) + # check if the amount of valueObjects match the rowNumber, if not --> add that many rows + # this is because sometimes the first label for that table is not for the first row + if len(cu_data["fieldLabels"][table_name]["valueArray"]) <= int(row): + value_object = { + "type": "object", + "kind": label.get("kind", "confirmed"), + "valueObject": {} + } + number_of_rows_missing = int(row) - len(cu_data["fieldLabels"][table_name]["valueArray"]) + 1 + for i in range(number_of_rows_missing): + cu_data["fieldLabels"][table_name]["valueArray"].append(value_object) + + # actually need to add the column to the valueObject + label_type = fields_dict.get(f"{table_name}/{column_name}") + cu_data["fieldLabels"][table_name]["valueArray"][int(row)]["valueObject"][column_name] = creating_cu_label_for_neural(label, label_type) + + elif label_type == "object": # for fixed tables + # need to check if the table already exists & if it doesnt, need to create the cu_label for the table + if table_name not in cu_data["fieldLabels"]: + cu_label = { + "type": label_type, + "kind": label.get("kind", "confirmed"), + "valueObject": {} + } + # Add table to fieldLabels + cu_data["fieldLabels"][table_name] = cu_label + # need to check if row has been defined, if not define it + if (cu_data["fieldLabels"][table_name]["valueObject"].get(row) is None): + value_object = { + "type": "object", + "kind": label.get("kind", "confirmed"), + "valueObject": {} + } + cu_data["fieldLabels"][table_name]["valueObject"][row] = value_object + + # actually need to add the column to the valueObject + label_type = fields_dict.get(f"{table_name}\\{row}\\{column_name}") + cu_data["fieldLabels"][table_name]["valueObject"][row]["valueObject"][column_name] = creating_cu_label_for_neural(label, label_type) + else: + # Add field to fieldLabels + label_name = converted_label_name + label_type = converted_label_type + cu_data["fieldLabels"][label_name] = creating_cu_label_for_neural(label, label_type) + + return cu_data + +def creating_cu_label_for_neural(label:dict, label_type: str) -> dict: + """ + Create a CU label for DI 3.1/4.0 Custom Neural format labels.json. + + Args: + label (dict): The label to be converted and created. + """ + label_value = VALID_CU_FIELD_TYPES[label_type] + label_spans = label.get("spans", []) + label_confidence = label.get("confidence", None) + label_kind = label.get("kind", "confirmed") + label_meta_data = label.get("metadata", {}) + + value_list = label.get("value") # comes from the label itself & is a list of {page, text, & bounding boxes} + content = "" + bounding_regions = [] + + for value in value_list: + content += value.get("text") + " " + bounding_boxes = value.get("boundingBoxes")[0] + page_number = value.get("page") + rounded_regions = [round(value, 4) for value in bounding_boxes] # round to 4 decimal places + bounding_regions.append( + { + "pageNumber": page_number, + "polygon": rounded_regions + } + ) + + # Dates seem to be normalized already, but need to convert numbers and integers into the right format of float or int + final_content = content.strip() # removes trailing space + if label_type == "number": + try: + final_content = float(final_content) + except Exception as ex: + # strip the string of all non-numerical values and periods + string_value = final_content + cleaned_string = re.sub(r'[^0-9.]', '', string_value) + cleaned_string = cleaned_string.strip('.') # Remove any leading or trailing periods + # if more than one period exists, remove them all + if cleaned_string.count('.') > 1: + print("More than one decimal point exists, so will be removing them all.") + cleaned_string = cleaned_string = re.sub(r'\.', '', string_value) + final_content = float(cleaned_string) + elif label_type == "integer": + try: + final_content = int(final_content) + except Exception as ex: + # strip the string of all non-numerical values + string_value = final_content + cleaned_string = re.sub(r'[^0-9]', '', string_value) + final_content = int(cleaned_string) + elif label_type == "date": + # dates can be dmy, mdy, ydm, or not specified + # for CU, the format of our dates should be "%Y-%m-%d" + original_date = final_content + format_name = "not specified" + for fmt in COMPLETE_DATE_FORMATS: + try: + date_obj = datetime.strptime(original_date, fmt) + final_content = date_obj.strftime("%Y-%m-%d") + format_name = fmt + break # going with the first format that works + except ValueError: + continue + if format_name == "not specified": # unable to find a format that works + formats_to_try = ["%B %d,%Y", "parse", "%B %d, %Y", "%m/%d/%Y"] + finished_date_normalization = False # to keep track of whether we have finished normalizing the date, if not, date will be set to original_date + for fmt in formats_to_try: + try: + if fmt == "parse": + final_content = parse(original_date).date().strftime("%Y-%m-%d") + else: + date_obj = datetime.strptime(original_date, fmt) + final_content = date_obj.strftime("%Y-%m-%d") + finished_date_normalization = True + except Exception as ex: + continue + if not finished_date_normalization: + final_content = original_date # going with the default + + # Convert bounding_regions to source + sources = [] + for region in bounding_regions: + page_number = region.get("pageNumber") + polygon = region.get("polygon") + if page_number is None or polygon is None: + continue + # Convert polygon to string format + source = convert_bounding_regions_to_source(page_number, polygon) + sources.append(source) + + cu_label = { + "type": label_type, + label_value: final_content, + "spans": label_spans, + "confidence": label_confidence, + "source": ";".join(sources), + "kind": label_kind, + "metadata": label_meta_data + } + return cu_label diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py new file mode 100644 index 0000000..8ad1d68 --- /dev/null +++ b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py @@ -0,0 +1,401 @@ +# imports from built-in packages +from azure.identity import DefaultAzureCredential +from azure.storage.blob import BlobClient, ContainerClient +from dotenv import load_dotenv +import json +import os +from pathlib import Path +import requests +import shutil +import tempfile +import time +import typer +from typing import Tuple + +# imports from external packages (in requirements.txt) +from rich import print # For colored output + +# imports from same project +from constants import DI_VERSIONS, FIELDS_JSON, LABELS_JSON, MAX_FIELD_COUNT, OCR_JSON, VALIDATION_TXT +import cu_converter_customNeural +import cu_converter_customGen +from field_definitions import FieldDefinitions +import field_type_conversion +from get_ocr import run_cu_layout_ocr + +app = typer.Typer() + +def validate_field_count(DI_version, byteFields) -> Tuple[int, str]: + """ + Function to check if the fields.json is valid + Checking to see if the number of fields is less than or equal to 100 + """ + stringFields = byteFields.decode("utf-8") + fields = json.loads(stringFields) + + fieldCount = 0 + if DI_version == "CustomGen": + fieldSchema = fields["fieldSchema"] + if len(fieldSchema) > MAX_FIELD_COUNT: + return len(fieldSchema), False + for _, field in fieldSchema.items(): # need to account for tables + if field["type"] == "array": + fieldCount += (len(field["items"]["properties"]) + 1) + elif field["type"] == "object": + number_of_rows = len(field["properties"]) + _, firstRowValue = next(iter(field["properties"].items())) + number_of_columns = len(firstRowValue["properties"]) + fieldCount += (number_of_rows + number_of_columns + 2) + else: + fieldCount += 1 # need to account for other primitive fields + if fieldCount > MAX_FIELD_COUNT: + return fieldCount, False + else: # DI 3.1/4.0 GA Custom Neural + fieldSchema = fields["fields"] + definitions = fields["definitions"] + if len(fields) > MAX_FIELD_COUNT: + return len(fields), False + for field in fieldSchema: + if field["fieldType"] == "array": + definition = definitions[field["itemType"]] + fieldCount += (len(definition["fields"]) + 1) + elif field["fieldType"] == "object": + number_of_rows = len(field["fields"]) + rowDefinition = field["fields"][0]["fieldType"] + definition = definitions[rowDefinition] + number_of_columns = len(definition["fields"]) + fieldCount += (number_of_rows + number_of_columns + 2) + elif field["fieldType"] == "signature": + continue # will be skipping over signature fields anyways, shouldn't add to field count + else: + fieldCount += 1 # need to account for other primitive fields + if fieldCount > MAX_FIELD_COUNT: + return fieldCount, False + print(f"[green]Successfully validated fields.json. Number of fields: {fieldCount}[/green]") + return fieldCount, True + +@app.command() +def main( + analyzer_prefix: str = typer.Option("", "--analyzer-prefix", help="Prefix for analyzer name."), + DI_version: str = typer.Option("CustomGen", "--DI-version", help="DI versions: CustomGen, CustomNeural"), +) -> None: + """ + Wrapper tool to convert an entire DI dataset to CU format + """ + + assert DI_version in DI_VERSIONS, f"Please provide a valid DI version out of {DI_VERSIONS}." + + print(f"[yellow]You have specified the following DI version: {DI_version} out of {DI_VERSIONS}.If this is not expected, feel free to change this with the --DI-version parameter.\n[/yellow]") + + # if DI_version 3.1/4.0 GA Custom Neural, then analyzer prefix needs to be set + if DI_version == "CustomNeural": + assert analyzer_prefix != "", "Please provide a valid analyzer prefix, since you are using DI 3.1/4.0 GA Custom Neural." + + # Getting the environmental variables + load_dotenv() + subscription_id = os.getenv("SUBSCRIPTION_ID") + # for source + source_account_url = os.getenv("SOURCE_BLOB_ACCOUNT_URL") + source_blob_storage_sasToken = os.getenv("SOURCE_BLOB_STORAGE_SAS_TOKEN") + source_container_name = os.getenv("SOURCE_BLOB_CONTAINER_NAME") + source_folder_prefix = os.getenv("SOURCE_BLOB_FOLDER_PREFIX") + # for target + target_account_url = os.getenv("TARGET_BLOB_ACCOUNT_URL") + target_blob_storage_sasToken = os.getenv("TARGET_BLOB_STORAGE_SAS_TOKEN") + target_container_name = os.getenv("TARGET_BLOB_CONTAINER_NAME") + target_blob_name = os.getenv("TARGET_BLOB_FOLDER_PREFIX") + + assert target_blob_storage_sasToken != None and target_blob_storage_sasToken != "", "Please provide a valid target blob storage SAS token to be able to create an analyzer." + + print("Creating a temporary directory for storing source blob storage content...") + temp_source_dir = Path(tempfile.mkdtemp()) + temp_target_dir = Path(tempfile.mkdtemp()) + + # Configure access to source blob storage + if source_blob_storage_sasToken == None or source_blob_storage_sasToken == "": # using DefaultAzureCredential + default_credential = DefaultAzureCredential() + container_client = ContainerClient(source_account_url, source_container_name, credential=default_credential) + else: # using SAS token + container_client = ContainerClient(source_account_url, source_container_name, credential=source_blob_storage_sasToken) + + # List blobs under the "folder" in source + blob_list = container_client.list_blobs(name_starts_with=source_folder_prefix) + + for blob in blob_list: # each file is a blob that's being read into local directory + print(f"Reading: {blob.name}") + blob_client = container_client.get_blob_client(blob.name) + content = blob_client.download_blob().readall() + + # Create local file path (preserving folder structure) + filename = Path(blob.name).name + local_file_path = temp_source_dir /filename + local_file_path.parent.mkdir(parents=True, exist_ok=True) + + if filename == FIELDS_JSON: + print(f"[yellow]Checking if fields.json is valid for being able to create an analyzer.[/yellow]") + fields_count, is_valid = validate_field_count(DI_version, content) + assert is_valid, f"Too many fields in fields.json, we only support up to {MAX_FIELD_COUNT} fields. Right now, you have {fields_count} fields." + + # Write to file + with open(local_file_path, "wb") as f: + f.write(content) + print(f"Writing to {local_file_path}") + + # Confirming access to target blob storage here because doing so before can cause SAS token to expire + # Additionally, best to confirm access to target blob storage before running any conversion + target_container_client = ContainerClient(target_account_url, target_container_name, credential=target_blob_storage_sasToken) + + # First need to run field type conversion --> Then run DI to CU conversion + # Creating a temporary directory to store field type converted dataset + # Without this temp directory, your ocr.json files will not be carried over for cu conversion + # DI dataset converter will use temp directory as its source + # TO DO: remove the instance of temp_dir all together and rely on source_target_dir for field type conversion only + temp_dir = Path(tempfile.mkdtemp()) + + for item in temp_source_dir.iterdir(): + shutil.copy2(item, temp_dir / item.name) + + print(f"Creating temporary directory for running valid field type conversion. Output will be temporary stored at {temp_dir}...") + + print("First: Running valid field type conversion...") + print("[yellow]WARNING: if any signature fields are present, they will be skipped...[/yellow]\n") + # Taking the input source dir, and converting the valid field types into temp_dir + removed_signatures = running_field_type_conversion(temp_source_dir, temp_dir, DI_version) + + if len(removed_signatures) > 0: + print(f"[yellow]WARNING: The following signatures were removed from the dataset: {removed_signatures}[/yellow]\n") + + print("Second: Running DI to CU dataset conversion...") + analyzer_data, ocr_files = running_cu_conversion(temp_dir, temp_target_dir, DI_version, analyzer_prefix, removed_signatures) + + # Run OCR on the pdf files + run_cu_layout_ocr(ocr_files, temp_target_dir, subscription_id) + print(f"[green]Successfully finished running CU Layout on all PDF files[/green]\n") + + # After processing files in temp_target_dir + print("Uploading contents of temp_target_dir to target blob storage...") + + for item in temp_target_dir.rglob("*"): # Recursively iterate through all files and directories + if item.is_file(): # Only upload files + # Create the blob path by preserving the relative path structure + blobPath = str(item.relative_to(temp_target_dir)).replace('\\', '/') # Ensure path uses forward slashes + blob_path = target_blob_name + "/" + blobPath + print(f"Uploading {item} to blob path {blob_path}...") + + # Create a BlobClient for the target blob + blob_client = target_container_client.get_blob_client(blob_path) + + # Upload the file + with open(item, "rb") as data: + blob_client.upload_blob(data, overwrite=True) + + print("[green]Successfully uploaded all files to target blob storage.[/green]") + + print("Creating analyzer...") + analyzer_id = submit_build_analyzer_put_request(analyzer_data, target_account_url, target_container_name, target_blob_name, target_blob_storage_sasToken, subscription_id) + + url = os.getenv("ANALYZE_PDF_URL") + if url == "": + print("Skipping analyze PDF step, because no URL was provided.") + else: + print("Callling Analyze on given PDF file...") + submit_post_analyzer_request(url, analyzer_id, subscription_id) + +def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_version: str) -> list: + """ + Function to run the field type conversion + """ + # Taking the input source dir, and converting the valid field types into temp_dir + for root, dirs, files in os.walk(temp_source_dir): + root_path = Path(root) + fields_path = root_path / FIELDS_JSON + + converted_fields = {} + converted_field_keys = {} + removed_signatures = [] + + assert fields_path.exists(), "fields.json is needed. Fields.json is missing from the given dataset." + with fields_path.open("r", encoding="utf-8") as fp: # running field type conversion for fields.json + fields = json.load(fp) + + if DI_version == "CustomGen": + converted_fields, converted_field_keys = field_type_conversion.update_unified_schema_fields(fields) + with open(str(temp_dir / FIELDS_JSON), "w", encoding="utf-8") as fp: + json.dump(converted_fields, fp, ensure_ascii=False, indent=4) + print("[yellow]Successfully handled field type conversion for DI CustomGen fields.json[/yellow]\n") + elif DI_version == "CustomNeural": + removed_signatures, converted_fields = field_type_conversion.update_fott_fields(fields) + with open(str(temp_dir / FIELDS_JSON), "w", encoding="utf-8") as fp: + json.dump(converted_fields, fp, ensure_ascii=False, indent=4) + print("[yellow]Successfully handled field type conversion for DI 3.1/4.0 GA CustomNeural fields.json[/yellow]\n") + + if DI_version == "CustomGen": + for file in files: + file_path = root_path / file + if (file.endswith(LABELS_JSON)): + # running field type conversion for labels.json + with file_path.open("r", encoding="utf-8") as fp: + labels = json.load(fp) + field_type_conversion.update_unified_schema_labels(labels, converted_field_keys, temp_dir / file) + print(f"[yellow]Successfully handled field type conversion for {file}[/yellow]\n") + + return removed_signatures + +def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str, analyzer_prefix: str, removed_signatures: list) -> Tuple[dict, list]: + """ + Function to run the DI to CU conversion + """ + # Creating a FieldDefinitons object to handle the converison of definitions in the fields.json + field_definitions = FieldDefinitions() + for root, dirs, files in os.walk(temp_dir): + root_path = Path(root) # Convert root to Path object for easier manipulation + # Converting fields to analyzer + fields_path = root_path / FIELDS_JSON + + assert fields_path.exists(), "fields.json is needed. Fields.json is missing from the given dataset." + if DI_version == "CustomGen": + analyzer_data = cu_converter_customGen.convert_fields_to_analyzer(fields_path, analyzer_prefix, temp_target_dir, field_definitions, False) + elif DI_version == "CustomNeural": + analyzer_data, fields_dict = cu_converter_customNeural.convert_fields_to_analyzer_neural(fields_path, analyzer_prefix, temp_target_dir, field_definitions) + + ocr_files = [] # List to store paths to pdf files to get OCR results from later + for file in files: + file_path = root_path / file + if (file_path.name == FIELDS_JSON or file_path.name == VALIDATION_TXT): + continue + # Converting DI labels to CU labels + if (file.endswith(LABELS_JSON)): + if DI_version == "CustomGen": + cu_converter_customGen.convert_di_labels_to_cu(file_path, temp_target_dir) + elif DI_version == "CustomNeural": + cu_labels = cu_converter_customNeural.convert_di_labels_to_cu_neural(file_path, temp_target_dir, fields_dict, removed_signatures) + # run field type conversion of label files here, because will be easier after getting it into CU format + field_type_conversion.update_fott_labels(cu_labels, temp_target_dir / file_path.name) + print(f"[green]Successfully converted Document Intelligence labels.json to Content Understanding labels.json at {temp_target_dir/file_path.name}[/green]\n") + elif not file.endswith(OCR_JSON): # skipping over .orc.json files + shutil.copy(file_path, temp_target_dir) # Copying over main file + ocr_files.append(file_path) # Adding to list of files to run OCR on + return analyzer_data, ocr_files + +def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, targetContainerName: str, targetBlobName: str, targetBlobStorageSasToken: str, subscription_id: str) -> str: + """ + Initiates the creation of an analyzer with the given fieldSchema and training data. + """ + # URI Parameters - analyzerId, endpoint, & api-version + analyzer_id = analyzerData["analyzerId"] + host = os.getenv("HOST") + api_version = os.getenv("API_VERSION") + endpoint = f"{host}/analyzers/{analyzer_id}?api-version={api_version}" + + # Request Header - Content-Type + # Acquire a token for the desired scope + credential = DefaultAzureCredential() + token = credential.get_token("https://cognitiveservices.azure.com/.default") + + # Extract the access token + access_token = token.token + headers = { + "Authorization": f"Bearer {access_token}", + "Ocp-Apim-Subscription-Key": f"{subscription_id}", + "Content-Type": "application/json" + } + + # Request Body - config, desciription, fieldSchema, scenario, tags, & trainingData + training_data_container_url = f"{targetAccountUrl}/{targetContainerName}?{targetBlobStorageSasToken}" + request_body = { + "baseAnalyzerId": analyzerData["baseAnalyzerId"], + "description": analyzerData["fieldSchema"]["description"], + "config": analyzerData["config"], + "fieldSchema": analyzerData["fieldSchema"], + "trainingData": { + "kind": "blob", + "containerUrl": training_data_container_url, + "prefix": targetBlobName + } + } + + response = requests.put( + url=endpoint, + headers=headers, + json=request_body, + ) + response.raise_for_status() + operation_location = response.headers.get("Operation-Location", None) + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + + while True: + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + print(f"\n[green]Successfully created analyzer with ID: {analyzer_id}[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + + return analyzer_id + +def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_id: str) -> None: + """ + Call the Analyze API on the given PDF File + """ + # Request Header - Content-Type + # Acquire a token for the desired scope + credential = DefaultAzureCredential() + token = credential.get_token("https://cognitiveservices.azure.com/.default") + + # Extract the access token + access_token = token.token + headers = { + "Authorization": f"Bearer {access_token}", + "Apim-Subscription-id": f"{subscription_id}", + "Content-Type": "application/pdf" + } + + host = os.getenv("HOST") + api_version = os.getenv("API_VERSION") + endpoint = f"{host}/analyzers/{analyzerId}:analyze?api-version={api_version}" + + blob = BlobClient.from_blob_url(pdfURL) + blob_data = blob.download_blob().readall() + response = requests.post(url=endpoint, data=blob_data, headers=headers) + + response.raise_for_status() + print(f"[yellow]Analyzing file {pdfURL} with analyzer {analyzerId}.[/yellow]") + + operation_location = response.headers.get("Operation-Location", None) + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + + while True: + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + print(f"[green]Successfully analyzed file {pdfURL} with analyzer ID of {analyzerId}.[/green]") + analyze_result_file = os.getenv("ANALYZER_RESULT_OUTPUT_JSON") + with open(analyze_result_file, "w") as f: + json.dump(result, f, indent=4) + print(f"[green]Analyze result saved to {analyze_result_file}[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + +if __name__ == "__main__": + app() + diff --git a/python/di_to_cu_migration_tool/field_definitions.py b/python/di_to_cu_migration_tool/field_definitions.py new file mode 100644 index 0000000..e992b63 --- /dev/null +++ b/python/di_to_cu_migration_tool/field_definitions.py @@ -0,0 +1,40 @@ +class FieldDefinitions: + def __init__(self): + self._definitions = {} + + def add_definition(self, key: str, value: dict) -> None: + """ + Add a new field definition. + + Args: + key (str): The key for the field definition. + value (dict): The value for the field definition. + """ + self._definitions[key] = value + + def get_definition(self, key: str) -> dict: + """ + Retrieve a field definition by key. + + Args: + key (str): The key for the field definition. + + Returns: + dict: The field definition, or None if the key does not exist. + """ + return self._definitions.get(key) + + def clear_definitions(self) -> None: + """ + Clear all field definitions. + """ + self._definitions.clear() + + def get_all_definitions(self) -> dict: + """ + Retrieve all field definitions. + + Returns: + dict: All field definitions. + """ + return self._definitions diff --git a/python/di_to_cu_migration_tool/field_type_conversion.py b/python/di_to_cu_migration_tool/field_type_conversion.py new file mode 100644 index 0000000..494321b --- /dev/null +++ b/python/di_to_cu_migration_tool/field_type_conversion.py @@ -0,0 +1,162 @@ +# imports from built-in packages +import json +from collections import defaultdict +from pathlib import Path +from typing import Tuple + +# imports from same project +from constants import CHECKED_SYMBOL, CONVERT_TYPE_MAP, FIELD_VALUE_MAP, SUPPORT_FIELD_TYPE, UNCHECKED_SYMBOL + +def update_unified_schema_fields(fields: dict) -> Tuple[dict, dict]: + converted_field_keys = { + "primary": [], + "array": defaultdict(list), + "object": defaultdict(lambda: defaultdict(list)), + } + if "fieldSchema" not in fields: + return + + for field_key, field_object in fields["fieldSchema"].items(): + if field_object["type"] not in SUPPORT_FIELD_TYPE and field_object["type"] != "signature": + _update_unified_schema_fields(field_object) + converted_field_keys["primary"].append(field_key) + elif field_object["type"] == "array": + for sub_field_key, sub_field_object in field_object["items"][ + "properties" + ].items(): + if sub_field_object["type"] not in SUPPORT_FIELD_TYPE: + _update_unified_schema_fields(sub_field_object) + converted_field_keys["array"][field_key].append(sub_field_key) + elif field_object["type"] == "object": + for sub_field_key, sub_field_object in field_object["properties"].items(): + for ( + _sub_field_key, + _sub_field_object, + ) in sub_field_object["properties"].items(): + if _sub_field_object["type"] not in SUPPORT_FIELD_TYPE: + _update_unified_schema_fields(_sub_field_object) + converted_field_keys["object"][field_key][sub_field_key].append( + _sub_field_key + ) + return fields, converted_field_keys + +def _update_unified_schema_fields(field_object: dict) -> None: + original_type = field_object["type"] + field_object["type"] = CONVERT_TYPE_MAP[original_type] \ + if original_type in CONVERT_TYPE_MAP else "string" + +def update_unified_schema_labels( + labels: dict, converted_field_keys: list[str], output_path: Path +) -> None: + for label_key, label_object in labels["fieldLabels"].items(): + if label_key in converted_field_keys.get("primary", []): + _update_unified_schema_labels(label_key, label_object) + elif label_object["type"] == "array" and label_key in converted_field_keys.get( + "array", {} + ): + for sub_label_object in label_object["valueArray"]: + for _sub_label_key, _sub_label_object in sub_label_object[ + "valueObject" + ].items(): + if _sub_label_key in converted_field_keys.get("array", {}).get( + label_key, [] + ): + _update_unified_schema_labels(_sub_label_key, _sub_label_object) + elif label_object["type"] == "object" and label_key in converted_field_keys.get( + "object", {} + ): + for sub_label_key, sub_label_object in label_object["valueObject"].items(): + for ( + _sub_label_key, + _sub_label_object, + ) in sub_label_object["valueObject"].items(): + if _sub_label_key in converted_field_keys.get("object", {}).get( + label_key, {} + ).get(sub_label_key, []): + _update_unified_schema_labels(_sub_label_key, _sub_label_object) + with open(str(output_path), "w") as fp: + json.dump(labels, fp, ensure_ascii=False, indent=4) + +def _update_unified_schema_labels(label_key: str, label_object: dict) -> None: + value_key = FIELD_VALUE_MAP.get(label_object["type"]) + if value_key is None: + print(f"Unsupported field type: '{label_object['type']}'") + if label_object["type"] == "currency": + try: + label_object["valueNumber"] = label_object["valueCurrency"]["amount"] + except KeyError: + try: + label_object["valueNumber"] = float( + label_object["content"].replace(",", "") + ) + except Exception as e: + print(f"Error converting currency: {e}") + + label_object["type"] = "number" + elif label_object["type"] == "selectionMark": + if label_object["content"] in ["selected", ":selected:"]: + label_object["valueBoolean"] = True + label_object["content"] = CHECKED_SYMBOL + else: + label_object["valueBoolean"] = False + label_object["content"] = UNCHECKED_SYMBOL + label_object["type"] = "boolean" + elif label_object["type"] == "string": + label_object["valueString"] = label_object["content"] + else: + label_object["type"] = "string" + label_object["valueString"] = label_object["content"] + label_object.pop(value_key) if value_key in label_object else None + +def update_fott_fields(fields: dict) -> Tuple[list, dict]: + if "$schema" not in fields: + return fields + if "fields" not in fields: + return fields + signatures = [] + # Filter out fields with fieldType "signature" and collect their fieldKeys + new_fields = [] + for field in fields["fields"]: + if field["fieldType"] == "signature": + signatures.append(field["fieldKey"]) + continue + new_fields.append(field) + + for i, field in enumerate(new_fields): + if field["fieldType"] not in SUPPORT_FIELD_TYPE: + original_type = field["fieldType"] + field["fieldType"] = CONVERT_TYPE_MAP[original_type] \ + if original_type in CONVERT_TYPE_MAP else "string" + + if "definitions" in fields: + for field_key, field_definition in fields["definitions"].items(): + for field in field_definition.get("fields", []): + if field["fieldType"] not in SUPPORT_FIELD_TYPE and field["fieldType"] != "signature": + original_type = field["fieldType"] + field["fieldType"] = CONVERT_TYPE_MAP[original_type] \ + if original_type in CONVERT_TYPE_MAP else "string" + + fields["fields"] = new_fields + return signatures, fields + +def update_fott_labels(labels: dict, output_path: Path) -> None: + for label_key, label_object in labels["fieldLabels"].items(): + if label_object["type"] == "array": + for value_array in label_object["valueArray"]: + for value_object_key, value_object_value in value_array["valueObject"].items(): + _update_boolean_label(value_object_key, value_object_value) + elif label_object["type"] == "object": + for row_key, row_object in label_object["valueObject"].items(): + for col_key, col_object in row_object["valueObject"].items(): + _update_boolean_label(col_key, col_object) + else: + _update_boolean_label(label_key, label_object) + with open(str(output_path), "w") as fp: + json.dump(labels, fp, ensure_ascii=False, indent=4) + +def _update_boolean_label(label_key: str, label_object: dict) -> None: + if label_object["type"] == "boolean": + if label_object["valueBoolean"] in ["selected", ":selected:"]: + label_object["valueBoolean"] = True + else: + label_object["valueBoolean"] = False diff --git a/python/di_to_cu_migration_tool/get_ocr.py b/python/di_to_cu_migration_tool/get_ocr.py new file mode 100644 index 0000000..7d798ac --- /dev/null +++ b/python/di_to_cu_migration_tool/get_ocr.py @@ -0,0 +1,172 @@ +# imports from built-in packages +from datetime import datetime, timedelta, timezone +import json +import os +from pathlib import Path +import random +import sys +import time +from typing import Optional + +# imports from external packages (in requirements.txt) +from azure.identity import DefaultAzureCredential +from dotenv import load_dotenv +import requests +from rich import print # For colored output +import typer + +def is_token_expired(token) -> bool: + """ + Check if the token is expired or about to expire. + """ + # Get the current time in UTC + current_time = datetime.now(timezone.utc).timestamp() + # Add a buffer (e.g., 60 seconds) to refresh the token before it expires + buffer_time = 60 + # Check if the token is expired or about to expire + return current_time >= (token.expires_on - buffer_time) + +def get_token(credential, current_token = None) -> str: + # Refresh token if it's expired or about to expire + if current_token is None or is_token_expired(current_token): + # Refresh the token + current_token = credential.get_token("https://cognitiveservices.azure.com/.default") + print("Successfully refreshed token") + return current_token + +def build_analyzer(credential, current_token, host, api_version, subscriptionKey) -> str: + """ + Function to create an analyzer with empty schema + """ + # Get a valid token + current_token = get_token(credential, current_token) + access_token = current_token.token + headers = { + "Authorization": f"Bearer {access_token}", + "Ocp-Apim-Subscription-Key": f"{subscriptionKey}", + "Content-Type": "application/json" + } + analyzer_id = "sampleAnalyzer" + str(random.randint(0, 1000000)) + request_body = { + "analyzerId": analyzer_id, + "description": "Sample analyzer", + "createdAt": "2025-05-06T00:20:42Z", + "lastModifiedAt": "2025-05-06T00:20:42Z", + "baseAnalyzerId": "prebuilt-documentAnalyzer", + "config": { + "returnDetails": True, + "enableOcr": True, + "enableLayout": True, + "enableFormula": False, + "disableContentFiltering": False, + "segmentationMode": "noSegmentation", + "tableFormat": "html", + "estimateFieldSourceAndConfidence": False + }, + "fieldSchema": {}, + "warnings": [], + "status": "ready", + "processingLocation": "geography", + "mode": "standard" + } + endpoint = f"{host}/analyzers/{analyzer_id}?api-version={api_version}" + print("[yellow]Creating sample analyzer to attain CU Layout results...[/yellow]") + response = requests.put( + url=endpoint, + headers=headers, + json=request_body, + ) + response.raise_for_status() + operation_location = response.headers.get("Operation-Location", None) + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + + while True: + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + print(f"[green]Successfully created sample analyzer to gather Layout results[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + return analyzer_id + +def run_cu_layout_ocr(inputFiles: list, output_dir: str, subscriptionKey: str) -> None: + """ + Function to run the CU Layout OCR on the list of pdf files and write to the given output directory + """ + + print("Running CU Layout OCR...") + + load_dotenv() + + # Set the global variables + api_version = os.getenv("API_VERSION") + host = os.getenv("HOST") + + credential = DefaultAzureCredential() + current_token = None + + outputDir = Path(output_dir) + outputDir.mkdir(parents=True, exist_ok=True) + + # Need to create analyzer with empty schema + analyzer_id = build_analyzer(credential, current_token, host, api_version, subscriptionKey) + url = f"{host}/analyzers/{analyzer_id}:analyze?api-version={api_version}" + + for file in inputFiles: + try: + file = Path(file) + print(f"\nProcessing file: {file.name}") + # Get a valid token + current_token = get_token(credential, current_token) + headers = { + "Authorization": f"Bearer {current_token.token}", + "Apim-Subscription-id": f"{subscriptionKey}", + "Content-Type": "application/pdf", + } + + with open(file, "rb") as f: + response = requests.post(url=url, data=f, headers=headers) + response.raise_for_status() + + operation_location = response.headers.get("Operation-Location") + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + continue + + print(f"Polling results from: {operation_location}") + while True: + # Refresh the token if necessary + current_token = get_token(credential, current_token) + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + outputFile = outputDir / (file.name + ".result.json") + with open(outputFile, "w") as out_f: + json.dump(result, out_f, indent=4) + print(f"[green]Success: Results saved to {outputFile}[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + + except requests.RequestException as e: + print(f"Request error for file {file.name}: {e}") + except Exception as e: + print(f"Unexpected error for file {file.name}: {e}") diff --git a/python/di_to_cu_migration_tool/requirements.txt b/python/di_to_cu_migration_tool/requirements.txt new file mode 100644 index 0000000..a3e262d --- /dev/null +++ b/python/di_to_cu_migration_tool/requirements.txt @@ -0,0 +1,8 @@ +# Dependencies for the DI to CU Migration OSS Tool +azure-identity==1.16.0 +dotenv==0.9.9 +pytest==8.3.5 +python-dateutil==2.9.0post0 +requests==2.32.3 +rich==13.9.4 +typer==0.15.1 From 47eba35a13a58117100f93c1992f69702f564d11 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 14 May 2025 13:58:20 -0500 Subject: [PATCH 02/50] Update README.md - need to finish things of note --- python/di_to_cu_migration_tool/README.md | 59 ++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index e69de29..550c57d 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -0,0 +1,59 @@ +# Document Intelligence to Content Understanding Migration Tool (Python) + +Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) format. The following DI versions are supported: +- DI 3.1/4.0 GA CustomNeural +- DI 4.0 Preview CustomGen + +Additionally, this will automatically create a CU Analyzer using your provided AI Service endpoint and provide the option to run Analyze on a given file. + +## Setup +To setup this tool, you will need to do the following steps: +1. Run the requirements.txt to install the needed dependencies via **pip install -r ./requirements.txt** +2. Rename the file **.sample_env** as **.env** +3. Replace the following values in your **.env** file as such: + - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint + - Ex: "https://aainatest422.services.ai.azure.com" + - **SUBSCRIPTION_ID:** Replace this with your name or alias, is used to identify who called the API request + - Ex: "vannanaaina" + - **SOURCE_BLOB_ACCOUNT_URL:** Replace this with the URL to your blob storage account that contains your DI dataset + - Ex: "https://srcStorageAccountName.blob.core.windows.net" + - **SOURCE_BLOB_CONTAINER_NAME:** Replace this with the container within your blob storage account that contains your DI dataset + - Ex: "srcContainerName" + - **SOURCE_BLOB_FOLDER_PREFIX:** Replace this with the path to your DI dataset, within your specified container + - Ex: "src/path/to/folder" + - **SOURCE_BLOB_STORAGE_SAS_TOKEN:** If you prefer to use a SAS Token to authenticate into your source blob storage, please enter ONLY the token here and WITHOUT the leading "?". + If you prefer to use Azure AAD to authenticate, you can remove this value alltogether or leave it blank (i.e. "") + - **TARGET_BLOB_ACCOUNT_URL:** Replace this with the URL to the blob storage account that you wish to store your converted CU dataset + - Ex: "https://destStorageAccountName.blob.core.windows.net" + - **TARGET_BLOB_CONTAINER_NAME:** Replace this with the container within your target blob storage account where you wish to store your converted CU dataset + - Ex: "destContainerName" + - **TARGET_BLOB_FOLDER_PREFIX:** Replace this with the path to your CU dataset, within your specified container. + If you end this string with a "/", it will create a folder inside of the path specified and store the dataset there. + - Ex: "dest/path/to/folder" + - **TARGET_BLOB_STORAGE_SAS_TOKEN:** Replace this with the SAS Token to authenticate into your target blob storage. This is REQUIRED, you CANNOT use Azure AAD to authenticate. + A SAS Token is needed for creating an Analyzer. + - **ANALYZE_PDF_URL:** Replace this with the SAS URL to a file you wish to analyze (i.e. pdf, jpg, jpeg, etc.). + - Ex: "https://srcStorageAccountName.blob.core.windows.net/srcContainerName/src/path/to/folder/test.pdf?SASToken" + - **ANALYZE_RESULT_OUTPUT_JSON:** Replace this with where you wish to store the analyze results. The default is "./analyze_result.json" + +## How to Run +To run this tool, you will be using the command line to run the following commands. + +To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, run this command: + +**python ./di_to_cu_migration_tool.py --DI-version CustomNeural --analyzer-prefix myAnalyzer** + +If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. + +To convert a _DI 4.0 Preview CustomGen_, run this command: + +**python ./di_to_cu_migration_tool.py --DI-version CustomGen --analyzer-prefix myAnalyzer** + +Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. + +After this command finishes running, you should be able to +- see a converted CU dataset (with analyzer.json, labels.json, result.json, and the original files) in your specified target blob storage +- see a created Analyzer with the mentioned Analyzer ID +- see the results of the Analyze call in where you specified ANALYZE_RESULT_OUTPUT_JSON to be + +## Things of Note From c603fc7257f67f1ebf66971e48234575abf786f4 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 14 May 2025 15:39:12 -0500 Subject: [PATCH 03/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 550c57d..8ab1545 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,8 +1,9 @@ # Document Intelligence to Content Understanding Migration Tool (Python) -Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) format. The following DI versions are supported: +Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format. The following DI versions are supported: - DI 3.1/4.0 GA CustomNeural - DI 4.0 Preview CustomGen +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, this will automatically create a CU Analyzer using your provided AI Service endpoint and provide the option to run Analyze on a given file. @@ -57,3 +58,5 @@ After this command finishes running, you should be able to - see the results of the Analyze call in where you specified ANALYZE_RESULT_OUTPUT_JSON to be ## Things of Note +- Signatures are not supported in CU Preview.2 and thus, will be skipped when migrating the analyzer.json +- We will only be providing data conversion to CU Preview.2 From 22abdc69f271e948a7b011eceeaf2fe139c48653 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 14 May 2025 15:55:36 -0500 Subject: [PATCH 04/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 8ab1545..c8c46a2 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -58,5 +58,6 @@ After this command finishes running, you should be able to - see the results of the Analyze call in where you specified ANALYZE_RESULT_OUTPUT_JSON to be ## Things of Note +- You will need to be using a version of Python above 3.9 - Signatures are not supported in CU Preview.2 and thus, will be skipped when migrating the analyzer.json - We will only be providing data conversion to CU Preview.2 From a113da46226894999875a4a937b8e26c48ceb78d Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 14 May 2025 16:07:29 -0500 Subject: [PATCH 05/50] added sample documents --- python/di_to_cu_migration_tool/.sample_env | 5 +- .../di_to_cu_migration_tool.py | 52 +- .../di_to_cu_migration_tool/requirements.txt | 2 +- .../sample_documents/CustomGen/fields.json | 123 +++ .../sample_documents/CustomGen/labels.json | 710 ++++++++++++++ .../sample_documents/CustomNeural/fields.json | 104 +++ .../sample_documents/CustomNeural/labels.json | 876 ++++++++++++++++++ 7 files changed, 1841 insertions(+), 31 deletions(-) create mode 100644 python/di_to_cu_migration_tool/sample_documents/CustomGen/fields.json create mode 100644 python/di_to_cu_migration_tool/sample_documents/CustomGen/labels.json create mode 100644 python/di_to_cu_migration_tool/sample_documents/CustomNeural/fields.json create mode 100644 python/di_to_cu_migration_tool/sample_documents/CustomNeural/labels.json diff --git a/python/di_to_cu_migration_tool/.sample_env b/python/di_to_cu_migration_tool/.sample_env index 390c51a..972c1f4 100644 --- a/python/di_to_cu_migration_tool/.sample_env +++ b/python/di_to_cu_migration_tool/.sample_env @@ -5,9 +5,6 @@ API_VERSION = "2025-05-01-preview" SUBSCRIPTION_ID = "" # This is your subscription ID -# if using an API KEY -API_KEY="" - # Source blob storage & target blob storage SOURCE_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" SOURCE_BLOB_CONTAINER_NAME = "<>" @@ -21,4 +18,4 @@ TARGET_BLOB_STORAGE_SAS_TOKEN = "< Tuple[int, str]: +def validate_field_count(DI_version, byte_fields) -> Tuple[int, str]: """ Function to check if the fields.json is valid Checking to see if the number of fields is less than or equal to 100 """ - stringFields = byteFields.decode("utf-8") - fields = json.loads(stringFields) + string_fields = byte_fields.decode("utf-8") + fields = json.loads(string_fields) - fieldCount = 0 + field_count = 0 if DI_version == "CustomGen": - fieldSchema = fields["fieldSchema"] - if len(fieldSchema) > MAX_FIELD_COUNT: - return len(fieldSchema), False - for _, field in fieldSchema.items(): # need to account for tables + field_schema = fields["fieldSchema"] + if len(field_schema) > MAX_FIELD_COUNT: + return len(field_schema), False + for _, field in field_schema.items(): # need to account for tables if field["type"] == "array": - fieldCount += (len(field["items"]["properties"]) + 1) + field_count += (len(field["items"]["properties"]) + 1) elif field["type"] == "object": number_of_rows = len(field["properties"]) - _, firstRowValue = next(iter(field["properties"].items())) - number_of_columns = len(firstRowValue["properties"]) - fieldCount += (number_of_rows + number_of_columns + 2) + _, first_row_value = next(iter(field["properties"].items())) + number_of_columns = len(first_row_value["properties"]) + field_count += (number_of_rows + number_of_columns + 2) else: - fieldCount += 1 # need to account for other primitive fields - if fieldCount > MAX_FIELD_COUNT: - return fieldCount, False + field_count += 1 # need to account for other primitive fields + if field_count > MAX_FIELD_COUNT: + return field_count, False else: # DI 3.1/4.0 GA Custom Neural - fieldSchema = fields["fields"] + field_schema = fields["fields"] definitions = fields["definitions"] if len(fields) > MAX_FIELD_COUNT: return len(fields), False - for field in fieldSchema: + for field in field_schema: if field["fieldType"] == "array": definition = definitions[field["itemType"]] - fieldCount += (len(definition["fields"]) + 1) + field_count += (len(definition["fields"]) + 1) elif field["fieldType"] == "object": number_of_rows = len(field["fields"]) - rowDefinition = field["fields"][0]["fieldType"] - definition = definitions[rowDefinition] + row_definition = field["fields"][0]["fieldType"] + definition = definitions[row_definition] number_of_columns = len(definition["fields"]) - fieldCount += (number_of_rows + number_of_columns + 2) + field_count += (number_of_rows + number_of_columns + 2) elif field["fieldType"] == "signature": continue # will be skipping over signature fields anyways, shouldn't add to field count else: - fieldCount += 1 # need to account for other primitive fields - if fieldCount > MAX_FIELD_COUNT: - return fieldCount, False - print(f"[green]Successfully validated fields.json. Number of fields: {fieldCount}[/green]") - return fieldCount, True + field_count += 1 # need to account for other primitive fields + if field_count > MAX_FIELD_COUNT: + return field_count, False + print(f"[green]Successfully validated fields.json. Number of fields: {field_count}[/green]") + return field_count, True @app.command() def main( diff --git a/python/di_to_cu_migration_tool/requirements.txt b/python/di_to_cu_migration_tool/requirements.txt index a3e262d..e85ba18 100644 --- a/python/di_to_cu_migration_tool/requirements.txt +++ b/python/di_to_cu_migration_tool/requirements.txt @@ -1,5 +1,5 @@ # Dependencies for the DI to CU Migration OSS Tool -azure-identity==1.16.0 +azure-identity==1.20.0 dotenv==0.9.9 pytest==8.3.5 python-dateutil==2.9.0post0 diff --git a/python/di_to_cu_migration_tool/sample_documents/CustomGen/fields.json b/python/di_to_cu_migration_tool/sample_documents/CustomGen/fields.json new file mode 100644 index 0000000..1733a38 --- /dev/null +++ b/python/di_to_cu_migration_tool/sample_documents/CustomGen/fields.json @@ -0,0 +1,123 @@ +{ + "$schema": "https://schema.ai.azure.com/documentintelligence/2024-11-30/fields.json", + "docType": "Job_Offer_Letter", + "fieldSchema": { + "Company_Address": { + "type": "string" + }, + "Company_or_Institute_Name": { + "type": "string" + }, + "Employee_Name": { + "type": "string" + }, + "Employee_Signature_Date": { + "type": "date" + }, + "Employee_Signature_of_Accepting_The_Offer": { + "type": "string" + }, + "Employment_Start_Date": { + "type": "date" + }, + "Letter_Date": { + "type": "date" + }, + "Offer_Position": { + "type": "string" + }, + "Recipient_Address": { + "type": "string" + }, + "Sender_Signature": { + "type": "string" + }, + "Sender_Title": { + "type": "string" + }, + "Sender_or_Company_Representative_Name": { + "type": "string" + }, + "TableVehicleDescription": { + "type": "array", + "items": { + "type": "object", + "properties": { + "TypeOfChangeveh": { + "type": "string" + }, + "VEH": { + "type": "string" + }, + "YEAR": { + "type": "string" + }, + "MakeModelAndBodyType": { + "type": "string" + }, + "RegisteredState": { + "type": "string" + }, + "HP": { + "type": "string" + }, + "DateLeased": { + "type": "string" + }, + "DatePurch": { + "type": "string" + }, + "NEW": { + "type": "string" + } + } + } + }, + "TableVehicleCoverages": { + "type": "object", + "properties": { + "SingleLimitLiabCsl": { + "type": "object", + "properties": { + "CoveragesOther": { + "type": "string" + }, + "TypeOfChange1": { + "type": "string" + }, + "Veh1": { + "type": "string" + }, + "TypeOfChange2": { + "type": "string" + }, + "Veh2": { + "type": "string" + } + } + }, + "BodilyInjuryLiab": { + "type": "object", + "properties": { + "CoveragesOther": { + "type": "string" + }, + "TypeOfChange1": { + "type": "string" + }, + "Veh1": { + "type": "string" + }, + "TypeOfChange2": { + "type": "string" + }, + "Veh2": { + "type": "string" + } + } + } + } + } + } + } + \ No newline at end of file diff --git a/python/di_to_cu_migration_tool/sample_documents/CustomGen/labels.json b/python/di_to_cu_migration_tool/sample_documents/CustomGen/labels.json new file mode 100644 index 0000000..6265c6d --- /dev/null +++ b/python/di_to_cu_migration_tool/sample_documents/CustomGen/labels.json @@ -0,0 +1,710 @@ +{ + "$schema": "https://schema.ai.azure.com/documentintelligence/2024-11-30/labels.json", + "fieldLabels": { + "TableVehicleCoverages": { + "type": "object", + "kind": "confirmed", + "valueObject": { + "SingleLimitLiabCsl": { + "type": "object", + "kind": "confirmed", + "valueObject": { + "TypeOfChange1": { + "type": "string", + "content": "A", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 1.5758, + 5.533399999999999, + 1.6284, + 5.5382, + 1.6236, + 5.633699999999999, + 1.5711, + 5.628900000000001 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "Veh1": { + "type": "string", + "content": "$ 2353 EA ACCIDENT", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 1.903, + 5.5705, + 1.9424, + 5.5705, + 1.9424, + 5.6452, + 1.903, + 5.6452 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.0343, + 5.533399999999999, + 2.2778, + 5.533399999999999, + 2.2778, + 5.6385000000000005, + 2.0343, + 5.6385000000000005 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.7458, + 5.5668, + 2.8413, + 5.5668, + 2.8365, + 5.648, + 2.7458, + 5.648 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.8604, + 5.5668, + 3.2949, + 5.5668, + 3.2949, + 5.6528, + 2.8604, + 5.648 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "TypeOfChange2": { + "type": "string", + "content": "A", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 4.9376, + 5.543000000000001, + 4.9997, + 5.543000000000001, + 4.9997, + 5.6432, + 4.9376, + 5.6385000000000005 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "Veh2": { + "type": "string", + "content": "37653 $ EA ACCIDENT", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 5.4963, + 5.547699999999999, + 5.802, + 5.547699999999999, + 5.802, + 5.648, + 5.4963, + 5.648 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 5.303, + 5.5705, + 5.3424, + 5.5705, + 5.3424, + 5.6452, + 5.303, + 5.6452 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.156599999999999, + 5.5761, + 6.2612, + 5.5761, + 6.2612, + 5.6367, + 6.156599999999999, + 5.6367 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.2785, + 5.575099999999999, + 6.7027, + 5.575099999999999, + 6.7027, + 5.6376, + 6.2785, + 5.6376 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + } + } + }, + "BodilyInjuryLiab": { + "type": "object", + "kind": "confirmed", + "valueObject": { + "TypeOfChange1": { + "type": "string", + "content": "A", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 1.5376, + 5.6956999999999995, + 1.5997, + 5.6956999999999995, + 1.5997, + 5.791200000000001, + 1.5376, + 5.791200000000001 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "Veh1": { + "type": "string", + "content": "$ 65462 EA PERSON $ 34564 EA ACCIDENT", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 1.903, + 5.7372, + 1.9424, + 5.7372, + 1.9424, + 5.8118, + 1.903, + 5.8118 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.039, + 5.705300000000001, + 2.3351, + 5.7005, + 2.3351, + 5.805600000000001, + 2.0438, + 5.805600000000001 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.7458, + 5.7339, + 2.8365, + 5.7339, + 2.8365, + 5.819899999999999, + 2.7458, + 5.819899999999999 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.8604, + 5.7339, + 3.209, + 5.7339, + 3.209, + 5.8151, + 2.8604, + 5.819899999999999 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 3.3952, + 5.7339, + 3.443, + 5.7339, + 3.443, + 5.8151, + 3.3952, + 5.8151 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 3.5958, + 5.7005, + 3.8966, + 5.7005, + 3.8966, + 5.795999999999999, + 3.6006, + 5.800800000000001 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 4.1927, + 5.7339, + 4.293, + 5.7339, + 4.2882, + 5.8151, + 4.1879, + 5.8151 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 4.3169, + 5.7339, + 4.7466, + 5.7339, + 4.7466, + 5.8151, + 4.3121, + 5.8151 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "TypeOfChange2": { + "type": "string", + "content": "A", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 4.9233, + 5.724399999999999, + 4.9854, + 5.7292000000000005, + 4.9758, + 5.8247, + 4.9233, + 5.819899999999999 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "Veh2": { + "type": "string", + "content": "$ 4354 PERSON EA PERSON $ EA ACCIDENT 76573", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 5.303, + 5.7372, + 5.3424, + 5.7372, + 5.3424, + 5.8118, + 5.303, + 5.8118 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 5.525, + 5.7148, + 5.7638, + 5.719599999999999, + 5.7638, + 5.8151, + 5.525, + 5.8103 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.2849, + 5.7417, + 6.6236, + 5.7417, + 6.6236, + 5.804200000000001, + 6.2849, + 5.804200000000001 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.156599999999999, + 5.7428, + 6.2612, + 5.7428, + 6.2612, + 5.8033, + 6.156599999999999, + 5.8033 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.285, + 5.7417, + 6.6236, + 5.7417, + 6.6236, + 5.804200000000001, + 6.285, + 5.804200000000001 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.803, + 5.7372, + 6.8424, + 5.7372, + 6.8424, + 5.8118, + 6.803, + 5.8118 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 7.6066, + 5.7428, + 7.7112, + 5.7428, + 7.7112, + 5.8033, + 7.6066, + 5.8033 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 7.7285, + 5.7418, + 8.1527, + 5.7418, + 8.1527, + 5.804200000000001, + 7.7285, + 5.804200000000001 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 6.9719, + 5.7101, + 7.268, + 5.7101, + 7.2632, + 5.8103, + 6.9719, + 5.805600000000001 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + } + } + } + } + }, + "TableVehicleDescription": { + "type": "array", + "kind": "confirmed", + "valueArray": [ + { + "type": "object", + "kind": "confirmed", + "valueObject": { + "TypeOfChangeveh": { + "type": "string", + "content": "A", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 0.3677, + 3.3563, + 0.425, + 3.3516, + 0.4346, + 3.4566, + 0.3725, + 3.4614 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "VEH": { + "type": "string", + "content": "", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 0.6728346422698875, + 3.3493465874265524, + 0.7850006057016736, + 3.3493465874265524, + 0.7850006057016736, + 3.4383057998034876, + 0.6728346422698875, + 3.4383057998034876 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "YEAR": { + "type": "string", + "content": "2013", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 0.8166, + 3.3516, + 1.0601, + 3.3516, + 1.0601, + 3.4518000000000004, + 0.8166, + 3.4518000000000004 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "MakeModelAndBodyType": { + "type": "string", + "content": "CRV, Honda, 13", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 1.8385, + 3.3325000000000005, + 2.1298, + 3.3325000000000005, + 2.1346, + 3.4469999999999996, + 1.8385, + 3.4469999999999996 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 1.4708, + 3.3372, + 1.8194, + 3.3325000000000005, + 1.8194, + 3.4469999999999996, + 1.4708, + 3.4423 + ] + }, + { + "pageNumber": 1, + "polygon": [ + 2.1537, + 3.3325000000000005, + 2.2778, + 3.3325000000000005, + 2.2778, + 3.4469999999999996, + 2.1537, + 3.4469999999999996 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "RegisteredState": { + "type": "string", + "content": "35252362623356", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 4.6034, + 3.3611, + 5.4629, + 3.3611, + 5.4629, + 3.4661, + 4.6081, + 3.4661 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "HP": { + "type": "string", + "content": "450", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 6.6854, + 3.3372, + 6.8573, + 3.342, + 6.8525, + 3.4423, + 6.6854, + 3.4375 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "DateLeased": { + "type": "string", + "content": "12/03/2013", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 7.0149, + 3.3372, + 7.4208, + 3.3372, + 7.4208, + 3.4184, + 7.0149, + 3.4184 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "DatePurch": { + "type": "string", + "content": "12/06/2013", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 7.5306, + 3.3659, + 7.9317, + 3.3659, + 7.9317, + 3.4423, + 7.5306, + 3.4375 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + }, + "NEW": { + "type": "string", + "content": "New", + "boundingRegions": [ + { + "pageNumber": 1, + "polygon": [ + 8.0225, + 3.3563, + 8.1753, + 3.3563, + 8.1753, + 3.4327, + 8.0225, + 3.4327 + ] + } + ], + "spans": [], + "metadata": {}, + "kind": "confirmed" + } + } + } + ] + } + }, + "metadata": {} + } + \ No newline at end of file diff --git a/python/di_to_cu_migration_tool/sample_documents/CustomNeural/fields.json b/python/di_to_cu_migration_tool/sample_documents/CustomNeural/fields.json new file mode 100644 index 0000000..7bf272b --- /dev/null +++ b/python/di_to_cu_migration_tool/sample_documents/CustomNeural/fields.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://schema.cognitiveservices.azure.com/formrecognizer/2021-03-01/fields.json", + "fields": [ + { + "fieldKey": "Field_Agency Name", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Field_Family Identification", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Field_Initial Subsidized Service Date", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Table_Section I. Family Identification.", + "fieldType": "object", + "fieldFormat": "not-specified", + "fields": [ + { + "fieldKey": "A", + "fieldType": "Table_Section I. Family Identification._object", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "B", + "fieldType": "Table_Section I. Family Identification._object", + "fieldFormat": "not-specified" + } + ] + }, + { + "fieldKey": "Table_Complete only for children served by your agency", + "fieldType": "array", + "fieldFormat": "not-specified", + "itemType": "Table_Complete only for children served by your agency_object" + } + ], + "definitions": { + "Table_Section I. Family Identification._object": { + "fieldKey": "Table_Section I. Family Identification._object", + "fieldType": "object", + "fieldFormat": "not-specified", + "fields": [ + { + "fieldKey": "Name of parent (full name, including middle initial)", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Phone no. (cell or home)", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Phone no. (work/school)", + "fieldType": "string", + "fieldFormat": "not-specified" + } + ] + }, + "Table_Complete only for children served by your agency_object": { + "fieldKey": "Table_Complete only for children served by your agency_object", + "fieldType": "object", + "fieldFormat": "not-specified", + "fields": [ + { + "fieldKey": "(4) Adjustment Factor Code", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "(5) Ethnicity", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "(6) Race", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Language Code", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Child is English Learner?", + "fieldType": "string", + "fieldFormat": "not-specified" + }, + { + "fieldKey": "Code for Language", + "fieldType": "string", + "fieldFormat": "not-specified" + } + ] + } + } +} diff --git a/python/di_to_cu_migration_tool/sample_documents/CustomNeural/labels.json b/python/di_to_cu_migration_tool/sample_documents/CustomNeural/labels.json new file mode 100644 index 0000000..9492dfd --- /dev/null +++ b/python/di_to_cu_migration_tool/sample_documents/CustomNeural/labels.json @@ -0,0 +1,876 @@ +{ + "$schema": "https://schema.cognitiveservices.azure.com/formrecognizer/2021-03-01/labels.json", + "document": "Application(3)_01.pdf", + "labels": [ + { + "label": "Field_Agency Name", + "key": null, + "value": [ + { + "page": 1, + "text": "Children", + "boundingBoxes": [ + [ + 0.6359764705882354, + 0.04876363636363636, + 0.6804235294117646, + 0.04876363636363636, + 0.6804235294117646, + 0.05590909090909091, + 0.6359764705882354, + 0.05590909090909091 + ] + ] + }, + { + "page": 1, + "text": "Care", + "boundingBoxes": [ + [ + 0.685329411764706, + 0.04876363636363636, + 0.7109294117647059, + 0.04876363636363636, + 0.7109294117647059, + 0.05590909090909091, + 0.685329411764706, + 0.05590909090909091 + ] + ] + } + ] + }, + { + "label": "Field_Initial Subsidized Service Date", + "key": null, + "value": [ + { + "page": 1, + "text": "01/03/2021", + "boundingBoxes": [ + [ + 0.7372470588235295, + 0.08755454545454545, + 0.7961999999999999, + 0.08755454545454545, + 0.7961999999999999, + 0.09470909090909091, + 0.7372470588235295, + 0.09470909090909091 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./A/Phone no. (cell or home)", + "key": null, + "value": [ + { + "page": 1, + "text": "916-429-9983", + "boundingBoxes": [ + [ + 0.5609529411764705, + 0.24596363636363636, + 0.6612235294117648, + 0.24596363636363636, + 0.6612235294117648, + 0.25532727272727274, + 0.5609529411764705, + 0.25532727272727274 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./B/Phone no. (cell or home)", + "key": null, + "value": [ + { + "page": 1, + "text": "406-750-5880", + "boundingBoxes": [ + [ + 0.5604470588235294, + 0.2938, + 0.661164705882353, + 0.2938, + 0.661164705882353, + 0.30315454545454545, + 0.5604470588235294, + 0.30315454545454545 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/(4) Adjustment Factor Code", + "key": null, + "value": [ + { + "page": 2, + "text": "23", + "boundingBoxes": [ + [ + 0.32530588235294117, + 0.20289090909090907, + 0.3422705882352941, + 0.20289090909090907, + 0.3422705882352941, + 0.21226363636363638, + 0.32530588235294117, + 0.21226363636363638 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/(5) Ethnicity", + "key": null, + "value": [ + { + "page": 2, + "text": "N", + "boundingBoxes": [ + [ + 0.3816, + 0.20247272727272725, + 0.39081176470588236, + 0.20247272727272725, + 0.39081176470588236, + 0.21165454545454543, + 0.3816, + 0.21165454545454543 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/(6) Race", + "key": null, + "value": [ + { + "page": 2, + "text": "3", + "boundingBoxes": [ + [ + 0.4052352941176471, + 0.20243636363636364, + 0.4129058823529412, + 0.20243636363636364, + 0.4129058823529412, + 0.2118090909090909, + 0.4052352941176471, + 0.2118090909090909 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/Language Code", + "key": null, + "value": [ + { + "page": 2, + "text": "12", + "boundingBoxes": [ + [ + 0.43269411764705884, + 0.20289090909090907, + 0.44821176470588237, + 0.20289090909090907, + 0.44821176470588237, + 0.2121090909090909, + 0.43269411764705884, + 0.2121090909090909 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/Child is English Learner?", + "key": null, + "value": [ + { + "page": 2, + "text": "Yes", + "boundingBoxes": [ + [ + 0.4827294117647059, + 0.2030818181818182, + 0.5101882352941176, + 0.2030818181818182, + 0.5101882352941176, + 0.21239999999999998, + 0.4827294117647059, + 0.21239999999999998 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/(4) Adjustment Factor Code", + "key": null, + "value": [ + { + "page": 2, + "text": "23", + "boundingBoxes": [ + [ + 0.32530588235294117, + 0.26046363636363634, + 0.3422705882352941, + 0.26046363636363634, + 0.3422705882352941, + 0.26983636363636365, + 0.32530588235294117, + 0.26983636363636365 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/(5) Ethnicity", + "key": null, + "value": [ + { + "page": 2, + "text": "N", + "boundingBoxes": [ + [ + 0.3816, + 0.2600545454545454, + 0.39081176470588236, + 0.2600545454545454, + 0.39081176470588236, + 0.2692272727272727, + 0.3816, + 0.2692272727272727 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/(6) Race", + "key": null, + "value": [ + { + "page": 2, + "text": "3", + "boundingBoxes": [ + [ + 0.4052352941176471, + 0.2600090909090909, + 0.4129058823529412, + 0.2600090909090909, + 0.4129058823529412, + 0.26938181818181817, + 0.4052352941176471, + 0.26938181818181817 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/Language Code", + "key": null, + "value": [ + { + "page": 2, + "text": "12", + "boundingBoxes": [ + [ + 0.43269411764705884, + 0.26046363636363634, + 0.44821176470588237, + 0.26046363636363634, + 0.44821176470588237, + 0.2696818181818182, + 0.43269411764705884, + 0.2696818181818182 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/Child is English Learner?", + "key": null, + "value": [ + { + "page": 2, + "text": "Yes", + "boundingBoxes": [ + [ + 0.4827294117647059, + 0.26065454545454547, + 0.5101882352941176, + 0.26065454545454547, + 0.5101882352941176, + 0.26997272727272725, + 0.4827294117647059, + 0.26997272727272725 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/(4) Adjustment Factor Code", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.3260823529411765, + 0.3180818181818182, + 0.35209411764705884, + 0.3180818181818182, + 0.35209411764705884, + 0.32755454545454543, + 0.3260823529411765, + 0.32755454545454543 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/(5) Ethnicity", + "key": null, + "value": [ + { + "page": 2, + "text": "N/", + "boundingBoxes": [ + [ + 0.3816, + 0.3176272727272727, + 0.39669411764705886, + 0.3176272727272727, + 0.39669411764705886, + 0.3271, + 0.3816, + 0.3271 + ] + ] + }, + { + "page": 2, + "text": "A", + "boundingBoxes": [ + [ + 0.3803529411764706, + 0.33187272727272726, + 0.39127058823529415, + 0.33187272727272726, + 0.39127058823529415, + 0.34104545454545454, + 0.3803529411764706, + 0.34104545454545454 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/(6) Race", + "key": null, + "value": [ + { + "page": 2, + "text": "N/", + "boundingBoxes": [ + [ + 0.4058, + 0.3176272727272727, + 0.4208941176470588, + 0.3176272727272727, + 0.4208941176470588, + 0.3271, + 0.4058, + 0.3271 + ] + ] + }, + { + "page": 2, + "text": "A", + "boundingBoxes": [ + [ + 0.40455294117647056, + 0.33187272727272726, + 0.4154705882352941, + 0.33187272727272726, + 0.4154705882352941, + 0.34104545454545454, + 0.40455294117647056, + 0.34104545454545454 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/Language Code", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.43265882352941176, + 0.3184, + 0.4586705882352941, + 0.3184, + 0.4586705882352941, + 0.32787272727272726, + 0.43265882352941176, + 0.32787272727272726 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/Child is English Learner?", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.4839176470588235, + 0.31823636363636365, + 0.5099294117647059, + 0.31823636363636365, + 0.5099294117647059, + 0.3277, + 0.4839176470588235, + 0.3277 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/(4) Adjustment Factor Code", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.3260823529411765, + 0.3759636363636364, + 0.35209411764705884, + 0.3759636363636364, + 0.35209411764705884, + 0.38542727272727273, + 0.3260823529411765, + 0.38542727272727273 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/(5) Ethnicity", + "key": null, + "value": [ + { + "page": 2, + "text": "N/", + "boundingBoxes": [ + [ + 0.3816, + 0.37550909090909096, + 0.39669411764705886, + 0.37550909090909096, + 0.39669411764705886, + 0.3849727272727273, + 0.3816, + 0.3849727272727273 + ] + ] + }, + { + "page": 2, + "text": "A", + "boundingBoxes": [ + [ + 0.3803529411764706, + 0.38974545454545456, + 0.39127058823529415, + 0.38974545454545456, + 0.39127058823529415, + 0.39892727272727274, + 0.3803529411764706, + 0.39892727272727274 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/(6) Race", + "key": null, + "value": [ + { + "page": 2, + "text": "N/", + "boundingBoxes": [ + [ + 0.4058, + 0.37550909090909096, + 0.4208941176470588, + 0.37550909090909096, + 0.4208941176470588, + 0.3849727272727273, + 0.4058, + 0.3849727272727273 + ] + ] + }, + { + "page": 2, + "text": "A", + "boundingBoxes": [ + [ + 0.40455294117647056, + 0.38974545454545456, + 0.4154705882352941, + 0.38974545454545456, + 0.4154705882352941, + 0.39892727272727274, + 0.40455294117647056, + 0.39892727272727274 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/Language Code", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.4314470588235294, + 0.3759636363636364, + 0.45745882352941175, + 0.3759636363636364, + 0.45745882352941175, + 0.38542727272727273, + 0.4314470588235294, + 0.38542727272727273 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/Child is English Learner?", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.4839176470588235, + 0.3761090909090909, + 0.5099294117647059, + 0.3761090909090909, + 0.5099294117647059, + 0.38558181818181814, + 0.4839176470588235, + 0.38558181818181814 + ] + ] + } + ] + }, + { + "label": "Field_Family Identification", + "key": null, + "value": [ + { + "page": 1, + "text": "14465", + "boundingBoxes": [ + [ + 0.7353294117647059, + 0.06839090909090909, + 0.7677764705882353, + 0.06839090909090909, + 0.7677764705882353, + 0.07545454545454545, + 0.7353294117647059, + 0.07545454545454545 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./A/Name of parent (full name, including middle initial)", + "key": null, + "value": [ + { + "page": 1, + "text": "Janet", + "boundingBoxes": [ + [ + 0.09109411764705883, + 0.24535454545454546, + 0.13049411764705882, + 0.24535454545454546, + 0.13049411764705882, + 0.2546727272727273, + 0.09109411764705883, + 0.2546727272727273 + ] + ] + }, + { + "page": 1, + "text": "A.", + "boundingBoxes": [ + [ + 0.1351529411764706, + 0.24535454545454546, + 0.1491764705882353, + 0.24535454545454546, + 0.1491764705882353, + 0.2545363636363636, + 0.1351529411764706, + 0.2545363636363636 + ] + ] + }, + { + "page": 1, + "text": "Billington", + "boundingBoxes": [ + [ + 0.15632941176470588, + 0.24535454545454546, + 0.22028235294117648, + 0.24535454545454546, + 0.22028235294117648, + 0.2571727272727273, + 0.15632941176470588, + 0.2571727272727273 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./B/Name of parent (full name, including middle initial)", + "key": null, + "value": [ + { + "page": 1, + "text": "James", + "boundingBoxes": [ + [ + 0.09109411764705883, + 0.2938363636363637, + 0.13812941176470586, + 0.2938363636363637, + 0.13812941176470586, + 0.30315454545454545, + 0.09109411764705883, + 0.30315454545454545 + ] + ] + }, + { + "page": 1, + "text": "K.", + "boundingBoxes": [ + [ + 0.14450588235294118, + 0.2938363636363637, + 0.15732941176470588, + 0.2938363636363637, + 0.15732941176470588, + 0.30301818181818185, + 0.14450588235294118, + 0.30301818181818185 + ] + ] + }, + { + "page": 1, + "text": "Billington", + "boundingBoxes": [ + [ + 0.16448235294117647, + 0.2938363636363637, + 0.22843529411764707, + 0.2938363636363637, + 0.22843529411764707, + 0.30565454545454546, + 0.16448235294117647, + 0.30565454545454546 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./A/Phone no. (work~1school)", + "key": null, + "value": [ + { + "page": 1, + "text": "916-825-7226", + "boundingBoxes": [ + [ + 0.7595764705882353, + 0.24531818181818182, + 0.859835294117647, + 0.24531818181818182, + 0.859835294117647, + 0.2546727272727273, + 0.7595764705882353, + 0.2546727272727273 + ] + ] + } + ] + }, + { + "label": "Table_Section I. Family Identification./B/Phone no. (work~1school)", + "key": null, + "value": [ + { + "page": 1, + "text": "406-626-8499", + "boundingBoxes": [ + [ + 0.7591058823529412, + 0.29315454545454545, + 0.8598705882352942, + 0.29315454545454545, + 0.8598705882352942, + 0.3025090909090909, + 0.7591058823529412, + 0.3025090909090909 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/0/Code for Language", + "key": null, + "value": [ + { + "page": 2, + "text": "12", + "boundingBoxes": [ + [ + 0.43269411764705884, + 0.20289090909090907, + 0.44821176470588237, + 0.20289090909090907, + 0.44821176470588237, + 0.2121090909090909, + 0.43269411764705884, + 0.2121090909090909 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/1/Code for Language", + "key": null, + "value": [ + { + "page": 2, + "text": "12", + "boundingBoxes": [ + [ + 0.43269411764705884, + 0.26046363636363634, + 0.44821176470588237, + 0.26046363636363634, + 0.44821176470588237, + 0.2696818181818182, + 0.43269411764705884, + 0.2696818181818182 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/2/Code for Language", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.43265882352941176, + 0.3184, + 0.4586705882352941, + 0.3184, + 0.4586705882352941, + 0.32787272727272726, + 0.43265882352941176, + 0.32787272727272726 + ] + ] + } + ] + }, + { + "label": "Table_Complete only for children served by your agency/3/Code for Language", + "key": null, + "value": [ + { + "page": 2, + "text": "N/A", + "boundingBoxes": [ + [ + 0.4314470588235294, + 0.3759636363636364, + 0.45745882352941175, + 0.3759636363636364, + 0.45745882352941175, + 0.38542727272727273, + 0.4314470588235294, + 0.38542727272727273 + ] + ] + } + ] + } + ] +} From ec315f47de802f8ce67440c742ecf6bc75df80cd Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 14 May 2025 16:19:52 -0500 Subject: [PATCH 06/50] removed new data --- data/new/GoldmanSachs.pdf | Bin 132 -> 0 bytes ...orationofBritishColumbia-annualReport-2012.pdf | Bin 132 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/new/GoldmanSachs.pdf delete mode 100644 data/new/InsuranceCorporationofBritishColumbia-annualReport-2012.pdf diff --git a/data/new/GoldmanSachs.pdf b/data/new/GoldmanSachs.pdf deleted file mode 100644 index a90ce6f63c87f73e5036fed00ccf2da1127f8aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmWN?!41P83;@7CQ?Nh-0SqSF5Q7U+TcSep==6=o^3u}JeK=< z?hEy|8b={@t)jOqM@=13;@u*r{DsWj|R}&kdPE++Ts*+(bLz}TfK|Fy|#}kV;p_g`dP>0C4Igv zC(hK~x*tsXvQw*B^^zR;9lQjPuto#K0SGy}1U49PA;GetMPjfKlO!LE^$~M4E_+@x Pi_p~TkJTOgvYF`*M~o Date: Wed, 14 May 2025 17:53:25 -0500 Subject: [PATCH 07/50] changed analyze to use key and not id --- python/di_to_cu_migration_tool/.sample_env | 2 +- python/di_to_cu_migration_tool/README.md | 4 ++-- .../di_to_cu_migration_tool.py | 16 ++++++++-------- python/di_to_cu_migration_tool/requirements.txt | 1 + 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/python/di_to_cu_migration_tool/.sample_env b/python/di_to_cu_migration_tool/.sample_env index 972c1f4..3abb783 100644 --- a/python/di_to_cu_migration_tool/.sample_env +++ b/python/di_to_cu_migration_tool/.sample_env @@ -3,7 +3,7 @@ HOST="" API_VERSION = "2025-05-01-preview" -SUBSCRIPTION_ID = "" # This is your subscription ID +SUBSCRIPTION_KEY = "" # This is your subscription ID # Source blob storage & target blob storage SOURCE_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index c8c46a2..8c69dd5 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -14,7 +14,7 @@ To setup this tool, you will need to do the following steps: 3. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint - Ex: "https://aainatest422.services.ai.azure.com" - - **SUBSCRIPTION_ID:** Replace this with your name or alias, is used to identify who called the API request + - **SUBSCRIPTION_KEY:** Replace this with your name or alias, is used to identify who called the API request - Ex: "vannanaaina" - **SOURCE_BLOB_ACCOUNT_URL:** Replace this with the URL to your blob storage account that contains your DI dataset - Ex: "https://srcStorageAccountName.blob.core.windows.net" @@ -33,7 +33,7 @@ To setup this tool, you will need to do the following steps: - Ex: "dest/path/to/folder" - **TARGET_BLOB_STORAGE_SAS_TOKEN:** Replace this with the SAS Token to authenticate into your target blob storage. This is REQUIRED, you CANNOT use Azure AAD to authenticate. A SAS Token is needed for creating an Analyzer. - - **ANALYZE_PDF_URL:** Replace this with the SAS URL to a file you wish to analyze (i.e. pdf, jpg, jpeg, etc.). + - **ANALYZE_PDF_URL:** Replace this with the SAS URL to a file you wish to analyze (i.e. pdf, jpg, jpeg, etc.). If you wish to not run Analyze, you can leave this as empty (i.e. "") - Ex: "https://srcStorageAccountName.blob.core.windows.net/srcContainerName/src/path/to/folder/test.pdf?SASToken" - **ANALYZE_RESULT_OUTPUT_JSON:** Replace this with where you wish to store the analyze results. The default is "./analyze_result.json" diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py index 2866c39..8088052 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py +++ b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py @@ -93,7 +93,7 @@ def main( # Getting the environmental variables load_dotenv() - subscription_id = os.getenv("SUBSCRIPTION_ID") + subscription_key = os.getenv("SUBSCRIPTION_KEY") # for source source_account_url = os.getenv("SOURCE_BLOB_ACCOUNT_URL") source_blob_storage_sasToken = os.getenv("SOURCE_BLOB_STORAGE_SAS_TOKEN") @@ -169,7 +169,7 @@ def main( analyzer_data, ocr_files = running_cu_conversion(temp_dir, temp_target_dir, DI_version, analyzer_prefix, removed_signatures) # Run OCR on the pdf files - run_cu_layout_ocr(ocr_files, temp_target_dir, subscription_id) + run_cu_layout_ocr(ocr_files, temp_target_dir, subscription_key) print(f"[green]Successfully finished running CU Layout on all PDF files[/green]\n") # After processing files in temp_target_dir @@ -192,14 +192,14 @@ def main( print("[green]Successfully uploaded all files to target blob storage.[/green]") print("Creating analyzer...") - analyzer_id = submit_build_analyzer_put_request(analyzer_data, target_account_url, target_container_name, target_blob_name, target_blob_storage_sasToken, subscription_id) + analyzer_id = submit_build_analyzer_put_request(analyzer_data, target_account_url, target_container_name, target_blob_name, target_blob_storage_sasToken, subscription_key) url = os.getenv("ANALYZE_PDF_URL") if url == "": print("Skipping analyze PDF step, because no URL was provided.") else: print("Callling Analyze on given PDF file...") - submit_post_analyzer_request(url, analyzer_id, subscription_id) + submit_post_analyzer_request(url, analyzer_id, subscription_key) def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_version: str) -> list: """ @@ -277,7 +277,7 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str ocr_files.append(file_path) # Adding to list of files to run OCR on return analyzer_data, ocr_files -def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, targetContainerName: str, targetBlobName: str, targetBlobStorageSasToken: str, subscription_id: str) -> str: +def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, targetContainerName: str, targetBlobName: str, targetBlobStorageSasToken: str, subscription_key: str) -> str: """ Initiates the creation of an analyzer with the given fieldSchema and training data. """ @@ -296,7 +296,7 @@ def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, access_token = token.token headers = { "Authorization": f"Bearer {access_token}", - "Ocp-Apim-Subscription-Key": f"{subscription_id}", + "Ocp-Apim-Subscription-Key": f"{subscription_key}", "Content-Type": "application/json" } @@ -343,7 +343,7 @@ def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, return analyzer_id -def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_id: str) -> None: +def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_key: str) -> None: """ Call the Analyze API on the given PDF File """ @@ -356,7 +356,7 @@ def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_id: access_token = token.token headers = { "Authorization": f"Bearer {access_token}", - "Apim-Subscription-id": f"{subscription_id}", + "Ocp-Apim-Subscription-Key": f"{subscription_key}", "Content-Type": "application/pdf" } diff --git a/python/di_to_cu_migration_tool/requirements.txt b/python/di_to_cu_migration_tool/requirements.txt index e85ba18..2078d5a 100644 --- a/python/di_to_cu_migration_tool/requirements.txt +++ b/python/di_to_cu_migration_tool/requirements.txt @@ -1,5 +1,6 @@ # Dependencies for the DI to CU Migration OSS Tool azure-identity==1.20.0 +azure-storage-blob==12.25.1 dotenv==0.9.9 pytest==8.3.5 python-dateutil==2.9.0post0 From bd8af1d7075aa2920f9a2cc06cfc23596f51fe98 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 14 May 2025 18:04:17 -0500 Subject: [PATCH 08/50] resolving PR comments --- python/di_to_cu_migration_tool/README.md | 8 ++++---- python/di_to_cu_migration_tool/get_ocr.py | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 8c69dd5..8d2e9ac 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,8 +1,8 @@ # Document Intelligence to Content Understanding Migration Tool (Python) -Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format. The following DI versions are supported: -- DI 3.1/4.0 GA CustomNeural -- DI 4.0 Preview CustomGen +Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format seen in AI Foundry. The following DI versions are supported: +- DI 3.1/4.0 GA CustomNeural (seen in Document Intelligence Studio) +- DI 4.0 Preview CustomGen (seen in Document Extraction project) To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, this will automatically create a CU Analyzer using your provided AI Service endpoint and provide the option to run Analyze on a given file. @@ -59,5 +59,5 @@ After this command finishes running, you should be able to ## Things of Note - You will need to be using a version of Python above 3.9 -- Signatures are not supported in CU Preview.2 and thus, will be skipped when migrating the analyzer.json +- Fields with FieldType "signature," which are supported in 2024-11-30 Custom Neural, are not supported in the latest version of Content Understanding (2025-05-01-preview), and thus will be ignored when creating the analyzer - We will only be providing data conversion to CU Preview.2 diff --git a/python/di_to_cu_migration_tool/get_ocr.py b/python/di_to_cu_migration_tool/get_ocr.py index 7d798ac..bdb1453 100644 --- a/python/di_to_cu_migration_tool/get_ocr.py +++ b/python/di_to_cu_migration_tool/get_ocr.py @@ -99,7 +99,7 @@ def build_analyzer(credential, current_token, host, api_version, subscriptionKey time.sleep(0.5) return analyzer_id -def run_cu_layout_ocr(inputFiles: list, output_dir: str, subscriptionKey: str) -> None: +def run_cu_layout_ocr(input_files: list, output_dir_string: str, subscription_key: str) -> None: """ Function to run the CU Layout OCR on the list of pdf files and write to the given output directory """ @@ -115,14 +115,14 @@ def run_cu_layout_ocr(inputFiles: list, output_dir: str, subscriptionKey: str) - credential = DefaultAzureCredential() current_token = None - outputDir = Path(output_dir) - outputDir.mkdir(parents=True, exist_ok=True) + output_dir = Path(output_dir_string) + output_dir.mkdir(parents=True, exist_ok=True) # Need to create analyzer with empty schema - analyzer_id = build_analyzer(credential, current_token, host, api_version, subscriptionKey) + analyzer_id = build_analyzer(credential, current_token, host, api_version, subscription_key) url = f"{host}/analyzers/{analyzer_id}:analyze?api-version={api_version}" - for file in inputFiles: + for file in input_files: try: file = Path(file) print(f"\nProcessing file: {file.name}") @@ -130,7 +130,7 @@ def run_cu_layout_ocr(inputFiles: list, output_dir: str, subscriptionKey: str) - current_token = get_token(credential, current_token) headers = { "Authorization": f"Bearer {current_token.token}", - "Apim-Subscription-id": f"{subscriptionKey}", + "Apim-Subscription-id": f"{subscription_key}", "Content-Type": "application/pdf", } @@ -154,7 +154,7 @@ def run_cu_layout_ocr(inputFiles: list, output_dir: str, subscriptionKey: str) - status = result.get("status", "").lower() if status == "succeeded": - outputFile = outputDir / (file.name + ".result.json") + outputFile = output_dir / (file.name + ".result.json") with open(outputFile, "w") as out_f: json.dump(result, out_f, indent=4) print(f"[green]Success: Results saved to {outputFile}[/green]") From 4ba72c7760cd3a5d9d73742f3c673daf8bde5e30 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Thu, 15 May 2025 14:59:25 -0500 Subject: [PATCH 09/50] changed outputFile to output_file --- python/di_to_cu_migration_tool/get_ocr.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/di_to_cu_migration_tool/get_ocr.py b/python/di_to_cu_migration_tool/get_ocr.py index bdb1453..c1cdf32 100644 --- a/python/di_to_cu_migration_tool/get_ocr.py +++ b/python/di_to_cu_migration_tool/get_ocr.py @@ -154,10 +154,10 @@ def run_cu_layout_ocr(input_files: list, output_dir_string: str, subscription_ke status = result.get("status", "").lower() if status == "succeeded": - outputFile = output_dir / (file.name + ".result.json") - with open(outputFile, "w") as out_f: + output_file = output_dir / (file.name + ".result.json") + with open(output_file, "w") as out_f: json.dump(result, out_f, indent=4) - print(f"[green]Success: Results saved to {outputFile}[/green]") + print(f"[green]Success: Results saved to {output_file}[/green]") break elif status == "failed": print(f"[red]Failed: {result}[/red]") From 6a3ebbbf42cfebf7f6b95a088fc8b38c5efa149f Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Fri, 16 May 2025 11:37:12 -0500 Subject: [PATCH 10/50] removed content understanding from host, as customers might not know to add this in --- python/di_to_cu_migration_tool/README.md | 4 ++-- python/di_to_cu_migration_tool/di_to_cu_migration_tool.py | 4 ++-- python/di_to_cu_migration_tool/get_ocr.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 8d2e9ac..04611c5 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -12,7 +12,7 @@ To setup this tool, you will need to do the following steps: 1. Run the requirements.txt to install the needed dependencies via **pip install -r ./requirements.txt** 2. Rename the file **.sample_env** as **.env** 3. Replace the following values in your **.env** file as such: - - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint + - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint. Be sure to remove the "/" at the end. - Ex: "https://aainatest422.services.ai.azure.com" - **SUBSCRIPTION_KEY:** Replace this with your name or alias, is used to identify who called the API request - Ex: "vannanaaina" @@ -35,7 +35,7 @@ To setup this tool, you will need to do the following steps: A SAS Token is needed for creating an Analyzer. - **ANALYZE_PDF_URL:** Replace this with the SAS URL to a file you wish to analyze (i.e. pdf, jpg, jpeg, etc.). If you wish to not run Analyze, you can leave this as empty (i.e. "") - Ex: "https://srcStorageAccountName.blob.core.windows.net/srcContainerName/src/path/to/folder/test.pdf?SASToken" - - **ANALYZE_RESULT_OUTPUT_JSON:** Replace this with where you wish to store the analyze results. The default is "./analyze_result.json" + - **ANALYZE_RESULT_OUTPUT_JSON:** Replace this with where you wish to store the analyze results. The default is "./sample_documents/analyze_result.json". ## How to Run To run this tool, you will be using the command line to run the following commands. diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py index 8088052..c6dd7ce 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py +++ b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py @@ -285,7 +285,7 @@ def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, analyzer_id = analyzerData["analyzerId"] host = os.getenv("HOST") api_version = os.getenv("API_VERSION") - endpoint = f"{host}/analyzers/{analyzer_id}?api-version={api_version}" + endpoint = f"{host}/contentunderstanding/analyzers/{analyzer_id}?api-version={api_version}" # Request Header - Content-Type # Acquire a token for the desired scope @@ -362,7 +362,7 @@ def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_key host = os.getenv("HOST") api_version = os.getenv("API_VERSION") - endpoint = f"{host}/analyzers/{analyzerId}:analyze?api-version={api_version}" + endpoint = f"{host}/contentunderstanding/analyzers/{analyzerId}:analyze?api-version={api_version}" blob = BlobClient.from_blob_url(pdfURL) blob_data = blob.download_blob().readall() diff --git a/python/di_to_cu_migration_tool/get_ocr.py b/python/di_to_cu_migration_tool/get_ocr.py index c1cdf32..c56f2f0 100644 --- a/python/di_to_cu_migration_tool/get_ocr.py +++ b/python/di_to_cu_migration_tool/get_ocr.py @@ -69,7 +69,7 @@ def build_analyzer(credential, current_token, host, api_version, subscriptionKey "processingLocation": "geography", "mode": "standard" } - endpoint = f"{host}/analyzers/{analyzer_id}?api-version={api_version}" + endpoint = f"{host}/contentunderstanding/analyzers/{analyzer_id}?api-version={api_version}" print("[yellow]Creating sample analyzer to attain CU Layout results...[/yellow]") response = requests.put( url=endpoint, @@ -120,7 +120,7 @@ def run_cu_layout_ocr(input_files: list, output_dir_string: str, subscription_ke # Need to create analyzer with empty schema analyzer_id = build_analyzer(credential, current_token, host, api_version, subscription_key) - url = f"{host}/analyzers/{analyzer_id}:analyze?api-version={api_version}" + url = f"{host}/contentunderstanding/analyzers/{analyzer_id}:analyze?api-version={api_version}" for file in input_files: try: From c770f1fc38d8789cb6992ec731603f067b33392b Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Mon, 19 May 2025 11:30:31 -0500 Subject: [PATCH 11/50] resolved Tim's comments --- python/di_to_cu_migration_tool/README.md | 4 ++-- python/di_to_cu_migration_tool/cu_converter_customGen.py | 9 +++------ .../di_to_cu_migration_tool/di_to_cu_migration_tool.py | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 04611c5..68fc2d5 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -13,9 +13,9 @@ To setup this tool, you will need to do the following steps: 2. Rename the file **.sample_env** as **.env** 3. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint. Be sure to remove the "/" at the end. - - Ex: "https://aainatest422.services.ai.azure.com" + - Ex: "https://user422.services.ai.azure.com" - **SUBSCRIPTION_KEY:** Replace this with your name or alias, is used to identify who called the API request - - Ex: "vannanaaina" + - Ex: "userAlias" - **SOURCE_BLOB_ACCOUNT_URL:** Replace this with the URL to your blob storage account that contains your DI dataset - Ex: "https://srcStorageAccountName.blob.core.windows.net" - **SOURCE_BLOB_CONTAINER_NAME:** Replace this with the container within your blob storage account that contains your DI dataset diff --git a/python/di_to_cu_migration_tool/cu_converter_customGen.py b/python/di_to_cu_migration_tool/cu_converter_customGen.py index 73a6271..8b564e8 100644 --- a/python/di_to_cu_migration_tool/cu_converter_customGen.py +++ b/python/di_to_cu_migration_tool/cu_converter_customGen.py @@ -33,7 +33,7 @@ def format_angle(angle: float) -> float: formatted_num = f"{rounded_angle:.7f}".rstrip('0') # Remove trailing zeros return float(formatted_num) -def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Path, field_definitions: FieldDefinitions, internal: bool = True) -> dict: +def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Path, field_definitions: FieldDefinitions) -> dict: """ Convert DI 4.0 preview CustomGen fields.json to analyzer.json format. @@ -59,7 +59,7 @@ def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional # Build analyzer.json content analyzer_id = f"{analyzer_prefix}_{doc_type}" if analyzer_prefix else doc_type - # build analyzer.json appropriately based on if internal or not + # build analyzer.json appropriately analyzer_data = { "analyzerId": analyzer_id, "baseAnalyzerId": "prebuilt-documentAnalyzer", @@ -82,16 +82,13 @@ def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional "templateId": fields_data.get("templateId", "document-2024-12-01") } - if internal: - analyzer_data["config"]["_promptId"] = "document" - # Update field schema to be in CU format fields = fields_data.get(ANALYZER_FIELDS, {}) if (len(fields) == 0): print("[red]Error: Fields.json should not be empty.[/red]") sys.exit(1) for key, value in fields.items(): - if len(key) > MAX_FIELD_LENGTH and not internal: + if len(key) > MAX_FIELD_LENGTH: print(f"[red]Error: Field key '{key}' contains {len(key)}, which exceeds the limit of {MAX_FIELD_LENGTH} characters. [/red]") sys.exit(1) analyzer_field = recursive_convert_field_to_analyzer_helper(key, value, field_definitions) diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py index c6dd7ce..c3018f9 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py +++ b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py @@ -254,7 +254,7 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str assert fields_path.exists(), "fields.json is needed. Fields.json is missing from the given dataset." if DI_version == "CustomGen": - analyzer_data = cu_converter_customGen.convert_fields_to_analyzer(fields_path, analyzer_prefix, temp_target_dir, field_definitions, False) + analyzer_data = cu_converter_customGen.convert_fields_to_analyzer(fields_path, analyzer_prefix, temp_target_dir, field_definitions) elif DI_version == "CustomNeural": analyzer_data, fields_dict = cu_converter_customNeural.convert_fields_to_analyzer_neural(fields_path, analyzer_prefix, temp_target_dir, field_definitions) From 3739db264d480815eacdc34b79cc223fc5fe7440 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Thu, 22 May 2025 00:20:44 -0500 Subject: [PATCH 12/50] resolving Thomas' comments --- .../cu_converter_customGen.py | 40 +++++++++++++++-- .../cu_converter_customNeural.py | 45 +++++++++++++++++-- .../di_to_cu_migration_tool.py | 33 +++++++++++++- .../field_type_conversion.py | 44 ++++++++++++++++++ python/di_to_cu_migration_tool/get_ocr.py | 30 ++++++++++--- 5 files changed, 179 insertions(+), 13 deletions(-) diff --git a/python/di_to_cu_migration_tool/cu_converter_customGen.py b/python/di_to_cu_migration_tool/cu_converter_customGen.py index 8b564e8..e61306e 100644 --- a/python/di_to_cu_migration_tool/cu_converter_customGen.py +++ b/python/di_to_cu_migration_tool/cu_converter_customGen.py @@ -23,12 +23,27 @@ CU_LABEL_SCHEMA = f"https://schema.ai.azure.com/mmi/{CU_API_VERSION}/labels.json" def convert_bounding_regions_to_source(page_number: int, polygon: list) -> str: + """ + Convert bounding regions (DI) to source string (CU) format. + Args: + page_number (int): The page number. + polygon (list): The polygon coordinates. + Returns: + str: The source string in the format D(page_number, x1,y1,x2,y2,...). + """ # Convert polygon to string format polygon_str = ",".join(str(coord) for coord in polygon) source = f"D({page_number},{polygon_str})" return source def format_angle(angle: float) -> float: + """ + Format the angle to 7 decimal places and remove trailing zeros. + Args: + angle (float): The angle to format. + Returns: + float: The formatted angle. + """ rounded_angle = round(angle, 7) formatted_num = f"{rounded_angle:.7f}".rstrip('0') # Remove trailing zeros return float(formatted_num) @@ -36,11 +51,13 @@ def format_angle(angle: float) -> float: def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Path, field_definitions: FieldDefinitions) -> dict: """ Convert DI 4.0 preview CustomGen fields.json to analyzer.json format. - Args: - fields_json_path (Path): Path to the input fields.json file. + fields_json_path (Path): Path to the input DI fields.json file. analyzer_prefix (Optional(str)): Prefix for the analyzer name. target_dir (Optional[Path]): Output directory for the analyzer.json file. + field_definitions (FieldDefinitions): Field definitions object to store definitions in case of fixed tables. + Returns: + dict: The generated analyzer.json data. """ try: with open(fields_json_path, 'r') as f: @@ -115,6 +132,15 @@ def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional return analyzer_data def recursive_convert_field_to_analyzer_helper(key: str, value: dict, field_definitions: FieldDefinitions) -> dict: + """ + Recursively convert each DI field to CU analyzer.json format + Args: + key (str): The field key. + value (dict): The field value. + field_definitions (FieldDefinitions): Field definitions object that stores definitions in case of fixed tables. + Returns: + dict: The converted field in analyzer.json format. + """ # this is the method that does the conversion of the fields itself analyzer_field = { @@ -168,7 +194,6 @@ def recursive_convert_field_to_analyzer_helper(key: str, value: dict, field_defi def convert_di_labels_to_cu(di_labels_path: Path, target_dir: Path) -> None: """ Convert DI 4.0 preview CustomGen format labels.json to Content Understanding format labels.json. - Args: di_labels_path (Path): Path to the Document Intelligence labels.json file. target_dir (Path): Output directory for the Content Understanding labels.json file. @@ -210,6 +235,14 @@ def convert_di_labels_to_cu(di_labels_path: Path, target_dir: Path) -> None: print(f"[green]Successfully converted Document Intelligence labels.json to Content Understanding labels.json at {cu_labels_path}[/green]\n") def recursive_convert_di_label_to_cu_helper(value: dict) -> dict: + """ + Recursively convert each DI field to CU labels.json format + Args: + value (dict): The field value. + Returns: + dict: The converted field in labels.json format. + """ + value_type = value.get("type") if(value_type not in VALID_CU_FIELD_TYPES and value_type != "selectionMark"): print(f"[red]Unexpected field type: {value_type}. Please refer to the specification for valid field types.[/red]") @@ -304,7 +337,6 @@ def recursive_convert_di_label_to_cu_helper(value: dict) -> dict: def convert_ocr_to_result(di_ocr_path: Path, target_dir: Path) -> None: """ Convert Document Intelligence format ocr.json to Content Understanding format result.json - Args: di_ocr_path (Path): Path to the Document Intelligence ocr.json file. target_dir (Path): Output directory for the Content Undrestanding result.json file. diff --git a/python/di_to_cu_migration_tool/cu_converter_customNeural.py b/python/di_to_cu_migration_tool/cu_converter_customNeural.py index c998528..d825f10 100644 --- a/python/di_to_cu_migration_tool/cu_converter_customNeural.py +++ b/python/di_to_cu_migration_tool/cu_converter_customNeural.py @@ -23,6 +23,15 @@ CU_LABEL_SCHEMA = f"https://schema.ai.azure.com/mmi/{CU_API_VERSION}/labels.json" def convert_bounding_regions_to_source(page_number: int, polygon: list) -> str: + """ + Convert bounding regions to source format. + Args: + page_number (int): The page number of the bounding region. + polygon (list): The coordinates of the bounding region + Returns: + str: The source string in the format D(page_number, x1,y1,x2,y2,...). + """ + # Convert polygon to string format polygon_str = ",".join(str(coord) for coord in polygon) source = f"D({page_number},{polygon_str})" @@ -31,11 +40,13 @@ def convert_bounding_regions_to_source(page_number: int, polygon: list) -> str: def convert_fields_to_analyzer_neural(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Optional[Path], field_definitions: FieldDefinitions) -> Tuple[dict, dict]: """ Convert DI 3.1/4.0GA Custom Neural fields.json to analyzer.json format. - Args: fields_json_path (Path): Path to the input fields.json file. analyzer_prefix (Optional(str)): Prefix for the analyzer name. target_dir (Optional[Path]): Output directory for the analyzer.json file. + field_definitions (FieldDefinitions): Field definitions object to store field definitions for analyzer.json if there are any fixed tables. + Returns: + Tuple[dict, dict]: The analyzer data and a dictionary of the fields and their types for label conversion. """ try: with open(fields_json_path, 'r', encoding="utf-8") as f: @@ -135,6 +146,13 @@ def convert_fields_to_analyzer_neural(fields_json_path: Path, analyzer_prefix: O def convert_array_items(analyzer_key: str, item_definition: dict) -> Tuple[dict, dict]: """ Helper function to convert array items for the analyzer. + Args: + analyzer_key (str): The dictionary key for the array item (i.e., the name of the dynamic table). + item_definition (dict): The item definition from the fields.json file (i.e. the itemType value) + Returns: + Tuple[dict, dict]: A tuple containing two dictionaries: + - The first dictionary contains the field names and types for the array items. + - The second dictionary contains the items or rows within the dynamic table """ array_fields_dict = {} items = { @@ -160,6 +178,15 @@ def convert_array_items(analyzer_key: str, item_definition: dict) -> Tuple[dict, def convert_object_properties(field: dict, definitions: dict, analyzer_key: str, field_definitions: FieldDefinitions) -> Tuple[dict, dict]: """ Helper function to convert object properties for the analyzer. + Args: + field (dict): The field from the fields.json file for the fixed table. + definitions (dict): The definitions from the fields.json file definitions section for the fixed table. + analyzer_key (str): The dictionary key for the object (i.e., the name of the fixed table). + field_definitions (FieldDefinitions): Field definitions object to store field definitions for analyzer.json if there are any fixed tables. + Returns: + Tuple[dict, dict]: A tuple containing two dictionaries: + - The first dictionary contains the field names in fott format and types for the object properties. + - The second dictionary contains the properties or rows within the fixed table """ object_fields_dict = {} properties = {} @@ -180,6 +207,13 @@ def convert_object_properties(field: dict, definitions: dict, analyzer_key: str, def _add_object_definition(row_definition: dict, analyzer_key: str, first_row_name: str, field_definitions: FieldDefinitions) -> dict: """ Helper function to add object definitions to the analyzer. + Args: + row_definition (dict): The row definition from the fields.json file for the fixed table. + analyzer_key (str): The dictionary key for the object (i.e., the name of the fixed table). + first_row_name (str): The name of the first row in the fixed table. + field_definitions (FieldDefinitions): Field definitions object to store field definitions for analyzer.json if there are any fixed tables. + Returns: + dict: A dictionary containing the field names and types for the object properties. """ column_fields_dict = {} definition = { @@ -208,10 +242,13 @@ def _add_object_definition(row_definition: dict, analyzer_key: str, first_row_na def convert_di_labels_to_cu_neural(di_labels_path: Path, target_dir: Path, fields_dict: dict, removed_signatures: list) -> dict: """ Convert DI 3.1/4.0 GA Custom Neural format labels.json to Content Understanding format labels.json. - Args: di_labels_path (Path): Path to the Document Intelligence labels.json file. target_dir (Path): Output directory for the Content Understanding labels.json file. + fields_dict (dict): Dictionary of field names and types for the labels.json conversion. + removed_signatures (list): List of removed signatures that we will skip when converting the labels.json file. + Returns: + dict: The Content Understanding labels.json data. """ try: with open(di_labels_path, 'r', encoding="utf-8") as f: @@ -327,9 +364,11 @@ def convert_di_labels_to_cu_neural(di_labels_path: Path, target_dir: Path, field def creating_cu_label_for_neural(label:dict, label_type: str) -> dict: """ Create a CU label for DI 3.1/4.0 Custom Neural format labels.json. - Args: label (dict): The label to be converted and created. + label_type (str): The type of the label. + Returns: + dict: The converted CU label. """ label_value = VALID_CU_FIELD_TYPES[label_type] label_spans = label.get("spans", []) diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py index c3018f9..144f9f5 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py +++ b/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py @@ -25,10 +25,16 @@ app = typer.Typer() -def validate_field_count(DI_version, byte_fields) -> Tuple[int, str]: +def validate_field_count(DI_version, byte_fields) -> Tuple[int, bool]: """ Function to check if the fields.json is valid Checking to see if the number of fields is less than or equal to 100 + Args: + DI_version (str): The version of DI being used + byte_fields (bytes): The fields.json file in bytes + Returns: + field_count (int): The number of fields in the fields.json file + is_valid (bool): True if the fields.json file is valid, False otherwise """ string_fields = byte_fields.decode("utf-8") fields = json.loads(string_fields) @@ -204,6 +210,12 @@ def main( def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_version: str) -> list: """ Function to run the field type conversion + Args: + temp_source_dir (Path): The path to the source directory + temp_dir (Path): The path to the target directory + DI_version (str): The version of DI being used + Returns: + removed_signatures (list): The list of removed signatures as they will not be used in the CU converter """ # Taking the input source dir, and converting the valid field types into temp_dir for root, dirs, files in os.walk(temp_source_dir): @@ -244,6 +256,12 @@ def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_vers def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str, analyzer_prefix: str, removed_signatures: list) -> Tuple[dict, list]: """ Function to run the DI to CU conversion + Args: + temp_dir (Path): The path to the source directory + temp_target_dir (Path): The path to the target directory + DI_version (str): The version of DI being used + analyzer_prefix (str): The prefix for the analyzer name + removed_signatures (list): The list of removed signatures that will not be used in the CU converter """ # Creating a FieldDefinitons object to handle the converison of definitions in the fields.json field_definitions = FieldDefinitions() @@ -280,6 +298,15 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, targetContainerName: str, targetBlobName: str, targetBlobStorageSasToken: str, subscription_key: str) -> str: """ Initiates the creation of an analyzer with the given fieldSchema and training data. + Args: + analyzerData (dict): The data in the converted analyzer.json + targetAccountUrl (str): The URL of the target blob storage account. + targetContainerName (str): The name of the target blob storage container. + targetBlobName (str): The name of the target blob storage folder. + targetBlobStorageSasToken (str): The SAS token for the target blob storage account. + subscription_key (str): The subscription key that will be used within the API calls + Returns: + analyzerId (str): The ID of the created analyzer. """ # URI Parameters - analyzerId, endpoint, & api-version analyzer_id = analyzerData["analyzerId"] @@ -346,6 +373,10 @@ def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_key: str) -> None: """ Call the Analyze API on the given PDF File + Args: + pdfURL (str): The URL of the PDF file to be analyzed. + analyzerId (str): The ID of the analyzer to be used for running Analyzer + subscription_key (str): The subscription key that will be used within the API calls """ # Request Header - Content-Type # Acquire a token for the desired scope diff --git a/python/di_to_cu_migration_tool/field_type_conversion.py b/python/di_to_cu_migration_tool/field_type_conversion.py index 494321b..4b86e8c 100644 --- a/python/di_to_cu_migration_tool/field_type_conversion.py +++ b/python/di_to_cu_migration_tool/field_type_conversion.py @@ -8,6 +8,13 @@ from constants import CHECKED_SYMBOL, CONVERT_TYPE_MAP, FIELD_VALUE_MAP, SUPPORT_FIELD_TYPE, UNCHECKED_SYMBOL def update_unified_schema_fields(fields: dict) -> Tuple[dict, dict]: + """ + Updaate the unified schema fields to have the proper field types + Args: + fields (dict): The unified schema fields to be updated + Returns: + Tuple[dict, dict]: The updated unified schema fields and the converted field keys + """ converted_field_keys = { "primary": [], "array": defaultdict(list), @@ -41,6 +48,11 @@ def update_unified_schema_fields(fields: dict) -> Tuple[dict, dict]: return fields, converted_field_keys def _update_unified_schema_fields(field_object: dict) -> None: + """ + Helper function to update the unified schema field object to have the proper field type + Args: + field_object (dict): The unified schema field object to be updated + """ original_type = field_object["type"] field_object["type"] = CONVERT_TYPE_MAP[original_type] \ if original_type in CONVERT_TYPE_MAP else "string" @@ -48,6 +60,13 @@ def _update_unified_schema_fields(field_object: dict) -> None: def update_unified_schema_labels( labels: dict, converted_field_keys: list[str], output_path: Path ) -> None: + """ + Update the unified schema labels to have the proper field types per the converted field keys + Args: + labels (dict): The unified schema labels to be updated + converted_field_keys (list[str]): The converted field keys to be used to update the labels + output_path (Path): The path to the output file (i.e. the updated labels) + """ for label_key, label_object in labels["fieldLabels"].items(): if label_key in converted_field_keys.get("primary", []): _update_unified_schema_labels(label_key, label_object) @@ -78,6 +97,12 @@ def update_unified_schema_labels( json.dump(labels, fp, ensure_ascii=False, indent=4) def _update_unified_schema_labels(label_key: str, label_object: dict) -> None: + """ + Helper function to update the unified schema label object to have the proper field type + Args: + label_key (str): The unified schema label key to be updated + label_object (dict): The unified schema label object to be updated + """ value_key = FIELD_VALUE_MAP.get(label_object["type"]) if value_key is None: print(f"Unsupported field type: '{label_object['type']}'") @@ -109,6 +134,13 @@ def _update_unified_schema_labels(label_key: str, label_object: dict) -> None: label_object.pop(value_key) if value_key in label_object else None def update_fott_fields(fields: dict) -> Tuple[list, dict]: + """ + Update the FOTT fields to have the proper field types + Args: + fields (dict): The FOTT fields to be updated + Returns: + Tuple[list, dict]: The updated FOTT fields and the converted field keys + """ if "$schema" not in fields: return fields if "fields" not in fields: @@ -140,6 +172,12 @@ def update_fott_fields(fields: dict) -> Tuple[list, dict]: return signatures, fields def update_fott_labels(labels: dict, output_path: Path) -> None: + """ + Update the FOTT labels to have the proper field types + Args: + labels (dict): The FOTT labels to be updated + output_path (Path): The path to the output file (i.e. the updated labels) + """ for label_key, label_object in labels["fieldLabels"].items(): if label_object["type"] == "array": for value_array in label_object["valueArray"]: @@ -155,6 +193,12 @@ def update_fott_labels(labels: dict, output_path: Path) -> None: json.dump(labels, fp, ensure_ascii=False, indent=4) def _update_boolean_label(label_key: str, label_object: dict) -> None: + """ + Helper function to update the FOTT label object if it is a boolean type + Args: + label_key (str): The FOTT label key to be updated + label_object (dict): The FOTT label object to be updated + """ if label_object["type"] == "boolean": if label_object["valueBoolean"] in ["selected", ":selected:"]: label_object["valueBoolean"] = True diff --git a/python/di_to_cu_migration_tool/get_ocr.py b/python/di_to_cu_migration_tool/get_ocr.py index c56f2f0..a1b849b 100644 --- a/python/di_to_cu_migration_tool/get_ocr.py +++ b/python/di_to_cu_migration_tool/get_ocr.py @@ -18,6 +18,10 @@ def is_token_expired(token) -> bool: """ Check if the token is expired or about to expire. + Args: + token: The token object to check for expiration. + Returns: + bool: True if the token is expired or about to expire, False otherwise. """ # Get the current time in UTC current_time = datetime.now(timezone.utc).timestamp() @@ -27,6 +31,14 @@ def is_token_expired(token) -> bool: return current_time >= (token.expires_on - buffer_time) def get_token(credential, current_token = None) -> str: + """ + Function to get a valid token + Args: + credential: The Azure credential object to use for authentication. + current_token: The current token object to check for expiration. + Returns: + str: The new access token. + """ # Refresh token if it's expired or about to expire if current_token is None or is_token_expired(current_token): # Refresh the token @@ -36,7 +48,15 @@ def get_token(credential, current_token = None) -> str: def build_analyzer(credential, current_token, host, api_version, subscriptionKey) -> str: """ - Function to create an analyzer with empty schema + Function to create an analyzer with empty schema to get CU Layout results + Args: + credential: The Azure credential object to use for authentication. + current_token: The current token object to check for expiration. + host: The host URL for the Cognitive Services API. + api_version: The API version enviornmental variable to use. + subscriptionKey: The subscription key for the Cognitive Services API. + Returns: + str: The analyzer ID of the created analyzer. """ # Get a valid token current_token = get_token(credential, current_token) @@ -50,8 +70,6 @@ def build_analyzer(credential, current_token, host, api_version, subscriptionKey request_body = { "analyzerId": analyzer_id, "description": "Sample analyzer", - "createdAt": "2025-05-06T00:20:42Z", - "lastModifiedAt": "2025-05-06T00:20:42Z", "baseAnalyzerId": "prebuilt-documentAnalyzer", "config": { "returnDetails": True, @@ -59,8 +77,6 @@ def build_analyzer(credential, current_token, host, api_version, subscriptionKey "enableLayout": True, "enableFormula": False, "disableContentFiltering": False, - "segmentationMode": "noSegmentation", - "tableFormat": "html", "estimateFieldSourceAndConfidence": False }, "fieldSchema": {}, @@ -102,6 +118,10 @@ def build_analyzer(credential, current_token, host, api_version, subscriptionKey def run_cu_layout_ocr(input_files: list, output_dir_string: str, subscription_key: str) -> None: """ Function to run the CU Layout OCR on the list of pdf files and write to the given output directory + Args: + input_files (list): List of input PDF files to process. + output_dir_string (str): Path to the output directory where results will be saved. + subscription_key (str): The subscription key for the Cognitive Services API. """ print("Running CU Layout OCR...") From 47a61264e16f445fac9f2934598fd523927ba8de Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Thu, 22 May 2025 14:24:00 -0500 Subject: [PATCH 13/50] made changes to implementation per Paul's comments --- python/di_to_cu_migration_tool/.sample_env | 2 +- python/di_to_cu_migration_tool/README.md | 6 +- .../di_to_cu_migration_tool/call_analyze.py | 79 + .../create_analyzer.py | 101 + ...igration_tool.py => di_to_cu_converter.py} | 177 +- .../sample_documents/analyzer_result.json | 9846 +++++++++++++++++ 6 files changed, 10042 insertions(+), 169 deletions(-) create mode 100644 python/di_to_cu_migration_tool/call_analyze.py create mode 100644 python/di_to_cu_migration_tool/create_analyzer.py rename python/di_to_cu_migration_tool/{di_to_cu_migration_tool.py => di_to_cu_converter.py} (65%) create mode 100644 python/di_to_cu_migration_tool/sample_documents/analyzer_result.json diff --git a/python/di_to_cu_migration_tool/.sample_env b/python/di_to_cu_migration_tool/.sample_env index 3abb783..14bdeae 100644 --- a/python/di_to_cu_migration_tool/.sample_env +++ b/python/di_to_cu_migration_tool/.sample_env @@ -3,7 +3,7 @@ HOST="" API_VERSION = "2025-05-01-preview" -SUBSCRIPTION_KEY = "" # This is your subscription ID +SUBSCRIPTION_KEY = "" # This is your API Key if you have one or can be your Subscription ID # Source blob storage & target blob storage SOURCE_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 68fc2d5..edb7d50 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -14,7 +14,7 @@ To setup this tool, you will need to do the following steps: 3. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" - - **SUBSCRIPTION_KEY:** Replace this with your name or alias, is used to identify who called the API request + - **SUBSCIPITON_KEY:** Replace this with your name or alias, is used to identify who called the API request - Ex: "userAlias" - **SOURCE_BLOB_ACCOUNT_URL:** Replace this with the URL to your blob storage account that contains your DI dataset - Ex: "https://srcStorageAccountName.blob.core.windows.net" @@ -42,13 +42,13 @@ To run this tool, you will be using the command line to run the following comman To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, run this command: -**python ./di_to_cu_migration_tool.py --DI-version CustomNeural --analyzer-prefix myAnalyzer** +**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer** If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. To convert a _DI 4.0 Preview CustomGen_, run this command: -**python ./di_to_cu_migration_tool.py --DI-version CustomGen --analyzer-prefix myAnalyzer** +**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer** Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. diff --git a/python/di_to_cu_migration_tool/call_analyze.py b/python/di_to_cu_migration_tool/call_analyze.py new file mode 100644 index 0000000..1ba931d --- /dev/null +++ b/python/di_to_cu_migration_tool/call_analyze.py @@ -0,0 +1,79 @@ +# imports from built-in packages +from azure.identity import DefaultAzureCredential +from azure.storage.blob import BlobClient +from dotenv import load_dotenv +import json +import os +import requests +import time +import typer + +# imports from external packages (in requirements.txt) +from rich import print # For colored output + +app = typer.Typer() + +@app.command() +def main( + analyzer_id: str = typer.Option(..., "--analyzer-id", help="Analyzer ID to use for the analyze API"), + pdf_sas_url: str = typer.Option(..., "--pdf-sas-url", help="SAS URL for the PDF file to analyze"), +): + """ + Main function to call the analyze API + """ + assert analyzer_id != "", "Please provide the analyzer ID to use for the analyze API" + assert pdf_sas_url != "", "Please provide the SAS URL for the PDF file you wish to analyze" + + load_dotenv() + # Request Header - Content-Type + # Acquire a token for the desired scope + credential = DefaultAzureCredential() + token = credential.get_token("https://cognitiveservices.azure.com/.default") + + # Extract the access token + access_token = token.token + subscription_key = os.getenv("SUBSCRIPTION_KEY") + headers = { + "Authorization": f"Bearer {access_token}", + "Ocp-Apim-Subscription-Key": f"{subscription_key}", + "Content-Type": "application/pdf" + } + + host = os.getenv("HOST") + api_version = os.getenv("API_VERSION") + endpoint = f"{host}/contentunderstanding/analyzers/{analyzer_id}:analyze?api-version={api_version}" + + blob = BlobClient.from_blob_url(pdf_sas_url) + blob_data = blob.download_blob().readall() + response = requests.post(url=endpoint, data=blob_data, headers=headers) + + response.raise_for_status() + print(f"[yellow]Analyzing file {pdf_sas_url} with analyzer {analyzer_id}[/yellow]") + + operation_location = response.headers.get("Operation-Location", None) + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + + while True: + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + print(f"[green]Successfully analyzed file {pdf_sas_url} with analyzer ID of {analyzer_id}.[/green]\n") + analyze_result_file = os.getenv("ANALYZER_RESULT_OUTPUT_JSON") + with open(analyze_result_file, "w") as f: + json.dump(result, f, indent=4) + print(f"[green]Analyze result saved to {analyze_result_file}[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + +if __name__ == "__main__": + app() \ No newline at end of file diff --git a/python/di_to_cu_migration_tool/create_analyzer.py b/python/di_to_cu_migration_tool/create_analyzer.py new file mode 100644 index 0000000..b849f4b --- /dev/null +++ b/python/di_to_cu_migration_tool/create_analyzer.py @@ -0,0 +1,101 @@ +# imports from built-in packages +from azure.identity import DefaultAzureCredential +from azure.storage.blob import BlobClient +from dotenv import load_dotenv +import json +import os +import requests +import time +import typer + +# imports from external packages (in requirements.txt) +from rich import print # For colored output + +app = typer.Typer() + +@app.command() +def main( + analyzer_sas_url: str = typer.Option("", "--analyzer-sas-url", help="SAS URL for the created analyzer.json"), + target_container_sas_url: str = typer.Option("", "--target-container-sas-url", help="Target blob container SAS URL."), + target_blob_folder: str = typer.Option("", "--target-blob-folder", help="Target blob storage folder prefix."), +): + """ + Main function to create the CU analyzer + """ + assert analyzer_sas_url != "", "Please provide the SAS URL for the created CU analyzer.json so we are able to call the Build Analyzer API" + assert target_container_sas_url != "", "Please provide the SAS URL for the target blob container so we are able to refer to the created CU dataset" + assert target_blob_folder != "", "Please provide the target blob folder so we are able to refer to the created CU dataset" + + + # Load the analyzer.json file + print(f"Loading analyzer.json from...") + blob_client = BlobClient.from_blob_url(analyzer_sas_url) + analyzer_json = blob_client.download_blob().readall() + analyzer_json = analyzer_json.decode("utf-8") + analyzer_json = json.loads(analyzer_json) + print("[yellow]Finished loading analyzer.json.[/yellow]\n") + + # URI Parameters - analyzerId, endpoint, & api-version + load_dotenv() + analyzer_id = analyzer_json["analyzerId"] + host = os.getenv("HOST") + api_version = os.getenv("API_VERSION") + endpoint = f"{host}/contentunderstanding/analyzers/{analyzer_id}?api-version={api_version}" + + # Request Header - Content-Type + # Acquire a token for the desired scope + credential = DefaultAzureCredential() + token = credential.get_token("https://cognitiveservices.azure.com/.default") + + # Extract the access token + access_token = token.token + subscription_key = os.getenv("SUBSCRIPTION_KEY") + headers = { + "Authorization": f"Bearer {access_token}", + "Ocp-Apim-Subscription-Key": f"{subscription_key}", + "Content-Type": "application/json" + } + + # Request Body - config, desciription, fieldSchema, scenario, tags, & trainingData + request_body = { + "baseAnalyzerId": analyzer_json["baseAnalyzerId"], + "description": analyzer_json["fieldSchema"]["description"], + "config": analyzer_json["config"], + "fieldSchema": analyzer_json["fieldSchema"], + "trainingData": { + "kind": "blob", + "containerUrl": target_container_sas_url, + "prefix": target_blob_folder + } + } + + print(f"[yellow]Creating analyzer with analyzer ID: {analyzer_id}...[/yellow]") + response = requests.put( + url=endpoint, + headers=headers, + json=request_body, + ) + response.raise_for_status() + operation_location = response.headers.get("Operation-Location", None) + if not operation_location: + print("Error: 'Operation-Location' header is missing.") + + while True: + poll_response = requests.get(operation_location, headers=headers) + poll_response.raise_for_status() + + result = poll_response.json() + status = result.get("status", "").lower() + + if status == "succeeded": + print(f"\n[green]Successfully created analyzer with ID: {analyzer_id}[/green]") + break + elif status == "failed": + print(f"[red]Failed: {result}[/red]") + break + else: + print(".", end="", flush=True) + time.sleep(0.5) + +if __name__ == "__main__": + app() diff --git a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py b/python/di_to_cu_migration_tool/di_to_cu_converter.py similarity index 65% rename from python/di_to_cu_migration_tool/di_to_cu_migration_tool.py rename to python/di_to_cu_migration_tool/di_to_cu_converter.py index 144f9f5..92a41ef 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_migration_tool.py +++ b/python/di_to_cu_migration_tool/di_to_cu_converter.py @@ -5,10 +5,8 @@ import json import os from pathlib import Path -import requests import shutil import tempfile -import time import typer from typing import Tuple @@ -84,12 +82,19 @@ def validate_field_count(DI_version, byte_fields) -> Tuple[int, bool]: def main( analyzer_prefix: str = typer.Option("", "--analyzer-prefix", help="Prefix for analyzer name."), DI_version: str = typer.Option("CustomGen", "--DI-version", help="DI versions: CustomGen, CustomNeural"), + source_container_sas_url: str = typer.Option("", "--source-container-sas-url", help="Source blob container SAS URL."), + source_blob_folder: str = typer.Option("", "--source-blob-folder", help="Source blob storage folder prefix."), + target_container_sas_url: str = typer.Option("", "--target-container-sas-url", help="Target blob container SAS URL."), + target_blob_folder: str = typer.Option("", "--target-blob-folder", help="Target blob storage folder prefix."), ) -> None: """ Wrapper tool to convert an entire DI dataset to CU format """ assert DI_version in DI_VERSIONS, f"Please provide a valid DI version out of {DI_VERSIONS}." + assert source_container_sas_url != "" and target_container_sas_url != "", "Please provide a valid source and target blob container SAS URL." + assert source_blob_folder != "", "Please provide a valid source blob storage folder prefix to specify your DI dataset name." + assert target_blob_folder != "", "Please provide a valid target blob storage folder prefix to specify your CU dataset name." print(f"[yellow]You have specified the following DI version: {DI_version} out of {DI_VERSIONS}.If this is not expected, feel free to change this with the --DI-version parameter.\n[/yellow]") @@ -100,32 +105,16 @@ def main( # Getting the environmental variables load_dotenv() subscription_key = os.getenv("SUBSCRIPTION_KEY") - # for source - source_account_url = os.getenv("SOURCE_BLOB_ACCOUNT_URL") - source_blob_storage_sasToken = os.getenv("SOURCE_BLOB_STORAGE_SAS_TOKEN") - source_container_name = os.getenv("SOURCE_BLOB_CONTAINER_NAME") - source_folder_prefix = os.getenv("SOURCE_BLOB_FOLDER_PREFIX") - # for target - target_account_url = os.getenv("TARGET_BLOB_ACCOUNT_URL") - target_blob_storage_sasToken = os.getenv("TARGET_BLOB_STORAGE_SAS_TOKEN") - target_container_name = os.getenv("TARGET_BLOB_CONTAINER_NAME") - target_blob_name = os.getenv("TARGET_BLOB_FOLDER_PREFIX") - - assert target_blob_storage_sasToken != None and target_blob_storage_sasToken != "", "Please provide a valid target blob storage SAS token to be able to create an analyzer." print("Creating a temporary directory for storing source blob storage content...") temp_source_dir = Path(tempfile.mkdtemp()) temp_target_dir = Path(tempfile.mkdtemp()) # Configure access to source blob storage - if source_blob_storage_sasToken == None or source_blob_storage_sasToken == "": # using DefaultAzureCredential - default_credential = DefaultAzureCredential() - container_client = ContainerClient(source_account_url, source_container_name, credential=default_credential) - else: # using SAS token - container_client = ContainerClient(source_account_url, source_container_name, credential=source_blob_storage_sasToken) + container_client = ContainerClient.from_container_url(source_container_sas_url) - # List blobs under the "folder" in source - blob_list = container_client.list_blobs(name_starts_with=source_folder_prefix) + # List of blobs under the "folder" in source + blob_list = container_client.list_blobs(name_starts_with=source_blob_folder) for blob in blob_list: # each file is a blob that's being read into local directory print(f"Reading: {blob.name}") @@ -149,7 +138,7 @@ def main( # Confirming access to target blob storage here because doing so before can cause SAS token to expire # Additionally, best to confirm access to target blob storage before running any conversion - target_container_client = ContainerClient(target_account_url, target_container_name, credential=target_blob_storage_sasToken) + target_container_client = ContainerClient.from_container_url(target_container_sas_url) # First need to run field type conversion --> Then run DI to CU conversion # Creating a temporary directory to store field type converted dataset @@ -185,7 +174,7 @@ def main( if item.is_file(): # Only upload files # Create the blob path by preserving the relative path structure blobPath = str(item.relative_to(temp_target_dir)).replace('\\', '/') # Ensure path uses forward slashes - blob_path = target_blob_name + "/" + blobPath + blob_path = target_blob_folder + "/" + blobPath print(f"Uploading {item} to blob path {blob_path}...") # Create a BlobClient for the target blob @@ -197,16 +186,6 @@ def main( print("[green]Successfully uploaded all files to target blob storage.[/green]") - print("Creating analyzer...") - analyzer_id = submit_build_analyzer_put_request(analyzer_data, target_account_url, target_container_name, target_blob_name, target_blob_storage_sasToken, subscription_key) - - url = os.getenv("ANALYZE_PDF_URL") - if url == "": - print("Skipping analyze PDF step, because no URL was provided.") - else: - print("Callling Analyze on given PDF file...") - submit_post_analyzer_request(url, analyzer_id, subscription_key) - def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_version: str) -> list: """ Function to run the field type conversion @@ -295,138 +274,6 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str ocr_files.append(file_path) # Adding to list of files to run OCR on return analyzer_data, ocr_files -def submit_build_analyzer_put_request(analyzerData: dict, targetAccountUrl: str, targetContainerName: str, targetBlobName: str, targetBlobStorageSasToken: str, subscription_key: str) -> str: - """ - Initiates the creation of an analyzer with the given fieldSchema and training data. - Args: - analyzerData (dict): The data in the converted analyzer.json - targetAccountUrl (str): The URL of the target blob storage account. - targetContainerName (str): The name of the target blob storage container. - targetBlobName (str): The name of the target blob storage folder. - targetBlobStorageSasToken (str): The SAS token for the target blob storage account. - subscription_key (str): The subscription key that will be used within the API calls - Returns: - analyzerId (str): The ID of the created analyzer. - """ - # URI Parameters - analyzerId, endpoint, & api-version - analyzer_id = analyzerData["analyzerId"] - host = os.getenv("HOST") - api_version = os.getenv("API_VERSION") - endpoint = f"{host}/contentunderstanding/analyzers/{analyzer_id}?api-version={api_version}" - - # Request Header - Content-Type - # Acquire a token for the desired scope - credential = DefaultAzureCredential() - token = credential.get_token("https://cognitiveservices.azure.com/.default") - - # Extract the access token - access_token = token.token - headers = { - "Authorization": f"Bearer {access_token}", - "Ocp-Apim-Subscription-Key": f"{subscription_key}", - "Content-Type": "application/json" - } - - # Request Body - config, desciription, fieldSchema, scenario, tags, & trainingData - training_data_container_url = f"{targetAccountUrl}/{targetContainerName}?{targetBlobStorageSasToken}" - request_body = { - "baseAnalyzerId": analyzerData["baseAnalyzerId"], - "description": analyzerData["fieldSchema"]["description"], - "config": analyzerData["config"], - "fieldSchema": analyzerData["fieldSchema"], - "trainingData": { - "kind": "blob", - "containerUrl": training_data_container_url, - "prefix": targetBlobName - } - } - - response = requests.put( - url=endpoint, - headers=headers, - json=request_body, - ) - response.raise_for_status() - operation_location = response.headers.get("Operation-Location", None) - if not operation_location: - print("Error: 'Operation-Location' header is missing.") - - while True: - poll_response = requests.get(operation_location, headers=headers) - poll_response.raise_for_status() - - result = poll_response.json() - status = result.get("status", "").lower() - - if status == "succeeded": - print(f"\n[green]Successfully created analyzer with ID: {analyzer_id}[/green]") - break - elif status == "failed": - print(f"[red]Failed: {result}[/red]") - break - else: - print(".", end="", flush=True) - time.sleep(0.5) - - return analyzer_id - -def submit_post_analyzer_request(pdfURL: str, analyzerId: str , subscription_key: str) -> None: - """ - Call the Analyze API on the given PDF File - Args: - pdfURL (str): The URL of the PDF file to be analyzed. - analyzerId (str): The ID of the analyzer to be used for running Analyzer - subscription_key (str): The subscription key that will be used within the API calls - """ - # Request Header - Content-Type - # Acquire a token for the desired scope - credential = DefaultAzureCredential() - token = credential.get_token("https://cognitiveservices.azure.com/.default") - - # Extract the access token - access_token = token.token - headers = { - "Authorization": f"Bearer {access_token}", - "Ocp-Apim-Subscription-Key": f"{subscription_key}", - "Content-Type": "application/pdf" - } - - host = os.getenv("HOST") - api_version = os.getenv("API_VERSION") - endpoint = f"{host}/contentunderstanding/analyzers/{analyzerId}:analyze?api-version={api_version}" - - blob = BlobClient.from_blob_url(pdfURL) - blob_data = blob.download_blob().readall() - response = requests.post(url=endpoint, data=blob_data, headers=headers) - - response.raise_for_status() - print(f"[yellow]Analyzing file {pdfURL} with analyzer {analyzerId}.[/yellow]") - - operation_location = response.headers.get("Operation-Location", None) - if not operation_location: - print("Error: 'Operation-Location' header is missing.") - - while True: - poll_response = requests.get(operation_location, headers=headers) - poll_response.raise_for_status() - - result = poll_response.json() - status = result.get("status", "").lower() - - if status == "succeeded": - print(f"[green]Successfully analyzed file {pdfURL} with analyzer ID of {analyzerId}.[/green]") - analyze_result_file = os.getenv("ANALYZER_RESULT_OUTPUT_JSON") - with open(analyze_result_file, "w") as f: - json.dump(result, f, indent=4) - print(f"[green]Analyze result saved to {analyze_result_file}[/green]") - break - elif status == "failed": - print(f"[red]Failed: {result}[/red]") - break - else: - print(".", end="", flush=True) - time.sleep(0.5) - if __name__ == "__main__": app() diff --git a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json new file mode 100644 index 0000000..90f6230 --- /dev/null +++ b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json @@ -0,0 +1,9846 @@ +{ + "id": "385cc98a-8513-4f72-93ed-601f0f944682", + "status": "Succeeded", + "result": { + "analyzerId": "522-4", + "apiVersion": "2025-05-01-preview", + "createdAt": "2025-05-22T19:22:44Z", + "warnings": [], + "contents": [ + { + "markdown": "
\n\nDEA FORM-222\n\n
\n\n\n# U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II DRUG ENFORCEMENT ADMINISTRATION\n\nOMB APPROVAL No. 1117-0010\n\nPURCHASER INFORMATION\n\nINMAR RX SOLUTIONS, INC\n3845 GRAND LAKES WAY\nSUITE 125\nGRAND PRAIRIE, TX 75050-0000\n\nREGISTRATION INFORMATION\n\nREGISTRATION #, RR0191902\n\nREGISTERED AS: REVERSE DISTRIB\nSCHEDULES: 1,2,2N,3,3N,4,5,\nORDER FORM NUMBER. 231454769\n\nDATE ISSUED. 09262023\nORDER FORM 3 OF 3\n\nSUPPLIER DEA NUMBER:#\n\nFA5718830\n\nPART 2: TO BE FILLED IN BY PURCHASER\nCVS PHARMACY # 16800\n\nBUSINESS NAME\n\n4601 MONTGOMERY HWY STE 300\n\nSTREET ADDRESS\n\nDOTHAN, AL 36303\n\nCITY, STATE, ZIP CODE\n\nPART 1: TO BE FILLED IN BY PURCHASER\n\nDIANA RUIZ DEA CLERK\n\nPrint or Type Name and Title\n\nManuel\n\nby power of attorney\n10/23/2023\n\nSignature of Requesting Official (must be authorized to sign order form)\n\nDate\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PART 5: TO BE FILLED IN BY PURCHASERPART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill
ALTERNATE DEA #
Signature- by first supplier Lingua. Drier 10-26-23 DATE OFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ITEMNO OF PACKAGESPACKAGE SIZENAME OF ITEMNUMBER REC'DDATE REC'DPART4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODENUMBER SHIPPEDDATE SHIPPED
1120.000METHADONE HCL 10 MG TABLET TAB00054-0710-252010-30-21
2110.000DEXMETHYLPHENIDATE ER 25 MG CP00115-1709-01100.30-23
3190.000CONCERTA ER 27 MG TABLET TAB E50458-0588-01900-30-23
4140.000MYDAYIS ER 25 MG CAPSULE CPTP54092-0471-01400 30-23
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
4LAST LINE COMPLETED (MUST BE 20 OR LESS)
\n", + "fields": { + "supplier_dea_number": { + "type": "string", + "valueString": "FA5718830", + "spans": [ + { + "offset": 458, + "length": 9 + } + ], + "confidence": 0.925, + "source": "D(1,26.1302,3.1131,32.1504,3.0263,32.1504,3.9099,26.1612,4.0254)" + }, + "order_form_number": { + "type": "integer", + "valueInteger": 231454769, + "spans": [ + { + "offset": 383, + "length": 9 + } + ], + "confidence": 0.934, + "source": "D(1,14.8168,5.7632,16.4570,5.7236,16.4620,5.9833,14.8211,6.0277)" + }, + "print_or_type_name_and_title": { + "type": "string", + "valueString": "DIANA RUIZ DEA CLERK", + "spans": [ + { + "offset": 667, + "length": 20 + } + ], + "confidence": 0.729, + "source": "D(1,4.1952,8.7520,8.6268,8.7454,8.6273,9.0760,4.1957,9.0826)" + }, + "date": { + "type": "date", + "valueDate": "2023-10-23", + "spans": [ + { + "offset": 748, + "length": 10 + } + ], + "confidence": 0.77, + "source": "D(1,12.1968,9.5037,14.5898,9.4761,14.5898,9.7643,12.1980,9.8022)" + }, + "last_line_completed": { + "type": "string", + "valueString": "4:", + "spans": [ + { + "offset": 1416, + "length": 2 + } + ], + "confidence": 0.299, + "source": "D(1,21.1873,10.9801,21.4748,10.9744,21.4805,11.2211,21.1927,11.2300)" + }, + "ItemList": { + "type": "array", + "valueArray": [ + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1", + "spans": [ + { + "offset": 1805, + "length": 1 + } + ], + "confidence": 0.779, + "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.958 + }, + "DateReceived": { + "type": "string", + "confidence": 0.958 + }, + "NumberShipped": { + "type": "string", + "valueString": "20", + "spans": [ + { + "offset": 1753, + "length": 2 + } + ], + "confidence": 0.952, + "source": "D(1,29.2262,11.5767,30.0234,11.5536,30.0234,12.0171,29.2287,12.0318)" + }, + "DateShipped": { + "type": "string", + "valueString": "10-30-21", + "spans": [ + { + "offset": 1765, + "length": 8 + } + ], + "confidence": 0.982, + "source": "D(1,30.7881,11.6001,32.9062,11.5243,32.9062,11.9775,30.7961,12.0184)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.919 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1", + "spans": [ + { + "offset": 1805, + "length": 1 + } + ], + "confidence": 0.832, + "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.958 + }, + "DateReceived": { + "type": "string", + "confidence": 0.958 + }, + "NumberShipped": { + "type": "string", + "valueString": "10", + "spans": [ + { + "offset": 2015, + "length": 2 + } + ], + "confidence": 0.953, + "source": "D(1,29.3355,12.2962,29.9180,12.2871,29.9180,12.7030,29.3398,12.7266)" + }, + "DateShipped": { + "type": "string", + "valueString": "0.30-23", + "spans": [ + { + "offset": 2027, + "length": 7 + } + ], + "confidence": 0.937, + "source": "D(1,30.8197,12.2063,32.6205,12.1421,32.6250,12.6023,30.8267,12.6211)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.919 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1", + "spans": [ + { + "offset": 2066, + "length": 1 + } + ], + "confidence": 0.778, + "source": "D(1,2.8774,13.3745,3.0937,13.3699,3.0937,13.6249,2.8784,13.6299)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.958 + }, + "DateReceived": { + "type": "string", + "confidence": 0.958 + }, + "NumberShipped": { + "type": "string", + "valueString": "90", + "spans": [ + { + "offset": 2276, + "length": 2 + } + ], + "confidence": 0.942, + "source": "D(1,29.3457,12.8264,30.0762,12.8087,30.0762,13.2387,29.3490,13.2539)" + }, + "DateShipped": { + "type": "string", + "valueString": "0-30-23", + "spans": [ + { + "offset": 2288, + "length": 7 + } + ], + "confidence": 0.95, + "source": "D(1,30.8413,12.8227,32.7656,12.7573,32.7656,13.2025,30.8487,13.2304)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.919 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1", + "spans": [ + { + "offset": 2327, + "length": 1 + } + ], + "confidence": 0.724, + "source": "D(1,2.8882,13.9822,3.0937,13.9722,3.0937,14.2450,2.8891,14.2527)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.958 + }, + "DateReceived": { + "type": "string", + "confidence": 0.958 + }, + "NumberShipped": { + "type": "string", + "valueString": "40.000", + "spans": [ + { + "offset": 2338, + "length": 6 + } + ], + "confidence": 0.548, + "source": "D(1,4.6643,13.9401,6.0820,13.9293,6.0820,14.1896,4.6656,14.2031)" + }, + "DateShipped": { + "type": "string", + "valueString": "0-30-23", + "spans": [ + { + "offset": 2288, + "length": 7 + } + ], + "confidence": 0.95, + "source": "D(1,30.8383,12.8041,32.7656,12.7573,32.7764,13.2022,30.8492,13.2490)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.919 + } + } + } + ] + }, + "FullFormNumber": { + "type": "string", + "confidence": 0.887 + }, + "FirstPackageNumber": { + "type": "string", + "confidence": 0.887 + } + }, + "kind": "document", + "startPageNumber": 1, + "endPageNumber": 1, + "unit": "inch", + "pages": [ + { + "pageNumber": 1, + "angle": -0.9532, + "width": 36, + "height": 27, + "spans": [ + { + "offset": 0, + "length": 5956 + } + ], + "words": [ + { + "content": "DEA", + "span": { + "offset": 10, + "length": 3 + }, + "confidence": 0.994, + "source": "D(1,1.2601,1.4768,2.0074,1.4489,2.0164,1.7351,1.2699,1.7627)" + }, + { + "content": "FORM-222", + "span": { + "offset": 14, + "length": 8 + }, + "confidence": 0.989, + "source": "D(1,2.1141,1.4449,3.8964,1.3773,3.9023,1.6574,2.1232,1.7301)" + }, + { + "content": "U.S.", + "span": { + "offset": 38, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,12.2921,0.875,12.9654,0.8424,12.9739,1.1427,12.3006,1.1727)" + }, + { + "content": "OFFICIAL", + "span": { + "offset": 43, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,13.0981,0.8373,14.8046,0.7838,14.8127,1.0841,13.1066,1.1375)" + }, + { + "content": "ORDER", + "span": { + "offset": 52, + "length": 5 + }, + "confidence": 0.994, + "source": "D(1,14.898,0.7815,16.231,0.7482,16.2387,1.0509,14.9061,1.0821)" + }, + { + "content": "FORMS", + "span": { + "offset": 58, + "length": 5 + }, + "confidence": 0.996, + "source": "D(1,16.3539,0.7442,17.677,0.712,17.6843,1.013,16.3616,1.0468)" + }, + { + "content": "-", + "span": { + "offset": 64, + "length": 1 + }, + "confidence": 0.913, + "source": "D(1,17.7902,0.7101,17.9279,0.7077,17.9351,1.0087,17.7974,1.011)" + }, + { + "content": "SCHEDULES", + "span": { + "offset": 66, + "length": 9 + }, + "confidence": 0.993, + "source": "D(1,18.0214,0.706,20.2892,0.6668,20.2968,0.9651,18.0286,1.0071)" + }, + { + "content": "I", + "span": { + "offset": 76, + "length": 1 + }, + "confidence": 0.109, + "source": "D(1,20.4073,0.6651,20.5008,0.6638,20.5086,0.9624,20.415,0.9636)" + }, + { + "content": "&", + "span": { + "offset": 78, + "length": 1 + }, + "confidence": 0.988, + "source": "D(1,20.6238,0.6625,20.8698,0.6603,20.8775,0.9578,20.6316,0.9608)" + }, + { + "content": "II", + "span": { + "offset": 80, + "length": 2 + }, + "confidence": 0.212, + "source": "D(1,20.983,0.6593,21.1816,0.6574,21.1816,0.954,20.9906,0.9564)" + }, + { + "content": "DRUG", + "span": { + "offset": 83, + "length": 4 + }, + "confidence": 0.986, + "source": "D(1,13.4708,1.2365,14.4112,1.2046,14.4186,1.4787,13.4789,1.51)" + }, + { + "content": "ENFORCEMENT", + "span": { + "offset": 88, + "length": 11 + }, + "confidence": 0.993, + "source": "D(1,14.5238,1.2021,17.0668,1.1345,17.0721,1.409,14.5309,1.4754)" + }, + { + "content": "ADMINISTRATION", + "span": { + "offset": 100, + "length": 14 + }, + "confidence": 0.993, + "source": "D(1,17.1433,1.1324,20.0391,1.0714,20.0391,1.3477,17.1486,1.4066)" + }, + { + "content": "OMB", + "span": { + "offset": 116, + "length": 3 + }, + "confidence": 0.997, + "source": "D(1,27.5155,0.5202,28.2442,0.5076,28.246,0.7673,27.5182,0.7794)" + }, + { + "content": "APPROVAL", + "span": { + "offset": 120, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,28.33,0.5062,30.0877,0.496,30.0895,0.7579,28.3317,0.7661)" + }, + { + "content": "No.", + "span": { + "offset": 129, + "length": 3 + }, + "confidence": 0.992, + "source": "D(1,30.1863,0.4951,30.6879,0.4947,30.6896,0.7567,30.188,0.7565)" + }, + { + "content": "1117-0010", + "span": { + "offset": 133, + "length": 9 + }, + "confidence": 0.994, + "source": "D(1,30.7865,0.4946,32.3086,0.4851,32.3086,0.7462,30.7883,0.7565)" + }, + { + "content": "PURCHASER", + "span": { + "offset": 144, + "length": 9 + }, + "confidence": 0.996, + "source": "D(1,1.544,3.6892,3.5436,3.6155,3.5469,3.8829,1.5503,3.961)" + }, + { + "content": "INFORMATION", + "span": { + "offset": 154, + "length": 11 + }, + "confidence": 0.993, + "source": "D(1,3.6405,3.6113,5.959,3.5411,5.959,3.811,3.6438,3.8792)" + }, + { + "content": "INMAR", + "span": { + "offset": 167, + "length": 5 + }, + "confidence": 0.992, + "source": "D(1,1.5373,4.4197,2.5254,4.3841,2.53,4.6487,1.5438,4.6851)" + }, + { + "content": "RX", + "span": { + "offset": 173, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,2.6355,4.3782,3.0545,4.3602,3.0588,4.6284,2.6399,4.6435)" + }, + { + "content": "SOLUTIONS,", + "span": { + "offset": 176, + "length": 10 + }, + "confidence": 0.914, + "source": "D(1,3.1515,4.3567,5.1506,4.3128,5.1526,4.5855,3.1558,4.6248)" + }, + { + "content": "INC", + "span": { + "offset": 187, + "length": 3 + }, + "confidence": 0.98, + "source": "D(1,5.2654,4.3114,5.8359,4.3022,5.8359,4.5745,5.2673,4.584)" + }, + { + "content": "3845", + "span": { + "offset": 191, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,1.5215,4.7671,2.2048,4.7445,2.2105,5.0158,1.5257,5.0413)" + }, + { + "content": "GRAND", + "span": { + "offset": 196, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,2.3069,4.7417,3.425,4.7063,3.4283,4.9762,2.3124,5.0116)" + }, + { + "content": "LAKES", + "span": { + "offset": 202, + "length": 5 + }, + "confidence": 0.993, + "source": "D(1,3.5404,4.7037,4.6235,4.6853,4.625,4.9569,3.5435,4.9738)" + }, + { + "content": "WAY", + "span": { + "offset": 208, + "length": 3 + }, + "confidence": 0.999, + "source": "D(1,4.7167,4.6851,5.4844,4.6791,5.4844,4.9471,4.7182,4.9559)" + }, + { + "content": "SUITE", + "span": { + "offset": 212, + "length": 5 + }, + "confidence": 0.994, + "source": "D(1,1.5066,5.1386,2.4023,5.0975,2.4088,5.3597,1.514,5.4019)" + }, + { + "content": "125", + "span": { + "offset": 218, + "length": 3 + }, + "confidence": 0.999, + "source": "D(1,2.5223,5.0921,3.041,5.0704,3.041,5.3308,2.5289,5.3532)" + }, + { + "content": "GRAND", + "span": { + "offset": 222, + "length": 5 + }, + "confidence": 0.996, + "source": "D(1,1.4852,5.4785,2.6085,5.4585,2.61,5.7306,1.4908,5.7458)" + }, + { + "content": "PRAIRIE,", + "span": { + "offset": 228, + "length": 8 + }, + "confidence": 0.988, + "source": "D(1,2.7074,5.4567,4.159,5.4433,4.1606,5.7212,2.7087,5.7304)" + }, + { + "content": "TX", + "span": { + "offset": 237, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,4.2488,5.4424,4.6938,5.4405,4.6957,5.7166,4.2505,5.72)" + }, + { + "content": "75050-0000", + "span": { + "offset": 240, + "length": 10 + }, + "confidence": 0.994, + "source": "D(1,4.7792,5.4404,6.5543,5.4249,6.5565,5.6969,4.7811,5.7159)" + }, + { + "content": "REGISTRATION", + "span": { + "offset": 252, + "length": 12 + }, + "confidence": 0.996, + "source": "D(1,10.8055,3.4881,13.2127,3.4254,13.2163,3.679,10.8083,3.7441)" + }, + { + "content": "INFORMATION", + "span": { + "offset": 265, + "length": 11 + }, + "confidence": 0.99, + "source": "D(1,13.379,3.422,15.6973,3.3675,15.6973,3.6162,13.3826,3.6754)" + }, + { + "content": "REGISTRATION", + "span": { + "offset": 278, + "length": 12 + }, + "confidence": 0.992, + "source": "D(1,10.8301,4.4091,13.2832,4.3517,13.2882,4.6207,10.8325,4.6758)" + }, + { + "content": "#,", + "span": { + "offset": 291, + "length": 2 + }, + "confidence": 0.641, + "source": "D(1,13.3754,4.3492,13.6343,4.3431,13.6395,4.613,13.3803,4.6187)" + }, + { + "content": "RR0191902", + "span": { + "offset": 294, + "length": 9 + }, + "confidence": 0.992, + "source": "D(1,13.7484,4.3407,15.5171,4.3069,15.5215,4.5711,13.7537,4.6105)" + }, + { + "content": "REGISTERED", + "span": { + "offset": 305, + "length": 10 + }, + "confidence": 0.992, + "source": "D(1,10.8477,4.8828,12.9691,4.837,12.9735,5.1044,10.8493,5.1555)" + }, + { + "content": "AS:", + "span": { + "offset": 316, + "length": 3 + }, + "confidence": 0.993, + "source": "D(1,13.0532,4.8344,13.5846,4.8198,13.5895,5.09,13.0577,5.1023)" + }, + { + "content": "REVERSE", + "span": { + "offset": 320, + "length": 7 + }, + "confidence": 0.995, + "source": "D(1,13.6909,4.8172,15.2498,4.7806,15.2547,5.0513,13.6958,5.0877)" + }, + { + "content": "DISTRIB", + "span": { + "offset": 328, + "length": 7 + }, + "confidence": 0.992, + "source": "D(1,15.3517,4.778,16.6581,4.7462,16.6641,5.0141,15.3565,5.0482)" + }, + { + "content": "SCHEDULES:", + "span": { + "offset": 336, + "length": 10 + }, + "confidence": 0.992, + "source": "D(1,10.8738,5.3547,12.9529,5.3151,12.9576,5.5866,10.8769,5.625)" + }, + { + "content": "1,2,2N,3,3N,4,5,", + "span": { + "offset": 347, + "length": 16 + }, + "confidence": 0.647, + "source": "D(1,13.0689,5.3129,15.4246,5.2684,15.4303,5.5397,13.0737,5.5847)" + }, + { + "content": "ORDER", + "span": { + "offset": 364, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,10.8803,5.8462,12.0544,5.8239,12.0577,6.0862,10.8831,6.1101)" + }, + { + "content": "FORM", + "span": { + "offset": 370, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,12.1666,5.8218,13.1076,5.7999,13.111,6.064,12.17,6.0841)" + }, + { + "content": "NUMBER.", + "span": { + "offset": 375, + "length": 7 + }, + "confidence": 0.807, + "source": "D(1,13.2068,5.7975,14.7046,5.7655,14.7089,6.0307,13.2103,6.0617)" + }, + { + "content": "231454769", + "span": { + "offset": 383, + "length": 9 + }, + "confidence": 0.994, + "source": "D(1,14.8168,5.7632,16.457,5.7236,16.462,5.9833,14.8211,6.0277)" + }, + { + "content": "DATE", + "span": { + "offset": 394, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,10.9031,6.3305,11.7615,6.3158,11.7629,6.5948,10.9041,6.6093)" + }, + { + "content": "ISSUED.", + "span": { + "offset": 399, + "length": 7 + }, + "confidence": 0.992, + "source": "D(1,11.8699,6.3133,13.1619,6.2891,13.1651,6.5657,11.8714,6.5915)" + }, + { + "content": "09262023", + "span": { + "offset": 407, + "length": 8 + }, + "confidence": 0.996, + "source": "D(1,13.2568,6.2878,14.7129,6.2648,14.7129,6.5355,13.2602,6.5644)" + }, + { + "content": "ORDER", + "span": { + "offset": 416, + "length": 5 + }, + "confidence": 0.998, + "source": "D(1,10.9172,6.8043,12.0865,6.7865,12.0876,7.0473,10.9184,7.0664)" + }, + { + "content": "FORM", + "span": { + "offset": 422, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,12.1882,6.785,13.1415,6.77,13.1432,7.0258,12.1894,7.0452)" + }, + { + "content": "3", + "span": { + "offset": 427, + "length": 1 + }, + "confidence": 0.997, + "source": "D(1,13.2347,6.7697,13.4126,6.7673,13.4146,7.0215,13.2364,7.0243)" + }, + { + "content": "OF", + "span": { + "offset": 429, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,13.5101,6.7656,13.9507,6.7589,13.9531,7.0128,13.5123,7.02)" + }, + { + "content": "3", + "span": { + "offset": 432, + "length": 1 + }, + "confidence": 0.997, + "source": "D(1,14.0524,6.757,14.2558,6.752,14.2559,7.0055,14.0551,7.0106)" + }, + { + "content": "SUPPLIER", + "span": { + "offset": 435, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,20.2403,3.3699,21.6377,3.3639,21.6387,3.59,20.2413,3.5962)" + }, + { + "content": "DEA", + "span": { + "offset": 444, + "length": 3 + }, + "confidence": 0.989, + "source": "D(1,21.7338,3.3637,22.3179,3.359,22.3192,3.5855,21.7349,3.5896)" + }, + { + "content": "NUMBER:#", + "span": { + "offset": 448, + "length": 8 + }, + "confidence": 0.893, + "source": "D(1,22.4029,3.359,23.9223,3.347,23.9238,3.5735,22.4042,3.5853)" + }, + { + "content": "FA5718830", + "span": { + "offset": 458, + "length": 9 + }, + "confidence": 0.995, + "source": "D(1,26.1302,3.1131,32.1504,3.0263,32.1504,3.9099,26.1612,4.0254)" + }, + { + "content": "PART", + "span": { + "offset": 469, + "length": 4 + }, + "confidence": 0.936, + "source": "D(1,20.2732,4.3981,21.081,4.3873,21.0839,4.6333,20.2757,4.653)" + }, + { + "content": "2:", + "span": { + "offset": 474, + "length": 2 + }, + "confidence": 0.977, + "source": "D(1,21.2375,4.3839,21.4913,4.3791,21.4948,4.6293,21.2403,4.6293)" + }, + { + "content": "TO", + "span": { + "offset": 477, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,21.6731,4.3757,22.1257,4.3698,22.1307,4.6268,21.6772,4.6294)" + }, + { + "content": "BE", + "span": { + "offset": 480, + "length": 2 + }, + "confidence": 0.996, + "source": "D(1,22.2357,4.3684,22.6585,4.3554,22.6644,4.6163,22.2409,4.626)" + }, + { + "content": "FILLED", + "span": { + "offset": 483, + "length": 6 + }, + "confidence": 0.995, + "source": "D(1,22.7727,4.3522,23.8975,4.3216,23.9058,4.5854,22.7788,4.6138)" + }, + { + "content": "IN", + "span": { + "offset": 490, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,24.0159,4.3189,24.3203,4.3117,24.3292,4.5737,24.0245,4.5822)" + }, + { + "content": "BY", + "span": { + "offset": 493, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,24.4388,4.3087,24.8869,4.2935,24.8954,4.5547,24.4474,4.5703)" + }, + { + "content": "PURCHASER", + "span": { + "offset": 496, + "length": 9 + }, + "confidence": 0.992, + "source": "D(1,24.9883,4.2892,27.1059,4.2053,27.1166,4.4669,24.9969,4.5505)" + }, + { + "content": "CVS", + "span": { + "offset": 506, + "length": 3 + }, + "confidence": 0.993, + "source": "D(1,20.4678,4.6389,21.3708,4.6203,21.3757,4.9447,20.4757,4.9655)" + }, + { + "content": "PHARMACY", + "span": { + "offset": 510, + "length": 8 + }, + "confidence": 0.988, + "source": "D(1,21.5204,4.6201,24.112,4.5785,24.1214,4.9056,21.5256,4.945)" + }, + { + "content": "#", + "span": { + "offset": 519, + "length": 1 + }, + "confidence": 0.996, + "source": "D(1,24.2883,4.5757,24.5074,4.5723,24.5183,4.8977,24.2984,4.902)" + }, + { + "content": "16800", + "span": { + "offset": 521, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,24.7691,4.5643,26.1738,4.5178,26.1738,4.8401,24.7803,4.8898)" + }, + { + "content": "BUSINESS", + "span": { + "offset": 528, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,20.2808,5.1553,21.7033,5.1513,21.7051,5.3744,20.2826,5.3789)" + }, + { + "content": "NAME", + "span": { + "offset": 537, + "length": 4 + }, + "confidence": 0.994, + "source": "D(1,21.8021,5.1509,22.6055,5.1466,22.6055,5.3699,21.8041,5.3739)" + }, + { + "content": "4601", + "span": { + "offset": 543, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,20.4816,5.4477,21.5112,5.424,21.517,5.7349,20.488,5.748)" + }, + { + "content": "MONTGOMERY", + "span": { + "offset": 548, + "length": 10 + }, + "confidence": 0.993, + "source": "D(1,21.7311,5.4191,25.2048,5.3007,25.2151,5.6373,21.7372,5.7315)" + }, + { + "content": "HWY", + "span": { + "offset": 559, + "length": 3 + }, + "confidence": 0.995, + "source": "D(1,25.3603,5.295,26.4857,5.2477,26.4959,5.5879,25.3706,5.6314)" + }, + { + "content": "STE", + "span": { + "offset": 563, + "length": 3 + }, + "confidence": 0.998, + "source": "D(1,26.6143,5.2418,27.5522,5.2046,27.5627,5.5443,26.6244,5.5819)" + }, + { + "content": "300", + "span": { + "offset": 567, + "length": 3 + }, + "confidence": 0.997, + "source": "D(1,27.7023,5.1995,28.5653,5.1689,28.5759,5.5121,27.7128,5.5396)" + }, + { + "content": "STREET", + "span": { + "offset": 572, + "length": 6 + }, + "confidence": 0.995, + "source": "D(1,20.3042,5.9972,21.4081,5.9822,21.4097,6.2024,20.306,6.2188)" + }, + { + "content": "ADDRESS", + "span": { + "offset": 579, + "length": 7 + }, + "confidence": 0.984, + "source": "D(1,21.488,5.9824,22.8516,5.965,22.8516,6.187,21.4897,6.2031)" + }, + { + "content": "DOTHAN,", + "span": { + "offset": 588, + "length": 7 + }, + "confidence": 0.754, + "source": "D(1,20.4856,6.2245,22.5466,6.1827,22.5543,6.5139,20.494,6.5391)" + }, + { + "content": "AL", + "span": { + "offset": 596, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,22.6919,6.1783,23.3323,6.1673,23.341,6.4972,22.6998,6.5128)" + }, + { + "content": "36303", + "span": { + "offset": 599, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,23.4507,6.1652,24.9189,6.1077,24.9258,6.4455,23.4597,6.4937)" + }, + { + "content": "CITY,", + "span": { + "offset": 606, + "length": 5 + }, + "confidence": 0.992, + "source": "D(1,20.3248,6.8091,21.0261,6.8015,21.0282,7.0505,20.3274,7.0591)" + }, + { + "content": "STATE,", + "span": { + "offset": 612, + "length": 6 + }, + "confidence": 0.994, + "source": "D(1,21.1112,6.7999,22.0921,6.7862,22.0973,7.0343,21.1136,7.0493)" + }, + { + "content": "ZIP", + "span": { + "offset": 619, + "length": 3 + }, + "confidence": 0.997, + "source": "D(1,22.1691,6.7854,22.619,6.7781,22.6255,7.0237,22.1744,7.0332)" + }, + { + "content": "CODE", + "span": { + "offset": 623, + "length": 4 + }, + "confidence": 0.986, + "source": "D(1,22.7041,6.7768,23.551,6.7563,23.5547,6.9997,22.7106,7.0218)" + }, + { + "content": "PART", + "span": { + "offset": 629, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,1.3237,8.0784,2.2418,8.0751,2.2438,8.3447,1.3268,8.3491)" + }, + { + "content": "1:", + "span": { + "offset": 634, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,2.3443,8.0751,2.6295,8.0727,2.6312,8.3412,2.3463,8.3442)" + }, + { + "content": "TO", + "span": { + "offset": 637, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,2.7276,8.0719,3.2089,8.069,3.2104,8.3383,2.7292,8.3401)" + }, + { + "content": "BE", + "span": { + "offset": 640, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,3.3158,8.0684,3.7749,8.0635,3.7763,8.3362,3.3173,8.3381)" + }, + { + "content": "FILLED", + "span": { + "offset": 643, + "length": 6 + }, + "confidence": 0.995, + "source": "D(1,3.8907,8.0622,5.0538,8.0488,5.0559,8.3259,3.8922,8.3354)" + }, + { + "content": "IN", + "span": { + "offset": 650, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,5.1563,8.0478,5.4727,8.0447,5.4753,8.3211,5.1586,8.3249)" + }, + { + "content": "BY", + "span": { + "offset": 653, + "length": 2 + }, + "confidence": 0.977, + "source": "D(1,5.5842,8.0436,6.0432,8.0406,6.046,8.3147,5.5867,8.3195)" + }, + { + "content": "PURCHASER", + "span": { + "offset": 656, + "length": 9 + }, + "confidence": 0.995, + "source": "D(1,6.2304,8.0398,8.2936,8.007,8.2969,8.2748,6.2333,8.3134)" + }, + { + "content": "DIANA", + "span": { + "offset": 667, + "length": 5 + }, + "confidence": 0.846, + "source": "D(1,4.1952,8.7544,5.2813,8.7523,5.2816,9.0782,4.1957,9.0826)" + }, + { + "content": "RUIZ", + "span": { + "offset": 673, + "length": 4 + }, + "confidence": 0.651, + "source": "D(1,5.3937,8.7523,6.3353,8.7498,6.3367,9.0776,5.394,9.0779)" + }, + { + "content": "DEA", + "span": { + "offset": 678, + "length": 3 + }, + "confidence": 0.992, + "source": "D(1,6.5119,8.7501,7.2074,8.7515,7.2087,9.0758,6.5133,9.0771)" + }, + { + "content": "CLERK", + "span": { + "offset": 682, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,7.3412,8.751,8.6252,8.7454,8.6273,9.0699,7.3425,9.0745)" + }, + { + "content": "Print", + "span": { + "offset": 689, + "length": 5 + }, + "confidence": 0.893, + "source": "D(1,1.3338,9.4476,1.928,9.4564,1.9288,9.7002,1.334,9.7124)" + }, + { + "content": "or", + "span": { + "offset": 695, + "length": 2 + }, + "confidence": 0.963, + "source": "D(1,2.0123,9.4573,2.2905,9.4572,2.2916,9.6963,2.0132,9.698)" + }, + { + "content": "Type", + "span": { + "offset": 698, + "length": 4 + }, + "confidence": 0.977, + "source": "D(1,2.3959,9.4564,3.0239,9.4483,3.0252,9.7067,2.3971,9.6975)" + }, + { + "content": "Name", + "span": { + "offset": 703, + "length": 4 + }, + "confidence": 0.987, + "source": "D(1,3.1124,9.4465,3.8585,9.439,3.8598,9.7055,3.1137,9.7069)" + }, + { + "content": "and", + "span": { + "offset": 708, + "length": 3 + }, + "confidence": 0.977, + "source": "D(1,3.9807,9.4381,4.457,9.4382,4.4587,9.6972,3.982,9.7039)" + }, + { + "content": "Title", + "span": { + "offset": 712, + "length": 5 + }, + "confidence": 0.647, + "source": "D(1,4.5244,9.4379,5.1103,9.429,5.1116,9.6926,4.5262,9.6961)" + }, + { + "content": "Manuel", + "span": { + "offset": 719, + "length": 6 + }, + "confidence": 0.187, + "source": "D(1,1.636,9.5464,5.2207,9.5363,5.2207,10.3887,1.638,10.3887)" + }, + { + "content": "by", + "span": { + "offset": 727, + "length": 2 + }, + "confidence": 0.989, + "source": "D(1,5.5497,9.6568,6.063,9.6522,6.0637,9.9517,5.5498,9.955)" + }, + { + "content": "power", + "span": { + "offset": 730, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,6.283,9.6493,7.5195,9.6219,7.5202,9.921,6.2839,9.9489)" + }, + { + "content": "of", + "span": { + "offset": 736, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,7.7786,9.619,8.2331,9.6136,8.2346,9.9106,7.7793,9.9165)" + }, + { + "content": "attorney", + "span": { + "offset": 739, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,8.5166,9.6084,10.4572,9.5868,10.4576,9.8824,8.5183,9.9064)" + }, + { + "content": "10/23/2023", + "span": { + "offset": 748, + "length": 10 + }, + "confidence": 0.994, + "source": "D(1,12.1968,9.5037,14.5898,9.4761,14.5898,9.7643,12.198,9.8022)" + }, + { + "content": "Signature", + "span": { + "offset": 760, + "length": 9 + }, + "confidence": 0.992, + "source": "D(1,1.3368,10.4179,2.6234,10.4148,2.6247,10.681,1.3388,10.6875)" + }, + { + "content": "of", + "span": { + "offset": 770, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,2.7112,10.4136,2.9614,10.4094,2.9626,10.676,2.7124,10.6799)" + }, + { + "content": "Requesting", + "span": { + "offset": 773, + "length": 10 + }, + "confidence": 0.963, + "source": "D(1,3.0448,10.408,4.5113,10.388,4.5128,10.6632,3.046,10.6747)" + }, + { + "content": "Official", + "span": { + "offset": 784, + "length": 8 + }, + "confidence": 0.986, + "source": "D(1,4.6079,10.3865,5.486,10.3742,5.4876,10.6468,4.6094,10.662)" + }, + { + "content": "(must", + "span": { + "offset": 793, + "length": 5 + }, + "confidence": 0.992, + "source": "D(1,5.5825,10.3732,6.307,10.3638,6.3095,10.6323,5.5842,10.6448)" + }, + { + "content": "be", + "span": { + "offset": 799, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,6.3904,10.3625,6.7065,10.3581,6.7095,10.6266,6.393,10.6311)" + }, + { + "content": "authorized", + "span": { + "offset": 802, + "length": 10 + }, + "confidence": 0.585, + "source": "D(1,6.7812,10.3572,8.1335,10.3414,8.1365,10.6051,6.7841,10.6255)" + }, + { + "content": "to", + "span": { + "offset": 813, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,8.2125,10.3402,8.454,10.3368,8.457,10.5988,8.2155,10.6036)" + }, + { + "content": "sign", + "span": { + "offset": 816, + "length": 4 + }, + "confidence": 0.977, + "source": "D(1,8.5286,10.3358,9.0511,10.3277,9.055,10.5903,8.5317,10.5974)" + }, + { + "content": "order", + "span": { + "offset": 821, + "length": 5 + }, + "confidence": 0.994, + "source": "D(1,9.1257,10.3265,9.8017,10.3095,9.8068,10.5747,9.1298,10.5893)" + }, + { + "content": "form)", + "span": { + "offset": 827, + "length": 5 + }, + "confidence": 0.896, + "source": "D(1,9.8675,10.3078,10.5568,10.2959,10.5623,10.557,9.8727,10.5732)" + }, + { + "content": "Date", + "span": { + "offset": 834, + "length": 4 + }, + "confidence": 0.987, + "source": "D(1,12.017,10.253,12.6211,10.2537,12.6211,10.4679,12.0178,10.4744)" + }, + { + "content": "PART", + "span": { + "offset": 870, + "length": 4 + }, + "confidence": 0.989, + "source": "D(1,17.9931,8.2538,18.8759,8.2485,18.8775,8.5052,17.995,8.514)" + }, + { + "content": "5:", + "span": { + "offset": 875, + "length": 2 + }, + "confidence": 0.991, + "source": "D(1,18.9858,8.2468,19.2603,8.2431,19.262,8.5045,18.9875,8.5042)" + }, + { + "content": "TO", + "span": { + "offset": 878, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,18.1325,8.6296,18.5801,8.6281,18.5822,8.8794,18.1346,8.8809)" + }, + { + "content": "BE", + "span": { + "offset": 881, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,18.6828,8.6276,19.1344,8.6213,19.1369,8.8721,18.685,8.8776)" + }, + { + "content": "FILLED", + "span": { + "offset": 884, + "length": 6 + }, + "confidence": 0.998, + "source": "D(1,17.6066,9.0148,18.7163,9.0064,18.718,9.2554,17.6079,9.2683)" + }, + { + "content": "IN", + "span": { + "offset": 891, + "length": 2 + }, + "confidence": 0.99, + "source": "D(1,18.8232,9.0042,19.1396,9.0012,19.1417,9.2513,18.8248,9.2537)" + }, + { + "content": "BY", + "span": { + "offset": 894, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,19.2547,8.9996,19.6945,8.9957,19.697,9.2436,19.2568,9.2501)" + }, + { + "content": "PURCHASER", + "span": { + "offset": 897, + "length": 9 + }, + "confidence": 0.997, + "source": "D(1,17.6289,9.394,19.6858,9.3763,19.6875,9.6242,17.6307,9.6488)" + }, + { + "content": "PART", + "span": { + "offset": 916, + "length": 4 + }, + "confidence": 0.993, + "source": "D(1,20.3495,7.7488,21.1945,7.7282,21.1977,7.9924,20.3507,8.0078)" + }, + { + "content": "3:", + "span": { + "offset": 921, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,21.2903,7.7252,21.5516,7.7171,21.5551,7.9824,21.2936,7.9898)" + }, + { + "content": "ALTERNATE", + "span": { + "offset": 924, + "length": 9 + }, + "confidence": 0.993, + "source": "D(1,21.643,7.7142,23.6333,7.6558,23.6404,7.9261,21.6466,7.9799)" + }, + { + "content": "SUPPLIER", + "span": { + "offset": 934, + "length": 8 + }, + "confidence": 0.993, + "source": "D(1,23.7465,7.6521,25.4102,7.6011,25.4164,7.8677,23.7536,7.9224)" + }, + { + "content": "IDENTIFICATION", + "span": { + "offset": 943, + "length": 14 + }, + "confidence": 0.828, + "source": "D(1,25.5147,7.5978,28.1758,7.5238,28.1808,7.7888,25.5209,7.865)" + }, + { + "content": "-", + "span": { + "offset": 958, + "length": 1 + }, + "confidence": 0.674, + "source": "D(1,28.2759,7.5214,28.3761,7.5191,28.3809,7.7845,28.2808,7.7866)" + }, + { + "content": "to", + "span": { + "offset": 960, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,28.4589,7.5172,28.7028,7.5116,28.7071,7.7775,28.4635,7.7827)" + }, + { + "content": "be", + "span": { + "offset": 963, + "length": 2 + }, + "confidence": 0.996, + "source": "D(1,28.7899,7.5095,29.1035,7.5008,29.1074,7.7658,28.7941,7.7754)" + }, + { + "content": "filled", + "span": { + "offset": 966, + "length": 6 + }, + "confidence": 0.993, + "source": "D(1,29.1906,7.4984,29.7873,7.4825,29.7907,7.7467,29.1944,7.7632)" + }, + { + "content": "in", + "span": { + "offset": 973, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,29.8744,7.4804,30.0922,7.475,30.0956,7.7403,29.8778,7.7449)" + }, + { + "content": "by", + "span": { + "offset": 976, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,30.1837,7.4728,30.4842,7.4657,30.4876,7.732,30.187,7.7384)" + }, + { + "content": "first", + "span": { + "offset": 979, + "length": 5 + }, + "confidence": 0.992, + "source": "D(1,30.5627,7.4644,31.0375,7.4564,31.0414,7.7205,30.5661,7.7304)" + }, + { + "content": "supplier", + "span": { + "offset": 985, + "length": 8 + }, + "confidence": 0.615, + "source": "D(1,31.1159,7.4551,32.1267,7.4423,32.132,7.6989,31.1199,7.7189)" + }, + { + "content": "(name", + "span": { + "offset": 994, + "length": 5 + }, + "confidence": 0.891, + "source": "D(1,20.347,8.1334,21.1162,8.1151,21.1227,8.3525,20.3531,8.3672)" + }, + { + "content": "in", + "span": { + "offset": 1000, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,21.1911,8.1131,21.412,8.1071,21.4189,8.3456,21.1977,8.3508)" + }, + { + "content": "part", + "span": { + "offset": 1003, + "length": 4 + }, + "confidence": 0.989, + "source": "D(1,21.4948,8.1047,21.968,8.0898,21.9749,8.3314,21.5018,8.3436)" + }, + { + "content": "2)", + "span": { + "offset": 1008, + "length": 2 + }, + "confidence": 0.991, + "source": "D(1,22.0469,8.0872,22.315,8.0782,22.322,8.3197,22.0538,8.329)" + }, + { + "content": "if", + "span": { + "offset": 1011, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,22.3978,8.0754,22.5477,8.0703,22.5547,8.3117,22.4048,8.3169)" + }, + { + "content": "order", + "span": { + "offset": 1014, + "length": 5 + }, + "confidence": 0.995, + "source": "D(1,22.6108,8.0681,23.285,8.044,23.293,8.2868,22.6179,8.3096)" + }, + { + "content": "is", + "span": { + "offset": 1020, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,23.3678,8.0407,23.5767,8.0325,23.5849,8.2756,23.3759,8.2836)" + }, + { + "content": "endorsed", + "span": { + "offset": 1023, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,23.6635,8.0291,24.87,7.9866,24.8779,8.2286,23.6717,8.2723)" + }, + { + "content": "to", + "span": { + "offset": 1032, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,24.9686,7.9829,25.217,7.9736,25.2249,8.2167,24.9765,8.2252)" + }, + { + "content": "another", + "span": { + "offset": 1035, + "length": 7 + }, + "confidence": 0.993, + "source": "D(1,25.2919,7.9708,26.2933,7.934,26.3015,8.174,25.2998,8.2142)" + }, + { + "content": "supplier", + "span": { + "offset": 1043, + "length": 8 + }, + "confidence": 0.989, + "source": "D(1,26.3722,7.9308,27.4131,7.8947,27.4216,8.1343,26.3803,8.1706)" + }, + { + "content": "to", + "span": { + "offset": 1052, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,27.4841,7.8923,27.7285,7.8823,27.7373,8.1224,27.4925,8.1318)" + }, + { + "content": "fill", + "span": { + "offset": 1055, + "length": 4 + }, + "confidence": 0.884, + "source": "D(1,27.8113,7.8787,28.107,7.8662,28.1074,8.1073,27.8202,8.1191)" + }, + { + "content": "ALTERNATE", + "span": { + "offset": 1080, + "length": 9 + }, + "confidence": 0.993, + "source": "D(1,20.3436,8.537,22.2708,8.4924,22.2778,8.7553,20.3471,8.8004)" + }, + { + "content": "DEA", + "span": { + "offset": 1090, + "length": 3 + }, + "confidence": 0.996, + "source": "D(1,22.3779,8.491,23.0674,8.4741,23.0758,8.7345,22.3851,8.7518)" + }, + { + "content": "#", + "span": { + "offset": 1094, + "length": 1 + }, + "confidence": 0.977, + "source": "D(1,23.153,8.4719,23.3585,8.4646,23.3613,8.7249,23.1615,8.7326)" + }, + { + "content": "Signature-", + "span": { + "offset": 1116, + "length": 10 + }, + "confidence": 0.992, + "source": "D(1,20.357,9.3488,21.946,9.3014,21.9529,9.5625,20.3625,9.5954)" + }, + { + "content": "by", + "span": { + "offset": 1127, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,22.0261,9.2994,22.3718,9.2923,22.3791,9.5546,22.0332,9.5603)" + }, + { + "content": "first", + "span": { + "offset": 1130, + "length": 5 + }, + "confidence": 0.996, + "source": "D(1,22.4561,9.2899,22.9872,9.2735,22.9947,9.5374,22.4635,9.552)" + }, + { + "content": "supplier", + "span": { + "offset": 1136, + "length": 8 + }, + "confidence": 0.554, + "source": "D(1,23.0841,9.2703,24.2578,9.2464,24.2578,9.4968,23.0916,9.5344)" + }, + { + "content": "Lingua.", + "span": { + "offset": 1145, + "length": 7 + }, + "confidence": 0.601, + "source": "D(1,20.2151,9.6206,23.2514,9.59,23.2897,10.2327,20.2357,10.3176)" + }, + { + "content": "Drier", + "span": { + "offset": 1153, + "length": 5 + }, + "confidence": 0.627, + "source": "D(1,23.4021,9.5876,25.3827,9.5383,25.4004,10.1783,23.4419,10.2279)" + }, + { + "content": "10-26-23", + "span": { + "offset": 1159, + "length": 8 + }, + "confidence": 0.69, + "source": "D(1,28.5164,9.6074,31.0078,9.516,31.0078,9.9668,28.5307,10.0334)" + }, + { + "content": "DATE", + "span": { + "offset": 1168, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,28.3784,10.1555,28.9411,10.1398,28.9447,10.326,28.382,10.3354)" + }, + { + "content": "OFFICIAL", + "span": { + "offset": 1173, + "length": 8 + }, + "confidence": 0.846, + "source": "D(1,20.3628,10.361,21.2441,10.3371,21.2514,10.5577,20.368,10.5789)" + }, + { + "content": "AUTHORIZED", + "span": { + "offset": 1182, + "length": 10 + }, + "confidence": 0.564, + "source": "D(1,21.3058,10.3355,22.6512,10.2946,22.6585,10.5193,21.3131,10.5561)" + }, + { + "content": "TO", + "span": { + "offset": 1193, + "length": 2 + }, + "confidence": 0.989, + "source": "D(1,22.7128,10.2928,22.9957,10.2845,23.0032,10.5086,22.7202,10.5173)" + }, + { + "content": "EXECUTE", + "span": { + "offset": 1196, + "length": 7 + }, + "confidence": 0.977, + "source": "D(1,23.0501,10.2829,24.0255,10.248,24.0331,10.475,23.0577,10.5069)" + }, + { + "content": "ON", + "span": { + "offset": 1204, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,24.0908,10.2468,24.3955,10.2412,24.4031,10.4664,24.0984,10.4735)" + }, + { + "content": "BEHALF", + "span": { + "offset": 1207, + "length": 6 + }, + "confidence": 0.989, + "source": "D(1,24.4716,10.2393,25.2876,10.2155,25.2944,10.4349,24.4792,10.4642)" + }, + { + "content": "OF", + "span": { + "offset": 1214, + "length": 2 + }, + "confidence": 0.994, + "source": "D(1,25.3348,10.2143,25.6068,10.2073,25.6134,10.4247,25.3415,10.4332)" + }, + { + "content": "SUPPLIER", + "span": { + "offset": 1217, + "length": 8 + }, + "confidence": 0.992, + "source": "D(1,25.6902,10.2052,26.7165,10.1731,26.7187,10.3896,25.6968,10.4221)" + }, + { + "content": "ITEM", + "span": { + "offset": 1265, + "length": 4 + }, + "confidence": 0.989, + "source": "D(1,1.4243,11.5174,2.1445,11.5113,2.1445,11.757,1.426,11.763)" + }, + { + "content": "NO", + "span": { + "offset": 1279, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,2.9295,11.3348,3.3701,11.334,3.3719,11.5701,2.9315,11.5746)" + }, + { + "content": "OF", + "span": { + "offset": 1282, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,3.5402,11.3325,3.9375,11.3271,3.9375,11.5631,3.5417,11.5656)" + }, + { + "content": "PACKAGES", + "span": { + "offset": 1285, + "length": 8 + }, + "confidence": 0.992, + "source": "D(1,2.6487,11.6715,4.2539,11.658,4.2539,11.8942,2.6494,11.9113)" + }, + { + "content": "PACKAGE", + "span": { + "offset": 1303, + "length": 7 + }, + "confidence": 0.995, + "source": "D(1,4.6156,11.3048,6.0117,11.2894,6.0117,11.5304,4.6161,11.542)" + }, + { + "content": "SIZE", + "span": { + "offset": 1311, + "length": 4 + }, + "confidence": 0.983, + "source": "D(1,5.0179,11.6303,5.6575,11.6289,5.6589,11.8676,5.0195,11.8692)" + }, + { + "content": "NAME", + "span": { + "offset": 1325, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,10.6686,11.3666,11.4888,11.3501,11.4903,11.5805,10.6701,11.5991)" + }, + { + "content": "OF", + "span": { + "offset": 1330, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,11.5716,11.3492,11.9629,11.3427,11.9643,11.5717,11.5731,11.5788)" + }, + { + "content": "ITEM", + "span": { + "offset": 1333, + "length": 4 + }, + "confidence": 0.855, + "source": "D(1,12.0533,11.3418,12.7441,11.3323,12.7441,11.5581,12.0546,11.5696)" + }, + { + "content": "NUMBER", + "span": { + "offset": 1347, + "length": 6 + }, + "confidence": 0.989, + "source": "D(1,17.3648,10.9541,18.5977,10.9225,18.5977,11.1535,17.368,11.1797)" + }, + { + "content": "REC'D", + "span": { + "offset": 1354, + "length": 5 + }, + "confidence": 0.987, + "source": "D(1,17.5603,11.2658,18.4219,11.2543,18.4219,11.4832,17.5615,11.4924)" + }, + { + "content": "DATE", + "span": { + "offset": 1369, + "length": 4 + }, + "confidence": 0.986, + "source": "D(1,19.0167,10.9211,19.7578,10.9137,19.7578,11.1343,19.018,11.1412)" + }, + { + "content": "REC'D", + "span": { + "offset": 1374, + "length": 5 + }, + "confidence": 0.96, + "source": "D(1,18.9675,11.2387,19.8105,11.2294,19.8105,11.4578,18.9687,11.4665)" + }, + { + "content": "PART", + "span": { + "offset": 1389, + "length": 4 + }, + "confidence": 0.987, + "source": "D(1,20.26,11.0056,21.1063,10.982,21.1116,11.2324,20.2639,11.25)" + }, + { + "content": "4:", + "span": { + "offset": 1416, + "length": 2 + }, + "confidence": 0.99, + "source": "D(1,21.1873,10.9801,21.4748,10.9744,21.4805,11.2211,21.1927,11.23)" + }, + { + "content": "TO", + "span": { + "offset": 1419, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,21.572,10.9725,22.0214,10.9588,22.0277,11.2025,21.5778,11.218)" + }, + { + "content": "BE", + "span": { + "offset": 1422, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,22.1348,10.9557,22.5761,10.9444,22.5831,11.1888,22.1412,11.1994)" + }, + { + "content": "FILLED", + "span": { + "offset": 1425, + "length": 6 + }, + "confidence": 0.994, + "source": "D(1,22.6895,10.9406,23.8313,10.909,23.8386,11.1561,22.6966,11.1855)" + }, + { + "content": "IN", + "span": { + "offset": 1432, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,23.9406,10.9062,24.1957,10.8995,24.2031,11.1459,23.948,11.1533)" + }, + { + "content": "BY", + "span": { + "offset": 1435, + "length": 2 + }, + "confidence": 0.99, + "source": "D(1,24.3658,10.8949,24.8192,10.8811,24.8269,11.1268,24.3732,11.1409)" + }, + { + "content": "SUPPLIER", + "span": { + "offset": 1438, + "length": 8 + }, + "confidence": 0.993, + "source": "D(1,24.9285,10.8768,26.5925,10.8266,26.5957,11.0749,24.9361,11.1233)" + }, + { + "content": "NATIONAL", + "span": { + "offset": 1447, + "length": 8 + }, + "confidence": 0.995, + "source": "D(1,22.939,11.2913,24.3724,11.2455,24.3801,11.4744,22.9478,11.5137)" + }, + { + "content": "DRUG", + "span": { + "offset": 1456, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,24.47,11.2435,25.3183,11.222,25.326,11.4525,24.4778,11.472)" + }, + { + "content": "CODE", + "span": { + "offset": 1461, + "length": 4 + }, + "confidence": 0.986, + "source": "D(1,25.4046,11.2199,26.2566,11.1977,26.2617,11.4286,25.412,11.4502)" + }, + { + "content": "NUMBER", + "span": { + "offset": 1475, + "length": 6 + }, + "confidence": 0.994, + "source": "D(1,29.2744,10.7705,30.5459,10.7357,30.5495,10.9684,29.2782,10.9991)" + }, + { + "content": "SHIPPED", + "span": { + "offset": 1482, + "length": 7 + }, + "confidence": 0.994, + "source": "D(1,29.2869,11.0913,30.5459,11.0718,30.5481,11.3131,29.2888,11.3282)" + }, + { + "content": "DATE", + "span": { + "offset": 1499, + "length": 4 + }, + "confidence": 0.989, + "source": "D(1,31.338,10.6987,32.1122,10.6867,32.1147,10.9246,31.341,10.9336)" + }, + { + "content": "SHIPPED", + "span": { + "offset": 1504, + "length": 7 + }, + "confidence": 0.993, + "source": "D(1,31.0988,11.0409,32.3789,11.0185,32.3789,11.2595,31.1029,11.2904)" + }, + { + "content": "1", + "span": { + "offset": 1532, + "length": 1 + }, + "confidence": 0.989, + "source": "D(1,1.7191,12.1548,1.8633,12.1479,1.8633,12.3932,1.7209,12.401)" + }, + { + "content": "1", + "span": { + "offset": 1543, + "length": 1 + }, + "confidence": 0.253, + "source": "D(1,2.8585,12.1386,3.0586,12.1375,3.0586,12.402,2.8594,12.406)" + }, + { + "content": "20.000", + "span": { + "offset": 1554, + "length": 6 + }, + "confidence": 0.973, + "source": "D(1,4.6288,12.1073,6.082,12.0958,6.082,12.3562,4.6291,12.375)" + }, + { + "content": "METHADONE", + "span": { + "offset": 1570, + "length": 9 + }, + "confidence": 0.994, + "source": "D(1,7.3087,12.0783,9.5244,12.0412,9.5269,12.2939,7.3108,12.3223)" + }, + { + "content": "HCL", + "span": { + "offset": 1580, + "length": 3 + }, + "confidence": 0.994, + "source": "D(1,9.7807,12.0383,10.5248,12.0262,10.5281,12.2802,9.7832,12.2913)" + }, + { + "content": "10", + "span": { + "offset": 1584, + "length": 2 + }, + "confidence": 0.817, + "source": "D(1,10.7853,12.023,11.2235,12.0158,11.2264,12.2674,10.7881,12.2752)" + }, + { + "content": "MG", + "span": { + "offset": 1587, + "length": 2 + }, + "confidence": 0.996, + "source": "D(1,11.4673,12.011,11.9675,12.0006,11.9708,12.2539,11.4707,12.2633)" + }, + { + "content": "TABLET", + "span": { + "offset": 1590, + "length": 6 + }, + "confidence": 0.993, + "source": "D(1,12.2073,11.9963,13.6788,11.9647,13.6834,12.2208,12.2107,12.2504)" + }, + { + "content": "TAB", + "span": { + "offset": 1597, + "length": 3 + }, + "confidence": 0.996, + "source": "D(1,13.9268,11.9605,14.6777,11.9505,14.6777,12.2031,13.9315,12.2157)" + }, + { + "content": "00054-0710-25", + "span": { + "offset": 1650, + "length": 13 + }, + "confidence": 0.803, + "source": "D(1,20.5652,11.8336,23.7129,11.7542,23.7129,12.0243,20.5695,12.1109)" + }, + { + "content": "20", + "span": { + "offset": 1753, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,29.2262,11.5767,30.0234,11.5536,30.0234,12.0171,29.2287,12.0318)" + }, + { + "content": "10-30-21", + "span": { + "offset": 1765, + "length": 8 + }, + "confidence": 0.685, + "source": "D(1,30.7881,11.6001,32.9062,11.5243,32.9062,11.9775,30.7961,12.0184)" + }, + { + "content": "2", + "span": { + "offset": 1794, + "length": 1 + }, + "confidence": 0.995, + "source": "D(1,1.7039,12.7416,1.8984,12.7365,1.8984,12.9874,1.7048,12.9945)" + }, + { + "content": "1", + "span": { + "offset": 1805, + "length": 1 + }, + "confidence": 0.942, + "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + }, + { + "content": "10.000", + "span": { + "offset": 1816, + "length": 6 + }, + "confidence": 0.953, + "source": "D(1,4.6523,12.7251,6.082,12.7089,6.082,12.9683,4.6535,12.9861)" + }, + { + "content": "DEXMETHYLPHENIDATE", + "span": { + "offset": 1832, + "length": 18 + }, + "confidence": 0.991, + "source": "D(1,7.3243,12.6825,11.7495,12.6126,11.7528,12.8649,7.3258,12.9375)" + }, + { + "content": "ER", + "span": { + "offset": 1851, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,11.9915,12.6098,12.4877,12.599,12.4924,12.8542,11.9952,12.8605)" + }, + { + "content": "25", + "span": { + "offset": 1854, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,12.7338,12.5935,13.18,12.5843,13.1841,12.8398,12.7383,12.8494)" + }, + { + "content": "MG", + "span": { + "offset": 1857, + "length": 2 + }, + "confidence": 0.985, + "source": "D(1,13.4345,12.5802,13.9391,12.5723,13.9445,12.8249,13.4389,12.8351)" + }, + { + "content": "CP", + "span": { + "offset": 1860, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,14.1894,12.5679,14.6648,12.5562,14.6708,12.8119,14.1951,12.8198)" + }, + { + "content": "00115-1709-01", + "span": { + "offset": 1912, + "length": 13 + }, + "confidence": 0.904, + "source": "D(1,20.5837,12.4376,23.7305,12.3666,23.7305,12.6321,20.5865,12.6993)" + }, + { + "content": "10", + "span": { + "offset": 2015, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,29.3355,12.2962,29.918,12.2871,29.918,12.703,29.3398,12.7266)" + }, + { + "content": "0.30-23", + "span": { + "offset": 2027, + "length": 7 + }, + "confidence": 0.794, + "source": "D(1,30.8197,12.2063,32.6205,12.1421,32.625,12.6023,30.8267,12.6211)" + }, + { + "content": "3", + "span": { + "offset": 2055, + "length": 1 + }, + "confidence": 0.997, + "source": "D(1,1.7151,13.327,1.8984,13.3229,1.8984,13.5718,1.7161,13.5774)" + }, + { + "content": "1", + "span": { + "offset": 2066, + "length": 1 + }, + "confidence": 0.992, + "source": "D(1,2.8774,13.3745,3.0937,13.3699,3.0937,13.6249,2.8784,13.6299)" + }, + { + "content": "90.000", + "span": { + "offset": 2077, + "length": 6 + }, + "confidence": 0.973, + "source": "D(1,4.6691,13.3392,6.0784,13.3245,6.0793,13.5826,4.6705,13.6007)" + }, + { + "content": "CONCERTA", + "span": { + "offset": 2093, + "length": 8 + }, + "confidence": 0.994, + "source": "D(1,7.3697,13.2964,9.329,13.2662,9.3316,13.52,7.3721,13.5482)" + }, + { + "content": "ER", + "span": { + "offset": 2102, + "length": 2 + }, + "confidence": 0.995, + "source": "D(1,9.5676,13.2614,10.0658,13.2539,10.0694,13.5095,9.5706,13.5158)" + }, + { + "content": "27", + "span": { + "offset": 2105, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,10.3169,13.2495,10.7523,13.2414,10.7558,13.498,10.3206,13.5054)" + }, + { + "content": "MG", + "span": { + "offset": 2108, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,11.016,13.2364,11.5267,13.2245,11.5296,13.4841,11.0193,13.4934)" + }, + { + "content": "TABLET", + "span": { + "offset": 2111, + "length": 6 + }, + "confidence": 0.994, + "source": "D(1,11.7654,13.2218,13.218,13.1969,13.2224,13.4543,11.7681,13.4804)" + }, + { + "content": "TAB", + "span": { + "offset": 2118, + "length": 3 + }, + "confidence": 0.996, + "source": "D(1,13.4566,13.1933,14.1935,13.1818,14.1994,13.4362,13.4608,13.45)" + }, + { + "content": "E", + "span": { + "offset": 2122, + "length": 1 + }, + "confidence": 0.977, + "source": "D(1,14.4446,13.1777,14.7129,13.1732,14.7129,13.429,14.4501,13.4327)" + }, + { + "content": "50458-0588-01", + "span": { + "offset": 2173, + "length": 13 + }, + "confidence": 0.977, + "source": "D(1,20.5866,13.0442,23.7332,12.9842,23.743,13.2535,20.5916,13.3133)" + }, + { + "content": "90", + "span": { + "offset": 2276, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,29.3457,12.8264,30.0762,12.8087,30.0762,13.2387,29.349,13.2539)" + }, + { + "content": "0-30-23", + "span": { + "offset": 2288, + "length": 7 + }, + "confidence": 0.693, + "source": "D(1,30.8413,12.8227,32.7656,12.7573,32.7656,13.2025,30.8487,13.2304)" + }, + { + "content": "4", + "span": { + "offset": 2316, + "length": 1 + }, + "confidence": 0.995, + "source": "D(1,1.7238,13.9302,1.9328,13.9239,1.9336,14.1683,1.7245,14.1776)" + }, + { + "content": "1", + "span": { + "offset": 2327, + "length": 1 + }, + "confidence": 0.861, + "source": "D(1,2.8882,13.9822,3.0937,13.9722,3.0937,14.245,2.8891,14.2527)" + }, + { + "content": "40.000", + "span": { + "offset": 2338, + "length": 6 + }, + "confidence": 0.977, + "source": "D(1,4.6643,13.9401,6.082,13.9293,6.082,14.1896,4.6656,14.2031)" + }, + { + "content": "MYDAYIS", + "span": { + "offset": 2354, + "length": 7 + }, + "confidence": 0.992, + "source": "D(1,7.3342,13.9035,9.0539,13.8791,9.0563,14.1341,7.336,14.1576)" + }, + { + "content": "ER", + "span": { + "offset": 2362, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,9.3236,13.8733,9.8209,13.8654,9.8249,14.1225,9.3266,14.1276)" + }, + { + "content": "25", + "span": { + "offset": 2365, + "length": 2 + }, + "confidence": 0.985, + "source": "D(1,10.078,13.8606,10.5248,13.8527,10.5285,14.1096,10.082,14.118)" + }, + { + "content": "MG", + "span": { + "offset": 2368, + "length": 2 + }, + "confidence": 0.996, + "source": "D(1,10.7861,13.8492,11.2918,13.839,11.2957,14.0988,10.79,14.1056)" + }, + { + "content": "CAPSULE", + "span": { + "offset": 2371, + "length": 7 + }, + "confidence": 0.993, + "source": "D(1,11.5362,13.834,13.2304,13.7986,13.2347,14.0576,11.5401,14.0948)" + }, + { + "content": "CPTP", + "span": { + "offset": 2379, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,13.4706,13.7945,14.4486,13.7837,14.4492,14.0399,13.4752,14.0526)" + }, + { + "content": "54092-0471-01", + "span": { + "offset": 2433, + "length": 13 + }, + "confidence": 0.632, + "source": "D(1,20.5987,13.6589,23.7417,13.6028,23.747,13.8622,20.6017,13.9214)" + }, + { + "content": "40", + "span": { + "offset": 2536, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,29.4674,13.4336,30.1641,13.4126,30.1641,13.7875,29.4719,13.7988)" + }, + { + "content": "0", + "span": { + "offset": 2548, + "length": 1 + }, + "confidence": 0.691, + "source": "D(1,30.9152,13.4006,31.2991,13.3801,31.3101,13.8005,30.9258,13.8074)" + }, + { + "content": "30-23", + "span": { + "offset": 2550, + "length": 5 + }, + "confidence": 0.867, + "source": "D(1,31.4319,13.3756,32.8535,13.3178,32.8535,13.7631,31.4412,13.7953)" + }, + { + "content": "5", + "span": { + "offset": 2576, + "length": 1 + }, + "confidence": 0.989, + "source": "D(1,1.7481,14.5093,1.9302,14.5037,1.9308,14.7566,1.7488,14.7627)" + }, + { + "content": "6", + "span": { + "offset": 2778, + "length": 1 + }, + "confidence": 0.992, + "source": "D(1,1.7419,15.1261,1.9432,15.1175,1.9437,15.3555,1.7423,15.3633)" + }, + { + "content": "7", + "span": { + "offset": 2980, + "length": 1 + }, + "confidence": 0.989, + "source": "D(1,1.7655,15.6961,1.9448,15.6889,1.945,15.938,1.7657,15.9434)" + }, + { + "content": "8", + "span": { + "offset": 3182, + "length": 1 + }, + "confidence": 0.996, + "source": "D(1,1.7742,16.2874,1.9687,16.2803,1.9687,16.5315,1.7749,16.539)" + }, + { + "content": "9", + "span": { + "offset": 3384, + "length": 1 + }, + "confidence": 0.994, + "source": "D(1,1.7963,16.8725,1.9863,16.867,1.9863,17.1173,1.7969,17.1255)" + }, + { + "content": "10", + "span": { + "offset": 3586, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,1.7612,17.4559,2.1086,17.4453,2.1094,17.6991,1.7627,17.7061)" + }, + { + "content": "11", + "span": { + "offset": 3789, + "length": 2 + }, + "confidence": 0.986, + "source": "D(1,1.785,18.0285,2.1094,18.0176,2.1094,18.2881,1.7863,18.2933)" + }, + { + "content": "12", + "span": { + "offset": 3992, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,1.8065,18.6197,2.1445,18.6102,2.1445,18.8774,1.8081,18.8835)" + }, + { + "content": "13", + "span": { + "offset": 4195, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,1.8075,19.2234,2.1439,19.2123,2.1445,19.4678,1.8089,19.4766)" + }, + { + "content": "14", + "span": { + "offset": 4398, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,1.8141,19.8055,2.1522,19.7948,2.1535,20.0531,1.8154,20.062)" + }, + { + "content": "15", + "span": { + "offset": 4601, + "length": 2 + }, + "confidence": 0.997, + "source": "D(1,1.8113,20.4034,2.1576,20.3945,2.1588,20.647,1.8126,20.6525)" + }, + { + "content": "16", + "span": { + "offset": 4804, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,1.8169,20.9902,2.1621,20.9805,2.1621,21.2461,1.818,21.2519)" + }, + { + "content": "17", + "span": { + "offset": 5007, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,1.8226,21.5805,2.1567,21.5691,2.1572,21.8414,1.8233,21.8487)" + }, + { + "content": "18", + "span": { + "offset": 5210, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,1.8107,22.1881,2.1445,22.1811,2.1445,22.4341,1.8116,22.4434)" + }, + { + "content": "19", + "span": { + "offset": 5413, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,1.8071,22.7675,2.1445,22.7613,2.1445,23.0266,1.8082,23.0355)" + }, + { + "content": "20", + "span": { + "offset": 5616, + "length": 2 + }, + "confidence": 0.993, + "source": "D(1,1.7901,23.3835,2.1443,23.3746,2.1445,23.6323,1.7913,23.6407)" + }, + { + "content": "4", + "span": { + "offset": 5819, + "length": 1 + }, + "confidence": 0.987, + "source": "D(1,1.9591,24.5122,2.1445,24.5084,2.1445,24.7821,1.9596,24.7851)" + }, + { + "content": "LAST", + "span": { + "offset": 5842, + "length": 4 + }, + "confidence": 0.988, + "source": "D(1,4.1278,24.2388,4.9563,24.2218,4.959,24.5149,4.1317,24.5286)" + }, + { + "content": "LINE", + "span": { + "offset": 5847, + "length": 4 + }, + "confidence": 0.992, + "source": "D(1,5.0671,24.22,5.8041,24.2094,5.8073,24.5019,5.0699,24.5138)" + }, + { + "content": "COMPLETED", + "span": { + "offset": 5852, + "length": 9 + }, + "confidence": 0.997, + "source": "D(1,5.9004,24.207,7.9716,24.1659,7.9762,24.4657,5.9037,24.4998)" + }, + { + "content": "(MUST", + "span": { + "offset": 5862, + "length": 5 + }, + "confidence": 0.994, + "source": "D(1,8.0872,24.1639,9.1374,24.1489,9.1426,24.4454,8.092,24.4634)" + }, + { + "content": "BE", + "span": { + "offset": 5868, + "length": 2 + }, + "confidence": 0.992, + "source": "D(1,9.2337,24.148,9.6914,24.1431,9.6964,24.437,9.2389,24.4441)" + }, + { + "content": "20", + "span": { + "offset": 5871, + "length": 2 + }, + "confidence": 0.998, + "source": "D(1,9.7781,24.1416,10.1346,24.1355,10.14,24.4274,9.7832,24.4351)" + }, + { + "content": "OR", + "span": { + "offset": 5874, + "length": 2 + }, + "confidence": 0.999, + "source": "D(1,10.2502,24.1335,10.7463,24.1254,10.7519,24.416,10.2556,24.4252)" + }, + { + "content": "LESS)", + "span": { + "offset": 5877, + "length": 5 + }, + "confidence": 0.984, + "source": "D(1,10.8475,24.124,11.8125,24.1076,11.8125,24.4028,10.8531,24.4142)" + } + ], + "lines": [ + { + "content": "DEA FORM-222", + "source": "D(1,1.2589,1.4763,3.8915,1.3748,3.9023,1.6576,1.2698,1.7591)", + "span": { + "offset": 10, + "length": 12 + } + }, + { + "content": "U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II", + "source": "D(1,12.2912,0.8412,21.1724,0.6504,21.1804,0.9492,12.2993,1.1678)", + "span": { + "offset": 38, + "length": 44 + } + }, + { + "content": "DRUG ENFORCEMENT ADMINISTRATION", + "source": "D(1,13.4704,1.223,20.0229,1.061,20.0299,1.3435,13.4774,1.5056)", + "span": { + "offset": 83, + "length": 31 + } + }, + { + "content": "OMB APPROVAL No. 1117-0010", + "source": "D(1,27.5155,0.5089,32.3034,0.481,32.305,0.7472,27.517,0.7751)", + "span": { + "offset": 116, + "length": 26 + } + }, + { + "content": "PURCHASER INFORMATION", + "source": "D(1,1.5409,3.6817,5.9527,3.5332,5.959,3.8066,1.5502,3.9566)", + "span": { + "offset": 144, + "length": 21 + } + }, + { + "content": "INMAR RX SOLUTIONS, INC", + "source": "D(1,1.5363,4.3942,5.8295,4.2891,5.8359,4.57,1.5437,4.6806)", + "span": { + "offset": 167, + "length": 23 + } + }, + { + "content": "3845 GRAND LAKES WAY", + "source": "D(1,1.5189,4.751,5.4812,4.6758,5.4844,4.9428,1.5256,5.0367)", + "span": { + "offset": 191, + "length": 20 + } + }, + { + "content": "SUITE 125", + "source": "D(1,1.5022,5.1369,3.0329,5.0683,3.041,5.3289,1.5139,5.3975)", + "span": { + "offset": 212, + "length": 9 + } + }, + { + "content": "GRAND PRAIRIE, TX 75050-0000", + "source": "D(1,1.4851,5.4643,6.5408,5.4195,6.5432,5.6965,1.4875,5.7414)", + "span": { + "offset": 222, + "length": 28 + } + }, + { + "content": "REGISTRATION INFORMATION", + "source": "D(1,10.8015,3.4847,15.6909,3.3581,15.6973,3.6165,10.8082,3.7432)", + "span": { + "offset": 252, + "length": 24 + } + }, + { + "content": "REGISTRATION #, RR0191902", + "source": "D(1,10.8281,4.4051,15.5083,4.3066,15.5143,4.569,10.8324,4.6727)", + "span": { + "offset": 278, + "length": 25 + } + }, + { + "content": "REGISTERED AS: REVERSE DISTRIB", + "source": "D(1,10.8457,4.8814,16.6404,4.7461,16.6469,5.0153,10.8493,5.1539)", + "span": { + "offset": 305, + "length": 30 + } + }, + { + "content": "SCHEDULES: 1,2,2N,3,3N,4,5,", + "source": "D(1,10.8718,5.3531,15.4188,5.2685,15.4238,5.54,10.8769,5.6245)", + "span": { + "offset": 336, + "length": 27 + } + }, + { + "content": "ORDER FORM NUMBER. 231454769", + "source": "D(1,10.8774,5.8437,16.451,5.7238,16.4567,5.9898,10.8832,6.1097)", + "span": { + "offset": 364, + "length": 28 + } + }, + { + "content": "DATE ISSUED. 09262023", + "source": "D(1,10.8991,6.3295,14.7069,6.2605,14.7119,6.5372,10.9041,6.6062)", + "span": { + "offset": 394, + "length": 21 + } + }, + { + "content": "ORDER FORM 3 OF 3", + "source": "D(1,10.916,6.8022,14.2365,6.75,14.2411,7.0053,10.9184,7.0636)", + "span": { + "offset": 416, + "length": 17 + } + }, + { + "content": "SUPPLIER DEA NUMBER:#", + "source": "D(1,20.24,3.3678,23.9095,3.3472,23.9108,3.574,20.2413,3.5945)", + "span": { + "offset": 435, + "length": 21 + } + }, + { + "content": "FA5718830", + "source": "D(1,26.1301,3.1061,32.1171,3.0059,32.1333,3.9123,26.1463,4.0187)", + "span": { + "offset": 458, + "length": 9 + } + }, + { + "content": "PART 2: TO BE FILLED IN BY PURCHASER", + "source": "D(1,20.2685,4.3982,27.1032,4.2054,27.1113,4.491,20.2766,4.6582)", + "span": { + "offset": 469, + "length": 36 + } + }, + { + "content": "CVS PHARMACY # 16800", + "source": "D(1,20.4677,4.6354,26.1627,4.5183,26.1697,4.8585,20.4747,4.9746)", + "span": { + "offset": 506, + "length": 20 + } + }, + { + "content": "BUSINESS NAME", + "source": "D(1,20.2808,5.1541,22.6034,5.1466,22.6041,5.3707,20.2815,5.3782)", + "span": { + "offset": 528, + "length": 13 + } + }, + { + "content": "4601 MONTGOMERY HWY STE 300", + "source": "D(1,20.4785,5.4479,28.5551,5.1692,28.567,5.5164,20.4896,5.748)", + "span": { + "offset": 543, + "length": 27 + } + }, + { + "content": "STREET ADDRESS", + "source": "D(1,20.3035,5.9935,22.8478,5.9653,22.8503,6.1899,20.306,6.2182)", + "span": { + "offset": 572, + "length": 14 + } + }, + { + "content": "DOTHAN, AL 36303", + "source": "D(1,20.4855,6.2226,24.9058,6.1081,24.9147,6.451,20.4944,6.5391)", + "span": { + "offset": 588, + "length": 16 + } + }, + { + "content": "CITY, STATE, ZIP CODE", + "source": "D(1,20.3234,6.8092,23.5333,6.757,23.5374,7.0084,20.3275,7.0606)", + "span": { + "offset": 606, + "length": 21 + } + }, + { + "content": "PART 1: TO BE FILLED IN BY PURCHASER", + "source": "D(1,1.3237,8.0784,8.2815,8.0073,8.2844,8.2885,1.3266,8.3496)", + "span": { + "offset": 629, + "length": 36 + } + }, + { + "content": "DIANA RUIZ DEA CLERK", + "source": "D(1,4.1951,8.7527,8.613,8.7447,8.6135,9.0691,4.1957,9.0771)", + "span": { + "offset": 667, + "length": 20 + } + }, + { + "content": "Print or Type Name and Title", + "source": "D(1,1.3327,9.4476,5.1039,9.429,5.1052,9.6959,1.334,9.7146)", + "span": { + "offset": 689, + "length": 28 + } + }, + { + "content": "Manuel", + "source": "D(1,1.636,9.5312,5.2101,9.5286,5.2107,10.3801,1.6366,10.3827)", + "span": { + "offset": 719, + "length": 6 + } + }, + { + "content": "by power of attorney", + "source": "D(1,5.545,9.6508,10.4472,9.5801,10.4521,9.8775,5.5499,9.9555)", + "span": { + "offset": 727, + "length": 20 + } + }, + { + "content": "10/23/2023", + "source": "D(1,12.1943,9.5001,14.5784,9.4746,14.5821,9.7691,12.198,9.7987)", + "span": { + "offset": 748, + "length": 10 + } + }, + { + "content": "Signature of Requesting Official (must be authorized to sign order form)", + "source": "D(1,1.3359,10.4179,10.5522,10.296,10.5559,10.5788,1.339,10.6875)", + "span": { + "offset": 760, + "length": 72 + } + }, + { + "content": "Date", + "source": "D(1,12.017,10.253,12.612,10.2539,12.6117,10.4718,12.0167,10.471)", + "span": { + "offset": 834, + "length": 4 + } + }, + { + "content": "PART 5:", + "source": "D(1,17.993,8.2528,19.2537,8.243,19.2557,8.5,17.995,8.5097)", + "span": { + "offset": 870, + "length": 7 + } + }, + { + "content": "TO BE", + "source": "D(1,18.1325,8.6296,19.1279,8.6211,19.1301,8.871,18.1346,8.8795)", + "span": { + "offset": 878, + "length": 5 + } + }, + { + "content": "FILLED IN BY", + "source": "D(1,17.6058,9.0128,19.6892,8.9958,19.6912,9.2476,17.6079,9.2646)", + "span": { + "offset": 884, + "length": 12 + } + }, + { + "content": "PURCHASER", + "source": "D(1,17.6283,9.393,19.6816,9.3737,19.684,9.6262,17.6307,9.6455)", + "span": { + "offset": 897, + "length": 9 + } + }, + { + "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier", + "source": "D(1,20.3432,7.7303,32.1175,7.4355,32.1252,7.6947,20.351,8.0145)", + "span": { + "offset": 916, + "length": 77 + } + }, + { + "content": "(name in part 2) if order is endorsed to another supplier to fill", + "source": "D(1,20.345,8.1335,28.0884,7.8669,28.097,8.1179,20.3536,8.3672)", + "span": { + "offset": 994, + "length": 65 + } + }, + { + "content": "ALTERNATE DEA #", + "source": "D(1,20.3408,8.5371,23.3489,8.465,23.3551,8.727,20.3471,8.799)", + "span": { + "offset": 1080, + "length": 15 + } + }, + { + "content": "Signature- by first supplier", + "source": "D(1,20.3555,9.3451,24.2489,9.2461,24.2562,9.498,20.3628,9.5977)", + "span": { + "offset": 1116, + "length": 28 + } + }, + { + "content": "Lingua. Drier", + "source": "D(1,20.2151,9.6206,25.3787,9.5273,25.3946,10.1864,20.231,10.3064)", + "span": { + "offset": 1145, + "length": 13 + } + }, + { + "content": "10-26-23", + "source": "D(1,28.5162,9.6006,30.9882,9.5172,31.0031,9.9603,28.5311,10.0371)", + "span": { + "offset": 1159, + "length": 8 + } + }, + { + "content": "DATE", + "source": "D(1,28.3769,10.1555,28.9343,10.1399,28.9394,10.3231,28.3821,10.3359)", + "span": { + "offset": 1168, + "length": 4 + } + }, + { + "content": "OFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER", + "source": "D(1,20.3614,10.358,26.7071,10.1668,26.714,10.3933,20.3682,10.582)", + "span": { + "offset": 1173, + "length": 52 + } + }, + { + "content": "ITEM", + "source": "D(1,1.4242,11.5154,2.1379,11.5104,2.1397,11.7584,1.426,11.7634)", + "span": { + "offset": 1265, + "length": 4 + } + }, + { + "content": "NO OF", + "source": "D(1,2.9295,11.3348,3.935,11.3277,3.9366,11.5635,2.9312,11.5706)", + "span": { + "offset": 1279, + "length": 5 + } + }, + { + "content": "PACKAGES", + "source": "D(1,2.6468,11.6715,4.2514,11.6543,4.2539,11.893,2.6494,11.9109)", + "span": { + "offset": 1285, + "length": 8 + } + }, + { + "content": "PACKAGE", + "source": "D(1,4.614,11.302,6.0087,11.2893,6.0109,11.5265,4.6161,11.5393)", + "span": { + "offset": 1303, + "length": 7 + } + }, + { + "content": "SIZE", + "source": "D(1,5.0179,11.6301,5.6488,11.6281,5.6496,11.8635,5.0186,11.8655)", + "span": { + "offset": 1311, + "length": 4 + } + }, + { + "content": "NAME OF ITEM", + "source": "D(1,10.6656,11.3645,12.7343,11.3243,12.7388,11.5575,10.6701,11.5977)", + "span": { + "offset": 1325, + "length": 12 + } + }, + { + "content": "NUMBER", + "source": "D(1,17.3628,10.9483,18.5911,10.9204,18.5963,11.1496,17.368,11.1774)", + "span": { + "offset": 1347, + "length": 6 + } + }, + { + "content": "REC'D", + "source": "D(1,17.5586,11.2654,18.4143,11.2544,18.4172,11.481,17.5615,11.492)", + "span": { + "offset": 1354, + "length": 5 + } + }, + { + "content": "DATE", + "source": "D(1,19.0158,10.9212,19.7528,10.9136,19.755,11.1324,19.018,11.1399)", + "span": { + "offset": 1369, + "length": 4 + } + }, + { + "content": "REC'D", + "source": "D(1,18.9668,11.2379,19.8021,11.2295,19.8044,11.4572,18.9687,11.4656)", + "span": { + "offset": 1374, + "length": 5 + } + }, + { + "content": "PART 4: TO BE FILLED IN BY SUPPLIER", + "source": "D(1,20.2568,11.0057,26.5827,10.8225,26.5899,11.0727,20.264,11.25)", + "span": { + "offset": 1389, + "length": 57 + } + }, + { + "content": "NATIONAL DRUG CODE", + "source": "D(1,22.9388,11.2829,26.2413,11.1973,26.2473,11.4262,22.9448,11.5127)", + "span": { + "offset": 1447, + "length": 18 + } + }, + { + "content": "NUMBER", + "source": "D(1,29.2725,10.7671,30.5328,10.736,30.5384,10.9648,29.2781,10.9958)", + "span": { + "offset": 1475, + "length": 6 + } + }, + { + "content": "SHIPPED", + "source": "D(1,29.2852,11.0891,30.5369,11.0702,30.5405,11.3092,29.2888,11.328)", + "span": { + "offset": 1482, + "length": 7 + } + }, + { + "content": "DATE", + "source": "D(1,31.3378,10.697,32.0989,10.6869,32.1021,10.9212,31.3409,10.9313)", + "span": { + "offset": 1499, + "length": 4 + } + }, + { + "content": "SHIPPED", + "source": "D(1,31.0971,11.0407,32.3731,11.0107,32.3789,11.2564,31.1028,11.2864)", + "span": { + "offset": 1504, + "length": 7 + } + }, + { + "content": "1", + "source": "D(1,1.7191,12.15,1.8531,12.149,1.8549,12.3968,1.7209,12.3978)", + "span": { + "offset": 1532, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.8585,12.1372,3.0528,12.1366,3.0537,12.4011,2.8594,12.4018)", + "span": { + "offset": 1543, + "length": 1 + } + }, + { + "content": "20.000", + "source": "D(1,4.6266,12.1073,6.0638,12.0937,6.0663,12.357,4.6291,12.3708)", + "span": { + "offset": 1554, + "length": 6 + } + }, + { + "content": "METHADONE HCL 10 MG TABLET TAB", + "source": "D(1,7.3064,12.0778,14.6661,11.947,14.6707,12.2041,7.311,12.3223)", + "span": { + "offset": 1570, + "length": 30 + } + }, + { + "content": "00054-0710-25", + "source": "D(1,20.5618,11.8333,23.703,11.7454,23.7108,12.0224,20.5695,12.1103)", + "span": { + "offset": 1650, + "length": 13 + } + }, + { + "content": "20", + "source": "D(1,29.2186,11.5698,30.006,11.5523,30.0162,12.0089,29.2287,12.0264)", + "span": { + "offset": 1753, + "length": 2 + } + }, + { + "content": "10-30-21", + "source": "D(1,30.7832,11.5878,32.885,11.5244,32.8984,11.9701,30.7966,12.0234)", + "span": { + "offset": 1765, + "length": 8 + } + }, + { + "content": "2", + "source": "D(1,1.7037,12.7382,1.8833,12.7374,1.8843,12.9895,1.7048,12.9903)", + "span": { + "offset": 1794, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.8545,12.7514,3.0626,12.7507,3.0635,13.0053,2.8554,13.006)", + "span": { + "offset": 1805, + "length": 1 + } + }, + { + "content": "10.000", + "source": "D(1,4.6504,12.7251,6.0766,12.7079,6.0798,12.9657,4.6535,12.9829)", + "span": { + "offset": 1816, + "length": 6 + } + }, + { + "content": "DEXMETHYLPHENIDATE ER 25 MG CP", + "source": "D(1,7.3215,12.6821,14.6597,12.5562,14.6641,12.8149,7.3259,12.9375)", + "span": { + "offset": 1832, + "length": 30 + } + }, + { + "content": "00115-1709-01", + "source": "D(1,20.5808,12.4327,23.7221,12.3658,23.7277,12.6308,20.5865,12.6976)", + "span": { + "offset": 1912, + "length": 13 + } + }, + { + "content": "10", + "source": "D(1,29.333,12.2954,29.8991,12.2864,29.9058,12.7117,29.3398,12.7207)", + "span": { + "offset": 2015, + "length": 2 + } + }, + { + "content": "0.30-23", + "source": "D(1,30.8169,12.182,32.6114,12.1417,32.6216,12.5943,30.827,12.6211)", + "span": { + "offset": 2027, + "length": 7 + } + }, + { + "content": "3", + "source": "D(1,1.715,13.3229,1.8951,13.3221,1.8962,13.5725,1.7161,13.5732)", + "span": { + "offset": 2055, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.8773,13.3717,3.0754,13.3709,3.0764,13.6249,2.8783,13.6257)", + "span": { + "offset": 2066, + "length": 1 + } + }, + { + "content": "90.000", + "source": "D(1,4.6677,13.3386,6.0737,13.3242,6.0765,13.581,4.6705,13.5963)", + "span": { + "offset": 2077, + "length": 6 + } + }, + { + "content": "CONCERTA ER 27 MG TABLET TAB E", + "source": "D(1,7.3679,13.2934,14.7048,13.1714,14.7091,13.4281,7.3722,13.5502)", + "span": { + "offset": 2093, + "length": 30 + } + }, + { + "content": "50458-0588-01", + "source": "D(1,20.5865,13.0393,23.7262,12.9825,23.7311,13.2521,20.5914,13.3088)", + "span": { + "offset": 2173, + "length": 13 + } + }, + { + "content": "90", + "source": "D(1,29.3425,12.8178,30.069,12.8069,30.0755,13.2373,29.349,13.2482)", + "span": { + "offset": 2276, + "length": 2 + } + }, + { + "content": "0-30-23", + "source": "D(1,30.8359,12.8189,32.7463,12.759,32.7601,13.1967,30.8496,13.2363)", + "span": { + "offset": 2288, + "length": 7 + } + }, + { + "content": "4", + "source": "D(1,1.7235,13.9254,1.9155,13.9247,1.9164,14.1728,1.7244,14.1735)", + "span": { + "offset": 2316, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.8882,13.9747,3.0803,13.974,3.0812,14.2476,2.889,14.2482)", + "span": { + "offset": 2327, + "length": 1 + } + }, + { + "content": "40.000", + "source": "D(1,4.6636,13.9401,6.0795,13.9295,6.0814,14.1902,4.6655,14.2008)", + "span": { + "offset": 2338, + "length": 6 + } + }, + { + "content": "MYDAYIS ER 25 MG CAPSULE CPTP", + "source": "D(1,7.3315,13.9035,14.4394,13.7812,14.4441,14.0389,7.3362,14.1654)", + "span": { + "offset": 2354, + "length": 29 + } + }, + { + "content": "54092-0471-01", + "source": "D(1,20.5968,13.6589,23.7302,13.6,23.7351,13.8582,20.6017,13.917)", + "span": { + "offset": 2433, + "length": 13 + } + }, + { + "content": "40", + "source": "D(1,29.4637,13.4277,30.1585,13.4124,30.1641,13.7817,29.4718,13.797)", + "span": { + "offset": 2536, + "length": 2 + } + }, + { + "content": "0 30-23", + "source": "D(1,30.9141,13.3701,32.8326,13.3188,32.8443,13.7565,30.9259,13.8078)", + "span": { + "offset": 2548, + "length": 7 + } + }, + { + "content": "5", + "source": "D(1,1.7481,14.5053,1.919,14.5049,1.9196,14.7581,1.7488,14.7585)", + "span": { + "offset": 2576, + "length": 1 + } + }, + { + "content": "6", + "source": "D(1,1.7419,15.118,1.934,15.1176,1.9344,15.3595,1.7423,15.3598)", + "span": { + "offset": 2778, + "length": 1 + } + }, + { + "content": "7", + "source": "D(1,1.7655,15.6882,1.9399,15.688,1.9402,15.9414,1.7657,15.9415)", + "span": { + "offset": 2980, + "length": 1 + } + }, + { + "content": "8", + "source": "D(1,1.774,16.2791,1.9605,16.2785,1.9614,16.5342,1.7749,16.5348)", + "span": { + "offset": 3182, + "length": 1 + } + }, + { + "content": "9", + "source": "D(1,1.7962,16.867,1.9755,16.8664,1.9763,17.1207,1.7969,17.1213)", + "span": { + "offset": 3384, + "length": 1 + } + }, + { + "content": "10", + "source": "D(1,1.7597,17.4485,2.0982,17.4446,2.1011,17.698,1.7626,17.7019)", + "span": { + "offset": 3586, + "length": 2 + } + }, + { + "content": "11", + "source": "D(1,1.7819,18.0226,2.0971,18.0176,2.1015,18.2837,1.7862,18.2888)", + "span": { + "offset": 3789, + "length": 2 + } + }, + { + "content": "12", + "source": "D(1,1.8036,18.6155,2.1423,18.6097,2.1445,18.8733,1.8081,18.8791)", + "span": { + "offset": 3992, + "length": 2 + } + }, + { + "content": "13", + "source": "D(1,1.8029,19.2189,2.1389,19.2111,2.1445,19.4677,1.8088,19.4754)", + "span": { + "offset": 4195, + "length": 2 + } + }, + { + "content": "14", + "source": "D(1,1.8105,19.8004,2.1465,19.794,2.1514,20.0513,1.8154,20.0577)", + "span": { + "offset": 4398, + "length": 2 + } + }, + { + "content": "15", + "source": "D(1,1.8105,20.3988,2.1481,20.3936,2.1519,20.6432,1.8126,20.6484)", + "span": { + "offset": 4601, + "length": 2 + } + }, + { + "content": "16", + "source": "D(1,1.8135,20.9862,2.1511,20.9804,2.1556,21.2417,1.818,21.2475)", + "span": { + "offset": 4804, + "length": 2 + } + }, + { + "content": "17", + "source": "D(1,1.8174,21.5762,2.1495,21.5688,2.1554,21.8369,1.8233,21.8442)", + "span": { + "offset": 5007, + "length": 2 + } + }, + { + "content": "18", + "source": "D(1,1.8105,22.1855,2.1364,22.1795,2.141,22.4332,1.8116,22.4392)", + "span": { + "offset": 5210, + "length": 2 + } + }, + { + "content": "19", + "source": "D(1,1.806,22.7638,2.1408,22.761,2.143,23.0282,1.8082,23.031)", + "span": { + "offset": 5413, + "length": 2 + } + }, + { + "content": "20", + "source": "D(1,1.7859,23.3815,2.136,23.3741,2.1414,23.629,1.7913,23.6364)", + "span": { + "offset": 5616, + "length": 2 + } + }, + { + "content": "4", + "source": "D(1,1.9591,24.5092,2.1365,24.5088,2.137,24.781,1.9596,24.7814)", + "span": { + "offset": 5819, + "length": 1 + } + }, + { + "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", + "source": "D(1,4.1267,24.2305,11.8064,24.1013,11.8114,24.398,4.1317,24.5271)", + "span": { + "offset": 5842, + "length": 40 + } + } + ] + } + ], + "paragraphs": [ + { + "content": "DEA FORM-222", + "source": "D(1,1.2589,1.4763,3.8915,1.3748,3.9024,1.6576,1.2698,1.7591)", + "span": { + "offset": 10, + "length": 12 + } + }, + { + "role": "title", + "content": "U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II DRUG ENFORCEMENT ADMINISTRATION", + "source": "D(1,12.2912,0.8412,21.174,0.6504,21.1888,1.3398,12.3061,1.5307)", + "span": { + "offset": 36, + "length": 78 + } + }, + { + "content": "OMB APPROVAL No. 1117-0010", + "source": "D(1,27.5155,0.5089,32.3035,0.481,32.305,0.7472,27.517,0.7751)", + "span": { + "offset": 116, + "length": 26 + } + }, + { + "content": "PURCHASER INFORMATION", + "source": "D(1,1.5409,3.6817,5.9527,3.5332,5.962,3.8081,1.5501,3.9566)", + "span": { + "offset": 144, + "length": 21 + } + }, + { + "content": "INMAR RX SOLUTIONS, INC 3845 GRAND LAKES WAY SUITE 125 GRAND PRAIRIE, TX 75050-0000", + "source": "D(1,1.475,4.3277,6.5307,4.2828,6.5432,5.6965,1.4875,5.7414)", + "span": { + "offset": 167, + "length": 83 + } + }, + { + "content": "REGISTRATION INFORMATION", + "source": "D(1,10.8015,3.4847,15.6909,3.3581,15.6976,3.6165,10.8082,3.7432)", + "span": { + "offset": 252, + "length": 24 + } + }, + { + "content": "REGISTRATION #, RR0191902", + "source": "D(1,10.8265,4.4051,15.5083,4.3014,15.5143,4.569,10.8324,4.6727)", + "span": { + "offset": 278, + "length": 25 + } + }, + { + "content": "REGISTERED AS: REVERSE DISTRIB SCHEDULES: 1,2,2N,3,3N,4,5, ORDER FORM NUMBER. 231454769", + "source": "D(1,10.843,4.8815,16.6407,4.7461,16.6696,5.9849,10.8719,6.1202)", + "span": { + "offset": 305, + "length": 87 + } + }, + { + "content": "DATE ISSUED. 09262023 ORDER FORM 3 OF 3", + "source": "D(1,10.8991,6.3295,14.7069,6.2605,14.7202,6.9966,10.9124,7.0656)", + "span": { + "offset": 394, + "length": 39 + } + }, + { + "content": "SUPPLIER DEA NUMBER:#", + "source": "D(1,20.24,3.3678,23.9095,3.3472,23.9108,3.574,20.2413,3.5945)", + "span": { + "offset": 435, + "length": 21 + } + }, + { + "content": "FA5718830", + "source": "D(1,26.1301,3.1061,32.1171,2.9997,32.1333,3.9123,26.1463,4.0187)", + "span": { + "offset": 458, + "length": 9 + } + }, + { + "content": "PART 2: TO BE FILLED IN BY PURCHASER CVS PHARMACY # 16800", + "source": "D(1,20.2685,4.3982,27.1032,4.2054,27.1209,4.8316,20.2862,5.0244)", + "span": { + "offset": 469, + "length": 57 + } + }, + { + "content": "BUSINESS NAME", + "source": "D(1,20.2808,5.1541,22.6034,5.1466,22.6041,5.3707,20.2815,5.3782)", + "span": { + "offset": 528, + "length": 13 + } + }, + { + "content": "4601 MONTGOMERY HWY STE 300", + "source": "D(1,20.4785,5.4479,28.5551,5.1692,28.567,5.5164,20.4896,5.748)", + "span": { + "offset": 543, + "length": 27 + } + }, + { + "content": "STREET ADDRESS", + "source": "D(1,20.3035,5.9935,22.8478,5.9653,22.8503,6.1899,20.306,6.2182)", + "span": { + "offset": 572, + "length": 14 + } + }, + { + "content": "DOTHAN, AL 36303", + "source": "D(1,20.4855,6.2226,24.9058,6.1081,24.9147,6.451,20.4944,6.5391)", + "span": { + "offset": 588, + "length": 16 + } + }, + { + "content": "CITY, STATE, ZIP CODE", + "source": "D(1,20.3234,6.8092,23.5333,6.757,23.5374,7.0084,20.3275,7.0606)", + "span": { + "offset": 606, + "length": 21 + } + }, + { + "content": "PART 1: TO BE FILLED IN BY PURCHASER", + "source": "D(1,1.3237,8.0784,8.2815,8.0073,8.2844,8.2885,1.3266,8.3496)", + "span": { + "offset": 629, + "length": 36 + } + }, + { + "content": "DIANA RUIZ DEA CLERK", + "source": "D(1,4.1951,8.7527,8.613,8.7447,8.6135,9.0691,4.1957,9.0771)", + "span": { + "offset": 667, + "length": 20 + } + }, + { + "content": "Print or Type Name and Title", + "source": "D(1,1.3327,9.4476,5.1039,9.429,5.1052,9.6959,1.334,9.7146)", + "span": { + "offset": 689, + "length": 28 + } + }, + { + "content": "Manuel", + "source": "D(1,1.636,9.5312,5.2101,9.5286,5.2107,10.3801,1.6366,10.3827)", + "span": { + "offset": 719, + "length": 6 + } + }, + { + "content": "by power of attorney 10/23/2023", + "source": "D(1,5.543,9.6508,14.5778,9.4461,14.5854,9.7838,5.5506,9.9885)", + "span": { + "offset": 727, + "length": 31 + } + }, + { + "content": "Signature of Requesting Official (must be authorized to sign order form)", + "source": "D(1,1.3356,10.4047,10.5526,10.296,10.5559,10.5788,1.339,10.6875)", + "span": { + "offset": 760, + "length": 72 + } + }, + { + "content": "Date", + "source": "D(1,12.017,10.253,12.612,10.2539,12.6117,10.4718,12.0167,10.471)", + "span": { + "offset": 834, + "length": 4 + } + }, + { + "content": "PART 5: TO BE FILLED IN BY PURCHASER", + "source": "D(1,17.1738,7.6289,20.0039,7.5937,20.0742,10.8457,17.2617,10.8809)", + "span": { + "offset": 870, + "length": 36 + } + }, + { + "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill", + "source": "D(1,20.0039,7.5937,32.6601,7.2246,32.6777,8.0859,20.0215,8.4727)", + "span": { + "offset": 916, + "length": 143 + } + }, + { + "content": "ALTERNATE DEA #", + "source": "D(1,20.0215,8.4727,32.6777,8.0859,32.6953,8.7539,20.0391,9.123)", + "span": { + "offset": 1080, + "length": 15 + } + }, + { + "content": "Signature- by first supplier Lingua. Drier 10-26-23\nOFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER\nDATE", + "source": "D(1,20.0391,9.123,32.6953,8.7539,32.748,10.4941,20.0742,10.8457)", + "span": { + "offset": 1116, + "length": 109 + } + }, + { + "content": "ITEM", + "source": "D(1,1.0997,11.1436,2.3534,11.1317,2.3534,11.9981,1.1217,12.01)", + "span": { + "offset": 1265, + "length": 4 + } + }, + { + "content": "NO OF PACKAGES", + "source": "D(1,2.3534,11.1317,4.421,11.108,4.443,11.9625,2.3534,11.9981)", + "span": { + "offset": 1279, + "length": 14 + } + }, + { + "content": "PACKAGE SIZE", + "source": "D(1,4.421,11.108,6.0487,11.0842,6.0707,11.9388,4.443,11.9625)", + "span": { + "offset": 1303, + "length": 12 + } + }, + { + "content": "NAME OF ITEM", + "source": "D(1,6.0487,11.0842,17.2224,10.8943,17.2444,11.7608,6.0707,11.9388)", + "span": { + "offset": 1325, + "length": 12 + } + }, + { + "content": "NUMBER REC'D", + "source": "D(1,17.2224,10.8943,18.6961,10.8706,18.7181,11.737,17.2444,11.7608)", + "span": { + "offset": 1347, + "length": 12 + } + }, + { + "content": "DATE REC'D", + "source": "D(1,18.6961,10.8706,20.0598,10.8469,20.0818,11.7133,18.7181,11.737)", + "span": { + "offset": 1369, + "length": 10 + } + }, + { + "content": "PART", + "source": "D(1,20.0598,10.8469,20.8957,10.8231,20.9177,11.7014,20.0818,11.7133)", + "span": { + "offset": 1389, + "length": 4 + } + }, + { + "content": "4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODE", + "source": "D(1,20.8957,10.8231,29.1,10.6451,29.122,11.5471,20.9177,11.7014)", + "span": { + "offset": 1416, + "length": 49 + } + }, + { + "content": "NUMBER SHIPPED", + "source": "D(1,29.1,10.6451,30.6177,10.6214,30.6397,11.5115,29.122,11.5471)", + "span": { + "offset": 1475, + "length": 14 + } + }, + { + "content": "DATE SHIPPED", + "source": "D(1,30.6177,10.6214,32.7293,10.5739,32.7733,11.4759,30.6397,11.5115)", + "span": { + "offset": 1499, + "length": 12 + } + }, + { + "content": "1", + "source": "D(1,1.1217,12.01,2.3534,11.9981,2.3754,12.6034,1.1437,12.6272)", + "span": { + "offset": 1532, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.3534,11.9981,4.443,11.9625,4.443,12.5678,2.3754,12.6034)", + "span": { + "offset": 1543, + "length": 1 + } + }, + { + "content": "20.000", + "source": "D(1,4.443,11.9625,6.0707,11.9388,6.0707,12.5322,4.443,12.5678)", + "span": { + "offset": 1554, + "length": 6 + } + }, + { + "content": "METHADONE HCL 10 MG TABLET TAB", + "source": "D(1,6.0707,11.9388,17.2444,11.7608,17.2664,12.3423,6.0707,12.5322)", + "span": { + "offset": 1570, + "length": 30 + } + }, + { + "content": "00054-0710-25", + "source": "D(1,21.6875,11.6777,22.5233,11.6658,22.5233,12.2474,21.6875,12.2592)", + "span": { + "offset": 1650, + "length": 13 + } + }, + { + "content": "20", + "source": "D(1,29.122,11.5471,30.6397,11.5115,30.6617,12.0931,29.144,12.1168)", + "span": { + "offset": 1753, + "length": 2 + } + }, + { + "content": "10-30-21", + "source": "D(1,30.6397,11.5115,32.7733,11.4759,32.7953,12.0575,30.6617,12.0931)", + "span": { + "offset": 1765, + "length": 8 + } + }, + { + "content": "2", + "source": "D(1,1.1437,12.6272,2.3754,12.6034,2.3754,13.185,1.1437,13.1969)", + "span": { + "offset": 1794, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.3754,12.6034,4.443,12.5678,4.465,13.1494,2.3754,13.185)", + "span": { + "offset": 1805, + "length": 1 + } + }, + { + "content": "10.000", + "source": "D(1,4.443,12.5678,6.0707,12.5322,6.0927,13.1257,4.465,13.1494)", + "span": { + "offset": 1816, + "length": 6 + } + }, + { + "content": "DEXMETHYLPHENIDATE ER 25 MG CP", + "source": "D(1,6.0707,12.5322,17.2664,12.3423,17.2884,12.9476,6.0927,13.1257)", + "span": { + "offset": 1832, + "length": 30 + } + }, + { + "content": "00115-1709-01", + "source": "D(1,21.6875,12.2592,22.5233,12.2474,22.5453,12.8527,21.7095,12.8645)", + "span": { + "offset": 1912, + "length": 13 + } + }, + { + "content": "10", + "source": "D(1,29.144,12.1168,30.6617,12.0931,30.6837,12.6984,29.166,12.7221)", + "span": { + "offset": 2015, + "length": 2 + } + }, + { + "content": "0.30-23", + "source": "D(1,30.6617,12.0931,32.7953,12.0575,32.8173,12.6509,30.6837,12.6984)", + "span": { + "offset": 2027, + "length": 7 + } + }, + { + "content": "3", + "source": "D(1,1.1437,13.1969,2.3754,13.185,2.3754,13.7784,1.1657,13.8022)", + "span": { + "offset": 2055, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.3754,13.185,4.465,13.1494,4.465,13.7428,2.3754,13.7784)", + "span": { + "offset": 2066, + "length": 1 + } + }, + { + "content": "90.000", + "source": "D(1,4.465,13.1494,6.0927,13.1257,6.0927,13.7072,4.465,13.7428)", + "span": { + "offset": 2077, + "length": 6 + } + }, + { + "content": "CONCERTA ER 27 MG TABLET TAB E", + "source": "D(1,6.0927,13.1257,17.2884,12.9476,17.2884,13.5292,6.0927,13.7072)", + "span": { + "offset": 2093, + "length": 30 + } + }, + { + "content": "50458-0588-01", + "source": "D(1,21.7095,12.8645,22.5453,12.8527,22.5453,13.4461,21.7095,13.458)", + "span": { + "offset": 2173, + "length": 13 + } + }, + { + "content": "90", + "source": "D(1,29.166,12.7221,30.6837,12.6984,30.7057,13.2918,29.188,13.3155)", + "span": { + "offset": 2276, + "length": 2 + } + }, + { + "content": "0-30-23", + "source": "D(1,30.6837,12.6984,32.8173,12.6509,32.8392,13.2443,30.7057,13.2918)", + "span": { + "offset": 2288, + "length": 7 + } + }, + { + "content": "4", + "source": "D(1,1.1657,13.8022,2.3754,13.7784,2.3974,14.36,1.1877,14.3837)", + "span": { + "offset": 2316, + "length": 1 + } + }, + { + "content": "1", + "source": "D(1,2.3754,13.7784,4.465,13.7428,4.487,14.3363,2.3974,14.36)", + "span": { + "offset": 2327, + "length": 1 + } + }, + { + "content": "40.000", + "source": "D(1,4.465,13.7428,6.0927,13.7072,6.0927,14.3006,4.487,14.3363)", + "span": { + "offset": 2338, + "length": 6 + } + }, + { + "content": "MYDAYIS ER 25 MG CAPSULE CPTP", + "source": "D(1,6.0927,13.7072,17.2884,13.5292,17.3104,14.1107,6.0927,14.3006)", + "span": { + "offset": 2354, + "length": 29 + } + }, + { + "content": "54092-0471-01", + "source": "D(1,21.7095,13.458,22.5453,13.4461,22.5673,14.0277,21.7315,14.0395)", + "span": { + "offset": 2433, + "length": 13 + } + }, + { + "content": "40", + "source": "D(1,29.188,13.3155,30.7057,13.2918,30.7277,13.8852,29.21,13.909)", + "span": { + "offset": 2536, + "length": 2 + } + }, + { + "content": "0 30-23", + "source": "D(1,30.7057,13.2918,32.8392,13.2443,32.8612,13.8496,30.7277,13.8852)", + "span": { + "offset": 2548, + "length": 7 + } + }, + { + "content": "5", + "source": "D(1,1.1877,14.3837,2.3974,14.36,2.3974,14.9653,1.1877,14.9772)", + "span": { + "offset": 2576, + "length": 1 + } + }, + { + "content": "6", + "source": "D(1,1.1877,14.9772,2.3974,14.9653,2.4194,15.5469,1.2097,15.5706)", + "span": { + "offset": 2778, + "length": 1 + } + }, + { + "content": "7", + "source": "D(1,1.2097,15.5706,2.4194,15.5469,2.4194,16.1403,1.2097,16.164)", + "span": { + "offset": 2980, + "length": 1 + } + }, + { + "content": "8", + "source": "D(1,1.2097,16.164,2.4194,16.1403,2.4194,16.7218,1.2317,16.7456)", + "span": { + "offset": 3182, + "length": 1 + } + }, + { + "content": "9", + "source": "D(1,1.2317,16.7456,2.4194,16.7218,2.4414,17.3034,1.2537,17.3153)", + "span": { + "offset": 3384, + "length": 1 + } + }, + { + "content": "10", + "source": "D(1,1.2537,17.3153,2.4414,17.3034,2.4414,17.8731,1.2537,17.8968)", + "span": { + "offset": 3586, + "length": 2 + } + }, + { + "content": "11", + "source": "D(1,1.2537,17.8968,2.4414,17.8731,2.4414,18.4784,1.2756,18.4903)", + "span": { + "offset": 3789, + "length": 2 + } + }, + { + "content": "12", + "source": "D(1,1.2756,18.4903,2.4414,18.4784,2.4634,19.0481,1.2756,19.0718)", + "span": { + "offset": 3992, + "length": 2 + } + }, + { + "content": "13", + "source": "D(1,1.2756,19.0718,2.4634,19.0481,2.4634,19.6534,1.2976,19.6771)", + "span": { + "offset": 4195, + "length": 2 + } + }, + { + "content": "14", + "source": "D(1,1.2976,19.6771,2.4634,19.6534,2.4634,20.2468,1.2976,20.2706)", + "span": { + "offset": 4398, + "length": 2 + } + }, + { + "content": "15", + "source": "D(1,1.2976,20.2706,2.4634,20.2468,2.4854,20.8521,1.3196,20.8759)", + "span": { + "offset": 4601, + "length": 2 + } + }, + { + "content": "16", + "source": "D(1,1.3196,20.8759,2.4854,20.8521,2.4854,21.4456,1.3416,21.4693)", + "span": { + "offset": 4804, + "length": 2 + } + }, + { + "content": "17", + "source": "D(1,1.3416,21.4693,2.4854,21.4456,2.4854,22.039,1.3416,22.0627)", + "span": { + "offset": 5007, + "length": 2 + } + }, + { + "content": "18", + "source": "D(1,1.3416,22.0627,2.4854,22.039,2.5074,22.6324,1.3636,22.6562)", + "span": { + "offset": 5210, + "length": 2 + } + }, + { + "content": "19", + "source": "D(1,1.3636,22.6562,2.5074,22.6324,2.5074,23.2259,1.3636,23.2496)", + "span": { + "offset": 5413, + "length": 2 + } + }, + { + "content": "20", + "source": "D(1,1.3636,23.2496,2.5074,23.2259,2.5074,23.8312,1.3856,23.843)", + "span": { + "offset": 5616, + "length": 2 + } + }, + { + "content": "4", + "source": "D(1,1.3856,23.843,2.5074,23.8312,2.5294,24.7332,1.4076,24.7451)", + "span": { + "offset": 5819, + "length": 1 + } + }, + { + "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", + "source": "D(1,2.5074,23.8312,17.5523,23.6175,17.5743,24.5077,2.5294,24.7332)", + "span": { + "offset": 5842, + "length": 40 + } + } + ], + "sections": [ + { + "span": { + "offset": 0, + "length": 5955 + }, + "elements": [ + "/sections/1", + "/sections/2" + ] + }, + { + "span": { + "offset": 0, + "length": 33 + }, + "elements": [ + "/figures/0" + ] + }, + { + "span": { + "offset": 36, + "length": 5919 + }, + "elements": [ + "/paragraphs/1", + "/paragraphs/2", + "/paragraphs/3", + "/paragraphs/4", + "/paragraphs/5", + "/paragraphs/6", + "/paragraphs/7", + "/paragraphs/8", + "/paragraphs/9", + "/paragraphs/10", + "/paragraphs/11", + "/paragraphs/12", + "/paragraphs/13", + "/paragraphs/14", + "/paragraphs/15", + "/paragraphs/16", + "/paragraphs/17", + "/paragraphs/18", + "/paragraphs/19", + "/paragraphs/20", + "/paragraphs/21", + "/paragraphs/22", + "/paragraphs/23", + "/tables/0", + "/tables/1" + ] + } + ], + "tables": [ + { + "rowCount": 3, + "columnCount": 2, + "cells": [ + { + "kind": "content", + "rowIndex": 0, + "columnIndex": 0, + "rowSpan": 3, + "columnSpan": 1, + "content": "PART 5: TO BE FILLED IN BY PURCHASER", + "source": "D(1,17.1738,7.6289,20.0039,7.5937,20.0742,10.8457,17.2617,10.8809)", + "span": { + "offset": 870, + "length": 36 + }, + "elements": [ + "/paragraphs/24" + ] + }, + { + "kind": "content", + "rowIndex": 0, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill", + "source": "D(1,20.0039,7.5937,32.6601,7.2246,32.6777,8.0859,20.0215,8.4727)", + "span": { + "offset": 916, + "length": 143 + }, + "elements": [ + "/paragraphs/25" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "ALTERNATE DEA #", + "source": "D(1,20.0215,8.4727,32.6777,8.0859,32.6953,8.7539,20.0391,9.123)", + "span": { + "offset": 1080, + "length": 15 + }, + "elements": [ + "/paragraphs/26" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "Signature- by first supplier Lingua. Drier 10-26-23\nOFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER\nDATE", + "source": "D(1,20.0391,9.123,32.6953,8.7539,32.748,10.4941,20.0742,10.8457)", + "span": { + "offset": 1116, + "length": 109 + }, + "elements": [ + "/paragraphs/27" + ] + } + ], + "source": "D(1,17.1222,7.7084,32.5673,7.6671,32.628,10.8546,17.1742,10.8955)", + "span": { + "offset": 841, + "length": 404 + } + }, + { + "rowCount": 22, + "columnCount": 19, + "cells": [ + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "ITEM", + "source": "D(1,1.0997,11.1436,2.3534,11.1317,2.3534,11.9981,1.1217,12.01)", + "span": { + "offset": 1265, + "length": 4 + }, + "elements": [ + "/paragraphs/28" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "NO OF PACKAGES", + "source": "D(1,2.3534,11.1317,4.421,11.108,4.443,11.9625,2.3534,11.9981)", + "span": { + "offset": 1279, + "length": 14 + }, + "elements": [ + "/paragraphs/29" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "PACKAGE SIZE", + "source": "D(1,4.421,11.108,6.0487,11.0842,6.0707,11.9388,4.443,11.9625)", + "span": { + "offset": 1303, + "length": 12 + }, + "elements": [ + "/paragraphs/30" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "NAME OF ITEM", + "source": "D(1,6.0487,11.0842,17.2224,10.8943,17.2444,11.7608,6.0707,11.9388)", + "span": { + "offset": 1325, + "length": 12 + }, + "elements": [ + "/paragraphs/31" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "NUMBER REC'D", + "source": "D(1,17.2224,10.8943,18.6961,10.8706,18.7181,11.737,17.2444,11.7608)", + "span": { + "offset": 1347, + "length": 12 + }, + "elements": [ + "/paragraphs/32" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "DATE REC'D", + "source": "D(1,18.6961,10.8706,20.0598,10.8469,20.0818,11.7133,18.7181,11.737)", + "span": { + "offset": 1369, + "length": 10 + }, + "elements": [ + "/paragraphs/33" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "PART", + "source": "D(1,20.0598,10.8469,20.8957,10.8231,20.9177,11.7014,20.0818,11.7133)", + "span": { + "offset": 1389, + "length": 4 + }, + "elements": [ + "/paragraphs/34" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 10, + "content": "4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODE", + "source": "D(1,20.8957,10.8231,29.1,10.6451,29.122,11.5471,20.9177,11.7014)", + "span": { + "offset": 1416, + "length": 49 + }, + "elements": [ + "/paragraphs/35" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "NUMBER SHIPPED", + "source": "D(1,29.1,10.6451,30.6177,10.6214,30.6397,11.5115,29.122,11.5471)", + "span": { + "offset": 1475, + "length": 14 + }, + "elements": [ + "/paragraphs/36" + ] + }, + { + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "DATE SHIPPED", + "source": "D(1,30.6177,10.6214,32.7293,10.5739,32.7733,11.4759,30.6397,11.5115)", + "span": { + "offset": 1499, + "length": 12 + }, + "elements": [ + "/paragraphs/37" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "1", + "source": "D(1,1.1217,12.01,2.3534,11.9981,2.3754,12.6034,1.1437,12.6272)", + "span": { + "offset": 1532, + "length": 1 + }, + "elements": [ + "/paragraphs/38" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "1", + "source": "D(1,2.3534,11.9981,4.443,11.9625,4.443,12.5678,2.3754,12.6034)", + "span": { + "offset": 1543, + "length": 1 + }, + "elements": [ + "/paragraphs/39" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "20.000", + "source": "D(1,4.443,11.9625,6.0707,11.9388,6.0707,12.5322,4.443,12.5678)", + "span": { + "offset": 1554, + "length": 6 + }, + "elements": [ + "/paragraphs/40" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "METHADONE HCL 10 MG TABLET TAB", + "source": "D(1,6.0707,11.9388,17.2444,11.7608,17.2664,12.3423,6.0707,12.5322)", + "span": { + "offset": 1570, + "length": 30 + }, + "elements": [ + "/paragraphs/41" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.2444,11.7608,18.7181,11.737,18.7181,12.3186,17.2664,12.3423)", + "span": { + "offset": 1610, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7181,11.737,20.0818,11.7133,20.1038,12.283,18.7181,12.3186)", + "span": { + "offset": 1620, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.0818,11.7133,20.9177,11.7014,20.9397,12.2711,20.1038,12.283)", + "span": { + "offset": 1630, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9177,11.7014,21.6875,11.6777,21.6875,12.2592,20.9397,12.2711)", + "span": { + "offset": 1640, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "00054-0710-25", + "source": "D(1,21.6875,11.6777,22.5233,11.6658,22.5233,12.2474,21.6875,12.2592)", + "span": { + "offset": 1650, + "length": 13 + }, + "elements": [ + "/paragraphs/42" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5233,11.6658,23.2932,11.6539,23.2932,12.2236,22.5233,12.2474)", + "span": { + "offset": 1673, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.2932,11.6539,24.107,11.6421,24.129,12.2118,23.2932,12.2236)", + "span": { + "offset": 1683, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.107,11.6421,24.9648,11.6183,24.9648,12.1999,24.129,12.2118)", + "span": { + "offset": 1693, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.9648,11.6183,25.7347,11.6065,25.7567,12.188,24.9648,12.1999)", + "span": { + "offset": 1703, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.7347,11.6065,26.6365,11.5946,26.6585,12.1643,25.7567,12.188)", + "span": { + "offset": 1713, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.6365,11.5946,27.4063,11.5709,27.4284,12.1524,26.6585,12.1643)", + "span": { + "offset": 1723, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.4063,11.5709,28.2862,11.559,28.3082,12.1406,27.4284,12.1524)", + "span": { + "offset": 1733, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.2862,11.559,29.122,11.5471,29.144,12.1168,28.3082,12.1406)", + "span": { + "offset": 1743, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "20", + "source": "D(1,29.122,11.5471,30.6397,11.5115,30.6617,12.0931,29.144,12.1168)", + "span": { + "offset": 1753, + "length": 2 + }, + "elements": [ + "/paragraphs/43" + ] + }, + { + "kind": "content", + "rowIndex": 1, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "10-30-21", + "source": "D(1,30.6397,11.5115,32.7733,11.4759,32.7953,12.0575,30.6617,12.0931)", + "span": { + "offset": 1765, + "length": 8 + }, + "elements": [ + "/paragraphs/44" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "2", + "source": "D(1,1.1437,12.6272,2.3754,12.6034,2.3754,13.185,1.1437,13.1969)", + "span": { + "offset": 1794, + "length": 1 + }, + "elements": [ + "/paragraphs/45" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "1", + "source": "D(1,2.3754,12.6034,4.443,12.5678,4.465,13.1494,2.3754,13.185)", + "span": { + "offset": 1805, + "length": 1 + }, + "elements": [ + "/paragraphs/46" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "10.000", + "source": "D(1,4.443,12.5678,6.0707,12.5322,6.0927,13.1257,4.465,13.1494)", + "span": { + "offset": 1816, + "length": 6 + }, + "elements": [ + "/paragraphs/47" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "DEXMETHYLPHENIDATE ER 25 MG CP", + "source": "D(1,6.0707,12.5322,17.2664,12.3423,17.2884,12.9476,6.0927,13.1257)", + "span": { + "offset": 1832, + "length": 30 + }, + "elements": [ + "/paragraphs/48" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.2664,12.3423,18.7181,12.3186,18.7401,12.9239,17.2884,12.9476)", + "span": { + "offset": 1872, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7181,12.3186,20.1038,12.283,20.1038,12.9001,18.7401,12.9239)", + "span": { + "offset": 1882, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1038,12.283,20.9397,12.2711,20.9397,12.8883,20.1038,12.9001)", + "span": { + "offset": 1892, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9397,12.2711,21.6875,12.2592,21.7095,12.8645,20.9397,12.8883)", + "span": { + "offset": 1902, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "00115-1709-01", + "source": "D(1,21.6875,12.2592,22.5233,12.2474,22.5453,12.8527,21.7095,12.8645)", + "span": { + "offset": 1912, + "length": 13 + }, + "elements": [ + "/paragraphs/49" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5233,12.2474,23.2932,12.2236,23.3152,12.8289,22.5453,12.8527)", + "span": { + "offset": 1935, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.2932,12.2236,24.129,12.2118,24.151,12.8171,23.3152,12.8289)", + "span": { + "offset": 1945, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.129,12.2118,24.9648,12.1999,24.9868,12.7933,24.151,12.8171)", + "span": { + "offset": 1955, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.9648,12.1999,25.7567,12.188,25.7787,12.7815,24.9868,12.7933)", + "span": { + "offset": 1965, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.7567,12.188,26.6585,12.1643,26.6805,12.7696,25.7787,12.7815)", + "span": { + "offset": 1975, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.6585,12.1643,27.4284,12.1524,27.4503,12.7577,26.6805,12.7696)", + "span": { + "offset": 1985, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.4284,12.1524,28.3082,12.1406,28.3302,12.734,27.4503,12.7577)", + "span": { + "offset": 1995, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3082,12.1406,29.144,12.1168,29.166,12.7221,28.3302,12.734)", + "span": { + "offset": 2005, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "10", + "source": "D(1,29.144,12.1168,30.6617,12.0931,30.6837,12.6984,29.166,12.7221)", + "span": { + "offset": 2015, + "length": 2 + }, + "elements": [ + "/paragraphs/50" + ] + }, + { + "kind": "content", + "rowIndex": 2, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "0.30-23", + "source": "D(1,30.6617,12.0931,32.7953,12.0575,32.8173,12.6509,30.6837,12.6984)", + "span": { + "offset": 2027, + "length": 7 + }, + "elements": [ + "/paragraphs/51" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "3", + "source": "D(1,1.1437,13.1969,2.3754,13.185,2.3754,13.7784,1.1657,13.8022)", + "span": { + "offset": 2055, + "length": 1 + }, + "elements": [ + "/paragraphs/52" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "1", + "source": "D(1,2.3754,13.185,4.465,13.1494,4.465,13.7428,2.3754,13.7784)", + "span": { + "offset": 2066, + "length": 1 + }, + "elements": [ + "/paragraphs/53" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "90.000", + "source": "D(1,4.465,13.1494,6.0927,13.1257,6.0927,13.7072,4.465,13.7428)", + "span": { + "offset": 2077, + "length": 6 + }, + "elements": [ + "/paragraphs/54" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "CONCERTA ER 27 MG TABLET TAB E", + "source": "D(1,6.0927,13.1257,17.2884,12.9476,17.2884,13.5292,6.0927,13.7072)", + "span": { + "offset": 2093, + "length": 30 + }, + "elements": [ + "/paragraphs/55" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.2884,12.9476,18.7401,12.9239,18.7401,13.5054,17.2884,13.5292)", + "span": { + "offset": 2133, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7401,12.9239,20.1038,12.9001,20.1258,13.4817,18.7401,13.5054)", + "span": { + "offset": 2143, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1038,12.9001,20.9397,12.8883,20.9617,13.4698,20.1258,13.4817)", + "span": { + "offset": 2153, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9397,12.8883,21.7095,12.8645,21.7095,13.458,20.9617,13.4698)", + "span": { + "offset": 2163, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "50458-0588-01", + "source": "D(1,21.7095,12.8645,22.5453,12.8527,22.5453,13.4461,21.7095,13.458)", + "span": { + "offset": 2173, + "length": 13 + }, + "elements": [ + "/paragraphs/56" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5453,12.8527,23.3152,12.8289,23.3372,13.4224,22.5453,13.4461)", + "span": { + "offset": 2196, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.3152,12.8289,24.151,12.8171,24.173,13.4105,23.3372,13.4224)", + "span": { + "offset": 2206, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.151,12.8171,24.9868,12.7933,25.0088,13.3986,24.173,13.4105)", + "span": { + "offset": 2216, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.9868,12.7933,25.7787,12.7815,25.8007,13.3868,25.0088,13.3986)", + "span": { + "offset": 2226, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.7787,12.7815,26.6805,12.7696,26.7025,13.363,25.8007,13.3868)", + "span": { + "offset": 2236, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.6805,12.7696,27.4503,12.7577,27.4723,13.3512,26.7025,13.363)", + "span": { + "offset": 2246, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.4503,12.7577,28.3302,12.734,28.3522,13.3393,27.4723,13.3512)", + "span": { + "offset": 2256, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3302,12.734,29.166,12.7221,29.188,13.3155,28.3522,13.3393)", + "span": { + "offset": 2266, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "90", + "source": "D(1,29.166,12.7221,30.6837,12.6984,30.7057,13.2918,29.188,13.3155)", + "span": { + "offset": 2276, + "length": 2 + }, + "elements": [ + "/paragraphs/57" + ] + }, + { + "kind": "content", + "rowIndex": 3, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "0-30-23", + "source": "D(1,30.6837,12.6984,32.8173,12.6509,32.8392,13.2443,30.7057,13.2918)", + "span": { + "offset": 2288, + "length": 7 + }, + "elements": [ + "/paragraphs/58" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "4", + "source": "D(1,1.1657,13.8022,2.3754,13.7784,2.3974,14.36,1.1877,14.3837)", + "span": { + "offset": 2316, + "length": 1 + }, + "elements": [ + "/paragraphs/59" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "1", + "source": "D(1,2.3754,13.7784,4.465,13.7428,4.487,14.3363,2.3974,14.36)", + "span": { + "offset": 2327, + "length": 1 + }, + "elements": [ + "/paragraphs/60" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "40.000", + "source": "D(1,4.465,13.7428,6.0927,13.7072,6.0927,14.3006,4.487,14.3363)", + "span": { + "offset": 2338, + "length": 6 + }, + "elements": [ + "/paragraphs/61" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "MYDAYIS ER 25 MG CAPSULE CPTP", + "source": "D(1,6.0927,13.7072,17.2884,13.5292,17.3104,14.1107,6.0927,14.3006)", + "span": { + "offset": 2354, + "length": 29 + }, + "elements": [ + "/paragraphs/62" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.2884,13.5292,18.7401,13.5054,18.7621,14.087,17.3104,14.1107)", + "span": { + "offset": 2393, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7401,13.5054,20.1258,13.4817,20.1258,14.0633,18.7621,14.087)", + "span": { + "offset": 2403, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1258,13.4817,20.9617,13.4698,20.9617,14.0514,20.1258,14.0633)", + "span": { + "offset": 2413, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9617,13.4698,21.7095,13.458,21.7315,14.0395,20.9617,14.0514)", + "span": { + "offset": 2423, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "54092-0471-01", + "source": "D(1,21.7095,13.458,22.5453,13.4461,22.5673,14.0277,21.7315,14.0395)", + "span": { + "offset": 2433, + "length": 13 + }, + "elements": [ + "/paragraphs/63" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5453,13.4461,23.3372,13.4224,23.3592,14.0039,22.5673,14.0277)", + "span": { + "offset": 2456, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.3372,13.4224,24.173,13.4105,24.195,13.9921,23.3592,14.0039)", + "span": { + "offset": 2466, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.173,13.4105,25.0088,13.3986,25.0308,13.9802,24.195,13.9921)", + "span": { + "offset": 2476, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.0088,13.3986,25.8007,13.3868,25.8227,13.9683,25.0308,13.9802)", + "span": { + "offset": 2486, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8007,13.3868,26.7025,13.363,26.7245,13.9565,25.8227,13.9683)", + "span": { + "offset": 2496, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7025,13.363,27.4723,13.3512,27.4943,13.9446,26.7245,13.9565)", + "span": { + "offset": 2506, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.4723,13.3512,28.3522,13.3393,28.3742,13.9327,27.4943,13.9446)", + "span": { + "offset": 2516, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3522,13.3393,29.188,13.3155,29.21,13.909,28.3742,13.9327)", + "span": { + "offset": 2526, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "40", + "source": "D(1,29.188,13.3155,30.7057,13.2918,30.7277,13.8852,29.21,13.909)", + "span": { + "offset": 2536, + "length": 2 + }, + "elements": [ + "/paragraphs/64" + ] + }, + { + "kind": "content", + "rowIndex": 4, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "0 30-23", + "source": "D(1,30.7057,13.2918,32.8392,13.2443,32.8612,13.8496,30.7277,13.8852)", + "span": { + "offset": 2548, + "length": 7 + }, + "elements": [ + "/paragraphs/65" + ] + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "5", + "source": "D(1,1.1877,14.3837,2.3974,14.36,2.3974,14.9653,1.1877,14.9772)", + "span": { + "offset": 2576, + "length": 1 + }, + "elements": [ + "/paragraphs/66" + ] + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.3974,14.36,4.487,14.3363,4.487,14.9297,2.3974,14.9653)", + "span": { + "offset": 2587, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.487,14.3363,6.0927,14.3006,6.1147,14.9059,4.487,14.9297)", + "span": { + "offset": 2597, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.0927,14.3006,17.3104,14.1107,17.3324,14.716,6.1147,14.9059)", + "span": { + "offset": 2607, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3104,14.1107,18.7621,14.087,18.7621,14.7042,17.3324,14.716)", + "span": { + "offset": 2617, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7621,14.087,20.1258,14.0633,20.1478,14.6804,18.7621,14.7042)", + "span": { + "offset": 2627, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1258,14.0633,20.9617,14.0514,20.9837,14.6686,20.1478,14.6804)", + "span": { + "offset": 2637, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9617,14.0514,21.7315,14.0395,21.7535,14.6448,20.9837,14.6686)", + "span": { + "offset": 2647, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7315,14.0395,22.5673,14.0277,22.5893,14.633,21.7535,14.6448)", + "span": { + "offset": 2657, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5673,14.0277,23.3592,14.0039,23.3812,14.6211,22.5893,14.633)", + "span": { + "offset": 2667, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.3592,14.0039,24.195,13.9921,24.217,14.6092,23.3812,14.6211)", + "span": { + "offset": 2677, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.195,13.9921,25.0308,13.9802,25.0528,14.5855,24.217,14.6092)", + "span": { + "offset": 2687, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.0308,13.9802,25.8227,13.9683,25.8227,14.5736,25.0528,14.5855)", + "span": { + "offset": 2697, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8227,13.9683,26.7245,13.9565,26.7465,14.5618,25.8227,14.5736)", + "span": { + "offset": 2707, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7245,13.9565,27.4943,13.9446,27.5163,14.538,26.7465,14.5618)", + "span": { + "offset": 2717, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.4943,13.9446,28.3742,13.9327,28.3742,14.5261,27.5163,14.538)", + "span": { + "offset": 2727, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3742,13.9327,29.21,13.909,29.232,14.5143,28.3742,14.5261)", + "span": { + "offset": 2737, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.21,13.909,30.7277,13.8852,30.7497,14.4787,29.232,14.5143)", + "span": { + "offset": 2747, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 5, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.7277,13.8852,32.8612,13.8496,32.8832,14.4431,30.7497,14.4787)", + "span": { + "offset": 2757, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "6", + "source": "D(1,1.1877,14.9772,2.3974,14.9653,2.4194,15.5469,1.2097,15.5706)", + "span": { + "offset": 2778, + "length": 1 + }, + "elements": [ + "/paragraphs/67" + ] + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.3974,14.9653,4.487,14.9297,4.509,15.5112,2.4194,15.5469)", + "span": { + "offset": 2789, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.487,14.9297,6.1147,14.9059,6.1147,15.4875,4.509,15.5112)", + "span": { + "offset": 2799, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1147,14.9059,17.3324,14.716,17.3324,15.3213,6.1147,15.4875)", + "span": { + "offset": 2809, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3324,14.716,18.7621,14.7042,18.7841,15.2976,17.3324,15.3213)", + "span": { + "offset": 2819, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7621,14.7042,20.1478,14.6804,20.1478,15.2739,18.7841,15.2976)", + "span": { + "offset": 2829, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1478,14.6804,20.9837,14.6686,20.9837,15.262,20.1478,15.2739)", + "span": { + "offset": 2839, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9837,14.6686,21.7535,14.6448,21.7535,15.2501,20.9837,15.262)", + "span": { + "offset": 2849, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7535,14.6448,22.5893,14.633,22.5893,15.2383,21.7535,15.2501)", + "span": { + "offset": 2859, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5893,14.633,23.3812,14.6211,23.4032,15.2145,22.5893,15.2383)", + "span": { + "offset": 2869, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.3812,14.6211,24.217,14.6092,24.217,15.2027,23.4032,15.2145)", + "span": { + "offset": 2879, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.217,14.6092,25.0528,14.5855,25.0748,15.1908,24.217,15.2027)", + "span": { + "offset": 2889, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.0528,14.5855,25.8227,14.5736,25.8447,15.1789,25.0748,15.1908)", + "span": { + "offset": 2899, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8227,14.5736,26.7465,14.5618,26.7465,15.1552,25.8447,15.1789)", + "span": { + "offset": 2909, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7465,14.5618,27.5163,14.538,27.5163,15.1433,26.7465,15.1552)", + "span": { + "offset": 2919, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.5163,14.538,28.3742,14.5261,28.3962,15.1314,27.5163,15.1433)", + "span": { + "offset": 2929, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3742,14.5261,29.232,14.5143,29.254,15.1077,28.3962,15.1314)", + "span": { + "offset": 2939, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.232,14.5143,30.7497,14.4787,30.7717,15.084,29.254,15.1077)", + "span": { + "offset": 2949, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 6, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.7497,14.4787,32.8832,14.4431,32.9052,15.0365,30.7717,15.084)", + "span": { + "offset": 2959, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "7", + "source": "D(1,1.2097,15.5706,2.4194,15.5469,2.4194,16.1403,1.2097,16.164)", + "span": { + "offset": 2980, + "length": 1 + }, + "elements": [ + "/paragraphs/68" + ] + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4194,15.5469,4.509,15.5112,4.509,16.1047,2.4194,16.1403)", + "span": { + "offset": 2991, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.509,15.5112,6.1147,15.4875,6.1367,16.0809,4.509,16.1047)", + "span": { + "offset": 3001, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1147,15.4875,17.3324,15.3213,17.3544,15.9148,6.1367,16.0809)", + "span": { + "offset": 3011, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3324,15.3213,18.7841,15.2976,18.7841,15.891,17.3544,15.9148)", + "span": { + "offset": 3021, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7841,15.2976,20.1478,15.2739,20.1698,15.8673,18.7841,15.891)", + "span": { + "offset": 3031, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1478,15.2739,20.9837,15.262,21.0056,15.8554,20.1698,15.8673)", + "span": { + "offset": 3041, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.9837,15.262,21.7535,15.2501,21.7755,15.8436,21.0056,15.8554)", + "span": { + "offset": 3051, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7535,15.2501,22.5893,15.2383,22.6113,15.8317,21.7755,15.8436)", + "span": { + "offset": 3061, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.5893,15.2383,23.4032,15.2145,23.4252,15.808,22.6113,15.8317)", + "span": { + "offset": 3071, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4032,15.2145,24.217,15.2027,24.239,15.7961,23.4252,15.808)", + "span": { + "offset": 3081, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.217,15.2027,25.0748,15.1908,25.0968,15.7842,24.239,15.7961)", + "span": { + "offset": 3091, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.0748,15.1908,25.8447,15.1789,25.8667,15.7724,25.0968,15.7842)", + "span": { + "offset": 3101, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8447,15.1789,26.7465,15.1552,26.7685,15.7486,25.8667,15.7724)", + "span": { + "offset": 3111, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7465,15.1552,27.5163,15.1433,27.5383,15.7368,26.7685,15.7486)", + "span": { + "offset": 3121, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.5163,15.1433,28.3962,15.1314,28.4181,15.7249,27.5383,15.7368)", + "span": { + "offset": 3131, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.3962,15.1314,29.254,15.1077,29.276,15.7011,28.4181,15.7249)", + "span": { + "offset": 3141, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.254,15.1077,30.7717,15.084,30.7937,15.6774,29.276,15.7011)", + "span": { + "offset": 3151, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 7, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.7717,15.084,32.9052,15.0365,32.9272,15.6418,30.7937,15.6774)", + "span": { + "offset": 3161, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "8", + "source": "D(1,1.2097,16.164,2.4194,16.1403,2.4194,16.7218,1.2317,16.7456)", + "span": { + "offset": 3182, + "length": 1 + }, + "elements": [ + "/paragraphs/69" + ] + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4194,16.1403,4.509,16.1047,4.531,16.6862,2.4194,16.7218)", + "span": { + "offset": 3193, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.509,16.1047,6.1367,16.0809,6.1367,16.6506,4.531,16.6862)", + "span": { + "offset": 3203, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1367,16.0809,17.3544,15.9148,17.3764,16.4726,6.1367,16.6506)", + "span": { + "offset": 3213, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3544,15.9148,18.7841,15.891,18.8061,16.4489,17.3764,16.4726)", + "span": { + "offset": 3223, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.7841,15.891,20.1698,15.8673,20.1918,16.437,18.8061,16.4489)", + "span": { + "offset": 3233, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1698,15.8673,21.0056,15.8554,21.0056,16.4251,20.1918,16.437)", + "span": { + "offset": 3243, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0056,15.8554,21.7755,15.8436,21.7975,16.4133,21.0056,16.4251)", + "span": { + "offset": 3253, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7755,15.8436,22.6113,15.8317,22.6333,16.4014,21.7975,16.4133)", + "span": { + "offset": 3263, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6113,15.8317,23.4252,15.808,23.4472,16.3777,22.6333,16.4014)", + "span": { + "offset": 3273, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4252,15.808,24.239,15.7961,24.261,16.3658,23.4472,16.3777)", + "span": { + "offset": 3283, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.239,15.7961,25.0968,15.7842,25.1188,16.3539,24.261,16.3658)", + "span": { + "offset": 3293, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.0968,15.7842,25.8667,15.7724,25.8887,16.3421,25.1188,16.3539)", + "span": { + "offset": 3303, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8667,15.7724,26.7685,15.7486,26.7905,16.3302,25.8887,16.3421)", + "span": { + "offset": 3313, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7685,15.7486,27.5383,15.7368,27.5603,16.3183,26.7905,16.3302)", + "span": { + "offset": 3323, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.5383,15.7368,28.4181,15.7249,28.4401,16.2946,27.5603,16.3183)", + "span": { + "offset": 3333, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.4181,15.7249,29.276,15.7011,29.276,16.2827,28.4401,16.2946)", + "span": { + "offset": 3343, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.276,15.7011,30.7937,15.6774,30.8157,16.259,29.276,16.2827)", + "span": { + "offset": 3353, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 8, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.7937,15.6774,32.9272,15.6418,32.9492,16.2234,30.8157,16.259)", + "span": { + "offset": 3363, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "9", + "source": "D(1,1.2317,16.7456,2.4194,16.7218,2.4414,17.3034,1.2537,17.3153)", + "span": { + "offset": 3384, + "length": 1 + }, + "elements": [ + "/paragraphs/70" + ] + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4194,16.7218,4.531,16.6862,4.531,17.2678,2.4414,17.3034)", + "span": { + "offset": 3395, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.531,16.6862,6.1367,16.6506,6.1587,17.2441,4.531,17.2678)", + "span": { + "offset": 3405, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1367,16.6506,17.3764,16.4726,17.3764,17.066,6.1587,17.2441)", + "span": { + "offset": 3415, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3764,16.4726,18.8061,16.4489,18.8061,17.0542,17.3764,17.066)", + "span": { + "offset": 3425, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8061,16.4489,20.1918,16.437,20.1918,17.0423,18.8061,17.0542)", + "span": { + "offset": 3435, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1918,16.437,21.0056,16.4251,21.0277,17.0304,20.1918,17.0423)", + "span": { + "offset": 3445, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0056,16.4251,21.7975,16.4133,21.7975,17.0186,21.0277,17.0304)", + "span": { + "offset": 3455, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7975,16.4133,22.6333,16.4014,22.6333,17.0067,21.7975,17.0186)", + "span": { + "offset": 3465, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6333,16.4014,23.4472,16.3777,23.4691,16.983,22.6333,17.0067)", + "span": { + "offset": 3475, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4472,16.3777,24.261,16.3658,24.283,16.9711,23.4691,16.983)", + "span": { + "offset": 3485, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.261,16.3658,25.1188,16.3539,25.1408,16.9592,24.283,16.9711)", + "span": { + "offset": 3495, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.1188,16.3539,25.8887,16.3421,25.9107,16.9474,25.1408,16.9592)", + "span": { + "offset": 3505, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.8887,16.3421,26.7905,16.3302,26.8125,16.9355,25.9107,16.9474)", + "span": { + "offset": 3515, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.7905,16.3302,27.5603,16.3183,27.5823,16.9236,26.8125,16.9355)", + "span": { + "offset": 3525, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.5603,16.3183,28.4401,16.2946,28.4621,16.9117,27.5823,16.9236)", + "span": { + "offset": 3535, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.4401,16.2946,29.276,16.2827,29.298,16.8999,28.4621,16.9117)", + "span": { + "offset": 3545, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.276,16.2827,30.8157,16.259,30.8376,16.8761,29.298,16.8999)", + "span": { + "offset": 3555, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 9, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.8157,16.259,32.9492,16.2234,32.9712,16.8405,30.8376,16.8761)", + "span": { + "offset": 3565, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "10", + "source": "D(1,1.2537,17.3153,2.4414,17.3034,2.4414,17.8731,1.2537,17.8968)", + "span": { + "offset": 3586, + "length": 2 + }, + "elements": [ + "/paragraphs/71" + ] + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4414,17.3034,4.531,17.2678,4.531,17.8375,2.4414,17.8731)", + "span": { + "offset": 3598, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.531,17.2678,6.1587,17.2441,6.1587,17.8138,4.531,17.8375)", + "span": { + "offset": 3608, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1587,17.2441,17.3764,17.066,17.3984,17.6595,6.1587,17.8138)", + "span": { + "offset": 3618, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3764,17.066,18.8061,17.0542,18.8281,17.6357,17.3984,17.6595)", + "span": { + "offset": 3628, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8061,17.0542,20.1918,17.0423,20.2138,17.6239,18.8281,17.6357)", + "span": { + "offset": 3638, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.1918,17.0423,21.0277,17.0304,21.0277,17.612,20.2138,17.6239)", + "span": { + "offset": 3648, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0277,17.0304,21.7975,17.0186,21.8195,17.6001,21.0277,17.612)", + "span": { + "offset": 3658, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.7975,17.0186,22.6333,17.0067,22.6553,17.5883,21.8195,17.6001)", + "span": { + "offset": 3668, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6333,17.0067,23.4691,16.983,23.4691,17.5764,22.6553,17.5883)", + "span": { + "offset": 3678, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4691,16.983,24.283,16.9711,24.305,17.5645,23.4691,17.5764)", + "span": { + "offset": 3688, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.283,16.9711,25.1408,16.9592,25.1408,17.5527,24.305,17.5645)", + "span": { + "offset": 3698, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.1408,16.9592,25.9107,16.9474,25.9326,17.5408,25.1408,17.5527)", + "span": { + "offset": 3708, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9107,16.9474,26.8125,16.9355,26.8345,17.517,25.9326,17.5408)", + "span": { + "offset": 3718, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.8125,16.9355,27.5823,16.9236,27.6043,17.5052,26.8345,17.517)", + "span": { + "offset": 3728, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.5823,16.9236,28.4621,16.9117,28.4841,17.4933,27.6043,17.5052)", + "span": { + "offset": 3738, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.4621,16.9117,29.298,16.8999,29.32,17.4814,28.4841,17.4933)", + "span": { + "offset": 3748, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.298,16.8999,30.8376,16.8761,30.8597,17.4696,29.32,17.4814)", + "span": { + "offset": 3758, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 10, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.8376,16.8761,32.9712,16.8405,32.9932,17.434,30.8597,17.4696)", + "span": { + "offset": 3768, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "11", + "source": "D(1,1.2537,17.8968,2.4414,17.8731,2.4414,18.4784,1.2756,18.4903)", + "span": { + "offset": 3789, + "length": 2 + }, + "elements": [ + "/paragraphs/72" + ] + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4414,17.8731,4.531,17.8375,4.553,18.4309,2.4414,18.4784)", + "span": { + "offset": 3801, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.531,17.8375,6.1587,17.8138,6.1587,18.4072,4.553,18.4309)", + "span": { + "offset": 3811, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1587,17.8138,17.3984,17.6595,17.4204,18.241,6.1587,18.4072)", + "span": { + "offset": 3821, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.3984,17.6595,18.8281,17.6357,18.8281,18.2292,17.4204,18.241)", + "span": { + "offset": 3831, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8281,17.6357,20.2138,17.6239,20.2138,18.2054,18.8281,18.2292)", + "span": { + "offset": 3841, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2138,17.6239,21.0277,17.612,21.0496,18.1936,20.2138,18.2054)", + "span": { + "offset": 3851, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0277,17.612,21.8195,17.6001,21.8195,18.1817,21.0496,18.1936)", + "span": { + "offset": 3861, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8195,17.6001,22.6553,17.5883,22.6773,18.1698,21.8195,18.1817)", + "span": { + "offset": 3871, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6553,17.5883,23.4691,17.5764,23.4911,18.158,22.6773,18.1698)", + "span": { + "offset": 3881, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4691,17.5764,24.305,17.5645,24.327,18.1461,23.4911,18.158)", + "span": { + "offset": 3891, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.305,17.5645,25.1408,17.5527,25.1628,18.1342,24.327,18.1461)", + "span": { + "offset": 3901, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.1408,17.5527,25.9326,17.5408,25.9546,18.1223,25.1628,18.1342)", + "span": { + "offset": 3911, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9326,17.5408,26.8345,17.517,26.8565,18.1105,25.9546,18.1223)", + "span": { + "offset": 3921, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.8345,17.517,27.6043,17.5052,27.6263,18.0986,26.8565,18.1105)", + "span": { + "offset": 3931, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6043,17.5052,28.4841,17.4933,28.5061,18.0867,27.6263,18.0986)", + "span": { + "offset": 3941, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.4841,17.4933,29.32,17.4814,29.342,18.0749,28.5061,18.0867)", + "span": { + "offset": 3951, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.32,17.4814,30.8597,17.4696,30.8816,18.0511,29.342,18.0749)", + "span": { + "offset": 3961, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 11, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.8597,17.4696,32.9932,17.434,33.0152,18.0155,30.8816,18.0511)", + "span": { + "offset": 3971, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "12", + "source": "D(1,1.2756,18.4903,2.4414,18.4784,2.4634,19.0481,1.2756,19.0718)", + "span": { + "offset": 3992, + "length": 2 + }, + "elements": [ + "/paragraphs/73" + ] + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4414,18.4784,4.553,18.4309,4.553,19.0125,2.4634,19.0481)", + "span": { + "offset": 4004, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.553,18.4309,6.1587,18.4072,6.1807,18.9888,4.553,19.0125)", + "span": { + "offset": 4014, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1587,18.4072,17.4204,18.241,17.4204,18.8107,6.1807,18.9888)", + "span": { + "offset": 4024, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4204,18.241,18.8281,18.2292,18.8501,18.7989,17.4204,18.8107)", + "span": { + "offset": 4034, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8281,18.2292,20.2138,18.2054,20.2358,18.7751,18.8501,18.7989)", + "span": { + "offset": 4044, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2138,18.2054,21.0496,18.1936,21.0496,18.7633,20.2358,18.7751)", + "span": { + "offset": 4054, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0496,18.1936,21.8195,18.1817,21.8415,18.7633,21.0496,18.7633)", + "span": { + "offset": 4064, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8195,18.1817,22.6773,18.1698,22.6773,18.7514,21.8415,18.7633)", + "span": { + "offset": 4074, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6773,18.1698,23.4911,18.158,23.5131,18.7395,22.6773,18.7514)", + "span": { + "offset": 4084, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.4911,18.158,24.327,18.1461,24.349,18.7276,23.5131,18.7395)", + "span": { + "offset": 4094, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.327,18.1461,25.1628,18.1342,25.1848,18.7158,24.349,18.7276)", + "span": { + "offset": 4104, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.1628,18.1342,25.9546,18.1223,25.9766,18.7039,25.1848,18.7158)", + "span": { + "offset": 4114, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9546,18.1223,26.8565,18.1105,26.8785,18.692,25.9766,18.7039)", + "span": { + "offset": 4124, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.8565,18.1105,27.6263,18.0986,27.6483,18.6802,26.8785,18.692)", + "span": { + "offset": 4134, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6263,18.0986,28.5061,18.0867,28.5281,18.6683,27.6483,18.6802)", + "span": { + "offset": 4144, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5061,18.0867,29.342,18.0749,29.364,18.6564,28.5281,18.6683)", + "span": { + "offset": 4154, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.342,18.0749,30.8816,18.0511,30.9036,18.6327,29.364,18.6564)", + "span": { + "offset": 4164, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 12, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.8816,18.0511,33.0152,18.0155,33.0372,18.609,30.9036,18.6327)", + "span": { + "offset": 4174, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "13", + "source": "D(1,1.2756,19.0718,2.4634,19.0481,2.4634,19.6534,1.2976,19.6771)", + "span": { + "offset": 4195, + "length": 2 + }, + "elements": [ + "/paragraphs/74" + ] + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4634,19.0481,4.553,19.0125,4.575,19.6178,2.4634,19.6534)", + "span": { + "offset": 4207, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.553,19.0125,6.1807,18.9888,6.1807,19.5822,4.575,19.6178)", + "span": { + "offset": 4217, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1807,18.9888,17.4204,18.8107,17.4424,19.4279,6.1807,19.5822)", + "span": { + "offset": 4227, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4204,18.8107,18.8501,18.7989,18.8501,19.4042,17.4424,19.4279)", + "span": { + "offset": 4237, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8501,18.7989,20.2358,18.7751,20.2358,19.3923,18.8501,19.4042)", + "span": { + "offset": 4247, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2358,18.7751,21.0496,18.7633,21.0716,19.3804,20.2358,19.3923)", + "span": { + "offset": 4257, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0496,18.7633,21.8415,18.7633,21.8635,19.3686,21.0716,19.3804)", + "span": { + "offset": 4267, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8415,18.7633,22.6773,18.7514,22.6993,19.3567,21.8635,19.3686)", + "span": { + "offset": 4277, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6773,18.7514,23.5131,18.7395,23.5351,19.3448,22.6993,19.3567)", + "span": { + "offset": 4287, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.5131,18.7395,24.349,18.7276,24.371,19.3448,23.5351,19.3448)", + "span": { + "offset": 4297, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.349,18.7276,25.1848,18.7158,25.2068,19.3329,24.371,19.3448)", + "span": { + "offset": 4307, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.1848,18.7158,25.9766,18.7039,25.9986,19.3092,25.2068,19.3329)", + "span": { + "offset": 4317, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9766,18.7039,26.8785,18.692,26.9004,19.2973,25.9986,19.3092)", + "span": { + "offset": 4327, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.8785,18.692,27.6483,18.6802,27.6703,19.2855,26.9004,19.2973)", + "span": { + "offset": 4337, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6483,18.6802,28.5281,18.6683,28.5501,19.2617,27.6703,19.2855)", + "span": { + "offset": 4347, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5281,18.6683,29.364,18.6564,29.3859,19.2499,28.5501,19.2617)", + "span": { + "offset": 4357, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.364,18.6564,30.9036,18.6327,30.9256,19.238,29.3859,19.2499)", + "span": { + "offset": 4367, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 13, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.9036,18.6327,33.0372,18.609,33.0592,19.2024,30.9256,19.238)", + "span": { + "offset": 4377, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "14", + "source": "D(1,1.2976,19.6771,2.4634,19.6534,2.4634,20.2468,1.2976,20.2706)", + "span": { + "offset": 4398, + "length": 2 + }, + "elements": [ + "/paragraphs/75" + ] + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4634,19.6534,4.575,19.6178,4.575,20.2112,2.4634,20.2468)", + "span": { + "offset": 4410, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.575,19.6178,6.1807,19.5822,6.2027,20.1756,4.575,20.2112)", + "span": { + "offset": 4420, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.1807,19.5822,17.4424,19.4279,17.4644,20.0095,6.2027,20.1756)", + "span": { + "offset": 4430, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4424,19.4279,18.8501,19.4042,18.8721,19.9857,17.4644,20.0095)", + "span": { + "offset": 4440, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8501,19.4042,20.2358,19.3923,20.2578,19.9739,18.8721,19.9857)", + "span": { + "offset": 4450, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2358,19.3923,21.0716,19.3804,21.0716,19.962,20.2578,19.9739)", + "span": { + "offset": 4460, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0716,19.3804,21.8635,19.3686,21.8635,19.9501,21.0716,19.962)", + "span": { + "offset": 4470, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8635,19.3686,22.6993,19.3567,22.6993,19.9501,21.8635,19.9501)", + "span": { + "offset": 4480, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6993,19.3567,23.5351,19.3448,23.5571,19.9382,22.6993,19.9501)", + "span": { + "offset": 4490, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.5351,19.3448,24.371,19.3448,24.393,19.9264,23.5571,19.9382)", + "span": { + "offset": 4500, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.371,19.3448,25.2068,19.3329,25.2288,19.9145,24.393,19.9264)", + "span": { + "offset": 4510, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.2068,19.3329,25.9986,19.3092,25.9986,19.9027,25.2288,19.9145)", + "span": { + "offset": 4520, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9986,19.3092,26.9004,19.2973,26.9225,19.8908,25.9986,19.9027)", + "span": { + "offset": 4530, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9004,19.2973,27.6703,19.2855,27.6923,19.8789,26.9225,19.8908)", + "span": { + "offset": 4540, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6703,19.2855,28.5501,19.2617,28.5501,19.8552,27.6923,19.8789)", + "span": { + "offset": 4550, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5501,19.2617,29.3859,19.2499,29.4079,19.8433,28.5501,19.8552)", + "span": { + "offset": 4560, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.3859,19.2499,30.9256,19.238,30.9476,19.8314,29.4079,19.8433)", + "span": { + "offset": 4570, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 14, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.9256,19.238,33.0592,19.2024,33.0812,19.7958,30.9476,19.8314)", + "span": { + "offset": 4580, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "15", + "source": "D(1,1.2976,20.2706,2.4634,20.2468,2.4854,20.8521,1.3196,20.8759)", + "span": { + "offset": 4601, + "length": 2 + }, + "elements": [ + "/paragraphs/76" + ] + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4634,20.2468,4.575,20.2112,4.597,20.8047,2.4854,20.8521)", + "span": { + "offset": 4613, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.575,20.2112,6.2027,20.1756,6.2027,20.7691,4.597,20.8047)", + "span": { + "offset": 4623, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2027,20.1756,17.4644,20.0095,17.4644,20.6029,6.2027,20.7691)", + "span": { + "offset": 4633, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4644,20.0095,18.8721,19.9857,18.8721,20.5792,17.4644,20.6029)", + "span": { + "offset": 4643, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8721,19.9857,20.2578,19.9739,20.2578,20.5673,18.8721,20.5792)", + "span": { + "offset": 4653, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2578,19.9739,21.0716,19.962,21.0936,20.5554,20.2578,20.5673)", + "span": { + "offset": 4663, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0716,19.962,21.8635,19.9501,21.8855,20.5435,21.0936,20.5554)", + "span": { + "offset": 4673, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8635,19.9501,22.6993,19.9501,22.7213,20.5317,21.8855,20.5435)", + "span": { + "offset": 4683, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.6993,19.9501,23.5571,19.9382,23.5791,20.5198,22.7213,20.5317)", + "span": { + "offset": 4693, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.5571,19.9382,24.393,19.9264,24.393,20.5198,23.5791,20.5198)", + "span": { + "offset": 4703, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.393,19.9264,25.2288,19.9145,25.2508,20.5079,24.393,20.5198)", + "span": { + "offset": 4713, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.2288,19.9145,25.9986,19.9027,26.0206,20.4961,25.2508,20.5079)", + "span": { + "offset": 4723, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.9986,19.9027,26.9225,19.8908,26.9225,20.4723,26.0206,20.4961)", + "span": { + "offset": 4733, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9225,19.8908,27.6923,19.8789,27.6923,20.4605,26.9225,20.4723)", + "span": { + "offset": 4743, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6923,19.8789,28.5501,19.8552,28.5721,20.4486,27.6923,20.4605)", + "span": { + "offset": 4753, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5501,19.8552,29.4079,19.8433,29.4299,20.4367,28.5721,20.4486)", + "span": { + "offset": 4763, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4079,19.8433,30.9476,19.8314,30.9696,20.4249,29.4299,20.4367)", + "span": { + "offset": 4773, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 15, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.9476,19.8314,33.0812,19.7958,33.1032,20.3892,30.9696,20.4249)", + "span": { + "offset": 4783, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "16", + "source": "D(1,1.3196,20.8759,2.4854,20.8521,2.4854,21.4456,1.3416,21.4693)", + "span": { + "offset": 4804, + "length": 2 + }, + "elements": [ + "/paragraphs/77" + ] + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4854,20.8521,4.597,20.8047,4.597,21.41,2.4854,21.4456)", + "span": { + "offset": 4816, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.597,20.8047,6.2027,20.7691,6.2246,21.3744,4.597,21.41)", + "span": { + "offset": 4826, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2027,20.7691,17.4644,20.6029,17.4864,21.2082,6.2246,21.3744)", + "span": { + "offset": 4836, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4644,20.6029,18.8721,20.5792,18.8941,21.1844,17.4864,21.2082)", + "span": { + "offset": 4846, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8721,20.5792,20.2578,20.5673,20.2798,21.1607,18.8941,21.1844)", + "span": { + "offset": 4856, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2578,20.5673,21.0936,20.5554,21.0936,21.1489,20.2798,21.1607)", + "span": { + "offset": 4866, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0936,20.5554,21.8855,20.5435,21.9075,21.137,21.0936,21.1489)", + "span": { + "offset": 4876, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8855,20.5435,22.7213,20.5317,22.7433,21.1251,21.9075,21.137)", + "span": { + "offset": 4886, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.7213,20.5317,23.5791,20.5198,23.6011,21.1132,22.7433,21.1251)", + "span": { + "offset": 4896, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.5791,20.5198,24.393,20.5198,24.415,21.1132,23.6011,21.1132)", + "span": { + "offset": 4906, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.393,20.5198,25.2508,20.5079,25.2728,21.1014,24.415,21.1132)", + "span": { + "offset": 4916, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.2508,20.5079,26.0206,20.4961,26.0426,21.0895,25.2728,21.1014)", + "span": { + "offset": 4926, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.0206,20.4961,26.9225,20.4723,26.9444,21.0776,26.0426,21.0895)", + "span": { + "offset": 4936, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9225,20.4723,27.6923,20.4605,27.7143,21.0658,26.9444,21.0776)", + "span": { + "offset": 4946, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.6923,20.4605,28.5721,20.4486,28.5941,21.0539,27.7143,21.0658)", + "span": { + "offset": 4956, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5721,20.4486,29.4299,20.4367,29.4519,21.042,28.5941,21.0539)", + "span": { + "offset": 4966, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4299,20.4367,30.9696,20.4249,30.9916,21.0302,29.4519,21.042)", + "span": { + "offset": 4976, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 16, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.9696,20.4249,33.1032,20.3892,33.1252,20.9946,30.9916,21.0302)", + "span": { + "offset": 4986, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "17", + "source": "D(1,1.3416,21.4693,2.4854,21.4456,2.4854,22.039,1.3416,22.0627)", + "span": { + "offset": 5007, + "length": 2 + }, + "elements": [ + "/paragraphs/78" + ] + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4854,21.4456,4.597,21.41,4.619,21.9915,2.4854,22.039)", + "span": { + "offset": 5019, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.597,21.41,6.2246,21.3744,6.2246,21.9678,4.619,21.9915)", + "span": { + "offset": 5029, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2246,21.3744,17.4864,21.2082,17.5084,21.8016,6.2246,21.9678)", + "span": { + "offset": 5039, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.4864,21.2082,18.8941,21.1844,18.8941,21.7779,17.5084,21.8016)", + "span": { + "offset": 5049, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8941,21.1844,20.2798,21.1607,20.2798,21.7542,18.8941,21.7779)", + "span": { + "offset": 5059, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2798,21.1607,21.0936,21.1489,21.1156,21.7423,20.2798,21.7542)", + "span": { + "offset": 5069, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.0936,21.1489,21.9075,21.137,21.9075,21.7423,21.1156,21.7423)", + "span": { + "offset": 5079, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.9075,21.137,22.7433,21.1251,22.7433,21.7304,21.9075,21.7423)", + "span": { + "offset": 5089, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.7433,21.1251,23.6011,21.1132,23.6231,21.7304,22.7433,21.7304)", + "span": { + "offset": 5099, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.6011,21.1132,24.415,21.1132,24.4369,21.7185,23.6231,21.7304)", + "span": { + "offset": 5109, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.415,21.1132,25.2728,21.1014,25.2948,21.7067,24.4369,21.7185)", + "span": { + "offset": 5119, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.2728,21.1014,26.0426,21.0895,26.0646,21.6948,25.2948,21.7067)", + "span": { + "offset": 5129, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.0426,21.0895,26.9444,21.0776,26.9664,21.6829,26.0646,21.6948)", + "span": { + "offset": 5139, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9444,21.0776,27.7143,21.0658,27.7363,21.6711,26.9664,21.6829)", + "span": { + "offset": 5149, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.7143,21.0658,28.5941,21.0539,28.6161,21.6592,27.7363,21.6711)", + "span": { + "offset": 5159, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.5941,21.0539,29.4519,21.042,29.4519,21.6473,28.6161,21.6592)", + "span": { + "offset": 5169, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4519,21.042,30.9916,21.0302,31.0136,21.6236,29.4519,21.6473)", + "span": { + "offset": 5179, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 17, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,30.9916,21.0302,33.1252,20.9946,33.1472,21.5999,31.0136,21.6236)", + "span": { + "offset": 5189, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "18", + "source": "D(1,1.3416,22.0627,2.4854,22.039,2.5074,22.6324,1.3636,22.6562)", + "span": { + "offset": 5210, + "length": 2 + }, + "elements": [ + "/paragraphs/79" + ] + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.4854,22.039,4.619,21.9915,4.619,22.5968,2.5074,22.6324)", + "span": { + "offset": 5222, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.619,21.9915,6.2246,21.9678,6.2246,22.5612,4.619,22.5968)", + "span": { + "offset": 5232, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2246,21.9678,17.5084,21.8016,17.5084,22.4069,6.2246,22.5612)", + "span": { + "offset": 5242, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.5084,21.8016,18.8941,21.7779,18.9161,22.3832,17.5084,22.4069)", + "span": { + "offset": 5252, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.8941,21.7779,20.2798,21.7542,20.3018,22.3713,18.9161,22.3832)", + "span": { + "offset": 5262, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.2798,21.7542,21.1156,21.7423,21.1156,22.3595,20.3018,22.3713)", + "span": { + "offset": 5272, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.1156,21.7423,21.9075,21.7423,21.9295,22.3476,21.1156,22.3595)", + "span": { + "offset": 5282, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.9075,21.7423,22.7433,21.7304,22.7653,22.3476,21.9295,22.3476)", + "span": { + "offset": 5292, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.7433,21.7304,23.6231,21.7304,23.6451,22.3357,22.7653,22.3476)", + "span": { + "offset": 5302, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.6231,21.7304,24.4369,21.7185,24.459,22.3238,23.6451,22.3357)", + "span": { + "offset": 5312, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.4369,21.7185,25.2948,21.7067,25.3168,22.312,24.459,22.3238)", + "span": { + "offset": 5322, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.2948,21.7067,26.0646,21.6948,26.0866,22.3001,25.3168,22.312)", + "span": { + "offset": 5332, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.0646,21.6948,26.9664,21.6829,26.9884,22.2882,26.0866,22.3001)", + "span": { + "offset": 5342, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9664,21.6829,27.7363,21.6711,27.7583,22.2764,26.9884,22.2882)", + "span": { + "offset": 5352, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.7363,21.6711,28.6161,21.6592,28.6381,22.2645,27.7583,22.2764)", + "span": { + "offset": 5362, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.6161,21.6592,29.4519,21.6473,29.4739,22.2526,28.6381,22.2645)", + "span": { + "offset": 5372, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4519,21.6473,31.0136,21.6236,31.0356,22.2408,29.4739,22.2526)", + "span": { + "offset": 5382, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 18, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,31.0136,21.6236,33.1472,21.5999,33.1692,22.2052,31.0356,22.2408)", + "span": { + "offset": 5392, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "19", + "source": "D(1,1.3636,22.6562,2.5074,22.6324,2.5074,23.2259,1.3636,23.2496)", + "span": { + "offset": 5413, + "length": 2 + }, + "elements": [ + "/paragraphs/80" + ] + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.5074,22.6324,4.619,22.5968,4.641,23.1903,2.5074,23.2259)", + "span": { + "offset": 5425, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.619,22.5968,6.2246,22.5612,6.2466,23.1665,4.641,23.1903)", + "span": { + "offset": 5435, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2246,22.5612,17.5084,22.4069,17.5304,23.0122,6.2466,23.1665)", + "span": { + "offset": 5445, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.5084,22.4069,18.9161,22.3832,18.9161,22.9885,17.5304,23.0122)", + "span": { + "offset": 5455, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.9161,22.3832,20.3018,22.3713,20.3238,22.9766,18.9161,22.9885)", + "span": { + "offset": 5465, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.3018,22.3713,21.1156,22.3595,21.1376,22.9648,20.3238,22.9766)", + "span": { + "offset": 5475, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.1156,22.3595,21.9295,22.3476,21.9295,22.9529,21.1376,22.9648)", + "span": { + "offset": 5485, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.9295,22.3476,22.7653,22.3476,22.7873,22.9529,21.9295,22.9529)", + "span": { + "offset": 5495, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.7653,22.3476,23.6451,22.3357,23.6451,22.941,22.7873,22.9529)", + "span": { + "offset": 5505, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.6451,22.3357,24.459,22.3238,24.4809,22.9291,23.6451,22.941)", + "span": { + "offset": 5515, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.459,22.3238,25.3168,22.312,25.3168,22.9291,24.4809,22.9291)", + "span": { + "offset": 5525, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.3168,22.312,26.0866,22.3001,26.1086,22.9173,25.3168,22.9291)", + "span": { + "offset": 5535, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.0866,22.3001,26.9884,22.2882,27.0104,22.9054,26.1086,22.9173)", + "span": { + "offset": 5545, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.9884,22.2882,27.7583,22.2764,27.7803,22.8935,27.0104,22.9054)", + "span": { + "offset": 5555, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.7583,22.2764,28.6381,22.2645,28.6601,22.8817,27.7803,22.8935)", + "span": { + "offset": 5565, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.6381,22.2645,29.4739,22.2526,29.4959,22.8698,28.6601,22.8817)", + "span": { + "offset": 5575, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4739,22.2526,31.0356,22.2408,31.0576,22.8579,29.4959,22.8698)", + "span": { + "offset": 5585, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 19, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,31.0356,22.2408,33.1692,22.2052,33.1912,22.8223,31.0576,22.8579)", + "span": { + "offset": 5595, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "20", + "source": "D(1,1.3636,23.2496,2.5074,23.2259,2.5074,23.8312,1.3856,23.843)", + "span": { + "offset": 5616, + "length": 2 + }, + "elements": [ + "/paragraphs/81" + ] + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,2.5074,23.2259,4.641,23.1903,4.641,23.7956,2.5074,23.8312)", + "span": { + "offset": 5628, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 2, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,4.641,23.1903,6.2466,23.1665,6.2466,23.7718,4.641,23.7956)", + "span": { + "offset": 5638, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 3, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,6.2466,23.1665,17.5304,23.0122,17.5523,23.6175,6.2466,23.7718)", + "span": { + "offset": 5648, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.5304,23.0122,18.9161,22.9885,18.9381,23.6057,17.5523,23.6175)", + "span": { + "offset": 5658, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.9161,22.9885,20.3238,22.9766,20.3238,23.5819,18.9381,23.6057)", + "span": { + "offset": 5668, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.3238,22.9766,21.1376,22.9648,21.1376,23.5819,20.3238,23.5819)", + "span": { + "offset": 5678, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.1376,22.9648,21.9295,22.9529,21.9515,23.5701,21.1376,23.5819)", + "span": { + "offset": 5688, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,21.9295,22.9529,22.7873,22.9529,22.7873,23.5582,21.9515,23.5701)", + "span": { + "offset": 5698, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.7873,22.9529,23.6451,22.941,23.6671,23.5463,22.7873,23.5582)", + "span": { + "offset": 5708, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 10, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,23.6451,22.941,24.4809,22.9291,24.5029,23.5344,23.6671,23.5463)", + "span": { + "offset": 5718, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 11, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,24.4809,22.9291,25.3168,22.9291,25.3388,23.5226,24.5029,23.5344)", + "span": { + "offset": 5728, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,25.3168,22.9291,26.1086,22.9173,26.1306,23.5107,25.3388,23.5226)", + "span": { + "offset": 5738, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.1086,22.9173,27.0104,22.9054,27.0324,23.5107,26.1306,23.5107)", + "span": { + "offset": 5748, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.0104,22.9054,27.7803,22.8935,27.8023,23.4988,27.0324,23.5107)", + "span": { + "offset": 5758, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.7803,22.8935,28.6601,22.8817,28.6821,23.487,27.8023,23.4988)", + "span": { + "offset": 5768, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.6601,22.8817,29.4959,22.8698,29.5179,23.4751,28.6821,23.487)", + "span": { + "offset": 5778, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.4959,22.8698,31.0576,22.8579,31.0796,23.4514,29.5179,23.4751)", + "span": { + "offset": 5788, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 20, + "columnIndex": 18, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,31.0576,22.8579,33.1912,22.8223,33.2132,23.4276,31.0796,23.4514)", + "span": { + "offset": 5798, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 0, + "rowSpan": 1, + "columnSpan": 1, + "content": "4", + "source": "D(1,1.3856,23.843,2.5074,23.8312,2.5294,24.7332,1.4076,24.7451)", + "span": { + "offset": 5819, + "length": 1 + }, + "elements": [ + "/paragraphs/82" + ] + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 1, + "rowSpan": 1, + "columnSpan": 3, + "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", + "source": "D(1,2.5074,23.8312,17.5523,23.6175,17.5743,24.5077,2.5294,24.7332)", + "span": { + "offset": 5842, + "length": 40 + }, + "elements": [ + "/paragraphs/83" + ] + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 4, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,17.5523,23.6175,18.9381,23.6057,18.9381,24.4958,17.5743,24.5077)", + "span": { + "offset": 5892, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 5, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,18.9381,23.6057,20.3238,23.5819,20.3458,24.4721,18.9381,24.4958)", + "span": { + "offset": 5902, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 6, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,20.3238,23.5819,21.1376,23.5819,21.1596,24.4602,20.3458,24.4721)", + "span": { + "offset": 5912, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 7, + "rowSpan": 1, + "columnSpan": 12, + "content": "", + "source": "D(1,21.1376,23.5819,33.2132,23.4276,33.2572,24.3178,21.1596,24.4602)", + "span": { + "offset": 5935, + "length": 0 + } + } + ], + "source": "D(1,1.0767,11.0484,33.0542,10.4801,33.2592,24.062,1.2675,24.6639)", + "span": { + "offset": 1248, + "length": 4707 + } + } + ], + "figures": [ + { + "source": "D(1,1.2774,0.9435,5.7266,0.9413,5.7253,1.8321,1.2756,1.8342)", + "span": { + "offset": 0, + "length": 33 + }, + "elements": [ + "/paragraphs/0" + ], + "id": "1.1" + } + ] + } + ] + } +} \ No newline at end of file From 9df1d42fc28438f4f24a0ec09f2d0f98a4943654 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Thu, 22 May 2025 17:13:52 -0500 Subject: [PATCH 14/50] Update README.md need to finish readme still --- python/di_to_cu_migration_tool/README.md | 74 +++++++++++++++--------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index edb7d50..7dfec1b 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -3,9 +3,24 @@ Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format seen in AI Foundry. The following DI versions are supported: - DI 3.1/4.0 GA CustomNeural (seen in Document Intelligence Studio) - DI 4.0 Preview CustomGen (seen in Document Extraction project) + To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. -Additionally, this will automatically create a CU Analyzer using your provided AI Service endpoint and provide the option to run Analyze on a given file. +Additionally, we have separate CLI tools to create a CU Analyzer using your provided AI Service endpoint and run Analyze on a given file with your previously created analyzer. + +## Details About the Tools +To give you some more details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: +* **di_to_cu_converter.py**: + * This CLI tool handles the conversion of the dataset itself. In other words, it takes your DI dataset and converts it into a CU dataset. What this means is that your fields.json gets converted into analyzer.json, your DI labels.json gets converted into CU labels.json, and your ocr.json gets replaced with result.json. + * To handle the conversion for fields.json and labels.json, we use the cu_converter_customGen.py and cu_converter_customNeural.py python classes. The class used depends on the DI version you have specified. This is why choosing the correct DI version is incredibly important. + * To get the result.json, we take your DI dataset's original files and create a sample analyzer without any fields, allowing us to attain the raw OCR results for each original file via an Analyze request. The logic for this implementation is located in get_ocr.py +* **create_analyzer.py**: + * This CLI tool handles building an analyzer by calling the Content Understanding REST API. + * With di_to_cu_converter.py, this tool gives us a complete CU dataset. However, to build a model itself, the create_analyzer.py class is needed. + * Additionally, the model will come "trained" as the entire converted CU dataset will be referenced when building the analyzer. +* **call_analyze.py**: + * This CLI tool handles analyzing a given PDF file by utilizing the previously created analyzer. + * This is a great way to "test" the model by utilizing the Content Understanding REST API. ## Setup To setup this tool, you will need to do the following steps: @@ -14,44 +29,49 @@ To setup this tool, you will need to do the following steps: 3. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" - - **SUBSCIPITON_KEY:** Replace this with your name or alias, is used to identify who called the API request - - Ex: "userAlias" - - **SOURCE_BLOB_ACCOUNT_URL:** Replace this with the URL to your blob storage account that contains your DI dataset - - Ex: "https://srcStorageAccountName.blob.core.windows.net" - - **SOURCE_BLOB_CONTAINER_NAME:** Replace this with the container within your blob storage account that contains your DI dataset - - Ex: "srcContainerName" - - **SOURCE_BLOB_FOLDER_PREFIX:** Replace this with the path to your DI dataset, within your specified container - - Ex: "src/path/to/folder" - - **SOURCE_BLOB_STORAGE_SAS_TOKEN:** If you prefer to use a SAS Token to authenticate into your source blob storage, please enter ONLY the token here and WITHOUT the leading "?". - If you prefer to use Azure AAD to authenticate, you can remove this value alltogether or leave it blank (i.e. "") - - **TARGET_BLOB_ACCOUNT_URL:** Replace this with the URL to the blob storage account that you wish to store your converted CU dataset - - Ex: "https://destStorageAccountName.blob.core.windows.net" - - **TARGET_BLOB_CONTAINER_NAME:** Replace this with the container within your target blob storage account where you wish to store your converted CU dataset - - Ex: "destContainerName" - - **TARGET_BLOB_FOLDER_PREFIX:** Replace this with the path to your CU dataset, within your specified container. - If you end this string with a "/", it will create a folder inside of the path specified and store the dataset there. - - Ex: "dest/path/to/folder" - - **TARGET_BLOB_STORAGE_SAS_TOKEN:** Replace this with the SAS Token to authenticate into your target blob storage. This is REQUIRED, you CANNOT use Azure AAD to authenticate. - A SAS Token is needed for creating an Analyzer. - - **ANALYZE_PDF_URL:** Replace this with the SAS URL to a file you wish to analyze (i.e. pdf, jpg, jpeg, etc.). If you wish to not run Analyze, you can leave this as empty (i.e. "") - - Ex: "https://srcStorageAccountName.blob.core.windows.net/srcContainerName/src/path/to/folder/test.pdf?SASToken" - - **ANALYZE_RESULT_OUTPUT_JSON:** Replace this with where you wish to store the analyze results. The default is "./sample_documents/analyze_result.json". + image + image + - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. + - If you have an API Key, it will show up here: image + - If your service uses AAD, please instead fill this value with your Subscription ID: image + - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. ## How to Run -To run this tool, you will be using the command line to run the following commands. +To run the 3 tools, you will need to follow these commands. + +### 1. Running DI to CU Dataset Conversion -To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, run this command: +To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: -**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer** +**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. To convert a _DI 4.0 Preview CustomGen_, run this command: -**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer** +**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. +### 2. Creating An Analyzer + +To create an analyzer using the converted CU analyzer.json, please run this command: + +**python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" +--target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + +In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. + +Ex: image + +### 3. Calling Analyze + +To Analyze a specific PDF or original file, please run this command: + +**python ./call_analyze.py --analyzer-id analyzerID --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken"** + +For the --analyzer-id argument, please input the analyzer ID of the created Analyzer. + After this command finishes running, you should be able to - see a converted CU dataset (with analyzer.json, labels.json, result.json, and the original files) in your specified target blob storage - see a created Analyzer with the mentioned Analyzer ID From a3b40a09284fa1f0e1bd3b00975458e5658be86f Mon Sep 17 00:00:00 2001 From: aainav269 Date: Thu, 22 May 2025 17:23:55 -0500 Subject: [PATCH 15/50] Update README.md need to add stuff about how to get source and target info --- python/di_to_cu_migration_tool/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 7dfec1b..5a4753d 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -72,11 +72,6 @@ To Analyze a specific PDF or original file, please run this command: For the --analyzer-id argument, please input the analyzer ID of the created Analyzer. -After this command finishes running, you should be able to -- see a converted CU dataset (with analyzer.json, labels.json, result.json, and the original files) in your specified target blob storage -- see a created Analyzer with the mentioned Analyzer ID -- see the results of the Analyze call in where you specified ANALYZE_RESULT_OUTPUT_JSON to be - ## Things of Note - You will need to be using a version of Python above 3.9 - Fields with FieldType "signature," which are supported in 2024-11-30 Custom Neural, are not supported in the latest version of Content Understanding (2025-05-01-preview), and thus will be ignored when creating the analyzer From 21782305267e465891a4f9f9de1b6c8cc28199b0 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Thu, 22 May 2025 17:31:57 -0500 Subject: [PATCH 16/50] analyzer_result.json is a CLI variable --- python/di_to_cu_migration_tool/.sample_env | 15 --------------- python/di_to_cu_migration_tool/call_analyze.py | 4 +++- .../sample_documents/analyzer_result.json | 12 ++++++------ 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/python/di_to_cu_migration_tool/.sample_env b/python/di_to_cu_migration_tool/.sample_env index 14bdeae..b8106c8 100644 --- a/python/di_to_cu_migration_tool/.sample_env +++ b/python/di_to_cu_migration_tool/.sample_env @@ -4,18 +4,3 @@ HOST="" API_VERSION = "2025-05-01-preview" SUBSCRIPTION_KEY = "" # This is your API Key if you have one or can be your Subscription ID - -# Source blob storage & target blob storage -SOURCE_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" -SOURCE_BLOB_CONTAINER_NAME = "<>" -SOURCE_BLOB_FOLDER_PREFIX = "<>" -SOURCE_BLOB_STORAGE_SAS_TOKEN = "<>" - -TARGET_BLOB_ACCOUNT_URL = "https://.blob.core.windows.net" -TARGET_BLOB_CONTAINER_NAME = "<>" -TARGET_BLOB_FOLDER_PREFIX = "<>" -TARGET_BLOB_STORAGE_SAS_TOKEN = "<>" - -# SAS url to the pdf blob that you want to analyzer -ANALYZE_PDF_URL = "<>" -ANALYZER_RESULT_OUTPUT_JSON = "./analyze_result.json" # where you want to save the analyze result diff --git a/python/di_to_cu_migration_tool/call_analyze.py b/python/di_to_cu_migration_tool/call_analyze.py index 1ba931d..0ca0179 100644 --- a/python/di_to_cu_migration_tool/call_analyze.py +++ b/python/di_to_cu_migration_tool/call_analyze.py @@ -4,6 +4,7 @@ from dotenv import load_dotenv import json import os +from pathlib import Path import requests import time import typer @@ -17,6 +18,7 @@ def main( analyzer_id: str = typer.Option(..., "--analyzer-id", help="Analyzer ID to use for the analyze API"), pdf_sas_url: str = typer.Option(..., "--pdf-sas-url", help="SAS URL for the PDF file to analyze"), + output_json: str = typer.Option("./sample_documents/analyzer_result.json", "--output-json", help="Output JSON file for the analyze result") ): """ Main function to call the analyze API @@ -63,7 +65,7 @@ def main( if status == "succeeded": print(f"[green]Successfully analyzed file {pdf_sas_url} with analyzer ID of {analyzer_id}.[/green]\n") - analyze_result_file = os.getenv("ANALYZER_RESULT_OUTPUT_JSON") + analyze_result_file = Path(output_json) with open(analyze_result_file, "w") as f: json.dump(result, f, indent=4) print(f"[green]Analyze result saved to {analyze_result_file}[/green]") diff --git a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json index 90f6230..4b16664 100644 --- a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json +++ b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json @@ -1,10 +1,10 @@ { - "id": "385cc98a-8513-4f72-93ed-601f0f944682", + "id": "3746c7bf-a76e-454d-a7dc-5ba6670b78a8", "status": "Succeeded", "result": { "analyzerId": "522-4", "apiVersion": "2025-05-01-preview", - "createdAt": "2025-05-22T19:22:44Z", + "createdAt": "2025-05-22T22:31:02Z", "warnings": [], "contents": [ { @@ -55,7 +55,7 @@ "length": 10 } ], - "confidence": 0.77, + "confidence": 0.793, "source": "D(1,12.1968,9.5037,14.5898,9.4761,14.5898,9.7643,12.1980,9.8022)" }, "last_line_completed": { @@ -105,7 +105,7 @@ "length": 2 } ], - "confidence": 0.952, + "confidence": 0.953, "source": "D(1,29.2262,11.5767,30.0234,11.5536,30.0234,12.0171,29.2287,12.0318)" }, "DateShipped": { @@ -138,7 +138,7 @@ "length": 1 } ], - "confidence": 0.832, + "confidence": 0.833, "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" }, "NumberReceived": { @@ -170,7 +170,7 @@ "length": 7 } ], - "confidence": 0.937, + "confidence": 0.95, "source": "D(1,30.8197,12.2063,32.6205,12.1421,32.6250,12.6023,30.8267,12.6211)" }, "ShipInfo": { From aef05697719011cd4e9558a8fa89ef69bed5fced Mon Sep 17 00:00:00 2001 From: aainav269 Date: Fri, 23 May 2025 11:20:46 -0500 Subject: [PATCH 17/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 34 ++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 5a4753d..120fe1c 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -27,7 +27,7 @@ To setup this tool, you will need to do the following steps: 1. Run the requirements.txt to install the needed dependencies via **pip install -r ./requirements.txt** 2. Rename the file **.sample_env** as **.env** 3. Replace the following values in your **.env** file as such: - - **HOST:** Replace this with your Azure AI Service's Content Understanding endpoint. Be sure to remove the "/" at the end. + - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" image image @@ -36,9 +36,38 @@ To setup this tool, you will need to do the following steps: - If your service uses AAD, please instead fill this value with your Subscription ID: image - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. +## How to Find Your Source and Target SAS URLs +To run the following tools, you will need to specify your source and target SAS URLs, along with their folder prefix. +To clarify, your source refers to the location of your DI dataset and your target refers to the location you wish to store your CU dataset at. + +To find any SAS URL: + +1. Navigate to the storage account in Azure Portal and click on "Storage Browser" on the left-hand side + image +2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" + image +3. Then, you will be shown a side window as such, where you can configure your permissions and expiry of the SAS URL. + + For the DI dataset, please select the following permissions from the drop-down: Read & List + + For the CU dataset, please select the following permissions from the drop-down: Read, Add, & Create + + Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" + + image + + This URL is what you will use when you have to specify any of the container url arguments + +To get the SAS URL of a certain file, as you will need for running call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." +image + +And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever a --source-blob-folder or --target-blob-folder is needed. + ## How to Run To run the 3 tools, you will need to follow these commands. +_**NOTE:** When entering a URL, please use "" as the examples show you._ + ### 1. Running DI to CU Dataset Conversion To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: @@ -68,9 +97,10 @@ Ex: image Date: Fri, 23 May 2025 11:33:28 -0500 Subject: [PATCH 18/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 120fe1c..ba24b79 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,19 +1,19 @@ # Document Intelligence to Content Understanding Migration Tool (Python) -Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format seen in AI Foundry. The following DI versions are supported: +Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format, as seen in AI Foundry. The following DI versions are supported: - DI 3.1/4.0 GA CustomNeural (seen in Document Intelligence Studio) - DI 4.0 Preview CustomGen (seen in Document Extraction project) To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. -Additionally, we have separate CLI tools to create a CU Analyzer using your provided AI Service endpoint and run Analyze on a given file with your previously created analyzer. +Additionally, we have separate CLI tools to create a CU Analyzer using your provided AI Service endpoint and run Analyze on a given file using your analyzer. ## Details About the Tools -To give you some more details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: +To give you some additional details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: * **di_to_cu_converter.py**: * This CLI tool handles the conversion of the dataset itself. In other words, it takes your DI dataset and converts it into a CU dataset. What this means is that your fields.json gets converted into analyzer.json, your DI labels.json gets converted into CU labels.json, and your ocr.json gets replaced with result.json. * To handle the conversion for fields.json and labels.json, we use the cu_converter_customGen.py and cu_converter_customNeural.py python classes. The class used depends on the DI version you have specified. This is why choosing the correct DI version is incredibly important. - * To get the result.json, we take your DI dataset's original files and create a sample analyzer without any fields, allowing us to attain the raw OCR results for each original file via an Analyze request. The logic for this implementation is located in get_ocr.py + * To get the result.json, we take your DI dataset's original files and create a sample analyzer without any fields, allowing us to attain the raw OCR results for each original file via an Analyze request. The logic for this implementation is located in get_ocr.py. * **create_analyzer.py**: * This CLI tool handles building an analyzer by calling the Content Understanding REST API. * With di_to_cu_converter.py, this tool gives us a complete CU dataset. However, to build a model itself, the create_analyzer.py class is needed. @@ -24,9 +24,9 @@ To give you some more details, here is a more intricate breakdown of each of the ## Setup To setup this tool, you will need to do the following steps: -1. Run the requirements.txt to install the needed dependencies via **pip install -r ./requirements.txt** -2. Rename the file **.sample_env** as **.env** -3. Replace the following values in your **.env** file as such: +1. Run the requirements.txt file to install the needed dependencies via **pip install -r ./requirements.txt** +3. Rename the file **.sample_env** as **.env** +4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" image @@ -46,11 +46,11 @@ To find any SAS URL: image 2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" image -3. Then, you will be shown a side window as such, where you can configure your permissions and expiry of the SAS URL. +3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. - For the DI dataset, please select the following permissions from the drop-down: Read & List + For the DI dataset, please select the following permissions from the drop-down: _**Read & List**_ - For the CU dataset, please select the following permissions from the drop-down: Read, Add, & Create + For the CU dataset, please select the following permissions from the drop-down: _**Read, Add, & Create**_ Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" @@ -58,10 +58,10 @@ To find any SAS URL: This URL is what you will use when you have to specify any of the container url arguments -To get the SAS URL of a certain file, as you will need for running call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." +To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." image -And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever a --source-blob-folder or --target-blob-folder is needed. +And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. ## How to Run To run the 3 tools, you will need to follow these commands. @@ -72,13 +72,13 @@ _**NOTE:** When entering a URL, please use "" as the examples show you._ To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: -**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + **python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. To convert a _DI 4.0 Preview CustomGen_, run this command: -**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + **python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. @@ -86,8 +86,8 @@ Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you To create an analyzer using the converted CU analyzer.json, please run this command: -**python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" ---target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + **python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" + --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. @@ -97,7 +97,7 @@ Ex: image Date: Fri, 23 May 2025 17:16:40 -0500 Subject: [PATCH 19/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 30 +++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index ba24b79..3d5e61d 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -29,13 +29,27 @@ To setup this tool, you will need to do the following steps: 4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" - image - image + image + image - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - - If you have an API Key, it will show up here: image - - If your service uses AAD, please instead fill this value with your Subscription ID: image + - If you have an API Key, it will show up here: image + - If your service uses AAD, please instead fill this value with your Subscription ID: image - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. +## How to Find Your CustomGen DI Dataset in Azure Portal +If you are trying to convert a CustomGen or Document Extraction dataset, it can be a little difficult to find where this dataset is stored. +If you're having any difficulties finding this, please refer to the following steps: +1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. + image +2. When you get to the Management Center, you should see a section for Connected Resources. Please select "View All". + image +3. This page shows you all the Azure resources and their locations. The "Target" refers to the URL for each Resource. None of these resources are the location of your DI dataset, but instead will lead us to it. We want to pay particular intention to the resources that are of type Blob Storage. The target of these Blob Storages will be the same, apart from the suffix of "-blobstore" on one of the resources. + image + Using the above image, the yellow highlight shows the storage account that your DI dataset is located in. Additionally, your DI dataset's blob container will be the blue highlight + "-di". + Using these two values, please navigate to the above mentioned blob container. From there, you will notice a labelingProjects folder and inside a folder with the same name as the blue highlight. Inside this will be a data folder, which will contain the contents of your Document Extraction project. Please refer to this as your source. + For the example Document Extraction project, this will be where the Document Extraction project is stored: + image + ## How to Find Your Source and Target SAS URLs To run the following tools, you will need to specify your source and target SAS URLs, along with their folder prefix. To clarify, your source refers to the location of your DI dataset and your target refers to the location you wish to store your CU dataset at. @@ -43,9 +57,9 @@ To clarify, your source refers to the location of your DI dataset and your targe To find any SAS URL: 1. Navigate to the storage account in Azure Portal and click on "Storage Browser" on the left-hand side - image + image 2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" - image + image 3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. For the DI dataset, please select the following permissions from the drop-down: _**Read & List**_ @@ -54,12 +68,12 @@ To find any SAS URL: Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" - image + image This URL is what you will use when you have to specify any of the container url arguments To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." -image +image And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. From 2f0c5b7d677c45ce30c34e75ec52cc3c1bd62c8a Mon Sep 17 00:00:00 2001 From: aainav269 Date: Fri, 23 May 2025 17:51:53 -0500 Subject: [PATCH 20/50] Update README.md based on Yu-Yun's comments --- python/di_to_cu_migration_tool/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 3d5e61d..b7dd68c 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -86,22 +86,24 @@ _**NOTE:** When entering a URL, please use "" as the examples show you._ To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: - **python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** +**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** -If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. +If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. This is because there is no "doc_type" or any identification provided in CustomNeural. The created analyzer will have an analyzer ID of the specified analyzer-prefix. To convert a _DI 4.0 Preview CustomGen_, run this command: - **python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** +**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** -Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. +Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. This is because the analyzer ID used will be the "doc_type" value specified in the fields.json. However, if an analyzer prefix is provided, the analyzer ID will then become analyzer-prefix_doc-type. + +_**NOTE:** You are only allowed to create one analyzer per analyzer ID._ ### 2. Creating An Analyzer To create an analyzer using the converted CU analyzer.json, please run this command: - **python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" - --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** +**python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" +--target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. @@ -111,7 +113,7 @@ Ex: image Date: Fri, 23 May 2025 18:15:38 -0500 Subject: [PATCH 21/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index b7dd68c..4ab6cdd 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -29,16 +29,15 @@ To setup this tool, you will need to do the following steps: 4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://user422.services.ai.azure.com" - image + image image - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - If you have an API Key, it will show up here: image - - If your service uses AAD, please instead fill this value with your Subscription ID: image + - If your service uses AAD, please instead fill this value with your Subscription ID: image - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. ## How to Find Your CustomGen DI Dataset in Azure Portal -If you are trying to convert a CustomGen or Document Extraction dataset, it can be a little difficult to find where this dataset is stored. -If you're having any difficulties finding this, please refer to the following steps: +If you are trying to migrate Document Extraction dataset from AI Foundry (customGen), please also refer to the following steps: 1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. image 2. When you get to the Management Center, you should see a section for Connected Resources. Please select "View All". From 797418c98b1b152688cd05c062f68be64333537c Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 12:30:16 -0500 Subject: [PATCH 22/50] Update README.md did Yu-Yun's suggestions, not Paul's yet --- python/di_to_cu_migration_tool/README.md | 46 +++++++++++++++++++----- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 4ab6cdd..27dc965 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -63,7 +63,7 @@ To find any SAS URL: For the DI dataset, please select the following permissions from the drop-down: _**Read & List**_ - For the CU dataset, please select the following permissions from the drop-down: _**Read, Add, & Create**_ + For the CU dataset, please select the following permissions from the drop-down: _**Read, Add, Create, & Write**_ Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" @@ -77,7 +77,7 @@ To get the SAS URL of a certain file, as you will need for running create_analyz And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. ## How to Run -To run the 3 tools, you will need to follow these commands. +To run the 3 tools, you will need to follow these commands. Since these commands are incredibly long, for easy viewing we've split them into multiple lines. Please remove the extra spaces before running. _**NOTE:** When entering a URL, please use "" as the examples show you._ @@ -85,13 +85,17 @@ _**NOTE:** When entering a URL, please use "" as the examples show you._ To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: -**python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix mySampleAnalyzer + --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName + --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. This is because there is no "doc_type" or any identification provided in CustomNeural. The created analyzer will have an analyzer ID of the specified analyzer-prefix. To convert a _DI 4.0 Preview CustomGen_, run this command: -**python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix myAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix mySampleAnalyzer + --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName + --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. This is because the analyzer ID used will be the "doc_type" value specified in the fields.json. However, if an analyzer prefix is provided, the analyzer ID will then become analyzer-prefix_doc-type. @@ -101,22 +105,48 @@ _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ To create an analyzer using the converted CU analyzer.json, please run this command: -**python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" ---target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName** + python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" + --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. -Ex: image +Ex: image ### 3. Calling Analyze To Analyze a specific PDF or original file, please run this command: - **python ./call_analyze.py --analyzer-id analyzerID --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken --output-json "./desired-path-to-analyzer-results.json"** + python ./call_analyze.py --analyzer-id mySampleAnalyzer --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken + --output-json "./desired-path-to-analyzer-results.json" For the --analyzer-id argument, please input the analyzer ID of the created Analyzer. Additionally, specifying the --output-json isn't neccesary. The default location is "./sample_documents/analyzer_result.json". +## Possible Issues +These are some issues that you might encounter when creating an analyzer or calling analyze. +### Creating an Analyzer +If you get a **400** Error, please be sure to check these following items: +- Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ +- Make sure that all your fields in your analyzer.json meet these naming requirements + + - Starts only with a letter or an underscore + - Is in between 1 to 64 characters long + - Only uses letters, numbers, and underscores +- Make sure that your analyzer ID specified meets these naming requirements + - Is in between 1 to 64 characters long + - Only uses letters, numbers, dots, underscores, and hyphens + +If you get a **401** error, make sure that your API key or subscription ID is correct and that you have access to the endpoint you've specified. This is an authentication error. + +If you get a **409** error while creating your analyzer, that means that you have already created an analyzer with that analyzer ID. Please try using another ID. +### Calling Analyze +If you get a **400** Error, please be sure to check the following items: +- Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview_ +- Make sure that you've specified the correct SAS URL for the document you are analyzing + +If you get a **401** error, make sure that your API key or subscription ID is correct and that you have access to the endpoint you've specified. This is an authentication error. + +If you get a **404** Error while trying to call analyze, that means that there is no analyzer with the analyzer ID you have specified. Please create an analyzer with such an ID. ## Things of Note - You will need to be using a version of Python above 3.9 - Fields with FieldType "signature," which are supported in 2024-11-30 Custom Neural, are not supported in the latest version of Content Understanding (2025-05-01-preview), and thus will be ignored when creating the analyzer From 6a0381c3ffc11f48eda3386f69673ddb11d12eab Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 12:57:45 -0500 Subject: [PATCH 23/50] added assets --- .../assets/endpoint-with-keys.png | 3 + .../assets/endpoint.png | 3 + .../assets/manage-connections.png | 3 + .../assets/sample-azure-resource.png | 3 + .../assets/subscription-id.png | 3 + .../create_analyzer.py | 14 +- .../sample_documents/analyzer_result.json | 6531 ++++++++--------- 7 files changed, 3074 insertions(+), 3486 deletions(-) create mode 100644 python/di_to_cu_migration_tool/assets/endpoint-with-keys.png create mode 100644 python/di_to_cu_migration_tool/assets/endpoint.png create mode 100644 python/di_to_cu_migration_tool/assets/manage-connections.png create mode 100644 python/di_to_cu_migration_tool/assets/sample-azure-resource.png create mode 100644 python/di_to_cu_migration_tool/assets/subscription-id.png diff --git a/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png b/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png new file mode 100644 index 0000000..effd683 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b08d9c72dff1f5804075d66211f96b4f5c90f8a73d288f7ee31bbf20e67b291 +size 246334 diff --git a/python/di_to_cu_migration_tool/assets/endpoint.png b/python/di_to_cu_migration_tool/assets/endpoint.png new file mode 100644 index 0000000..dacd3d0 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/endpoint.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fc06f541aa280f123790781264ceb8e178ce1d3aaf666bcc797d2f4c0f829e1 +size 143369 diff --git a/python/di_to_cu_migration_tool/assets/manage-connections.png b/python/di_to_cu_migration_tool/assets/manage-connections.png new file mode 100644 index 0000000..c9e27d5 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/manage-connections.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19887a67edffd6878168aa33e18a04a5943d01329814a598482d2d2fd9e7ee1d +size 57933 diff --git a/python/di_to_cu_migration_tool/assets/sample-azure-resource.png b/python/di_to_cu_migration_tool/assets/sample-azure-resource.png new file mode 100644 index 0000000..e23780b --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/sample-azure-resource.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6208088a3bab0f171e85ef55a9ee42a3acfd67dc1d2ad5303b395eb678ebee64 +size 124709 diff --git a/python/di_to_cu_migration_tool/assets/subscription-id.png b/python/di_to_cu_migration_tool/assets/subscription-id.png new file mode 100644 index 0000000..47d4e4b --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/subscription-id.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3207a396aecfdb71e441d574a836a0602b8a6a6fd2e675c3db39b905128a5f4a +size 111465 diff --git a/python/di_to_cu_migration_tool/create_analyzer.py b/python/di_to_cu_migration_tool/create_analyzer.py index b849f4b..45bb5ec 100644 --- a/python/di_to_cu_migration_tool/create_analyzer.py +++ b/python/di_to_cu_migration_tool/create_analyzer.py @@ -56,24 +56,12 @@ def main( "Content-Type": "application/json" } - # Request Body - config, desciription, fieldSchema, scenario, tags, & trainingData - request_body = { - "baseAnalyzerId": analyzer_json["baseAnalyzerId"], - "description": analyzer_json["fieldSchema"]["description"], - "config": analyzer_json["config"], - "fieldSchema": analyzer_json["fieldSchema"], - "trainingData": { - "kind": "blob", - "containerUrl": target_container_sas_url, - "prefix": target_blob_folder - } - } print(f"[yellow]Creating analyzer with analyzer ID: {analyzer_id}...[/yellow]") response = requests.put( url=endpoint, headers=headers, - json=request_body, + json=analyzer_json, ) response.raise_for_status() operation_location = response.headers.get("Operation-Location", None) diff --git a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json index 4b16664..89eb1da 100644 --- a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json +++ b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json @@ -1,74 +1,70 @@ { - "id": "3746c7bf-a76e-454d-a7dc-5ba6670b78a8", + "id": "02b6a48b-e632-4907-b69f-d27677be75a3", "status": "Succeeded", "result": { - "analyzerId": "522-4", + "analyzerId": "mySampleAnalyzer", "apiVersion": "2025-05-01-preview", - "createdAt": "2025-05-22T22:31:02Z", + "createdAt": "2025-05-28T16:34:06Z", "warnings": [], "contents": [ { - "markdown": "
\n\nDEA FORM-222\n\n
\n\n\n# U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II DRUG ENFORCEMENT ADMINISTRATION\n\nOMB APPROVAL No. 1117-0010\n\nPURCHASER INFORMATION\n\nINMAR RX SOLUTIONS, INC\n3845 GRAND LAKES WAY\nSUITE 125\nGRAND PRAIRIE, TX 75050-0000\n\nREGISTRATION INFORMATION\n\nREGISTRATION #, RR0191902\n\nREGISTERED AS: REVERSE DISTRIB\nSCHEDULES: 1,2,2N,3,3N,4,5,\nORDER FORM NUMBER. 231454769\n\nDATE ISSUED. 09262023\nORDER FORM 3 OF 3\n\nSUPPLIER DEA NUMBER:#\n\nFA5718830\n\nPART 2: TO BE FILLED IN BY PURCHASER\nCVS PHARMACY # 16800\n\nBUSINESS NAME\n\n4601 MONTGOMERY HWY STE 300\n\nSTREET ADDRESS\n\nDOTHAN, AL 36303\n\nCITY, STATE, ZIP CODE\n\nPART 1: TO BE FILLED IN BY PURCHASER\n\nDIANA RUIZ DEA CLERK\n\nPrint or Type Name and Title\n\nManuel\n\nby power of attorney\n10/23/2023\n\nSignature of Requesting Official (must be authorized to sign order form)\n\nDate\n\n\n\n\n\n\n\n\n\n\n\n\n\n
PART 5: TO BE FILLED IN BY PURCHASERPART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill
ALTERNATE DEA #
Signature- by first supplier Lingua. Drier 10-26-23 DATE OFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ITEMNO OF PACKAGESPACKAGE SIZENAME OF ITEMNUMBER REC'DDATE REC'DPART4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODENUMBER SHIPPEDDATE SHIPPED
1120.000METHADONE HCL 10 MG TABLET TAB00054-0710-252010-30-21
2110.000DEXMETHYLPHENIDATE ER 25 MG CP00115-1709-01100.30-23
3190.000CONCERTA ER 27 MG TABLET TAB E50458-0588-01900-30-23
4140.000MYDAYIS ER 25 MG CAPSULE CPTP54092-0471-01400 30-23
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
4LAST LINE COMPLETED (MUST BE 20 OR LESS)
\n", + "markdown": "RX SOLUTIONS. ING\nHAND LAKES WAY\n125\nPRAIRIE, TX 75050-0000\n\nREGISTRATION #: KR0191902\nREGISTERED AS: REVERSE DISTRIB\nSCHEDULES: 1,2,2N,3,3N,4,5,\nORDER FORM NUMBER: 231554550\n\nDATE ISSUED. 10162023\nORDER FORM. 1 OF 3.\n\nPART 2: TO BE FILLED IN BY PURCHASER\n\n: CVS PHARMACY # 03896\n\nBUSINESS NAME\n\n9308 KENDALL DR.\n\nSTREET ADDRESS\nCHARLOTTE, NC 28214\n\nCITY, STATE, ZIP CODE\n\nAR8109046\n\n: TO BE FILLED IN BY PURCHASER\n\nGladys Irasema Ruga\n\nDEA.Clerk\n\nNage and Title\n8\n\nby power of attorney\n11/06/2023\n\nRequestingiOfficial (must be atthonzed'to signiorder form)\n\nDate\n\nPART 5:\nTO BE\nFILLED IN BY\nPURCHASER\n\nPART 3: ALTERNATE SUPPLIER IDENTIFICATION - to bf You kly ft: o .p.r\n(name in part 2) if order is endorsed foranother suppker to f.l:\nALTERNATE DEA #\n\nSignature- by first supplier\n\nOFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER\n\n04'T\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
NO. OF PACKAGESPACKAGE SIZE1 NAME OF ITEMNUMBER REC'DDATE REC'DPART4:TO BE FILLED IN BY SUPPLIER NATIONALIDRUG CODENUMBER SHIPPEDDATE SixPFAD
110 .. 000DEXTROAMP-AMPHET' ER 10 MG CAP00406-8952-01TRY11/20/23
13 .000OXYCODONE HCL. (IR)' 20 MG TAB T10702-0057-01/BC1/20/23
1473.000MLLORTAB 10 MG-300 MGY15 ML ELXR17478-0450-161111/29/23
12.000OXYCODONE-ACETAM 10-325 TAB TA42858-01-04-021. BE14/20/20
1.10.000DEXTROAMP-AMPHET ER 30 MG CAP43975-0282-2019911/20/23
11 .000DEXTROAMP-AMPHETAMIN 20 MG TAB64850-0505-0120111/20/23
110. 0001mHYDROCODONE-ACETAMN 7.5-325/1571930-0027-431BE1/20/23
LAST LINE COMPLETED (MUST BE 20 OR LESS)
\n", "fields": { "supplier_dea_number": { "type": "string", - "valueString": "FA5718830", + "valueString": "AR8109046", "spans": [ { - "offset": 458, + "offset": 373, "length": 9 } ], - "confidence": 0.925, - "source": "D(1,26.1302,3.1131,32.1504,3.0263,32.1504,3.9099,26.1612,4.0254)" + "confidence": 0.482, + "source": "D(1,27.8109,0.1711,34.0618,0.7163,34.0570,1.7014,27.7851,1.0512)" }, "order_form_number": { "type": "integer", - "valueInteger": 231454769, + "valueInteger": 231554550, "spans": [ { - "offset": 383, + "offset": 165, "length": 9 } ], - "confidence": 0.934, - "source": "D(1,14.8168,5.7632,16.4570,5.7236,16.4620,5.9833,14.8211,6.0277)" + "confidence": 0.951, + "source": "D(1,14.2315,2.0309,16.2579,2.0066,16.2579,2.3438,14.2349,2.3769)" }, "print_or_type_name_and_title": { "type": "string", - "valueString": "DIANA RUIZ DEA CLERK", + "valueString": "Gladys Irasema Ruga DEA.Clerk", "spans": [ { - "offset": 667, - "length": 20 + "offset": 416, + "length": 19 + }, + { + "offset": 437, + "length": 9 } ], - "confidence": 0.729, - "source": "D(1,4.1952,8.7520,8.6268,8.7454,8.6273,9.0760,4.1957,9.0826)" + "confidence": 0.562, + "source": "D(1,0.1994,5.6888,4.1336,5.5585,4.1471,5.9648,0.2128,6.0951);D(1,4.7401,5.4898,6.7047,5.4653,6.7047,5.8371,4.7406,5.8579)" }, "date": { "type": "date", - "valueDate": "2023-10-23", + "valueDate": "2023-11-06", "spans": [ { - "offset": 748, + "offset": 487, "length": 10 } ], - "confidence": 0.793, - "source": "D(1,12.1968,9.5037,14.5898,9.4761,14.5898,9.7643,12.1980,9.8022)" + "confidence": 0.961, + "source": "D(1,10.8632,6.4914,13.7220,6.4991,13.7220,6.8744,10.8634,6.8742)" }, "last_line_completed": { "type": "string", - "valueString": "4:", - "spans": [ - { - "offset": 1416, - "length": 2 - } - ], - "confidence": 0.299, - "source": "D(1,21.1873,10.9801,21.4748,10.9744,21.4805,11.2211,21.1927,11.2300)" + "confidence": 0.408 }, "ItemList": { "type": "array", @@ -81,48 +77,48 @@ "valueString": "1", "spans": [ { - "offset": 1805, + "offset": 1433, "length": 1 } ], - "confidence": 0.779, - "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + "confidence": 0.758, + "source": "D(1,0.1454,10.0663,0.3995,10.0750,0.3995,10.4060,0.1475,10.4063)" }, "NumberReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "DateReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "NumberShipped": { "type": "string", - "valueString": "20", + "valueString": "TRY", "spans": [ { - "offset": 1753, - "length": 2 + "offset": 1381, + "length": 3 } ], - "confidence": 0.953, - "source": "D(1,29.2262,11.5767,30.0234,11.5536,30.0234,12.0171,29.2287,12.0318)" + "confidence": 0.613, + "source": "D(1,30.9655,9.9512,32.0469,9.9114,32.0469,10.4970,30.9665,10.5729)" }, "DateShipped": { "type": "string", - "valueString": "10-30-21", + "valueString": "11/20/23", "spans": [ { - "offset": 1765, + "offset": 1404, "length": 8 } ], - "confidence": 0.982, - "source": "D(1,30.7881,11.6001,32.9062,11.5243,32.9062,11.9775,30.7961,12.0184)" + "confidence": 0.894, + "source": "D(1,32.3628,10.1513,34.0270,10.1415,34.0270,10.6114,32.3613,10.6090)" }, "ShipInfo": { "type": "string", - "confidence": 0.919 + "confidence": 0.618 } } }, @@ -131,51 +127,51 @@ "valueObject": { "NumOfPackage": { "type": "string", - "valueString": "1", + "valueString": "1/20/23", "spans": [ { - "offset": 1805, - "length": 1 + "offset": 1668, + "length": 7 } ], - "confidence": 0.833, - "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + "confidence": 0.317, + "source": "D(1,32.2331,10.8738,34.0097,10.8829,34.0097,11.4062,32.2334,11.3856)" }, "NumberReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "DateReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "NumberShipped": { "type": "string", - "valueString": "10", + "valueString": "/BC", "spans": [ { - "offset": 2015, - "length": 2 + "offset": 1645, + "length": 3 } ], - "confidence": 0.953, - "source": "D(1,29.3355,12.2962,29.9180,12.2871,29.9180,12.7030,29.3398,12.7266)" + "confidence": 0.568, + "source": "D(1,30.9008,10.6977,31.9253,10.6375,31.9253,11.1358,30.8995,11.2500)" }, "DateShipped": { "type": "string", - "valueString": "0.30-23", + "valueString": "1/20/23", "spans": [ { - "offset": 2027, + "offset": 1668, "length": 7 } ], - "confidence": 0.95, - "source": "D(1,30.8197,12.2063,32.6205,12.1421,32.6250,12.6023,30.8267,12.6211)" + "confidence": 0.881, + "source": "D(1,32.2331,10.8738,34.0097,10.8829,34.0097,11.4062,32.2334,11.3856)" }, "ShipInfo": { "type": "string", - "confidence": 0.919 + "confidence": 0.618 } } }, @@ -187,48 +183,154 @@ "valueString": "1", "spans": [ { - "offset": 2066, + "offset": 1696, "length": 1 } ], - "confidence": 0.778, - "source": "D(1,2.8774,13.3745,3.0937,13.3699,3.0937,13.6249,2.8784,13.6299)" + "confidence": 0.764, + "source": "D(1,0.1624,10.7778,0.3995,10.7799,0.3995,11.1549,0.1671,11.1582)" }, "NumberReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "DateReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "NumberShipped": { "type": "string", - "valueString": "90", + "valueString": "11", "spans": [ { - "offset": 2276, + "offset": 1909, "length": 2 } ], - "confidence": 0.942, - "source": "D(1,29.3457,12.8264,30.0762,12.8087,30.0762,13.2387,29.3490,13.2539)" + "confidence": 0.666, + "source": "D(1,30.7973,11.4392,31.7169,11.4102,31.7169,11.9391,30.7992,12.0139)" }, "DateShipped": { "type": "string", - "valueString": "0-30-23", + "valueString": "11/29/23", "spans": [ { - "offset": 2288, - "length": 7 + "offset": 1931, + "length": 8 + } + ], + "confidence": 0.929, + "source": "D(1,32.1817,11.5598,33.9923,11.5762,33.9923,12.0965,32.1800,12.0650)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.618 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1.", + "spans": [ + { + "offset": 2170, + "length": 2 + } + ], + "confidence": 0.498, + "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6494)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.618 + }, + "DateReceived": { + "type": "string", + "confidence": 0.618 + }, + "NumberShipped": { + "type": "string", + "valueString": "1. BE", + "spans": [ + { + "offset": 2170, + "length": 5 + } + ], + "confidence": 0.536, + "source": "D(1,30.6681,12.1104,31.5770,12.0174,31.6327,12.5617,30.7239,12.6548)" + }, + "DateShipped": { + "type": "string", + "valueString": "14/20/20", + "spans": [ + { + "offset": 2197, + "length": 8 } ], - "confidence": 0.95, - "source": "D(1,30.8413,12.8227,32.7656,12.7573,32.7656,13.2025,30.8487,13.2304)" + "confidence": 0.857, + "source": "D(1,32.1902,12.2228,33.8881,12.2312,33.8881,12.7524,32.1894,12.7234)" }, "ShipInfo": { "type": "string", - "confidence": 0.919 + "confidence": 0.618 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1.", + "spans": [ + { + "offset": 2226, + "length": 2 + } + ], + "confidence": 0.621, + "source": "D(1,0.2497,12.2349,0.4863,12.2273,0.4863,12.5428,0.2523,12.5437)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.618 + }, + "DateReceived": { + "type": "string", + "confidence": 0.618 + }, + "NumberShipped": { + "type": "string", + "valueString": "199", + "spans": [ + { + "offset": 2436, + "length": 3 + } + ], + "confidence": 0.856, + "source": "D(1,30.6173,12.7434,31.5084,12.6859,31.5084,13.1804,30.6196,13.2986)" + }, + "DateShipped": { + "type": "string", + "valueString": "11/20/23", + "spans": [ + { + "offset": 2459, + "length": 8 + } + ], + "confidence": 0.929, + "source": "D(1,32.0937,12.8805,33.9054,12.8638,33.9054,13.4041,32.0946,13.4066)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.618 } } }, @@ -240,48 +342,101 @@ "valueString": "1", "spans": [ { - "offset": 2327, + "offset": 2499, "length": 1 } ], - "confidence": 0.724, - "source": "D(1,2.8882,13.9822,3.0937,13.9722,3.0937,14.2450,2.8891,14.2527)" + "confidence": 0.732, + "source": "D(1,2.1497,12.9734,2.3598,12.9751,2.3591,13.3055,2.1492,13.3033)" + }, + "NumberReceived": { + "type": "string", + "confidence": 0.618 + }, + "DateReceived": { + "type": "string", + "confidence": 0.618 + }, + "NumberShipped": { + "type": "string", + "valueString": "201", + "spans": [ + { + "offset": 2698, + "length": 3 + } + ], + "confidence": 0.86, + "source": "D(1,31.5980,13.9945,30.6052,14.0596,30.6052,13.4532,31.5982,13.4094)" + }, + "DateShipped": { + "type": "string", + "valueString": "11/20/23", + "spans": [ + { + "offset": 2723, + "length": 8 + } + ], + "confidence": 0.934, + "source": "D(1,32.0781,13.5077,33.8360,13.5193,33.8360,14.0104,32.0794,14.0042)" + }, + "ShipInfo": { + "type": "string", + "confidence": 0.618 + } + } + }, + { + "type": "object", + "valueObject": { + "NumOfPackage": { + "type": "string", + "valueString": "1BE", + "spans": [ + { + "offset": 2965, + "length": 3 + } + ], + "confidence": 0.452, + "source": "D(1,30.6647,14.1383,31.4911,14.0895,31.4911,14.5321,30.6676,14.6181)" }, "NumberReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "DateReceived": { "type": "string", - "confidence": 0.958 + "confidence": 0.618 }, "NumberShipped": { "type": "string", - "valueString": "40.000", + "valueString": "1BE", "spans": [ { - "offset": 2338, - "length": 6 + "offset": 2965, + "length": 3 } ], - "confidence": 0.548, - "source": "D(1,4.6643,13.9401,6.0820,13.9293,6.0820,14.1896,4.6656,14.2031)" + "confidence": 0.839, + "source": "D(1,30.6647,14.1383,31.4911,14.0895,31.4911,14.5321,30.6676,14.6181)" }, "DateShipped": { "type": "string", - "valueString": "0-30-23", + "valueString": "1/20/23", "spans": [ { - "offset": 2288, + "offset": 2990, "length": 7 } ], - "confidence": 0.95, - "source": "D(1,30.8383,12.8041,32.7656,12.7573,32.7764,13.2022,30.8492,13.2490)" + "confidence": 0.93, + "source": "D(1,31.9968,14.1728,33.7839,14.2193,33.7839,14.7674,31.9984,14.7409)" }, "ShipInfo": { "type": "string", - "confidence": 0.919 + "confidence": 0.618 } } } @@ -289,11 +444,19 @@ }, "FullFormNumber": { "type": "string", - "confidence": 0.887 + "confidence": 0.664 }, "FirstPackageNumber": { "type": "string", - "confidence": 0.887 + "valueString": "1", + "spans": [ + { + "offset": 1168, + "length": 1 + } + ], + "confidence": 0.489, + "source": "D(1,0.1434,9.3461,0.3995,9.3553,0.3995,9.6993,0.1449,9.6947)" } }, "kind": "document", @@ -303,3391 +466,2980 @@ "pages": [ { "pageNumber": 1, - "angle": -0.9532, - "width": 36, - "height": 27, + "angle": 0.8350518, + "width": 35.5556, + "height": 26.6667, "spans": [ { "offset": 0, - "length": 5956 + "length": 5872 } ], "words": [ - { - "content": "DEA", - "span": { - "offset": 10, - "length": 3 - }, - "confidence": 0.994, - "source": "D(1,1.2601,1.4768,2.0074,1.4489,2.0164,1.7351,1.2699,1.7627)" - }, - { - "content": "FORM-222", - "span": { - "offset": 14, - "length": 8 - }, - "confidence": 0.989, - "source": "D(1,2.1141,1.4449,3.8964,1.3773,3.9023,1.6574,2.1232,1.7301)" - }, - { - "content": "U.S.", - "span": { - "offset": 38, - "length": 4 - }, - "confidence": 0.992, - "source": "D(1,12.2921,0.875,12.9654,0.8424,12.9739,1.1427,12.3006,1.1727)" - }, - { - "content": "OFFICIAL", - "span": { - "offset": 43, - "length": 8 - }, - "confidence": 0.995, - "source": "D(1,13.0981,0.8373,14.8046,0.7838,14.8127,1.0841,13.1066,1.1375)" - }, - { - "content": "ORDER", - "span": { - "offset": 52, - "length": 5 - }, - "confidence": 0.994, - "source": "D(1,14.898,0.7815,16.231,0.7482,16.2387,1.0509,14.9061,1.0821)" - }, - { - "content": "FORMS", - "span": { - "offset": 58, - "length": 5 - }, - "confidence": 0.996, - "source": "D(1,16.3539,0.7442,17.677,0.712,17.6843,1.013,16.3616,1.0468)" - }, - { - "content": "-", - "span": { - "offset": 64, - "length": 1 - }, - "confidence": 0.913, - "source": "D(1,17.7902,0.7101,17.9279,0.7077,17.9351,1.0087,17.7974,1.011)" - }, - { - "content": "SCHEDULES", - "span": { - "offset": 66, - "length": 9 - }, - "confidence": 0.993, - "source": "D(1,18.0214,0.706,20.2892,0.6668,20.2968,0.9651,18.0286,1.0071)" - }, - { - "content": "I", - "span": { - "offset": 76, - "length": 1 - }, - "confidence": 0.109, - "source": "D(1,20.4073,0.6651,20.5008,0.6638,20.5086,0.9624,20.415,0.9636)" - }, - { - "content": "&", - "span": { - "offset": 78, - "length": 1 - }, - "confidence": 0.988, - "source": "D(1,20.6238,0.6625,20.8698,0.6603,20.8775,0.9578,20.6316,0.9608)" - }, - { - "content": "II", - "span": { - "offset": 80, - "length": 2 - }, - "confidence": 0.212, - "source": "D(1,20.983,0.6593,21.1816,0.6574,21.1816,0.954,20.9906,0.9564)" - }, - { - "content": "DRUG", - "span": { - "offset": 83, - "length": 4 - }, - "confidence": 0.986, - "source": "D(1,13.4708,1.2365,14.4112,1.2046,14.4186,1.4787,13.4789,1.51)" - }, - { - "content": "ENFORCEMENT", - "span": { - "offset": 88, - "length": 11 - }, - "confidence": 0.993, - "source": "D(1,14.5238,1.2021,17.0668,1.1345,17.0721,1.409,14.5309,1.4754)" - }, - { - "content": "ADMINISTRATION", - "span": { - "offset": 100, - "length": 14 - }, - "confidence": 0.993, - "source": "D(1,17.1433,1.1324,20.0391,1.0714,20.0391,1.3477,17.1486,1.4066)" - }, - { - "content": "OMB", - "span": { - "offset": 116, - "length": 3 - }, - "confidence": 0.997, - "source": "D(1,27.5155,0.5202,28.2442,0.5076,28.246,0.7673,27.5182,0.7794)" - }, - { - "content": "APPROVAL", - "span": { - "offset": 120, - "length": 8 - }, - "confidence": 0.995, - "source": "D(1,28.33,0.5062,30.0877,0.496,30.0895,0.7579,28.3317,0.7661)" - }, - { - "content": "No.", - "span": { - "offset": 129, - "length": 3 - }, - "confidence": 0.992, - "source": "D(1,30.1863,0.4951,30.6879,0.4947,30.6896,0.7567,30.188,0.7565)" - }, - { - "content": "1117-0010", - "span": { - "offset": 133, - "length": 9 - }, - "confidence": 0.994, - "source": "D(1,30.7865,0.4946,32.3086,0.4851,32.3086,0.7462,30.7883,0.7565)" - }, - { - "content": "PURCHASER", - "span": { - "offset": 144, - "length": 9 - }, - "confidence": 0.996, - "source": "D(1,1.544,3.6892,3.5436,3.6155,3.5469,3.8829,1.5503,3.961)" - }, - { - "content": "INFORMATION", - "span": { - "offset": 154, - "length": 11 - }, - "confidence": 0.993, - "source": "D(1,3.6405,3.6113,5.959,3.5411,5.959,3.811,3.6438,3.8792)" - }, - { - "content": "INMAR", - "span": { - "offset": 167, - "length": 5 - }, - "confidence": 0.992, - "source": "D(1,1.5373,4.4197,2.5254,4.3841,2.53,4.6487,1.5438,4.6851)" - }, { "content": "RX", "span": { - "offset": 173, + "offset": 0, "length": 2 }, - "confidence": 0.995, - "source": "D(1,2.6355,4.3782,3.0545,4.3602,3.0588,4.6284,2.6399,4.6435)" + "confidence": 0.616, + "source": "D(1,0.2241,0.277,0.7483,0.2746,0.7489,0.6039,0.2253,0.5979)" }, { - "content": "SOLUTIONS,", + "content": "SOLUTIONS.", "span": { - "offset": 176, + "offset": 3, "length": 10 }, - "confidence": 0.914, - "source": "D(1,3.1515,4.3567,5.1506,4.3128,5.1526,4.5855,3.1558,4.6248)" + "confidence": 0.575, + "source": "D(1,0.8642,0.2756,3.1596,0.2845,3.1591,0.6235,0.8647,0.6067)" }, { - "content": "INC", + "content": "ING", "span": { - "offset": 187, + "offset": 14, "length": 3 }, - "confidence": 0.98, - "source": "D(1,5.2654,4.3114,5.8359,4.3022,5.8359,4.5745,5.2673,4.584)" + "confidence": 0.832, + "source": "D(1,3.2755,0.2843,3.9429,0.2829,3.9429,0.624,3.2748,0.6224)" }, { - "content": "3845", + "content": "HAND", "span": { - "offset": 191, + "offset": 18, "length": 4 }, - "confidence": 0.992, - "source": "D(1,1.5215,4.7671,2.2048,4.7445,2.2105,5.0158,1.5257,5.0413)" - }, - { - "content": "GRAND", - "span": { - "offset": 196, - "length": 5 - }, - "confidence": 0.995, - "source": "D(1,2.3069,4.7417,3.425,4.7063,3.4283,4.9762,2.3124,5.0116)" + "confidence": 0.53, + "source": "D(1,0.067,0.7135,1.1941,0.7091,1.1942,1.0465,0.0681,1.0318)" }, { "content": "LAKES", "span": { - "offset": 202, + "offset": 23, "length": 5 }, - "confidence": 0.993, - "source": "D(1,3.5404,4.7037,4.6235,4.6853,4.625,4.9569,3.5435,4.9738)" + "confidence": 0.947, + "source": "D(1,1.2986,0.7096,2.5302,0.7139,2.5295,1.056,1.2988,1.0483)" }, { "content": "WAY", "span": { - "offset": 208, + "offset": 29, "length": 3 }, - "confidence": 0.999, - "source": "D(1,4.7167,4.6851,5.4844,4.6791,5.4844,4.9471,4.7182,4.9559)" - }, - { - "content": "SUITE", - "span": { - "offset": 212, - "length": 5 - }, - "confidence": 0.994, - "source": "D(1,1.5066,5.1386,2.4023,5.0975,2.4088,5.3597,1.514,5.4019)" + "confidence": 0.992, + "source": "D(1,2.6402,0.7139,3.5199,0.7125,3.5154,1.0541,2.6388,1.0542)" }, { "content": "125", "span": { - "offset": 218, + "offset": 33, "length": 3 }, - "confidence": 0.999, - "source": "D(1,2.5223,5.0921,3.041,5.0704,3.041,5.3308,2.5289,5.3532)" - }, - { - "content": "GRAND", - "span": { - "offset": 222, - "length": 5 - }, - "confidence": 0.996, - "source": "D(1,1.4852,5.4785,2.6085,5.4585,2.61,5.7306,1.4908,5.7458)" + "confidence": 0.989, + "source": "D(1,0.1357,1.1495,0.7408,1.1458,0.7412,1.4653,0.1366,1.4685)" }, { "content": "PRAIRIE,", "span": { - "offset": 228, + "offset": 37, "length": 8 }, - "confidence": 0.988, - "source": "D(1,2.7074,5.4567,4.159,5.4433,4.1606,5.7212,2.7087,5.7304)" + "confidence": 0.963, + "source": "D(1,0.3133,1.5823,1.9635,1.5821,1.9638,1.9413,0.3145,1.9299)" }, { "content": "TX", "span": { - "offset": 237, + "offset": 46, "length": 2 }, - "confidence": 0.993, - "source": "D(1,4.2488,5.4424,4.6938,5.4405,4.6957,5.7166,4.2505,5.72)" + "confidence": 0.999, + "source": "D(1,2.0731,1.5834,2.5693,1.5851,2.5698,1.9429,2.0734,1.9419)" }, { "content": "75050-0000", "span": { - "offset": 240, + "offset": 49, "length": 10 }, - "confidence": 0.994, - "source": "D(1,4.7792,5.4404,6.5543,5.4249,6.5565,5.6969,4.7811,5.7159)" + "confidence": 0.011, + "source": "D(1,2.6674,1.5849,4.6551,1.5839,4.6551,1.9326,2.6679,1.9427)" }, { "content": "REGISTRATION", "span": { - "offset": 252, + "offset": 61, "length": 12 }, - "confidence": 0.996, - "source": "D(1,10.8055,3.4881,13.2127,3.4254,13.2163,3.679,10.8083,3.7441)" + "confidence": 0.635, + "source": "D(1,9.6456,0.4419,12.55,0.3785,12.5542,0.7262,9.6475,0.7803)" }, { - "content": "INFORMATION", + "content": "#:", "span": { - "offset": 265, - "length": 11 - }, - "confidence": 0.99, - "source": "D(1,13.379,3.422,15.6973,3.3675,15.6973,3.6162,13.3826,3.6754)" - }, - { - "content": "REGISTRATION", - "span": { - "offset": 278, - "length": 12 - }, - "confidence": 0.992, - "source": "D(1,10.8301,4.4091,13.2832,4.3517,13.2882,4.6207,10.8325,4.6758)" - }, - { - "content": "#,", - "span": { - "offset": 291, + "offset": 74, "length": 2 }, - "confidence": 0.641, - "source": "D(1,13.3754,4.3492,13.6343,4.3431,13.6395,4.613,13.3803,4.6187)" + "confidence": 0.226, + "source": "D(1,12.6286,0.377,12.9545,0.371,12.9595,0.7167,12.633,0.7245)" }, { - "content": "RR0191902", + "content": "KR0191902", "span": { - "offset": 294, + "offset": 77, "length": 9 }, - "confidence": 0.992, - "source": "D(1,13.7484,4.3407,15.5171,4.3069,15.5215,4.5711,13.7537,4.6105)" + "confidence": 0.635, + "source": "D(1,13.0837,0.3687,15.2158,0.3311,15.2158,0.671,13.0888,0.7131)" }, { "content": "REGISTERED", "span": { - "offset": 305, + "offset": 87, "length": 10 }, - "confidence": 0.992, - "source": "D(1,10.8477,4.8828,12.9691,4.837,12.9735,5.1044,10.8493,5.1555)" + "confidence": 0.963, + "source": "D(1,9.6149,0.9906,12.0098,0.9347,12.0143,1.293,9.6174,1.3437)" }, { "content": "AS:", "span": { - "offset": 316, + "offset": 98, "length": 3 }, - "confidence": 0.993, - "source": "D(1,13.0532,4.8344,13.5846,4.8198,13.5895,5.09,13.0577,5.1023)" + "confidence": 0.95, + "source": "D(1,12.2275,0.9301,12.8454,0.9161,12.8509,1.2721,12.2322,1.2875)" }, { "content": "REVERSE", "span": { - "offset": 320, + "offset": 102, "length": 7 }, - "confidence": 0.995, - "source": "D(1,13.6909,4.8172,15.2498,4.7806,15.2547,5.0513,13.6958,5.0877)" + "confidence": 0.978, + "source": "D(1,12.969,0.9133,14.8461,0.8706,14.8528,1.2304,12.9747,1.2693)" }, { "content": "DISTRIB", "span": { - "offset": 328, + "offset": 110, "length": 7 }, - "confidence": 0.992, - "source": "D(1,15.3517,4.778,16.6581,4.7462,16.6641,5.0141,15.3565,5.0482)" + "confidence": 0.989, + "source": "D(1,14.9579,0.8678,16.5532,0.8308,16.5532,1.1932,14.9645,1.2269)" }, { "content": "SCHEDULES:", "span": { - "offset": 336, + "offset": 118, "length": 10 }, - "confidence": 0.992, - "source": "D(1,10.8738,5.3547,12.9529,5.3151,12.9576,5.5866,10.8769,5.625)" + "confidence": 0.883, + "source": "D(1,9.6355,1.5536,12.0512,1.5052,12.0543,1.8608,9.6377,1.9057)" }, { "content": "1,2,2N,3,3N,4,5,", "span": { - "offset": 347, + "offset": 129, "length": 16 }, - "confidence": 0.647, - "source": "D(1,13.0689,5.3129,15.4246,5.2684,15.4303,5.5397,13.0737,5.5847)" + "confidence": 0.635, + "source": "D(1,12.1964,1.5021,15.0013,1.4564,15.0071,1.8138,12.1995,1.8573)" }, { "content": "ORDER", "span": { - "offset": 364, + "offset": 146, "length": 5 }, "confidence": 0.995, - "source": "D(1,10.8803,5.8462,12.0544,5.8239,12.0577,6.0862,10.8831,6.1101)" + "source": "D(1,9.6042,2.1064,10.9725,2.0827,10.9752,2.4313,9.6064,2.4479)" }, { "content": "FORM", "span": { - "offset": 370, + "offset": 152, "length": 4 }, - "confidence": 0.988, - "source": "D(1,12.1666,5.8218,13.1076,5.7999,13.111,6.064,12.17,6.0841)" + "confidence": 0.99, + "source": "D(1,11.0917,2.0808,12.2215,2.0612,12.2244,2.4106,11.0944,2.4294)" }, { - "content": "NUMBER.", + "content": "NUMBER:", "span": { - "offset": 375, + "offset": 157, "length": 7 }, - "confidence": 0.807, - "source": "D(1,13.2068,5.7975,14.7046,5.7655,14.7089,6.0307,13.2103,6.0617)" + "confidence": 0.963, + "source": "D(1,12.3181,2.0598,14.1236,2.0321,14.127,2.379,12.3209,2.4093)" }, { - "content": "231454769", + "content": "231554550", "span": { - "offset": 383, + "offset": 165, "length": 9 }, - "confidence": 0.994, - "source": "D(1,14.8168,5.7632,16.457,5.7236,16.462,5.9833,14.8211,6.0277)" + "confidence": 0.993, + "source": "D(1,14.2315,2.0309,16.2579,2.0066,16.2579,2.3438,14.2349,2.3769)" }, { "content": "DATE", "span": { - "offset": 394, + "offset": 176, "length": 4 }, - "confidence": 0.992, - "source": "D(1,10.9031,6.3305,11.7615,6.3158,11.7629,6.5948,10.9041,6.6093)" + "confidence": 0.99, + "source": "D(1,9.5403,2.7092,10.6113,2.6808,10.6147,3.0274,9.5441,3.0551)" }, { "content": "ISSUED.", "span": { - "offset": 399, + "offset": 181, "length": 7 }, - "confidence": 0.992, - "source": "D(1,11.8699,6.3133,13.1619,6.2891,13.1651,6.5657,11.8714,6.5915)" + "confidence": 0.92, + "source": "D(1,10.7201,2.6771,12.2382,2.6458,12.2425,2.9959,10.7235,3.0246)" }, { - "content": "09262023", + "content": "10162023", "span": { - "offset": 407, + "offset": 189, "length": 8 }, - "confidence": 0.996, - "source": "D(1,13.2568,6.2878,14.7129,6.2648,14.7129,6.5355,13.2602,6.5644)" + "confidence": 0.989, + "source": "D(1,12.3699,2.6441,14.1,2.61,14.1041,2.9613,12.3745,2.9938)" }, { "content": "ORDER", "span": { - "offset": 416, + "offset": 198, "length": 5 }, - "confidence": 0.998, - "source": "D(1,10.9172,6.8043,12.0865,6.7865,12.0876,7.0473,10.9184,7.0664)" + "confidence": 0.962, + "source": "D(1,9.5807,3.2531,10.8278,3.2216,10.8317,3.5906,9.5864,3.6259)" }, { - "content": "FORM", + "content": "FORM.", "span": { - "offset": 422, - "length": 4 + "offset": 204, + "length": 5 }, - "confidence": 0.992, - "source": "D(1,12.1882,6.785,13.1415,6.77,13.1432,7.0258,12.1894,7.0452)" + "confidence": 0.652, + "source": "D(1,11.0266,3.2196,12.2317,3.1972,12.236,3.5651,11.0305,3.587)" }, { - "content": "3", + "content": "1", "span": { - "offset": 427, + "offset": 210, "length": 1 }, - "confidence": 0.997, - "source": "D(1,13.2347,6.7697,13.4126,6.7673,13.4146,7.0215,13.2364,7.0243)" + "confidence": 0.954, + "source": "D(1,12.304,3.1963,12.5149,3.1928,12.5192,3.5597,12.3085,3.5634)" }, { "content": "OF", "span": { - "offset": 429, + "offset": 212, "length": 2 }, "confidence": 0.995, - "source": "D(1,13.5101,6.7656,13.9507,6.7589,13.9531,7.0128,13.5123,7.02)" + "source": "D(1,12.6234,3.1908,13.1537,3.1832,13.1571,3.546,12.6274,3.5583)" }, { - "content": "3", + "content": "3.", "span": { - "offset": 432, - "length": 1 - }, - "confidence": 0.997, - "source": "D(1,14.0524,6.757,14.2558,6.752,14.2559,7.0055,14.0551,7.0106)" - }, - { - "content": "SUPPLIER", - "span": { - "offset": 435, - "length": 8 - }, - "confidence": 0.995, - "source": "D(1,20.2403,3.3699,21.6377,3.3639,21.6387,3.59,20.2413,3.5962)" - }, - { - "content": "DEA", - "span": { - "offset": 444, - "length": 3 - }, - "confidence": 0.989, - "source": "D(1,21.7338,3.3637,22.3179,3.359,22.3192,3.5855,21.7349,3.5896)" - }, - { - "content": "NUMBER:#", - "span": { - "offset": 448, - "length": 8 - }, - "confidence": 0.893, - "source": "D(1,22.4029,3.359,23.9223,3.347,23.9238,3.5735,22.4042,3.5853)" - }, - { - "content": "FA5718830", - "span": { - "offset": 458, - "length": 9 + "offset": 215, + "length": 2 }, - "confidence": 0.995, - "source": "D(1,26.1302,3.1131,32.1504,3.0263,32.1504,3.9099,26.1612,4.0254)" + "confidence": 0.259, + "source": "D(1,13.2561,3.1815,13.5309,3.1776,13.5309,3.5385,13.2597,3.5442)" }, { "content": "PART", "span": { - "offset": 469, + "offset": 219, "length": 4 }, - "confidence": 0.936, - "source": "D(1,20.2732,4.3981,21.081,4.3873,21.0839,4.6333,20.2757,4.653)" + "confidence": 0.992, + "source": "D(1,20.9597,0.6711,22.0011,0.7337,21.992,1.042,20.9488,0.9819)" }, { "content": "2:", "span": { - "offset": 474, + "offset": 224, "length": 2 }, - "confidence": 0.977, - "source": "D(1,21.2375,4.3839,21.4913,4.3791,21.4948,4.6293,21.2403,4.6293)" + "confidence": 0.9, + "source": "D(1,22.1669,0.7456,22.4784,0.7705,22.4695,1.0766,22.158,1.0535)" }, { "content": "TO", "span": { - "offset": 477, + "offset": 227, "length": 2 }, - "confidence": 0.992, - "source": "D(1,21.6731,4.3757,22.1257,4.3698,22.1307,4.6268,21.6772,4.6294)" + "confidence": 0.976, + "source": "D(1,22.6945,0.787,23.2427,0.8233,23.2333,1.1246,22.6855,1.0918)" }, { "content": "BE", "span": { - "offset": 480, + "offset": 230, "length": 2 }, - "confidence": 0.996, - "source": "D(1,22.2357,4.3684,22.6585,4.3554,22.6644,4.6163,22.2409,4.626)" + "confidence": 0.992, + "source": "D(1,23.3734,0.8325,23.8962,0.8692,23.887,1.1723,23.3641,1.1338)" }, { "content": "FILLED", "span": { - "offset": 483, + "offset": 233, "length": 6 }, - "confidence": 0.995, - "source": "D(1,22.7727,4.3522,23.8975,4.3216,23.9058,4.5854,22.7788,4.6138)" + "confidence": 0.99, + "source": "D(1,24.0219,0.8779,25.3739,0.978,25.3644,1.2856,24.0126,1.1825)" }, { "content": "IN", "span": { - "offset": 490, + "offset": 240, "length": 2 }, - "confidence": 0.992, - "source": "D(1,24.0159,4.3189,24.3203,4.3117,24.3292,4.5737,24.0245,4.5822)" + "confidence": 0.659, + "source": "D(1,25.4594,0.984,25.8057,1.0154,25.7955,1.3259,25.4499,1.2917)" }, { "content": "BY", "span": { - "offset": 493, + "offset": 243, "length": 2 }, - "confidence": 0.999, - "source": "D(1,24.4388,4.3087,24.8869,4.2935,24.8954,4.5547,24.4474,4.5703)" + "confidence": 0.963, + "source": "D(1,25.9463,1.0283,26.4033,1.067,26.3923,1.3749,25.9357,1.3399)" }, { "content": "PURCHASER", "span": { - "offset": 496, + "offset": 246, "length": 9 }, - "confidence": 0.992, - "source": "D(1,24.9883,4.2892,27.1059,4.2053,27.1166,4.4669,24.9969,4.5505)" + "confidence": 0.985, + "source": "D(1,26.5288,1.0774,28.8509,1.3003,28.8349,1.6071,26.5178,1.3839)" + }, + { + "content": ":", + "span": { + "offset": 257, + "length": 1 + }, + "confidence": 0.999, + "source": "D(1,21.1908,1.0355,21.3523,1.0419,21.3262,1.4178,21.1642,1.4086)" }, { "content": "CVS", "span": { - "offset": 506, + "offset": 259, "length": 3 }, - "confidence": 0.993, - "source": "D(1,20.4678,4.6389,21.3708,4.6203,21.3757,4.9447,20.4757,4.9655)" + "confidence": 0.916, + "source": "D(1,21.5139,1.0484,22.5001,1.1176,22.4801,1.4987,21.4882,1.4269)" }, { "content": "PHARMACY", "span": { - "offset": 510, + "offset": 263, "length": 8 }, - "confidence": 0.988, - "source": "D(1,21.5204,4.6201,24.112,4.5785,24.1214,4.9056,21.5256,4.945)" + "confidence": 1, + "source": "D(1,22.9527,1.1507,25.9986,1.3644,25.9795,1.7495,22.9335,1.5325)" }, { "content": "#", "span": { - "offset": 519, + "offset": 272, "length": 1 }, - "confidence": 0.996, - "source": "D(1,24.2883,4.5757,24.5074,4.5723,24.5183,4.8977,24.2984,4.902)" + "confidence": 1, + "source": "D(1,26.2345,1.377,26.4757,1.402,26.4542,1.7936,26.2135,1.7698)" }, { - "content": "16800", + "content": "03896", "span": { - "offset": 521, - "length": 5 - }, - "confidence": 0.995, - "source": "D(1,24.7691,4.5643,26.1738,4.5178,26.1738,4.8401,24.7803,4.8898)" - }, - { - "content": "BUSINESS", - "span": { - "offset": 528, - "length": 8 - }, - "confidence": 0.995, - "source": "D(1,20.2808,5.1553,21.7033,5.1513,21.7051,5.3744,20.2826,5.3789)" - }, - { - "content": "NAME", - "span": { - "offset": 537, - "length": 4 + "offset": 274, + "length": 5 }, - "confidence": 0.994, - "source": "D(1,21.8021,5.1509,22.6055,5.1466,22.6055,5.3699,21.8041,5.3739)" + "confidence": 0.315, + "source": "D(1,26.6981,1.428,28.2777,1.5837,28.252,1.9571,26.6765,1.8163)" }, { - "content": "4601", + "content": "BUSINESS", "span": { - "offset": 543, - "length": 4 + "offset": 281, + "length": 8 }, - "confidence": 0.988, - "source": "D(1,20.4816,5.4477,21.5112,5.424,21.517,5.7349,20.488,5.748)" + "confidence": 0.9, + "source": "D(1,20.9513,1.5693,22.6981,1.6812,22.691,1.9765,20.9427,1.8742)" }, { - "content": "MONTGOMERY", + "content": "NAME", "span": { - "offset": 548, - "length": 10 + "offset": 290, + "length": 4 }, - "confidence": 0.993, - "source": "D(1,21.7311,5.4191,25.2048,5.3007,25.2151,5.6373,21.7372,5.7315)" + "confidence": 0.992, + "source": "D(1,22.8146,1.6889,23.8311,1.7626,23.8311,2.0456,22.8079,1.9843)" }, { - "content": "HWY", + "content": "9308", "span": { - "offset": 559, - "length": 3 + "offset": 296, + "length": 4 }, - "confidence": 0.995, - "source": "D(1,25.3603,5.295,26.4857,5.2477,26.4959,5.5879,25.3706,5.6314)" + "confidence": 0.982, + "source": "D(1,21.1249,1.9071,22.5322,2.0074,22.5198,2.4146,21.1119,2.3155)" }, { - "content": "STE", + "content": "KENDALL", "span": { - "offset": 563, - "length": 3 + "offset": 301, + "length": 7 }, - "confidence": 0.998, - "source": "D(1,26.6143,5.2418,27.5522,5.2046,27.5627,5.5443,26.6244,5.5819)" + "confidence": 0.961, + "source": "D(1,22.6655,2.0171,25.2935,2.2032,25.2819,2.608,22.6534,2.4251)" }, { - "content": "300", + "content": "DR.", "span": { - "offset": 567, + "offset": 309, "length": 3 }, - "confidence": 0.997, - "source": "D(1,27.7023,5.1995,28.5653,5.1689,28.5759,5.5121,27.7128,5.5396)" + "confidence": 0.758, + "source": "D(1,25.4136,2.2118,26.3149,2.2746,26.3124,2.6736,25.4018,2.6167)" }, { "content": "STREET", "span": { - "offset": 572, + "offset": 314, "length": 6 }, - "confidence": 0.995, - "source": "D(1,20.3042,5.9972,21.4081,5.9822,21.4097,6.2024,20.306,6.2188)" + "confidence": 0.977, + "source": "D(1,20.9062,2.5554,22.2704,2.6328,22.2597,2.9354,20.8972,2.8677)" }, { "content": "ADDRESS", "span": { - "offset": 579, + "offset": 321, "length": 7 }, - "confidence": 0.984, - "source": "D(1,21.488,5.9824,22.8516,5.965,22.8516,6.187,21.4897,6.2031)" + "confidence": 0.991, + "source": "D(1,22.4143,2.641,24.0743,2.7488,24.0723,3.0451,22.4038,2.942)" }, { - "content": "DOTHAN,", + "content": "CHARLOTTE,", "span": { - "offset": 588, - "length": 7 + "offset": 329, + "length": 10 }, - "confidence": 0.754, - "source": "D(1,20.4856,6.2245,22.5466,6.1827,22.5543,6.5139,20.494,6.5391)" + "confidence": 0.534, + "source": "D(1,21.1471,2.8903,24.6743,3.1166,24.6611,3.5251,21.1359,3.2787)" }, { - "content": "AL", + "content": "NC", "span": { - "offset": 596, + "offset": 340, "length": 2 }, - "confidence": 0.992, - "source": "D(1,22.6919,6.1783,23.3323,6.1673,23.341,6.4972,22.6998,6.5128)" + "confidence": 0.87, + "source": "D(1,24.8313,3.1273,25.6293,3.1849,25.6159,3.5881,24.8182,3.5358)" }, { - "content": "36303", + "content": "28214", "span": { - "offset": 599, + "offset": 343, "length": 5 }, - "confidence": 0.995, - "source": "D(1,23.4507,6.1652,24.9189,6.1077,24.9258,6.4455,23.4597,6.4937)" + "confidence": 0.992, + "source": "D(1,25.7994,3.1973,27.4266,3.3094,27.4165,3.7153,25.7855,3.5989)" }, { "content": "CITY,", "span": { - "offset": 606, + "offset": 350, "length": 5 }, - "confidence": 0.992, - "source": "D(1,20.3248,6.8091,21.0261,6.8015,21.0282,7.0505,20.3274,7.0591)" + "confidence": 0.999, + "source": "D(1,20.9217,3.549,21.7901,3.5897,21.781,3.9345,20.9131,3.8921)" }, { "content": "STATE,", "span": { - "offset": 612, + "offset": 356, "length": 6 }, - "confidence": 0.994, - "source": "D(1,21.1112,6.7999,22.0921,6.7862,22.0973,7.0343,21.1136,7.0493)" + "confidence": 0.999, + "source": "D(1,21.8675,3.5946,23.1559,3.6647,23.1453,4.0073,21.8581,3.9389)" }, { "content": "ZIP", "span": { - "offset": 619, + "offset": 363, "length": 3 }, - "confidence": 0.997, - "source": "D(1,22.1691,6.7854,22.619,6.7781,22.6255,7.0237,22.1744,7.0332)" + "confidence": 0.962, + "source": "D(1,23.2221,3.6701,23.6806,3.7025,23.6702,4.0394,23.2117,4.0113)" }, { "content": "CODE", "span": { - "offset": 623, + "offset": 367, "length": 4 }, - "confidence": 0.986, - "source": "D(1,22.7041,6.7768,23.551,6.7563,23.5547,6.9997,22.7106,7.0218)" + "confidence": 0.971, + "source": "D(1,23.8408,3.7142,24.8385,3.7806,24.8385,4.1068,23.8302,4.0485)" }, { - "content": "PART", + "content": "AR8109046", "span": { - "offset": 629, - "length": 4 + "offset": 373, + "length": 9 }, - "confidence": 0.988, - "source": "D(1,1.3237,8.0784,2.2418,8.0751,2.2438,8.3447,1.3268,8.3491)" + "confidence": 0.682, + "source": "D(1,27.8109,0.1711,34.0618,0.7163,34.057,1.7014,27.7851,1.0512)" }, { - "content": "1:", + "content": ":", "span": { - "offset": 634, - "length": 2 + "offset": 384, + "length": 1 }, - "confidence": 0.992, - "source": "D(1,2.3443,8.0751,2.6295,8.0727,2.6312,8.3412,2.3463,8.3442)" + "confidence": 0.414, + "source": "D(1,0.0469,4.6618,0.2071,4.6591,0.2092,5.0137,0.0492,5.0169)" }, { "content": "TO", "span": { - "offset": 637, + "offset": 386, "length": 2 }, - "confidence": 0.999, - "source": "D(1,2.7276,8.0719,3.2089,8.069,3.2104,8.3383,2.7292,8.3401)" + "confidence": 0.992, + "source": "D(1,0.2842,4.6579,0.7768,4.6491,0.7786,5.0081,0.2862,5.0122)" }, { "content": "BE", "span": { - "offset": 640, + "offset": 389, "length": 2 }, - "confidence": 0.998, - "source": "D(1,3.3158,8.0684,3.7749,8.0635,3.7763,8.3362,3.3173,8.3381)" + "confidence": 0.993, + "source": "D(1,0.8896,4.647,1.4,4.6423,1.402,5.0037,0.8914,5.0082)" }, { "content": "FILLED", "span": { - "offset": 643, + "offset": 392, "length": 6 }, - "confidence": 0.995, - "source": "D(1,3.8907,8.0622,5.0538,8.0488,5.0559,8.3259,3.8922,8.3354)" + "confidence": 0.989, + "source": "D(1,1.5009,4.6409,2.7768,4.6258,2.779,4.9938,1.5029,5.0033)" }, { "content": "IN", "span": { - "offset": 650, + "offset": 399, "length": 2 }, - "confidence": 0.997, - "source": "D(1,5.1563,8.0478,5.4727,8.0447,5.4753,8.3211,5.1586,8.3249)" + "confidence": 0.992, + "source": "D(1,2.8718,4.6252,3.2398,4.6219,3.2415,4.9908,2.8739,4.9927)" }, { "content": "BY", "span": { - "offset": 653, + "offset": 402, "length": 2 }, - "confidence": 0.977, - "source": "D(1,5.5842,8.0436,6.0432,8.0406,6.046,8.3147,5.5867,8.3195)" + "confidence": 0.999, + "source": "D(1,3.3466,4.6206,3.8926,4.6153,3.8941,4.9838,3.3482,4.9897)" }, { "content": "PURCHASER", "span": { - "offset": 656, + "offset": 405, "length": 9 }, - "confidence": 0.995, - "source": "D(1,6.2304,8.0398,8.2936,8.007,8.2969,8.2748,6.2333,8.3134)" - }, - { - "content": "DIANA", - "span": { - "offset": 667, - "length": 5 - }, - "confidence": 0.846, - "source": "D(1,4.1952,8.7544,5.2813,8.7523,5.2816,9.0782,4.1957,9.0826)" - }, - { - "content": "RUIZ", - "span": { - "offset": 673, - "length": 4 - }, - "confidence": 0.651, - "source": "D(1,5.3937,8.7523,6.3353,8.7498,6.3367,9.0776,5.394,9.0779)" - }, - { - "content": "DEA", - "span": { - "offset": 678, - "length": 3 - }, "confidence": 0.992, - "source": "D(1,6.5119,8.7501,7.2074,8.7515,7.2087,9.0758,6.5133,9.0771)" + "source": "D(1,4.0825,4.616,6.4962,4.6162,6.4962,4.9653,4.084,4.9831)" }, { - "content": "CLERK", + "content": "Gladys", "span": { - "offset": 682, - "length": 5 + "offset": 416, + "length": 6 }, - "confidence": 0.995, - "source": "D(1,7.3412,8.751,8.6252,8.7454,8.6273,9.0699,7.3425,9.0745)" + "confidence": 0.56, + "source": "D(1,0.2118,5.6969,1.4731,5.6466,1.4742,6.0525,0.2128,6.0937)" }, { - "content": "Print", + "content": "Irasema", "span": { - "offset": 689, - "length": 5 + "offset": 423, + "length": 7 }, - "confidence": 0.893, - "source": "D(1,1.3338,9.4476,1.928,9.4564,1.9288,9.7002,1.334,9.7124)" + "confidence": 0.646, + "source": "D(1,1.5855,5.6438,3.0391,5.5997,3.0392,5.9975,1.5865,6.0496)" }, { - "content": "or", + "content": "Ruga", "span": { - "offset": 695, - "length": 2 + "offset": 431, + "length": 4 }, - "confidence": 0.963, - "source": "D(1,2.0123,9.4573,2.2905,9.4572,2.2916,9.6963,2.0132,9.698)" + "confidence": 0.903, + "source": "D(1,3.1844,5.5945,4.134,5.5695,4.134,5.9609,3.1843,5.9951)" }, { - "content": "Type", + "content": "DEA.Clerk", "span": { - "offset": 698, - "length": 4 + "offset": 437, + "length": 9 }, - "confidence": 0.977, - "source": "D(1,2.3959,9.4564,3.0239,9.4483,3.0252,9.7067,2.3971,9.6975)" + "confidence": 0.63, + "source": "D(1,4.7401,5.4898,6.7047,5.4653,6.7047,5.8371,4.7406,5.8579)" }, { - "content": "Name", + "content": "Nage", "span": { - "offset": 703, + "offset": 448, "length": 4 }, - "confidence": 0.987, - "source": "D(1,3.1124,9.4465,3.8585,9.439,3.8598,9.7055,3.1137,9.7069)" + "confidence": 0.205, + "source": "D(1,0.0842,6.2265,1.4279,6.2279,1.4291,6.574,0.0877,6.5675)" }, { "content": "and", "span": { - "offset": 708, + "offset": 453, "length": 3 }, - "confidence": 0.977, - "source": "D(1,3.9807,9.4381,4.457,9.4382,4.4587,9.6972,3.982,9.7039)" + "confidence": 0.829, + "source": "D(1,1.5009,6.2276,2.0295,6.2232,2.0306,6.5723,1.5022,6.5738)" }, { "content": "Title", "span": { - "offset": 712, + "offset": 457, "length": 5 }, - "confidence": 0.647, - "source": "D(1,4.5244,9.4379,5.1103,9.429,5.1116,9.6926,4.5262,9.6961)" + "confidence": 0.843, + "source": "D(1,2.1138,6.2229,2.7444,6.2187,2.7444,6.559,2.1147,6.5718)" }, { - "content": "Manuel", + "content": "8", "span": { - "offset": 719, - "length": 6 + "offset": 463, + "length": 1 }, - "confidence": 0.187, - "source": "D(1,1.636,9.5464,5.2207,9.5363,5.2207,10.3887,1.638,10.3887)" + "confidence": 0.155, + "source": "D(1,0.0662,6.0887,1.0248,6.0828,1.0248,7.3788,0.0754,7.4826)" }, { "content": "by", "span": { - "offset": 727, + "offset": 466, "length": 2 }, "confidence": 0.989, - "source": "D(1,5.5497,9.6568,6.063,9.6522,6.0637,9.9517,5.5498,9.955)" + "source": "D(1,3.1551,6.5195,3.7822,6.5286,3.7802,6.9047,3.1511,6.9049)" }, { "content": "power", "span": { - "offset": 730, + "offset": 469, "length": 5 }, - "confidence": 0.995, - "source": "D(1,6.283,9.6493,7.5195,9.6219,7.5202,9.921,6.2839,9.9489)" + "confidence": 0.992, + "source": "D(1,3.9933,6.5291,5.4526,6.5241,5.4518,6.9046,3.9923,6.9048)" }, { "content": "of", "span": { - "offset": 736, + "offset": 475, "length": 2 }, - "confidence": 0.992, - "source": "D(1,7.7786,9.619,8.2331,9.6136,8.2346,9.9106,7.7793,9.9165)" + "confidence": 0.936, + "source": "D(1,5.6886,6.525,6.2847,6.5283,6.2833,6.9064,5.6879,6.9044)" }, { "content": "attorney", "span": { - "offset": 739, + "offset": 478, "length": 8 }, - "confidence": 0.995, - "source": "D(1,8.5166,9.6084,10.4572,9.5868,10.4576,9.8824,8.5183,9.9064)" - }, - { - "content": "10/23/2023", - "span": { - "offset": 748, - "length": 10 - }, - "confidence": 0.994, - "source": "D(1,12.1968,9.5037,14.5898,9.4761,14.5898,9.7643,12.198,9.8022)" - }, - { - "content": "Signature", - "span": { - "offset": 760, - "length": 9 - }, - "confidence": 0.992, - "source": "D(1,1.3368,10.4179,2.6234,10.4148,2.6247,10.681,1.3388,10.6875)" - }, - { - "content": "of", - "span": { - "offset": 770, - "length": 2 - }, - "confidence": 0.997, - "source": "D(1,2.7112,10.4136,2.9614,10.4094,2.9626,10.676,2.7124,10.6799)" + "confidence": 0.605, + "source": "D(1,6.5331,6.5307,8.8585,6.5384,8.8585,6.9186,6.5311,6.9067)" }, { - "content": "Requesting", + "content": "11/06/2023", "span": { - "offset": 773, + "offset": 487, "length": 10 }, - "confidence": 0.963, - "source": "D(1,3.0448,10.408,4.5113,10.388,4.5128,10.6632,3.046,10.6747)" + "confidence": 0.893, + "source": "D(1,10.8632,6.4914,13.722,6.4991,13.722,6.8744,10.8634,6.8742)" }, { - "content": "Official", + "content": "RequestingiOfficial", "span": { - "offset": 784, - "length": 8 + "offset": 499, + "length": 19 }, - "confidence": 0.986, - "source": "D(1,4.6079,10.3865,5.486,10.3742,5.4876,10.6468,4.6094,10.662)" + "confidence": 0.432, + "source": "D(1,0.0824,7.3475,3.094,7.3592,3.094,7.7262,0.0832,7.6954)" }, { "content": "(must", "span": { - "offset": 793, + "offset": 519, "length": 5 }, - "confidence": 0.992, - "source": "D(1,5.5825,10.3732,6.307,10.3638,6.3095,10.6323,5.5842,10.6448)" + "confidence": 0.319, + "source": "D(1,3.1651,7.3599,3.9951,7.3657,3.9941,7.7304,3.1651,7.7266)" }, { "content": "be", "span": { - "offset": 799, - "length": 2 - }, - "confidence": 0.995, - "source": "D(1,6.3904,10.3625,6.7065,10.3581,6.7095,10.6266,6.393,10.6311)" - }, - { - "content": "authorized", - "span": { - "offset": 802, - "length": 10 - }, - "confidence": 0.585, - "source": "D(1,6.7812,10.3572,8.1335,10.3414,8.1365,10.6051,6.7841,10.6255)" - }, - { - "content": "to", - "span": { - "offset": 813, + "offset": 525, "length": 2 }, - "confidence": 0.998, - "source": "D(1,8.2125,10.3402,8.454,10.3368,8.457,10.5988,8.2155,10.6036)" + "confidence": 0.904, + "source": "D(1,4.0662,7.3654,4.4694,7.3641,4.4678,7.7293,4.0652,7.7302)" }, { - "content": "sign", + "content": "atthonzed'to", "span": { - "offset": 816, - "length": 4 + "offset": 528, + "length": 12 }, - "confidence": 0.977, - "source": "D(1,8.5286,10.3358,9.0511,10.3277,9.055,10.5903,8.5317,10.5974)" + "confidence": 0.628, + "source": "D(1,4.5405,7.3641,6.4553,7.374,6.4546,7.7354,4.539,7.7297)" }, { - "content": "order", + "content": "signiorder", "span": { - "offset": 821, - "length": 5 + "offset": 541, + "length": 10 }, - "confidence": 0.994, - "source": "D(1,9.1257,10.3265,9.8017,10.3095,9.8068,10.5747,9.1298,10.5893)" + "confidence": 0.672, + "source": "D(1,6.5324,7.3746,8.0263,7.3831,8.0248,7.7369,6.5317,7.7357)" }, { "content": "form)", "span": { - "offset": 827, + "offset": 552, "length": 5 }, - "confidence": 0.896, - "source": "D(1,9.8675,10.3078,10.5568,10.2959,10.5623,10.557,9.8727,10.5732)" + "confidence": 0.778, + "source": "D(1,8.0975,7.3836,8.9274,7.3885,8.9255,7.742,8.0958,7.7366)" }, { "content": "Date", "span": { - "offset": 834, + "offset": 559, "length": 4 }, - "confidence": 0.987, - "source": "D(1,12.017,10.253,12.6211,10.2537,12.6211,10.4679,12.0178,10.4744)" + "confidence": 0.986, + "source": "D(1,10.6475,7.4001,11.359,7.4114,11.3588,7.6873,10.6465,7.6812)" }, { "content": "PART", "span": { - "offset": 870, + "offset": 565, "length": 4 }, "confidence": 0.989, - "source": "D(1,17.9931,8.2538,18.8759,8.2485,18.8775,8.5052,17.995,8.514)" + "source": "D(1,17.9503,5.1227,19.0555,5.1555,19.0494,5.5207,17.948,5.4913)" }, { "content": "5:", "span": { - "offset": 875, + "offset": 570, "length": 2 }, - "confidence": 0.991, - "source": "D(1,18.9858,8.2468,19.2603,8.2431,19.262,8.5045,18.9875,8.5042)" + "confidence": 0.958, + "source": "D(1,19.2066,5.1581,19.5689,5.1677,19.5625,5.5382,19.2004,5.5237)" }, { "content": "TO", "span": { - "offset": 878, + "offset": 573, "length": 2 }, "confidence": 0.993, - "source": "D(1,18.1325,8.6296,18.5801,8.6281,18.5822,8.8794,18.1346,8.8809)" + "source": "D(1,18.1382,5.5946,18.6065,5.6028,18.6052,5.9638,18.1372,5.9548)" }, { "content": "BE", "span": { - "offset": 881, + "offset": 576, "length": 2 }, - "confidence": 0.992, - "source": "D(1,18.6828,8.6276,19.1344,8.6213,19.1369,8.8721,18.685,8.8776)" + "confidence": 0.996, + "source": "D(1,18.8022,5.607,19.3948,5.6208,19.3917,5.9867,18.8002,5.9679)" }, { "content": "FILLED", "span": { - "offset": 884, + "offset": 579, "length": 6 }, - "confidence": 0.998, - "source": "D(1,17.6066,9.0148,18.7163,9.0064,18.718,9.2554,17.6079,9.2683)" + "confidence": 0.995, + "source": "D(1,17.4341,6.033,18.756,6.0721,18.7513,6.4417,17.4286,6.4072)" }, { "content": "IN", "span": { - "offset": 891, + "offset": 586, "length": 2 }, - "confidence": 0.99, - "source": "D(1,18.8232,9.0042,19.1396,9.0012,19.1417,9.2513,18.8248,9.2537)" + "confidence": 0.921, + "source": "D(1,18.9311,6.0767,19.2631,6.0866,19.2579,6.4545,18.9252,6.4448)" }, { "content": "BY", "span": { - "offset": 894, + "offset": 589, "length": 2 }, - "confidence": 0.992, - "source": "D(1,19.2547,8.9996,19.6945,8.9957,19.697,9.2436,19.2568,9.2501)" + "confidence": 0.935, + "source": "D(1,19.4864,6.0939,20.0901,6.108,20.0847,6.4715,19.4819,6.459)" }, { "content": "PURCHASER", "span": { - "offset": 897, + "offset": 592, "length": 9 }, - "confidence": 0.997, - "source": "D(1,17.6289,9.394,19.6858,9.3763,19.6875,9.6242,17.6307,9.6488)" + "confidence": 0.992, + "source": "D(1,17.4328,6.5233,20.0445,6.5851,20.0445,6.9351,17.4323,6.8701)" }, { "content": "PART", "span": { - "offset": 916, + "offset": 603, "length": 4 }, - "confidence": 0.993, - "source": "D(1,20.3495,7.7488,21.1945,7.7282,21.1977,7.9924,20.3507,8.0078)" + "confidence": 0.998, + "source": "D(1,20.9314,4.6708,21.986,4.735,21.9708,5.0505,20.9146,4.9776)" }, { "content": "3:", "span": { - "offset": 921, + "offset": 608, "length": 2 }, - "confidence": 0.992, - "source": "D(1,21.2903,7.7252,21.5516,7.7171,21.5551,7.9824,21.2936,7.9898)" + "confidence": 1, + "source": "D(1,22.0884,4.7415,22.4211,4.7624,22.4065,5.0779,22.0733,5.057)" }, { "content": "ALTERNATE", "span": { - "offset": 924, + "offset": 611, "length": 9 }, - "confidence": 0.993, - "source": "D(1,21.643,7.7142,23.6333,7.6558,23.6404,7.9261,21.6466,7.9799)" + "confidence": 0.999, + "source": "D(1,22.544,4.7702,24.8836,4.9132,24.868,5.2389,22.5295,5.0856)" }, { "content": "SUPPLIER", "span": { - "offset": 934, + "offset": 621, "length": 8 }, - "confidence": 0.993, - "source": "D(1,23.7465,7.6521,25.4102,7.6011,25.4164,7.8677,23.7536,7.9224)" + "confidence": 0.999, + "source": "D(1,24.9603,4.9183,26.7617,5.0377,26.7433,5.3619,24.9447,5.2434)" }, { "content": "IDENTIFICATION", "span": { - "offset": 943, + "offset": 630, "length": 14 }, - "confidence": 0.828, - "source": "D(1,25.5147,7.5978,28.1758,7.5238,28.1808,7.7888,25.5209,7.865)" + "confidence": 0.999, + "source": "D(1,26.951,5.0511,29.7685,5.2707,29.7544,5.5781,26.9327,5.3765)" }, { "content": "-", "span": { - "offset": 958, + "offset": 645, "length": 1 }, - "confidence": 0.674, - "source": "D(1,28.2759,7.5214,28.3761,7.5191,28.3809,7.7845,28.2808,7.7866)" + "confidence": 0.996, + "source": "D(1,29.9372,5.2847,30.065,5.2952,30.0502,5.5981,29.9227,5.5894)" }, { "content": "to", "span": { - "offset": 960, + "offset": 647, "length": 2 }, - "confidence": 0.992, - "source": "D(1,28.4589,7.5172,28.7028,7.5116,28.7071,7.7775,28.4635,7.7827)" + "confidence": 0.998, + "source": "D(1,30.1468,5.302,30.4125,5.3245,30.3972,5.6241,30.1318,5.6036)" }, { - "content": "be", + "content": "bf", "span": { - "offset": 963, + "offset": 650, "length": 2 }, - "confidence": 0.996, - "source": "D(1,28.7899,7.5095,29.1035,7.5008,29.1074,7.7658,28.7941,7.7754)" + "confidence": 0.369, + "source": "D(1,30.4943,5.3314,31.0002,5.3746,30.9842,5.6719,30.4789,5.6307)" }, { - "content": "filled", + "content": "You", "span": { - "offset": 966, - "length": 6 + "offset": 653, + "length": 3 }, - "confidence": 0.993, - "source": "D(1,29.1906,7.4984,29.7873,7.4825,29.7907,7.7467,29.1944,7.7632)" + "confidence": 0.809, + "source": "D(1,31.0615,5.3798,31.5623,5.4233,31.5471,5.7223,31.0454,5.6769)" }, { - "content": "in", + "content": "kly", "span": { - "offset": 973, - "length": 2 + "offset": 657, + "length": 3 }, - "confidence": 0.995, - "source": "D(1,29.8744,7.4804,30.0922,7.475,30.0956,7.7403,29.8778,7.7449)" + "confidence": 0.237, + "source": "D(1,31.6338,5.4295,32.2672,5.4867,32.2537,5.7883,31.6188,5.729)" }, { - "content": "by", + "content": "ft:", "span": { - "offset": 976, - "length": 2 + "offset": 661, + "length": 3 }, - "confidence": 0.998, - "source": "D(1,30.1837,7.4728,30.4842,7.4657,30.4876,7.732,30.187,7.7384)" + "confidence": 0.55, + "source": "D(1,32.3285,5.4926,32.8186,5.5399,32.8064,5.8411,32.3152,5.7941)" }, { - "content": "first", + "content": "o", "span": { - "offset": 979, - "length": 5 + "offset": 665, + "length": 1 }, - "confidence": 0.992, - "source": "D(1,30.5627,7.4644,31.0375,7.4564,31.0414,7.7205,30.5661,7.7304)" + "confidence": 0.88, + "source": "D(1,32.8799,5.5458,33.0382,5.5606,33.0266,5.8612,32.8679,5.847)" }, { - "content": "supplier", + "content": ".p.r", "span": { - "offset": 985, - "length": 8 + "offset": 667, + "length": 4 }, - "confidence": 0.615, - "source": "D(1,31.1159,7.4551,32.1267,7.4423,32.132,7.6989,31.1199,7.7189)" + "confidence": 0.188, + "source": "D(1,33.125,5.5685,33.8881,5.6391,33.8881,5.9347,33.1137,5.8686)" }, { "content": "(name", "span": { - "offset": 994, + "offset": 672, "length": 5 }, - "confidence": 0.891, - "source": "D(1,20.347,8.1334,21.1162,8.1151,21.1227,8.3525,20.3531,8.3672)" + "confidence": 0.82, + "source": "D(1,20.914,5.1445,21.8749,5.1961,21.8689,5.4935,20.907,5.4471)" }, { "content": "in", "span": { - "offset": 1000, + "offset": 678, "length": 2 }, - "confidence": 0.993, - "source": "D(1,21.1911,8.1131,21.412,8.1071,21.4189,8.3456,21.1977,8.3508)" + "confidence": 0.996, + "source": "D(1,21.9645,5.2014,22.1636,5.2131,22.1575,5.5121,21.9585,5.4993)" }, { "content": "part", "span": { - "offset": 1003, + "offset": 681, "length": 4 }, - "confidence": 0.989, - "source": "D(1,21.4948,8.1047,21.968,8.0898,21.9749,8.3314,21.5018,8.3436)" + "confidence": 0.959, + "source": "D(1,22.2881,5.2193,22.9256,5.2496,22.9184,5.5542,22.2818,5.5192)" }, { "content": "2)", "span": { - "offset": 1008, + "offset": 686, "length": 2 }, - "confidence": 0.991, - "source": "D(1,22.0469,8.0872,22.315,8.0782,22.322,8.3197,22.0538,8.329)" + "confidence": 0.968, + "source": "D(1,23.0102,5.2536,23.3041,5.2673,23.2965,5.5748,23.003,5.5588)" }, { "content": "if", "span": { - "offset": 1011, + "offset": 689, "length": 2 }, - "confidence": 0.995, - "source": "D(1,22.3978,8.0754,22.5477,8.0703,22.5547,8.3117,22.4048,8.3169)" + "confidence": 0.975, + "source": "D(1,23.3639,5.2701,23.5679,5.2819,23.5601,5.5906,23.3562,5.578)" }, { "content": "order", "span": { - "offset": 1014, + "offset": 692, "length": 5 }, "confidence": 0.995, - "source": "D(1,22.6108,8.0681,23.285,8.044,23.293,8.2868,22.6179,8.3096)" + "source": "D(1,23.6724,5.2887,24.4586,5.3389,24.4505,5.6462,23.6646,5.5976)" }, { "content": "is", "span": { - "offset": 1020, + "offset": 698, "length": 2 }, - "confidence": 0.995, - "source": "D(1,23.3678,8.0407,23.5767,8.0325,23.5849,8.2756,23.3759,8.2836)" + "confidence": 0.998, + "source": "D(1,24.5183,5.3425,24.792,5.3595,24.7837,5.6651,24.5102,5.6495)" }, { "content": "endorsed", "span": { - "offset": 1023, + "offset": 701, "length": 8 }, - "confidence": 0.995, - "source": "D(1,23.6635,8.0291,24.87,7.9866,24.8779,8.2286,23.6717,8.2723)" + "confidence": 0.989, + "source": "D(1,24.8766,5.3647,26.2252,5.4483,26.2169,5.7524,24.8684,5.6702)" }, { - "content": "to", + "content": "foranother", "span": { - "offset": 1032, - "length": 2 + "offset": 710, + "length": 10 }, - "confidence": 0.992, - "source": "D(1,24.9686,7.9829,25.217,7.9736,25.2249,8.2167,24.9765,8.2252)" + "confidence": 0.598, + "source": "D(1,26.3297,5.4546,27.8321,5.5562,27.8231,5.8582,26.3213,5.7588)" }, { - "content": "another", + "content": "suppker", "span": { - "offset": 1035, + "offset": 721, "length": 7 }, - "confidence": 0.993, - "source": "D(1,25.2919,7.9708,26.2933,7.934,26.3015,8.174,25.2998,8.2142)" - }, - { - "content": "supplier", - "span": { - "offset": 1043, - "length": 8 - }, - "confidence": 0.989, - "source": "D(1,26.3722,7.9308,27.4131,7.8947,27.4216,8.1343,26.3803,8.1706)" + "confidence": 0.647, + "source": "D(1,27.8917,5.5604,28.9967,5.6247,28.9898,5.9282,27.8828,5.8622)" }, { "content": "to", "span": { - "offset": 1052, + "offset": 729, "length": 2 }, - "confidence": 0.998, - "source": "D(1,27.4841,7.8923,27.7285,7.8823,27.7373,8.1224,27.4925,8.1318)" + "confidence": 0.895, + "source": "D(1,29.0565,5.6278,29.3603,5.6409,29.3532,5.9476,29.0496,5.9316)" }, { - "content": "fill", + "content": "f.l:", "span": { - "offset": 1055, + "offset": 732, "length": 4 }, - "confidence": 0.884, - "source": "D(1,27.8113,7.8787,28.107,7.8662,28.1074,8.1073,27.8202,8.1191)" + "confidence": 0.196, + "source": "D(1,29.4351,5.6436,29.8236,5.6585,29.8236,5.9704,29.4277,5.9512)" }, { "content": "ALTERNATE", "span": { - "offset": 1080, + "offset": 737, "length": 9 }, - "confidence": 0.993, - "source": "D(1,20.3436,8.537,22.2708,8.4924,22.2778,8.7553,20.3471,8.8004)" + "confidence": 0.977, + "source": "D(1,20.8813,5.6334,23.2483,5.7344,23.2375,6.0934,20.8731,5.9796)" }, { "content": "DEA", "span": { - "offset": 1090, + "offset": 747, "length": 3 }, - "confidence": 0.996, - "source": "D(1,22.3779,8.491,23.0674,8.4741,23.0758,8.7345,22.3851,8.7518)" + "confidence": 0.992, + "source": "D(1,23.3694,5.7421,24.1076,5.7877,24.0976,6.1353,23.3587,6.099)" }, { "content": "#", "span": { - "offset": 1094, + "offset": 751, "length": 1 }, - "confidence": 0.977, - "source": "D(1,23.153,8.4719,23.3585,8.4646,23.3613,8.7249,23.1615,8.7326)" + "confidence": 0.997, + "source": "D(1,24.275,5.795,24.5606,5.8079,24.5606,6.1585,24.2653,6.1424)" }, { "content": "Signature-", "span": { - "offset": 1116, + "offset": 754, "length": 10 }, - "confidence": 0.992, - "source": "D(1,20.357,9.3488,21.946,9.3014,21.9529,9.5625,20.3625,9.5954)" + "confidence": 0.726, + "source": "D(1,20.855,6.6145,22.8142,6.7151,22.8036,7.0666,20.8442,6.9715)" }, { "content": "by", "span": { - "offset": 1127, + "offset": 765, "length": 2 }, - "confidence": 0.999, - "source": "D(1,22.0261,9.2994,22.3718,9.2923,22.3791,9.5546,22.0332,9.5603)" + "confidence": 0.992, + "source": "D(1,22.8833,6.719,23.2924,6.7417,23.2808,7.093,22.8726,7.0706)" }, { "content": "first", "span": { - "offset": 1130, + "offset": 768, "length": 5 }, - "confidence": 0.996, - "source": "D(1,22.4561,9.2899,22.9872,9.2735,22.9947,9.5374,22.4635,9.552)" + "confidence": 0.977, + "source": "D(1,23.3903,6.7468,24.047,6.7839,24.0345,7.1401,23.3785,7.0986)" }, { "content": "supplier", "span": { - "offset": 1136, - "length": 8 - }, - "confidence": 0.554, - "source": "D(1,23.0841,9.2703,24.2578,9.2464,24.2578,9.4968,23.0916,9.5344)" - }, - { - "content": "Lingua.", - "span": { - "offset": 1145, - "length": 7 - }, - "confidence": 0.601, - "source": "D(1,20.2151,9.6206,23.2514,9.59,23.2897,10.2327,20.2357,10.3176)" - }, - { - "content": "Drier", - "span": { - "offset": 1153, - "length": 5 - }, - "confidence": 0.627, - "source": "D(1,23.4021,9.5876,25.3827,9.5383,25.4004,10.1783,23.4419,10.2279)" - }, - { - "content": "10-26-23", - "span": { - "offset": 1159, + "offset": 774, "length": 8 }, - "confidence": 0.69, - "source": "D(1,28.5164,9.6074,31.0078,9.516,31.0078,9.9668,28.5307,10.0334)" - }, - { - "content": "DATE", - "span": { - "offset": 1168, - "length": 4 - }, - "confidence": 0.988, - "source": "D(1,28.3784,10.1555,28.9411,10.1398,28.9447,10.326,28.382,10.3354)" + "confidence": 0.642, + "source": "D(1,24.1392,6.7888,25.4812,6.8766,25.4737,7.2222,24.1267,7.146)" }, { "content": "OFFICIAL", "span": { - "offset": 1173, + "offset": 784, "length": 8 }, - "confidence": 0.846, - "source": "D(1,20.3628,10.361,21.2441,10.3371,21.2514,10.5577,20.368,10.5789)" + "confidence": 0.977, + "source": "D(1,20.8374,7.9014,21.8911,7.9411,21.8868,8.1667,20.8335,8.1269)" }, { "content": "AUTHORIZED", "span": { - "offset": 1182, + "offset": 793, "length": 10 }, - "confidence": 0.564, - "source": "D(1,21.3058,10.3355,22.6512,10.2946,22.6585,10.5193,21.3131,10.5561)" + "confidence": 0.87, + "source": "D(1,21.9855,7.9448,23.5222,8.0143,23.5173,8.2467,21.9812,8.1704)" }, { "content": "TO", "span": { - "offset": 1193, + "offset": 804, "length": 2 }, - "confidence": 0.989, - "source": "D(1,22.7128,10.2928,22.9957,10.2845,23.0032,10.5086,22.7202,10.5173)" + "confidence": 0.974, + "source": "D(1,23.6619,8.0208,23.9866,8.036,23.9817,8.2681,23.657,8.2532)" }, { "content": "EXECUTE", "span": { - "offset": 1196, + "offset": 807, "length": 7 }, - "confidence": 0.977, - "source": "D(1,23.0501,10.2829,24.0255,10.248,24.0331,10.475,23.0577,10.5069)" + "confidence": 0.572, + "source": "D(1,24.0508,8.0391,25.1798,8.0891,25.1739,8.3234,24.0457,8.2711)" }, { "content": "ON", "span": { - "offset": 1204, + "offset": 815, "length": 2 }, - "confidence": 0.992, - "source": "D(1,24.0908,10.2468,24.3955,10.2412,24.4031,10.4664,24.0984,10.4735)" + "confidence": 0.973, + "source": "D(1,25.2402,8.0917,25.599,8.1077,25.5934,8.3432,25.2344,8.3263)" }, { - "content": "BEHALF", + "content": "PPHALF", "span": { - "offset": 1207, + "offset": 818, "length": 6 }, - "confidence": 0.989, - "source": "D(1,24.4716,10.2393,25.2876,10.2155,25.2944,10.4349,24.4792,10.4642)" + "confidence": 0.607, + "source": "D(1,25.6669,8.1109,26.5313,8.1554,26.5258,8.39,25.6614,8.3465)" }, { "content": "OF", "span": { - "offset": 1214, + "offset": 825, "length": 2 }, - "confidence": 0.994, - "source": "D(1,25.3348,10.2143,25.6068,10.2073,25.6134,10.4247,25.3415,10.4332)" + "confidence": 0.992, + "source": "D(1,26.637,8.1612,26.9427,8.1782,26.9371,8.4095,26.6315,8.3953)" }, { "content": "SUPPLIER", "span": { - "offset": 1217, + "offset": 828, "length": 8 }, - "confidence": 0.992, - "source": "D(1,25.6902,10.2052,26.7165,10.1731,26.7187,10.3896,25.6968,10.4221)" + "confidence": 0.502, + "source": "D(1,27.0295,8.1831,28.1735,8.231,28.173,8.4604,27.0239,8.4136)" }, { - "content": "ITEM", + "content": "04'T", "span": { - "offset": 1265, + "offset": 838, "length": 4 }, - "confidence": 0.989, - "source": "D(1,1.4243,11.5174,2.1445,11.5113,2.1445,11.757,1.426,11.763)" + "confidence": 0.124, + "source": "D(1,29.9137,8.3554,30.5289,8.3663,30.5275,8.6057,29.912,8.5869)" }, { - "content": "NO", + "content": "NO.", "span": { - "offset": 1279, - "length": 2 + "offset": 862, + "length": 3 }, - "confidence": 0.998, - "source": "D(1,2.9295,11.3348,3.3701,11.334,3.3719,11.5701,2.9315,11.5746)" + "confidence": 0.898, + "source": "D(1,0.2663,8.4109,0.8303,8.4175,0.8306,8.725,0.2669,8.7173)" }, { "content": "OF", "span": { - "offset": 1282, + "offset": 866, "length": 2 }, - "confidence": 0.992, - "source": "D(1,3.5402,11.3325,3.9375,11.3271,3.9375,11.5631,3.5417,11.5656)" + "confidence": 0.97, + "source": "D(1,0.9159,8.4188,1.3722,8.4188,1.3722,8.7309,0.9163,8.725)" }, { "content": "PACKAGES", "span": { - "offset": 1285, + "offset": 869, "length": 8 }, - "confidence": 0.992, - "source": "D(1,2.6487,11.6715,4.2539,11.658,4.2539,11.8942,2.6494,11.9113)" + "confidence": 0.57, + "source": "D(1,0.0751,8.8117,1.6849,8.8275,1.6849,9.1259,0.0763,9.1078)" }, { "content": "PACKAGE", "span": { - "offset": 1303, + "offset": 887, "length": 7 }, - "confidence": 0.995, - "source": "D(1,4.6156,11.3048,6.0117,11.2894,6.0117,11.5304,4.6161,11.542)" + "confidence": 0.895, + "source": "D(1,2.0179,8.4325,3.6567,8.4415,3.6562,8.7432,2.0176,8.744)" }, { "content": "SIZE", "span": { - "offset": 1311, + "offset": 895, "length": 4 }, - "confidence": 0.983, - "source": "D(1,5.0179,11.6303,5.6575,11.6289,5.6589,11.8676,5.0195,11.8692)" + "confidence": 0.988, + "source": "D(1,2.4772,8.8375,3.2481,8.8466,3.2481,9.1421,2.4777,9.1385)" + }, + { + "content": "1", + "span": { + "offset": 909, + "length": 1 + }, + "confidence": 0.127, + "source": "D(1,3.7265,8.4411,3.856,8.445,3.856,8.748,3.726,8.7434)" }, { "content": "NAME", "span": { - "offset": 1325, + "offset": 911, "length": 4 }, "confidence": 0.992, - "source": "D(1,10.6686,11.3666,11.4888,11.3501,11.4903,11.5805,10.6701,11.5991)" + "source": "D(1,9.0158,8.7061,9.9884,8.7088,9.9883,9.0043,9.016,8.9999)" }, { "content": "OF", "span": { - "offset": 1330, + "offset": 916, "length": 2 }, - "confidence": 0.999, - "source": "D(1,11.5716,11.3492,11.9629,11.3427,11.9643,11.5717,11.5731,11.5788)" + "confidence": 0.957, + "source": "D(1,10.0861,8.7088,10.5407,8.7082,10.5406,9.007,10.0861,9.0049)" }, { "content": "ITEM", "span": { - "offset": 1333, + "offset": 919, "length": 4 }, - "confidence": 0.855, - "source": "D(1,12.0533,11.3418,12.7441,11.3323,12.7441,11.5581,12.0546,11.5696)" + "confidence": 0.972, + "source": "D(1,10.6042,8.7083,11.4986,8.7103,11.4983,9.0104,10.6041,9.0072)" }, { "content": "NUMBER", "span": { - "offset": 1347, + "offset": 933, "length": 6 }, - "confidence": 0.989, - "source": "D(1,17.3648,10.9541,18.5977,10.9225,18.5977,11.1535,17.368,11.1797)" + "confidence": 0.993, + "source": "D(1,17.0558,8.4241,18.6549,8.4506,18.6549,8.7478,17.0561,8.7202)" }, { "content": "REC'D", "span": { - "offset": 1354, + "offset": 940, "length": 5 }, - "confidence": 0.987, - "source": "D(1,17.5603,11.2658,18.4219,11.2543,18.4219,11.4832,17.5615,11.4924)" + "confidence": 0.811, + "source": "D(1,17.2313,8.8086,18.3597,8.8251,18.3597,9.1493,17.2314,9.1349)" }, { "content": "DATE", "span": { - "offset": 1369, + "offset": 955, "length": 4 }, - "confidence": 0.986, - "source": "D(1,19.0167,10.9211,19.7578,10.9137,19.7578,11.1343,19.018,11.1412)" + "confidence": 0.992, + "source": "D(1,19.0674,8.4762,20.0445,8.5087,20.0445,8.7946,19.0661,8.7658)" }, { "content": "REC'D", "span": { - "offset": 1374, + "offset": 960, "length": 5 }, - "confidence": 0.96, - "source": "D(1,18.9675,11.2387,19.8105,11.2294,19.8105,11.4578,18.9687,11.4665)" + "confidence": 0.977, + "source": "D(1,19.0279,8.8652,20.0966,8.8993,20.0966,9.1932,19.0267,9.1681)" }, { "content": "PART", "span": { - "offset": 1389, + "offset": 975, "length": 4 }, - "confidence": 0.987, - "source": "D(1,20.26,11.0056,21.1063,10.982,21.1116,11.2324,20.2639,11.25)" + "confidence": 0.992, + "source": "D(1,20.6252,8.6661,21.6702,8.7067,21.6624,9.0258,20.6184,8.9838)" }, { "content": "4:", "span": { - "offset": 1416, + "offset": 989, "length": 2 }, - "confidence": 0.99, - "source": "D(1,21.1873,10.9801,21.4748,10.9744,21.4805,11.2211,21.1927,11.23)" + "confidence": 0.973, + "source": "D(1,21.8041,8.7115,22.1472,8.7237,22.1395,9.0433,21.7965,9.0307)" }, { "content": "TO", "span": { - "offset": 1419, + "offset": 1013, "length": 2 }, - "confidence": 0.999, - "source": "D(1,21.572,10.9725,22.0214,10.9588,22.0277,11.2025,21.5778,11.218)" + "confidence": 0.996, + "source": "D(1,22.2651,8.7283,22.7206,8.7474,22.7127,9.0725,22.2574,9.0487)" }, { "content": "BE", "span": { - "offset": 1422, + "offset": 1016, "length": 2 }, - "confidence": 0.999, - "source": "D(1,22.1348,10.9557,22.5761,10.9444,22.5831,11.1888,22.1412,11.1994)" + "confidence": 0.979, + "source": "D(1,22.8974,8.754,23.444,8.7763,23.4368,9.1024,22.8898,9.0792)" }, { "content": "FILLED", "span": { - "offset": 1425, + "offset": 1019, "length": 6 }, - "confidence": 0.994, - "source": "D(1,22.6895,10.9406,23.8313,10.909,23.8386,11.1561,22.6966,11.1855)" + "confidence": 0.989, + "source": "D(1,23.5351,8.7806,24.7996,8.8338,24.7921,9.1615,23.5279,9.107)" }, { "content": "IN", "span": { - "offset": 1432, + "offset": 1026, "length": 2 }, - "confidence": 0.992, - "source": "D(1,23.9406,10.9062,24.1957,10.8995,24.2031,11.1459,23.948,11.1533)" + "confidence": 0.94, + "source": "D(1,24.9765,8.8411,25.2712,8.8533,25.2628,9.1833,24.9686,9.1696)" }, { "content": "BY", "span": { - "offset": 1435, + "offset": 1029, "length": 2 }, - "confidence": 0.99, - "source": "D(1,24.3658,10.8949,24.8192,10.8811,24.8269,11.1268,24.3732,11.1409)" + "confidence": 0.949, + "source": "D(1,25.4909,8.8622,26.0214,8.8846,26.0136,9.2162,25.4826,9.1928)" }, { "content": "SUPPLIER", "span": { - "offset": 1438, - "length": 8 - }, - "confidence": 0.993, - "source": "D(1,24.9285,10.8768,26.5925,10.8266,26.5957,11.0749,24.9361,11.1233)" - }, - { - "content": "NATIONAL", - "span": { - "offset": 1447, + "offset": 1032, "length": 8 }, - "confidence": 0.995, - "source": "D(1,22.939,11.2913,24.3724,11.2455,24.3801,11.4744,22.9478,11.5137)" + "confidence": 0.935, + "source": "D(1,26.1178,8.8895,27.9985,8.969,27.9908,9.3019,26.11,9.2212)" }, { - "content": "DRUG", + "content": "NATIONALIDRUG", "span": { - "offset": 1456, - "length": 4 + "offset": 1041, + "length": 13 }, - "confidence": 0.988, - "source": "D(1,24.47,11.2435,25.3183,11.222,25.326,11.4525,24.4778,11.472)" + "confidence": 0.94, + "source": "D(1,23.8332,9.2359,26.5272,9.3551,26.5215,9.6517,23.8284,9.5241)" }, { "content": "CODE", "span": { - "offset": 1461, + "offset": 1055, "length": 4 }, - "confidence": 0.986, - "source": "D(1,25.4046,11.2199,26.2566,11.1977,26.2617,11.4286,25.412,11.4502)" + "confidence": 0.977, + "source": "D(1,26.59,9.3587,27.5829,9.3973,27.5803,9.7041,26.5843,9.6551)" }, { "content": "NUMBER", "span": { - "offset": 1475, + "offset": 1099, "length": 6 }, - "confidence": 0.994, - "source": "D(1,29.2744,10.7705,30.5459,10.7357,30.5495,10.9684,29.2782,10.9991)" + "confidence": 0.973, + "source": "D(1,30.7947,9.1623,32.0569,9.1895,32.0547,9.477,30.794,9.4242)" }, { "content": "SHIPPED", "span": { - "offset": 1482, + "offset": 1106, "length": 7 }, - "confidence": 0.994, - "source": "D(1,29.2869,11.0913,30.5459,11.0718,30.5481,11.3131,29.2888,11.3282)" + "confidence": 0.974, + "source": "D(1,30.7624,9.5258,32.0469,9.5631,32.0469,9.8611,30.7611,9.8282)" }, { "content": "DATE", "span": { - "offset": 1499, + "offset": 1135, "length": 4 }, - "confidence": 0.989, - "source": "D(1,31.338,10.6987,32.1122,10.6867,32.1147,10.9246,31.341,10.9336)" + "confidence": 0.547, + "source": "D(1,32.8605,9.2511,33.6449,9.2699,33.6449,9.5608,32.8593,9.5402)" }, { - "content": "SHIPPED", + "content": "SixPFAD", "span": { - "offset": 1504, + "offset": 1140, "length": 7 }, - "confidence": 0.993, - "source": "D(1,31.0988,11.0409,32.3789,11.0185,32.3789,11.2595,31.1029,11.2904)" + "confidence": 0.492, + "source": "D(1,32.5755,9.6329,33.8881,9.6545,33.8881,9.9479,32.574,9.9226)" }, { "content": "1", "span": { - "offset": 1532, + "offset": 1168, "length": 1 }, - "confidence": 0.989, - "source": "D(1,1.7191,12.1548,1.8633,12.1479,1.8633,12.3932,1.7209,12.401)" + "confidence": 0.977, + "source": "D(1,0.1434,9.3461,0.3995,9.3553,0.3995,9.6993,0.1449,9.6947)" }, { - "content": "1", + "content": "10", "span": { - "offset": 1543, - "length": 1 + "offset": 1179, + "length": 2 }, - "confidence": 0.253, - "source": "D(1,2.8585,12.1386,3.0586,12.1375,3.0586,12.402,2.8594,12.406)" + "confidence": 0.584, + "source": "D(1,2.0041,9.3907,2.4299,9.3967,2.4294,9.7385,2.004,9.7395)" }, { - "content": "20.000", + "content": "..", "span": { - "offset": 1554, - "length": 6 + "offset": 1182, + "length": 2 }, - "confidence": 0.973, - "source": "D(1,4.6288,12.1073,6.082,12.0958,6.082,12.3562,4.6291,12.375)" + "confidence": 0.242, + "source": "D(1,2.4972,9.3967,2.783,9.3997,2.7826,9.7418,2.4967,9.7383)" }, { - "content": "METHADONE", + "content": "000", "span": { - "offset": 1570, - "length": 9 + "offset": 1185, + "length": 3 }, - "confidence": 0.994, - "source": "D(1,7.3087,12.0783,9.5244,12.0412,9.5269,12.2939,7.3108,12.3223)" + "confidence": 0.973, + "source": "D(1,2.8558,9.4001,3.6476,9.4051,3.6476,9.7483,2.8553,9.7415)" }, { - "content": "HCL", + "content": "DEXTROAMP-AMPHET'", "span": { - "offset": 1580, - "length": 3 + "offset": 1198, + "length": 17 }, - "confidence": 0.994, - "source": "D(1,9.7807,12.0383,10.5248,12.0262,10.5281,12.2802,9.7832,12.2913)" + "confidence": 0.774, + "source": "D(1,5.0572,9.435,9.6875,9.4902,9.6827,9.8475,5.0539,9.7675)" }, { - "content": "10", + "content": "ER", "span": { - "offset": 1584, + "offset": 1216, "length": 2 }, - "confidence": 0.817, - "source": "D(1,10.7853,12.023,11.2235,12.0158,11.2264,12.2674,10.7881,12.2752)" + "confidence": 0.99, + "source": "D(1,9.9052,9.4919,10.5069,9.5003,10.5021,9.8585,9.9004,9.8514)" }, { - "content": "MG", + "content": "10", "span": { - "offset": 1587, + "offset": 1219, "length": 2 }, - "confidence": 0.996, - "source": "D(1,11.4673,12.011,11.9675,12.0006,11.9708,12.2539,11.4707,12.2633)" + "confidence": 0.99, + "source": "D(1,10.7935,9.5041,11.3779,9.5138,11.3735,9.8691,10.789,9.8617)" }, { - "content": "TABLET", + "content": "MG", "span": { - "offset": 1590, - "length": 6 + "offset": 1222, + "length": 2 }, - "confidence": 0.993, - "source": "D(1,12.2073,11.9963,13.6788,11.9647,13.6834,12.2208,12.2107,12.2504)" + "confidence": 0.912, + "source": "D(1,11.5728,9.5173,12.2662,9.5246,12.2614,9.8824,11.5682,9.8718)" }, { - "content": "TAB", + "content": "CAP", "span": { - "offset": 1597, + "offset": 1225, "length": 3 }, - "confidence": 0.996, - "source": "D(1,13.9268,11.9605,14.6777,11.9505,14.6777,12.2031,13.9315,12.2157)" + "confidence": 0.992, + "source": "D(1,12.4839,9.5266,13.392,9.5392,13.392,9.8951,12.4793,9.8824)" }, { - "content": "00054-0710-25", + "content": "00406-8952-01", "span": { - "offset": 1650, + "offset": 1268, "length": 13 }, - "confidence": 0.803, - "source": "D(1,20.5652,11.8336,23.7129,11.7542,23.7129,12.0243,20.5695,12.1109)" + "confidence": 0.68, + "source": "D(1,20.9502,9.7355,24.6648,9.883,24.6648,10.2167,20.9441,10.0655)" }, { - "content": "20", + "content": "TRY", "span": { - "offset": 1753, - "length": 2 + "offset": 1381, + "length": 3 }, - "confidence": 0.999, - "source": "D(1,29.2262,11.5767,30.0234,11.5536,30.0234,12.0171,29.2287,12.0318)" + "confidence": 0.229, + "source": "D(1,30.9655,9.9512,32.0469,9.9114,32.0469,10.497,30.9665,10.5729)" }, { - "content": "10-30-21", + "content": "11/20/23", "span": { - "offset": 1765, + "offset": 1404, "length": 8 }, - "confidence": 0.685, - "source": "D(1,30.7881,11.6001,32.9062,11.5243,32.9062,11.9775,30.7961,12.0184)" + "confidence": 0.909, + "source": "D(1,32.3628,10.1513,34.027,10.1415,34.027,10.6114,32.3613,10.609)" }, { - "content": "2", + "content": "1", "span": { - "offset": 1794, + "offset": 1433, "length": 1 }, - "confidence": 0.995, - "source": "D(1,1.7039,12.7416,1.8984,12.7365,1.8984,12.9874,1.7048,12.9945)" + "confidence": 0.692, + "source": "D(1,0.1454,10.0663,0.3995,10.075,0.3995,10.406,0.1475,10.4063)" }, { - "content": "1", + "content": "3", "span": { - "offset": 1805, + "offset": 1444, "length": 1 }, - "confidence": 0.942, - "source": "D(1,2.8549,12.7565,3.0704,12.7517,3.0713,13.0045,2.8554,13.0078)" + "confidence": 0.997, + "source": "D(1,2.0249,10.1172,2.2521,10.12,2.2517,10.4409,2.0244,10.4413)" }, { - "content": "10.000", + "content": ".000", "span": { - "offset": 1816, - "length": 6 + "offset": 1446, + "length": 4 }, - "confidence": 0.953, - "source": "D(1,4.6523,12.7251,6.082,12.7089,6.082,12.9683,4.6535,12.9861)" + "confidence": 0.651, + "source": "D(1,2.3683,10.1214,3.3523,10.1275,3.3523,10.4514,2.3675,10.4427)" }, { - "content": "DEXMETHYLPHENIDATE", + "content": "OXYCODONE", "span": { - "offset": 1832, - "length": 18 + "offset": 1460, + "length": 9 }, - "confidence": 0.991, - "source": "D(1,7.3243,12.6825,11.7495,12.6126,11.7528,12.8649,7.3258,12.9375)" + "confidence": 0.963, + "source": "D(1,5.0574,10.1634,7.6766,10.1957,7.6705,10.5615,5.0524,10.5128)" }, { - "content": "ER", + "content": "HCL.", "span": { - "offset": 1851, - "length": 2 + "offset": 1470, + "length": 4 }, - "confidence": 0.992, - "source": "D(1,11.9915,12.6098,12.4877,12.599,12.4924,12.8542,11.9952,12.8605)" + "confidence": 0.683, + "source": "D(1,7.8377,10.1981,8.7982,10.2122,8.7918,10.5826,7.8316,10.5642)" + }, + { + "content": "(IR)'", + "span": { + "offset": 1475, + "length": 5 + }, + "confidence": 0.645, + "source": "D(1,9.0965,10.217,10.1287,10.2291,10.1229,10.6009,9.0905,10.5854)" }, { - "content": "25", + "content": "20", "span": { - "offset": 1854, + "offset": 1481, "length": 2 }, - "confidence": 0.998, - "source": "D(1,12.7338,12.5935,13.18,12.5843,13.1841,12.8398,12.7383,12.8494)" + "confidence": 0.992, + "source": "D(1,10.4747,10.2355,11.0773,10.2461,11.0718,10.6176,10.4684,10.6058)" }, { "content": "MG", "span": { - "offset": 1857, + "offset": 1484, "length": 2 }, - "confidence": 0.985, - "source": "D(1,13.4345,12.5802,13.9391,12.5723,13.9445,12.8249,13.4389,12.8351)" + "confidence": 0.977, + "source": "D(1,11.298,10.2496,11.9006,10.2581,11.8957,10.6289,11.2928,10.6215)" }, { - "content": "CP", + "content": "TAB", "span": { - "offset": 1860, - "length": 2 + "offset": 1487, + "length": 3 }, - "confidence": 0.997, - "source": "D(1,14.1894,12.5679,14.6648,12.5562,14.6708,12.8119,14.1951,12.8198)" + "confidence": 0.989, + "source": "D(1,12.181,10.262,13.0461,10.2754,13.0416,10.6356,12.1764,10.6314)" + }, + { + "content": "T", + "span": { + "offset": 1491, + "length": 1 + }, + "confidence": 0.992, + "source": "D(1,13.3504,10.282,13.6699,10.289,13.6689,10.6424,13.3463,10.6404)" }, { - "content": "00115-1709-01", + "content": "10702-0057-01", "span": { - "offset": 1912, + "offset": 1542, "length": 13 }, - "confidence": 0.904, - "source": "D(1,20.5837,12.4376,23.7305,12.3666,23.7305,12.6321,20.5865,12.6993)" + "confidence": 0.861, + "source": "D(1,20.9309,10.4854,24.6648,10.6263,24.6648,10.9645,20.928,10.8388)" }, { - "content": "10", + "content": "/BC", "span": { - "offset": 2015, - "length": 2 + "offset": 1645, + "length": 3 }, - "confidence": 0.993, - "source": "D(1,29.3355,12.2962,29.918,12.2871,29.918,12.703,29.3398,12.7266)" + "confidence": 0.15, + "source": "D(1,30.9008,10.6977,31.9253,10.6375,31.9253,11.1358,30.8995,11.25)" }, { - "content": "0.30-23", + "content": "1/20/23", "span": { - "offset": 2027, + "offset": 1668, "length": 7 }, - "confidence": 0.794, - "source": "D(1,30.8197,12.2063,32.6205,12.1421,32.625,12.6023,30.8267,12.6211)" + "confidence": 0.087, + "source": "D(1,32.2331,10.8738,34.0097,10.8829,34.0097,11.4062,32.2334,11.3856)" }, { - "content": "3", + "content": "1", "span": { - "offset": 2055, + "offset": 1696, "length": 1 }, - "confidence": 0.997, - "source": "D(1,1.7151,13.327,1.8984,13.3229,1.8984,13.5718,1.7161,13.5774)" + "confidence": 0.995, + "source": "D(1,0.1624,10.7778,0.3995,10.7799,0.3995,11.1549,0.1671,11.1582)" }, { - "content": "1", + "content": "473.000ML", "span": { - "offset": 2066, - "length": 1 + "offset": 1707, + "length": 9 }, - "confidence": 0.992, - "source": "D(1,2.8774,13.3745,3.0937,13.3699,3.0937,13.6249,2.8784,13.6299)" + "confidence": 0.56, + "source": "D(1,2.0418,10.8383,4.4466,10.8876,4.4466,11.2091,2.0419,11.1663)" }, { - "content": "90.000", + "content": "LORTAB", "span": { - "offset": 2077, + "offset": 1726, "length": 6 }, - "confidence": 0.973, - "source": "D(1,4.6691,13.3392,6.0784,13.3245,6.0793,13.5826,4.6705,13.6007)" + "confidence": 0.935, + "source": "D(1,5.0627,10.9068,6.7256,10.9317,6.7219,11.2682,5.0618,11.2329)" }, { - "content": "CONCERTA", + "content": "10", "span": { - "offset": 2093, - "length": 8 + "offset": 1733, + "length": 2 }, - "confidence": 0.994, - "source": "D(1,7.3697,13.2964,9.329,13.2662,9.3316,13.52,7.3721,13.5482)" + "confidence": 0.949, + "source": "D(1,7.0449,10.9367,7.557,10.9467,7.5537,11.2837,7.0414,11.2756)" }, { - "content": "ER", + "content": "MG-300", "span": { - "offset": 2102, - "length": 2 + "offset": 1736, + "length": 6 }, - "confidence": 0.995, - "source": "D(1,9.5676,13.2614,10.0658,13.2539,10.0694,13.5095,9.5706,13.5158)" + "confidence": 0.897, + "source": "D(1,7.7937,10.9498,9.6216,10.9856,9.618,11.3243,7.7906,11.2877)" + }, + { + "content": "MGY15", + "span": { + "offset": 1743, + "length": 5 + }, + "confidence": 0.626, + "source": "D(1,9.8144,10.9879,11.2678,11.0183,11.2639,11.3629,9.8106,11.3276)" }, { - "content": "27", + "content": "ML", "span": { - "offset": 2105, + "offset": 1749, "length": 2 }, - "confidence": 0.992, - "source": "D(1,10.3169,13.2495,10.7523,13.2414,10.7558,13.498,10.3206,13.5054)" + "confidence": 0.847, + "source": "D(1,11.5486,11.0259,12.2423,11.0403,12.239,11.376,11.5449,11.3679)" }, { - "content": "MG", + "content": "ELXR", + "span": { + "offset": 1752, + "length": 4 + }, + "confidence": 0.984, + "source": "D(1,12.4075,11.0432,13.6351,11.0659,13.6351,11.3956,12.4043,11.3774)" + }, + { + "content": "17478-0450-16", + "span": { + "offset": 1806, + "length": 13 + }, + "confidence": 0.797, + "source": "D(1,20.9049,11.2695,24.6648,11.3883,24.6613,11.7254,20.9033,11.6167)" + }, + { + "content": "11", "span": { - "offset": 2108, + "offset": 1909, "length": 2 }, - "confidence": 0.993, - "source": "D(1,11.016,13.2364,11.5267,13.2245,11.5296,13.4841,11.0193,13.4934)" + "confidence": 0.07, + "source": "D(1,30.7973,11.4392,31.7169,11.4102,31.7169,11.9391,30.7992,12.0139)" + }, + { + "content": "11/29/23", + "span": { + "offset": 1931, + "length": 8 + }, + "confidence": 0.821, + "source": "D(1,32.1817,11.5598,33.9923,11.5762,33.9923,12.0965,32.18,12.065)" + }, + { + "content": "1", + "span": { + "offset": 1960, + "length": 1 + }, + "confidence": 0.201, + "source": "D(1,0.1974,11.5239,0.4342,11.5329,0.4342,11.8362,0.2001,11.8246)" + }, + { + "content": "2.000", + "span": { + "offset": 1971, + "length": 5 + }, + "confidence": 0.636, + "source": "D(1,2.0457,11.5568,3.3697,11.5747,3.3697,11.8924,2.0456,11.8764)" }, { - "content": "TABLET", + "content": "OXYCODONE-ACETAM", "span": { - "offset": 2111, + "offset": 1986, + "length": 16 + }, + "confidence": 0.789, + "source": "D(1,5.0523,11.6259,9.6226,11.7111,9.6198,12.0564,5.0507,11.9394)" + }, + { + "content": "10-325", + "span": { + "offset": 2003, "length": 6 }, - "confidence": 0.994, - "source": "D(1,11.7654,13.2218,13.218,13.1969,13.2224,13.4543,11.7681,13.4804)" + "confidence": 0.974, + "source": "D(1,9.8611,11.7161,11.5804,11.7566,11.577,12.1092,9.8583,12.0622)" }, { "content": "TAB", "span": { - "offset": 2118, + "offset": 2010, "length": 3 }, - "confidence": 0.996, - "source": "D(1,13.4566,13.1933,14.1935,13.1818,14.1994,13.4362,13.4608,13.45)" + "confidence": 0.929, + "source": "D(1,11.8521,11.7637,12.7116,11.7889,12.7089,12.1307,11.8488,12.1155)" }, { - "content": "E", + "content": "TA", "span": { - "offset": 2122, - "length": 1 + "offset": 2014, + "length": 2 }, - "confidence": 0.977, - "source": "D(1,14.4446,13.1777,14.7129,13.1732,14.7129,13.429,14.4501,13.4327)" + "confidence": 0.408, + "source": "D(1,12.9279,11.7951,13.6157,11.8095,13.6149,12.1464,12.9252,12.1335)" }, { - "content": "50458-0588-01", + "content": "42858-01-04", "span": { - "offset": 2173, - "length": 13 + "offset": 2056, + "length": 11 }, - "confidence": 0.977, - "source": "D(1,20.5866,13.0442,23.7332,12.9842,23.743,13.2535,20.5916,13.3133)" + "confidence": 0.81, + "source": "D(1,20.8723,12.0202,23.6986,12.0959,23.6961,12.4323,20.8728,12.3661)" + }, + { + "content": "-02", + "span": { + "offset": 2097, + "length": 3 + }, + "confidence": 0.697, + "source": "D(1,23.7927,12.0993,24.6301,12.1164,24.6301,12.4637,23.7895,12.4352)" }, { - "content": "90", + "content": "1.", "span": { - "offset": 2276, + "offset": 2170, "length": 2 }, - "confidence": 0.998, - "source": "D(1,29.3457,12.8264,30.0762,12.8087,30.0762,13.2387,29.349,13.2539)" + "confidence": 0.357, + "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6494)" }, { - "content": "0-30-23", + "content": "BE", "span": { - "offset": 2288, - "length": 7 + "offset": 2173, + "length": 2 }, - "confidence": 0.693, - "source": "D(1,30.8413,12.8227,32.7656,12.7573,32.7656,13.2025,30.8487,13.2304)" + "confidence": 0.112, + "source": "D(1,31.0647,12.0698,31.5779,12.0261,31.5779,12.5585,31.0655,12.6198)" }, { - "content": "4", + "content": "14/20/20", "span": { - "offset": 2316, - "length": 1 + "offset": 2197, + "length": 8 }, - "confidence": 0.995, - "source": "D(1,1.7238,13.9302,1.9328,13.9239,1.9336,14.1683,1.7245,14.1776)" + "confidence": 0.683, + "source": "D(1,32.1902,12.2228,33.8881,12.2312,33.8881,12.7524,32.1894,12.7234)" }, { - "content": "1", + "content": "1.", "span": { - "offset": 2327, - "length": 1 + "offset": 2226, + "length": 2 }, - "confidence": 0.861, - "source": "D(1,2.8882,13.9822,3.0937,13.9722,3.0937,14.245,2.8891,14.2527)" + "confidence": 0.708, + "source": "D(1,0.2497,12.2349,0.4863,12.2273,0.4863,12.5428,0.2523,12.5437)" }, { - "content": "40.000", + "content": "10.000", "span": { - "offset": 2338, + "offset": 2238, "length": 6 }, - "confidence": 0.977, - "source": "D(1,4.6643,13.9401,6.082,13.9293,6.082,14.1896,4.6656,14.2031)" + "confidence": 0.883, + "source": "D(1,2.1018,12.2753,3.6993,12.3033,3.6993,12.6184,2.1017,12.5955)" }, { - "content": "MYDAYIS", + "content": "DEXTROAMP-AMPHET", "span": { - "offset": 2354, - "length": 7 + "offset": 2254, + "length": 16 }, - "confidence": 0.992, - "source": "D(1,7.3342,13.9035,9.0539,13.8791,9.0563,14.1341,7.336,14.1576)" + "confidence": 0.7, + "source": "D(1,5.0519,12.3472,9.5437,12.456,9.5376,12.7971,5.0475,12.6602)" }, { "content": "ER", "span": { - "offset": 2362, + "offset": 2271, "length": 2 }, - "confidence": 0.997, - "source": "D(1,9.3236,13.8733,9.8209,13.8654,9.8249,14.1225,9.3266,14.1276)" + "confidence": 0.957, + "source": "D(1,9.7697,12.4613,10.3925,12.4751,10.3863,12.8214,9.7636,12.8061)" }, { - "content": "25", + "content": "30", "span": { - "offset": 2365, + "offset": 2274, "length": 2 }, - "confidence": 0.985, - "source": "D(1,10.078,13.8606,10.5248,13.8527,10.5285,14.1096,10.082,14.118)" + "confidence": 0.897, + "source": "D(1,10.6571,12.4803,11.2744,12.4969,11.2693,12.8457,10.6516,12.8273)" }, { "content": "MG", "span": { - "offset": 2368, + "offset": 2277, "length": 2 }, - "confidence": 0.996, - "source": "D(1,10.7861,13.8492,11.2918,13.839,11.2957,14.0988,10.79,14.1056)" - }, - { - "content": "CAPSULE", - "span": { - "offset": 2371, - "length": 7 - }, - "confidence": 0.993, - "source": "D(1,11.5362,13.834,13.2304,13.7986,13.2347,14.0576,11.5401,14.0948)" + "confidence": 0.977, + "source": "D(1,11.5058,12.5043,12.1726,12.5252,12.1672,12.8767,11.5007,12.8539)" }, { - "content": "CPTP", + "content": "CAP", "span": { - "offset": 2379, - "length": 4 + "offset": 2280, + "length": 3 }, - "confidence": 0.988, - "source": "D(1,13.4706,13.7945,14.4486,13.7837,14.4492,14.0399,13.4752,14.0526)" + "confidence": 0.973, + "source": "D(1,12.3599,12.5302,13.2704,12.556,13.27,12.8969,12.3547,12.879)" }, { - "content": "54092-0471-01", + "content": "43975-0282-20", "span": { - "offset": 2433, + "offset": 2333, "length": 13 }, - "confidence": 0.632, - "source": "D(1,20.5987,13.6589,23.7417,13.6028,23.747,13.8622,20.6017,13.9214)" + "confidence": 0.736, + "source": "D(1,20.8422,12.7866,24.6127,12.8741,24.6127,13.1944,20.8417,13.0906)" }, { - "content": "40", + "content": "199", "span": { - "offset": 2536, - "length": 2 + "offset": 2436, + "length": 3 }, - "confidence": 0.997, - "source": "D(1,29.4674,13.4336,30.1641,13.4126,30.1641,13.7875,29.4719,13.7988)" + "confidence": 0.093, + "source": "D(1,30.6173,12.7434,31.5084,12.6859,31.5084,13.1804,30.6196,13.2986)" }, { - "content": "0", + "content": "11/20/23", "span": { - "offset": 2548, - "length": 1 + "offset": 2459, + "length": 8 }, - "confidence": 0.691, - "source": "D(1,30.9152,13.4006,31.2991,13.3801,31.3101,13.8005,30.9258,13.8074)" + "confidence": 0.277, + "source": "D(1,32.0937,12.8805,33.9054,12.8638,33.9054,13.4041,32.0946,13.4066)" }, { - "content": "30-23", + "content": "1", "span": { - "offset": 2550, - "length": 5 + "offset": 2488, + "length": 1 }, - "confidence": 0.867, - "source": "D(1,31.4319,13.3756,32.8535,13.3178,32.8535,13.7631,31.4412,13.7953)" + "confidence": 0.64, + "source": "D(1,0.2826,12.9105,0.5336,12.9129,0.5362,13.235,0.2851,13.231)" }, { - "content": "5", + "content": "1", "span": { - "offset": 2576, + "offset": 2499, "length": 1 }, - "confidence": 0.989, - "source": "D(1,1.7481,14.5093,1.9302,14.5037,1.9308,14.7566,1.7488,14.7627)" + "confidence": 0.988, + "source": "D(1,2.1497,12.9734,2.3598,12.9751,2.3591,13.3055,2.1492,13.3033)" }, { - "content": "6", + "content": ".000", "span": { - "offset": 2778, - "length": 1 + "offset": 2501, + "length": 4 }, - "confidence": 0.992, - "source": "D(1,1.7419,15.1261,1.9432,15.1175,1.9437,15.3555,1.7423,15.3633)" + "confidence": 0.977, + "source": "D(1,2.4514,12.976,3.4209,12.9901,3.4206,13.316,2.4506,13.3072)" }, { - "content": "7", + "content": "DEXTROAMP-AMPHETAMIN", "span": { - "offset": 2980, - "length": 1 + "offset": 2515, + "length": 20 }, - "confidence": 0.989, - "source": "D(1,1.7655,15.6961,1.9448,15.6889,1.945,15.938,1.7657,15.9434)" + "confidence": 0.843, + "source": "D(1,5.0577,13.0674,10.6838,13.233,10.6781,13.5716,5.0524,13.382)" }, { - "content": "8", + "content": "20", "span": { - "offset": 3182, - "length": 1 + "offset": 2536, + "length": 2 }, - "confidence": 0.996, - "source": "D(1,1.7742,16.2874,1.9687,16.2803,1.9687,16.5315,1.7749,16.539)" + "confidence": 0.995, + "source": "D(1,10.9372,13.2416,11.4766,13.2594,11.4713,13.5961,10.9318,13.5791)" }, { - "content": "9", + "content": "MG", "span": { - "offset": 3384, - "length": 1 + "offset": 2539, + "length": 2 }, - "confidence": 0.994, - "source": "D(1,1.7963,16.8725,1.9863,16.867,1.9863,17.1173,1.7969,17.1255)" + "confidence": 0.992, + "source": "D(1,11.7679,13.2688,12.4367,13.2894,12.4315,13.6242,11.7625,13.6057)" }, { - "content": "10", + "content": "TAB", "span": { - "offset": 3586, - "length": 2 + "offset": 2542, + "length": 3 }, - "confidence": 0.993, - "source": "D(1,1.7612,17.4559,2.1086,17.4453,2.1094,17.6991,1.7627,17.7061)" + "confidence": 0.969, + "source": "D(1,12.6687,13.2945,13.583,13.3168,13.583,13.6445,12.6639,13.6272)" }, { - "content": "11", + "content": "64850-0505-01", "span": { - "offset": 3789, - "length": 2 + "offset": 2595, + "length": 13 }, - "confidence": 0.986, - "source": "D(1,1.785,18.0285,2.1094,18.0176,2.1094,18.2881,1.7863,18.2933)" + "confidence": 0.921, + "source": "D(1,20.7944,13.5334,24.5543,13.6249,24.5534,13.9488,20.7958,13.862)" }, { - "content": "12", + "content": "201", "span": { - "offset": 3992, - "length": 2 + "offset": 2698, + "length": 3 }, - "confidence": 0.992, - "source": "D(1,1.8065,18.6197,2.1445,18.6102,2.1445,18.8774,1.8081,18.8835)" + "confidence": 0.308, + "source": "D(1,31.598,13.9945,30.6052,14.0596,30.6052,13.4532,31.5982,13.4094)" }, { - "content": "13", + "content": "11/20/23", "span": { - "offset": 4195, - "length": 2 + "offset": 2723, + "length": 8 }, - "confidence": 0.993, - "source": "D(1,1.8075,19.2234,2.1439,19.2123,2.1445,19.4678,1.8089,19.4766)" + "confidence": 0.859, + "source": "D(1,32.0781,13.5077,33.836,13.5193,33.836,14.0104,32.0794,14.0042)" }, { - "content": "14", + "content": "1", "span": { - "offset": 4398, - "length": 2 + "offset": 2752, + "length": 1 }, - "confidence": 0.999, - "source": "D(1,1.8141,19.8055,2.1522,19.7948,2.1535,20.0531,1.8154,20.062)" + "confidence": 0.561, + "source": "D(1,0.2852,13.6091,0.5211,13.6125,0.5211,13.9583,0.287,13.9522)" }, { - "content": "15", + "content": "10.", "span": { - "offset": 4601, - "length": 2 + "offset": 2763, + "length": 3 }, - "confidence": 0.997, - "source": "D(1,1.8113,20.4034,2.1576,20.3945,2.1588,20.647,1.8126,20.6525)" + "confidence": 0.567, + "source": "D(1,2.1345,13.6923,2.8087,13.7041,2.8072,14.0366,2.1346,14.0306)" }, { - "content": "16", + "content": "0001m", "span": { - "offset": 4804, - "length": 2 + "offset": 2767, + "length": 5 }, - "confidence": 0.998, - "source": "D(1,1.8169,20.9902,2.1621,20.9805,2.1621,21.2461,1.818,21.2519)" + "confidence": 0.537, + "source": "D(1,2.9019,13.7058,4.1861,13.7282,4.1861,14.0625,2.9005,14.0389)" }, { - "content": "17", + "content": "HYDROCODONE-ACETAMN", "span": { - "offset": 5007, - "length": 2 + "offset": 2782, + "length": 19 }, - "confidence": 0.999, - "source": "D(1,1.8226,21.5805,2.1567,21.5691,2.1572,21.8414,1.8233,21.8487)" + "confidence": 0.567, + "source": "D(1,5.0314,13.7838,10.3924,13.9597,10.3856,14.3211,5.0254,14.1244)" }, { - "content": "18", + "content": "7.5-325/15", "span": { - "offset": 5210, - "length": 2 + "offset": 2802, + "length": 10 }, - "confidence": 0.998, - "source": "D(1,1.8107,22.1881,2.1445,22.1811,2.1445,22.4341,1.8116,22.4434)" + "confidence": 0.642, + "source": "D(1,10.5935,13.9667,13.5812,14.0685,13.5756,14.4271,10.5866,14.3291)" }, { - "content": "19", + "content": "71930-0027-43", "span": { - "offset": 5413, - "length": 2 + "offset": 2852, + "length": 13 }, - "confidence": 0.998, - "source": "D(1,1.8071,22.7675,2.1445,22.7613,2.1445,23.0266,1.8082,23.0355)" + "confidence": 0.649, + "source": "D(1,20.768,14.2981,24.5259,14.3573,24.5259,14.6701,20.7675,14.6148)" }, { - "content": "20", + "content": "1BE", "span": { - "offset": 5616, - "length": 2 + "offset": 2965, + "length": 3 }, - "confidence": 0.993, - "source": "D(1,1.7901,23.3835,2.1443,23.3746,2.1445,23.6323,1.7913,23.6407)" + "confidence": 0.104, + "source": "D(1,30.6647,14.1383,31.4911,14.0895,31.4911,14.5321,30.6676,14.6181)" }, { - "content": "4", + "content": "1/20/23", "span": { - "offset": 5819, - "length": 1 + "offset": 2990, + "length": 7 }, - "confidence": 0.987, - "source": "D(1,1.9591,24.5122,2.1445,24.5084,2.1445,24.7821,1.9596,24.7851)" + "confidence": 0.64, + "source": "D(1,31.9968,14.1728,33.7839,14.2193,33.7839,14.7674,31.9984,14.7409)" }, { "content": "LAST", "span": { - "offset": 5842, + "offset": 5657, "length": 4 }, - "confidence": 0.988, - "source": "D(1,4.1278,24.2388,4.9563,24.2218,4.959,24.5149,4.1317,24.5286)" + "confidence": 0.989, + "source": "D(1,0.7986,23.4674,1.8202,23.5042,1.8055,23.8904,0.7833,23.8413)" }, { "content": "LINE", "span": { - "offset": 5847, + "offset": 5662, "length": 4 }, - "confidence": 0.992, - "source": "D(1,5.0671,24.22,5.8041,24.2094,5.8073,24.5019,5.0699,24.5138)" + "confidence": 0.989, + "source": "D(1,1.9037,23.5072,2.8477,23.552,2.8341,23.9371,1.889,23.8946)" }, { "content": "COMPLETED", "span": { - "offset": 5852, + "offset": 5667, "length": 9 }, - "confidence": 0.997, - "source": "D(1,5.9004,24.207,7.9716,24.1659,7.9762,24.4657,5.9037,24.4998)" + "confidence": 0.992, + "source": "D(1,2.9698,23.5568,5.2889,23.6506,5.2694,24.0504,2.9559,23.9426)" }, { "content": "(MUST", "span": { - "offset": 5862, + "offset": 5677, "length": 5 }, - "confidence": 0.994, - "source": "D(1,8.0872,24.1639,9.1374,24.1489,9.1426,24.4454,8.092,24.4634)" + "confidence": 0.959, + "source": "D(1,5.4752,23.6587,6.7016,23.7202,6.6831,24.1151,5.4559,24.0589)" }, { "content": "BE", "span": { - "offset": 5868, + "offset": 5683, "length": 2 }, - "confidence": 0.992, - "source": "D(1,9.2337,24.148,9.6914,24.1431,9.6964,24.437,9.2389,24.4441)" + "confidence": 0.887, + "source": "D(1,6.8108,23.725,7.2926,23.7463,7.2744,24.1387,6.7924,24.1194)" }, { "content": "20", "span": { - "offset": 5871, + "offset": 5686, "length": 2 }, - "confidence": 0.998, - "source": "D(1,9.7781,24.1416,10.1346,24.1355,10.14,24.4274,9.7832,24.4351)" + "confidence": 0.96, + "source": "D(1,7.4788,23.7555,7.8577,23.7742,7.8391,24.1651,7.4605,24.1474)" }, { "content": "OR", "span": { - "offset": 5874, + "offset": 5689, "length": 2 }, - "confidence": 0.999, - "source": "D(1,10.2502,24.1335,10.7463,24.1254,10.7519,24.416,10.2556,24.4252)" + "confidence": 0.689, + "source": "D(1,7.9925,23.7806,8.4742,23.8025,8.4569,24.1966,7.9741,24.1718)" }, { "content": "LESS)", "span": { - "offset": 5877, + "offset": 5692, "length": 5 }, - "confidence": 0.984, - "source": "D(1,10.8475,24.124,11.8125,24.1076,11.8125,24.4028,10.8531,24.4142)" + "confidence": 0.936, + "source": "D(1,8.6605,23.8113,9.8659,23.8688,9.8528,24.2675,8.6438,24.2059)" } ], "lines": [ { - "content": "DEA FORM-222", - "source": "D(1,1.2589,1.4763,3.8915,1.3748,3.9023,1.6576,1.2698,1.7591)", - "span": { - "offset": 10, - "length": 12 - } - }, - { - "content": "U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II", - "source": "D(1,12.2912,0.8412,21.1724,0.6504,21.1804,0.9492,12.2993,1.1678)", - "span": { - "offset": 38, - "length": 44 - } - }, - { - "content": "DRUG ENFORCEMENT ADMINISTRATION", - "source": "D(1,13.4704,1.223,20.0229,1.061,20.0299,1.3435,13.4774,1.5056)", - "span": { - "offset": 83, - "length": 31 - } - }, - { - "content": "OMB APPROVAL No. 1117-0010", - "source": "D(1,27.5155,0.5089,32.3034,0.481,32.305,0.7472,27.517,0.7751)", - "span": { - "offset": 116, - "length": 26 - } - }, - { - "content": "PURCHASER INFORMATION", - "source": "D(1,1.5409,3.6817,5.9527,3.5332,5.959,3.8066,1.5502,3.9566)", - "span": { - "offset": 144, - "length": 21 - } - }, - { - "content": "INMAR RX SOLUTIONS, INC", - "source": "D(1,1.5363,4.3942,5.8295,4.2891,5.8359,4.57,1.5437,4.6806)", - "span": { - "offset": 167, - "length": 23 - } - }, - { - "content": "3845 GRAND LAKES WAY", - "source": "D(1,1.5189,4.751,5.4812,4.6758,5.4844,4.9428,1.5256,5.0367)", + "content": "RX SOLUTIONS. ING", + "source": "D(1,0.0476,0.2622,3.9348,0.2827,3.9329,0.625,0.0458,0.6055)", "span": { - "offset": 191, - "length": 20 + "offset": 0, + "length": 17 } }, { - "content": "SUITE 125", - "source": "D(1,1.5022,5.1369,3.0329,5.0683,3.041,5.3289,1.5139,5.3975)", + "content": "HAND LAKES WAY", + "source": "D(1,0.067,0.7069,3.5087,0.7124,3.5082,1.052,0.0664,1.0466)", "span": { - "offset": 212, - "length": 9 + "offset": 18, + "length": 14 } }, { - "content": "GRAND PRAIRIE, TX 75050-0000", - "source": "D(1,1.4851,5.4643,6.5408,5.4195,6.5432,5.6965,1.4875,5.7414)", + "content": "125", + "source": "D(1,0.1348,1.1446,0.7325,1.1411,0.7344,1.4597,0.1366,1.4632)", "span": { - "offset": 222, - "length": 28 + "offset": 33, + "length": 3 } }, { - "content": "REGISTRATION INFORMATION", - "source": "D(1,10.8015,3.4847,15.6909,3.3581,15.6973,3.6165,10.8082,3.7432)", + "content": "PRAIRIE, TX 75050-0000", + "source": "D(1,0.0364,1.5753,4.6521,1.584,4.6515,1.9417,0.0357,1.9331)", "span": { - "offset": 252, - "length": 24 + "offset": 37, + "length": 22 } }, { - "content": "REGISTRATION #, RR0191902", - "source": "D(1,10.8281,4.4051,15.5083,4.3066,15.5143,4.569,10.8324,4.6727)", + "content": "REGISTRATION #: KR0191902", + "source": "D(1,9.6402,0.4408,15.2055,0.3299,15.213,0.6656,9.6477,0.7812)", "span": { - "offset": 278, + "offset": 61, "length": 25 } }, { "content": "REGISTERED AS: REVERSE DISTRIB", - "source": "D(1,10.8457,4.8814,16.6404,4.7461,16.6469,5.0153,10.8493,5.1539)", + "source": "D(1,9.6094,0.9862,16.5365,0.8312,16.5446,1.1892,9.6174,1.3442)", "span": { - "offset": 305, + "offset": 87, "length": 30 } }, { "content": "SCHEDULES: 1,2,2N,3,3N,4,5,", - "source": "D(1,10.8718,5.3531,15.4188,5.2685,15.4238,5.54,10.8769,5.6245)", + "source": "D(1,9.6316,1.5449,14.9883,1.4531,14.9944,1.808,9.6377,1.8998)", "span": { - "offset": 336, + "offset": 118, "length": 27 } }, { - "content": "ORDER FORM NUMBER. 231454769", - "source": "D(1,10.8774,5.8437,16.451,5.7238,16.4567,5.9898,10.8832,6.1097)", + "content": "ORDER FORM NUMBER: 231554550", + "source": "D(1,9.6007,2.1008,16.2392,1.9965,16.2449,2.3402,9.6064,2.4478)", "span": { - "offset": 364, + "offset": 146, "length": 28 } }, { - "content": "DATE ISSUED. 09262023", - "source": "D(1,10.8991,6.3295,14.7069,6.2605,14.7119,6.5372,10.9041,6.6062)", - "span": { - "offset": 394, - "length": 21 - } - }, - { - "content": "ORDER FORM 3 OF 3", - "source": "D(1,10.916,6.8022,14.2365,6.75,14.2411,7.0053,10.9184,7.0636)", - "span": { - "offset": 416, - "length": 17 - } - }, - { - "content": "SUPPLIER DEA NUMBER:#", - "source": "D(1,20.24,3.3678,23.9095,3.3472,23.9108,3.574,20.2413,3.5945)", + "content": "DATE ISSUED. 10162023", + "source": "D(1,9.5368,2.6994,14.0904,2.6056,14.0976,2.9556,9.544,3.0494)", "span": { - "offset": 435, + "offset": 176, "length": 21 } }, { - "content": "FA5718830", - "source": "D(1,26.1301,3.1061,32.1171,3.0059,32.1333,3.9123,26.1463,4.0187)", + "content": "ORDER FORM. 1 OF 3.", + "source": "D(1,9.5781,3.2476,13.5211,3.1771,13.5293,3.5328,9.5863,3.6197)", "span": { - "offset": 458, - "length": 9 + "offset": 198, + "length": 19 } }, { "content": "PART 2: TO BE FILLED IN BY PURCHASER", - "source": "D(1,20.2685,4.3982,27.1032,4.2054,27.1113,4.491,20.2766,4.6582)", + "source": "D(1,20.9632,0.6597,28.8509,1.2529,28.8264,1.6011,20.9477,0.9757)", "span": { - "offset": 469, + "offset": 219, "length": 36 } }, { - "content": "CVS PHARMACY # 16800", - "source": "D(1,20.4677,4.6354,26.1627,4.5183,26.1697,4.8585,20.4747,4.9746)", + "content": ": CVS PHARMACY # 03896", + "source": "D(1,21.1946,1.0243,28.2672,1.5331,28.235,1.9494,21.1624,1.4021)", "span": { - "offset": 506, - "length": 20 + "offset": 257, + "length": 22 } }, { "content": "BUSINESS NAME", - "source": "D(1,20.2808,5.1541,22.6034,5.1466,22.6041,5.3707,20.2815,5.3782)", + "source": "D(1,20.9517,1.5632,23.8285,1.7372,23.81,2.0425,20.9332,1.8685)", "span": { - "offset": 528, + "offset": 281, "length": 13 } }, { - "content": "4601 MONTGOMERY HWY STE 300", - "source": "D(1,20.4785,5.4479,28.5551,5.1692,28.567,5.5164,20.4896,5.748)", + "content": "9308 KENDALL DR.", + "source": "D(1,21.1254,1.9003,26.3149,2.2743,26.2905,2.6736,21.1041,2.3097)", "span": { - "offset": 543, - "length": 27 + "offset": 296, + "length": 16 } }, { "content": "STREET ADDRESS", - "source": "D(1,20.3035,5.9935,22.8478,5.9653,22.8503,6.1899,20.306,6.2182)", + "source": "D(1,20.9066,2.5521,24.0725,2.7278,24.0547,3.0415,20.8956,2.862)", "span": { - "offset": 572, + "offset": 314, "length": 14 } }, { - "content": "DOTHAN, AL 36303", - "source": "D(1,20.4855,6.2226,24.9058,6.1081,24.9147,6.451,20.4944,6.5391)", + "content": "CHARLOTTE, NC 28214", + "source": "D(1,21.1486,2.8819,27.4266,3.3093,27.3986,3.7132,21.1214,3.2725)", "span": { - "offset": 588, - "length": 16 + "offset": 329, + "length": 19 } }, { "content": "CITY, STATE, ZIP CODE", - "source": "D(1,20.3234,6.8092,23.5333,6.757,23.5374,7.0084,20.3275,7.0606)", + "source": "D(1,20.9221,3.5421,24.8385,3.7559,24.8214,4.0996,20.913,3.8858)", "span": { - "offset": 606, + "offset": 350, "length": 21 } }, { - "content": "PART 1: TO BE FILLED IN BY PURCHASER", - "source": "D(1,1.3237,8.0784,8.2815,8.0073,8.2844,8.2885,1.3266,8.3496)", + "content": "AR8109046", + "source": "D(1,27.823,0.1562,34.0618,0.7212,34.0364,1.6951,27.774,1.0297)", "span": { - "offset": 629, - "length": 36 + "offset": 373, + "length": 9 } }, { - "content": "DIANA RUIZ DEA CLERK", - "source": "D(1,4.1951,8.7527,8.613,8.7447,8.6135,9.0691,4.1957,9.0771)", + "content": ": TO BE FILLED IN BY PURCHASER", + "source": "D(1,0.0461,4.6457,6.4861,4.6007,6.4892,4.9596,0.0492,5.0138)", "span": { - "offset": 667, - "length": 20 + "offset": 384, + "length": 30 } }, { - "content": "Print or Type Name and Title", - "source": "D(1,1.3327,9.4476,5.1039,9.429,5.1052,9.6959,1.334,9.7146)", + "content": "Gladys Irasema Ruga", + "source": "D(1,0.2084,5.6842,4.1294,5.5556,4.134,5.9569,0.2129,6.0935)", "span": { - "offset": 689, - "length": 28 + "offset": 416, + "length": 19 } }, { - "content": "Manuel", - "source": "D(1,1.636,9.5312,5.2101,9.5286,5.2107,10.3801,1.6366,10.3827)", + "content": "DEA.Clerk", + "source": "D(1,4.7361,5.4824,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", "span": { - "offset": 719, - "length": 6 + "offset": 437, + "length": 9 + } + }, + { + "content": "Nage and Title", + "source": "D(1,0.0842,6.2251,2.7383,6.2192,2.7391,6.5686,0.0849,6.5745)", + "span": { + "offset": 448, + "length": 14 + } + }, + { + "content": "8", + "source": "D(1,0.0662,6.0887,1.0163,6.0825,1.0248,7.4683,0.0753,7.4745)", + "span": { + "offset": 463, + "length": 1 } }, { "content": "by power of attorney", - "source": "D(1,5.545,9.6508,10.4472,9.5801,10.4521,9.8775,5.5499,9.9555)", + "source": "D(1,3.1521,6.5171,8.8418,6.5302,8.8409,6.9118,3.1512,6.8986)", "span": { - "offset": 727, + "offset": 466, "length": 20 } }, { - "content": "10/23/2023", - "source": "D(1,12.1943,9.5001,14.5784,9.4746,14.5821,9.7691,12.198,9.7987)", + "content": "11/06/2023", + "source": "D(1,10.8632,6.4868,13.7213,6.4948,13.7202,6.8813,10.8621,6.8732)", "span": { - "offset": 748, + "offset": 487, "length": 10 } }, { - "content": "Signature of Requesting Official (must be authorized to sign order form)", - "source": "D(1,1.3359,10.4179,10.5522,10.296,10.5559,10.5788,1.339,10.6875)", + "content": "RequestingiOfficial (must be atthonzed'to signiorder form)", + "source": "D(1,0.0824,7.3437,8.9196,7.3817,8.918,7.7431,0.0808,7.7081)", "span": { - "offset": 760, - "length": 72 + "offset": 499, + "length": 58 } }, { "content": "Date", - "source": "D(1,12.017,10.253,12.612,10.2539,12.6117,10.4718,12.0167,10.471)", + "source": "D(1,10.6475,7.3986,11.3557,7.4101,11.3511,7.688,10.643,7.6764)", "span": { - "offset": 834, + "offset": 559, "length": 4 } }, { "content": "PART 5:", - "source": "D(1,17.993,8.2528,19.2537,8.243,19.2557,8.5,17.995,8.5097)", + "source": "D(1,17.9504,5.1215,19.5639,5.1673,19.5529,5.5348,17.9428,5.4864)", "span": { - "offset": 870, + "offset": 565, "length": 7 } }, { "content": "TO BE", - "source": "D(1,18.1325,8.6296,19.1279,8.6211,19.1301,8.871,18.1346,8.8795)", + "source": "D(1,18.1383,5.5906,19.3927,5.6206,19.3841,5.9808,18.1339,5.9507)", "span": { - "offset": 878, + "offset": 573, "length": 5 } }, { "content": "FILLED IN BY", - "source": "D(1,17.6058,9.0128,19.6892,8.9958,19.6912,9.2476,17.6079,9.2646)", + "source": "D(1,17.4341,6.033,20.0854,6.1079,20.0749,6.4757,17.4237,6.4024)", "span": { - "offset": 884, + "offset": 579, "length": 12 } }, { "content": "PURCHASER", - "source": "D(1,17.6283,9.393,19.6816,9.3737,19.684,9.6262,17.6307,9.6455)", + "source": "D(1,17.4329,6.5208,20.0438,6.5845,20.0354,6.9289,17.4245,6.8651)", "span": { - "offset": 897, + "offset": 592, "length": 9 } }, { - "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier", - "source": "D(1,20.3432,7.7303,32.1175,7.4355,32.1252,7.6947,20.351,8.0145)", + "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to bf You kly ft: o .p.r", + "source": "D(1,20.9362,4.6701,33.8881,5.5621,33.8741,5.9282,20.913,4.9719)", "span": { - "offset": 916, - "length": 77 + "offset": 603, + "length": 68 } }, { - "content": "(name in part 2) if order is endorsed to another supplier to fill", - "source": "D(1,20.345,8.1335,28.0884,7.8669,28.097,8.1179,20.3536,8.3672)", + "content": "(name in part 2) if order is endorsed foranother suppker to f.l:", + "source": "D(1,20.9153,5.1389,29.8235,5.6539,29.8045,5.9722,20.8963,5.4415)", "span": { - "offset": 994, - "length": 65 + "offset": 672, + "length": 64 } }, { "content": "ALTERNATE DEA #", - "source": "D(1,20.3408,8.5371,23.3489,8.465,23.3551,8.727,20.3471,8.799)", + "source": "D(1,20.8821,5.625,24.5606,5.799,24.5466,6.1543,20.8646,5.9734)", "span": { - "offset": 1080, + "offset": 737, "length": 15 } }, { "content": "Signature- by first supplier", - "source": "D(1,20.3555,9.3451,24.2489,9.2461,24.2562,9.498,20.3628,9.5977)", + "source": "D(1,20.8555,6.6065,25.4812,6.862,25.4639,7.2205,20.8435,6.965)", "span": { - "offset": 1116, + "offset": 754, "length": 28 } }, { - "content": "Lingua. Drier", - "source": "D(1,20.2151,9.6206,25.3787,9.5273,25.3946,10.1864,20.231,10.3064)", - "span": { - "offset": 1145, - "length": 13 - } - }, - { - "content": "10-26-23", - "source": "D(1,28.5162,9.6006,30.9882,9.5172,31.0031,9.9603,28.5311,10.0371)", - "span": { - "offset": 1159, - "length": 8 - } - }, - { - "content": "DATE", - "source": "D(1,28.3769,10.1555,28.9343,10.1399,28.9394,10.3231,28.3821,10.3359)", - "span": { - "offset": 1168, - "length": 4 - } - }, - { - "content": "OFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER", - "source": "D(1,20.3614,10.358,26.7071,10.1668,26.714,10.3933,20.3682,10.582)", + "content": "OFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER", + "source": "D(1,20.8381,7.8993,28.1735,8.227,28.1669,8.4627,20.8272,8.1228)", "span": { - "offset": 1173, + "offset": 784, "length": 52 } }, { - "content": "ITEM", - "source": "D(1,1.4242,11.5154,2.1379,11.5104,2.1397,11.7584,1.426,11.7634)", + "content": "04'T", + "source": "D(1,29.9139,8.3507,30.5276,8.3662,30.5211,8.6014,29.9104,8.5844)", "span": { - "offset": 1265, + "offset": 838, "length": 4 } }, { - "content": "NO OF", - "source": "D(1,2.9295,11.3348,3.935,11.3277,3.9366,11.5635,2.9312,11.5706)", + "content": "NO. OF", + "source": "D(1,0.2663,8.4109,1.3601,8.4183,1.358,8.7254,0.2643,8.718)", "span": { - "offset": 1279, - "length": 5 + "offset": 862, + "length": 6 } }, { "content": "PACKAGES", - "source": "D(1,2.6468,11.6715,4.2514,11.6543,4.2539,11.893,2.6494,11.9109)", + "source": "D(1,0.0751,8.8117,1.6849,8.8271,1.6835,9.1258,0.0723,9.1104)", "span": { - "offset": 1285, + "offset": 869, "length": 8 } }, { - "content": "PACKAGE", - "source": "D(1,4.614,11.302,6.0087,11.2893,6.0109,11.5265,4.6161,11.5393)", + "content": "PACKAGE 1", + "source": "D(1,2.0179,8.4325,3.8469,8.4361,3.8463,8.7425,2.0173,8.7389)", "span": { - "offset": 1303, - "length": 7 + "offset": 887, + "length": 23 } }, { "content": "SIZE", - "source": "D(1,5.0179,11.6301,5.6488,11.6281,5.6496,11.8635,5.0186,11.8655)", + "source": "D(1,2.4772,8.8375,3.24,8.8464,3.2366,9.1427,2.4738,9.1338)", "span": { - "offset": 1311, + "offset": 895, "length": 4 } }, { "content": "NAME OF ITEM", - "source": "D(1,10.6656,11.3645,12.7343,11.3243,12.7388,11.5575,10.6701,11.5977)", + "source": "D(1,9.0158,8.7047,11.4897,8.7102,11.489,9.0091,9.0151,9.0035)", "span": { - "offset": 1325, + "offset": 911, "length": 12 } }, { "content": "NUMBER", - "source": "D(1,17.3628,10.9483,18.5911,10.9204,18.5963,11.1496,17.368,11.1774)", + "source": "D(1,17.0559,8.4201,18.6538,8.4439,18.6488,8.7421,17.0509,8.7152)", "span": { - "offset": 1347, + "offset": 933, "length": 6 } }, { "content": "REC'D", - "source": "D(1,17.5586,11.2654,18.4143,11.2544,18.4172,11.481,17.5615,11.492)", + "source": "D(1,17.2313,8.8066,18.3495,8.8201,18.3455,9.1468,17.2306,9.1333)", "span": { - "offset": 1354, + "offset": 940, "length": 5 } }, { "content": "DATE", - "source": "D(1,19.0158,10.9212,19.7528,10.9136,19.755,11.1324,19.018,11.1399)", + "source": "D(1,19.0675,8.4723,20.0445,8.5008,20.0366,8.7893,19.0591,8.7607)", "span": { - "offset": 1369, + "offset": 955, "length": 4 } }, { "content": "REC'D", - "source": "D(1,18.9668,11.2379,19.8021,11.2295,19.8044,11.4572,18.9687,11.4656)", + "source": "D(1,19.0279,8.8652,20.0893,8.8906,20.0821,9.1884,19.0208,9.1629)", "span": { - "offset": 1374, + "offset": 960, "length": 5 } }, { "content": "PART 4: TO BE FILLED IN BY SUPPLIER", - "source": "D(1,20.2568,11.0057,26.5827,10.8225,26.5899,11.0727,20.264,11.25)", + "source": "D(1,20.6256,8.6632,27.9953,8.9669,27.9812,9.2997,20.6177,8.9887)", "span": { - "offset": 1389, - "length": 57 + "offset": 975, + "length": 65 } }, { - "content": "NATIONAL DRUG CODE", - "source": "D(1,22.9388,11.2829,26.2413,11.1973,26.2473,11.4262,22.9448,11.5127)", + "content": "NATIONALIDRUG CODE", + "source": "D(1,23.8335,9.2299,27.5829,9.3972,27.5719,9.6985,23.82,9.5313)", "span": { - "offset": 1447, + "offset": 1041, "length": 18 } }, { "content": "NUMBER", - "source": "D(1,29.2725,10.7671,30.5328,10.736,30.5384,10.9648,29.2781,10.9958)", + "source": "D(1,30.795,9.1503,32.0587,9.1893,32.0499,9.4719,30.7863,9.4329)", "span": { - "offset": 1475, + "offset": 1099, "length": 6 } }, { "content": "SHIPPED", - "source": "D(1,29.2852,11.0891,30.5369,11.0702,30.5405,11.3092,29.2888,11.328)", + "source": "D(1,30.7625,9.5225,32.0466,9.5593,32.038,9.8598,30.7539,9.823)", "span": { - "offset": 1482, + "offset": 1106, "length": 7 } }, { "content": "DATE", - "source": "D(1,31.3378,10.697,32.0989,10.6869,32.1021,10.9212,31.3409,10.9313)", + "source": "D(1,32.8607,9.2456,33.6449,9.2692,33.64,9.5588,32.852,9.5352)", "span": { - "offset": 1499, + "offset": 1135, "length": 4 } }, { - "content": "SHIPPED", - "source": "D(1,31.0971,11.0407,32.3731,11.0107,32.3789,11.2564,31.1028,11.2864)", + "content": "SixPFAD", + "source": "D(1,32.5756,9.6269,33.8873,9.6545,33.8811,9.9479,32.5694,9.9219)", "span": { - "offset": 1504, + "offset": 1140, "length": 7 } }, { "content": "1", - "source": "D(1,1.7191,12.15,1.8531,12.149,1.8549,12.3968,1.7209,12.3978)", - "span": { - "offset": 1532, - "length": 1 - } - }, - { - "content": "1", - "source": "D(1,2.8585,12.1372,3.0528,12.1366,3.0537,12.4011,2.8594,12.4018)", + "source": "D(1,0.1434,9.3461,0.3915,9.3451,0.3928,9.6942,0.1447,9.6951)", "span": { - "offset": 1543, + "offset": 1168, "length": 1 } }, { - "content": "20.000", - "source": "D(1,4.6266,12.1073,6.0638,12.0937,6.0663,12.357,4.6291,12.3708)", + "content": "10 .. 000", + "source": "D(1,2.0041,9.3907,3.6473,9.3989,3.6456,9.7419,2.0024,9.7337)", "span": { - "offset": 1554, - "length": 6 + "offset": 1179, + "length": 9 } }, { - "content": "METHADONE HCL 10 MG TABLET TAB", - "source": "D(1,7.3064,12.0778,14.6661,11.947,14.6707,12.2041,7.311,12.3223)", + "content": "DEXTROAMP-AMPHET' ER 10 MG CAP", + "source": "D(1,5.0573,9.4288,13.3835,9.5371,13.3788,9.8919,5.0527,9.7836)", "span": { - "offset": 1570, + "offset": 1198, "length": 30 } }, { - "content": "00054-0710-25", - "source": "D(1,20.5618,11.8333,23.703,11.7454,23.7108,12.0224,20.5695,12.1103)", + "content": "00406-8952-01", + "source": "D(1,20.9503,9.7323,24.6648,9.8831,24.6599,10.2136,20.9369,10.0628)", "span": { - "offset": 1650, + "offset": 1268, "length": 13 } }, { - "content": "20", - "source": "D(1,29.2186,11.5698,30.006,11.5523,30.0162,12.0089,29.2287,12.0264)", + "content": "TRY", + "source": "D(1,30.9526,9.9532,32.042,9.8958,32.0469,10.5082,30.9666,10.5717)", "span": { - "offset": 1753, - "length": 2 + "offset": 1381, + "length": 3 } }, { - "content": "10-30-21", - "source": "D(1,30.7832,11.5878,32.885,11.5244,32.8984,11.9701,30.7966,12.0234)", + "content": "11/20/23", + "source": "D(1,32.3624,10.1342,34.0184,10.1382,34.0173,10.6097,32.3613,10.6058)", "span": { - "offset": 1765, + "offset": 1404, "length": 8 } }, - { - "content": "2", - "source": "D(1,1.7037,12.7382,1.8833,12.7374,1.8843,12.9895,1.7048,12.9903)", - "span": { - "offset": 1794, - "length": 1 - } - }, { "content": "1", - "source": "D(1,2.8545,12.7514,3.0626,12.7507,3.0635,13.0053,2.8554,13.006)", + "source": "D(1,0.1454,10.0663,0.3852,10.065,0.3871,10.3993,0.1473,10.4006)", "span": { - "offset": 1805, + "offset": 1433, "length": 1 } }, { - "content": "10.000", - "source": "D(1,4.6504,12.7251,6.0766,12.7079,6.0798,12.9657,4.6535,12.9829)", + "content": "3 .000", + "source": "D(1,2.0249,10.1172,3.3478,10.1271,3.3454,10.4474,2.0225,10.4375)", "span": { - "offset": 1816, + "offset": 1444, "length": 6 } }, { - "content": "DEXMETHYLPHENIDATE ER 25 MG CP", - "source": "D(1,7.3215,12.6821,14.6597,12.5562,14.6641,12.8149,7.3259,12.9375)", + "content": "OXYCODONE HCL. (IR)' 20 MG TAB T", + "source": "D(1,5.0576,10.1562,13.6666,10.2835,13.6609,10.6424,5.0518,10.5188)", "span": { - "offset": 1832, - "length": 30 + "offset": 1460, + "length": 32 } }, { - "content": "00115-1709-01", - "source": "D(1,20.5808,12.4327,23.7221,12.3658,23.7277,12.6308,20.5865,12.6976)", + "content": "10702-0057-01", + "source": "D(1,20.9311,10.4813,24.6551,10.6186,24.6422,10.9699,20.9181,10.8326)", "span": { - "offset": 1912, + "offset": 1542, "length": 13 } }, { - "content": "10", - "source": "D(1,29.333,12.2954,29.8991,12.2864,29.9058,12.7117,29.3398,12.7207)", + "content": "/BC", + "source": "D(1,30.8831,10.7029,31.9131,10.625,31.9253,11.1455,30.9,11.2492)", "span": { - "offset": 2015, - "length": 2 + "offset": 1645, + "length": 3 } }, { - "content": "0.30-23", - "source": "D(1,30.8169,12.182,32.6114,12.1417,32.6216,12.5943,30.827,12.6211)", + "content": "1/20/23", + "source": "D(1,32.2332,10.8681,34.0027,10.8808,33.9977,11.4035,32.2282,11.3866)", "span": { - "offset": 2027, + "offset": 1668, "length": 7 } }, - { - "content": "3", - "source": "D(1,1.715,13.3229,1.8951,13.3221,1.8962,13.5725,1.7161,13.5732)", - "span": { - "offset": 2055, - "length": 1 - } - }, { "content": "1", - "source": "D(1,2.8773,13.3717,3.0754,13.3709,3.0764,13.6249,2.8783,13.6257)", + "source": "D(1,0.1624,10.7761,0.3939,10.7739,0.3976,11.1503,0.166,11.1525)", "span": { - "offset": 2066, + "offset": 1696, "length": 1 } }, { - "content": "90.000", - "source": "D(1,4.6677,13.3386,6.0737,13.3242,6.0765,13.581,4.6705,13.5963)", + "content": "473.000ML", + "source": "D(1,2.0419,10.8341,4.4466,10.8775,4.4448,11.2042,2.036,11.1608)", "span": { - "offset": 2077, - "length": 6 + "offset": 1707, + "length": 9 } }, { - "content": "CONCERTA ER 27 MG TABLET TAB E", - "source": "D(1,7.3679,13.2934,14.7048,13.1714,14.7091,13.4281,7.3722,13.5502)", + "content": "LORTAB 10 MG-300 MGY15 ML ELXR", + "source": "D(1,5.0631,10.9028,13.631,11.0646,13.624,11.4056,5.0561,11.2305)", "span": { - "offset": 2093, + "offset": 1726, "length": 30 } }, { - "content": "50458-0588-01", - "source": "D(1,20.5865,13.0393,23.7262,12.9825,23.7311,13.2521,20.5914,13.3088)", + "content": "17478-0450-16", + "source": "D(1,20.905,11.2674,24.6552,11.3731,24.6452,11.7191,20.8956,11.6108)", "span": { - "offset": 2173, + "offset": 1806, "length": 13 } }, { - "content": "90", - "source": "D(1,29.3425,12.8178,30.069,12.8069,30.0755,13.2373,29.349,13.2482)", + "content": "11", + "source": "D(1,30.7963,11.4312,31.7114,11.4091,31.7169,11.9855,30.7992,12.0076)", "span": { - "offset": 2276, + "offset": 1909, "length": 2 } }, { - "content": "0-30-23", - "source": "D(1,30.8359,12.8189,32.7463,12.759,32.7601,13.1967,30.8496,13.2363)", + "content": "11/29/23", + "source": "D(1,32.1818,11.5488,33.9923,11.5739,33.9897,12.0902,32.1747,12.0652)", "span": { - "offset": 2288, - "length": 7 + "offset": 1931, + "length": 8 } }, { - "content": "4", - "source": "D(1,1.7235,13.9254,1.9155,13.9247,1.9164,14.1728,1.7244,14.1735)", + "content": "1", + "source": "D(1,0.1974,11.5239,0.4307,11.522,0.4331,11.8281,0.1999,11.83)", "span": { - "offset": 2316, + "offset": 1960, "length": 1 } }, { - "content": "1", - "source": "D(1,2.8882,13.9747,3.0803,13.974,3.0812,14.2476,2.889,14.2482)", + "content": "2.000", + "source": "D(1,2.0458,11.5521,3.3697,11.5742,3.3648,11.8924,2.0405,11.8716)", "span": { - "offset": 2327, - "length": 1 + "offset": 1971, + "length": 5 } }, { - "content": "40.000", - "source": "D(1,4.6636,13.9401,6.0795,13.9295,6.0814,14.1902,4.6655,14.2008)", + "content": "OXYCODONE-ACETAM 10-325 TAB TA", + "source": "D(1,5.053,11.6146,13.6119,11.8063,13.6035,12.1528,5.0446,11.9438)", "span": { - "offset": 2338, - "length": 6 + "offset": 1986, + "length": 30 } }, { - "content": "MYDAYIS ER 25 MG CAPSULE CPTP", - "source": "D(1,7.3315,13.9035,14.4394,13.7812,14.4441,14.0389,7.3362,14.1654)", + "content": "42858-01-04 -02", + "source": "D(1,20.8723,12.0176,24.6262,12.1149,24.6173,12.4574,20.8634,12.3601)", "span": { - "offset": 2354, - "length": 29 + "offset": 2056, + "length": 44 } }, { - "content": "54092-0471-01", - "source": "D(1,20.5968,13.6589,23.7302,13.6,23.7351,13.8582,20.6017,13.917)", + "content": "1. BE", + "source": "D(1,30.7094,12.1004,31.5622,12.0171,31.5779,12.5603,30.7236,12.6435)", "span": { - "offset": 2433, - "length": 13 + "offset": 2170, + "length": 5 } }, { - "content": "40", - "source": "D(1,29.4637,13.4277,30.1585,13.4124,30.1641,13.7817,29.4718,13.797)", + "content": "14/20/20", + "source": "D(1,32.1903,12.2146,33.8881,12.2313,33.8876,12.745,32.1859,12.7283)", "span": { - "offset": 2536, - "length": 2 + "offset": 2197, + "length": 8 } }, { - "content": "0 30-23", - "source": "D(1,30.9141,13.3701,32.8326,13.3188,32.8443,13.7565,30.9259,13.8078)", + "content": "1.", + "source": "D(1,0.2494,12.2293,0.4818,12.2272,0.4847,12.5394,0.2523,12.5416)", "span": { - "offset": 2548, - "length": 7 + "offset": 2226, + "length": 2 } }, { - "content": "5", - "source": "D(1,1.7481,14.5053,1.919,14.5049,1.9196,14.7581,1.7488,14.7585)", + "content": "10.000", + "source": "D(1,2.1019,12.2743,3.6902,12.2993,3.6843,12.619,2.0961,12.5901)", "span": { - "offset": 2576, - "length": 1 + "offset": 2238, + "length": 6 } }, { - "content": "6", - "source": "D(1,1.7419,15.118,1.934,15.1176,1.9344,15.3595,1.7423,15.3598)", + "content": "DEXTROAMP-AMPHET ER 30 MG CAP", + "source": "D(1,5.053,12.3437,13.2595,12.5556,13.249,12.8993,5.0425,12.659)", "span": { - "offset": 2778, - "length": 1 + "offset": 2254, + "length": 29 } }, { - "content": "7", - "source": "D(1,1.7655,15.6882,1.9399,15.688,1.9402,15.9414,1.7657,15.9415)", + "content": "43975-0282-20", + "source": "D(1,20.8424,12.7778,24.6044,12.8735,24.5962,13.1898,20.8343,13.0933)", "span": { - "offset": 2980, - "length": 1 + "offset": 2333, + "length": 13 } }, { - "content": "8", - "source": "D(1,1.774,16.2791,1.9605,16.2785,1.9614,16.5342,1.7749,16.5348)", + "content": "199", + "source": "D(1,30.6052,12.7196,31.5034,12.6854,31.5084,13.2631,30.6197,13.2973)", "span": { - "offset": 3182, - "length": 1 + "offset": 2436, + "length": 3 } }, { - "content": "9", - "source": "D(1,1.7962,16.867,1.9755,16.8664,1.9763,17.1207,1.7969,17.1213)", + "content": "11/20/23", + "source": "D(1,32.0905,12.8726,33.885,12.8584,33.8893,13.3952,32.0947,13.4094)", "span": { - "offset": 3384, - "length": 1 + "offset": 2459, + "length": 8 } }, { - "content": "10", - "source": "D(1,1.7597,17.4485,2.0982,17.4446,2.1011,17.698,1.7626,17.7019)", + "content": "1", + "source": "D(1,0.2826,12.9091,0.5246,12.9072,0.5271,13.2295,0.2851,13.2313)", "span": { - "offset": 3586, - "length": 2 + "offset": 2488, + "length": 1 } }, { - "content": "11", - "source": "D(1,1.7819,18.0226,2.0971,18.0176,2.1015,18.2837,1.7862,18.2888)", + "content": "1 .000", + "source": "D(1,2.1497,12.9706,3.4201,12.9901,3.4151,13.316,2.1447,13.2984)", "span": { - "offset": 3789, - "length": 2 + "offset": 2499, + "length": 6 } }, { - "content": "12", - "source": "D(1,1.8036,18.6155,2.1423,18.6097,2.1445,18.8733,1.8081,18.8791)", + "content": "DEXTROAMP-AMPHETAMIN 20 MG TAB", + "source": "D(1,5.0579,13.0602,13.583,13.3166,13.579,13.6458,5.0477,13.3983)", "span": { - "offset": 3992, - "length": 2 + "offset": 2515, + "length": 30 } }, { - "content": "13", - "source": "D(1,1.8029,19.2189,2.1389,19.2111,2.1445,19.4677,1.8088,19.4754)", + "content": "64850-0505-01", + "source": "D(1,20.7946,13.5266,24.5503,13.6138,24.5426,13.9435,20.7914,13.8563)", "span": { - "offset": 4195, - "length": 2 + "offset": 2595, + "length": 13 } }, { - "content": "14", - "source": "D(1,1.8105,19.8004,2.1465,19.794,2.1514,20.0513,1.8154,20.0577)", + "content": "201", + "source": "D(1,31.6127,13.9819,30.6158,14.0524,30.6052,13.446,31.5971,13.4028)", "span": { - "offset": 4398, - "length": 2 + "offset": 2698, + "length": 3 } }, { - "content": "15", - "source": "D(1,1.8105,20.3988,2.1481,20.3936,2.1519,20.6432,1.8126,20.6484)", + "content": "11/20/23", + "source": "D(1,32.0781,13.4989,33.8305,13.5139,33.8262,14.0104,32.0739,13.9978)", "span": { - "offset": 4601, - "length": 2 + "offset": 2723, + "length": 8 } }, { - "content": "16", - "source": "D(1,1.8135,20.9862,2.1511,20.9804,2.1556,21.2417,1.818,21.2475)", + "content": "1", + "source": "D(1,0.2852,13.6091,0.5172,13.6078,0.5191,13.9529,0.2871,13.9542)", "span": { - "offset": 4804, - "length": 2 + "offset": 2752, + "length": 1 } }, { - "content": "17", - "source": "D(1,1.8174,21.5762,2.1495,21.5688,2.1554,21.8369,1.8233,21.8442)", + "content": "10. 0001m", + "source": "D(1,2.1345,13.6883,4.1764,13.7269,4.17,14.0625,2.1282,14.0248)", "span": { - "offset": 5007, - "length": 2 + "offset": 2763, + "length": 9 } }, { - "content": "18", - "source": "D(1,1.8105,22.1855,2.1364,22.1795,2.141,22.4332,1.8116,22.4392)", + "content": "HYDROCODONE-ACETAMN 7.5-325/15", + "source": "D(1,5.0318,13.7702,13.5755,14.0684,13.5629,14.4271,5.0198,14.1299)", "span": { - "offset": 5210, - "length": 2 + "offset": 2782, + "length": 30 } }, { - "content": "19", - "source": "D(1,1.806,22.7638,2.1408,22.761,2.143,23.0282,1.8082,23.031)", + "content": "71930-0027-43", + "source": "D(1,20.7681,14.2938,24.5123,14.3476,24.5077,14.6665,20.7635,14.6126)", "span": { - "offset": 5413, - "length": 2 + "offset": 2852, + "length": 13 } }, { - "content": "20", - "source": "D(1,1.7859,23.3815,2.136,23.3741,2.1414,23.629,1.7913,23.6364)", + "content": "1BE", + "source": "D(1,30.6573,14.1338,31.4819,14.0799,31.4911,14.5547,30.6676,14.6178)", "span": { - "offset": 5616, - "length": 2 + "offset": 2965, + "length": 3 } }, { - "content": "4", - "source": "D(1,1.9591,24.5092,2.1365,24.5088,2.137,24.781,1.9596,24.7814)", + "content": "1/20/23", + "source": "D(1,31.9971,14.1596,33.7832,14.2,33.7702,14.7715,31.9948,14.731)", "span": { - "offset": 5819, - "length": 1 + "offset": 2990, + "length": 7 } }, { "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", - "source": "D(1,4.1267,24.2305,11.8064,24.1013,11.8114,24.398,4.1317,24.5271)", + "source": "D(1,0.7999,23.4549,9.8625,23.8622,9.8439,24.2603,0.7816,23.8372)", "span": { - "offset": 5842, + "offset": 5657, "length": 40 } } @@ -3696,675 +3448,610 @@ ], "paragraphs": [ { - "content": "DEA FORM-222", - "source": "D(1,1.2589,1.4763,3.8915,1.3748,3.9024,1.6576,1.2698,1.7591)", - "span": { - "offset": 10, - "length": 12 - } - }, - { - "role": "title", - "content": "U.S. OFFICIAL ORDER FORMS - SCHEDULES I & II DRUG ENFORCEMENT ADMINISTRATION", - "source": "D(1,12.2912,0.8412,21.174,0.6504,21.1888,1.3398,12.3061,1.5307)", + "content": "RX SOLUTIONS. ING HAND LAKES WAY 125 PRAIRIE, TX 75050-0000", + "source": "D(1,0.0388,0.2622,4.6546,0.2708,4.6515,1.9417,0.0357,1.9331)", "span": { - "offset": 36, - "length": 78 + "offset": 0, + "length": 59 } }, { - "content": "OMB APPROVAL No. 1117-0010", - "source": "D(1,27.5155,0.5089,32.3035,0.481,32.305,0.7472,27.517,0.7751)", + "content": "REGISTRATION #: KR0191902 REGISTERED AS: REVERSE DISTRIB SCHEDULES: 1,2,2N,3,3N,4,5, ORDER FORM NUMBER: 231554550", + "source": "D(1,9.5734,0.4212,16.5303,0.3084,16.5632,2.335,9.6064,2.4478)", "span": { - "offset": 116, - "length": 26 + "offset": 61, + "length": 113 } }, { - "content": "PURCHASER INFORMATION", - "source": "D(1,1.5409,3.6817,5.9527,3.5332,5.962,3.8081,1.5501,3.9566)", + "content": "DATE ISSUED. 10162023 ORDER FORM. 1 OF 3.", + "source": "D(1,9.5368,2.6994,14.0904,2.6056,14.1094,3.5265,9.5558,3.6203)", "span": { - "offset": 144, - "length": 21 + "offset": 176, + "length": 41 } }, { - "content": "INMAR RX SOLUTIONS, INC 3845 GRAND LAKES WAY SUITE 125 GRAND PRAIRIE, TX 75050-0000", - "source": "D(1,1.475,4.3277,6.5307,4.2828,6.5432,5.6965,1.4875,5.7414)", + "content": "PART 2: TO BE FILLED IN BY PURCHASER", + "source": "D(1,20.9369,1.0078,20.9632,0.6597,28.8527,1.253,28.8264,1.6011)", "span": { - "offset": 167, - "length": 83 + "offset": 219, + "length": 36 } }, { - "content": "REGISTRATION INFORMATION", - "source": "D(1,10.8015,3.4847,15.6909,3.3581,15.6976,3.6165,10.8082,3.7432)", + "content": ": CVS PHARMACY # 03896", + "source": "D(1,21.1946,1.0243,28.2672,1.5331,28.235,1.9494,21.1624,1.4021)", "span": { - "offset": 252, - "length": 24 + "offset": 257, + "length": 22 } }, { - "content": "REGISTRATION #, RR0191902", - "source": "D(1,10.8265,4.4051,15.5083,4.3014,15.5143,4.569,10.8324,4.6727)", + "content": "BUSINESS NAME", + "source": "D(1,20.9517,1.5632,23.8285,1.7372,23.81,2.0425,20.9332,1.8685)", "span": { - "offset": 278, - "length": 25 + "offset": 281, + "length": 13 } }, { - "content": "REGISTERED AS: REVERSE DISTRIB SCHEDULES: 1,2,2N,3,3N,4,5, ORDER FORM NUMBER. 231454769", - "source": "D(1,10.843,4.8815,16.6407,4.7461,16.6696,5.9849,10.8719,6.1202)", + "content": "9308 KENDALL DR.", + "source": "D(1,21.1254,1.9003,26.3149,2.2743,26.2905,2.6736,21.1041,2.3097)", "span": { - "offset": 305, - "length": 87 + "offset": 296, + "length": 16 } }, { - "content": "DATE ISSUED. 09262023 ORDER FORM 3 OF 3", - "source": "D(1,10.8991,6.3295,14.7069,6.2605,14.7202,6.9966,10.9124,7.0656)", + "content": "STREET ADDRESS CHARLOTTE, NC 28214", + "source": "D(1,20.9098,2.5058,27.4512,2.965,27.3986,3.7132,20.8572,3.254)", "span": { - "offset": 394, - "length": 39 + "offset": 314, + "length": 34 } }, { - "content": "SUPPLIER DEA NUMBER:#", - "source": "D(1,20.24,3.3678,23.9095,3.3472,23.9108,3.574,20.2413,3.5945)", + "content": "CITY, STATE, ZIP CODE", + "source": "D(1,20.9221,3.5421,24.8402,3.756,24.8214,4.0996,20.9033,3.8857)", "span": { - "offset": 435, + "offset": 350, "length": 21 } }, { - "content": "FA5718830", - "source": "D(1,26.1301,3.1061,32.1171,2.9997,32.1333,3.9123,26.1463,4.0187)", + "content": "AR8109046", + "source": "D(1,27.823,0.1563,34.1243,0.7268,34.0364,1.6951,27.7352,1.1245)", "span": { - "offset": 458, + "offset": 373, "length": 9 } }, { - "content": "PART 2: TO BE FILLED IN BY PURCHASER CVS PHARMACY # 16800", - "source": "D(1,20.2685,4.3982,27.1032,4.2054,27.1209,4.8316,20.2862,5.0244)", - "span": { - "offset": 469, - "length": 57 - } - }, - { - "content": "BUSINESS NAME", - "source": "D(1,20.2808,5.1541,22.6034,5.1466,22.6041,5.3707,20.2815,5.3782)", + "content": ": TO BE FILLED IN BY PURCHASER", + "source": "D(1,0.0461,4.6457,6.4861,4.5916,6.4892,4.9597,0.0492,5.0138)", "span": { - "offset": 528, - "length": 13 + "offset": 384, + "length": 30 } }, { - "content": "4601 MONTGOMERY HWY STE 300", - "source": "D(1,20.4785,5.4479,28.5551,5.1692,28.567,5.5164,20.4896,5.748)", + "content": "Gladys Irasema Ruga", + "source": "D(1,0.1995,5.6845,4.1294,5.5556,4.1428,5.9645,0.2129,6.0935)", "span": { - "offset": 543, - "length": 27 + "offset": 416, + "length": 19 } }, { - "content": "STREET ADDRESS", - "source": "D(1,20.3035,5.9935,22.8478,5.9653,22.8503,6.1899,20.306,6.2182)", + "content": "DEA.Clerk", + "source": "D(1,4.7361,5.4824,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", "span": { - "offset": 572, - "length": 14 + "offset": 437, + "length": 9 } }, { - "content": "DOTHAN, AL 36303", - "source": "D(1,20.4855,6.2226,24.9058,6.1081,24.9147,6.451,20.4944,6.5391)", + "content": "Nage and Title 8", + "source": "D(1,0.0662,6.0887,2.7374,6.0712,2.7465,7.4571,0.0753,7.4745)", "span": { - "offset": 588, + "offset": 448, "length": 16 } }, { - "content": "CITY, STATE, ZIP CODE", - "source": "D(1,20.3234,6.8092,23.5333,6.757,23.5374,7.0084,20.3275,7.0606)", - "span": { - "offset": 606, - "length": 21 - } - }, - { - "content": "PART 1: TO BE FILLED IN BY PURCHASER", - "source": "D(1,1.3237,8.0784,8.2815,8.0073,8.2844,8.2885,1.3266,8.3496)", - "span": { - "offset": 629, - "length": 36 - } - }, - { - "content": "DIANA RUIZ DEA CLERK", - "source": "D(1,4.1951,8.7527,8.613,8.7447,8.6135,9.0691,4.1957,9.0771)", - "span": { - "offset": 667, - "length": 20 - } - }, - { - "content": "Print or Type Name and Title", - "source": "D(1,1.3327,9.4476,5.1039,9.429,5.1052,9.6959,1.334,9.7146)", - "span": { - "offset": 689, - "length": 28 - } - }, - { - "content": "Manuel", - "source": "D(1,1.636,9.5312,5.2101,9.5286,5.2107,10.3801,1.6366,10.3827)", - "span": { - "offset": 719, - "length": 6 - } - }, - { - "content": "by power of attorney 10/23/2023", - "source": "D(1,5.543,9.6508,14.5778,9.4461,14.5854,9.7838,5.5506,9.9885)", + "content": "by power of attorney 11/06/2023", + "source": "D(1,3.1497,6.5171,13.7212,6.4755,13.7228,6.8925,3.1513,6.9341)", "span": { - "offset": 727, + "offset": 466, "length": 31 } }, { - "content": "Signature of Requesting Official (must be authorized to sign order form)", - "source": "D(1,1.3356,10.4047,10.5526,10.296,10.5559,10.5788,1.339,10.6875)", + "content": "RequestingiOfficial (must be atthonzed'to signiorder form)", + "source": "D(1,0.0824,7.3437,8.9196,7.3817,8.9181,7.746,0.0808,7.7081)", "span": { - "offset": 760, - "length": 72 + "offset": 499, + "length": 58 } }, { "content": "Date", - "source": "D(1,12.017,10.253,12.612,10.2539,12.6117,10.4718,12.0167,10.471)", + "source": "D(1,10.6475,7.3986,11.3557,7.4101,11.3511,7.688,10.643,7.6764)", "span": { - "offset": 834, + "offset": 559, "length": 4 } }, { "content": "PART 5: TO BE FILLED IN BY PURCHASER", - "source": "D(1,17.1738,7.6289,20.0039,7.5937,20.0742,10.8457,17.2617,10.8809)", + "source": "D(1,17.4553,5.1094,20.1082,5.1742,20.0653,6.9296,17.4124,6.8648)", "span": { - "offset": 870, + "offset": 565, "length": 36 } }, { - "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill", - "source": "D(1,20.0039,7.5937,32.6601,7.2246,32.6777,8.0859,20.0215,8.4727)", + "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to bf You kly ft: o .p.r (name in part 2) if order is endorsed foranother suppker to f.l: ALTERNATE DEA #", + "source": "D(1,20.9279,4.6697,33.9047,5.3074,33.8405,6.611,20.8637,5.9733)", "span": { - "offset": 916, - "length": 143 + "offset": 603, + "length": 149 } }, { - "content": "ALTERNATE DEA #", - "source": "D(1,20.0215,8.4727,32.6777,8.0859,32.6953,8.7539,20.0391,9.123)", + "content": "Signature- by first supplier", + "source": "D(1,20.8555,6.6065,25.4838,6.8622,25.4639,7.2205,20.8356,6.9649)", "span": { - "offset": 1080, - "length": 15 + "offset": 754, + "length": 28 } }, { - "content": "Signature- by first supplier Lingua. Drier 10-26-23\nOFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER\nDATE", - "source": "D(1,20.0391,9.123,32.6953,8.7539,32.748,10.4941,20.0742,10.8457)", + "content": "OFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER", + "source": "D(1,20.8272,8.1228,20.8381,7.8874,28.1779,8.2272,28.1669,8.4627)", "span": { - "offset": 1116, - "length": 109 + "offset": 784, + "length": 52 } }, { - "content": "ITEM", - "source": "D(1,1.0997,11.1436,2.3534,11.1317,2.3534,11.9981,1.1217,12.01)", + "content": "04'T", + "source": "D(1,29.9139,8.3492,30.5276,8.3662,30.5211,8.6014,29.9074,8.5844)", "span": { - "offset": 1265, + "offset": 838, "length": 4 } }, { - "content": "NO OF PACKAGES", - "source": "D(1,2.3534,11.1317,4.421,11.108,4.443,11.9625,2.3534,11.9981)", + "content": "NO. OF PACKAGES", + "source": "D(1,0.1411,8.3293,1.82,8.345,1.7966,9.3636,0.1411,9.348)", "span": { - "offset": 1279, - "length": 14 + "offset": 862, + "length": 15 } }, { - "content": "PACKAGE SIZE", - "source": "D(1,4.421,11.108,6.0487,11.0842,6.0707,11.9388,4.443,11.9625)", + "content": "PACKAGE\nSIZE", + "source": "D(1,1.82,8.345,3.732,8.3607,3.7087,9.395,1.7966,9.3636)", "span": { - "offset": 1303, + "offset": 887, "length": 12 } }, { - "content": "NAME OF ITEM", - "source": "D(1,6.0487,11.0842,17.2224,10.8943,17.2444,11.7608,6.0707,11.9388)", + "content": "1\nNAME OF ITEM", + "source": "D(1,3.732,8.3607,17.0698,8.5487,17.0465,9.6144,3.7087,9.395)", "span": { - "offset": 1325, - "length": 12 + "offset": 909, + "length": 14 } }, { "content": "NUMBER REC'D", - "source": "D(1,17.2224,10.8943,18.6961,10.8706,18.7181,11.737,17.2444,11.7608)", + "source": "D(1,17.0698,8.5487,18.7953,8.5801,18.7487,9.6614,17.0465,9.6144)", "span": { - "offset": 1347, + "offset": 933, "length": 12 } }, { "content": "DATE REC'D", - "source": "D(1,18.6961,10.8706,20.0598,10.8469,20.0818,11.7133,18.7181,11.737)", + "source": "D(1,18.7953,8.5801,20.4742,8.6271,20.4275,9.6927,18.7487,9.6614)", "span": { - "offset": 1369, + "offset": 955, "length": 10 } }, { "content": "PART", - "source": "D(1,20.0598,10.8469,20.8957,10.8231,20.9177,11.7014,20.0818,11.7133)", + "source": "D(1,20.4742,8.6271,21.4768,8.6428,21.4302,9.7241,20.4275,9.6927)", "span": { - "offset": 1389, + "offset": 975, "length": 4 } }, { - "content": "4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODE", - "source": "D(1,20.8957,10.8231,29.1,10.6451,29.122,11.5471,20.9177,11.7014)", + "content": "4:", + "source": "D(1,21.4768,8.6428,22.4095,8.6741,22.3629,9.7554,21.4302,9.7241)", "span": { - "offset": 1416, - "length": 49 + "offset": 989, + "length": 2 } }, { - "content": "NUMBER SHIPPED", - "source": "D(1,29.1,10.6451,30.6177,10.6214,30.6397,11.5115,29.122,11.5471)", + "content": "TO BE FILLED IN BY SUPPLIER NATIONALIDRUG CODE", + "source": "D(1,22.4095,8.6741,28.1924,8.8308,28.1224,9.8964,22.3629,9.7554)", "span": { - "offset": 1475, - "length": 14 + "offset": 1013, + "length": 46 } }, { - "content": "DATE SHIPPED", - "source": "D(1,30.6177,10.6214,32.7293,10.5739,32.7733,11.4759,30.6397,11.5115)", + "content": "NUMBER SHIPPED", + "source": "D(1,30.7107,8.9092,32.3196,8.9562,32.2263,10.0061,30.6407,9.9591)", "span": { - "offset": 1499, - "length": 12 + "offset": 1099, + "length": 14 } }, { - "content": "1", - "source": "D(1,1.1217,12.01,2.3534,11.9981,2.3754,12.6034,1.1437,12.6272)", + "content": "DATE SixPFAD", + "source": "D(1,32.3196,8.9562,34.3249,9.0189,34.255,10.0532,32.2263,10.0061)", "span": { - "offset": 1532, - "length": 1 + "offset": 1135, + "length": 12 } }, { "content": "1", - "source": "D(1,2.3534,11.9981,4.443,11.9625,4.443,12.5678,2.3754,12.6034)", + "source": "D(1,0.1411,9.348,1.7966,9.3636,1.7966,10.0845,0.1178,10.0688)", "span": { - "offset": 1543, + "offset": 1168, "length": 1 } }, { - "content": "20.000", - "source": "D(1,4.443,11.9625,6.0707,11.9388,6.0707,12.5322,4.443,12.5678)", + "content": "10 .. 000", + "source": "D(1,1.7966,9.3636,3.7087,9.395,3.7087,10.1158,1.7966,10.0845)", "span": { - "offset": 1554, - "length": 6 + "offset": 1179, + "length": 9 } }, { - "content": "METHADONE HCL 10 MG TABLET TAB", - "source": "D(1,6.0707,11.9388,17.2444,11.7608,17.2664,12.3423,6.0707,12.5322)", + "content": "DEXTROAMP-AMPHET' ER 10 MG CAP", + "source": "D(1,3.7087,9.395,17.0465,9.6144,16.9998,10.3352,3.7087,10.1158)", "span": { - "offset": 1570, + "offset": 1198, "length": 30 } }, { - "content": "00054-0710-25", - "source": "D(1,21.6875,11.6777,22.5233,11.6658,22.5233,12.2474,21.6875,12.2592)", + "content": "00406-8952-01", + "source": "D(1,21.4302,9.7241,22.3629,9.7554,22.3396,10.4449,21.3836,10.4293)", "span": { - "offset": 1650, + "offset": 1268, "length": 13 } }, { - "content": "20", - "source": "D(1,29.122,11.5471,30.6397,11.5115,30.6617,12.0931,29.144,12.1168)", + "content": "TRY", + "source": "D(1,30.6407,9.9591,32.2263,10.0061,32.1797,10.6643,30.6174,10.633)", "span": { - "offset": 1753, - "length": 2 + "offset": 1381, + "length": 3 } }, { - "content": "10-30-21", - "source": "D(1,30.6397,11.5115,32.7733,11.4759,32.7953,12.0575,30.6617,12.0931)", + "content": "11/20/23", + "source": "D(1,32.716,10.0061,34.255,10.0532,34.2083,10.6957,32.6694,10.68)", "span": { - "offset": 1765, + "offset": 1404, "length": 8 } }, - { - "content": "2", - "source": "D(1,1.1437,12.6272,2.3754,12.6034,2.3754,13.185,1.1437,13.1969)", - "span": { - "offset": 1794, - "length": 1 - } - }, { "content": "1", - "source": "D(1,2.3754,12.6034,4.443,12.5678,4.465,13.1494,2.3754,13.185)", + "source": "D(1,0.1178,10.0688,1.7966,10.0845,1.7966,10.7584,0.1178,10.7427)", "span": { - "offset": 1805, + "offset": 1433, "length": 1 } }, { - "content": "10.000", - "source": "D(1,4.443,12.5678,6.0707,12.5322,6.0927,13.1257,4.465,13.1494)", + "content": "3 .000", + "source": "D(1,1.7966,10.0845,3.7087,10.1158,3.6854,10.7897,1.7966,10.7584)", "span": { - "offset": 1816, + "offset": 1444, "length": 6 } }, { - "content": "DEXMETHYLPHENIDATE ER 25 MG CP", - "source": "D(1,6.0707,12.5322,17.2664,12.3423,17.2884,12.9476,6.0927,13.1257)", + "content": "OXYCODONE HCL. (IR)' 20 MG TAB T", + "source": "D(1,3.7087,10.1158,16.9998,10.3352,16.9765,11.0091,3.6854,10.7897)", "span": { - "offset": 1832, - "length": 30 + "offset": 1460, + "length": 32 } }, { - "content": "00115-1709-01", - "source": "D(1,21.6875,12.2592,22.5233,12.2474,22.5453,12.8527,21.7095,12.8645)", + "content": "10702-0057-01", + "source": "D(1,22.3396,10.4449,23.2956,10.4763,23.2723,11.1501,22.3163,11.1345)", "span": { - "offset": 1912, + "offset": 1542, "length": 13 } }, { - "content": "10", - "source": "D(1,29.144,12.1168,30.6617,12.0931,30.6837,12.6984,29.166,12.7221)", + "content": "/BC", + "source": "D(1,30.6174,10.633,32.1797,10.6643,32.1331,11.3382,30.5708,11.3068)", "span": { - "offset": 2015, - "length": 2 + "offset": 1645, + "length": 3 } }, { - "content": "0.30-23", - "source": "D(1,30.6617,12.0931,32.7953,12.0575,32.8173,12.6509,30.6837,12.6984)", + "content": "1/20/23", + "source": "D(1,32.6694,10.68,34.2083,10.6957,34.1617,11.3695,32.6461,11.3539)", "span": { - "offset": 2027, + "offset": 1668, "length": 7 } }, - { - "content": "3", - "source": "D(1,1.1437,13.1969,2.3754,13.185,2.3754,13.7784,1.1657,13.8022)", - "span": { - "offset": 2055, - "length": 1 - } - }, { "content": "1", - "source": "D(1,2.3754,13.185,4.465,13.1494,4.465,13.7428,2.3754,13.7784)", + "source": "D(1,0.1178,10.7427,1.7966,10.7584,1.7966,11.4479,0.0944,11.4322)", "span": { - "offset": 2066, + "offset": 1696, "length": 1 } }, { - "content": "90.000", - "source": "D(1,4.465,13.1494,6.0927,13.1257,6.0927,13.7072,4.465,13.7428)", + "content": "473.000ML", + "source": "D(1,1.7966,10.7584,3.6854,10.7897,3.6854,11.4792,1.7966,11.4479)", "span": { - "offset": 2077, - "length": 6 + "offset": 1707, + "length": 9 } }, { - "content": "CONCERTA ER 27 MG TABLET TAB E", - "source": "D(1,6.0927,13.1257,17.2884,12.9476,17.2884,13.5292,6.0927,13.7072)", + "content": "LORTAB 10 MG-300 MGY15 ML ELXR", + "source": "D(1,3.6854,10.7897,16.9765,11.0091,16.9532,11.73,3.6854,11.4792)", "span": { - "offset": 2093, + "offset": 1726, "length": 30 } }, { - "content": "50458-0588-01", - "source": "D(1,21.7095,12.8645,22.5453,12.8527,22.5453,13.4461,21.7095,13.458)", + "content": "17478-0450-16", + "source": "D(1,22.3163,11.1345,23.2723,11.1501,23.249,11.8397,22.293,11.824)", "span": { - "offset": 2173, + "offset": 1806, "length": 13 } }, { - "content": "90", - "source": "D(1,29.166,12.7221,30.6837,12.6984,30.7057,13.2918,29.188,13.3155)", + "content": "11", + "source": "D(1,30.5708,11.3068,32.1331,11.3382,32.0631,12.012,30.5241,11.9964)", "span": { - "offset": 2276, + "offset": 1909, "length": 2 } }, { - "content": "0-30-23", - "source": "D(1,30.6837,12.6984,32.8173,12.6509,32.8392,13.2443,30.7057,13.2918)", + "content": "11/29/23", + "source": "D(1,32.6461,11.3539,34.1617,11.3695,34.1151,12.0434,32.5994,12.0277)", "span": { - "offset": 2288, - "length": 7 + "offset": 1931, + "length": 8 } }, { - "content": "4", - "source": "D(1,1.1657,13.8022,2.3754,13.7784,2.3974,14.36,1.1877,14.3837)", + "content": "1", + "source": "D(1,0.0944,11.4322,1.7966,11.4479,1.7966,12.1374,0.0944,12.1061)", "span": { - "offset": 2316, + "offset": 1960, "length": 1 } }, { - "content": "1", - "source": "D(1,2.3754,13.7784,4.465,13.7428,4.487,14.3363,2.3974,14.36)", + "content": "2.000", + "source": "D(1,1.7966,11.4479,3.6854,11.4792,3.6621,12.1531,1.7966,12.1374)", "span": { - "offset": 2327, - "length": 1 + "offset": 1971, + "length": 5 } }, { - "content": "40.000", - "source": "D(1,4.465,13.7428,6.0927,13.7072,6.0927,14.3006,4.487,14.3363)", + "content": "OXYCODONE-ACETAM 10-325 TAB TA", + "source": "D(1,3.6854,11.4792,16.9532,11.73,16.9299,12.3882,3.6621,12.1531)", "span": { - "offset": 2338, - "length": 6 + "offset": 1986, + "length": 30 } }, { - "content": "MYDAYIS ER 25 MG CAPSULE CPTP", - "source": "D(1,6.0927,13.7072,17.2884,13.5292,17.3104,14.1107,6.0927,14.3006)", + "content": "42858-01-04", + "source": "D(1,21.3369,11.8083,22.293,11.824,22.2696,12.4978,21.3136,12.4665)", "span": { - "offset": 2354, - "length": 29 + "offset": 2056, + "length": 11 } }, { - "content": "54092-0471-01", - "source": "D(1,21.7095,13.458,22.5453,13.4461,22.5673,14.0277,21.7315,14.0395)", + "content": "-02", + "source": "D(1,24.1584,11.8553,25.2543,11.8867,25.2077,12.5449,24.1351,12.5292)", "span": { - "offset": 2433, - "length": 13 + "offset": 2097, + "length": 3 } }, { - "content": "40", - "source": "D(1,29.188,13.3155,30.7057,13.2918,30.7277,13.8852,29.21,13.909)", + "content": "1. BE", + "source": "D(1,30.5241,11.9964,32.0631,12.012,32.0165,12.6702,30.4775,12.6389)", "span": { - "offset": 2536, - "length": 2 + "offset": 2170, + "length": 5 } }, { - "content": "0 30-23", - "source": "D(1,30.7057,13.2918,32.8392,13.2443,32.8612,13.8496,30.7277,13.8852)", + "content": "14/20/20", + "source": "D(1,32.0631,12.012,34.1151,12.0434,34.0684,12.7016,32.0165,12.6702)", "span": { - "offset": 2548, - "length": 7 + "offset": 2197, + "length": 8 } }, { - "content": "5", - "source": "D(1,1.1877,14.3837,2.3974,14.36,2.3974,14.9653,1.1877,14.9772)", + "content": "1.", + "source": "D(1,0.0944,12.1061,1.7966,12.1374,1.7733,12.8113,0.0711,12.7799)", "span": { - "offset": 2576, - "length": 1 + "offset": 2226, + "length": 2 } }, { - "content": "6", - "source": "D(1,1.1877,14.9772,2.3974,14.9653,2.4194,15.5469,1.2097,15.5706)", + "content": "10.000", + "source": "D(1,1.7966,12.1374,3.6621,12.1531,3.6387,12.8426,1.7733,12.8113)", "span": { - "offset": 2778, - "length": 1 + "offset": 2238, + "length": 6 } }, { - "content": "7", - "source": "D(1,1.2097,15.5706,2.4194,15.5469,2.4194,16.1403,1.2097,16.164)", + "content": "DEXTROAMP-AMPHET ER 30 MG CAP", + "source": "D(1,3.6621,12.1531,16.9299,12.3882,16.8832,13.062,3.6387,12.8426)", "span": { - "offset": 2980, - "length": 1 + "offset": 2254, + "length": 29 } }, { - "content": "8", - "source": "D(1,1.2097,16.164,2.4194,16.1403,2.4194,16.7218,1.2317,16.7456)", + "content": "43975-0282-20", + "source": "D(1,22.2696,12.4978,23.2257,12.5135,23.2024,13.1874,22.223,13.156)", "span": { - "offset": 3182, - "length": 1 + "offset": 2333, + "length": 13 } }, { - "content": "9", - "source": "D(1,1.2317,16.7456,2.4194,16.7218,2.4414,17.3034,1.2537,17.3153)", + "content": "199", + "source": "D(1,30.4775,12.6389,32.0165,12.6702,31.9698,13.3284,30.4542,13.2971)", "span": { - "offset": 3384, - "length": 1 + "offset": 2436, + "length": 3 } }, { - "content": "10", - "source": "D(1,1.2537,17.3153,2.4414,17.3034,2.4414,17.8731,1.2537,17.8968)", + "content": "11/20/23", + "source": "D(1,32.5528,12.6702,34.0684,12.7016,33.9985,13.3441,32.5061,13.3284)", "span": { - "offset": 3586, - "length": 2 + "offset": 2459, + "length": 8 } }, { - "content": "11", - "source": "D(1,1.2537,17.8968,2.4414,17.8731,2.4414,18.4784,1.2756,18.4903)", + "content": "1", + "source": "D(1,0.0711,12.7799,1.7733,12.8113,1.7733,13.4851,0.0711,13.4695)", "span": { - "offset": 3789, - "length": 2 + "offset": 2488, + "length": 1 } }, { - "content": "12", - "source": "D(1,1.2756,18.4903,2.4414,18.4784,2.4634,19.0481,1.2756,19.0718)", + "content": "1 .000", + "source": "D(1,1.7733,12.8113,3.6387,12.8426,3.6387,13.5165,1.7733,13.4851)", "span": { - "offset": 3992, - "length": 2 + "offset": 2499, + "length": 6 } }, { - "content": "13", - "source": "D(1,1.2756,19.0718,2.4634,19.0481,2.4634,19.6534,1.2976,19.6771)", + "content": "DEXTROAMP-AMPHETAMIN 20 MG TAB", + "source": "D(1,3.6387,12.8426,16.8832,13.062,16.8599,13.7202,3.6387,13.5165)", "span": { - "offset": 4195, - "length": 2 + "offset": 2515, + "length": 30 } }, { - "content": "14", - "source": "D(1,1.2976,19.6771,2.4634,19.6534,2.4634,20.2468,1.2976,20.2706)", + "content": "64850-0505-01", + "source": "D(1,22.223,13.156,23.2024,13.1874,23.179,13.8456,22.1997,13.8299)", "span": { - "offset": 4398, - "length": 2 + "offset": 2595, + "length": 13 } }, { - "content": "15", - "source": "D(1,1.2976,20.2706,2.4634,20.2468,2.4854,20.8521,1.3196,20.8759)", + "content": "201", + "source": "D(1,30.4542,13.2971,31.9698,13.3284,31.9232,13.9709,30.4076,13.9553)", "span": { - "offset": 4601, - "length": 2 + "offset": 2698, + "length": 3 } }, { - "content": "16", - "source": "D(1,1.3196,20.8759,2.4854,20.8521,2.4854,21.4456,1.3416,21.4693)", + "content": "11/20/23", + "source": "D(1,31.9698,13.3284,33.9985,13.3441,33.9519,14.0023,31.9232,13.9709)", "span": { - "offset": 4804, - "length": 2 + "offset": 2723, + "length": 8 + } + }, + { + "content": "1", + "source": "D(1,0.0711,13.4695,1.7733,13.4851,1.7733,14.253,0.0478,14.206)", + "span": { + "offset": 2752, + "length": 1 } }, { - "content": "17", - "source": "D(1,1.3416,21.4693,2.4854,21.4456,2.4854,22.039,1.3416,22.0627)", + "content": "10. 0001m", + "source": "D(1,1.7733,13.4851,3.6387,13.5165,3.6154,14.3,1.7733,14.253)", "span": { - "offset": 5007, - "length": 2 + "offset": 2763, + "length": 9 } }, { - "content": "18", - "source": "D(1,1.3416,22.0627,2.4854,22.039,2.5074,22.6324,1.3636,22.6562)", + "content": "HYDROCODONE-ACETAMN 7.5-325/15", + "source": "D(1,3.6387,13.5165,16.8599,13.7202,16.8366,14.4567,3.6154,14.3)", "span": { - "offset": 5210, - "length": 2 + "offset": 2782, + "length": 30 } }, { - "content": "19", - "source": "D(1,1.3636,22.6562,2.5074,22.6324,2.5074,23.2259,1.3636,23.2496)", + "content": "71930-0027-43", + "source": "D(1,21.2437,13.8142,22.1997,13.8299,22.1764,14.5194,21.2203,14.5194)", "span": { - "offset": 5413, - "length": 2 + "offset": 2852, + "length": 13 } }, { - "content": "20", - "source": "D(1,1.3636,23.2496,2.5074,23.2259,2.5074,23.8312,1.3856,23.843)", + "content": "1BE", + "source": "D(1,30.4076,13.9553,31.9232,13.9709,31.8766,14.5821,30.3609,14.5821)", "span": { - "offset": 5616, - "length": 2 + "offset": 2965, + "length": 3 } }, { - "content": "4", - "source": "D(1,1.3856,23.843,2.5074,23.8312,2.5294,24.7332,1.4076,24.7451)", + "content": "1/20/23", + "source": "D(1,31.9232,13.9709,33.9519,14.0023,33.9285,14.5664,31.8766,14.5821)", "span": { - "offset": 5819, - "length": 1 + "offset": 2990, + "length": 7 } }, { "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", - "source": "D(1,2.5074,23.8312,17.5523,23.6175,17.5743,24.5077,2.5294,24.7332)", + "source": "D(1,0,23.2169,16.4635,23.4676,16.4169,24.5019,0,24.2512)", "span": { - "offset": 5842, + "offset": 5657, "length": 40 } } @@ -4373,28 +4060,10 @@ { "span": { "offset": 0, - "length": 5955 - }, - "elements": [ - "/sections/1", - "/sections/2" - ] - }, - { - "span": { - "offset": 0, - "length": 33 - }, - "elements": [ - "/figures/0" - ] - }, - { - "span": { - "offset": 36, - "length": 5919 + "length": 5871 }, "elements": [ + "/paragraphs/0", "/paragraphs/1", "/paragraphs/2", "/paragraphs/3", @@ -4416,519 +4085,477 @@ "/paragraphs/19", "/paragraphs/20", "/paragraphs/21", - "/paragraphs/22", - "/paragraphs/23", - "/tables/0", - "/tables/1" + "/tables/0" ] } ], "tables": [ { - "rowCount": 3, - "columnCount": 2, + "rowCount": 22, + "columnCount": 19, "cells": [ { - "kind": "content", + "kind": "columnHeader", "rowIndex": 0, "columnIndex": 0, - "rowSpan": 3, + "rowSpan": 1, "columnSpan": 1, - "content": "PART 5: TO BE FILLED IN BY PURCHASER", - "source": "D(1,17.1738,7.6289,20.0039,7.5937,20.0742,10.8457,17.2617,10.8809)", + "content": "NO. OF PACKAGES", + "source": "D(1,0.1411,8.3293,1.82,8.345,1.7966,9.3636,0.1411,9.348)", "span": { - "offset": 870, - "length": 36 + "offset": 862, + "length": 15 }, "elements": [ - "/paragraphs/24" + "/paragraphs/22" ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 0, "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "PART 3: ALTERNATE SUPPLIER IDENTIFICATION - to be filled in by first supplier (name in part 2) if order is endorsed to another supplier to fill", - "source": "D(1,20.0039,7.5937,32.6601,7.2246,32.6777,8.0859,20.0215,8.4727)", + "content": "PACKAGE\nSIZE", + "source": "D(1,1.82,8.345,3.732,8.3607,3.7087,9.395,1.7966,9.3636)", "span": { - "offset": 916, - "length": 143 + "offset": 887, + "length": 12 }, "elements": [ - "/paragraphs/25" + "/paragraphs/23" ] }, { - "kind": "content", - "rowIndex": 1, - "columnIndex": 1, + "kind": "columnHeader", + "rowIndex": 0, + "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "ALTERNATE DEA #", - "source": "D(1,20.0215,8.4727,32.6777,8.0859,32.6953,8.7539,20.0391,9.123)", + "content": "1\nNAME OF ITEM", + "source": "D(1,3.732,8.3607,17.0698,8.5487,17.0465,9.6144,3.7087,9.395)", "span": { - "offset": 1080, - "length": 15 + "offset": 909, + "length": 14 }, "elements": [ - "/paragraphs/26" + "/paragraphs/24" ] }, - { - "kind": "content", - "rowIndex": 2, - "columnIndex": 1, - "rowSpan": 1, - "columnSpan": 1, - "content": "Signature- by first supplier Lingua. Drier 10-26-23\nOFFICIAL AUTHORIZED TO EXECUTE ON BEHALF OF SUPPLIER\nDATE", - "source": "D(1,20.0391,9.123,32.6953,8.7539,32.748,10.4941,20.0742,10.8457)", - "span": { - "offset": 1116, - "length": 109 - }, - "elements": [ - "/paragraphs/27" - ] - } - ], - "source": "D(1,17.1222,7.7084,32.5673,7.6671,32.628,10.8546,17.1742,10.8955)", - "span": { - "offset": 841, - "length": 404 - } - }, - { - "rowCount": 22, - "columnCount": 19, - "cells": [ { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 0, + "columnIndex": 3, "rowSpan": 1, "columnSpan": 1, - "content": "ITEM", - "source": "D(1,1.0997,11.1436,2.3534,11.1317,2.3534,11.9981,1.1217,12.01)", + "content": "NUMBER REC'D", + "source": "D(1,17.0698,8.5487,18.7953,8.5801,18.7487,9.6614,17.0465,9.6144)", "span": { - "offset": 1265, - "length": 4 + "offset": 933, + "length": 12 }, "elements": [ - "/paragraphs/28" + "/paragraphs/25" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 1, + "columnIndex": 4, "rowSpan": 1, "columnSpan": 1, - "content": "NO OF PACKAGES", - "source": "D(1,2.3534,11.1317,4.421,11.108,4.443,11.9625,2.3534,11.9981)", + "content": "DATE REC'D", + "source": "D(1,18.7953,8.5801,20.4742,8.6271,20.4275,9.6927,18.7487,9.6614)", "span": { - "offset": 1279, - "length": 14 + "offset": 955, + "length": 10 }, "elements": [ - "/paragraphs/29" + "/paragraphs/26" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 2, + "columnIndex": 5, "rowSpan": 1, "columnSpan": 1, - "content": "PACKAGE SIZE", - "source": "D(1,4.421,11.108,6.0487,11.0842,6.0707,11.9388,4.443,11.9625)", + "content": "PART", + "source": "D(1,20.4742,8.6271,21.4768,8.6428,21.4302,9.7241,20.4275,9.6927)", "span": { - "offset": 1303, - "length": 12 + "offset": 975, + "length": 4 }, "elements": [ - "/paragraphs/30" + "/paragraphs/27" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 3, + "columnIndex": 6, "rowSpan": 1, "columnSpan": 1, - "content": "NAME OF ITEM", - "source": "D(1,6.0487,11.0842,17.2224,10.8943,17.2444,11.7608,6.0707,11.9388)", + "content": "4:", + "source": "D(1,21.4768,8.6428,22.4095,8.6741,22.3629,9.7554,21.4302,9.7241)", "span": { - "offset": 1325, - "length": 12 + "offset": 989, + "length": 2 }, "elements": [ - "/paragraphs/31" + "/paragraphs/28" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 4, + "columnIndex": 7, "rowSpan": 1, - "columnSpan": 1, - "content": "NUMBER REC'D", - "source": "D(1,17.2224,10.8943,18.6961,10.8706,18.7181,11.737,17.2444,11.7608)", + "columnSpan": 6, + "content": "TO BE FILLED IN BY SUPPLIER NATIONALIDRUG CODE", + "source": "D(1,22.4095,8.6741,28.1924,8.8308,28.1224,9.8964,22.3629,9.7554)", "span": { - "offset": 1347, - "length": 12 + "offset": 1013, + "length": 46 }, "elements": [ - "/paragraphs/32" + "/paragraphs/29" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 5, + "columnIndex": 13, "rowSpan": 1, "columnSpan": 1, - "content": "DATE REC'D", - "source": "D(1,18.6961,10.8706,20.0598,10.8469,20.0818,11.7133,18.7181,11.737)", + "content": "", + "source": "D(1,28.1924,8.8308,29.0085,8.8465,28.9385,9.9121,28.1224,9.8964)", "span": { - "offset": 1369, - "length": 10 - }, - "elements": [ - "/paragraphs/33" - ] + "offset": 1069, + "length": 0 + } }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 6, + "columnIndex": 14, "rowSpan": 1, "columnSpan": 1, - "content": "PART", - "source": "D(1,20.0598,10.8469,20.8957,10.8231,20.9177,11.7014,20.0818,11.7133)", + "content": "", + "source": "D(1,29.0085,8.8465,29.8712,8.8778,29.8013,9.9278,28.9385,9.9121)", "span": { - "offset": 1389, - "length": 4 - }, - "elements": [ - "/paragraphs/34" - ] + "offset": 1079, + "length": 0 + } }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 7, + "columnIndex": 15, "rowSpan": 1, - "columnSpan": 10, - "content": "4: TO BE FILLED IN BY SUPPLIER NATIONAL DRUG CODE", - "source": "D(1,20.8957,10.8231,29.1,10.6451,29.122,11.5471,20.9177,11.7014)", + "columnSpan": 1, + "content": "", + "source": "D(1,29.8712,8.8778,30.7107,8.9092,30.6407,9.9591,29.8013,9.9278)", "span": { - "offset": 1416, - "length": 49 - }, - "elements": [ - "/paragraphs/35" - ] + "offset": 1089, + "length": 0 + } }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 17, + "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, "content": "NUMBER SHIPPED", - "source": "D(1,29.1,10.6451,30.6177,10.6214,30.6397,11.5115,29.122,11.5471)", + "source": "D(1,30.7107,8.9092,32.3196,8.9562,32.2263,10.0061,30.6407,9.9591)", "span": { - "offset": 1475, + "offset": 1099, "length": 14 }, "elements": [ - "/paragraphs/36" + "/paragraphs/30" ] }, { "kind": "columnHeader", "rowIndex": 0, - "columnIndex": 18, + "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, - "content": "DATE SHIPPED", - "source": "D(1,30.6177,10.6214,32.7293,10.5739,32.7733,11.4759,30.6397,11.5115)", + "columnSpan": 2, + "content": "DATE SixPFAD", + "source": "D(1,32.3196,8.9562,34.3249,9.0189,34.255,10.0532,32.2263,10.0061)", "span": { - "offset": 1499, + "offset": 1135, "length": 12 }, "elements": [ - "/paragraphs/37" + "/paragraphs/31" ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "1", - "source": "D(1,1.1217,12.01,2.3534,11.9981,2.3754,12.6034,1.1437,12.6272)", + "source": "D(1,0.1411,9.348,1.7966,9.3636,1.7966,10.0845,0.1178,10.0688)", "span": { - "offset": 1532, + "offset": 1168, "length": 1 }, "elements": [ - "/paragraphs/38" + "/paragraphs/32" ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "1", - "source": "D(1,2.3534,11.9981,4.443,11.9625,4.443,12.5678,2.3754,12.6034)", + "content": "10 .. 000", + "source": "D(1,1.7966,9.3636,3.7087,9.395,3.7087,10.1158,1.7966,10.0845)", "span": { - "offset": 1543, - "length": 1 + "offset": 1179, + "length": 9 }, "elements": [ - "/paragraphs/39" + "/paragraphs/33" ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "20.000", - "source": "D(1,4.443,11.9625,6.0707,11.9388,6.0707,12.5322,4.443,12.5678)", + "content": "DEXTROAMP-AMPHET' ER 10 MG CAP", + "source": "D(1,3.7087,9.395,17.0465,9.6144,16.9998,10.3352,3.7087,10.1158)", "span": { - "offset": 1554, - "length": 6 + "offset": 1198, + "length": 30 }, "elements": [ - "/paragraphs/40" + "/paragraphs/34" ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 3, "rowSpan": 1, "columnSpan": 1, - "content": "METHADONE HCL 10 MG TABLET TAB", - "source": "D(1,6.0707,11.9388,17.2444,11.7608,17.2664,12.3423,6.0707,12.5322)", + "content": "", + "source": "D(1,17.0465,9.6144,18.7487,9.6614,18.7253,10.3666,16.9998,10.3352)", "span": { - "offset": 1570, - "length": 30 - }, - "elements": [ - "/paragraphs/41" - ] + "offset": 1238, + "length": 0 + } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 4, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.2444,11.7608,18.7181,11.737,18.7181,12.3186,17.2664,12.3423)", + "source": "D(1,18.7487,9.6614,20.4275,9.6927,20.3809,10.3979,18.7253,10.3666)", "span": { - "offset": 1610, + "offset": 1248, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 5, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7181,11.737,20.0818,11.7133,20.1038,12.283,18.7181,12.3186)", + "source": "D(1,20.4275,9.6927,21.4302,9.7241,21.3836,10.4293,20.3809,10.3979)", "span": { - "offset": 1620, + "offset": 1258, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 6, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.0818,11.7133,20.9177,11.7014,20.9397,12.2711,20.1038,12.283)", + "content": "00406-8952-01", + "source": "D(1,21.4302,9.7241,22.3629,9.7554,22.3396,10.4449,21.3836,10.4293)", "span": { - "offset": 1630, - "length": 0 - } + "offset": 1268, + "length": 13 + }, + "elements": [ + "/paragraphs/35" + ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 7, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.9177,11.7014,21.6875,11.6777,21.6875,12.2592,20.9397,12.2711)", + "source": "D(1,22.3629,9.7554,23.319,9.7711,23.2956,10.4763,22.3396,10.4449)", "span": { - "offset": 1640, + "offset": 1291, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 8, "rowSpan": 1, "columnSpan": 1, - "content": "00054-0710-25", - "source": "D(1,21.6875,11.6777,22.5233,11.6658,22.5233,12.2474,21.6875,12.2592)", + "content": "", + "source": "D(1,23.319,9.7711,24.2517,9.8024,24.2283,10.4919,23.2956,10.4763)", "span": { - "offset": 1650, - "length": 13 - }, - "elements": [ - "/paragraphs/42" - ] + "offset": 1301, + "length": 0 + } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 9, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5233,11.6658,23.2932,11.6539,23.2932,12.2236,22.5233,12.2474)", + "source": "D(1,24.2517,9.8024,25.3709,9.8338,25.3243,10.5233,24.2283,10.4919)", "span": { - "offset": 1673, + "offset": 1311, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 10, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.2932,11.6539,24.107,11.6421,24.129,12.2118,23.2932,12.2236)", + "source": "D(1,25.3709,9.8338,26.2803,9.8494,26.257,10.539,25.3243,10.5233)", "span": { - "offset": 1683, + "offset": 1321, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 11, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.107,11.6421,24.9648,11.6183,24.9648,12.1999,24.129,12.2118)", + "source": "D(1,26.2803,9.8494,27.1897,9.8651,27.1664,10.5546,26.257,10.539)", "span": { - "offset": 1693, + "offset": 1331, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 12, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.9648,11.6183,25.7347,11.6065,25.7567,12.188,24.9648,12.1999)", + "source": "D(1,27.1897,9.8651,28.1224,9.8964,28.0758,10.586,27.1664,10.5546)", "span": { - "offset": 1703, + "offset": 1341, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 13, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.7347,11.6065,26.6365,11.5946,26.6585,12.1643,25.7567,12.188)", + "source": "D(1,28.1224,9.8964,28.9385,9.9121,28.8919,10.6016,28.0758,10.586)", "span": { - "offset": 1713, + "offset": 1351, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 14, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.6365,11.5946,27.4063,11.5709,27.4284,12.1524,26.6585,12.1643)", + "source": "D(1,28.9385,9.9121,29.8013,9.9278,29.7546,10.6173,28.8919,10.6016)", "span": { - "offset": 1723, + "offset": 1361, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 15, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.4063,11.5709,28.2862,11.559,28.3082,12.1406,27.4284,12.1524)", + "source": "D(1,29.8013,9.9278,30.6407,9.9591,30.6174,10.633,29.7546,10.6173)", "span": { - "offset": 1733, + "offset": 1371, "length": 0 } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.2862,11.559,29.122,11.5471,29.144,12.1168,28.3082,12.1406)", + "content": "TRY", + "source": "D(1,30.6407,9.9591,32.2263,10.0061,32.1797,10.6643,30.6174,10.633)", "span": { - "offset": 1743, - "length": 0 - } + "offset": 1381, + "length": 3 + }, + "elements": [ + "/paragraphs/36" + ] }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 17, "rowSpan": 1, "columnSpan": 1, - "content": "20", - "source": "D(1,29.122,11.5471,30.6397,11.5115,30.6617,12.0931,29.144,12.1168)", + "content": "", + "source": "D(1,32.2263,10.0061,32.716,10.0061,32.6694,10.68,32.1797,10.6643)", "span": { - "offset": 1753, - "length": 2 - }, - "elements": [ - "/paragraphs/43" - ] + "offset": 1394, + "length": 0 + } }, { - "kind": "content", + "kind": "columnHeader", "rowIndex": 1, "columnIndex": 18, "rowSpan": 1, "columnSpan": 1, - "content": "10-30-21", - "source": "D(1,30.6397,11.5115,32.7733,11.4759,32.7953,12.0575,30.6617,12.0931)", + "content": "11/20/23", + "source": "D(1,32.716,10.0061,34.255,10.0532,34.2083,10.6957,32.6694,10.68)", "span": { - "offset": 1765, + "offset": 1404, "length": 8 }, "elements": [ - "/paragraphs/44" + "/paragraphs/37" ] }, { @@ -4937,14 +4564,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "2", - "source": "D(1,1.1437,12.6272,2.3754,12.6034,2.3754,13.185,1.1437,13.1969)", + "content": "1", + "source": "D(1,0.1178,10.0688,1.7966,10.0845,1.7966,10.7584,0.1178,10.7427)", "span": { - "offset": 1794, + "offset": 1433, "length": 1 }, "elements": [ - "/paragraphs/45" + "/paragraphs/38" ] }, { @@ -4953,14 +4580,14 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "1", - "source": "D(1,2.3754,12.6034,4.443,12.5678,4.465,13.1494,2.3754,13.185)", + "content": "3 .000", + "source": "D(1,1.7966,10.0845,3.7087,10.1158,3.6854,10.7897,1.7966,10.7584)", "span": { - "offset": 1805, - "length": 1 + "offset": 1444, + "length": 6 }, "elements": [ - "/paragraphs/46" + "/paragraphs/39" ] }, { @@ -4969,14 +4596,14 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "10.000", - "source": "D(1,4.443,12.5678,6.0707,12.5322,6.0927,13.1257,4.465,13.1494)", + "content": "OXYCODONE HCL. (IR)' 20 MG TAB T", + "source": "D(1,3.7087,10.1158,16.9998,10.3352,16.9765,11.0091,3.6854,10.7897)", "span": { - "offset": 1816, - "length": 6 + "offset": 1460, + "length": 32 }, "elements": [ - "/paragraphs/47" + "/paragraphs/40" ] }, { @@ -4985,15 +4612,12 @@ "columnIndex": 3, "rowSpan": 1, "columnSpan": 1, - "content": "DEXMETHYLPHENIDATE ER 25 MG CP", - "source": "D(1,6.0707,12.5322,17.2664,12.3423,17.2884,12.9476,6.0927,13.1257)", + "content": "", + "source": "D(1,16.9998,10.3352,18.7253,10.3666,18.6787,11.0561,16.9765,11.0091)", "span": { - "offset": 1832, - "length": 30 - }, - "elements": [ - "/paragraphs/48" - ] + "offset": 1502, + "length": 0 + } }, { "kind": "content", @@ -5002,9 +4626,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.2664,12.3423,18.7181,12.3186,18.7401,12.9239,17.2884,12.9476)", + "source": "D(1,18.7253,10.3666,20.3809,10.3979,20.3576,11.0874,18.6787,11.0561)", "span": { - "offset": 1872, + "offset": 1512, "length": 0 } }, @@ -5015,9 +4639,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7181,12.3186,20.1038,12.283,20.1038,12.9001,18.7401,12.9239)", + "source": "D(1,20.3809,10.3979,21.3836,10.4293,21.3603,11.1188,20.3576,11.0874)", "span": { - "offset": 1882, + "offset": 1522, "length": 0 } }, @@ -5028,9 +4652,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1038,12.283,20.9397,12.2711,20.9397,12.8883,20.1038,12.9001)", + "source": "D(1,21.3836,10.4293,22.3396,10.4449,22.3163,11.1345,21.3603,11.1188)", "span": { - "offset": 1892, + "offset": 1532, "length": 0 } }, @@ -5040,12 +4664,15 @@ "columnIndex": 7, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.9397,12.2711,21.6875,12.2592,21.7095,12.8645,20.9397,12.8883)", + "content": "10702-0057-01", + "source": "D(1,22.3396,10.4449,23.2956,10.4763,23.2723,11.1501,22.3163,11.1345)", "span": { - "offset": 1902, - "length": 0 - } + "offset": 1542, + "length": 13 + }, + "elements": [ + "/paragraphs/41" + ] }, { "kind": "content", @@ -5053,15 +4680,12 @@ "columnIndex": 8, "rowSpan": 1, "columnSpan": 1, - "content": "00115-1709-01", - "source": "D(1,21.6875,12.2592,22.5233,12.2474,22.5453,12.8527,21.7095,12.8645)", + "content": "", + "source": "D(1,23.2956,10.4763,24.2283,10.4919,24.205,11.1658,23.2723,11.1501)", "span": { - "offset": 1912, - "length": 13 - }, - "elements": [ - "/paragraphs/49" - ] + "offset": 1565, + "length": 0 + } }, { "kind": "content", @@ -5070,9 +4694,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5233,12.2474,23.2932,12.2236,23.3152,12.8289,22.5453,12.8527)", + "source": "D(1,24.2283,10.4919,25.3243,10.5233,25.301,11.1971,24.205,11.1658)", "span": { - "offset": 1935, + "offset": 1575, "length": 0 } }, @@ -5083,9 +4707,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.2932,12.2236,24.129,12.2118,24.151,12.8171,23.3152,12.8289)", + "source": "D(1,25.3243,10.5233,26.257,10.539,26.2103,11.2128,25.301,11.1971)", "span": { - "offset": 1945, + "offset": 1585, "length": 0 } }, @@ -5096,9 +4720,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.129,12.2118,24.9648,12.1999,24.9868,12.7933,24.151,12.8171)", + "source": "D(1,26.257,10.539,27.1664,10.5546,27.1197,11.2285,26.2103,11.2128)", "span": { - "offset": 1955, + "offset": 1595, "length": 0 } }, @@ -5109,9 +4733,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.9648,12.1999,25.7567,12.188,25.7787,12.7815,24.9868,12.7933)", + "source": "D(1,27.1664,10.5546,28.0758,10.586,28.0525,11.2598,27.1197,11.2285)", "span": { - "offset": 1965, + "offset": 1605, "length": 0 } }, @@ -5122,9 +4746,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.7567,12.188,26.6585,12.1643,26.6805,12.7696,25.7787,12.7815)", + "source": "D(1,28.0758,10.586,28.8919,10.6016,28.8453,11.2755,28.0525,11.2598)", "span": { - "offset": 1975, + "offset": 1615, "length": 0 } }, @@ -5135,9 +4759,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.6585,12.1643,27.4284,12.1524,27.4503,12.7577,26.6805,12.7696)", + "source": "D(1,28.8919,10.6016,29.7546,10.6173,29.708,11.2912,28.8453,11.2755)", "span": { - "offset": 1985, + "offset": 1625, "length": 0 } }, @@ -5148,9 +4772,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.4284,12.1524,28.3082,12.1406,28.3302,12.734,27.4503,12.7577)", + "source": "D(1,29.7546,10.6173,30.6174,10.633,30.5708,11.3068,29.708,11.2912)", "span": { - "offset": 1995, + "offset": 1635, "length": 0 } }, @@ -5160,12 +4784,15 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3082,12.1406,29.144,12.1168,29.166,12.7221,28.3302,12.734)", + "content": "/BC", + "source": "D(1,30.6174,10.633,32.1797,10.6643,32.1331,11.3382,30.5708,11.3068)", "span": { - "offset": 2005, - "length": 0 - } + "offset": 1645, + "length": 3 + }, + "elements": [ + "/paragraphs/42" + ] }, { "kind": "content", @@ -5173,15 +4800,12 @@ "columnIndex": 17, "rowSpan": 1, "columnSpan": 1, - "content": "10", - "source": "D(1,29.144,12.1168,30.6617,12.0931,30.6837,12.6984,29.166,12.7221)", + "content": "", + "source": "D(1,32.1797,10.6643,32.6694,10.68,32.6461,11.3539,32.1331,11.3382)", "span": { - "offset": 2015, - "length": 2 - }, - "elements": [ - "/paragraphs/50" - ] + "offset": 1658, + "length": 0 + } }, { "kind": "content", @@ -5189,14 +4813,14 @@ "columnIndex": 18, "rowSpan": 1, "columnSpan": 1, - "content": "0.30-23", - "source": "D(1,30.6617,12.0931,32.7953,12.0575,32.8173,12.6509,30.6837,12.6984)", + "content": "1/20/23", + "source": "D(1,32.6694,10.68,34.2083,10.6957,34.1617,11.3695,32.6461,11.3539)", "span": { - "offset": 2027, + "offset": 1668, "length": 7 }, "elements": [ - "/paragraphs/51" + "/paragraphs/43" ] }, { @@ -5205,14 +4829,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "3", - "source": "D(1,1.1437,13.1969,2.3754,13.185,2.3754,13.7784,1.1657,13.8022)", + "content": "1", + "source": "D(1,0.1178,10.7427,1.7966,10.7584,1.7966,11.4479,0.0944,11.4322)", "span": { - "offset": 2055, + "offset": 1696, "length": 1 }, "elements": [ - "/paragraphs/52" + "/paragraphs/44" ] }, { @@ -5221,14 +4845,14 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "1", - "source": "D(1,2.3754,13.185,4.465,13.1494,4.465,13.7428,2.3754,13.7784)", + "content": "473.000ML", + "source": "D(1,1.7966,10.7584,3.6854,10.7897,3.6854,11.4792,1.7966,11.4479)", "span": { - "offset": 2066, - "length": 1 + "offset": 1707, + "length": 9 }, "elements": [ - "/paragraphs/53" + "/paragraphs/45" ] }, { @@ -5237,14 +4861,14 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "90.000", - "source": "D(1,4.465,13.1494,6.0927,13.1257,6.0927,13.7072,4.465,13.7428)", + "content": "LORTAB 10 MG-300 MGY15 ML ELXR", + "source": "D(1,3.6854,10.7897,16.9765,11.0091,16.9532,11.73,3.6854,11.4792)", "span": { - "offset": 2077, - "length": 6 + "offset": 1726, + "length": 30 }, "elements": [ - "/paragraphs/54" + "/paragraphs/46" ] }, { @@ -5253,15 +4877,12 @@ "columnIndex": 3, "rowSpan": 1, "columnSpan": 1, - "content": "CONCERTA ER 27 MG TABLET TAB E", - "source": "D(1,6.0927,13.1257,17.2884,12.9476,17.2884,13.5292,6.0927,13.7072)", + "content": "", + "source": "D(1,16.9765,11.0091,18.6787,11.0561,18.6554,11.7613,16.9532,11.73)", "span": { - "offset": 2093, - "length": 30 - }, - "elements": [ - "/paragraphs/55" - ] + "offset": 1766, + "length": 0 + } }, { "kind": "content", @@ -5270,9 +4891,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.2884,12.9476,18.7401,12.9239,18.7401,13.5054,17.2884,13.5292)", + "source": "D(1,18.6787,11.0561,20.3576,11.0874,20.3343,11.7926,18.6554,11.7613)", "span": { - "offset": 2133, + "offset": 1776, "length": 0 } }, @@ -5283,9 +4904,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7401,12.9239,20.1038,12.9001,20.1258,13.4817,18.7401,13.5054)", + "source": "D(1,20.3576,11.0874,21.3603,11.1188,21.3369,11.8083,20.3343,11.7926)", "span": { - "offset": 2143, + "offset": 1786, "length": 0 } }, @@ -5296,9 +4917,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1038,12.9001,20.9397,12.8883,20.9617,13.4698,20.1258,13.4817)", + "source": "D(1,21.3603,11.1188,22.3163,11.1345,22.293,11.824,21.3369,11.8083)", "span": { - "offset": 2153, + "offset": 1796, "length": 0 } }, @@ -5308,12 +4929,15 @@ "columnIndex": 7, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.9397,12.8883,21.7095,12.8645,21.7095,13.458,20.9617,13.4698)", + "content": "17478-0450-16", + "source": "D(1,22.3163,11.1345,23.2723,11.1501,23.249,11.8397,22.293,11.824)", "span": { - "offset": 2163, - "length": 0 - } + "offset": 1806, + "length": 13 + }, + "elements": [ + "/paragraphs/47" + ] }, { "kind": "content", @@ -5321,15 +4945,12 @@ "columnIndex": 8, "rowSpan": 1, "columnSpan": 1, - "content": "50458-0588-01", - "source": "D(1,21.7095,12.8645,22.5453,12.8527,22.5453,13.4461,21.7095,13.458)", + "content": "", + "source": "D(1,23.2723,11.1501,24.205,11.1658,24.1584,11.8553,23.249,11.8397)", "span": { - "offset": 2173, - "length": 13 - }, - "elements": [ - "/paragraphs/56" - ] + "offset": 1829, + "length": 0 + } }, { "kind": "content", @@ -5338,9 +4959,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5453,12.8527,23.3152,12.8289,23.3372,13.4224,22.5453,13.4461)", + "source": "D(1,24.205,11.1658,25.301,11.1971,25.2543,11.8867,24.1584,11.8553)", "span": { - "offset": 2196, + "offset": 1839, "length": 0 } }, @@ -5351,9 +4972,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.3152,12.8289,24.151,12.8171,24.173,13.4105,23.3372,13.4224)", + "source": "D(1,25.301,11.1971,26.2103,11.2128,26.1637,11.9023,25.2543,11.8867)", "span": { - "offset": 2206, + "offset": 1849, "length": 0 } }, @@ -5364,9 +4985,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.151,12.8171,24.9868,12.7933,25.0088,13.3986,24.173,13.4105)", + "source": "D(1,26.2103,11.2128,27.1197,11.2285,27.0731,11.918,26.1637,11.9023)", "span": { - "offset": 2216, + "offset": 1859, "length": 0 } }, @@ -5377,9 +4998,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.9868,12.7933,25.7787,12.7815,25.8007,13.3868,25.0088,13.3986)", + "source": "D(1,27.1197,11.2285,28.0525,11.2598,28.0058,11.9494,27.0731,11.918)", "span": { - "offset": 2226, + "offset": 1869, "length": 0 } }, @@ -5390,9 +5011,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.7787,12.7815,26.6805,12.7696,26.7025,13.363,25.8007,13.3868)", + "source": "D(1,28.0525,11.2598,28.8453,11.2755,28.7986,11.965,28.0058,11.9494)", "span": { - "offset": 2236, + "offset": 1879, "length": 0 } }, @@ -5403,9 +5024,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.6805,12.7696,27.4503,12.7577,27.4723,13.3512,26.7025,13.363)", + "source": "D(1,28.8453,11.2755,29.708,11.2912,29.6614,11.9807,28.7986,11.965)", "span": { - "offset": 2246, + "offset": 1889, "length": 0 } }, @@ -5416,9 +5037,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.4503,12.7577,28.3302,12.734,28.3522,13.3393,27.4723,13.3512)", + "source": "D(1,29.708,11.2912,30.5708,11.3068,30.5241,11.9964,29.6614,11.9807)", "span": { - "offset": 2256, + "offset": 1899, "length": 0 } }, @@ -5428,12 +5049,15 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3302,12.734,29.166,12.7221,29.188,13.3155,28.3522,13.3393)", + "content": "11", + "source": "D(1,30.5708,11.3068,32.1331,11.3382,32.0631,12.012,30.5241,11.9964)", "span": { - "offset": 2266, - "length": 0 - } + "offset": 1909, + "length": 2 + }, + "elements": [ + "/paragraphs/48" + ] }, { "kind": "content", @@ -5441,15 +5065,12 @@ "columnIndex": 17, "rowSpan": 1, "columnSpan": 1, - "content": "90", - "source": "D(1,29.166,12.7221,30.6837,12.6984,30.7057,13.2918,29.188,13.3155)", + "content": "", + "source": "D(1,32.1331,11.3382,32.6461,11.3539,32.5994,12.0277,32.0631,12.012)", "span": { - "offset": 2276, - "length": 2 - }, - "elements": [ - "/paragraphs/57" - ] + "offset": 1921, + "length": 0 + } }, { "kind": "content", @@ -5457,14 +5078,14 @@ "columnIndex": 18, "rowSpan": 1, "columnSpan": 1, - "content": "0-30-23", - "source": "D(1,30.6837,12.6984,32.8173,12.6509,32.8392,13.2443,30.7057,13.2918)", + "content": "11/29/23", + "source": "D(1,32.6461,11.3539,34.1617,11.3695,34.1151,12.0434,32.5994,12.0277)", "span": { - "offset": 2288, - "length": 7 + "offset": 1931, + "length": 8 }, "elements": [ - "/paragraphs/58" + "/paragraphs/49" ] }, { @@ -5473,14 +5094,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "4", - "source": "D(1,1.1657,13.8022,2.3754,13.7784,2.3974,14.36,1.1877,14.3837)", + "content": "1", + "source": "D(1,0.0944,11.4322,1.7966,11.4479,1.7966,12.1374,0.0944,12.1061)", "span": { - "offset": 2316, + "offset": 1960, "length": 1 }, "elements": [ - "/paragraphs/59" + "/paragraphs/50" ] }, { @@ -5489,14 +5110,14 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "1", - "source": "D(1,2.3754,13.7784,4.465,13.7428,4.487,14.3363,2.3974,14.36)", + "content": "2.000", + "source": "D(1,1.7966,11.4479,3.6854,11.4792,3.6621,12.1531,1.7966,12.1374)", "span": { - "offset": 2327, - "length": 1 + "offset": 1971, + "length": 5 }, "elements": [ - "/paragraphs/60" + "/paragraphs/51" ] }, { @@ -5505,14 +5126,14 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "40.000", - "source": "D(1,4.465,13.7428,6.0927,13.7072,6.0927,14.3006,4.487,14.3363)", + "content": "OXYCODONE-ACETAM 10-325 TAB TA", + "source": "D(1,3.6854,11.4792,16.9532,11.73,16.9299,12.3882,3.6621,12.1531)", "span": { - "offset": 2338, - "length": 6 + "offset": 1986, + "length": 30 }, "elements": [ - "/paragraphs/61" + "/paragraphs/52" ] }, { @@ -5521,15 +5142,12 @@ "columnIndex": 3, "rowSpan": 1, "columnSpan": 1, - "content": "MYDAYIS ER 25 MG CAPSULE CPTP", - "source": "D(1,6.0927,13.7072,17.2884,13.5292,17.3104,14.1107,6.0927,14.3006)", + "content": "", + "source": "D(1,16.9532,11.73,18.6554,11.7613,18.6321,12.4195,16.9299,12.3882)", "span": { - "offset": 2354, - "length": 29 - }, - "elements": [ - "/paragraphs/62" - ] + "offset": 2026, + "length": 0 + } }, { "kind": "content", @@ -5538,9 +5156,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.2884,13.5292,18.7401,13.5054,18.7621,14.087,17.3104,14.1107)", + "source": "D(1,18.6554,11.7613,20.3343,11.7926,20.311,12.4508,18.6321,12.4195)", "span": { - "offset": 2393, + "offset": 2036, "length": 0 } }, @@ -5551,9 +5169,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7401,13.5054,20.1258,13.4817,20.1258,14.0633,18.7621,14.087)", + "source": "D(1,20.3343,11.7926,21.3369,11.8083,21.3136,12.4665,20.311,12.4508)", "span": { - "offset": 2403, + "offset": 2046, "length": 0 } }, @@ -5563,12 +5181,15 @@ "columnIndex": 6, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.1258,13.4817,20.9617,13.4698,20.9617,14.0514,20.1258,14.0633)", + "content": "42858-01-04", + "source": "D(1,21.3369,11.8083,22.293,11.824,22.2696,12.4978,21.3136,12.4665)", "span": { - "offset": 2413, - "length": 0 - } + "offset": 2056, + "length": 11 + }, + "elements": [ + "/paragraphs/53" + ] }, { "kind": "content", @@ -5577,9 +5198,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.9617,13.4698,21.7095,13.458,21.7315,14.0395,20.9617,14.0514)", + "source": "D(1,22.293,11.824,23.249,11.8397,23.2257,12.5135,22.2696,12.4978)", "span": { - "offset": 2423, + "offset": 2077, "length": 0 } }, @@ -5589,15 +5210,12 @@ "columnIndex": 8, "rowSpan": 1, "columnSpan": 1, - "content": "54092-0471-01", - "source": "D(1,21.7095,13.458,22.5453,13.4461,22.5673,14.0277,21.7315,14.0395)", + "content": "", + "source": "D(1,23.249,11.8397,24.1584,11.8553,24.1351,12.5292,23.2257,12.5135)", "span": { - "offset": 2433, - "length": 13 - }, - "elements": [ - "/paragraphs/63" - ] + "offset": 2087, + "length": 0 + } }, { "kind": "content", @@ -5605,12 +5223,15 @@ "columnIndex": 9, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,22.5453,13.4461,23.3372,13.4224,23.3592,14.0039,22.5673,14.0277)", + "content": "-02", + "source": "D(1,24.1584,11.8553,25.2543,11.8867,25.2077,12.5449,24.1351,12.5292)", "span": { - "offset": 2456, - "length": 0 - } + "offset": 2097, + "length": 3 + }, + "elements": [ + "/paragraphs/54" + ] }, { "kind": "content", @@ -5619,9 +5240,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.3372,13.4224,24.173,13.4105,24.195,13.9921,23.3592,14.0039)", + "source": "D(1,25.2543,11.8867,26.1637,11.9023,26.1171,12.5605,25.2077,12.5449)", "span": { - "offset": 2466, + "offset": 2110, "length": 0 } }, @@ -5632,9 +5253,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.173,13.4105,25.0088,13.3986,25.0308,13.9802,24.195,13.9921)", + "source": "D(1,26.1637,11.9023,27.0731,11.918,27.0265,12.5762,26.1171,12.5605)", "span": { - "offset": 2476, + "offset": 2120, "length": 0 } }, @@ -5645,9 +5266,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.0088,13.3986,25.8007,13.3868,25.8227,13.9683,25.0308,13.9802)", + "source": "D(1,27.0731,11.918,28.0058,11.9494,27.9592,12.6075,27.0265,12.5762)", "span": { - "offset": 2486, + "offset": 2130, "length": 0 } }, @@ -5658,9 +5279,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8007,13.3868,26.7025,13.363,26.7245,13.9565,25.8227,13.9683)", + "source": "D(1,28.0058,11.9494,28.7986,11.965,28.7753,12.6232,27.9592,12.6075)", "span": { - "offset": 2496, + "offset": 2140, "length": 0 } }, @@ -5671,9 +5292,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7025,13.363,27.4723,13.3512,27.4943,13.9446,26.7245,13.9565)", + "source": "D(1,28.7986,11.965,29.6614,11.9807,29.6381,12.6232,28.7753,12.6232)", "span": { - "offset": 2506, + "offset": 2150, "length": 0 } }, @@ -5684,9 +5305,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.4723,13.3512,28.3522,13.3393,28.3742,13.9327,27.4943,13.9446)", + "source": "D(1,29.6614,11.9807,30.5241,11.9964,30.4775,12.6389,29.6381,12.6232)", "span": { - "offset": 2516, + "offset": 2160, "length": 0 } }, @@ -5696,43 +5317,30 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3522,13.3393,29.188,13.3155,29.21,13.909,28.3742,13.9327)", - "span": { - "offset": 2526, - "length": 0 - } - }, - { - "kind": "content", - "rowIndex": 4, - "columnIndex": 17, - "rowSpan": 1, - "columnSpan": 1, - "content": "40", - "source": "D(1,29.188,13.3155,30.7057,13.2918,30.7277,13.8852,29.21,13.909)", + "content": "1. BE", + "source": "D(1,30.5241,11.9964,32.0631,12.012,32.0165,12.6702,30.4775,12.6389)", "span": { - "offset": 2536, - "length": 2 + "offset": 2170, + "length": 5 }, "elements": [ - "/paragraphs/64" + "/paragraphs/55" ] }, { "kind": "content", "rowIndex": 4, - "columnIndex": 18, + "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, - "content": "0 30-23", - "source": "D(1,30.7057,13.2918,32.8392,13.2443,32.8612,13.8496,30.7277,13.8852)", + "columnSpan": 2, + "content": "14/20/20", + "source": "D(1,32.0631,12.012,34.1151,12.0434,34.0684,12.7016,32.0165,12.6702)", "span": { - "offset": 2548, - "length": 7 + "offset": 2197, + "length": 8 }, "elements": [ - "/paragraphs/65" + "/paragraphs/56" ] }, { @@ -5741,14 +5349,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "5", - "source": "D(1,1.1877,14.3837,2.3974,14.36,2.3974,14.9653,1.1877,14.9772)", + "content": "1.", + "source": "D(1,0.0944,12.1061,1.7966,12.1374,1.7733,12.8113,0.0711,12.7799)", "span": { - "offset": 2576, - "length": 1 + "offset": 2226, + "length": 2 }, "elements": [ - "/paragraphs/66" + "/paragraphs/57" ] }, { @@ -5757,12 +5365,15 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,2.3974,14.36,4.487,14.3363,4.487,14.9297,2.3974,14.9653)", + "content": "10.000", + "source": "D(1,1.7966,12.1374,3.6621,12.1531,3.6387,12.8426,1.7733,12.8113)", "span": { - "offset": 2587, - "length": 0 - } + "offset": 2238, + "length": 6 + }, + "elements": [ + "/paragraphs/58" + ] }, { "kind": "content", @@ -5770,12 +5381,15 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,4.487,14.3363,6.0927,14.3006,6.1147,14.9059,4.487,14.9297)", + "content": "DEXTROAMP-AMPHET ER 30 MG CAP", + "source": "D(1,3.6621,12.1531,16.9299,12.3882,16.8832,13.062,3.6387,12.8426)", "span": { - "offset": 2597, - "length": 0 - } + "offset": 2254, + "length": 29 + }, + "elements": [ + "/paragraphs/59" + ] }, { "kind": "content", @@ -5784,9 +5398,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.0927,14.3006,17.3104,14.1107,17.3324,14.716,6.1147,14.9059)", + "source": "D(1,16.9299,12.3882,18.6321,12.4195,18.6088,13.0933,16.8832,13.062)", "span": { - "offset": 2607, + "offset": 2293, "length": 0 } }, @@ -5797,9 +5411,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3104,14.1107,18.7621,14.087,18.7621,14.7042,17.3324,14.716)", + "source": "D(1,18.6321,12.4195,20.311,12.4508,20.2876,13.1247,18.6088,13.0933)", "span": { - "offset": 2617, + "offset": 2303, "length": 0 } }, @@ -5810,9 +5424,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7621,14.087,20.1258,14.0633,20.1478,14.6804,18.7621,14.7042)", + "source": "D(1,20.311,12.4508,21.3136,12.4665,21.2903,13.1404,20.2876,13.1247)", "span": { - "offset": 2627, + "offset": 2313, "length": 0 } }, @@ -5823,9 +5437,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1258,14.0633,20.9617,14.0514,20.9837,14.6686,20.1478,14.6804)", + "source": "D(1,21.3136,12.4665,22.2696,12.4978,22.223,13.156,21.2903,13.1404)", "span": { - "offset": 2637, + "offset": 2323, "length": 0 } }, @@ -5835,12 +5449,15 @@ "columnIndex": 7, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.9617,14.0514,21.7315,14.0395,21.7535,14.6448,20.9837,14.6686)", + "content": "43975-0282-20", + "source": "D(1,22.2696,12.4978,23.2257,12.5135,23.2024,13.1874,22.223,13.156)", "span": { - "offset": 2647, - "length": 0 - } + "offset": 2333, + "length": 13 + }, + "elements": [ + "/paragraphs/60" + ] }, { "kind": "content", @@ -5849,9 +5466,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7315,14.0395,22.5673,14.0277,22.5893,14.633,21.7535,14.6448)", + "source": "D(1,23.2257,12.5135,24.1351,12.5292,24.1118,13.203,23.2024,13.1874)", "span": { - "offset": 2657, + "offset": 2356, "length": 0 } }, @@ -5862,9 +5479,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5673,14.0277,23.3592,14.0039,23.3812,14.6211,22.5893,14.633)", + "source": "D(1,24.1351,12.5292,25.2077,12.5449,25.161,13.2187,24.1118,13.203)", "span": { - "offset": 2667, + "offset": 2366, "length": 0 } }, @@ -5875,9 +5492,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.3592,14.0039,24.195,13.9921,24.217,14.6092,23.3812,14.6211)", + "source": "D(1,25.2077,12.5449,26.1171,12.5605,26.0938,13.2344,25.161,13.2187)", "span": { - "offset": 2677, + "offset": 2376, "length": 0 } }, @@ -5888,9 +5505,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.195,13.9921,25.0308,13.9802,25.0528,14.5855,24.217,14.6092)", + "source": "D(1,26.1171,12.5605,27.0265,12.5762,27.0031,13.2501,26.0938,13.2344)", "span": { - "offset": 2687, + "offset": 2386, "length": 0 } }, @@ -5901,9 +5518,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.0308,13.9802,25.8227,13.9683,25.8227,14.5736,25.0528,14.5855)", + "source": "D(1,27.0265,12.5762,27.9592,12.6075,27.9125,13.2657,27.0031,13.2501)", "span": { - "offset": 2697, + "offset": 2396, "length": 0 } }, @@ -5914,9 +5531,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8227,13.9683,26.7245,13.9565,26.7465,14.5618,25.8227,14.5736)", + "source": "D(1,27.9592,12.6075,28.7753,12.6232,28.7287,13.2814,27.9125,13.2657)", "span": { - "offset": 2707, + "offset": 2406, "length": 0 } }, @@ -5927,9 +5544,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7245,13.9565,27.4943,13.9446,27.5163,14.538,26.7465,14.5618)", + "source": "D(1,28.7753,12.6232,29.6381,12.6232,29.5914,13.2814,28.7287,13.2814)", "span": { - "offset": 2717, + "offset": 2416, "length": 0 } }, @@ -5940,9 +5557,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.4943,13.9446,28.3742,13.9327,28.3742,14.5261,27.5163,14.538)", + "source": "D(1,29.6381,12.6232,30.4775,12.6389,30.4542,13.2971,29.5914,13.2814)", "span": { - "offset": 2727, + "offset": 2426, "length": 0 } }, @@ -5952,12 +5569,15 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3742,13.9327,29.21,13.909,29.232,14.5143,28.3742,14.5261)", + "content": "199", + "source": "D(1,30.4775,12.6389,32.0165,12.6702,31.9698,13.3284,30.4542,13.2971)", "span": { - "offset": 2737, - "length": 0 - } + "offset": 2436, + "length": 3 + }, + "elements": [ + "/paragraphs/61" + ] }, { "kind": "content", @@ -5966,9 +5586,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.21,13.909,30.7277,13.8852,30.7497,14.4787,29.232,14.5143)", + "source": "D(1,32.0165,12.6702,32.5528,12.6702,32.5061,13.3284,31.9698,13.3284)", "span": { - "offset": 2747, + "offset": 2449, "length": 0 } }, @@ -5978,12 +5598,15 @@ "columnIndex": 18, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,30.7277,13.8852,32.8612,13.8496,32.8832,14.4431,30.7497,14.4787)", + "content": "11/20/23", + "source": "D(1,32.5528,12.6702,34.0684,12.7016,33.9985,13.3441,32.5061,13.3284)", "span": { - "offset": 2757, - "length": 0 - } + "offset": 2459, + "length": 8 + }, + "elements": [ + "/paragraphs/62" + ] }, { "kind": "content", @@ -5991,14 +5614,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "6", - "source": "D(1,1.1877,14.9772,2.3974,14.9653,2.4194,15.5469,1.2097,15.5706)", + "content": "1", + "source": "D(1,0.0711,12.7799,1.7733,12.8113,1.7733,13.4851,0.0711,13.4695)", "span": { - "offset": 2778, + "offset": 2488, "length": 1 }, "elements": [ - "/paragraphs/67" + "/paragraphs/63" ] }, { @@ -6007,12 +5630,15 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,2.3974,14.9653,4.487,14.9297,4.509,15.5112,2.4194,15.5469)", + "content": "1 .000", + "source": "D(1,1.7733,12.8113,3.6387,12.8426,3.6387,13.5165,1.7733,13.4851)", "span": { - "offset": 2789, - "length": 0 - } + "offset": 2499, + "length": 6 + }, + "elements": [ + "/paragraphs/64" + ] }, { "kind": "content", @@ -6020,12 +5646,15 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,4.487,14.9297,6.1147,14.9059,6.1147,15.4875,4.509,15.5112)", + "content": "DEXTROAMP-AMPHETAMIN 20 MG TAB", + "source": "D(1,3.6387,12.8426,16.8832,13.062,16.8599,13.7202,3.6387,13.5165)", "span": { - "offset": 2799, - "length": 0 - } + "offset": 2515, + "length": 30 + }, + "elements": [ + "/paragraphs/65" + ] }, { "kind": "content", @@ -6034,9 +5663,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1147,14.9059,17.3324,14.716,17.3324,15.3213,6.1147,15.4875)", + "source": "D(1,16.8832,13.062,18.6088,13.0933,18.5854,13.7672,16.8599,13.7202)", "span": { - "offset": 2809, + "offset": 2555, "length": 0 } }, @@ -6047,9 +5676,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3324,14.716,18.7621,14.7042,18.7841,15.2976,17.3324,15.3213)", + "source": "D(1,18.6088,13.0933,20.2876,13.1247,20.2643,13.7985,18.5854,13.7672)", "span": { - "offset": 2819, + "offset": 2565, "length": 0 } }, @@ -6060,9 +5689,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7621,14.7042,20.1478,14.6804,20.1478,15.2739,18.7841,15.2976)", + "source": "D(1,20.2876,13.1247,21.2903,13.1404,21.2437,13.8142,20.2643,13.7985)", "span": { - "offset": 2829, + "offset": 2575, "length": 0 } }, @@ -6073,9 +5702,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1478,14.6804,20.9837,14.6686,20.9837,15.262,20.1478,15.2739)", + "source": "D(1,21.2903,13.1404,22.223,13.156,22.1997,13.8299,21.2437,13.8142)", "span": { - "offset": 2839, + "offset": 2585, "length": 0 } }, @@ -6085,12 +5714,15 @@ "columnIndex": 7, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.9837,14.6686,21.7535,14.6448,21.7535,15.2501,20.9837,15.262)", + "content": "64850-0505-01", + "source": "D(1,22.223,13.156,23.2024,13.1874,23.179,13.8456,22.1997,13.8299)", "span": { - "offset": 2849, - "length": 0 - } + "offset": 2595, + "length": 13 + }, + "elements": [ + "/paragraphs/66" + ] }, { "kind": "content", @@ -6099,9 +5731,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7535,14.6448,22.5893,14.633,22.5893,15.2383,21.7535,15.2501)", + "source": "D(1,23.2024,13.1874,24.1118,13.203,24.0884,13.8612,23.179,13.8456)", "span": { - "offset": 2859, + "offset": 2618, "length": 0 } }, @@ -6112,9 +5744,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5893,14.633,23.3812,14.6211,23.4032,15.2145,22.5893,15.2383)", + "source": "D(1,24.1118,13.203,25.161,13.2187,25.1377,13.8769,24.0884,13.8612)", "span": { - "offset": 2869, + "offset": 2628, "length": 0 } }, @@ -6125,9 +5757,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.3812,14.6211,24.217,14.6092,24.217,15.2027,23.4032,15.2145)", + "source": "D(1,25.161,13.2187,26.0938,13.2344,26.0471,13.8926,25.1377,13.8769)", "span": { - "offset": 2879, + "offset": 2638, "length": 0 } }, @@ -6138,9 +5770,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.217,14.6092,25.0528,14.5855,25.0748,15.1908,24.217,15.2027)", + "source": "D(1,26.0938,13.2344,27.0031,13.2501,26.9565,13.8926,26.0471,13.8926)", "span": { - "offset": 2889, + "offset": 2648, "length": 0 } }, @@ -6151,9 +5783,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.0528,14.5855,25.8227,14.5736,25.8447,15.1789,25.0748,15.1908)", + "source": "D(1,27.0031,13.2501,27.9125,13.2657,27.8892,13.9082,26.9565,13.8926)", "span": { - "offset": 2899, + "offset": 2658, "length": 0 } }, @@ -6164,9 +5796,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8227,14.5736,26.7465,14.5618,26.7465,15.1552,25.8447,15.1789)", + "source": "D(1,27.9125,13.2657,28.7287,13.2814,28.682,13.9239,27.8892,13.9082)", "span": { - "offset": 2909, + "offset": 2668, "length": 0 } }, @@ -6177,9 +5809,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7465,14.5618,27.5163,14.538,27.5163,15.1433,26.7465,15.1552)", + "source": "D(1,28.7287,13.2814,29.5914,13.2814,29.5448,13.9396,28.682,13.9239)", "span": { - "offset": 2919, + "offset": 2678, "length": 0 } }, @@ -6190,9 +5822,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.5163,14.538,28.3742,14.5261,28.3962,15.1314,27.5163,15.1433)", + "source": "D(1,29.5914,13.2814,30.4542,13.2971,30.4076,13.9553,29.5448,13.9396)", "span": { - "offset": 2929, + "offset": 2688, "length": 0 } }, @@ -6202,38 +5834,31 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3742,14.5261,29.232,14.5143,29.254,15.1077,28.3962,15.1314)", + "content": "201", + "source": "D(1,30.4542,13.2971,31.9698,13.3284,31.9232,13.9709,30.4076,13.9553)", "span": { - "offset": 2939, - "length": 0 - } + "offset": 2698, + "length": 3 + }, + "elements": [ + "/paragraphs/67" + ] }, { "kind": "content", "rowIndex": 6, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, - "content": "", - "source": "D(1,29.232,14.5143,30.7497,14.4787,30.7717,15.084,29.254,15.1077)", - "span": { - "offset": 2949, - "length": 0 - } - }, - { - "kind": "content", - "rowIndex": 6, - "columnIndex": 18, - "rowSpan": 1, - "columnSpan": 1, - "content": "", - "source": "D(1,30.7497,14.4787,32.8832,14.4431,32.9052,15.0365,30.7717,15.084)", + "columnSpan": 2, + "content": "11/20/23", + "source": "D(1,31.9698,13.3284,33.9985,13.3441,33.9519,14.0023,31.9232,13.9709)", "span": { - "offset": 2959, - "length": 0 - } + "offset": 2723, + "length": 8 + }, + "elements": [ + "/paragraphs/68" + ] }, { "kind": "content", @@ -6241,14 +5866,14 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "7", - "source": "D(1,1.2097,15.5706,2.4194,15.5469,2.4194,16.1403,1.2097,16.164)", + "content": "1", + "source": "D(1,0.0711,13.4695,1.7733,13.4851,1.7733,14.253,0.0478,14.206)", "span": { - "offset": 2980, + "offset": 2752, "length": 1 }, "elements": [ - "/paragraphs/68" + "/paragraphs/69" ] }, { @@ -6257,12 +5882,15 @@ "columnIndex": 1, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,2.4194,15.5469,4.509,15.5112,4.509,16.1047,2.4194,16.1403)", + "content": "10. 0001m", + "source": "D(1,1.7733,13.4851,3.6387,13.5165,3.6154,14.3,1.7733,14.253)", "span": { - "offset": 2991, - "length": 0 - } + "offset": 2763, + "length": 9 + }, + "elements": [ + "/paragraphs/70" + ] }, { "kind": "content", @@ -6270,12 +5898,15 @@ "columnIndex": 2, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,4.509,15.5112,6.1147,15.4875,6.1367,16.0809,4.509,16.1047)", + "content": "HYDROCODONE-ACETAMN 7.5-325/15", + "source": "D(1,3.6387,13.5165,16.8599,13.7202,16.8366,14.4567,3.6154,14.3)", "span": { - "offset": 3001, - "length": 0 - } + "offset": 2782, + "length": 30 + }, + "elements": [ + "/paragraphs/71" + ] }, { "kind": "content", @@ -6284,9 +5915,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1147,15.4875,17.3324,15.3213,17.3544,15.9148,6.1367,16.0809)", + "source": "D(1,16.8599,13.7202,18.5854,13.7672,18.5388,14.4881,16.8366,14.4567)", "span": { - "offset": 3011, + "offset": 2822, "length": 0 } }, @@ -6297,9 +5928,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3324,15.3213,18.7841,15.2976,18.7841,15.891,17.3544,15.9148)", + "source": "D(1,18.5854,13.7672,20.2643,13.7985,20.2177,14.5037,18.5388,14.4881)", "span": { - "offset": 3021, + "offset": 2832, "length": 0 } }, @@ -6310,9 +5941,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7841,15.2976,20.1478,15.2739,20.1698,15.8673,18.7841,15.891)", + "source": "D(1,20.2643,13.7985,21.2437,13.8142,21.2203,14.5194,20.2177,14.5037)", "span": { - "offset": 3031, + "offset": 2842, "length": 0 } }, @@ -6322,12 +5953,15 @@ "columnIndex": 6, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,20.1478,15.2739,20.9837,15.262,21.0056,15.8554,20.1698,15.8673)", + "content": "71930-0027-43", + "source": "D(1,21.2437,13.8142,22.1997,13.8299,22.1764,14.5194,21.2203,14.5194)", "span": { - "offset": 3041, - "length": 0 - } + "offset": 2852, + "length": 13 + }, + "elements": [ + "/paragraphs/72" + ] }, { "kind": "content", @@ -6336,9 +5970,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.9837,15.262,21.7535,15.2501,21.7755,15.8436,21.0056,15.8554)", + "source": "D(1,22.1997,13.8299,23.179,13.8456,23.1557,14.5194,22.1764,14.5194)", "span": { - "offset": 3051, + "offset": 2875, "length": 0 } }, @@ -6349,9 +5983,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7535,15.2501,22.5893,15.2383,22.6113,15.8317,21.7755,15.8436)", + "source": "D(1,23.179,13.8456,24.0884,13.8612,24.0651,14.5194,23.1557,14.5194)", "span": { - "offset": 3061, + "offset": 2885, "length": 0 } }, @@ -6362,9 +5996,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.5893,15.2383,23.4032,15.2145,23.4252,15.808,22.6113,15.8317)", + "source": "D(1,24.0884,13.8612,25.1377,13.8769,25.0911,14.5351,24.0651,14.5194)", "span": { - "offset": 3071, + "offset": 2895, "length": 0 } }, @@ -6375,9 +6009,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4032,15.2145,24.217,15.2027,24.239,15.7961,23.4252,15.808)", + "source": "D(1,25.1377,13.8769,26.0471,13.8926,26.0005,14.5351,25.0911,14.5351)", "span": { - "offset": 3081, + "offset": 2905, "length": 0 } }, @@ -6388,9 +6022,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.217,15.2027,25.0748,15.1908,25.0968,15.7842,24.239,15.7961)", + "source": "D(1,26.0471,13.8926,26.9565,13.8926,26.9099,14.5508,26.0005,14.5351)", "span": { - "offset": 3091, + "offset": 2915, "length": 0 } }, @@ -6401,9 +6035,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.0748,15.1908,25.8447,15.1789,25.8667,15.7724,25.0968,15.7842)", + "source": "D(1,26.9565,13.8926,27.8892,13.9082,27.8426,14.5664,26.9099,14.5508)", "span": { - "offset": 3101, + "offset": 2925, "length": 0 } }, @@ -6414,9 +6048,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8447,15.1789,26.7465,15.1552,26.7685,15.7486,25.8667,15.7724)", + "source": "D(1,27.8892,13.9082,28.682,13.9239,28.6587,14.5821,27.8426,14.5664)", "span": { - "offset": 3111, + "offset": 2935, "length": 0 } }, @@ -6427,9 +6061,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7465,15.1552,27.5163,15.1433,27.5383,15.7368,26.7685,15.7486)", + "source": "D(1,28.682,13.9239,29.5448,13.9396,29.5215,14.5978,28.6587,14.5821)", "span": { - "offset": 3121, + "offset": 2945, "length": 0 } }, @@ -6440,9 +6074,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.5163,15.1433,28.3962,15.1314,28.4181,15.7249,27.5383,15.7368)", + "source": "D(1,29.5448,13.9396,30.4076,13.9553,30.3609,14.5821,29.5215,14.5978)", "span": { - "offset": 3131, + "offset": 2955, "length": 0 } }, @@ -6452,55 +6086,45 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "", - "source": "D(1,28.3962,15.1314,29.254,15.1077,29.276,15.7011,28.4181,15.7249)", + "content": "1BE", + "source": "D(1,30.4076,13.9553,31.9232,13.9709,31.8766,14.5821,30.3609,14.5821)", "span": { - "offset": 3141, - "length": 0 - } + "offset": 2965, + "length": 3 + }, + "elements": [ + "/paragraphs/73" + ] }, { "kind": "content", "rowIndex": 7, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, - "content": "", - "source": "D(1,29.254,15.1077,30.7717,15.084,30.7937,15.6774,29.276,15.7011)", + "columnSpan": 2, + "content": "1/20/23", + "source": "D(1,31.9232,13.9709,33.9519,14.0023,33.9285,14.5664,31.8766,14.5821)", "span": { - "offset": 3151, - "length": 0 - } + "offset": 2990, + "length": 7 + }, + "elements": [ + "/paragraphs/74" + ] }, { "kind": "content", - "rowIndex": 7, - "columnIndex": 18, + "rowIndex": 8, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.7717,15.084,32.9052,15.0365,32.9272,15.6418,30.7937,15.6774)", + "source": "D(1,0.0478,14.206,1.7733,14.253,1.7733,14.9269,0.0478,14.8799)", "span": { - "offset": 3161, + "offset": 3018, "length": 0 } }, - { - "kind": "content", - "rowIndex": 8, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "8", - "source": "D(1,1.2097,16.164,2.4194,16.1403,2.4194,16.7218,1.2317,16.7456)", - "span": { - "offset": 3182, - "length": 1 - }, - "elements": [ - "/paragraphs/69" - ] - }, { "kind": "content", "rowIndex": 8, @@ -6508,9 +6132,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4194,16.1403,4.509,16.1047,4.531,16.6862,2.4194,16.7218)", + "source": "D(1,1.7733,14.253,3.6154,14.3,3.5921,14.9582,1.7733,14.9269)", "span": { - "offset": 3193, + "offset": 3028, "length": 0 } }, @@ -6521,9 +6145,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.509,16.1047,6.1367,16.0809,6.1367,16.6506,4.531,16.6862)", + "source": "D(1,3.6154,14.3,16.8366,14.4567,16.8133,15.1306,3.5921,14.9582)", "span": { - "offset": 3203, + "offset": 3038, "length": 0 } }, @@ -6534,9 +6158,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1367,16.0809,17.3544,15.9148,17.3764,16.4726,6.1367,16.6506)", + "source": "D(1,16.8366,14.4567,18.5388,14.4881,18.5155,15.1463,16.8133,15.1306)", "span": { - "offset": 3213, + "offset": 3048, "length": 0 } }, @@ -6547,9 +6171,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3544,15.9148,18.7841,15.891,18.8061,16.4489,17.3764,16.4726)", + "source": "D(1,18.5388,14.4881,20.2177,14.5037,20.1944,15.1619,18.5155,15.1463)", "span": { - "offset": 3223, + "offset": 3058, "length": 0 } }, @@ -6560,9 +6184,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.7841,15.891,20.1698,15.8673,20.1918,16.437,18.8061,16.4489)", + "source": "D(1,20.2177,14.5037,21.2203,14.5194,21.197,15.1776,20.1944,15.1619)", "span": { - "offset": 3233, + "offset": 3068, "length": 0 } }, @@ -6573,9 +6197,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1698,15.8673,21.0056,15.8554,21.0056,16.4251,20.1918,16.437)", + "source": "D(1,21.2203,14.5194,22.1764,14.5194,22.1531,15.1776,21.197,15.1776)", "span": { - "offset": 3243, + "offset": 3078, "length": 0 } }, @@ -6586,9 +6210,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0056,15.8554,21.7755,15.8436,21.7975,16.4133,21.0056,16.4251)", + "source": "D(1,22.1764,14.5194,23.1557,14.5194,23.1324,15.1933,22.1531,15.1776)", "span": { - "offset": 3253, + "offset": 3088, "length": 0 } }, @@ -6599,9 +6223,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7755,15.8436,22.6113,15.8317,22.6333,16.4014,21.7975,16.4133)", + "source": "D(1,23.1557,14.5194,24.0651,14.5194,24.0418,15.1933,23.1324,15.1933)", "span": { - "offset": 3263, + "offset": 3098, "length": 0 } }, @@ -6612,9 +6236,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6113,15.8317,23.4252,15.808,23.4472,16.3777,22.6333,16.4014)", + "source": "D(1,24.0651,14.5194,25.0911,14.5351,25.0445,15.1933,24.0418,15.1933)", "span": { - "offset": 3273, + "offset": 3108, "length": 0 } }, @@ -6625,9 +6249,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4252,15.808,24.239,15.7961,24.261,16.3658,23.4472,16.3777)", + "source": "D(1,25.0911,14.5351,26.0005,14.5351,25.9538,15.2089,25.0445,15.1933)", "span": { - "offset": 3283, + "offset": 3118, "length": 0 } }, @@ -6638,9 +6262,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.239,15.7961,25.0968,15.7842,25.1188,16.3539,24.261,16.3658)", + "source": "D(1,26.0005,14.5351,26.9099,14.5508,26.8633,15.2246,25.9538,15.2089)", "span": { - "offset": 3293, + "offset": 3128, "length": 0 } }, @@ -6651,9 +6275,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.0968,15.7842,25.8667,15.7724,25.8887,16.3421,25.1188,16.3539)", + "source": "D(1,26.9099,14.5508,27.8426,14.5664,27.796,15.2403,26.8633,15.2246)", "span": { - "offset": 3303, + "offset": 3138, "length": 0 } }, @@ -6664,9 +6288,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8667,15.7724,26.7685,15.7486,26.7905,16.3302,25.8887,16.3421)", + "source": "D(1,27.8426,14.5664,28.6587,14.5821,28.6121,15.256,27.796,15.2403)", "span": { - "offset": 3313, + "offset": 3148, "length": 0 } }, @@ -6677,9 +6301,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7685,15.7486,27.5383,15.7368,27.5603,16.3183,26.7905,16.3302)", + "source": "D(1,28.6587,14.5821,29.5215,14.5978,29.4748,15.256,28.6121,15.256)", "span": { - "offset": 3323, + "offset": 3158, "length": 0 } }, @@ -6690,9 +6314,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.5383,15.7368,28.4181,15.7249,28.4401,16.2946,27.5603,16.3183)", + "source": "D(1,29.5215,14.5978,30.3609,14.5821,30.3376,15.256,29.4748,15.256)", "span": { - "offset": 3333, + "offset": 3168, "length": 0 } }, @@ -6703,9 +6327,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.4181,15.7249,29.276,15.7011,29.276,16.2827,28.4401,16.2946)", + "source": "D(1,30.3609,14.5821,31.8766,14.5821,31.8299,15.256,30.3376,15.256)", "span": { - "offset": 3343, + "offset": 3178, "length": 0 } }, @@ -6714,43 +6338,27 @@ "rowIndex": 8, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.276,15.7011,30.7937,15.6774,30.8157,16.259,29.276,16.2827)", + "source": "D(1,31.8766,14.5821,33.9285,14.5664,33.8586,15.2403,31.8299,15.256)", "span": { - "offset": 3353, + "offset": 3200, "length": 0 } }, { "kind": "content", - "rowIndex": 8, - "columnIndex": 18, + "rowIndex": 9, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.7937,15.6774,32.9272,15.6418,32.9492,16.2234,30.8157,16.259)", + "source": "D(1,0.0478,14.8799,1.7733,14.9269,1.7733,15.5851,0.0245,15.5537)", "span": { - "offset": 3363, + "offset": 3221, "length": 0 } }, - { - "kind": "content", - "rowIndex": 9, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "9", - "source": "D(1,1.2317,16.7456,2.4194,16.7218,2.4414,17.3034,1.2537,17.3153)", - "span": { - "offset": 3384, - "length": 1 - }, - "elements": [ - "/paragraphs/70" - ] - }, { "kind": "content", "rowIndex": 9, @@ -6758,9 +6366,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4194,16.7218,4.531,16.6862,4.531,17.2678,2.4414,17.3034)", + "source": "D(1,1.7733,14.9269,3.5921,14.9582,3.5921,15.6321,1.7733,15.5851)", "span": { - "offset": 3395, + "offset": 3231, "length": 0 } }, @@ -6771,9 +6379,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.531,16.6862,6.1367,16.6506,6.1587,17.2441,4.531,17.2678)", + "source": "D(1,3.5921,14.9582,16.8133,15.1306,16.79,15.8044,3.5921,15.6321)", "span": { - "offset": 3405, + "offset": 3241, "length": 0 } }, @@ -6784,9 +6392,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1367,16.6506,17.3764,16.4726,17.3764,17.066,6.1587,17.2441)", + "source": "D(1,16.8133,15.1306,18.5155,15.1463,18.4922,15.8201,16.79,15.8044)", "span": { - "offset": 3415, + "offset": 3251, "length": 0 } }, @@ -6797,9 +6405,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3764,16.4726,18.8061,16.4489,18.8061,17.0542,17.3764,17.066)", + "source": "D(1,18.5155,15.1463,20.1944,15.1619,20.171,15.8358,18.4922,15.8201)", "span": { - "offset": 3425, + "offset": 3261, "length": 0 } }, @@ -6810,9 +6418,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8061,16.4489,20.1918,16.437,20.1918,17.0423,18.8061,17.0542)", + "source": "D(1,20.1944,15.1619,21.197,15.1776,21.1737,15.8515,20.171,15.8358)", "span": { - "offset": 3435, + "offset": 3271, "length": 0 } }, @@ -6823,9 +6431,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1918,16.437,21.0056,16.4251,21.0277,17.0304,20.1918,17.0423)", + "source": "D(1,21.197,15.1776,22.1531,15.1776,22.1297,15.8515,21.1737,15.8515)", "span": { - "offset": 3445, + "offset": 3281, "length": 0 } }, @@ -6836,9 +6444,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0056,16.4251,21.7975,16.4133,21.7975,17.0186,21.0277,17.0304)", + "source": "D(1,22.1531,15.1776,23.1324,15.1933,23.1091,15.8515,22.1297,15.8515)", "span": { - "offset": 3455, + "offset": 3291, "length": 0 } }, @@ -6849,9 +6457,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7975,16.4133,22.6333,16.4014,22.6333,17.0067,21.7975,17.0186)", + "source": "D(1,23.1324,15.1933,24.0418,15.1933,24.0185,15.8671,23.1091,15.8515)", "span": { - "offset": 3465, + "offset": 3301, "length": 0 } }, @@ -6862,9 +6470,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6333,16.4014,23.4472,16.3777,23.4691,16.983,22.6333,17.0067)", + "source": "D(1,24.0418,15.1933,25.0445,15.1933,24.9978,15.8671,24.0185,15.8671)", "span": { - "offset": 3475, + "offset": 3311, "length": 0 } }, @@ -6875,9 +6483,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4472,16.3777,24.261,16.3658,24.283,16.9711,23.4691,16.983)", + "source": "D(1,25.0445,15.1933,25.9538,15.2089,25.9305,15.8828,24.9978,15.8671)", "span": { - "offset": 3485, + "offset": 3321, "length": 0 } }, @@ -6888,9 +6496,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.261,16.3658,25.1188,16.3539,25.1408,16.9592,24.283,16.9711)", + "source": "D(1,25.9538,15.2089,26.8633,15.2246,26.8399,15.8985,25.9305,15.8828)", "span": { - "offset": 3495, + "offset": 3331, "length": 0 } }, @@ -6901,9 +6509,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.1188,16.3539,25.8887,16.3421,25.9107,16.9474,25.1408,16.9592)", + "source": "D(1,26.8633,15.2246,27.796,15.2403,27.7493,15.9141,26.8399,15.8985)", "span": { - "offset": 3505, + "offset": 3341, "length": 0 } }, @@ -6914,9 +6522,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.8887,16.3421,26.7905,16.3302,26.8125,16.9355,25.9107,16.9474)", + "source": "D(1,27.796,15.2403,28.6121,15.256,28.5654,15.9141,27.7493,15.9141)", "span": { - "offset": 3515, + "offset": 3351, "length": 0 } }, @@ -6927,9 +6535,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.7905,16.3302,27.5603,16.3183,27.5823,16.9236,26.8125,16.9355)", + "source": "D(1,28.6121,15.256,29.4748,15.256,29.4282,15.9298,28.5654,15.9141)", "span": { - "offset": 3525, + "offset": 3361, "length": 0 } }, @@ -6940,9 +6548,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.5603,16.3183,28.4401,16.2946,28.4621,16.9117,27.5823,16.9236)", + "source": "D(1,29.4748,15.256,30.3376,15.256,30.291,15.9298,29.4282,15.9298)", "span": { - "offset": 3535, + "offset": 3371, "length": 0 } }, @@ -6953,9 +6561,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.4401,16.2946,29.276,16.2827,29.298,16.8999,28.4621,16.9117)", + "source": "D(1,30.3376,15.256,31.8299,15.256,31.76,15.9141,30.291,15.9298)", "span": { - "offset": 3545, + "offset": 3381, "length": 0 } }, @@ -6964,24 +6572,11 @@ "rowIndex": 9, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, - "content": "", - "source": "D(1,29.276,16.2827,30.8157,16.259,30.8376,16.8761,29.298,16.8999)", - "span": { - "offset": 3555, - "length": 0 - } - }, - { - "kind": "content", - "rowIndex": 9, - "columnIndex": 18, - "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,30.8157,16.259,32.9492,16.2234,32.9712,16.8405,30.8376,16.8761)", + "source": "D(1,31.8299,15.256,33.8586,15.2403,33.8119,15.9141,31.76,15.9141)", "span": { - "offset": 3565, + "offset": 3403, "length": 0 } }, @@ -6991,15 +6586,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "10", - "source": "D(1,1.2537,17.3153,2.4414,17.3034,2.4414,17.8731,1.2537,17.8968)", + "content": "", + "source": "D(1,0.0245,15.5537,1.7733,15.5851,1.7733,16.2903,0.0245,16.2432)", "span": { - "offset": 3586, - "length": 2 - }, - "elements": [ - "/paragraphs/71" - ] + "offset": 3424, + "length": 0 + } }, { "kind": "content", @@ -7008,9 +6600,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4414,17.3034,4.531,17.2678,4.531,17.8375,2.4414,17.8731)", + "source": "D(1,1.7733,15.5851,3.5921,15.6321,3.5688,16.3216,1.7733,16.2903)", "span": { - "offset": 3598, + "offset": 3434, "length": 0 } }, @@ -7021,9 +6613,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.531,17.2678,6.1587,17.2441,6.1587,17.8138,4.531,17.8375)", + "source": "D(1,3.5921,15.6321,16.79,15.8044,16.7433,16.494,3.5688,16.3216)", "span": { - "offset": 3608, + "offset": 3444, "length": 0 } }, @@ -7034,9 +6626,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1587,17.2441,17.3764,17.066,17.3984,17.6595,6.1587,17.8138)", + "source": "D(1,16.79,15.8044,18.4922,15.8201,18.4688,16.5096,16.7433,16.494)", "span": { - "offset": 3618, + "offset": 3454, "length": 0 } }, @@ -7047,9 +6639,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3764,17.066,18.8061,17.0542,18.8281,17.6357,17.3984,17.6595)", + "source": "D(1,18.4922,15.8201,20.171,15.8358,20.1477,16.5253,18.4688,16.5096)", "span": { - "offset": 3628, + "offset": 3464, "length": 0 } }, @@ -7060,9 +6652,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8061,17.0542,20.1918,17.0423,20.2138,17.6239,18.8281,17.6357)", + "source": "D(1,20.171,15.8358,21.1737,15.8515,21.1504,16.541,20.1477,16.5253)", "span": { - "offset": 3638, + "offset": 3474, "length": 0 } }, @@ -7073,9 +6665,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.1918,17.0423,21.0277,17.0304,21.0277,17.612,20.2138,17.6239)", + "source": "D(1,21.1737,15.8515,22.1297,15.8515,22.1064,16.541,21.1504,16.541)", "span": { - "offset": 3648, + "offset": 3484, "length": 0 } }, @@ -7086,9 +6678,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0277,17.0304,21.7975,17.0186,21.8195,17.6001,21.0277,17.612)", + "source": "D(1,22.1297,15.8515,23.1091,15.8515,23.0858,16.5567,22.1064,16.541)", "span": { - "offset": 3658, + "offset": 3494, "length": 0 } }, @@ -7099,9 +6691,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.7975,17.0186,22.6333,17.0067,22.6553,17.5883,21.8195,17.6001)", + "source": "D(1,23.1091,15.8515,24.0185,15.8671,23.9952,16.5567,23.0858,16.5567)", "span": { - "offset": 3668, + "offset": 3504, "length": 0 } }, @@ -7112,9 +6704,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6333,17.0067,23.4691,16.983,23.4691,17.5764,22.6553,17.5883)", + "source": "D(1,24.0185,15.8671,24.9978,15.8671,24.9745,16.5567,23.9952,16.5567)", "span": { - "offset": 3678, + "offset": 3514, "length": 0 } }, @@ -7125,9 +6717,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4691,16.983,24.283,16.9711,24.305,17.5645,23.4691,17.5764)", + "source": "D(1,24.9978,15.8671,25.9305,15.8828,25.8839,16.5723,24.9745,16.5567)", "span": { - "offset": 3688, + "offset": 3524, "length": 0 } }, @@ -7138,9 +6730,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.283,16.9711,25.1408,16.9592,25.1408,17.5527,24.305,17.5645)", + "source": "D(1,25.9305,15.8828,26.8399,15.8985,26.7933,16.588,25.8839,16.5723)", "span": { - "offset": 3698, + "offset": 3534, "length": 0 } }, @@ -7151,9 +6743,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.1408,16.9592,25.9107,16.9474,25.9326,17.5408,25.1408,17.5527)", + "source": "D(1,26.8399,15.8985,27.7493,15.9141,27.726,16.6037,26.7933,16.588)", "span": { - "offset": 3708, + "offset": 3544, "length": 0 } }, @@ -7164,9 +6756,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9107,16.9474,26.8125,16.9355,26.8345,17.517,25.9326,17.5408)", + "source": "D(1,27.7493,15.9141,28.5654,15.9141,28.5188,16.6037,27.726,16.6037)", "span": { - "offset": 3718, + "offset": 3554, "length": 0 } }, @@ -7177,9 +6769,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.8125,16.9355,27.5823,16.9236,27.6043,17.5052,26.8345,17.517)", + "source": "D(1,28.5654,15.9141,29.4282,15.9298,29.3816,16.6193,28.5188,16.6037)", "span": { - "offset": 3728, + "offset": 3564, "length": 0 } }, @@ -7190,9 +6782,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.5823,16.9236,28.4621,16.9117,28.4841,17.4933,27.6043,17.5052)", + "source": "D(1,29.4282,15.9298,30.291,15.9298,30.2443,16.6193,29.3816,16.6193)", "span": { - "offset": 3738, + "offset": 3574, "length": 0 } }, @@ -7203,9 +6795,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.4621,16.9117,29.298,16.8999,29.32,17.4814,28.4841,17.4933)", + "source": "D(1,30.291,15.9298,31.76,15.9141,31.7133,16.6193,30.2443,16.6193)", "span": { - "offset": 3748, + "offset": 3584, "length": 0 } }, @@ -7214,43 +6806,27 @@ "rowIndex": 10, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.298,16.8999,30.8376,16.8761,30.8597,17.4696,29.32,17.4814)", + "source": "D(1,31.76,15.9141,33.8119,15.9141,33.7653,16.6037,31.7133,16.6193)", "span": { - "offset": 3758, + "offset": 3606, "length": 0 } }, { "kind": "content", - "rowIndex": 10, - "columnIndex": 18, + "rowIndex": 11, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.8376,16.8761,32.9712,16.8405,32.9932,17.434,30.8597,17.4696)", + "source": "D(1,0.0245,16.2432,1.7733,16.2903,1.75,16.9955,0.0012,16.9484)", "span": { - "offset": 3768, + "offset": 3627, "length": 0 } }, - { - "kind": "content", - "rowIndex": 11, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "11", - "source": "D(1,1.2537,17.8968,2.4414,17.8731,2.4414,18.4784,1.2756,18.4903)", - "span": { - "offset": 3789, - "length": 2 - }, - "elements": [ - "/paragraphs/72" - ] - }, { "kind": "content", "rowIndex": 11, @@ -7258,9 +6834,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4414,17.8731,4.531,17.8375,4.553,18.4309,2.4414,18.4784)", + "source": "D(1,1.7733,16.2903,3.5688,16.3216,3.5688,17.0268,1.75,16.9955)", "span": { - "offset": 3801, + "offset": 3637, "length": 0 } }, @@ -7271,9 +6847,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.531,17.8375,6.1587,17.8138,6.1587,18.4072,4.553,18.4309)", + "source": "D(1,3.5688,16.3216,16.7433,16.494,16.72,17.1992,3.5688,17.0268)", "span": { - "offset": 3811, + "offset": 3647, "length": 0 } }, @@ -7284,9 +6860,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1587,17.8138,17.3984,17.6595,17.4204,18.241,6.1587,18.4072)", + "source": "D(1,16.7433,16.494,18.4688,16.5096,18.4222,17.2148,16.72,17.1992)", "span": { - "offset": 3821, + "offset": 3657, "length": 0 } }, @@ -7297,9 +6873,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.3984,17.6595,18.8281,17.6357,18.8281,18.2292,17.4204,18.241)", + "source": "D(1,18.4688,16.5096,20.1477,16.5253,20.1244,17.2462,18.4222,17.2148)", "span": { - "offset": 3831, + "offset": 3667, "length": 0 } }, @@ -7310,9 +6886,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8281,17.6357,20.2138,17.6239,20.2138,18.2054,18.8281,18.2292)", + "source": "D(1,20.1477,16.5253,21.1504,16.541,21.1038,17.2462,20.1244,17.2462)", "span": { - "offset": 3841, + "offset": 3677, "length": 0 } }, @@ -7323,9 +6899,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2138,17.6239,21.0277,17.612,21.0496,18.1936,20.2138,18.2054)", + "source": "D(1,21.1504,16.541,22.1064,16.541,22.0831,17.2619,21.1038,17.2462)", "span": { - "offset": 3851, + "offset": 3687, "length": 0 } }, @@ -7336,9 +6912,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0277,17.612,21.8195,17.6001,21.8195,18.1817,21.0496,18.1936)", + "source": "D(1,22.1064,16.541,23.0858,16.5567,23.0391,17.2619,22.0831,17.2619)", "span": { - "offset": 3861, + "offset": 3697, "length": 0 } }, @@ -7349,9 +6925,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8195,17.6001,22.6553,17.5883,22.6773,18.1698,21.8195,18.1817)", + "source": "D(1,23.0858,16.5567,23.9952,16.5567,23.9718,17.2619,23.0391,17.2619)", "span": { - "offset": 3871, + "offset": 3707, "length": 0 } }, @@ -7362,9 +6938,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6553,17.5883,23.4691,17.5764,23.4911,18.158,22.6773,18.1698)", + "source": "D(1,23.9952,16.5567,24.9745,16.5567,24.9279,17.2619,23.9718,17.2619)", "span": { - "offset": 3881, + "offset": 3717, "length": 0 } }, @@ -7375,9 +6951,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4691,17.5764,24.305,17.5645,24.327,18.1461,23.4911,18.158)", + "source": "D(1,24.9745,16.5567,25.8839,16.5723,25.8373,17.2775,24.9279,17.2619)", "span": { - "offset": 3891, + "offset": 3727, "length": 0 } }, @@ -7388,9 +6964,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.305,17.5645,25.1408,17.5527,25.1628,18.1342,24.327,18.1461)", + "source": "D(1,25.8839,16.5723,26.7933,16.588,26.7467,17.2932,25.8373,17.2775)", "span": { - "offset": 3901, + "offset": 3737, "length": 0 } }, @@ -7401,9 +6977,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.1408,17.5527,25.9326,17.5408,25.9546,18.1223,25.1628,18.1342)", + "source": "D(1,26.7933,16.588,27.726,16.6037,27.6794,17.3089,26.7467,17.2932)", "span": { - "offset": 3911, + "offset": 3747, "length": 0 } }, @@ -7414,9 +6990,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9326,17.5408,26.8345,17.517,26.8565,18.1105,25.9546,18.1223)", + "source": "D(1,27.726,16.6037,28.5188,16.6037,28.4722,17.3245,27.6794,17.3089)", "span": { - "offset": 3921, + "offset": 3757, "length": 0 } }, @@ -7427,9 +7003,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.8345,17.517,27.6043,17.5052,27.6263,18.0986,26.8565,18.1105)", + "source": "D(1,28.5188,16.6037,29.3816,16.6193,29.3349,17.3245,28.4722,17.3245)", "span": { - "offset": 3931, + "offset": 3767, "length": 0 } }, @@ -7440,9 +7016,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6043,17.5052,28.4841,17.4933,28.5061,18.0867,27.6263,18.0986)", + "source": "D(1,29.3816,16.6193,30.2443,16.6193,30.1977,17.3245,29.3349,17.3245)", "span": { - "offset": 3941, + "offset": 3777, "length": 0 } }, @@ -7453,9 +7029,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.4841,17.4933,29.32,17.4814,29.342,18.0749,28.5061,18.0867)", + "source": "D(1,30.2443,16.6193,31.7133,16.6193,31.6667,17.3245,30.1977,17.3245)", "span": { - "offset": 3951, + "offset": 3787, "length": 0 } }, @@ -7464,43 +7040,27 @@ "rowIndex": 11, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.32,17.4814,30.8597,17.4696,30.8816,18.0511,29.342,18.0749)", + "source": "D(1,31.7133,16.6193,33.7653,16.6037,33.7187,17.3089,31.6667,17.3245)", "span": { - "offset": 3961, + "offset": 3809, "length": 0 } }, { "kind": "content", - "rowIndex": 11, - "columnIndex": 18, + "rowIndex": 12, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.8597,17.4696,32.9932,17.434,33.0152,18.0155,30.8816,18.0511)", + "source": "D(1,0.0012,16.9484,1.75,16.9955,1.75,17.6693,0.0012,17.6223)", "span": { - "offset": 3971, + "offset": 3830, "length": 0 } }, - { - "kind": "content", - "rowIndex": 12, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "12", - "source": "D(1,1.2756,18.4903,2.4414,18.4784,2.4634,19.0481,1.2756,19.0718)", - "span": { - "offset": 3992, - "length": 2 - }, - "elements": [ - "/paragraphs/73" - ] - }, { "kind": "content", "rowIndex": 12, @@ -7508,9 +7068,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4414,18.4784,4.553,18.4309,4.553,19.0125,2.4634,19.0481)", + "source": "D(1,1.75,16.9955,3.5688,17.0268,3.5455,17.7163,1.75,17.6693)", "span": { - "offset": 4004, + "offset": 3840, "length": 0 } }, @@ -7521,9 +7081,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.553,18.4309,6.1587,18.4072,6.1807,18.9888,4.553,19.0125)", + "source": "D(1,3.5688,17.0268,16.72,17.1992,16.6967,17.873,3.5455,17.7163)", "span": { - "offset": 4014, + "offset": 3850, "length": 0 } }, @@ -7534,9 +7094,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1587,18.4072,17.4204,18.241,17.4204,18.8107,6.1807,18.9888)", + "source": "D(1,16.72,17.1992,18.4222,17.2148,18.3989,17.9044,16.6967,17.873)", "span": { - "offset": 4024, + "offset": 3860, "length": 0 } }, @@ -7547,9 +7107,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4204,18.241,18.8281,18.2292,18.8501,18.7989,17.4204,18.8107)", + "source": "D(1,18.4222,17.2148,20.1244,17.2462,20.1011,17.9201,18.3989,17.9044)", "span": { - "offset": 4034, + "offset": 3870, "length": 0 } }, @@ -7560,9 +7120,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8281,18.2292,20.2138,18.2054,20.2358,18.7751,18.8501,18.7989)", + "source": "D(1,20.1244,17.2462,21.1038,17.2462,21.0804,17.9357,20.1011,17.9201)", "span": { - "offset": 4044, + "offset": 3880, "length": 0 } }, @@ -7573,9 +7133,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2138,18.2054,21.0496,18.1936,21.0496,18.7633,20.2358,18.7751)", + "source": "D(1,21.1038,17.2462,22.0831,17.2619,22.0598,17.9357,21.0804,17.9357)", "span": { - "offset": 4054, + "offset": 3890, "length": 0 } }, @@ -7586,9 +7146,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0496,18.1936,21.8195,18.1817,21.8415,18.7633,21.0496,18.7633)", + "source": "D(1,22.0831,17.2619,23.0391,17.2619,23.0158,17.9357,22.0598,17.9357)", "span": { - "offset": 4064, + "offset": 3900, "length": 0 } }, @@ -7599,9 +7159,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8195,18.1817,22.6773,18.1698,22.6773,18.7514,21.8415,18.7633)", + "source": "D(1,23.0391,17.2619,23.9718,17.2619,23.9485,17.9357,23.0158,17.9357)", "span": { - "offset": 4074, + "offset": 3910, "length": 0 } }, @@ -7612,9 +7172,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6773,18.1698,23.4911,18.158,23.5131,18.7395,22.6773,18.7514)", + "source": "D(1,23.9718,17.2619,24.9279,17.2619,24.8812,17.9514,23.9485,17.9357)", "span": { - "offset": 4084, + "offset": 3920, "length": 0 } }, @@ -7625,9 +7185,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.4911,18.158,24.327,18.1461,24.349,18.7276,23.5131,18.7395)", + "source": "D(1,24.9279,17.2619,25.8373,17.2775,25.7906,17.9514,24.8812,17.9514)", "span": { - "offset": 4094, + "offset": 3930, "length": 0 } }, @@ -7638,9 +7198,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.327,18.1461,25.1628,18.1342,25.1848,18.7158,24.349,18.7276)", + "source": "D(1,25.8373,17.2775,26.7467,17.2932,26.7,17.9671,25.7906,17.9514)", "span": { - "offset": 4104, + "offset": 3940, "length": 0 } }, @@ -7651,9 +7211,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.1628,18.1342,25.9546,18.1223,25.9766,18.7039,25.1848,18.7158)", + "source": "D(1,26.7467,17.2932,27.6794,17.3089,27.6327,17.9827,26.7,17.9671)", "span": { - "offset": 4114, + "offset": 3950, "length": 0 } }, @@ -7664,9 +7224,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9546,18.1223,26.8565,18.1105,26.8785,18.692,25.9766,18.7039)", + "source": "D(1,27.6794,17.3089,28.4722,17.3245,28.4489,17.9984,27.6327,17.9827)", "span": { - "offset": 4124, + "offset": 3960, "length": 0 } }, @@ -7677,9 +7237,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.8565,18.1105,27.6263,18.0986,27.6483,18.6802,26.8785,18.692)", + "source": "D(1,28.4722,17.3245,29.3349,17.3245,29.3116,18.0141,28.4489,17.9984)", "span": { - "offset": 4134, + "offset": 3970, "length": 0 } }, @@ -7690,9 +7250,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6263,18.0986,28.5061,18.0867,28.5281,18.6683,27.6483,18.6802)", + "source": "D(1,29.3349,17.3245,30.1977,17.3245,30.1511,17.9984,29.3116,18.0141)", "span": { - "offset": 4144, + "offset": 3980, "length": 0 } }, @@ -7703,9 +7263,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5061,18.0867,29.342,18.0749,29.364,18.6564,28.5281,18.6683)", + "source": "D(1,30.1977,17.3245,31.6667,17.3245,31.5968,17.9984,30.1511,17.9984)", "span": { - "offset": 4154, + "offset": 3990, "length": 0 } }, @@ -7714,43 +7274,27 @@ "rowIndex": 12, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.342,18.0749,30.8816,18.0511,30.9036,18.6327,29.364,18.6564)", + "source": "D(1,31.6667,17.3245,33.7187,17.3089,33.672,17.9827,31.5968,17.9984)", "span": { - "offset": 4164, + "offset": 4012, "length": 0 } }, { "kind": "content", - "rowIndex": 12, - "columnIndex": 18, + "rowIndex": 13, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.8816,18.0511,33.0152,18.0155,33.0372,18.609,30.9036,18.6327)", + "source": "D(1,0.0012,17.6223,1.75,17.6693,1.75,18.3745,0,18.3275)", "span": { - "offset": 4174, + "offset": 4033, "length": 0 } }, - { - "kind": "content", - "rowIndex": 13, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "13", - "source": "D(1,1.2756,19.0718,2.4634,19.0481,2.4634,19.6534,1.2976,19.6771)", - "span": { - "offset": 4195, - "length": 2 - }, - "elements": [ - "/paragraphs/74" - ] - }, { "kind": "content", "rowIndex": 13, @@ -7758,9 +7302,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4634,19.0481,4.553,19.0125,4.575,19.6178,2.4634,19.6534)", + "source": "D(1,1.75,17.6693,3.5455,17.7163,3.5222,18.4058,1.75,18.3745)", "span": { - "offset": 4207, + "offset": 4043, "length": 0 } }, @@ -7771,9 +7315,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.553,19.0125,6.1807,18.9888,6.1807,19.5822,4.575,19.6178)", + "source": "D(1,3.5455,17.7163,16.6967,17.873,16.6734,18.5782,3.5222,18.4058)", "span": { - "offset": 4217, + "offset": 4053, "length": 0 } }, @@ -7784,9 +7328,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1807,18.9888,17.4204,18.8107,17.4424,19.4279,6.1807,19.5822)", + "source": "D(1,16.6967,17.873,18.3989,17.9044,18.3756,18.5939,16.6734,18.5782)", "span": { - "offset": 4227, + "offset": 4063, "length": 0 } }, @@ -7797,9 +7341,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4204,18.8107,18.8501,18.7989,18.8501,19.4042,17.4424,19.4279)", + "source": "D(1,18.3989,17.9044,20.1011,17.9201,20.0545,18.6252,18.3756,18.5939)", "span": { - "offset": 4237, + "offset": 4073, "length": 0 } }, @@ -7810,9 +7354,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8501,18.7989,20.2358,18.7751,20.2358,19.3923,18.8501,19.4042)", + "source": "D(1,20.1011,17.9201,21.0804,17.9357,21.0571,18.6252,20.0545,18.6252)", "span": { - "offset": 4247, + "offset": 4083, "length": 0 } }, @@ -7823,9 +7367,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2358,18.7751,21.0496,18.7633,21.0716,19.3804,20.2358,19.3923)", + "source": "D(1,21.0804,17.9357,22.0598,17.9357,22.0132,18.6409,21.0571,18.6252)", "span": { - "offset": 4257, + "offset": 4093, "length": 0 } }, @@ -7836,9 +7380,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0496,18.7633,21.8415,18.7633,21.8635,19.3686,21.0716,19.3804)", + "source": "D(1,22.0598,17.9357,23.0158,17.9357,22.9925,18.6409,22.0132,18.6409)", "span": { - "offset": 4267, + "offset": 4103, "length": 0 } }, @@ -7849,9 +7393,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8415,18.7633,22.6773,18.7514,22.6993,19.3567,21.8635,19.3686)", + "source": "D(1,23.0158,17.9357,23.9485,17.9357,23.9252,18.6409,22.9925,18.6409)", "span": { - "offset": 4277, + "offset": 4113, "length": 0 } }, @@ -7862,9 +7406,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6773,18.7514,23.5131,18.7395,23.5351,19.3448,22.6993,19.3567)", + "source": "D(1,23.9485,17.9357,24.8812,17.9514,24.8346,18.6409,23.9252,18.6409)", "span": { - "offset": 4287, + "offset": 4123, "length": 0 } }, @@ -7875,9 +7419,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.5131,18.7395,24.349,18.7276,24.371,19.3448,23.5351,19.3448)", + "source": "D(1,24.8812,17.9514,25.7906,17.9514,25.744,18.6566,24.8346,18.6409)", "span": { - "offset": 4297, + "offset": 4133, "length": 0 } }, @@ -7888,9 +7432,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.349,18.7276,25.1848,18.7158,25.2068,19.3329,24.371,19.3448)", + "source": "D(1,25.7906,17.9514,26.7,17.9671,26.6534,18.6723,25.744,18.6566)", "span": { - "offset": 4307, + "offset": 4143, "length": 0 } }, @@ -7901,9 +7445,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.1848,18.7158,25.9766,18.7039,25.9986,19.3092,25.2068,19.3329)", + "source": "D(1,26.7,17.9671,27.6327,17.9827,27.5861,18.6879,26.6534,18.6723)", "span": { - "offset": 4317, + "offset": 4153, "length": 0 } }, @@ -7914,9 +7458,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9766,18.7039,26.8785,18.692,26.9004,19.2973,25.9986,19.3092)", + "source": "D(1,27.6327,17.9827,28.4489,17.9984,28.4022,18.7036,27.5861,18.6879)", "span": { - "offset": 4327, + "offset": 4163, "length": 0 } }, @@ -7927,9 +7471,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.8785,18.692,27.6483,18.6802,27.6703,19.2855,26.9004,19.2973)", + "source": "D(1,28.4489,17.9984,29.3116,18.0141,29.265,18.7036,28.4022,18.7036)", "span": { - "offset": 4337, + "offset": 4173, "length": 0 } }, @@ -7940,9 +7484,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6483,18.6802,28.5281,18.6683,28.5501,19.2617,27.6703,19.2855)", + "source": "D(1,29.3116,18.0141,30.1511,17.9984,30.1277,18.7036,29.265,18.7036)", "span": { - "offset": 4347, + "offset": 4183, "length": 0 } }, @@ -7953,9 +7497,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5281,18.6683,29.364,18.6564,29.3859,19.2499,28.5501,19.2617)", + "source": "D(1,30.1511,17.9984,31.5968,17.9984,31.5501,18.7036,30.1277,18.7036)", "span": { - "offset": 4357, + "offset": 4193, "length": 0 } }, @@ -7964,43 +7508,27 @@ "rowIndex": 13, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.364,18.6564,30.9036,18.6327,30.9256,19.238,29.3859,19.2499)", + "source": "D(1,31.5968,17.9984,33.672,17.9827,33.6021,18.6879,31.5501,18.7036)", "span": { - "offset": 4367, + "offset": 4215, "length": 0 } }, { "kind": "content", - "rowIndex": 13, - "columnIndex": 18, + "rowIndex": 14, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.9036,18.6327,33.0372,18.609,33.0592,19.2024,30.9256,19.238)", + "source": "D(1,0,18.3275,1.75,18.3745,1.75,19.064,0,19.0327)", "span": { - "offset": 4377, + "offset": 4236, "length": 0 } }, - { - "kind": "content", - "rowIndex": 14, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "14", - "source": "D(1,1.2976,19.6771,2.4634,19.6534,2.4634,20.2468,1.2976,20.2706)", - "span": { - "offset": 4398, - "length": 2 - }, - "elements": [ - "/paragraphs/75" - ] - }, { "kind": "content", "rowIndex": 14, @@ -8008,9 +7536,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4634,19.6534,4.575,19.6178,4.575,20.2112,2.4634,20.2468)", + "source": "D(1,1.75,18.3745,3.5222,18.4058,3.5222,19.111,1.75,19.064)", "span": { - "offset": 4410, + "offset": 4246, "length": 0 } }, @@ -8021,9 +7549,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.575,19.6178,6.1807,19.5822,6.2027,20.1756,4.575,20.2112)", + "source": "D(1,3.5222,18.4058,16.6734,18.5782,16.6267,19.2834,3.5222,19.111)", "span": { - "offset": 4420, + "offset": 4256, "length": 0 } }, @@ -8034,9 +7562,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.1807,19.5822,17.4424,19.4279,17.4644,20.0095,6.2027,20.1756)", + "source": "D(1,16.6734,18.5782,18.3756,18.5939,18.3523,19.2991,16.6267,19.2834)", "span": { - "offset": 4430, + "offset": 4266, "length": 0 } }, @@ -8047,9 +7575,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4424,19.4279,18.8501,19.4042,18.8721,19.9857,17.4644,20.0095)", + "source": "D(1,18.3756,18.5939,20.0545,18.6252,20.0311,19.3148,18.3523,19.2991)", "span": { - "offset": 4440, + "offset": 4276, "length": 0 } }, @@ -8060,9 +7588,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8501,19.4042,20.2358,19.3923,20.2578,19.9739,18.8721,19.9857)", + "source": "D(1,20.0545,18.6252,21.0571,18.6252,21.0338,19.3305,20.0311,19.3148)", "span": { - "offset": 4450, + "offset": 4286, "length": 0 } }, @@ -8073,9 +7601,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2358,19.3923,21.0716,19.3804,21.0716,19.962,20.2578,19.9739)", + "source": "D(1,21.0571,18.6252,22.0132,18.6409,21.9898,19.3305,21.0338,19.3305)", "span": { - "offset": 4460, + "offset": 4296, "length": 0 } }, @@ -8086,9 +7614,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0716,19.3804,21.8635,19.3686,21.8635,19.9501,21.0716,19.962)", + "source": "D(1,22.0132,18.6409,22.9925,18.6409,22.9692,19.3305,21.9898,19.3305)", "span": { - "offset": 4470, + "offset": 4306, "length": 0 } }, @@ -8099,9 +7627,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8635,19.3686,22.6993,19.3567,22.6993,19.9501,21.8635,19.9501)", + "source": "D(1,22.9925,18.6409,23.9252,18.6409,23.8786,19.3461,22.9692,19.3305)", "span": { - "offset": 4480, + "offset": 4316, "length": 0 } }, @@ -8112,9 +7640,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6993,19.3567,23.5351,19.3448,23.5571,19.9382,22.6993,19.9501)", + "source": "D(1,23.9252,18.6409,24.8346,18.6409,24.788,19.3461,23.8786,19.3461)", "span": { - "offset": 4490, + "offset": 4326, "length": 0 } }, @@ -8125,9 +7653,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.5351,19.3448,24.371,19.3448,24.393,19.9264,23.5571,19.9382)", + "source": "D(1,24.8346,18.6409,25.744,18.6566,25.7207,19.3618,24.788,19.3461)", "span": { - "offset": 4500, + "offset": 4336, "length": 0 } }, @@ -8138,9 +7666,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.371,19.3448,25.2068,19.3329,25.2288,19.9145,24.393,19.9264)", + "source": "D(1,25.744,18.6566,26.6534,18.6723,26.6301,19.3618,25.7207,19.3618)", "span": { - "offset": 4510, + "offset": 4346, "length": 0 } }, @@ -8151,9 +7679,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.2068,19.3329,25.9986,19.3092,25.9986,19.9027,25.2288,19.9145)", + "source": "D(1,26.6534,18.6723,27.5861,18.6879,27.5395,19.3775,26.6301,19.3618)", "span": { - "offset": 4520, + "offset": 4356, "length": 0 } }, @@ -8164,9 +7692,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9986,19.3092,26.9004,19.2973,26.9225,19.8908,25.9986,19.9027)", + "source": "D(1,27.5861,18.6879,28.4022,18.7036,28.3556,19.3931,27.5395,19.3775)", "span": { - "offset": 4530, + "offset": 4366, "length": 0 } }, @@ -8177,9 +7705,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9004,19.2973,27.6703,19.2855,27.6923,19.8789,26.9225,19.8908)", + "source": "D(1,28.4022,18.7036,29.265,18.7036,29.2183,19.4088,28.3556,19.3931)", "span": { - "offset": 4540, + "offset": 4376, "length": 0 } }, @@ -8190,9 +7718,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6703,19.2855,28.5501,19.2617,28.5501,19.8552,27.6923,19.8789)", + "source": "D(1,29.265,18.7036,30.1277,18.7036,30.0811,19.4088,29.2183,19.4088)", "span": { - "offset": 4550, + "offset": 4386, "length": 0 } }, @@ -8203,9 +7731,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5501,19.2617,29.3859,19.2499,29.4079,19.8433,28.5501,19.8552)", + "source": "D(1,30.1277,18.7036,31.5501,18.7036,31.5035,19.3931,30.0811,19.4088)", "span": { - "offset": 4560, + "offset": 4396, "length": 0 } }, @@ -8214,43 +7742,27 @@ "rowIndex": 14, "columnIndex": 17, "rowSpan": 1, - "columnSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,29.3859,19.2499,30.9256,19.238,30.9476,19.8314,29.4079,19.8433)", + "source": "D(1,31.5501,18.7036,33.6021,18.6879,33.5554,19.3931,31.5035,19.3931)", "span": { - "offset": 4570, + "offset": 4418, "length": 0 } }, { "kind": "content", - "rowIndex": 14, - "columnIndex": 18, + "rowIndex": 15, + "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.9256,19.238,33.0592,19.2024,33.0812,19.7958,30.9476,19.8314)", + "source": "D(1,0,19.0327,1.75,19.064,1.75,19.7692,0,19.7222)", "span": { - "offset": 4580, + "offset": 4439, "length": 0 } }, - { - "kind": "content", - "rowIndex": 15, - "columnIndex": 0, - "rowSpan": 1, - "columnSpan": 1, - "content": "15", - "source": "D(1,1.2976,20.2706,2.4634,20.2468,2.4854,20.8521,1.3196,20.8759)", - "span": { - "offset": 4601, - "length": 2 - }, - "elements": [ - "/paragraphs/76" - ] - }, { "kind": "content", "rowIndex": 15, @@ -8258,9 +7770,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4634,20.2468,4.575,20.2112,4.597,20.8047,2.4854,20.8521)", + "source": "D(1,1.75,19.064,3.5222,19.111,3.4988,19.8162,1.75,19.7692)", "span": { - "offset": 4613, + "offset": 4449, "length": 0 } }, @@ -8271,9 +7783,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.575,20.2112,6.2027,20.1756,6.2027,20.7691,4.597,20.8047)", + "source": "D(1,3.5222,19.111,16.6267,19.2834,16.6034,19.9729,3.4988,19.8162)", "span": { - "offset": 4623, + "offset": 4459, "length": 0 } }, @@ -8284,9 +7796,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2027,20.1756,17.4644,20.0095,17.4644,20.6029,6.2027,20.7691)", + "source": "D(1,16.6267,19.2834,18.3523,19.2991,18.3056,20.0043,16.6034,19.9729)", "span": { - "offset": 4633, + "offset": 4469, "length": 0 } }, @@ -8297,9 +7809,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4644,20.0095,18.8721,19.9857,18.8721,20.5792,17.4644,20.6029)", + "source": "D(1,18.3523,19.2991,20.0311,19.3148,20.0078,20.02,18.3056,20.0043)", "span": { - "offset": 4643, + "offset": 4479, "length": 0 } }, @@ -8310,9 +7822,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8721,19.9857,20.2578,19.9739,20.2578,20.5673,18.8721,20.5792)", + "source": "D(1,20.0311,19.3148,21.0338,19.3305,20.9872,20.0356,20.0078,20.02)", "span": { - "offset": 4653, + "offset": 4489, "length": 0 } }, @@ -8323,9 +7835,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2578,19.9739,21.0716,19.962,21.0936,20.5554,20.2578,20.5673)", + "source": "D(1,21.0338,19.3305,21.9898,19.3305,21.9665,20.0356,20.9872,20.0356)", "span": { - "offset": 4663, + "offset": 4499, "length": 0 } }, @@ -8336,9 +7848,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0716,19.962,21.8635,19.9501,21.8855,20.5435,21.0936,20.5554)", + "source": "D(1,21.9898,19.3305,22.9692,19.3305,22.9459,20.0356,21.9665,20.0356)", "span": { - "offset": 4673, + "offset": 4509, "length": 0 } }, @@ -8349,9 +7861,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8635,19.9501,22.6993,19.9501,22.7213,20.5317,21.8855,20.5435)", + "source": "D(1,22.9692,19.3305,23.8786,19.3461,23.8553,20.0356,22.9459,20.0356)", "span": { - "offset": 4683, + "offset": 4519, "length": 0 } }, @@ -8362,9 +7874,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.6993,19.9501,23.5571,19.9382,23.5791,20.5198,22.7213,20.5317)", + "source": "D(1,23.8786,19.3461,24.788,19.3461,24.7413,20.0513,23.8553,20.0356)", "span": { - "offset": 4693, + "offset": 4529, "length": 0 } }, @@ -8375,9 +7887,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.5571,19.9382,24.393,19.9264,24.393,20.5198,23.5791,20.5198)", + "source": "D(1,24.788,19.3461,25.7207,19.3618,25.674,20.0513,24.7413,20.0513)", "span": { - "offset": 4703, + "offset": 4539, "length": 0 } }, @@ -8388,9 +7900,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.393,19.9264,25.2288,19.9145,25.2508,20.5079,24.393,20.5198)", + "source": "D(1,25.7207,19.3618,26.6301,19.3618,26.5834,20.067,25.674,20.0513)", "span": { - "offset": 4713, + "offset": 4549, "length": 0 } }, @@ -8401,9 +7913,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.2288,19.9145,25.9986,19.9027,26.0206,20.4961,25.2508,20.5079)", + "source": "D(1,26.6301,19.3618,27.5395,19.3775,27.5161,20.0827,26.5834,20.067)", "span": { - "offset": 4723, + "offset": 4559, "length": 0 } }, @@ -8414,9 +7926,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.9986,19.9027,26.9225,19.8908,26.9225,20.4723,26.0206,20.4961)", + "source": "D(1,27.5395,19.3775,28.3556,19.3931,28.3089,20.0983,27.5161,20.0827)", "span": { - "offset": 4733, + "offset": 4569, "length": 0 } }, @@ -8427,9 +7939,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9225,19.8908,27.6923,19.8789,27.6923,20.4605,26.9225,20.4723)", + "source": "D(1,28.3556,19.3931,29.2183,19.4088,29.1717,20.114,28.3089,20.0983)", "span": { - "offset": 4743, + "offset": 4579, "length": 0 } }, @@ -8440,9 +7952,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6923,19.8789,28.5501,19.8552,28.5721,20.4486,27.6923,20.4605)", + "source": "D(1,29.2183,19.4088,30.0811,19.4088,30.0345,20.0983,29.1717,20.114)", "span": { - "offset": 4753, + "offset": 4589, "length": 0 } }, @@ -8453,9 +7965,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5501,19.8552,29.4079,19.8433,29.4299,20.4367,28.5721,20.4486)", + "source": "D(1,30.0811,19.4088,31.5035,19.3931,31.4335,20.0983,30.0345,20.0983)", "span": { - "offset": 4763, + "offset": 4599, "length": 0 } }, @@ -8466,9 +7978,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4079,19.8433,30.9476,19.8314,30.9696,20.4249,29.4299,20.4367)", + "source": "D(1,31.5035,19.3931,32.1564,19.3931,32.1098,20.0983,31.4335,20.0983)", "span": { - "offset": 4773, + "offset": 4609, "length": 0 } }, @@ -8479,9 +7991,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.9476,19.8314,33.0812,19.7958,33.1032,20.3892,30.9696,20.4249)", + "source": "D(1,32.1564,19.3931,33.5554,19.3931,33.5088,20.0983,32.1098,20.0983)", "span": { - "offset": 4783, + "offset": 4619, "length": 0 } }, @@ -8491,15 +8003,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "16", - "source": "D(1,1.3196,20.8759,2.4854,20.8521,2.4854,21.4456,1.3416,21.4693)", + "content": "", + "source": "D(1,0,19.7222,1.75,19.7692,1.75,20.4588,0,20.4118)", "span": { - "offset": 4804, - "length": 2 - }, - "elements": [ - "/paragraphs/77" - ] + "offset": 4640, + "length": 0 + } }, { "kind": "content", @@ -8508,9 +8017,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4854,20.8521,4.597,20.8047,4.597,21.41,2.4854,21.4456)", + "source": "D(1,1.75,19.7692,3.4988,19.8162,3.4988,20.5058,1.75,20.4588)", "span": { - "offset": 4816, + "offset": 4650, "length": 0 } }, @@ -8521,9 +8030,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.597,20.8047,6.2027,20.7691,6.2246,21.3744,4.597,21.41)", + "source": "D(1,3.4988,19.8162,16.6034,19.9729,16.5801,20.6625,3.4988,20.5058)", "span": { - "offset": 4826, + "offset": 4660, "length": 0 } }, @@ -8534,9 +8043,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2027,20.7691,17.4644,20.6029,17.4864,21.2082,6.2246,21.3744)", + "source": "D(1,16.6034,19.9729,18.3056,20.0043,18.2823,20.6938,16.5801,20.6625)", "span": { - "offset": 4836, + "offset": 4670, "length": 0 } }, @@ -8547,9 +8056,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4644,20.6029,18.8721,20.5792,18.8941,21.1844,17.4864,21.2082)", + "source": "D(1,18.3056,20.0043,20.0078,20.02,19.9845,20.7095,18.2823,20.6938)", "span": { - "offset": 4846, + "offset": 4680, "length": 0 } }, @@ -8560,9 +8069,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8721,20.5792,20.2578,20.5673,20.2798,21.1607,18.8941,21.1844)", + "source": "D(1,20.0078,20.02,20.9872,20.0356,20.9638,20.7252,19.9845,20.7095)", "span": { - "offset": 4856, + "offset": 4690, "length": 0 } }, @@ -8573,9 +8082,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2578,20.5673,21.0936,20.5554,21.0936,21.1489,20.2798,21.1607)", + "source": "D(1,20.9872,20.0356,21.9665,20.0356,21.9432,20.7252,20.9638,20.7252)", "span": { - "offset": 4866, + "offset": 4700, "length": 0 } }, @@ -8586,9 +8095,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0936,20.5554,21.8855,20.5435,21.9075,21.137,21.0936,21.1489)", + "source": "D(1,21.9665,20.0356,22.9459,20.0356,22.9225,20.7252,21.9432,20.7252)", "span": { - "offset": 4876, + "offset": 4710, "length": 0 } }, @@ -8599,9 +8108,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.8855,20.5435,22.7213,20.5317,22.7433,21.1251,21.9075,21.137)", + "source": "D(1,22.9459,20.0356,23.8553,20.0356,23.8319,20.7252,22.9225,20.7252)", "span": { - "offset": 4886, + "offset": 4720, "length": 0 } }, @@ -8612,9 +8121,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.7213,20.5317,23.5791,20.5198,23.6011,21.1132,22.7433,21.1251)", + "source": "D(1,23.8553,20.0356,24.7413,20.0513,24.718,20.7408,23.8319,20.7252)", "span": { - "offset": 4896, + "offset": 4730, "length": 0 } }, @@ -8625,9 +8134,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.5791,20.5198,24.393,20.5198,24.415,21.1132,23.6011,21.1132)", + "source": "D(1,24.7413,20.0513,25.674,20.0513,25.6274,20.7408,24.718,20.7408)", "span": { - "offset": 4906, + "offset": 4740, "length": 0 } }, @@ -8638,9 +8147,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.393,20.5198,25.2508,20.5079,25.2728,21.1014,24.415,21.1132)", + "source": "D(1,25.674,20.0513,26.5834,20.067,26.5368,20.7565,25.6274,20.7408)", "span": { - "offset": 4916, + "offset": 4750, "length": 0 } }, @@ -8651,9 +8160,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.2508,20.5079,26.0206,20.4961,26.0426,21.0895,25.2728,21.1014)", + "source": "D(1,26.5834,20.067,27.5161,20.0827,27.4695,20.7722,26.5368,20.7565)", "span": { - "offset": 4926, + "offset": 4760, "length": 0 } }, @@ -8664,9 +8173,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.0206,20.4961,26.9225,20.4723,26.9444,21.0776,26.0426,21.0895)", + "source": "D(1,27.5161,20.0827,28.3089,20.0983,28.2623,20.7878,27.4695,20.7722)", "span": { - "offset": 4936, + "offset": 4770, "length": 0 } }, @@ -8677,9 +8186,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9225,20.4723,27.6923,20.4605,27.7143,21.0658,26.9444,21.0776)", + "source": "D(1,28.3089,20.0983,29.1717,20.114,29.1251,20.8035,28.2623,20.7878)", "span": { - "offset": 4946, + "offset": 4780, "length": 0 } }, @@ -8690,9 +8199,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.6923,20.4605,28.5721,20.4486,28.5941,21.0539,27.7143,21.0658)", + "source": "D(1,29.1717,20.114,30.0345,20.0983,29.9878,20.7878,29.1251,20.8035)", "span": { - "offset": 4956, + "offset": 4790, "length": 0 } }, @@ -8703,9 +8212,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5721,20.4486,29.4299,20.4367,29.4519,21.042,28.5941,21.0539)", + "source": "D(1,30.0345,20.0983,31.4335,20.0983,31.3869,20.7878,29.9878,20.7878)", "span": { - "offset": 4966, + "offset": 4800, "length": 0 } }, @@ -8716,9 +8225,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4299,20.4367,30.9696,20.4249,30.9916,21.0302,29.4519,21.042)", + "source": "D(1,31.4335,20.0983,32.1098,20.0983,32.0631,20.7878,31.3869,20.7878)", "span": { - "offset": 4976, + "offset": 4810, "length": 0 } }, @@ -8729,9 +8238,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.9696,20.4249,33.1032,20.3892,33.1252,20.9946,30.9916,21.0302)", + "source": "D(1,32.1098,20.0983,33.5088,20.0983,33.4622,20.7878,32.0631,20.7878)", "span": { - "offset": 4986, + "offset": 4820, "length": 0 } }, @@ -8741,15 +8250,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "17", - "source": "D(1,1.3416,21.4693,2.4854,21.4456,2.4854,22.039,1.3416,22.0627)", + "content": "", + "source": "D(1,0,20.4118,1.75,20.4588,1.7267,21.164,0,21.1169)", "span": { - "offset": 5007, - "length": 2 - }, - "elements": [ - "/paragraphs/78" - ] + "offset": 4841, + "length": 0 + } }, { "kind": "content", @@ -8758,9 +8264,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4854,21.4456,4.597,21.41,4.619,21.9915,2.4854,22.039)", + "source": "D(1,1.75,20.4588,3.4988,20.5058,3.4755,21.211,1.7267,21.164)", "span": { - "offset": 5019, + "offset": 4851, "length": 0 } }, @@ -8771,9 +8277,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.597,21.41,6.2246,21.3744,6.2246,21.9678,4.619,21.9915)", + "source": "D(1,3.4988,20.5058,16.5801,20.6625,16.5568,21.3677,3.4755,21.211)", "span": { - "offset": 5029, + "offset": 4861, "length": 0 } }, @@ -8784,9 +8290,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2246,21.3744,17.4864,21.2082,17.5084,21.8016,6.2246,21.9678)", + "source": "D(1,16.5801,20.6625,18.2823,20.6938,18.259,21.3833,16.5568,21.3677)", "span": { - "offset": 5039, + "offset": 4871, "length": 0 } }, @@ -8797,9 +8303,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.4864,21.2082,18.8941,21.1844,18.8941,21.7779,17.5084,21.8016)", + "source": "D(1,18.2823,20.6938,19.9845,20.7095,19.9379,21.4147,18.259,21.3833)", "span": { - "offset": 5049, + "offset": 4881, "length": 0 } }, @@ -8810,9 +8316,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8941,21.1844,20.2798,21.1607,20.2798,21.7542,18.8941,21.7779)", + "source": "D(1,19.9845,20.7095,20.9638,20.7252,20.9405,21.4147,19.9379,21.4147)", "span": { - "offset": 5059, + "offset": 4891, "length": 0 } }, @@ -8823,9 +8329,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2798,21.1607,21.0936,21.1489,21.1156,21.7423,20.2798,21.7542)", + "source": "D(1,20.9638,20.7252,21.9432,20.7252,21.9199,21.4304,20.9405,21.4147)", "span": { - "offset": 5069, + "offset": 4901, "length": 0 } }, @@ -8836,9 +8342,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.0936,21.1489,21.9075,21.137,21.9075,21.7423,21.1156,21.7423)", + "source": "D(1,21.9432,20.7252,22.9225,20.7252,22.8992,21.4304,21.9199,21.4304)", "span": { - "offset": 5079, + "offset": 4911, "length": 0 } }, @@ -8849,9 +8355,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.9075,21.137,22.7433,21.1251,22.7433,21.7304,21.9075,21.7423)", + "source": "D(1,22.9225,20.7252,23.8319,20.7252,23.8086,21.4304,22.8992,21.4304)", "span": { - "offset": 5089, + "offset": 4921, "length": 0 } }, @@ -8862,9 +8368,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.7433,21.1251,23.6011,21.1132,23.6231,21.7304,22.7433,21.7304)", + "source": "D(1,23.8319,20.7252,24.718,20.7408,24.6714,21.4304,23.8086,21.4304)", "span": { - "offset": 5099, + "offset": 4931, "length": 0 } }, @@ -8875,9 +8381,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.6011,21.1132,24.415,21.1132,24.4369,21.7185,23.6231,21.7304)", + "source": "D(1,24.718,20.7408,25.6274,20.7408,25.5808,21.446,24.6714,21.4304)", "span": { - "offset": 5109, + "offset": 4941, "length": 0 } }, @@ -8888,9 +8394,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.415,21.1132,25.2728,21.1014,25.2948,21.7067,24.4369,21.7185)", + "source": "D(1,25.6274,20.7408,26.5368,20.7565,26.4902,21.4617,25.5808,21.446)", "span": { - "offset": 5119, + "offset": 4951, "length": 0 } }, @@ -8901,9 +8407,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.2728,21.1014,26.0426,21.0895,26.0646,21.6948,25.2948,21.7067)", + "source": "D(1,26.5368,20.7565,27.4695,20.7722,27.4229,21.4774,26.4902,21.4617)", "span": { - "offset": 5129, + "offset": 4961, "length": 0 } }, @@ -8914,9 +8420,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.0426,21.0895,26.9444,21.0776,26.9664,21.6829,26.0646,21.6948)", + "source": "D(1,27.4695,20.7722,28.2623,20.7878,28.239,21.4774,27.4229,21.4774)", "span": { - "offset": 5139, + "offset": 4971, "length": 0 } }, @@ -8927,9 +8433,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9444,21.0776,27.7143,21.0658,27.7363,21.6711,26.9664,21.6829)", + "source": "D(1,28.2623,20.7878,29.1251,20.8035,29.1018,21.4931,28.239,21.4774)", "span": { - "offset": 5149, + "offset": 4981, "length": 0 } }, @@ -8940,9 +8446,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.7143,21.0658,28.5941,21.0539,28.6161,21.6592,27.7363,21.6711)", + "source": "D(1,29.1251,20.8035,29.9878,20.7878,29.9412,21.4931,29.1018,21.4931)", "span": { - "offset": 5159, + "offset": 4991, "length": 0 } }, @@ -8953,9 +8459,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.5941,21.0539,29.4519,21.042,29.4519,21.6473,28.6161,21.6592)", + "source": "D(1,29.9878,20.7878,31.3869,20.7878,31.3403,21.4931,29.9412,21.4931)", "span": { - "offset": 5169, + "offset": 5001, "length": 0 } }, @@ -8966,9 +8472,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4519,21.042,30.9916,21.0302,31.0136,21.6236,29.4519,21.6473)", + "source": "D(1,31.3869,20.7878,32.0631,20.7878,32.0165,21.4931,31.3403,21.4931)", "span": { - "offset": 5179, + "offset": 5011, "length": 0 } }, @@ -8979,9 +8485,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,30.9916,21.0302,33.1252,20.9946,33.1472,21.5999,31.0136,21.6236)", + "source": "D(1,32.0631,20.7878,33.4622,20.7878,33.3922,21.4774,32.0165,21.4931)", "span": { - "offset": 5189, + "offset": 5021, "length": 0 } }, @@ -8991,15 +8497,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "18", - "source": "D(1,1.3416,22.0627,2.4854,22.039,2.5074,22.6324,1.3636,22.6562)", + "content": "", + "source": "D(1,0,21.1169,1.7267,21.164,1.7267,21.8692,0,21.8222)", "span": { - "offset": 5210, - "length": 2 - }, - "elements": [ - "/paragraphs/79" - ] + "offset": 5042, + "length": 0 + } }, { "kind": "content", @@ -9008,9 +8511,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.4854,22.039,4.619,21.9915,4.619,22.5968,2.5074,22.6324)", + "source": "D(1,1.7267,21.164,3.4755,21.211,3.4522,21.9005,1.7267,21.8692)", "span": { - "offset": 5222, + "offset": 5052, "length": 0 } }, @@ -9021,9 +8524,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.619,21.9915,6.2246,21.9678,6.2246,22.5612,4.619,22.5968)", + "source": "D(1,3.4755,21.211,16.5568,21.3677,16.5102,22.0729,3.4522,21.9005)", "span": { - "offset": 5232, + "offset": 5062, "length": 0 } }, @@ -9034,9 +8537,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2246,21.9678,17.5084,21.8016,17.5084,22.4069,6.2246,22.5612)", + "source": "D(1,16.5568,21.3677,18.259,21.3833,18.2357,22.0886,16.5102,22.0729)", "span": { - "offset": 5242, + "offset": 5072, "length": 0 } }, @@ -9047,9 +8550,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.5084,21.8016,18.8941,21.7779,18.9161,22.3832,17.5084,22.4069)", + "source": "D(1,18.259,21.3833,19.9379,21.4147,19.9145,22.1199,18.2357,22.0886)", "span": { - "offset": 5252, + "offset": 5082, "length": 0 } }, @@ -9060,9 +8563,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.8941,21.7779,20.2798,21.7542,20.3018,22.3713,18.9161,22.3832)", + "source": "D(1,19.9379,21.4147,20.9405,21.4147,20.9172,22.1199,19.9145,22.1199)", "span": { - "offset": 5262, + "offset": 5092, "length": 0 } }, @@ -9073,9 +8576,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.2798,21.7542,21.1156,21.7423,21.1156,22.3595,20.3018,22.3713)", + "source": "D(1,20.9405,21.4147,21.9199,21.4304,21.8732,22.1356,20.9172,22.1199)", "span": { - "offset": 5272, + "offset": 5102, "length": 0 } }, @@ -9086,9 +8589,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.1156,21.7423,21.9075,21.7423,21.9295,22.3476,21.1156,22.3595)", + "source": "D(1,21.9199,21.4304,22.8992,21.4304,22.8759,22.1356,21.8732,22.1356)", "span": { - "offset": 5282, + "offset": 5112, "length": 0 } }, @@ -9099,9 +8602,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.9075,21.7423,22.7433,21.7304,22.7653,22.3476,21.9295,22.3476)", + "source": "D(1,22.8992,21.4304,23.8086,21.4304,23.7853,22.1356,22.8759,22.1356)", "span": { - "offset": 5292, + "offset": 5122, "length": 0 } }, @@ -9112,9 +8615,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.7433,21.7304,23.6231,21.7304,23.6451,22.3357,22.7653,22.3476)", + "source": "D(1,23.8086,21.4304,24.6714,21.4304,24.6247,22.1356,23.7853,22.1356)", "span": { - "offset": 5302, + "offset": 5132, "length": 0 } }, @@ -9125,9 +8628,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.6231,21.7304,24.4369,21.7185,24.459,22.3238,23.6451,22.3357)", + "source": "D(1,24.6714,21.4304,25.5808,21.446,25.5341,22.1512,24.6247,22.1356)", "span": { - "offset": 5312, + "offset": 5142, "length": 0 } }, @@ -9138,9 +8641,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.4369,21.7185,25.2948,21.7067,25.3168,22.312,24.459,22.3238)", + "source": "D(1,25.5808,21.446,26.4902,21.4617,26.4435,22.1669,25.5341,22.1512)", "span": { - "offset": 5322, + "offset": 5152, "length": 0 } }, @@ -9151,9 +8654,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.2948,21.7067,26.0646,21.6948,26.0866,22.3001,25.3168,22.312)", + "source": "D(1,26.4902,21.4617,27.4229,21.4774,27.3762,22.1826,26.4435,22.1669)", "span": { - "offset": 5332, + "offset": 5162, "length": 0 } }, @@ -9164,9 +8667,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.0646,21.6948,26.9664,21.6829,26.9884,22.2882,26.0866,22.3001)", + "source": "D(1,27.4229,21.4774,28.239,21.4774,28.1924,22.1826,27.3762,22.1826)", "span": { - "offset": 5342, + "offset": 5172, "length": 0 } }, @@ -9177,9 +8680,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9664,21.6829,27.7363,21.6711,27.7583,22.2764,26.9884,22.2882)", + "source": "D(1,28.239,21.4774,29.1018,21.4931,29.0551,22.1982,28.1924,22.1826)", "span": { - "offset": 5352, + "offset": 5182, "length": 0 } }, @@ -9190,9 +8693,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.7363,21.6711,28.6161,21.6592,28.6381,22.2645,27.7583,22.2764)", + "source": "D(1,29.1018,21.4931,29.9412,21.4931,29.8946,22.1982,29.0551,22.1982)", "span": { - "offset": 5362, + "offset": 5192, "length": 0 } }, @@ -9203,9 +8706,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.6161,21.6592,29.4519,21.6473,29.4739,22.2526,28.6381,22.2645)", + "source": "D(1,29.9412,21.4931,31.3403,21.4931,31.2703,22.1982,29.8946,22.1982)", "span": { - "offset": 5372, + "offset": 5202, "length": 0 } }, @@ -9216,9 +8719,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4519,21.6473,31.0136,21.6236,31.0356,22.2408,29.4739,22.2526)", + "source": "D(1,31.3403,21.4931,32.0165,21.4931,31.9698,22.1982,31.2703,22.1982)", "span": { - "offset": 5382, + "offset": 5212, "length": 0 } }, @@ -9229,9 +8732,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,31.0136,21.6236,33.1472,21.5999,33.1692,22.2052,31.0356,22.2408)", + "source": "D(1,32.0165,21.4931,33.3922,21.4774,33.3456,22.1826,31.9698,22.1982)", "span": { - "offset": 5392, + "offset": 5222, "length": 0 } }, @@ -9241,15 +8744,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "19", - "source": "D(1,1.3636,22.6562,2.5074,22.6324,2.5074,23.2259,1.3636,23.2496)", + "content": "", + "source": "D(1,0,21.8222,1.7267,21.8692,1.7267,22.5587,0,22.5117)", "span": { - "offset": 5413, - "length": 2 - }, - "elements": [ - "/paragraphs/80" - ] + "offset": 5243, + "length": 0 + } }, { "kind": "content", @@ -9258,9 +8758,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.5074,22.6324,4.619,22.5968,4.641,23.1903,2.5074,23.2259)", + "source": "D(1,1.7267,21.8692,3.4522,21.9005,3.4522,22.6057,1.7267,22.5587)", "span": { - "offset": 5425, + "offset": 5253, "length": 0 } }, @@ -9271,9 +8771,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.619,22.5968,6.2246,22.5612,6.2466,23.1665,4.641,23.1903)", + "source": "D(1,3.4522,21.9005,16.5102,22.0729,16.4868,22.7624,3.4522,22.6057)", "span": { - "offset": 5435, + "offset": 5263, "length": 0 } }, @@ -9284,9 +8784,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2246,22.5612,17.5084,22.4069,17.5304,23.0122,6.2466,23.1665)", + "source": "D(1,16.5102,22.0729,18.2357,22.0886,18.189,22.7937,16.4868,22.7624)", "span": { - "offset": 5445, + "offset": 5273, "length": 0 } }, @@ -9297,9 +8797,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.5084,22.4069,18.9161,22.3832,18.9161,22.9885,17.5304,23.0122)", + "source": "D(1,18.2357,22.0886,19.9145,22.1199,19.8912,22.8094,18.189,22.7937)", "span": { - "offset": 5455, + "offset": 5283, "length": 0 } }, @@ -9310,9 +8810,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.9161,22.3832,20.3018,22.3713,20.3238,22.9766,18.9161,22.9885)", + "source": "D(1,19.9145,22.1199,20.9172,22.1199,20.8706,22.8094,19.8912,22.8094)", "span": { - "offset": 5465, + "offset": 5293, "length": 0 } }, @@ -9323,9 +8823,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.3018,22.3713,21.1156,22.3595,21.1376,22.9648,20.3238,22.9766)", + "source": "D(1,20.9172,22.1199,21.8732,22.1356,21.8499,22.8251,20.8706,22.8094)", "span": { - "offset": 5475, + "offset": 5303, "length": 0 } }, @@ -9336,9 +8836,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.1156,22.3595,21.9295,22.3476,21.9295,22.9529,21.1376,22.9648)", + "source": "D(1,21.8732,22.1356,22.8759,22.1356,22.8293,22.8251,21.8499,22.8251)", "span": { - "offset": 5485, + "offset": 5313, "length": 0 } }, @@ -9349,9 +8849,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.9295,22.3476,22.7653,22.3476,22.7873,22.9529,21.9295,22.9529)", + "source": "D(1,22.8759,22.1356,23.7853,22.1356,23.762,22.8251,22.8293,22.8251)", "span": { - "offset": 5495, + "offset": 5323, "length": 0 } }, @@ -9362,9 +8862,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.7653,22.3476,23.6451,22.3357,23.6451,22.941,22.7873,22.9529)", + "source": "D(1,23.7853,22.1356,24.6247,22.1356,24.5781,22.8408,23.762,22.8251)", "span": { - "offset": 5505, + "offset": 5333, "length": 0 } }, @@ -9375,9 +8875,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.6451,22.3357,24.459,22.3238,24.4809,22.9291,23.6451,22.941)", + "source": "D(1,24.6247,22.1356,25.5341,22.1512,25.4875,22.8408,24.5781,22.8408)", "span": { - "offset": 5515, + "offset": 5343, "length": 0 } }, @@ -9388,9 +8888,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.459,22.3238,25.3168,22.312,25.3168,22.9291,24.4809,22.9291)", + "source": "D(1,25.5341,22.1512,26.4435,22.1669,26.3969,22.8564,25.4875,22.8408)", "span": { - "offset": 5525, + "offset": 5353, "length": 0 } }, @@ -9401,9 +8901,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.3168,22.312,26.0866,22.3001,26.1086,22.9173,25.3168,22.9291)", + "source": "D(1,26.4435,22.1669,27.3762,22.1826,27.3296,22.8721,26.3969,22.8564)", "span": { - "offset": 5535, + "offset": 5363, "length": 0 } }, @@ -9414,9 +8914,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.0866,22.3001,26.9884,22.2882,27.0104,22.9054,26.1086,22.9173)", + "source": "D(1,27.3762,22.1826,28.1924,22.1826,28.1457,22.8878,27.3296,22.8721)", "span": { - "offset": 5545, + "offset": 5373, "length": 0 } }, @@ -9427,9 +8927,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.9884,22.2882,27.7583,22.2764,27.7803,22.8935,27.0104,22.9054)", + "source": "D(1,28.1924,22.1826,29.0551,22.1982,29.0085,22.8878,28.1457,22.8878)", "span": { - "offset": 5555, + "offset": 5383, "length": 0 } }, @@ -9440,9 +8940,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.7583,22.2764,28.6381,22.2645,28.6601,22.8817,27.7803,22.8935)", + "source": "D(1,29.0551,22.1982,29.8946,22.1982,29.8712,22.9035,29.0085,22.8878)", "span": { - "offset": 5565, + "offset": 5393, "length": 0 } }, @@ -9453,9 +8953,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.6381,22.2645,29.4739,22.2526,29.4959,22.8698,28.6601,22.8817)", + "source": "D(1,29.8946,22.1982,31.2703,22.1982,31.2237,22.8878,29.8712,22.9035)", "span": { - "offset": 5575, + "offset": 5403, "length": 0 } }, @@ -9466,9 +8966,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4739,22.2526,31.0356,22.2408,31.0576,22.8579,29.4959,22.8698)", + "source": "D(1,31.2703,22.1982,31.9698,22.1982,31.9465,22.8878,31.2237,22.8878)", "span": { - "offset": 5585, + "offset": 5413, "length": 0 } }, @@ -9479,9 +8979,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,31.0356,22.2408,33.1692,22.2052,33.1912,22.8223,31.0576,22.8579)", + "source": "D(1,31.9698,22.1982,33.3456,22.1826,33.2989,22.8878,31.9465,22.8878)", "span": { - "offset": 5595, + "offset": 5423, "length": 0 } }, @@ -9491,15 +8991,12 @@ "columnIndex": 0, "rowSpan": 1, "columnSpan": 1, - "content": "20", - "source": "D(1,1.3636,23.2496,2.5074,23.2259,2.5074,23.8312,1.3856,23.843)", + "content": "", + "source": "D(1,0,22.5117,1.7267,22.5587,1.7267,23.2482,0,23.2169)", "span": { - "offset": 5616, - "length": 2 - }, - "elements": [ - "/paragraphs/81" - ] + "offset": 5444, + "length": 0 + } }, { "kind": "content", @@ -9508,9 +9005,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,2.5074,23.2259,4.641,23.1903,4.641,23.7956,2.5074,23.8312)", + "source": "D(1,1.7267,22.5587,3.4522,22.6057,3.4289,23.2952,1.7267,23.2482)", "span": { - "offset": 5628, + "offset": 5454, "length": 0 } }, @@ -9521,9 +9018,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,4.641,23.1903,6.2466,23.1665,6.2466,23.7718,4.641,23.7956)", + "source": "D(1,3.4522,22.6057,16.4868,22.7624,16.4635,23.4676,3.4289,23.2952)", "span": { - "offset": 5638, + "offset": 5464, "length": 0 } }, @@ -9534,9 +9031,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,6.2466,23.1665,17.5304,23.0122,17.5523,23.6175,6.2466,23.7718)", + "source": "D(1,16.4868,22.7624,18.189,22.7937,18.1657,23.4833,16.4635,23.4676)", "span": { - "offset": 5648, + "offset": 5474, "length": 0 } }, @@ -9547,9 +9044,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.5304,23.0122,18.9161,22.9885,18.9381,23.6057,17.5523,23.6175)", + "source": "D(1,18.189,22.7937,19.8912,22.8094,19.8679,23.499,18.1657,23.4833)", "span": { - "offset": 5658, + "offset": 5484, "length": 0 } }, @@ -9560,9 +9057,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.9161,22.9885,20.3238,22.9766,20.3238,23.5819,18.9381,23.6057)", + "source": "D(1,19.8912,22.8094,20.8706,22.8094,20.8473,23.5146,19.8679,23.499)", "span": { - "offset": 5668, + "offset": 5494, "length": 0 } }, @@ -9573,9 +9070,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.3238,22.9766,21.1376,22.9648,21.1376,23.5819,20.3238,23.5819)", + "source": "D(1,20.8706,22.8094,21.8499,22.8251,21.8266,23.5146,20.8473,23.5146)", "span": { - "offset": 5678, + "offset": 5504, "length": 0 } }, @@ -9586,9 +9083,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.1376,22.9648,21.9295,22.9529,21.9515,23.5701,21.1376,23.5819)", + "source": "D(1,21.8499,22.8251,22.8293,22.8251,22.806,23.5146,21.8266,23.5146)", "span": { - "offset": 5688, + "offset": 5514, "length": 0 } }, @@ -9599,9 +9096,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,21.9295,22.9529,22.7873,22.9529,22.7873,23.5582,21.9515,23.5701)", + "source": "D(1,22.8293,22.8251,23.762,22.8251,23.7387,23.5303,22.806,23.5146)", "span": { - "offset": 5698, + "offset": 5524, "length": 0 } }, @@ -9612,9 +9109,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,22.7873,22.9529,23.6451,22.941,23.6671,23.5463,22.7873,23.5582)", + "source": "D(1,23.762,22.8251,24.5781,22.8408,24.5315,23.5303,23.7387,23.5303)", "span": { - "offset": 5708, + "offset": 5534, "length": 0 } }, @@ -9625,9 +9122,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,23.6451,22.941,24.4809,22.9291,24.5029,23.5344,23.6671,23.5463)", + "source": "D(1,24.5781,22.8408,25.4875,22.8408,25.4642,23.5303,24.5315,23.5303)", "span": { - "offset": 5718, + "offset": 5544, "length": 0 } }, @@ -9638,9 +9135,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,24.4809,22.9291,25.3168,22.9291,25.3388,23.5226,24.5029,23.5344)", + "source": "D(1,25.4875,22.8408,26.3969,22.8564,26.3736,23.546,25.4642,23.5303)", "span": { - "offset": 5728, + "offset": 5554, "length": 0 } }, @@ -9651,9 +9148,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,25.3168,22.9291,26.1086,22.9173,26.1306,23.5107,25.3388,23.5226)", + "source": "D(1,26.3969,22.8564,27.3296,22.8721,27.283,23.5616,26.3736,23.546)", "span": { - "offset": 5738, + "offset": 5564, "length": 0 } }, @@ -9664,9 +9161,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,26.1086,22.9173,27.0104,22.9054,27.0324,23.5107,26.1306,23.5107)", + "source": "D(1,27.3296,22.8721,28.1457,22.8878,28.0991,23.5773,27.283,23.5616)", "span": { - "offset": 5748, + "offset": 5574, "length": 0 } }, @@ -9677,9 +9174,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.0104,22.9054,27.7803,22.8935,27.8023,23.4988,27.0324,23.5107)", + "source": "D(1,28.1457,22.8878,29.0085,22.8878,28.9618,23.593,28.0991,23.5773)", "span": { - "offset": 5758, + "offset": 5584, "length": 0 } }, @@ -9690,9 +9187,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,27.7803,22.8935,28.6601,22.8817,28.6821,23.487,27.8023,23.4988)", + "source": "D(1,29.0085,22.8878,29.8712,22.9035,29.8246,23.593,28.9618,23.593)", "span": { - "offset": 5768, + "offset": 5594, "length": 0 } }, @@ -9703,9 +9200,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,28.6601,22.8817,29.4959,22.8698,29.5179,23.4751,28.6821,23.487)", + "source": "D(1,29.8712,22.9035,31.2237,22.8878,31.177,23.593,29.8246,23.593)", "span": { - "offset": 5778, + "offset": 5604, "length": 0 } }, @@ -9716,9 +9213,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,29.4959,22.8698,31.0576,22.8579,31.0796,23.4514,29.5179,23.4751)", + "source": "D(1,31.2237,22.8878,31.9465,22.8878,31.8999,23.5773,31.177,23.593)", "span": { - "offset": 5788, + "offset": 5614, "length": 0 } }, @@ -9729,9 +9226,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,31.0576,22.8579,33.1912,22.8223,33.2132,23.4276,31.0796,23.4514)", + "source": "D(1,31.9465,22.8878,33.2989,22.8878,33.2523,23.5773,31.8999,23.5773)", "span": { - "offset": 5798, + "offset": 5624, "length": 0 } }, @@ -9740,32 +9237,29 @@ "rowIndex": 21, "columnIndex": 0, "rowSpan": 1, - "columnSpan": 1, - "content": "4", - "source": "D(1,1.3856,23.843,2.5074,23.8312,2.5294,24.7332,1.4076,24.7451)", + "columnSpan": 3, + "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", + "source": "D(1,0,23.2169,16.4635,23.4676,16.4169,24.5019,0,24.2512)", "span": { - "offset": 5819, - "length": 1 + "offset": 5657, + "length": 40 }, "elements": [ - "/paragraphs/82" + "/paragraphs/75" ] }, { "kind": "content", "rowIndex": 21, - "columnIndex": 1, + "columnIndex": 3, "rowSpan": 1, - "columnSpan": 3, - "content": "LAST LINE COMPLETED (MUST BE 20 OR LESS)", - "source": "D(1,2.5074,23.8312,17.5523,23.6175,17.5743,24.5077,2.5294,24.7332)", + "columnSpan": 1, + "content": "", + "source": "D(1,16.4635,23.4676,18.1657,23.4833,18.1191,24.5176,16.4169,24.5019)", "span": { - "offset": 5842, - "length": 40 - }, - "elements": [ - "/paragraphs/83" - ] + "offset": 5707, + "length": 0 + } }, { "kind": "content", @@ -9774,9 +9268,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,17.5523,23.6175,18.9381,23.6057,18.9381,24.4958,17.5743,24.5077)", + "source": "D(1,18.1657,23.4833,19.8679,23.499,19.8213,24.5332,18.1191,24.5176)", "span": { - "offset": 5892, + "offset": 5717, "length": 0 } }, @@ -9787,9 +9281,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,18.9381,23.6057,20.3238,23.5819,20.3458,24.4721,18.9381,24.4958)", + "source": "D(1,19.8679,23.499,20.8473,23.5146,20.8006,24.5489,19.8213,24.5332)", "span": { - "offset": 5902, + "offset": 5727, "length": 0 } }, @@ -9800,9 +9294,9 @@ "rowSpan": 1, "columnSpan": 1, "content": "", - "source": "D(1,20.3238,23.5819,21.1376,23.5819,21.1596,24.4602,20.3458,24.4721)", + "source": "D(1,20.8473,23.5146,21.8266,23.5146,21.78,24.5489,20.8006,24.5489)", "span": { - "offset": 5912, + "offset": 5737, "length": 0 } }, @@ -9811,34 +9305,125 @@ "rowIndex": 21, "columnIndex": 7, "rowSpan": 1, - "columnSpan": 12, + "columnSpan": 1, + "content": "", + "source": "D(1,21.8266,23.5146,22.806,23.5146,22.7826,24.5646,21.78,24.5489)", + "span": { + "offset": 5747, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 8, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,22.806,23.5146,23.7387,23.5303,23.692,24.5646,22.7826,24.5646)", + "span": { + "offset": 5757, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 9, + "rowSpan": 1, + "columnSpan": 3, + "content": "", + "source": "D(1,23.7387,23.5303,26.3736,23.546,26.3036,24.5803,23.692,24.5646)", + "span": { + "offset": 5779, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 12, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,26.3736,23.546,27.283,23.5616,27.2363,24.5959,26.3036,24.5803)", + "span": { + "offset": 5789, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 13, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,27.283,23.5616,28.0991,23.5773,28.0291,24.6116,27.2363,24.5959)", + "span": { + "offset": 5799, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 14, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.0991,23.5773,28.9618,23.593,28.8919,24.6273,28.0291,24.6116)", + "span": { + "offset": 5809, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 15, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,28.9618,23.593,29.8246,23.593,29.7546,24.6273,28.8919,24.6273)", + "span": { + "offset": 5819, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 16, + "rowSpan": 1, + "columnSpan": 1, + "content": "", + "source": "D(1,29.8246,23.593,31.177,23.593,31.0838,24.6273,29.7546,24.6273)", + "span": { + "offset": 5829, + "length": 0 + } + }, + { + "kind": "content", + "rowIndex": 21, + "columnIndex": 17, + "rowSpan": 1, + "columnSpan": 2, "content": "", - "source": "D(1,21.1376,23.5819,33.2132,23.4276,33.2572,24.3178,21.1596,24.4602)", + "source": "D(1,31.177,23.593,33.2523,23.5773,33.159,24.6116,31.0838,24.6273)", "span": { - "offset": 5935, + "offset": 5851, "length": 0 } } ], - "source": "D(1,1.0767,11.0484,33.0542,10.4801,33.2592,24.062,1.2675,24.6639)", + "source": "D(1,0.0613,8.0126,34.129,8.3082,33.9709,24.6174,0,24.3045)", "span": { - "offset": 1248, - "length": 4707 + "offset": 845, + "length": 5026 } } - ], - "figures": [ - { - "source": "D(1,1.2774,0.9435,5.7266,0.9413,5.7253,1.8321,1.2756,1.8342)", - "span": { - "offset": 0, - "length": 33 - }, - "elements": [ - "/paragraphs/0" - ], - "id": "1.1" - } ] } ] From 420f9d3d29efc622fc030e289fea2cc6b2397ce2 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 13:08:29 -0500 Subject: [PATCH 24/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 27dc965..f228b8d 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -28,11 +28,11 @@ To setup this tool, you will need to do the following steps: 3. Rename the file **.sample_env** as **.env** 4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - - Ex: "https://user422.services.ai.azure.com" - image - image + - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - - If you have an API Key, it will show up here: image + - If you have an API Key, it will show up here: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - If your service uses AAD, please instead fill this value with your Subscription ID: image - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. From 73c72813e5c582403acf04dabb02032a8c211a3a Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 13:11:22 -0500 Subject: [PATCH 25/50] updated endpoint --- python/di_to_cu_migration_tool/assets/endpoint.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/endpoint.png b/python/di_to_cu_migration_tool/assets/endpoint.png index dacd3d0..52cc6de 100644 --- a/python/di_to_cu_migration_tool/assets/endpoint.png +++ b/python/di_to_cu_migration_tool/assets/endpoint.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fc06f541aa280f123790781264ceb8e178ce1d3aaf666bcc797d2f4c0f829e1 -size 143369 +oid sha256:5f1918d8a142e5ba3758583d5e3bbba416e3676668cbca3cea31fad1f22b82e0 +size 198645 From dd918b37dcd86a82085eae0204666e77fb7410a5 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 13:51:47 -0500 Subject: [PATCH 26/50] Update README.md setup done --- python/di_to_cu_migration_tool/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index f228b8d..ed24601 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -30,10 +30,10 @@ To setup this tool, you will need to do the following steps: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/73c72813e5c582403acf04dabb02032a8c211a3a/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - If you have an API Key, it will show up here: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - - If your service uses AAD, please instead fill this value with your Subscription ID: image + - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/subscription-id.png "Azure AI Service Subscription ID") - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. ## How to Find Your CustomGen DI Dataset in Azure Portal From e7eb604655b28fd8854a345729bf908376ae4bee Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 14:58:21 -0500 Subject: [PATCH 27/50] updated endpoint --- python/di_to_cu_migration_tool/assets/endpoint.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/endpoint.png b/python/di_to_cu_migration_tool/assets/endpoint.png index 52cc6de..26fa28d 100644 --- a/python/di_to_cu_migration_tool/assets/endpoint.png +++ b/python/di_to_cu_migration_tool/assets/endpoint.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f1918d8a142e5ba3758583d5e3bbba416e3676668cbca3cea31fad1f22b82e0 -size 198645 +oid sha256:98569730f5c4b7dd22c7a028deabdf168188a790f4b4794f0d4a2f4ae55fa0b1 +size 142364 From cfe7f0645fd72462ee60b3ed54609142d513b2a6 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 15:20:17 -0500 Subject: [PATCH 28/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index ed24601..9739f9a 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -30,7 +30,7 @@ To setup this tool, you will need to do the following steps: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/73c72813e5c582403acf04dabb02032a8c211a3a/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/e7eb604655b28fd8854a345729bf908376ae4bee/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - If you have an API Key, it will show up here: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/subscription-id.png "Azure AI Service Subscription ID") From b57d76e64bb0d10537bcbabfb184e42481265234 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 15:21:50 -0500 Subject: [PATCH 29/50] added in other images --- python/di_to_cu_migration_tool/assets/analyzer.png | 3 +++ python/di_to_cu_migration_tool/assets/azure-portal.png | 3 +++ python/di_to_cu_migration_tool/assets/connected-resources.png | 3 +++ python/di_to_cu_migration_tool/assets/endpoint.png | 4 ++-- python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png | 3 +++ python/di_to_cu_migration_tool/assets/generate-sas.png | 3 +++ .../assets/individual-file-generate-sas.png | 3 +++ python/di_to_cu_migration_tool/assets/management-center.png | 3 +++ python/di_to_cu_migration_tool/assets/storage-browser.png | 3 +++ 9 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 python/di_to_cu_migration_tool/assets/analyzer.png create mode 100644 python/di_to_cu_migration_tool/assets/azure-portal.png create mode 100644 python/di_to_cu_migration_tool/assets/connected-resources.png create mode 100644 python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png create mode 100644 python/di_to_cu_migration_tool/assets/generate-sas.png create mode 100644 python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png create mode 100644 python/di_to_cu_migration_tool/assets/management-center.png create mode 100644 python/di_to_cu_migration_tool/assets/storage-browser.png diff --git a/python/di_to_cu_migration_tool/assets/analyzer.png b/python/di_to_cu_migration_tool/assets/analyzer.png new file mode 100644 index 0000000..290fed6 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/analyzer.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11e2d9525ace1bc263a5c6ebc28793aa724c079fbd85f8ab617adc2085d7d813 +size 16854 diff --git a/python/di_to_cu_migration_tool/assets/azure-portal.png b/python/di_to_cu_migration_tool/assets/azure-portal.png new file mode 100644 index 0000000..3dec88b --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/azure-portal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:067809e24ec5c68a1b6b0f2682a79a969d08300fb931a830832dc154ac0c7cb0 +size 104158 diff --git a/python/di_to_cu_migration_tool/assets/connected-resources.png b/python/di_to_cu_migration_tool/assets/connected-resources.png new file mode 100644 index 0000000..09a3726 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/connected-resources.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ec94f73c6b428ea3feb60e9f9cd77766471ca37b6fcdb613999633b974cefeb +size 26239 diff --git a/python/di_to_cu_migration_tool/assets/endpoint.png b/python/di_to_cu_migration_tool/assets/endpoint.png index 26fa28d..9b823cd 100644 --- a/python/di_to_cu_migration_tool/assets/endpoint.png +++ b/python/di_to_cu_migration_tool/assets/endpoint.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:98569730f5c4b7dd22c7a028deabdf168188a790f4b4794f0d4a2f4ae55fa0b1 -size 142364 +oid sha256:2832159f2660b32c9489616366f48717107db2ca82da3f8f8c0bbaf0b0f525dc +size 156359 diff --git a/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png b/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png new file mode 100644 index 0000000..79283a2 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0457ebf63bcac1f487701924cecbdc02a2d1e818c60b2f27e33e8913716899d1 +size 123127 diff --git a/python/di_to_cu_migration_tool/assets/generate-sas.png b/python/di_to_cu_migration_tool/assets/generate-sas.png new file mode 100644 index 0000000..b9f982d --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/generate-sas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed66df772c100a8eceb5c69e2f683c63c409f024f02cfb35487da92f334cf82e +size 161483 diff --git a/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png b/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png new file mode 100644 index 0000000..fea50f1 --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cbf9119cb4e5eedfdb7aa56a07d558eacbc620fbf328da2a811b11fd4510c81 +size 101966 diff --git a/python/di_to_cu_migration_tool/assets/management-center.png b/python/di_to_cu_migration_tool/assets/management-center.png new file mode 100644 index 0000000..8abc8ab --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/management-center.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:276dc44fb1e35456f1557e71691295ace92ddd3aac3e25b349669743dae1fe7f +size 55871 diff --git a/python/di_to_cu_migration_tool/assets/storage-browser.png b/python/di_to_cu_migration_tool/assets/storage-browser.png new file mode 100644 index 0000000..8d94bda --- /dev/null +++ b/python/di_to_cu_migration_tool/assets/storage-browser.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:396aaf5ac8ef462fe66720c872b359317d23a327c0c916731183fedf40fa5fff +size 102124 From 114416b53a9e1485927f01d6631efe2da4058bf8 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 15:32:35 -0500 Subject: [PATCH 30/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 9739f9a..ce170f9 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -39,15 +39,15 @@ To setup this tool, you will need to do the following steps: ## How to Find Your CustomGen DI Dataset in Azure Portal If you are trying to migrate Document Extraction dataset from AI Foundry (customGen), please also refer to the following steps: 1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/management-center.png "Management Center") 2. When you get to the Management Center, you should see a section for Connected Resources. Please select "View All". - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/connected-resources.png "Connected Resources") 3. This page shows you all the Azure resources and their locations. The "Target" refers to the URL for each Resource. None of these resources are the location of your DI dataset, but instead will lead us to it. We want to pay particular intention to the resources that are of type Blob Storage. The target of these Blob Storages will be the same, apart from the suffix of "-blobstore" on one of the resources. - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/manage-connections.png "Manage Connections") Using the above image, the yellow highlight shows the storage account that your DI dataset is located in. Additionally, your DI dataset's blob container will be the blue highlight + "-di". Using these two values, please navigate to the above mentioned blob container. From there, you will notice a labelingProjects folder and inside a folder with the same name as the blue highlight. Inside this will be a data folder, which will contain the contents of your Document Extraction project. Please refer to this as your source. For the example Document Extraction project, this will be where the Document Extraction project is stored: - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/azure-portal.png "Azure Portal") ## How to Find Your Source and Target SAS URLs To run the following tools, you will need to specify your source and target SAS URLs, along with their folder prefix. @@ -56,9 +56,9 @@ To clarify, your source refers to the location of your DI dataset and your targe To find any SAS URL: 1. Navigate to the storage account in Azure Portal and click on "Storage Browser" on the left-hand side - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/storage-browser.png "Storage Browser") 2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/generate-sas.png "Generate SAS") 3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. For the DI dataset, please select the following permissions from the drop-down: _**Read & List**_ @@ -67,12 +67,12 @@ To find any SAS URL: Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" - image + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png "Generate SAS Pop-Up") This URL is what you will use when you have to specify any of the container url arguments To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." -image +![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png "Generate SAS for Individual File") And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. @@ -108,9 +108,11 @@ To create an analyzer using the converted CU analyzer.json, please run this comm python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. +In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. -Ex: image +Ex: + +![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/analyzer.png "Sample Analyzer Creation") ### 3. Calling Analyze From d277e1756aea2909b24dfea90a803899ddffa13e Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 15:36:10 -0500 Subject: [PATCH 31/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index ce170f9..1ff6231 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -108,6 +108,8 @@ To create an analyzer using the converted CU analyzer.json, please run this comm python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName +Your analyzer.json will be stored in your target storage account's target container, specifically in the target blob folder that you have specified. Please get the SAS URL for the analyzer.json file from there. + In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. Ex: From c4bf717a0c3ba2a1e7f433d1640e4b7582c28c89 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 16:33:12 -0500 Subject: [PATCH 32/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 1ff6231..89a7e51 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -61,9 +61,9 @@ To find any SAS URL: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/generate-sas.png "Generate SAS") 3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. - For the DI dataset, please select the following permissions from the drop-down: _**Read & List**_ + For the DI dataset, which is your source, please select the following permissions from the drop-down: _**Read & List**_ - For the CU dataset, please select the following permissions from the drop-down: _**Read, Add, Create, & Write**_ + For the CU dataset, which is your target, please select the following permissions from the drop-down: _**Read, Add, Create, & Write**_ Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" From 62b9642072bdddc7c1ff1541fb4b0319ce87c856 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 16:33:46 -0500 Subject: [PATCH 33/50] updated to show no subscription id --- .../di_to_cu_migration_tool/assets/sample-azure-resource.png | 4 ++-- python/di_to_cu_migration_tool/assets/subscription-id.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/sample-azure-resource.png b/python/di_to_cu_migration_tool/assets/sample-azure-resource.png index e23780b..8f33960 100644 --- a/python/di_to_cu_migration_tool/assets/sample-azure-resource.png +++ b/python/di_to_cu_migration_tool/assets/sample-azure-resource.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6208088a3bab0f171e85ef55a9ee42a3acfd67dc1d2ad5303b395eb678ebee64 -size 124709 +oid sha256:cdfe599f34c1d5af3ade7a8ad33d146016891ed01039dee536758f60b99e3c5d +size 89390 diff --git a/python/di_to_cu_migration_tool/assets/subscription-id.png b/python/di_to_cu_migration_tool/assets/subscription-id.png index 47d4e4b..284a52c 100644 --- a/python/di_to_cu_migration_tool/assets/subscription-id.png +++ b/python/di_to_cu_migration_tool/assets/subscription-id.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3207a396aecfdb71e441d574a836a0602b8a6a6fd2e675c3db39b905128a5f4a -size 111465 +oid sha256:fd7e78e2946186ed744254ea2852ca0f607cf02e919802a412efd63a074c7d73 +size 89186 From 893efe5caf6965e551c1acfbd4b261239017a0e0 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 16:36:01 -0500 Subject: [PATCH 34/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 89a7e51..1f0a667 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -29,11 +29,11 @@ To setup this tool, you will need to do the following steps: 4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") + ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/62b9642072bdddc7c1ff1541fb4b0319ce87c856/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/e7eb604655b28fd8854a345729bf908376ae4bee/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - If you have an API Key, it will show up here: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/subscription-id.png "Azure AI Service Subscription ID") + - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/62b9642072bdddc7c1ff1541fb4b0319ce87c856/python/di_to_cu_migration_tool/assets/subscription-id.png "Azure AI Service Subscription ID") - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. ## How to Find Your CustomGen DI Dataset in Azure Portal From 59f9448a0b92993e1443631e32049cd9cb323b38 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 16:38:11 -0500 Subject: [PATCH 35/50] using analyzer for individual file now --- .../assets/individual-file-generate-sas.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png b/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png index fea50f1..f368175 100644 --- a/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png +++ b/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6cbf9119cb4e5eedfdb7aa56a07d558eacbc620fbf328da2a811b11fd4510c81 -size 101966 +oid sha256:6c77fd2ca0908c3d7cd2b8d1c7cf08ae3423295c1b668bd5bed0e3a3a529ff02 +size 92216 From 3282aab148aa21481c957cc4c4daacc9ba183271 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 16:41:01 -0500 Subject: [PATCH 36/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 1f0a667..94e52ac 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -72,7 +72,7 @@ To find any SAS URL: This URL is what you will use when you have to specify any of the container url arguments To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." -![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png "Generate SAS for Individual File") +![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/3b2ed720f19980e604646094788207bfd24b6ba8/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png "Generate SAS for Individual File") And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. @@ -105,8 +105,10 @@ _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ To create an analyzer using the converted CU analyzer.json, please run this command: - python ./create_analyzer.py --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" - --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName + python ./create_analyzer.py + --analyzer-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer/cuDatasetFolderName/analyzer.json?targetSASToken" + --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" + --target-blob-folder cuDatasetFolderName Your analyzer.json will be stored in your target storage account's target container, specifically in the target blob folder that you have specified. Please get the SAS URL for the analyzer.json file from there. @@ -120,7 +122,8 @@ Ex: To Analyze a specific PDF or original file, please run this command: - python ./call_analyze.py --analyzer-id mySampleAnalyzer --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken + python ./call_analyze.py --analyzer-id mySampleAnalyzer + --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken --output-json "./desired-path-to-analyzer-results.json" For the --analyzer-id argument, please input the analyzer ID of the created Analyzer. From 01351fe9b8560def22687bb76a1368c44ed20be4 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 16:46:46 -0500 Subject: [PATCH 37/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 94e52ac..f6ca564 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -134,7 +134,7 @@ These are some issues that you might encounter when creating an analyzer or call ### Creating an Analyzer If you get a **400** Error, please be sure to check these following items: - Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ -- Make sure that all your fields in your analyzer.json meet these naming requirements +- Make sure that all your fields in your analyzer.json meet these naming requirements. Your converted dataset might not work because CU has more naming constraints, thus you might need to manually make these changes. - Starts only with a letter or an underscore - Is in between 1 to 64 characters long From 456b56f2eef7d37f84d16c92c65a61cea5788f59 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Wed, 28 May 2025 16:52:04 -0500 Subject: [PATCH 38/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index f6ca564..b95780f 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -29,25 +29,25 @@ To setup this tool, you will need to do the following steps: 4. Replace the following values in your **.env** file as such: - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/62b9642072bdddc7c1ff1541fb4b0319ce87c856/python/di_to_cu_migration_tool/assets/sample-azure-resource.png "Azure AI Service") - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/e7eb604655b28fd8854a345729bf908376ae4bee/python/di_to_cu_migration_tool/assets/endpoint.png "Azure AI Service Enpoints") + ![Alt text](assets/sample-azure-resource.png "Azure AI Service") + ![Alt text](ssets/endpoint.png "Azure AI Service Enpoints") - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - - If you have an API Key, it will show up here: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/6a0381c3ffc11f48eda3386f69673ddb11d12eab/python/di_to_cu_migration_tool/assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/62b9642072bdddc7c1ff1541fb4b0319ce87c856/python/di_to_cu_migration_tool/assets/subscription-id.png "Azure AI Service Subscription ID") + - If you have an API Key, it will show up here: ![Alt text](assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") + - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](assets/subscription-id.png "Azure AI Service Subscription ID") - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. ## How to Find Your CustomGen DI Dataset in Azure Portal If you are trying to migrate Document Extraction dataset from AI Foundry (customGen), please also refer to the following steps: 1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/management-center.png "Management Center") + ![Alt text](assets/management-center.png "Management Center") 2. When you get to the Management Center, you should see a section for Connected Resources. Please select "View All". - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/connected-resources.png "Connected Resources") + ![Alt text](assets/connected-resources.png "Connected Resources") 3. This page shows you all the Azure resources and their locations. The "Target" refers to the URL for each Resource. None of these resources are the location of your DI dataset, but instead will lead us to it. We want to pay particular intention to the resources that are of type Blob Storage. The target of these Blob Storages will be the same, apart from the suffix of "-blobstore" on one of the resources. - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/manage-connections.png "Manage Connections") + ![Alt text](assets/manage-connections.png "Manage Connections") Using the above image, the yellow highlight shows the storage account that your DI dataset is located in. Additionally, your DI dataset's blob container will be the blue highlight + "-di". Using these two values, please navigate to the above mentioned blob container. From there, you will notice a labelingProjects folder and inside a folder with the same name as the blue highlight. Inside this will be a data folder, which will contain the contents of your Document Extraction project. Please refer to this as your source. For the example Document Extraction project, this will be where the Document Extraction project is stored: - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/azure-portal.png "Azure Portal") + ![Alt text](assets/azure-portal.png "Azure Portal") ## How to Find Your Source and Target SAS URLs To run the following tools, you will need to specify your source and target SAS URLs, along with their folder prefix. @@ -56,9 +56,9 @@ To clarify, your source refers to the location of your DI dataset and your targe To find any SAS URL: 1. Navigate to the storage account in Azure Portal and click on "Storage Browser" on the left-hand side - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/storage-browser.png "Storage Browser") + ![Alt text](assets/storage-browser.png "Storage Browser") 2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/generate-sas.png "Generate SAS") + ![Alt text](assets/generate-sas.png "Generate SAS") 3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. For the DI dataset, which is your source, please select the following permissions from the drop-down: _**Read & List**_ @@ -67,12 +67,12 @@ To find any SAS URL: Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" - ![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png "Generate SAS Pop-Up") + ![Alt text](assets/generate-sas-pop-up.png "Generate SAS Pop-Up") This URL is what you will use when you have to specify any of the container url arguments To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." -![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/3b2ed720f19980e604646094788207bfd24b6ba8/python/di_to_cu_migration_tool/assets/individual-file-generate-sas.png "Generate SAS for Individual File") +![Alt text](assets/individual-file-generate-sas.png "Generate SAS for Individual File") And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. @@ -116,7 +116,7 @@ In the output, you will see the analyzer ID of the created Analyzer, please reme Ex: -![Alt text](https://github.com/Azure-Samples/azure-ai-content-understanding-python/blob/b57d76e64bb0d10537bcbabfb184e42481265234/python/di_to_cu_migration_tool/assets/analyzer.png "Sample Analyzer Creation") +![Alt text](assets/analyzer.png "Sample Analyzer Creation") ### 3. Calling Analyze From 9cd0b1d1fa99630f03434ae4bbff765145554f9f Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Wed, 28 May 2025 16:56:17 -0500 Subject: [PATCH 39/50] adjusting storage browser --- python/di_to_cu_migration_tool/assets/storage-browser.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/storage-browser.png b/python/di_to_cu_migration_tool/assets/storage-browser.png index 8d94bda..2e03a5f 100644 --- a/python/di_to_cu_migration_tool/assets/storage-browser.png +++ b/python/di_to_cu_migration_tool/assets/storage-browser.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:396aaf5ac8ef462fe66720c872b359317d23a327c0c916731183fedf40fa5fff -size 102124 +oid sha256:1eaf6f237d05ccc48c240ae09a478a1978d41e35550f41f97d226a4b7cd98205 +size 100290 From 0cfb83dedc6b254c740ecff1f6666de9bf00e0ac Mon Sep 17 00:00:00 2001 From: aainav269 Date: Fri, 30 May 2025 12:48:54 -0500 Subject: [PATCH 40/50] Update README.md updated until setup per Aditi's comments --- python/di_to_cu_migration_tool/README.md | 64 +++++++++++------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index b95780f..5ad6f7a 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -2,41 +2,39 @@ Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format, as seen in AI Foundry. The following DI versions are supported: - DI 3.1/4.0 GA CustomNeural (seen in Document Intelligence Studio) -- DI 4.0 Preview CustomGen (seen in Document Extraction project) +- DI 4.0 Preview CustomGen (seen in Document Field Extraction projects) -To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI CustomNeural is a part of Document Intelligence Studio (i.e. https://documentintelligence.ai.azure.com/studio) and DI CustomGen is only a part of Azure AI Foundry (i.e. https://ai.azure.com/explore/aiservices/vision/document/extraction). -Additionally, we have separate CLI tools to create a CU Analyzer using your provided AI Service endpoint and run Analyze on a given file using your analyzer. +For migration from these DI versions to Content understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. ## Details About the Tools -To give you some additional details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: +To provide you with some further details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: * **di_to_cu_converter.py**: - * This CLI tool handles the conversion of the dataset itself. In other words, it takes your DI dataset and converts it into a CU dataset. What this means is that your fields.json gets converted into analyzer.json, your DI labels.json gets converted into CU labels.json, and your ocr.json gets replaced with result.json. - * To handle the conversion for fields.json and labels.json, we use the cu_converter_customGen.py and cu_converter_customNeural.py python classes. The class used depends on the DI version you have specified. This is why choosing the correct DI version is incredibly important. - * To get the result.json, we take your DI dataset's original files and create a sample analyzer without any fields, allowing us to attain the raw OCR results for each original file via an Analyze request. The logic for this implementation is located in get_ocr.py. + * This CLI tool conducts your first step of migration. The tool refers to your labelled Document Intelligence dataset and converts it into a CU format compatible dataset. Through this tool, we map the following files accordingly: fields.json to analyzer.json, DI labels.json to CU labels.json, and ocr.json to result.json. + * Depending on the DI version you wish to migrate from, we use [cu_converter_customNeural.py](cu_converter_customNeural.py) and [cu_converter_customGen.py](cu_converter_customGen.py) accordingly to convert your fields.json and labels.json files. + * For OCR conversion, the tool creates a sample CU analyzer to gather raw OCR results via an Analyze request for each original file in the DI dataset. Additionally, since the sample analyzer contains no fields, we get the results.json files without any fields as well. For more details, please refer to [get_ocr.py](get_ocr.py). * **create_analyzer.py**: - * This CLI tool handles building an analyzer by calling the Content Understanding REST API. - * With di_to_cu_converter.py, this tool gives us a complete CU dataset. However, to build a model itself, the create_analyzer.py class is needed. - * Additionally, the model will come "trained" as the entire converted CU dataset will be referenced when building the analyzer. + * Once the dataset is converted to CU format, this CLI tool creates a CU analyzer while referring to the converted dataset. * **call_analyze.py**: - * This CLI tool handles analyzing a given PDF file by utilizing the previously created analyzer. - * This is a great way to "test" the model by utilizing the Content Understanding REST API. + * This CLI tool can be used to ensure that the migration has successfully completed and to test the quality of the previously created analyzer. ## Setup To setup this tool, you will need to do the following steps: 1. Run the requirements.txt file to install the needed dependencies via **pip install -r ./requirements.txt** -3. Rename the file **.sample_env** as **.env** -4. Replace the following values in your **.env** file as such: - - **HOST:** Replace this with your Azure AI Service's AI Foundry endpoint. Be sure to remove the "/" at the end. - - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" +2. Rename the file **.sample_env** to **.env** +3. Replace the following values in the **.env** file: + - **HOST:** Update this to your Azure AI service endpoint. + - Ex: "https://sample-azure-ai-resource.services.ai.azure.com". + - Avoid the "/" at the end. ![Alt text](assets/sample-azure-resource.png "Azure AI Service") - ![Alt text](ssets/endpoint.png "Azure AI Service Enpoints") - - **SUBSCRIPTION_KEY:** Replace this with your Azure AI Service's API Key or Subscription ID. This is used to identify and authenticate the API request. - - If you have an API Key, it will show up here: ![Alt text](assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") - - If your service uses AAD, please instead fill this value with your Subscription ID: ![Alt text](assets/subscription-id.png "Azure AI Service Subscription ID") - - **API_VERSION:** Please leave this value as is. This ensures that you are converting to a CU Preview.2 dataset. + ![Alt text](assets/endpoint.png "Azure AI Service Enpoints") + - **SUBSCRIPTION_KEY:** Update this to your Azure AI Service's API Key or Subscription ID to identify and authenticate the API request. + - You can locate your API KEY here: ![Alt text](assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") + - If you are using AAD, please refer to your Subscription ID: ![Alt text](assets/subscription-id.png "Azure AI Service Subscription ID") + - **API_VERSION:** This version ensures that you are converting the dataset to CU Preview.2. No changes are needed here. -## How to Find Your CustomGen DI Dataset in Azure Portal +## How to Find Your Document Field Extraction Dataset in Azure Portal If you are trying to migrate Document Extraction dataset from AI Foundry (customGen), please also refer to the following steps: 1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. ![Alt text](assets/management-center.png "Management Center") @@ -132,7 +130,7 @@ Additionally, specifying the --output-json isn't neccesary. The default location ## Possible Issues These are some issues that you might encounter when creating an analyzer or calling analyze. ### Creating an Analyzer -If you get a **400** Error, please be sure to check these following items: +For any **400** Error, please validate the following: - Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ - Make sure that all your fields in your analyzer.json meet these naming requirements. Your converted dataset might not work because CU has more naming constraints, thus you might need to manually make these changes. @@ -147,14 +145,12 @@ If you get a **401** error, make sure that your API key or subscription ID is co If you get a **409** error while creating your analyzer, that means that you have already created an analyzer with that analyzer ID. Please try using another ID. ### Calling Analyze -If you get a **400** Error, please be sure to check the following items: -- Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview_ -- Make sure that you've specified the correct SAS URL for the document you are analyzing - -If you get a **401** error, make sure that your API key or subscription ID is correct and that you have access to the endpoint you've specified. This is an authentication error. - -If you get a **404** Error while trying to call analyze, that means that there is no analyzer with the analyzer ID you have specified. Please create an analyzer with such an ID. -## Things of Note -- You will need to be using a version of Python above 3.9 -- Fields with FieldType "signature," which are supported in 2024-11-30 Custom Neural, are not supported in the latest version of Content Understanding (2025-05-01-preview), and thus will be ignored when creating the analyzer -- We will only be providing data conversion to CU Preview.2 +- A **400** Error implies a potentially incorrect endpoint or SAS URL. Ensure that your endpoint is valid _(https://yourendpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview)_ and that you are using the correct SAS URL for the document under analysis. +- A **401** Error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. +- A **404** Error implies that no analyzer exists with the analyzer ID you have specified. Mitigate it by calling the correct ID or creating an analyzer with such an ID. + +## Points to Note: +1. Make sure to use Python version 3.9 or above. +2. Signature fieldtypes (such as in custom extraction model version 4.0) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. +3. When training a model with a CU dataset, the content of the documents will be retained in the CU model metadata under CU service storage, for reference. This is different from how it is in DI. +4. All the data conversion will be for Content Understanding preview.2 version only. From 5404072364f124d0365146347dd9d2416ba78476 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Fri, 30 May 2025 18:07:18 -0500 Subject: [PATCH 41/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 86 ++++++++++++------------ 1 file changed, 42 insertions(+), 44 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 5ad6f7a..aeb4cbe 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -35,67 +35,65 @@ To setup this tool, you will need to do the following steps: - **API_VERSION:** This version ensures that you are converting the dataset to CU Preview.2. No changes are needed here. ## How to Find Your Document Field Extraction Dataset in Azure Portal -If you are trying to migrate Document Extraction dataset from AI Foundry (customGen), please also refer to the following steps: -1. Navigate to the Management Center of your Document Extraction project. It should be on your bottom left. +To migrate your Document Field extraction dataset from AI foundry, please follow the steps below: +1. On the bottom left of your Document Field Extraction project page, please select "Management Center". ![Alt text](assets/management-center.png "Management Center") -2. When you get to the Management Center, you should see a section for Connected Resources. Please select "View All". +2. Now on the Management Center page, please select "View All" from the Connected Resources section. ![Alt text](assets/connected-resources.png "Connected Resources") -3. This page shows you all the Azure resources and their locations. The "Target" refers to the URL for each Resource. None of these resources are the location of your DI dataset, but instead will lead us to it. We want to pay particular intention to the resources that are of type Blob Storage. The target of these Blob Storages will be the same, apart from the suffix of "-blobstore" on one of the resources. +3. Within these resources, look for the resource with type "Azure Blob Storage." This resource's target URL contains the location of your dataset's storage account (in yellow) and blob container (in blue).. ![Alt text](assets/manage-connections.png "Manage Connections") - Using the above image, the yellow highlight shows the storage account that your DI dataset is located in. Additionally, your DI dataset's blob container will be the blue highlight + "-di". - Using these two values, please navigate to the above mentioned blob container. From there, you will notice a labelingProjects folder and inside a folder with the same name as the blue highlight. Inside this will be a data folder, which will contain the contents of your Document Extraction project. Please refer to this as your source. - For the example Document Extraction project, this will be where the Document Extraction project is stored: + Using these values, navigate to your blob container. Then, select the "labelingProjects" folder. From there, select the folder with the same name as the blob container. Here, you'll localte all the contents of your project in the "data" folder. + + For example, the sample Document Extraction project is stored at: ![Alt text](assets/azure-portal.png "Azure Portal") ## How to Find Your Source and Target SAS URLs -To run the following tools, you will need to specify your source and target SAS URLs, along with their folder prefix. -To clarify, your source refers to the location of your DI dataset and your target refers to the location you wish to store your CU dataset at. +To run migration, you will need to specify the source SAS URL (location of your Document Intelligence dataset) and target SAS URL (location for your Content Understanding dataset). -To find any SAS URL: +To locate the SAS URL for a file or folder for any container URL arguments, please follow these steps: -1. Navigate to the storage account in Azure Portal and click on "Storage Browser" on the left-hand side +1. Navigate to your storage account in Azure Portal and from the left pane, select "Storage Browser" ![Alt text](assets/storage-browser.png "Storage Browser") -2. From here, use the "Blob Containers" to select the container where your dataset either is located (for DI) or should be saved to (for CU). Click on the 3 dots to the side, and select "Generate SAS" +2. Select the source/target blob container for either where your DI dataset is present or your CU dataset will be. Click on the extended menu on the side and select "Generate SAS." ![Alt text](assets/generate-sas.png "Generate SAS") -3. Then, you will be shown a side window where you can configure your permissions and expiry of the SAS URL. +3. Configure the permissions and expiry for your SAS URL accordingly. - For the DI dataset, which is your source, please select the following permissions from the drop-down: _**Read & List**_ + For the DI source dataset, please select these permissions: _**Read & List**_ - For the CU dataset, which is your target, please select the following permissions from the drop-down: _**Read, Add, Create, & Write**_ + For the CU target dataset, please select these permissions: _**Read, Add, Create, & Write**_ - Once configured, please select "Generate SAS Token and URL" & copy the URL shown in "Blob SAS URL" + Once configured, please select "Generate SAS Token and URL" & copy the URL shown under "Blob SAS URL" ![Alt text](assets/generate-sas-pop-up.png "Generate SAS Pop-Up") - This URL is what you will use when you have to specify any of the container url arguments - -To get the SAS URL of a certain file, as you will need for running create_analyzer.py or call_analyze.py, follow the same steps as above. The only difference is you will need to navigate to the specific file to then click on the 3 dots and later, "Generate SAS." -![Alt text](assets/individual-file-generate-sas.png "Generate SAS for Individual File") +Notes: -And lastly, the SAS URL does not specify a specific folder. To ensure that we are reading from and writing to the specific folder you wish, please enter in the DI dataset blob folder or the intended CU dataset folder whenever --source-blob-folder or --target-blob-folder is needed. +- Since SAS URL does not point to a specific folder, to ensure the correct path for source and target, please specify the correct dataset folder as --source-blob-folder or --target-blob-folder. +- To get the SAS URL for a single file, navigate to the specific file and repeat the steps above, such as: + ![Alt text](assets/individual-file-generate-sas.png "Generate SAS for Individual File") ## How to Run -To run the 3 tools, you will need to follow these commands. Since these commands are incredibly long, for easy viewing we've split them into multiple lines. Please remove the extra spaces before running. +To run the 3 tools, please refer to these following commands. For better readability, they are split across lines. Please remove this extra spacing before execution. -_**NOTE:** When entering a URL, please use "" as the examples show you._ +_**NOTE:** Use "" when entering in a URL._ -### 1. Running DI to CU Dataset Conversion +### 1. Converting Document Intelligence to Content Understanding Dataset -To convert a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: +If you are migrating a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -If you are using CustomNeural, please be sure to specify the analyzer prefix, as it is crucial for creating an analyzer. This is because there is no "doc_type" or any identification provided in CustomNeural. The created analyzer will have an analyzer ID of the specified analyzer-prefix. +For Custom Neural migration, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. -To convert a _DI 4.0 Preview CustomGen_, run this command: +If you are migrating a _DI 4.0 Preview CustomGen_ dataset, please run this command: python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -Specifying an analyzerPrefix isn't necessary for CustomGen, but is needed if you wish to create multiple analyzers from the same analyzer.json. This is because the analyzer ID used will be the "doc_type" value specified in the fields.json. However, if an analyzer prefix is provided, the analyzer ID will then become analyzer-prefix_doc-type. +For Custom Gen migration, specifying an analyzer prefix is optional. However, iff you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ @@ -108,15 +106,15 @@ To create an analyzer using the converted CU analyzer.json, please run this comm --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -Your analyzer.json will be stored in your target storage account's target container, specifically in the target blob folder that you have specified. Please get the SAS URL for the analyzer.json file from there. +The analyzer.json file is stored in the specified target blob container and folder. Please get the SAS URL for the analyzer.json file from there. -In the output, you will see the analyzer ID of the created Analyzer, please remember this when using the call_analyze.py tool. +Additionally, please use the analyzer ID from this output when running the call_analyze.py tool. Ex: ![Alt text](assets/analyzer.png "Sample Analyzer Creation") -### 3. Calling Analyze +### 3. Running Analyze To Analyze a specific PDF or original file, please run this command: @@ -124,26 +122,26 @@ To Analyze a specific PDF or original file, please run this command: --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken --output-json "./desired-path-to-analyzer-results.json" -For the --analyzer-id argument, please input the analyzer ID of the created Analyzer. -Additionally, specifying the --output-json isn't neccesary. The default location is "./sample_documents/analyzer_result.json". +For --analyzer-id argument, please refer to the analyzer ID created in the previous step. +Additionally, specifying the --output-json isn't neccesary. The default location for the output is "./sample_documents/analyzer_result.json". ## Possible Issues -These are some issues that you might encounter when creating an analyzer or calling analyze. +These are some issues that you might run into when creating an analyzer or running analyze. ### Creating an Analyzer For any **400** Error, please validate the following: -- Make sure that your endpoint is correct. It should be something like _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ -- Make sure that all your fields in your analyzer.json meet these naming requirements. Your converted dataset might not work because CU has more naming constraints, thus you might need to manually make these changes. - - - Starts only with a letter or an underscore - - Is in between 1 to 64 characters long +- You are using a valid endpoint. Example: _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ +- Your converted CU dataset may not meet the latest naming constraints. Please ensure that all the fields in your analyzer.json file meets these requirements. If not, please make the changes manually. + + - Field name only starts with a letter or an underscore + - Field name length is in between 1 to 64 characters - Only uses letters, numbers, and underscores -- Make sure that your analyzer ID specified meets these naming requirements - - Is in between 1 to 64 characters long +- Your analyzer ID meets these naming requirements + - ID is in between 1 to 64 characters long - Only uses letters, numbers, dots, underscores, and hyphens -If you get a **401** error, make sure that your API key or subscription ID is correct and that you have access to the endpoint you've specified. This is an authentication error. +A **401** Error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. -If you get a **409** error while creating your analyzer, that means that you have already created an analyzer with that analyzer ID. Please try using another ID. +A **409** Error implies that the analyzer ID has already been used to create an analyzer. Please try using another ID. ### Calling Analyze - A **400** Error implies a potentially incorrect endpoint or SAS URL. Ensure that your endpoint is valid _(https://yourendpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview)_ and that you are using the correct SAS URL for the document under analysis. - A **401** Error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. @@ -152,5 +150,5 @@ If you get a **409** error while creating your analyzer, that means that you hav ## Points to Note: 1. Make sure to use Python version 3.9 or above. 2. Signature fieldtypes (such as in custom extraction model version 4.0) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. -3. When training a model with a CU dataset, the content of the documents will be retained in the CU model metadata under CU service storage, for reference. This is different from how it is in DI. +3. When training a model with a CU dataset, the content of the documents will be retained in the CU model metadata, under CU service storage specifically. This is different from how it is in DI. 4. All the data conversion will be for Content Understanding preview.2 version only. From 085f6eef2263c318ef96aacb4936b04a4c4c0ff2 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Mon, 2 Jun 2025 13:03:11 -0500 Subject: [PATCH 42/50] updated endpoint --- python/di_to_cu_migration_tool/README.md | 16 +- .../assets/endpoint.png | 4 +- python/di_to_cu_migration_tool/constants.py | 2 +- ...ustomGen.py => cu_converter_generative.py} | 4 +- ...customNeural.py => cu_converter_neural.py} | 0 .../di_to_cu_converter.py | 36 +- .../field_type_conversion.py | 2 +- .../sample_documents/analyzer_result.json | 424 +++++++++--------- 8 files changed, 244 insertions(+), 244 deletions(-) rename python/di_to_cu_migration_tool/{cu_converter_customGen.py => cu_converter_generative.py} (99%) rename python/di_to_cu_migration_tool/{cu_converter_customNeural.py => cu_converter_neural.py} (100%) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index aeb4cbe..7743b02 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,10 +1,10 @@ # Document Intelligence to Content Understanding Migration Tool (Python) Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format, as seen in AI Foundry. The following DI versions are supported: -- DI 3.1/4.0 GA CustomNeural (seen in Document Intelligence Studio) -- DI 4.0 Preview CustomGen (seen in Document Field Extraction projects) +- Custom Document DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural +- Custom Document 4.0 Preview (2024-07-31-preview) (seen in Document Field Extraction projects) --> DI-version = generative -To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI CustomNeural is a part of Document Intelligence Studio (i.e. https://documentintelligence.ai.azure.com/studio) and DI CustomGen is only a part of Azure AI Foundry (i.e. https://ai.azure.com/explore/aiservices/vision/document/extraction). +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e. https://documentintelligence.ai.azure.com/studio) and DI 4.0 Preview.2 is only a part of Azure AI Foundry (i.e. https://ai.azure.com/explore/aiservices/vision/document/extraction). For migration from these DI versions to Content understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. @@ -12,7 +12,7 @@ For migration from these DI versions to Content understanding Preview.2, this to To provide you with some further details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: * **di_to_cu_converter.py**: * This CLI tool conducts your first step of migration. The tool refers to your labelled Document Intelligence dataset and converts it into a CU format compatible dataset. Through this tool, we map the following files accordingly: fields.json to analyzer.json, DI labels.json to CU labels.json, and ocr.json to result.json. - * Depending on the DI version you wish to migrate from, we use [cu_converter_customNeural.py](cu_converter_customNeural.py) and [cu_converter_customGen.py](cu_converter_customGen.py) accordingly to convert your fields.json and labels.json files. + * Depending on the DI version you wish to migrate from, we use [cu_converter_neural.py](cu_converter_neural.py) and [cu_converter_generative.py](cu_converter_generative.py) accordingly to convert your fields.json and labels.json files. * For OCR conversion, the tool creates a sample CU analyzer to gather raw OCR results via an Analyze request for each original file in the DI dataset. Additionally, since the sample analyzer contains no fields, we get the results.json files without any fields as well. For more details, please refer to [get_ocr.py](get_ocr.py). * **create_analyzer.py**: * Once the dataset is converted to CU format, this CLI tool creates a CU analyzer while referring to the converted dataset. @@ -79,17 +79,17 @@ _**NOTE:** Use "" when entering in a URL._ ### 1. Converting Document Intelligence to Content Understanding Dataset -If you are migrating a _DI 3.1/4.0 GA CustomNeural_ dataset, please run this command: +If you are migrating a _DI 3.1/4.0 GA Custom Document_ dataset, please run this command: - python ./di_to_cu_converter.py --DI-version CustomNeural --analyzer-prefix mySampleAnalyzer + python ./di_to_cu_converter.py --DI-version neural --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName For Custom Neural migration, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. -If you are migrating a _DI 4.0 Preview CustomGen_ dataset, please run this command: +If you are migrating a _DI 4.0 Preview Custom Document_ dataset, please run this command: - python ./di_to_cu_converter.py --DI-version CustomGen --analyzer-prefix mySampleAnalyzer + python ./di_to_cu_converter.py --DI-version generative --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName diff --git a/python/di_to_cu_migration_tool/assets/endpoint.png b/python/di_to_cu_migration_tool/assets/endpoint.png index 9b823cd..dc3acd7 100644 --- a/python/di_to_cu_migration_tool/assets/endpoint.png +++ b/python/di_to_cu_migration_tool/assets/endpoint.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2832159f2660b32c9489616366f48717107db2ca82da3f8f8c0bbaf0b0f525dc -size 156359 +oid sha256:d5bf8f370d9f00ef7cb1837eea492d25631cd85a99aa9086d8e61efa85434261 +size 149579 diff --git a/python/di_to_cu_migration_tool/constants.py b/python/di_to_cu_migration_tool/constants.py index 9712518..09dc972 100644 --- a/python/di_to_cu_migration_tool/constants.py +++ b/python/di_to_cu_migration_tool/constants.py @@ -1,5 +1,5 @@ # Supported DI versions -DI_VERSIONS = ["CustomGen", "CustomNeural"] +DI_VERSIONS = ["generative", "neural"] CU_API_VERSION = "2025-05-01-preview" # constants diff --git a/python/di_to_cu_migration_tool/cu_converter_customGen.py b/python/di_to_cu_migration_tool/cu_converter_generative.py similarity index 99% rename from python/di_to_cu_migration_tool/cu_converter_customGen.py rename to python/di_to_cu_migration_tool/cu_converter_generative.py index e61306e..f27938d 100644 --- a/python/di_to_cu_migration_tool/cu_converter_customGen.py +++ b/python/di_to_cu_migration_tool/cu_converter_generative.py @@ -50,7 +50,7 @@ def format_angle(angle: float) -> float: def convert_fields_to_analyzer(fields_json_path: Path, analyzer_prefix: Optional[str], target_dir: Path, field_definitions: FieldDefinitions) -> dict: """ - Convert DI 4.0 preview CustomGen fields.json to analyzer.json format. + Convert DI 4.0 preview Custom Document fields.json to analyzer.json format. Args: fields_json_path (Path): Path to the input DI fields.json file. analyzer_prefix (Optional(str)): Prefix for the analyzer name. @@ -193,7 +193,7 @@ def recursive_convert_field_to_analyzer_helper(key: str, value: dict, field_defi def convert_di_labels_to_cu(di_labels_path: Path, target_dir: Path) -> None: """ - Convert DI 4.0 preview CustomGen format labels.json to Content Understanding format labels.json. + Convert DI 4.0 preview Custom Document format labels.json to Content Understanding format labels.json. Args: di_labels_path (Path): Path to the Document Intelligence labels.json file. target_dir (Path): Output directory for the Content Understanding labels.json file. diff --git a/python/di_to_cu_migration_tool/cu_converter_customNeural.py b/python/di_to_cu_migration_tool/cu_converter_neural.py similarity index 100% rename from python/di_to_cu_migration_tool/cu_converter_customNeural.py rename to python/di_to_cu_migration_tool/cu_converter_neural.py diff --git a/python/di_to_cu_migration_tool/di_to_cu_converter.py b/python/di_to_cu_migration_tool/di_to_cu_converter.py index 92a41ef..5de14d9 100644 --- a/python/di_to_cu_migration_tool/di_to_cu_converter.py +++ b/python/di_to_cu_migration_tool/di_to_cu_converter.py @@ -15,8 +15,8 @@ # imports from same project from constants import DI_VERSIONS, FIELDS_JSON, LABELS_JSON, MAX_FIELD_COUNT, OCR_JSON, VALIDATION_TXT -import cu_converter_customNeural -import cu_converter_customGen +import cu_converter_neural as cu_converter_neural +import cu_converter_generative as cu_converter_generative from field_definitions import FieldDefinitions import field_type_conversion from get_ocr import run_cu_layout_ocr @@ -38,7 +38,7 @@ def validate_field_count(DI_version, byte_fields) -> Tuple[int, bool]: fields = json.loads(string_fields) field_count = 0 - if DI_version == "CustomGen": + if DI_version == "generative": field_schema = fields["fieldSchema"] if len(field_schema) > MAX_FIELD_COUNT: return len(field_schema), False @@ -81,7 +81,7 @@ def validate_field_count(DI_version, byte_fields) -> Tuple[int, bool]: @app.command() def main( analyzer_prefix: str = typer.Option("", "--analyzer-prefix", help="Prefix for analyzer name."), - DI_version: str = typer.Option("CustomGen", "--DI-version", help="DI versions: CustomGen, CustomNeural"), + DI_version: str = typer.Option("generative", "--DI-version", help="DI versions: generative, neural"), source_container_sas_url: str = typer.Option("", "--source-container-sas-url", help="Source blob container SAS URL."), source_blob_folder: str = typer.Option("", "--source-blob-folder", help="Source blob storage folder prefix."), target_container_sas_url: str = typer.Option("", "--target-container-sas-url", help="Target blob container SAS URL."), @@ -99,7 +99,7 @@ def main( print(f"[yellow]You have specified the following DI version: {DI_version} out of {DI_VERSIONS}.If this is not expected, feel free to change this with the --DI-version parameter.\n[/yellow]") # if DI_version 3.1/4.0 GA Custom Neural, then analyzer prefix needs to be set - if DI_version == "CustomNeural": + if DI_version == "neural": assert analyzer_prefix != "", "Please provide a valid analyzer prefix, since you are using DI 3.1/4.0 GA Custom Neural." # Getting the environmental variables @@ -209,18 +209,18 @@ def running_field_type_conversion(temp_source_dir: Path, temp_dir: Path, DI_vers with fields_path.open("r", encoding="utf-8") as fp: # running field type conversion for fields.json fields = json.load(fp) - if DI_version == "CustomGen": + if DI_version == "generative": converted_fields, converted_field_keys = field_type_conversion.update_unified_schema_fields(fields) with open(str(temp_dir / FIELDS_JSON), "w", encoding="utf-8") as fp: json.dump(converted_fields, fp, ensure_ascii=False, indent=4) - print("[yellow]Successfully handled field type conversion for DI CustomGen fields.json[/yellow]\n") - elif DI_version == "CustomNeural": + print("[yellow]Successfully handled field type conversion for DI 4.0 preview Custom Document fields.json[/yellow]\n") + elif DI_version == "neural": removed_signatures, converted_fields = field_type_conversion.update_fott_fields(fields) with open(str(temp_dir / FIELDS_JSON), "w", encoding="utf-8") as fp: json.dump(converted_fields, fp, ensure_ascii=False, indent=4) - print("[yellow]Successfully handled field type conversion for DI 3.1/4.0 GA CustomNeural fields.json[/yellow]\n") + print("[yellow]Successfully handled field type conversion for DI 3.1/4.0 GA Custom Document fields.json[/yellow]\n") - if DI_version == "CustomGen": + if DI_version == "generative": for file in files: file_path = root_path / file if (file.endswith(LABELS_JSON)): @@ -250,10 +250,10 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str fields_path = root_path / FIELDS_JSON assert fields_path.exists(), "fields.json is needed. Fields.json is missing from the given dataset." - if DI_version == "CustomGen": - analyzer_data = cu_converter_customGen.convert_fields_to_analyzer(fields_path, analyzer_prefix, temp_target_dir, field_definitions) - elif DI_version == "CustomNeural": - analyzer_data, fields_dict = cu_converter_customNeural.convert_fields_to_analyzer_neural(fields_path, analyzer_prefix, temp_target_dir, field_definitions) + if DI_version == "generative": + analyzer_data = cu_converter_generative.convert_fields_to_analyzer(fields_path, analyzer_prefix, temp_target_dir, field_definitions) + elif DI_version == "neural": + analyzer_data, fields_dict = cu_converter_neural.convert_fields_to_analyzer_neural(fields_path, analyzer_prefix, temp_target_dir, field_definitions) ocr_files = [] # List to store paths to pdf files to get OCR results from later for file in files: @@ -262,10 +262,10 @@ def running_cu_conversion(temp_dir: Path, temp_target_dir: Path, DI_version: str continue # Converting DI labels to CU labels if (file.endswith(LABELS_JSON)): - if DI_version == "CustomGen": - cu_converter_customGen.convert_di_labels_to_cu(file_path, temp_target_dir) - elif DI_version == "CustomNeural": - cu_labels = cu_converter_customNeural.convert_di_labels_to_cu_neural(file_path, temp_target_dir, fields_dict, removed_signatures) + if DI_version == "generative": + cu_converter_generative.convert_di_labels_to_cu(file_path, temp_target_dir) + elif DI_version == "neural": + cu_labels = cu_converter_neural.convert_di_labels_to_cu_neural(file_path, temp_target_dir, fields_dict, removed_signatures) # run field type conversion of label files here, because will be easier after getting it into CU format field_type_conversion.update_fott_labels(cu_labels, temp_target_dir / file_path.name) print(f"[green]Successfully converted Document Intelligence labels.json to Content Understanding labels.json at {temp_target_dir/file_path.name}[/green]\n") diff --git a/python/di_to_cu_migration_tool/field_type_conversion.py b/python/di_to_cu_migration_tool/field_type_conversion.py index 4b86e8c..fe65970 100644 --- a/python/di_to_cu_migration_tool/field_type_conversion.py +++ b/python/di_to_cu_migration_tool/field_type_conversion.py @@ -94,7 +94,7 @@ def update_unified_schema_labels( ).get(sub_label_key, []): _update_unified_schema_labels(_sub_label_key, _sub_label_object) with open(str(output_path), "w") as fp: - json.dump(labels, fp, ensure_ascii=False, indent=4) + json.dump(labels, fp, ensure_ascii=True, indent=4) def _update_unified_schema_labels(label_key: str, label_object: dict) -> None: """ diff --git a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json index 89eb1da..bfa151f 100644 --- a/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json +++ b/python/di_to_cu_migration_tool/sample_documents/analyzer_result.json @@ -1,14 +1,14 @@ { - "id": "02b6a48b-e632-4907-b69f-d27677be75a3", + "id": "7860293d-2deb-4733-96b3-2310ca983bdf", "status": "Succeeded", "result": { "analyzerId": "mySampleAnalyzer", "apiVersion": "2025-05-01-preview", - "createdAt": "2025-05-28T16:34:06Z", + "createdAt": "2025-05-30T15:47:15Z", "warnings": [], "contents": [ { - "markdown": "RX SOLUTIONS. ING\nHAND LAKES WAY\n125\nPRAIRIE, TX 75050-0000\n\nREGISTRATION #: KR0191902\nREGISTERED AS: REVERSE DISTRIB\nSCHEDULES: 1,2,2N,3,3N,4,5,\nORDER FORM NUMBER: 231554550\n\nDATE ISSUED. 10162023\nORDER FORM. 1 OF 3.\n\nPART 2: TO BE FILLED IN BY PURCHASER\n\n: CVS PHARMACY # 03896\n\nBUSINESS NAME\n\n9308 KENDALL DR.\n\nSTREET ADDRESS\nCHARLOTTE, NC 28214\n\nCITY, STATE, ZIP CODE\n\nAR8109046\n\n: TO BE FILLED IN BY PURCHASER\n\nGladys Irasema Ruga\n\nDEA.Clerk\n\nNage and Title\n8\n\nby power of attorney\n11/06/2023\n\nRequestingiOfficial (must be atthonzed'to signiorder form)\n\nDate\n\nPART 5:\nTO BE\nFILLED IN BY\nPURCHASER\n\nPART 3: ALTERNATE SUPPLIER IDENTIFICATION - to bf You kly ft: o .p.r\n(name in part 2) if order is endorsed foranother suppker to f.l:\nALTERNATE DEA #\n\nSignature- by first supplier\n\nOFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER\n\n04'T\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
NO. OF PACKAGESPACKAGE SIZE1 NAME OF ITEMNUMBER REC'DDATE REC'DPART4:TO BE FILLED IN BY SUPPLIER NATIONALIDRUG CODENUMBER SHIPPEDDATE SixPFAD
110 .. 000DEXTROAMP-AMPHET' ER 10 MG CAP00406-8952-01TRY11/20/23
13 .000OXYCODONE HCL. (IR)' 20 MG TAB T10702-0057-01/BC1/20/23
1473.000MLLORTAB 10 MG-300 MGY15 ML ELXR17478-0450-161111/29/23
12.000OXYCODONE-ACETAM 10-325 TAB TA42858-01-04-021. BE14/20/20
1.10.000DEXTROAMP-AMPHET ER 30 MG CAP43975-0282-2019911/20/23
11 .000DEXTROAMP-AMPHETAMIN 20 MG TAB64850-0505-0120111/20/23
110. 0001mHYDROCODONE-ACETAMN 7.5-325/1571930-0027-431BE1/20/23
LAST LINE COMPLETED (MUST BE 20 OR LESS)
\n", + "markdown": "RX SOLUTIONS. ING\nHAND LAKES WAY\n125\nPRAIRIE, TX 75050-0000\n\nREGISTRATION #: KR0191902\nREGISTERED AS: REVERSE DISTRIB\nSCHEDULES: 1,2,2N,3,3N,4,5,\nORDER FORM NUMBER: 231554550\n\nDATE ISSUED. 10162023\nORDER FORM. 1 OF 3.\n\nPART 2: TO BE FILLED IN BY PURCHASER\n\n: CVS PHARMACY # 03896\n\nBUSINESS NAME\n\n9308 KENDALL DR.\n\nSTREET ADDRESS\nCHARLOTTE, NC 28214\n\nCITY, STATE, ZIP CODE\n\nAR8109046\n\n: TO BE FILLED IN BY PURCHASER\n\nGladys Irasema Ruga\n\nDEA.Clerk\n\nNage and Title\n8\n\nby power of attorney\n11/06/2023\n\nRequestingiOfficial (must be atthonzed'to signiorder form)\n\nDate\n\nPART 5:\nTO BE\nFILLED IN BY\nPURCHASER\n\nPART 3: ALTERNATE SUPPLIER IDENTIFICATION - to bf You kly ft: o .p.r\n(name in part 2) if order is endorsed foranother suppker to f.l:\nALTERNATE DEA #\n\nSignature- by first supplier\n\nOFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER\n\n04'T\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
NO. OF PACKAGESPACKAGE SIZE1 NAME OF ITEMNUMBER REC'DDATE REC'DPART4:TO BE FILLED IN BY SUPPLIER NATIONALIDRUG CODENUMBER SHIPPEDDATE SixPFAD
110 .. 000DEXTROAMP-AMPHET' ER 10 MG CAP00406-8952-01TRI11/20/23
13 .000OXYCODONE HCL. (IR)' 20 MG TAB T10702-0057-01/BC1/20/23
1473.000MLLORTAB 10 MG-300 MGY15 ML ELXR17478-0450-161111/29/23
12.000OXYCODONE-ACETAM 10-325 TAB TA42858-01-04-021. BE14/20/20
1.10.000DEXTROAMP-AMPHET ER 30 MG CAP43975-0282-2019911/20/23
11 .000DEXTROAMP-AMPHETAMIN 20 MG TAB64850-0505-0120111/20/23
110. 0001mHYDROCODONE-ACETAMN 7.5-325/1571930-0027-431BE1/20/23
LAST LINE COMPLETED (MUST BE 20 OR LESS)
\n", "fields": { "supplier_dea_number": { "type": "string", @@ -19,7 +19,7 @@ "length": 9 } ], - "confidence": 0.482, + "confidence": 0.582, "source": "D(1,27.8109,0.1711,34.0618,0.7163,34.0570,1.7014,27.7851,1.0512)" }, "order_form_number": { @@ -31,7 +31,7 @@ "length": 9 } ], - "confidence": 0.951, + "confidence": 0.946, "source": "D(1,14.2315,2.0309,16.2579,2.0066,16.2579,2.3438,14.2349,2.3769)" }, "print_or_type_name_and_title": { @@ -47,7 +47,7 @@ "length": 9 } ], - "confidence": 0.562, + "confidence": 0.572, "source": "D(1,0.1994,5.6888,4.1336,5.5585,4.1471,5.9648,0.2128,6.0951);D(1,4.7401,5.4898,6.7047,5.4653,6.7047,5.8371,4.7406,5.8579)" }, "date": { @@ -59,7 +59,7 @@ "length": 10 } ], - "confidence": 0.961, + "confidence": 0.959, "source": "D(1,10.8632,6.4914,13.7220,6.4991,13.7220,6.8744,10.8634,6.8742)" }, "last_line_completed": { @@ -81,7 +81,7 @@ "length": 1 } ], - "confidence": 0.758, + "confidence": 0.764, "source": "D(1,0.1454,10.0663,0.3995,10.0750,0.3995,10.4060,0.1475,10.4063)" }, "NumberReceived": { @@ -94,14 +94,14 @@ }, "NumberShipped": { "type": "string", - "valueString": "TRY", + "valueString": "TRI", "spans": [ { "offset": 1381, "length": 3 } ], - "confidence": 0.613, + "confidence": 0.722, "source": "D(1,30.9655,9.9512,32.0469,9.9114,32.0469,10.4970,30.9665,10.5729)" }, "DateShipped": { @@ -113,7 +113,7 @@ "length": 8 } ], - "confidence": 0.894, + "confidence": 0.9, "source": "D(1,32.3628,10.1513,34.0270,10.1415,34.0270,10.6114,32.3613,10.6090)" }, "ShipInfo": { @@ -154,7 +154,7 @@ "length": 3 } ], - "confidence": 0.568, + "confidence": 0.613, "source": "D(1,30.9008,10.6977,31.9253,10.6375,31.9253,11.1358,30.8995,11.2500)" }, "DateShipped": { @@ -187,7 +187,7 @@ "length": 1 } ], - "confidence": 0.764, + "confidence": 0.721, "source": "D(1,0.1624,10.7778,0.3995,10.7799,0.3995,11.1549,0.1671,11.1582)" }, "NumberReceived": { @@ -207,7 +207,7 @@ "length": 2 } ], - "confidence": 0.666, + "confidence": 0.778, "source": "D(1,30.7973,11.4392,31.7169,11.4102,31.7169,11.9391,30.7992,12.0139)" }, "DateShipped": { @@ -241,7 +241,7 @@ } ], "confidence": 0.498, - "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6494)" + "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6495)" }, "NumberReceived": { "type": "string", @@ -260,8 +260,8 @@ "length": 5 } ], - "confidence": 0.536, - "source": "D(1,30.6681,12.1104,31.5770,12.0174,31.6327,12.5617,30.7239,12.6548)" + "confidence": 0.726, + "source": "D(1,30.6681,12.1104,31.5770,12.0174,31.6327,12.5617,30.7238,12.6548)" }, "DateShipped": { "type": "string", @@ -293,7 +293,7 @@ "length": 2 } ], - "confidence": 0.621, + "confidence": 0.652, "source": "D(1,0.2497,12.2349,0.4863,12.2273,0.4863,12.5428,0.2523,12.5437)" }, "NumberReceived": { @@ -313,7 +313,7 @@ "length": 3 } ], - "confidence": 0.856, + "confidence": 0.841, "source": "D(1,30.6173,12.7434,31.5084,12.6859,31.5084,13.1804,30.6196,13.2986)" }, "DateShipped": { @@ -346,7 +346,7 @@ "length": 1 } ], - "confidence": 0.732, + "confidence": 0.767, "source": "D(1,2.1497,12.9734,2.3598,12.9751,2.3591,13.3055,2.1492,13.3033)" }, "NumberReceived": { @@ -366,7 +366,7 @@ "length": 3 } ], - "confidence": 0.86, + "confidence": 0.861, "source": "D(1,31.5980,13.9945,30.6052,14.0596,30.6052,13.4532,31.5982,13.4094)" }, "DateShipped": { @@ -419,7 +419,7 @@ "length": 3 } ], - "confidence": 0.839, + "confidence": 0.857, "source": "D(1,30.6647,14.1383,31.4911,14.0895,31.4911,14.5321,30.6676,14.6181)" }, "DateShipped": { @@ -466,7 +466,7 @@ "pages": [ { "pageNumber": 1, - "angle": 0.8350518, + "angle": 0.8350449, "width": 35.5556, "height": 26.6667, "spans": [ @@ -482,7 +482,7 @@ "offset": 0, "length": 2 }, - "confidence": 0.616, + "confidence": 0.615, "source": "D(1,0.2241,0.277,0.7483,0.2746,0.7489,0.6039,0.2253,0.5979)" }, { @@ -491,7 +491,7 @@ "offset": 3, "length": 10 }, - "confidence": 0.575, + "confidence": 0.576, "source": "D(1,0.8642,0.2756,3.1596,0.2845,3.1591,0.6235,0.8647,0.6067)" }, { @@ -500,7 +500,7 @@ "offset": 14, "length": 3 }, - "confidence": 0.832, + "confidence": 0.835, "source": "D(1,3.2755,0.2843,3.9429,0.2829,3.9429,0.624,3.2748,0.6224)" }, { @@ -509,7 +509,7 @@ "offset": 18, "length": 4 }, - "confidence": 0.53, + "confidence": 0.529, "source": "D(1,0.067,0.7135,1.1941,0.7091,1.1942,1.0465,0.0681,1.0318)" }, { @@ -527,7 +527,7 @@ "offset": 29, "length": 3 }, - "confidence": 0.992, + "confidence": 0.977, "source": "D(1,2.6402,0.7139,3.5199,0.7125,3.5154,1.0541,2.6388,1.0542)" }, { @@ -536,7 +536,7 @@ "offset": 33, "length": 3 }, - "confidence": 0.989, + "confidence": 0.992, "source": "D(1,0.1357,1.1495,0.7408,1.1458,0.7412,1.4653,0.1366,1.4685)" }, { @@ -545,7 +545,7 @@ "offset": 37, "length": 8 }, - "confidence": 0.963, + "confidence": 0.96, "source": "D(1,0.3133,1.5823,1.9635,1.5821,1.9638,1.9413,0.3145,1.9299)" }, { @@ -572,7 +572,7 @@ "offset": 61, "length": 12 }, - "confidence": 0.635, + "confidence": 0.654, "source": "D(1,9.6456,0.4419,12.55,0.3785,12.5542,0.7262,9.6475,0.7803)" }, { @@ -581,7 +581,7 @@ "offset": 74, "length": 2 }, - "confidence": 0.226, + "confidence": 0.278, "source": "D(1,12.6286,0.377,12.9545,0.371,12.9595,0.7167,12.633,0.7245)" }, { @@ -590,7 +590,7 @@ "offset": 77, "length": 9 }, - "confidence": 0.635, + "confidence": 0.634, "source": "D(1,13.0837,0.3687,15.2158,0.3311,15.2158,0.671,13.0888,0.7131)" }, { @@ -599,7 +599,7 @@ "offset": 87, "length": 10 }, - "confidence": 0.963, + "confidence": 0.977, "source": "D(1,9.6149,0.9906,12.0098,0.9347,12.0143,1.293,9.6174,1.3437)" }, { @@ -608,7 +608,7 @@ "offset": 98, "length": 3 }, - "confidence": 0.95, + "confidence": 0.949, "source": "D(1,12.2275,0.9301,12.8454,0.9161,12.8509,1.2721,12.2322,1.2875)" }, { @@ -617,7 +617,7 @@ "offset": 102, "length": 7 }, - "confidence": 0.978, + "confidence": 0.983, "source": "D(1,12.969,0.9133,14.8461,0.8706,14.8528,1.2304,12.9747,1.2693)" }, { @@ -626,7 +626,7 @@ "offset": 110, "length": 7 }, - "confidence": 0.989, + "confidence": 0.988, "source": "D(1,14.9579,0.8678,16.5532,0.8308,16.5532,1.1932,14.9645,1.2269)" }, { @@ -635,7 +635,7 @@ "offset": 118, "length": 10 }, - "confidence": 0.883, + "confidence": 0.88, "source": "D(1,9.6355,1.5536,12.0512,1.5052,12.0543,1.8608,9.6377,1.9057)" }, { @@ -698,7 +698,7 @@ "offset": 181, "length": 7 }, - "confidence": 0.92, + "confidence": 0.921, "source": "D(1,10.7201,2.6771,12.2382,2.6458,12.2425,2.9959,10.7235,3.0246)" }, { @@ -725,7 +725,7 @@ "offset": 204, "length": 5 }, - "confidence": 0.652, + "confidence": 0.645, "source": "D(1,11.0266,3.2196,12.2317,3.1972,12.236,3.5651,11.0305,3.587)" }, { @@ -734,7 +734,7 @@ "offset": 210, "length": 1 }, - "confidence": 0.954, + "confidence": 0.963, "source": "D(1,12.304,3.1963,12.5149,3.1928,12.5192,3.5597,12.3085,3.5634)" }, { @@ -752,7 +752,7 @@ "offset": 215, "length": 2 }, - "confidence": 0.259, + "confidence": 0.25, "source": "D(1,13.2561,3.1815,13.5309,3.1776,13.5309,3.5385,13.2597,3.5442)" }, { @@ -761,7 +761,7 @@ "offset": 219, "length": 4 }, - "confidence": 0.992, + "confidence": 0.959, "source": "D(1,20.9597,0.6711,22.0011,0.7337,21.992,1.042,20.9488,0.9819)" }, { @@ -770,7 +770,7 @@ "offset": 224, "length": 2 }, - "confidence": 0.9, + "confidence": 0.899, "source": "D(1,22.1669,0.7456,22.4784,0.7705,22.4695,1.0766,22.158,1.0535)" }, { @@ -779,7 +779,7 @@ "offset": 227, "length": 2 }, - "confidence": 0.976, + "confidence": 0.975, "source": "D(1,22.6945,0.787,23.2427,0.8233,23.2333,1.1246,22.6855,1.0918)" }, { @@ -789,7 +789,7 @@ "length": 2 }, "confidence": 0.992, - "source": "D(1,23.3734,0.8325,23.8962,0.8692,23.887,1.1723,23.3641,1.1338)" + "source": "D(1,23.3734,0.8325,23.8962,0.8692,23.887,1.1723,23.3641,1.1339)" }, { "content": "FILLED", @@ -806,7 +806,7 @@ "offset": 240, "length": 2 }, - "confidence": 0.659, + "confidence": 0.654, "source": "D(1,25.4594,0.984,25.8057,1.0154,25.7955,1.3259,25.4499,1.2917)" }, { @@ -824,7 +824,7 @@ "offset": 246, "length": 9 }, - "confidence": 0.985, + "confidence": 0.987, "source": "D(1,26.5288,1.0774,28.8509,1.3003,28.8349,1.6071,26.5178,1.3839)" }, { @@ -842,8 +842,8 @@ "offset": 259, "length": 3 }, - "confidence": 0.916, - "source": "D(1,21.5139,1.0484,22.5001,1.1176,22.4801,1.4987,21.4882,1.4269)" + "confidence": 0.926, + "source": "D(1,21.5139,1.0484,22.5001,1.1176,22.4801,1.4987,21.4881,1.4269)" }, { "content": "PHARMACY", @@ -861,7 +861,7 @@ "length": 1 }, "confidence": 1, - "source": "D(1,26.2345,1.377,26.4757,1.402,26.4542,1.7936,26.2135,1.7698)" + "source": "D(1,26.2346,1.377,26.4757,1.402,26.4542,1.7936,26.2135,1.7698)" }, { "content": "03896", @@ -869,7 +869,7 @@ "offset": 274, "length": 5 }, - "confidence": 0.315, + "confidence": 0.314, "source": "D(1,26.6981,1.428,28.2777,1.5837,28.252,1.9571,26.6765,1.8163)" }, { @@ -878,7 +878,7 @@ "offset": 281, "length": 8 }, - "confidence": 0.9, + "confidence": 0.902, "source": "D(1,20.9513,1.5693,22.6981,1.6812,22.691,1.9765,20.9427,1.8742)" }, { @@ -896,7 +896,7 @@ "offset": 296, "length": 4 }, - "confidence": 0.982, + "confidence": 0.983, "source": "D(1,21.1249,1.9071,22.5322,2.0074,22.5198,2.4146,21.1119,2.3155)" }, { @@ -905,7 +905,7 @@ "offset": 301, "length": 7 }, - "confidence": 0.961, + "confidence": 0.957, "source": "D(1,22.6655,2.0171,25.2935,2.2032,25.2819,2.608,22.6534,2.4251)" }, { @@ -914,8 +914,8 @@ "offset": 309, "length": 3 }, - "confidence": 0.758, - "source": "D(1,25.4136,2.2118,26.3149,2.2746,26.3124,2.6736,25.4018,2.6167)" + "confidence": 0.74, + "source": "D(1,25.4136,2.2118,26.3149,2.2746,26.3123,2.6736,25.4018,2.6167)" }, { "content": "STREET", @@ -941,7 +941,7 @@ "offset": 329, "length": 10 }, - "confidence": 0.534, + "confidence": 0.513, "source": "D(1,21.1471,2.8903,24.6743,3.1166,24.6611,3.5251,21.1359,3.2787)" }, { @@ -950,7 +950,7 @@ "offset": 340, "length": 2 }, - "confidence": 0.87, + "confidence": 0.868, "source": "D(1,24.8313,3.1273,25.6293,3.1849,25.6159,3.5881,24.8182,3.5358)" }, { @@ -960,7 +960,7 @@ "length": 5 }, "confidence": 0.992, - "source": "D(1,25.7994,3.1973,27.4266,3.3094,27.4165,3.7153,25.7855,3.5989)" + "source": "D(1,25.7994,3.1973,27.4266,3.3094,27.4165,3.7153,25.7856,3.5989)" }, { "content": "CITY,", @@ -986,7 +986,7 @@ "offset": 363, "length": 3 }, - "confidence": 0.962, + "confidence": 0.961, "source": "D(1,23.2221,3.6701,23.6806,3.7025,23.6702,4.0394,23.2117,4.0113)" }, { @@ -995,7 +995,7 @@ "offset": 367, "length": 4 }, - "confidence": 0.971, + "confidence": 0.97, "source": "D(1,23.8408,3.7142,24.8385,3.7806,24.8385,4.1068,23.8302,4.0485)" }, { @@ -1004,7 +1004,7 @@ "offset": 373, "length": 9 }, - "confidence": 0.682, + "confidence": 0.683, "source": "D(1,27.8109,0.1711,34.0618,0.7163,34.057,1.7014,27.7851,1.0512)" }, { @@ -1013,7 +1013,7 @@ "offset": 384, "length": 1 }, - "confidence": 0.414, + "confidence": 0.413, "source": "D(1,0.0469,4.6618,0.2071,4.6591,0.2092,5.0137,0.0492,5.0169)" }, { @@ -1022,7 +1022,7 @@ "offset": 386, "length": 2 }, - "confidence": 0.992, + "confidence": 0.991, "source": "D(1,0.2842,4.6579,0.7768,4.6491,0.7786,5.0081,0.2862,5.0122)" }, { @@ -1076,7 +1076,7 @@ "offset": 416, "length": 6 }, - "confidence": 0.56, + "confidence": 0.559, "source": "D(1,0.2118,5.6969,1.4731,5.6466,1.4742,6.0525,0.2128,6.0937)" }, { @@ -1094,7 +1094,7 @@ "offset": 431, "length": 4 }, - "confidence": 0.903, + "confidence": 0.898, "source": "D(1,3.1844,5.5945,4.134,5.5695,4.134,5.9609,3.1843,5.9951)" }, { @@ -1103,7 +1103,7 @@ "offset": 437, "length": 9 }, - "confidence": 0.63, + "confidence": 0.631, "source": "D(1,4.7401,5.4898,6.7047,5.4653,6.7047,5.8371,4.7406,5.8579)" }, { @@ -1112,8 +1112,8 @@ "offset": 448, "length": 4 }, - "confidence": 0.205, - "source": "D(1,0.0842,6.2265,1.4279,6.2279,1.4291,6.574,0.0877,6.5675)" + "confidence": 0.185, + "source": "D(1,0.0842,6.2265,1.4278,6.2279,1.4291,6.574,0.0877,6.5675)" }, { "content": "and", @@ -1121,7 +1121,7 @@ "offset": 453, "length": 3 }, - "confidence": 0.829, + "confidence": 0.824, "source": "D(1,1.5009,6.2276,2.0295,6.2232,2.0306,6.5723,1.5022,6.5738)" }, { @@ -1130,7 +1130,7 @@ "offset": 457, "length": 5 }, - "confidence": 0.843, + "confidence": 0.842, "source": "D(1,2.1138,6.2229,2.7444,6.2187,2.7444,6.559,2.1147,6.5718)" }, { @@ -1166,8 +1166,8 @@ "offset": 475, "length": 2 }, - "confidence": 0.936, - "source": "D(1,5.6886,6.525,6.2847,6.5283,6.2833,6.9064,5.6879,6.9044)" + "confidence": 0.939, + "source": "D(1,5.6886,6.5249,6.2847,6.5283,6.2833,6.9064,5.6879,6.9044)" }, { "content": "attorney", @@ -1175,7 +1175,7 @@ "offset": 478, "length": 8 }, - "confidence": 0.605, + "confidence": 0.594, "source": "D(1,6.5331,6.5307,8.8585,6.5384,8.8585,6.9186,6.5311,6.9067)" }, { @@ -1193,7 +1193,7 @@ "offset": 499, "length": 19 }, - "confidence": 0.432, + "confidence": 0.443, "source": "D(1,0.0824,7.3475,3.094,7.3592,3.094,7.7262,0.0832,7.6954)" }, { @@ -1202,7 +1202,7 @@ "offset": 519, "length": 5 }, - "confidence": 0.319, + "confidence": 0.323, "source": "D(1,3.1651,7.3599,3.9951,7.3657,3.9941,7.7304,3.1651,7.7266)" }, { @@ -1211,7 +1211,7 @@ "offset": 525, "length": 2 }, - "confidence": 0.904, + "confidence": 0.905, "source": "D(1,4.0662,7.3654,4.4694,7.3641,4.4678,7.7293,4.0652,7.7302)" }, { @@ -1220,8 +1220,8 @@ "offset": 528, "length": 12 }, - "confidence": 0.628, - "source": "D(1,4.5405,7.3641,6.4553,7.374,6.4546,7.7354,4.539,7.7297)" + "confidence": 0.626, + "source": "D(1,4.5405,7.3641,6.4553,7.374,6.4547,7.7354,4.539,7.7297)" }, { "content": "signiorder", @@ -1238,8 +1238,8 @@ "offset": 552, "length": 5 }, - "confidence": 0.778, - "source": "D(1,8.0975,7.3836,8.9274,7.3885,8.9255,7.742,8.0958,7.7366)" + "confidence": 0.792, + "source": "D(1,8.0975,7.3836,8.9274,7.3885,8.9256,7.742,8.0959,7.7366)" }, { "content": "Date", @@ -1265,7 +1265,7 @@ "offset": 570, "length": 2 }, - "confidence": 0.958, + "confidence": 0.956, "source": "D(1,19.2066,5.1581,19.5689,5.1677,19.5625,5.5382,19.2004,5.5237)" }, { @@ -1274,7 +1274,7 @@ "offset": 573, "length": 2 }, - "confidence": 0.993, + "confidence": 0.992, "source": "D(1,18.1382,5.5946,18.6065,5.6028,18.6052,5.9638,18.1372,5.9548)" }, { @@ -1292,7 +1292,7 @@ "offset": 579, "length": 6 }, - "confidence": 0.995, + "confidence": 0.994, "source": "D(1,17.4341,6.033,18.756,6.0721,18.7513,6.4417,17.4286,6.4072)" }, { @@ -1301,7 +1301,7 @@ "offset": 586, "length": 2 }, - "confidence": 0.921, + "confidence": 0.922, "source": "D(1,18.9311,6.0767,19.2631,6.0866,19.2579,6.4545,18.9252,6.4448)" }, { @@ -1310,8 +1310,8 @@ "offset": 589, "length": 2 }, - "confidence": 0.935, - "source": "D(1,19.4864,6.0939,20.0901,6.108,20.0847,6.4715,19.4819,6.459)" + "confidence": 0.93, + "source": "D(1,19.4864,6.094,20.0901,6.108,20.0847,6.4715,19.4819,6.459)" }, { "content": "PURCHASER", @@ -1365,7 +1365,7 @@ "length": 14 }, "confidence": 0.999, - "source": "D(1,26.951,5.0511,29.7685,5.2707,29.7544,5.5781,26.9327,5.3765)" + "source": "D(1,26.9511,5.0511,29.7685,5.2707,29.7544,5.5781,26.9327,5.3765)" }, { "content": "-", @@ -1391,7 +1391,7 @@ "offset": 650, "length": 2 }, - "confidence": 0.369, + "confidence": 0.309, "source": "D(1,30.4943,5.3314,31.0002,5.3746,30.9842,5.6719,30.4789,5.6307)" }, { @@ -1400,8 +1400,8 @@ "offset": 653, "length": 3 }, - "confidence": 0.809, - "source": "D(1,31.0615,5.3798,31.5623,5.4233,31.5471,5.7223,31.0454,5.6769)" + "confidence": 0.707, + "source": "D(1,31.0616,5.3798,31.5623,5.4233,31.5471,5.7223,31.0454,5.6769)" }, { "content": "kly", @@ -1409,8 +1409,8 @@ "offset": 657, "length": 3 }, - "confidence": 0.237, - "source": "D(1,31.6338,5.4295,32.2672,5.4867,32.2537,5.7883,31.6188,5.729)" + "confidence": 0.266, + "source": "D(1,31.6338,5.4295,32.2672,5.4867,32.2538,5.7883,31.6188,5.729)" }, { "content": "ft:", @@ -1418,7 +1418,7 @@ "offset": 661, "length": 3 }, - "confidence": 0.55, + "confidence": 0.582, "source": "D(1,32.3285,5.4926,32.8186,5.5399,32.8064,5.8411,32.3152,5.7941)" }, { @@ -1427,7 +1427,7 @@ "offset": 665, "length": 1 }, - "confidence": 0.88, + "confidence": 0.862, "source": "D(1,32.8799,5.5458,33.0382,5.5606,33.0266,5.8612,32.8679,5.847)" }, { @@ -1436,7 +1436,7 @@ "offset": 667, "length": 4 }, - "confidence": 0.188, + "confidence": 0.155, "source": "D(1,33.125,5.5685,33.8881,5.6391,33.8881,5.9347,33.1137,5.8686)" }, { @@ -1445,7 +1445,7 @@ "offset": 672, "length": 5 }, - "confidence": 0.82, + "confidence": 0.806, "source": "D(1,20.914,5.1445,21.8749,5.1961,21.8689,5.4935,20.907,5.4471)" }, { @@ -1463,7 +1463,7 @@ "offset": 681, "length": 4 }, - "confidence": 0.959, + "confidence": 0.936, "source": "D(1,22.2881,5.2193,22.9256,5.2496,22.9184,5.5542,22.2818,5.5192)" }, { @@ -1472,7 +1472,7 @@ "offset": 686, "length": 2 }, - "confidence": 0.968, + "confidence": 0.965, "source": "D(1,23.0102,5.2536,23.3041,5.2673,23.2965,5.5748,23.003,5.5588)" }, { @@ -1481,7 +1481,7 @@ "offset": 689, "length": 2 }, - "confidence": 0.975, + "confidence": 0.973, "source": "D(1,23.3639,5.2701,23.5679,5.2819,23.5601,5.5906,23.3562,5.578)" }, { @@ -1500,7 +1500,7 @@ "length": 2 }, "confidence": 0.998, - "source": "D(1,24.5183,5.3425,24.792,5.3595,24.7837,5.6651,24.5102,5.6495)" + "source": "D(1,24.5183,5.3425,24.792,5.3595,24.7837,5.6651,24.5101,5.6495)" }, { "content": "endorsed", @@ -1517,7 +1517,7 @@ "offset": 710, "length": 10 }, - "confidence": 0.598, + "confidence": 0.618, "source": "D(1,26.3297,5.4546,27.8321,5.5562,27.8231,5.8582,26.3213,5.7588)" }, { @@ -1544,7 +1544,7 @@ "offset": 732, "length": 4 }, - "confidence": 0.196, + "confidence": 0.203, "source": "D(1,29.4351,5.6436,29.8236,5.6585,29.8236,5.9704,29.4277,5.9512)" }, { @@ -1580,7 +1580,7 @@ "offset": 754, "length": 10 }, - "confidence": 0.726, + "confidence": 0.713, "source": "D(1,20.855,6.6145,22.8142,6.7151,22.8036,7.0666,20.8442,6.9715)" }, { @@ -1607,7 +1607,7 @@ "offset": 774, "length": 8 }, - "confidence": 0.642, + "confidence": 0.641, "source": "D(1,24.1392,6.7888,25.4812,6.8766,25.4737,7.2222,24.1267,7.146)" }, { @@ -1634,7 +1634,7 @@ "offset": 804, "length": 2 }, - "confidence": 0.974, + "confidence": 0.973, "source": "D(1,23.6619,8.0208,23.9866,8.036,23.9817,8.2681,23.657,8.2532)" }, { @@ -1643,7 +1643,7 @@ "offset": 807, "length": 7 }, - "confidence": 0.572, + "confidence": 0.582, "source": "D(1,24.0508,8.0391,25.1798,8.0891,25.1739,8.3234,24.0457,8.2711)" }, { @@ -1652,8 +1652,8 @@ "offset": 815, "length": 2 }, - "confidence": 0.973, - "source": "D(1,25.2402,8.0917,25.599,8.1077,25.5934,8.3432,25.2344,8.3263)" + "confidence": 0.984, + "source": "D(1,25.2403,8.0917,25.599,8.1077,25.5934,8.3432,25.2344,8.3263)" }, { "content": "PPHALF", @@ -1679,8 +1679,8 @@ "offset": 828, "length": 8 }, - "confidence": 0.502, - "source": "D(1,27.0295,8.1831,28.1735,8.231,28.173,8.4604,27.0239,8.4136)" + "confidence": 0.497, + "source": "D(1,27.0295,8.1831,28.1735,8.231,28.173,8.4604,27.0239,8.4135)" }, { "content": "04'T", @@ -1697,7 +1697,7 @@ "offset": 862, "length": 3 }, - "confidence": 0.898, + "confidence": 0.899, "source": "D(1,0.2663,8.4109,0.8303,8.4175,0.8306,8.725,0.2669,8.7173)" }, { @@ -1706,7 +1706,7 @@ "offset": 866, "length": 2 }, - "confidence": 0.97, + "confidence": 0.965, "source": "D(1,0.9159,8.4188,1.3722,8.4188,1.3722,8.7309,0.9163,8.725)" }, { @@ -1715,7 +1715,7 @@ "offset": 869, "length": 8 }, - "confidence": 0.57, + "confidence": 0.567, "source": "D(1,0.0751,8.8117,1.6849,8.8275,1.6849,9.1259,0.0763,9.1078)" }, { @@ -1724,7 +1724,7 @@ "offset": 887, "length": 7 }, - "confidence": 0.895, + "confidence": 0.897, "source": "D(1,2.0179,8.4325,3.6567,8.4415,3.6562,8.7432,2.0176,8.744)" }, { @@ -1733,7 +1733,7 @@ "offset": 895, "length": 4 }, - "confidence": 0.988, + "confidence": 0.989, "source": "D(1,2.4772,8.8375,3.2481,8.8466,3.2481,9.1421,2.4777,9.1385)" }, { @@ -1742,7 +1742,7 @@ "offset": 909, "length": 1 }, - "confidence": 0.127, + "confidence": 0.126, "source": "D(1,3.7265,8.4411,3.856,8.445,3.856,8.748,3.726,8.7434)" }, { @@ -1751,7 +1751,7 @@ "offset": 911, "length": 4 }, - "confidence": 0.992, + "confidence": 0.986, "source": "D(1,9.0158,8.7061,9.9884,8.7088,9.9883,9.0043,9.016,8.9999)" }, { @@ -1760,7 +1760,7 @@ "offset": 916, "length": 2 }, - "confidence": 0.957, + "confidence": 0.958, "source": "D(1,10.0861,8.7088,10.5407,8.7082,10.5406,9.007,10.0861,9.0049)" }, { @@ -1769,7 +1769,7 @@ "offset": 919, "length": 4 }, - "confidence": 0.972, + "confidence": 0.97, "source": "D(1,10.6042,8.7083,11.4986,8.7103,11.4983,9.0104,10.6041,9.0072)" }, { @@ -1787,7 +1787,7 @@ "offset": 940, "length": 5 }, - "confidence": 0.811, + "confidence": 0.803, "source": "D(1,17.2313,8.8086,18.3597,8.8251,18.3597,9.1493,17.2314,9.1349)" }, { @@ -1823,7 +1823,7 @@ "offset": 989, "length": 2 }, - "confidence": 0.973, + "confidence": 0.976, "source": "D(1,21.8041,8.7115,22.1472,8.7237,22.1395,9.0433,21.7965,9.0307)" }, { @@ -1859,7 +1859,7 @@ "offset": 1026, "length": 2 }, - "confidence": 0.94, + "confidence": 0.942, "source": "D(1,24.9765,8.8411,25.2712,8.8533,25.2628,9.1833,24.9686,9.1696)" }, { @@ -1877,7 +1877,7 @@ "offset": 1032, "length": 8 }, - "confidence": 0.935, + "confidence": 0.936, "source": "D(1,26.1178,8.8895,27.9985,8.969,27.9908,9.3019,26.11,9.2212)" }, { @@ -1886,7 +1886,7 @@ "offset": 1041, "length": 13 }, - "confidence": 0.94, + "confidence": 0.941, "source": "D(1,23.8332,9.2359,26.5272,9.3551,26.5215,9.6517,23.8284,9.5241)" }, { @@ -1904,7 +1904,7 @@ "offset": 1099, "length": 6 }, - "confidence": 0.973, + "confidence": 0.974, "source": "D(1,30.7947,9.1623,32.0569,9.1895,32.0547,9.477,30.794,9.4242)" }, { @@ -1913,7 +1913,7 @@ "offset": 1106, "length": 7 }, - "confidence": 0.974, + "confidence": 0.973, "source": "D(1,30.7624,9.5258,32.0469,9.5631,32.0469,9.8611,30.7611,9.8282)" }, { @@ -1922,8 +1922,8 @@ "offset": 1135, "length": 4 }, - "confidence": 0.547, - "source": "D(1,32.8605,9.2511,33.6449,9.2699,33.6449,9.5608,32.8593,9.5402)" + "confidence": 0.546, + "source": "D(1,32.8605,9.2511,33.6449,9.2699,33.6449,9.5607,32.8593,9.5402)" }, { "content": "SixPFAD", @@ -1931,7 +1931,7 @@ "offset": 1140, "length": 7 }, - "confidence": 0.492, + "confidence": 0.485, "source": "D(1,32.5755,9.6329,33.8881,9.6545,33.8881,9.9479,32.574,9.9226)" }, { @@ -1940,7 +1940,7 @@ "offset": 1168, "length": 1 }, - "confidence": 0.977, + "confidence": 0.976, "source": "D(1,0.1434,9.3461,0.3995,9.3553,0.3995,9.6993,0.1449,9.6947)" }, { @@ -1958,7 +1958,7 @@ "offset": 1182, "length": 2 }, - "confidence": 0.242, + "confidence": 0.237, "source": "D(1,2.4972,9.3967,2.783,9.3997,2.7826,9.7418,2.4967,9.7383)" }, { @@ -1976,7 +1976,7 @@ "offset": 1198, "length": 17 }, - "confidence": 0.774, + "confidence": 0.78, "source": "D(1,5.0572,9.435,9.6875,9.4902,9.6827,9.8475,5.0539,9.7675)" }, { @@ -1985,7 +1985,7 @@ "offset": 1216, "length": 2 }, - "confidence": 0.99, + "confidence": 0.991, "source": "D(1,9.9052,9.4919,10.5069,9.5003,10.5021,9.8585,9.9004,9.8514)" }, { @@ -1994,8 +1994,8 @@ "offset": 1219, "length": 2 }, - "confidence": 0.99, - "source": "D(1,10.7935,9.5041,11.3779,9.5138,11.3735,9.8691,10.789,9.8617)" + "confidence": 0.989, + "source": "D(1,10.7935,9.5041,11.3779,9.5138,11.3735,9.8691,10.7889,9.8617)" }, { "content": "MG", @@ -2021,16 +2021,16 @@ "offset": 1268, "length": 13 }, - "confidence": 0.68, + "confidence": 0.668, "source": "D(1,20.9502,9.7355,24.6648,9.883,24.6648,10.2167,20.9441,10.0655)" }, { - "content": "TRY", + "content": "TRI", "span": { "offset": 1381, "length": 3 }, - "confidence": 0.229, + "confidence": 0.167, "source": "D(1,30.9655,9.9512,32.0469,9.9114,32.0469,10.497,30.9665,10.5729)" }, { @@ -2039,7 +2039,7 @@ "offset": 1404, "length": 8 }, - "confidence": 0.909, + "confidence": 0.91, "source": "D(1,32.3628,10.1513,34.027,10.1415,34.027,10.6114,32.3613,10.609)" }, { @@ -2066,7 +2066,7 @@ "offset": 1446, "length": 4 }, - "confidence": 0.651, + "confidence": 0.631, "source": "D(1,2.3683,10.1214,3.3523,10.1275,3.3523,10.4514,2.3675,10.4427)" }, { @@ -2075,7 +2075,7 @@ "offset": 1460, "length": 9 }, - "confidence": 0.963, + "confidence": 0.969, "source": "D(1,5.0574,10.1634,7.6766,10.1957,7.6705,10.5615,5.0524,10.5128)" }, { @@ -2084,7 +2084,7 @@ "offset": 1470, "length": 4 }, - "confidence": 0.683, + "confidence": 0.673, "source": "D(1,7.8377,10.1981,8.7982,10.2122,8.7918,10.5826,7.8316,10.5642)" }, { @@ -2093,7 +2093,7 @@ "offset": 1475, "length": 5 }, - "confidence": 0.645, + "confidence": 0.604, "source": "D(1,9.0965,10.217,10.1287,10.2291,10.1229,10.6009,9.0905,10.5854)" }, { @@ -2111,7 +2111,7 @@ "offset": 1484, "length": 2 }, - "confidence": 0.977, + "confidence": 0.989, "source": "D(1,11.298,10.2496,11.9006,10.2581,11.8957,10.6289,11.2928,10.6215)" }, { @@ -2120,7 +2120,7 @@ "offset": 1487, "length": 3 }, - "confidence": 0.989, + "confidence": 0.973, "source": "D(1,12.181,10.262,13.0461,10.2754,13.0416,10.6356,12.1764,10.6314)" }, { @@ -2130,7 +2130,7 @@ "length": 1 }, "confidence": 0.992, - "source": "D(1,13.3504,10.282,13.6699,10.289,13.6689,10.6424,13.3463,10.6404)" + "source": "D(1,13.3503,10.282,13.6699,10.289,13.6689,10.6424,13.3463,10.6404)" }, { "content": "10702-0057-01", @@ -2138,7 +2138,7 @@ "offset": 1542, "length": 13 }, - "confidence": 0.861, + "confidence": 0.863, "source": "D(1,20.9309,10.4854,24.6648,10.6263,24.6648,10.9645,20.928,10.8388)" }, { @@ -2147,7 +2147,7 @@ "offset": 1645, "length": 3 }, - "confidence": 0.15, + "confidence": 0.174, "source": "D(1,30.9008,10.6977,31.9253,10.6375,31.9253,11.1358,30.8995,11.25)" }, { @@ -2183,8 +2183,8 @@ "offset": 1726, "length": 6 }, - "confidence": 0.935, - "source": "D(1,5.0627,10.9068,6.7256,10.9317,6.7219,11.2682,5.0618,11.2329)" + "confidence": 0.934, + "source": "D(1,5.0627,10.9068,6.7256,10.9317,6.7219,11.2681,5.0618,11.2329)" }, { "content": "10", @@ -2192,7 +2192,7 @@ "offset": 1733, "length": 2 }, - "confidence": 0.949, + "confidence": 0.95, "source": "D(1,7.0449,10.9367,7.557,10.9467,7.5537,11.2837,7.0414,11.2756)" }, { @@ -2201,7 +2201,7 @@ "offset": 1736, "length": 6 }, - "confidence": 0.897, + "confidence": 0.894, "source": "D(1,7.7937,10.9498,9.6216,10.9856,9.618,11.3243,7.7906,11.2877)" }, { @@ -2210,7 +2210,7 @@ "offset": 1743, "length": 5 }, - "confidence": 0.626, + "confidence": 0.625, "source": "D(1,9.8144,10.9879,11.2678,11.0183,11.2639,11.3629,9.8106,11.3276)" }, { @@ -2219,7 +2219,7 @@ "offset": 1749, "length": 2 }, - "confidence": 0.847, + "confidence": 0.849, "source": "D(1,11.5486,11.0259,12.2423,11.0403,12.239,11.376,11.5449,11.3679)" }, { @@ -2228,7 +2228,7 @@ "offset": 1752, "length": 4 }, - "confidence": 0.984, + "confidence": 0.983, "source": "D(1,12.4075,11.0432,13.6351,11.0659,13.6351,11.3956,12.4043,11.3774)" }, { @@ -2237,7 +2237,7 @@ "offset": 1806, "length": 13 }, - "confidence": 0.797, + "confidence": 0.798, "source": "D(1,20.9049,11.2695,24.6648,11.3883,24.6613,11.7254,20.9033,11.6167)" }, { @@ -2255,7 +2255,7 @@ "offset": 1931, "length": 8 }, - "confidence": 0.821, + "confidence": 0.822, "source": "D(1,32.1817,11.5598,33.9923,11.5762,33.9923,12.0965,32.18,12.065)" }, { @@ -2264,7 +2264,7 @@ "offset": 1960, "length": 1 }, - "confidence": 0.201, + "confidence": 0.2, "source": "D(1,0.1974,11.5239,0.4342,11.5329,0.4342,11.8362,0.2001,11.8246)" }, { @@ -2273,7 +2273,7 @@ "offset": 1971, "length": 5 }, - "confidence": 0.636, + "confidence": 0.635, "source": "D(1,2.0457,11.5568,3.3697,11.5747,3.3697,11.8924,2.0456,11.8764)" }, { @@ -2282,7 +2282,7 @@ "offset": 1986, "length": 16 }, - "confidence": 0.789, + "confidence": 0.787, "source": "D(1,5.0523,11.6259,9.6226,11.7111,9.6198,12.0564,5.0507,11.9394)" }, { @@ -2291,7 +2291,7 @@ "offset": 2003, "length": 6 }, - "confidence": 0.974, + "confidence": 0.975, "source": "D(1,9.8611,11.7161,11.5804,11.7566,11.577,12.1092,9.8583,12.0622)" }, { @@ -2300,7 +2300,7 @@ "offset": 2010, "length": 3 }, - "confidence": 0.929, + "confidence": 0.933, "source": "D(1,11.8521,11.7637,12.7116,11.7889,12.7089,12.1307,11.8488,12.1155)" }, { @@ -2309,7 +2309,7 @@ "offset": 2014, "length": 2 }, - "confidence": 0.408, + "confidence": 0.345, "source": "D(1,12.9279,11.7951,13.6157,11.8095,13.6149,12.1464,12.9252,12.1335)" }, { @@ -2318,7 +2318,7 @@ "offset": 2056, "length": 11 }, - "confidence": 0.81, + "confidence": 0.791, "source": "D(1,20.8723,12.0202,23.6986,12.0959,23.6961,12.4323,20.8728,12.3661)" }, { @@ -2327,8 +2327,8 @@ "offset": 2097, "length": 3 }, - "confidence": 0.697, - "source": "D(1,23.7927,12.0993,24.6301,12.1164,24.6301,12.4637,23.7895,12.4352)" + "confidence": 0.69, + "source": "D(1,23.7926,12.0993,24.6301,12.1164,24.6301,12.4637,23.7895,12.4352)" }, { "content": "1.", @@ -2336,8 +2336,8 @@ "offset": 2170, "length": 2 }, - "confidence": 0.357, - "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6494)" + "confidence": 0.352, + "source": "D(1,30.7221,12.1327,30.9206,12.1061,30.9227,12.6297,30.7233,12.6495)" }, { "content": "BE", @@ -2345,7 +2345,7 @@ "offset": 2173, "length": 2 }, - "confidence": 0.112, + "confidence": 0.109, "source": "D(1,31.0647,12.0698,31.5779,12.0261,31.5779,12.5585,31.0655,12.6198)" }, { @@ -2363,7 +2363,7 @@ "offset": 2226, "length": 2 }, - "confidence": 0.708, + "confidence": 0.712, "source": "D(1,0.2497,12.2349,0.4863,12.2273,0.4863,12.5428,0.2523,12.5437)" }, { @@ -2372,7 +2372,7 @@ "offset": 2238, "length": 6 }, - "confidence": 0.883, + "confidence": 0.885, "source": "D(1,2.1018,12.2753,3.6993,12.3033,3.6993,12.6184,2.1017,12.5955)" }, { @@ -2381,7 +2381,7 @@ "offset": 2254, "length": 16 }, - "confidence": 0.7, + "confidence": 0.723, "source": "D(1,5.0519,12.3472,9.5437,12.456,9.5376,12.7971,5.0475,12.6602)" }, { @@ -2390,7 +2390,7 @@ "offset": 2271, "length": 2 }, - "confidence": 0.957, + "confidence": 0.958, "source": "D(1,9.7697,12.4613,10.3925,12.4751,10.3863,12.8214,9.7636,12.8061)" }, { @@ -2399,8 +2399,8 @@ "offset": 2274, "length": 2 }, - "confidence": 0.897, - "source": "D(1,10.6571,12.4803,11.2744,12.4969,11.2693,12.8457,10.6516,12.8273)" + "confidence": 0.898, + "source": "D(1,10.6571,12.4803,11.2743,12.4969,11.2693,12.8457,10.6516,12.8273)" }, { "content": "MG", @@ -2409,7 +2409,7 @@ "length": 2 }, "confidence": 0.977, - "source": "D(1,11.5058,12.5043,12.1726,12.5252,12.1672,12.8767,11.5007,12.8539)" + "source": "D(1,11.5058,12.5043,12.1725,12.5252,12.1671,12.8767,11.5007,12.8539)" }, { "content": "CAP", @@ -2418,7 +2418,7 @@ "length": 3 }, "confidence": 0.973, - "source": "D(1,12.3599,12.5302,13.2704,12.556,13.27,12.8969,12.3547,12.879)" + "source": "D(1,12.3599,12.5302,13.2704,12.556,13.27,12.8969,12.3547,12.8789)" }, { "content": "43975-0282-20", @@ -2426,7 +2426,7 @@ "offset": 2333, "length": 13 }, - "confidence": 0.736, + "confidence": 0.734, "source": "D(1,20.8422,12.7866,24.6127,12.8741,24.6127,13.1944,20.8417,13.0906)" }, { @@ -2435,7 +2435,7 @@ "offset": 2436, "length": 3 }, - "confidence": 0.093, + "confidence": 0.094, "source": "D(1,30.6173,12.7434,31.5084,12.6859,31.5084,13.1804,30.6196,13.2986)" }, { @@ -2444,7 +2444,7 @@ "offset": 2459, "length": 8 }, - "confidence": 0.277, + "confidence": 0.283, "source": "D(1,32.0937,12.8805,33.9054,12.8638,33.9054,13.4041,32.0946,13.4066)" }, { @@ -2453,7 +2453,7 @@ "offset": 2488, "length": 1 }, - "confidence": 0.64, + "confidence": 0.644, "source": "D(1,0.2826,12.9105,0.5336,12.9129,0.5362,13.235,0.2851,13.231)" }, { @@ -2480,7 +2480,7 @@ "offset": 2515, "length": 20 }, - "confidence": 0.843, + "confidence": 0.823, "source": "D(1,5.0577,13.0674,10.6838,13.233,10.6781,13.5716,5.0524,13.382)" }, { @@ -2507,8 +2507,8 @@ "offset": 2542, "length": 3 }, - "confidence": 0.969, - "source": "D(1,12.6687,13.2945,13.583,13.3168,13.583,13.6445,12.6639,13.6272)" + "confidence": 0.962, + "source": "D(1,12.6687,13.2945,13.583,13.3168,13.583,13.6445,12.6638,13.6272)" }, { "content": "64850-0505-01", @@ -2516,7 +2516,7 @@ "offset": 2595, "length": 13 }, - "confidence": 0.921, + "confidence": 0.918, "source": "D(1,20.7944,13.5334,24.5543,13.6249,24.5534,13.9488,20.7958,13.862)" }, { @@ -2525,7 +2525,7 @@ "offset": 2698, "length": 3 }, - "confidence": 0.308, + "confidence": 0.318, "source": "D(1,31.598,13.9945,30.6052,14.0596,30.6052,13.4532,31.5982,13.4094)" }, { @@ -2552,7 +2552,7 @@ "offset": 2763, "length": 3 }, - "confidence": 0.567, + "confidence": 0.569, "source": "D(1,2.1345,13.6923,2.8087,13.7041,2.8072,14.0366,2.1346,14.0306)" }, { @@ -2561,7 +2561,7 @@ "offset": 2767, "length": 5 }, - "confidence": 0.537, + "confidence": 0.489, "source": "D(1,2.9019,13.7058,4.1861,13.7282,4.1861,14.0625,2.9005,14.0389)" }, { @@ -2570,7 +2570,7 @@ "offset": 2782, "length": 19 }, - "confidence": 0.567, + "confidence": 0.568, "source": "D(1,5.0314,13.7838,10.3924,13.9597,10.3856,14.3211,5.0254,14.1244)" }, { @@ -2579,7 +2579,7 @@ "offset": 2802, "length": 10 }, - "confidence": 0.642, + "confidence": 0.647, "source": "D(1,10.5935,13.9667,13.5812,14.0685,13.5756,14.4271,10.5866,14.3291)" }, { @@ -2588,7 +2588,7 @@ "offset": 2852, "length": 13 }, - "confidence": 0.649, + "confidence": 0.695, "source": "D(1,20.768,14.2981,24.5259,14.3573,24.5259,14.6701,20.7675,14.6148)" }, { @@ -2597,7 +2597,7 @@ "offset": 2965, "length": 3 }, - "confidence": 0.104, + "confidence": 0.106, "source": "D(1,30.6647,14.1383,31.4911,14.0895,31.4911,14.5321,30.6676,14.6181)" }, { @@ -2606,7 +2606,7 @@ "offset": 2990, "length": 7 }, - "confidence": 0.64, + "confidence": 0.635, "source": "D(1,31.9968,14.1728,33.7839,14.2193,33.7839,14.7674,31.9984,14.7409)" }, { @@ -2642,7 +2642,7 @@ "offset": 5677, "length": 5 }, - "confidence": 0.959, + "confidence": 0.956, "source": "D(1,5.4752,23.6587,6.7016,23.7202,6.6831,24.1151,5.4559,24.0589)" }, { @@ -2669,7 +2669,7 @@ "offset": 5689, "length": 2 }, - "confidence": 0.689, + "confidence": 0.683, "source": "D(1,7.9925,23.7806,8.4742,23.8025,8.4569,24.1966,7.9741,24.1718)" }, { @@ -2678,7 +2678,7 @@ "offset": 5692, "length": 5 }, - "confidence": 0.936, + "confidence": 0.939, "source": "D(1,8.6605,23.8113,9.8659,23.8688,9.8528,24.2675,8.6438,24.2059)" } ], @@ -2845,7 +2845,7 @@ }, { "content": "DEA.Clerk", - "source": "D(1,4.7361,5.4824,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", + "source": "D(1,4.7361,5.4825,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", "span": { "offset": 437, "length": 9 @@ -2957,7 +2957,7 @@ }, { "content": "Signature- by first supplier", - "source": "D(1,20.8555,6.6065,25.4812,6.862,25.4639,7.2205,20.8435,6.965)", + "source": "D(1,20.8555,6.6065,25.4812,6.862,25.4639,7.2205,20.8435,6.9651)", "span": { "offset": 754, "length": 28 @@ -3061,7 +3061,7 @@ }, { "content": "NATIONALIDRUG CODE", - "source": "D(1,23.8335,9.2299,27.5829,9.3972,27.5719,9.6985,23.82,9.5313)", + "source": "D(1,23.8335,9.2299,27.5829,9.3972,27.5719,9.6986,23.82,9.5313)", "span": { "offset": 1041, "length": 18 @@ -3132,7 +3132,7 @@ } }, { - "content": "TRY", + "content": "TRI", "source": "D(1,30.9526,9.9532,32.042,9.8958,32.0469,10.5082,30.9666,10.5717)", "span": { "offset": 1381, @@ -3277,7 +3277,7 @@ }, { "content": "1. BE", - "source": "D(1,30.7094,12.1004,31.5622,12.0171,31.5779,12.5603,30.7236,12.6435)", + "source": "D(1,30.7094,12.1004,31.5622,12.0171,31.5779,12.5603,30.7235,12.6435)", "span": { "offset": 2170, "length": 5 @@ -3413,7 +3413,7 @@ }, { "content": "71930-0027-43", - "source": "D(1,20.7681,14.2938,24.5123,14.3476,24.5077,14.6665,20.7635,14.6126)", + "source": "D(1,20.7681,14.2937,24.5123,14.3476,24.5077,14.6665,20.7635,14.6126)", "span": { "offset": 2852, "length": 13 @@ -3521,7 +3521,7 @@ }, { "content": "AR8109046", - "source": "D(1,27.823,0.1563,34.1243,0.7268,34.0364,1.6951,27.7352,1.1245)", + "source": "D(1,27.823,0.1562,34.1243,0.7268,34.0364,1.6951,27.7352,1.1245)", "span": { "offset": 373, "length": 9 @@ -3545,7 +3545,7 @@ }, { "content": "DEA.Clerk", - "source": "D(1,4.7361,5.4824,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", + "source": "D(1,4.7361,5.4825,6.6906,5.4587,6.6951,5.8308,4.7406,5.8546)", "span": { "offset": 437, "length": 9 @@ -3569,7 +3569,7 @@ }, { "content": "RequestingiOfficial (must be atthonzed'to signiorder form)", - "source": "D(1,0.0824,7.3437,8.9196,7.3817,8.9181,7.746,0.0808,7.7081)", + "source": "D(1,0.0824,7.3438,8.9196,7.3817,8.9181,7.746,0.0808,7.7081)", "span": { "offset": 499, "length": 58 @@ -3609,7 +3609,7 @@ }, { "content": "OFFICIAL AUTHORIZED TO EXECUTE ON PPHALF OF SUPPLIER", - "source": "D(1,20.8272,8.1228,20.8381,7.8874,28.1779,8.2272,28.1669,8.4627)", + "source": "D(1,20.8272,8.1228,20.8381,7.8874,28.1779,8.2272,28.167,8.4627)", "span": { "offset": 784, "length": 52 @@ -3617,7 +3617,7 @@ }, { "content": "04'T", - "source": "D(1,29.9139,8.3492,30.5276,8.3662,30.5211,8.6014,29.9074,8.5844)", + "source": "D(1,29.9139,8.3507,30.5276,8.3662,30.5217,8.6014,29.9079,8.586)", "span": { "offset": 838, "length": 4 @@ -3736,7 +3736,7 @@ } }, { - "content": "TRY", + "content": "TRI", "source": "D(1,30.6407,9.9591,32.2263,10.0061,32.1797,10.6643,30.6174,10.633)", "span": { "offset": 1381, @@ -4519,7 +4519,7 @@ "columnIndex": 16, "rowSpan": 1, "columnSpan": 1, - "content": "TRY", + "content": "TRI", "source": "D(1,30.6407,9.9591,32.2263,10.0061,32.1797,10.6643,30.6174,10.633)", "span": { "offset": 1381, @@ -9418,7 +9418,7 @@ } } ], - "source": "D(1,0.0613,8.0126,34.129,8.3082,33.9709,24.6174,0,24.3045)", + "source": "D(1,0.0613,8.0126,34.129,8.3082,33.9708,24.6174,0,24.3045)", "span": { "offset": 845, "length": 5026 From 1b8a5e901ee722a0a0980a8408844cca608e405d Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 13:23:18 -0500 Subject: [PATCH 43/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 68 ++++++++++++------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 7743b02..1b4b062 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,12 +1,12 @@ # Document Intelligence to Content Understanding Migration Tool (Python) -Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** format, as seen in AI Foundry. The following DI versions are supported: +Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** 2025-05-01-preview format, as seen in AI Foundry. The following DI versions are supported: - Custom Document DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural - Custom Document 4.0 Preview (2024-07-31-preview) (seen in Document Field Extraction projects) --> DI-version = generative -To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e. https://documentintelligence.ai.azure.com/studio) and DI 4.0 Preview.2 is only a part of Azure AI Foundry (i.e. https://ai.azure.com/explore/aiservices/vision/document/extraction). +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and DI 4.0 Preview.2 is only a part of Azure AI Foundry (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). -For migration from these DI versions to Content understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. +For migration from these DI versions to Content Understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. ## Details About the Tools To provide you with some further details, here is a more intricate breakdown of each of the 3 CLI tools and their capabilities: @@ -20,31 +20,31 @@ To provide you with some further details, here is a more intricate breakdown of * This CLI tool can be used to ensure that the migration has successfully completed and to test the quality of the previously created analyzer. ## Setup -To setup this tool, you will need to do the following steps: +To set up this tool, you will need to do the following steps: 1. Run the requirements.txt file to install the needed dependencies via **pip install -r ./requirements.txt** 2. Rename the file **.sample_env** to **.env** 3. Replace the following values in the **.env** file: - **HOST:** Update this to your Azure AI service endpoint. - - Ex: "https://sample-azure-ai-resource.services.ai.azure.com". + - Ex: "https://sample-azure-ai-resource.services.ai.azure.com" - Avoid the "/" at the end. ![Alt text](assets/sample-azure-resource.png "Azure AI Service") - ![Alt text](assets/endpoint.png "Azure AI Service Enpoints") + ![Alt text](assets/endpoint.png "Azure AI Service Endpoints") - **SUBSCRIPTION_KEY:** Update this to your Azure AI Service's API Key or Subscription ID to identify and authenticate the API request. - - You can locate your API KEY here: ![Alt text](assets/endpoint-with-keys.png "Azure AI Service Enpoints With Keys") + - You can locate your API KEY here: ![Alt text](assets/endpoint-with-keys.png "Azure AI Service Endpoints With Keys") - If you are using AAD, please refer to your Subscription ID: ![Alt text](assets/subscription-id.png "Azure AI Service Subscription ID") - **API_VERSION:** This version ensures that you are converting the dataset to CU Preview.2. No changes are needed here. -## How to Find Your Document Field Extraction Dataset in Azure Portal -To migrate your Document Field extraction dataset from AI foundry, please follow the steps below: -1. On the bottom left of your Document Field Extraction project page, please select "Management Center". +## How to Locate Your Document Field Extraction Dataset for Migration +To migrate your Document Field extraction dataset from AI Foundry, please follow the steps below: +1. On the bottom left of your Document Field Extraction project page, please select "Management Center." ![Alt text](assets/management-center.png "Management Center") 2. Now on the Management Center page, please select "View All" from the Connected Resources section. ![Alt text](assets/connected-resources.png "Connected Resources") -3. Within these resources, look for the resource with type "Azure Blob Storage." This resource's target URL contains the location of your dataset's storage account (in yellow) and blob container (in blue).. +3. Within these resources, look for the resource with type "Azure Blob Storage." This resource's target URL contains the location of your dataset's storage account (in yellow) and blob container (in blue). ![Alt text](assets/manage-connections.png "Manage Connections") - Using these values, navigate to your blob container. Then, select the "labelingProjects" folder. From there, select the folder with the same name as the blob container. Here, you'll localte all the contents of your project in the "data" folder. + Using these values, navigate to your blob container. Then, select the "labelingProjects" folder. From there, select the folder with the same name as the blob container. Here, you'll locate all the contents of your project in the "data" folder. - For example, the sample Document Extraction project is stored at: + For example, the sample Document Extraction project is stored at ![Alt text](assets/azure-portal.png "Azure Portal") ## How to Find Your Source and Target SAS URLs @@ -52,9 +52,9 @@ To run migration, you will need to specify the source SAS URL (location of your To locate the SAS URL for a file or folder for any container URL arguments, please follow these steps: -1. Navigate to your storage account in Azure Portal and from the left pane, select "Storage Browser" +1. Navigate to your storage account in Azure Portal, and from the left pane, select "Storage Browser." ![Alt text](assets/storage-browser.png "Storage Browser") -2. Select the source/target blob container for either where your DI dataset is present or your CU dataset will be. Click on the extended menu on the side and select "Generate SAS." +2. Select the source/target blob container for either where your DI dataset is present or where your CU dataset will be. Click on the extended menu on the side and select "Generate SAS." ![Alt text](assets/generate-sas.png "Generate SAS") 3. Configure the permissions and expiry for your SAS URL accordingly. @@ -62,18 +62,18 @@ To locate the SAS URL for a file or folder for any container URL arguments, plea For the CU target dataset, please select these permissions: _**Read, Add, Create, & Write**_ - Once configured, please select "Generate SAS Token and URL" & copy the URL shown under "Blob SAS URL" + Once configured, please select "Generate SAS Token and URL" & copy the URL shown under "Blob SAS URL." ![Alt text](assets/generate-sas-pop-up.png "Generate SAS Pop-Up") Notes: - Since SAS URL does not point to a specific folder, to ensure the correct path for source and target, please specify the correct dataset folder as --source-blob-folder or --target-blob-folder. -- To get the SAS URL for a single file, navigate to the specific file and repeat the steps above, such as: +- To get the SAS URL for a single file, navigate to the specific file and repeat the steps above, such as: ![Alt text](assets/individual-file-generate-sas.png "Generate SAS for Individual File") ## How to Run -To run the 3 tools, please refer to these following commands. For better readability, they are split across lines. Please remove this extra spacing before execution. +To run the 3 tools, please refer to the following commands. For better readability, they are split across lines. Please remove this extra spacing before execution. _**NOTE:** Use "" when entering in a URL._ @@ -85,7 +85,7 @@ If you are migrating a _DI 3.1/4.0 GA Custom Document_ dataset, please run this --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For Custom Neural migration, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. +For migration of DI 3.1/4.0 GA, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. If you are migrating a _DI 4.0 Preview Custom Document_ dataset, please run this command: @@ -93,11 +93,11 @@ If you are migrating a _DI 4.0 Preview Custom Document_ dataset, please run this --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For Custom Gen migration, specifying an analyzer prefix is optional. However, iff you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. +For migration of DI 4.0 Preview, specifying an analyzer prefix is optional. However, if you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ -### 2. Creating An Analyzer +### 2. Creating an Analyzer To create an analyzer using the converted CU analyzer.json, please run this command: @@ -116,39 +116,39 @@ Ex: ### 3. Running Analyze -To Analyze a specific PDF or original file, please run this command: +To analyze a specific PDF or original file, please run this command: python ./call_analyze.py --analyzer-id mySampleAnalyzer --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken --output-json "./desired-path-to-analyzer-results.json" -For --analyzer-id argument, please refer to the analyzer ID created in the previous step. -Additionally, specifying the --output-json isn't neccesary. The default location for the output is "./sample_documents/analyzer_result.json". +For the --analyzer-id argument, please refer to the analyzer ID created in the previous step. +Additionally, specifying --output-json isn't necessary. The default location for the output is "./sample_documents/analyzer_result.json." ## Possible Issues These are some issues that you might run into when creating an analyzer or running analyze. ### Creating an Analyzer -For any **400** Error, please validate the following: +For any **400** error, please validate the following: - You are using a valid endpoint. Example: _https://yourEndpoint/contentunderstanding/analyzers/yourAnalyzerID?api-version=2025-05-01-preview_ -- Your converted CU dataset may not meet the latest naming constraints. Please ensure that all the fields in your analyzer.json file meets these requirements. If not, please make the changes manually. +- Your converted CU dataset may not meet the latest naming constraints. Please ensure that all the fields in your analyzer.json file meet these requirements. If not, please make the changes manually. - Field name only starts with a letter or an underscore - - Field name length is in between 1 to 64 characters + - Field name length is between 1 and 64 characters - Only uses letters, numbers, and underscores - Your analyzer ID meets these naming requirements - - ID is in between 1 to 64 characters long + - ID is between 1 and 64 characters long - Only uses letters, numbers, dots, underscores, and hyphens -A **401** Error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. +A **401** error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. -A **409** Error implies that the analyzer ID has already been used to create an analyzer. Please try using another ID. +A **409** error implies that the analyzer ID has already been used to create an analyzer. Please try using another ID. ### Calling Analyze -- A **400** Error implies a potentially incorrect endpoint or SAS URL. Ensure that your endpoint is valid _(https://yourendpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview)_ and that you are using the correct SAS URL for the document under analysis. -- A **401** Error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. -- A **404** Error implies that no analyzer exists with the analyzer ID you have specified. Mitigate it by calling the correct ID or creating an analyzer with such an ID. +- A **400** error implies a potentially incorrect endpoint or SAS URL. Ensure that your endpoint is valid _(https://yourendpoint/contentunderstanding/analyzers/yourAnalyzerID:analyze?api-version=2025-05-01-preview)_ and that you are using the correct SAS URL for the document under analysis. +- A **401** error implies a failure in authentication. Please ensure that your API key and/or subscription ID are correct and that you have access to the endpoint specified. +- A **404** error implies that no analyzer exists with the analyzer ID you have specified. Mitigate it by calling the correct ID or creating an analyzer with such an ID. ## Points to Note: 1. Make sure to use Python version 3.9 or above. -2. Signature fieldtypes (such as in custom extraction model version 4.0) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. +2. Signature field types (such as in the previous versions of DI) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. 3. When training a model with a CU dataset, the content of the documents will be retained in the CU model metadata, under CU service storage specifically. This is different from how it is in DI. 4. All the data conversion will be for Content Understanding preview.2 version only. From 00124a1d3020cda7909ff0cf67de020078ac04b4 Mon Sep 17 00:00:00 2001 From: Aaina Vannan Date: Mon, 2 Jun 2025 13:26:24 -0500 Subject: [PATCH 44/50] updated generate sas --- python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png b/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png index 79283a2..c2999d6 100644 --- a/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png +++ b/python/di_to_cu_migration_tool/assets/generate-sas-pop-up.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0457ebf63bcac1f487701924cecbdc02a2d1e818c60b2f27e33e8913716899d1 -size 123127 +oid sha256:5ed07130e1a110dba8144cdb1b174a8529d78d638036b9aad1a91bb66950e409 +size 46622 From bd8d1c94e883787672c06926ace77e9d75670d96 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 13:49:13 -0500 Subject: [PATCH 45/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 1b4b062..5ec0a53 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -2,9 +2,9 @@ Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** 2025-05-01-preview format, as seen in AI Foundry. The following DI versions are supported: - Custom Document DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural -- Custom Document 4.0 Preview (2024-07-31-preview) (seen in Document Field Extraction projects) --> DI-version = generative +- Custom Document 4.0 Preview (2024-07-31-preview) (seen in AI Foundry's Document Extraction) --> DI-version = generative -To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and DI 4.0 Preview.2 is only a part of Azure AI Foundry (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, Custom Document DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and Custom Document DI 4.0 Preview is only available on Azure AI Foundry as a preview service (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). For migration from these DI versions to Content Understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. @@ -79,21 +79,21 @@ _**NOTE:** Use "" when entering in a URL._ ### 1. Converting Document Intelligence to Content Understanding Dataset -If you are migrating a _DI 3.1/4.0 GA Custom Document_ dataset, please run this command: +If you are migrating a _DI 3.1/4.0 GA Custom Extraction_ dataset, please run this command: python ./di_to_cu_converter.py --DI-version neural --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For migration of DI 3.1/4.0 GA, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. +For migration of Custom Document DI 3.1/4.0 GA, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. -If you are migrating a _DI 4.0 Preview Custom Document_ dataset, please run this command: +If you are migrating a _DI 4.0 Preview Document Field Extraction_ dataset, please run this command: python ./di_to_cu_converter.py --DI-version generative --analyzer-prefix mySampleAnalyzer --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For migration of DI 4.0 Preview, specifying an analyzer prefix is optional. However, if you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. +For migration of Custom Document DI 4.0 Preview, specifying an analyzer prefix is optional. However, if you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ @@ -150,5 +150,5 @@ A **409** error implies that the analyzer ID has already been used to create an ## Points to Note: 1. Make sure to use Python version 3.9 or above. 2. Signature field types (such as in the previous versions of DI) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. -3. When training a model with a CU dataset, the content of the documents will be retained in the CU model metadata, under CU service storage specifically. This is different from how it is in DI. -4. All the data conversion will be for Content Understanding preview.2 version only. +3. The content of training documents will be retained in Content Understanding model metadata, under storage specifically. +5. All the data conversion will be for Content Understanding preview.2 version only. From f3a63e8a4054dec011e63a889ddd4bd6e67a905a Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 13:53:41 -0500 Subject: [PATCH 46/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 5ec0a53..0e32d95 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -151,4 +151,5 @@ A **409** error implies that the analyzer ID has already been used to create an 1. Make sure to use Python version 3.9 or above. 2. Signature field types (such as in the previous versions of DI) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. 3. The content of training documents will be retained in Content Understanding model metadata, under storage specifically. -5. All the data conversion will be for Content Understanding preview.2 version only. +5. All the data conversion will be for Content Understanding preview.2 version only. +6. Additional Transparency Note: https://learn.microsoft.com/en-us/legal/cognitive-services/content-understanding/transparency-note?toc=%2Fazure%2Fai-services%2Fcontent-understanding%2Ftoc.json&bc=%2Fazure%2Fai-services%2Fcontent-understanding%2Fbreadcrumb%2Ftoc.json From a4dd8b205310db7636435c25cf01aeb5eb7c2331 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 14:29:56 -0500 Subject: [PATCH 47/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index 0e32d95..a64b8f1 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -2,7 +2,7 @@ Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** 2025-05-01-preview format, as seen in AI Foundry. The following DI versions are supported: - Custom Document DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural -- Custom Document 4.0 Preview (2024-07-31-preview) (seen in AI Foundry's Document Extraction) --> DI-version = generative +- Custom Document 4.0 Preview (2024-07-31-preview) (seen in AI Foundry's Document Field Extraction) --> DI-version = generative To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, Custom Document DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and Custom Document DI 4.0 Preview is only available on Azure AI Foundry as a preview service (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). @@ -150,6 +150,5 @@ A **409** error implies that the analyzer ID has already been used to create an ## Points to Note: 1. Make sure to use Python version 3.9 or above. 2. Signature field types (such as in the previous versions of DI) are not supported in Content Understanding yet. Thus, during migration, these signature fields will be ignored when creating the analyzer. -3. The content of training documents will be retained in Content Understanding model metadata, under storage specifically. +3. The content of training documents will be retained in Content Understanding model metadata, under storage specifically. Additional explanation can be found here: https://learn.microsoft.com/en-us/legal/cognitive-services/content-understanding/transparency-note?toc=%2Fazure%2Fai-services%2Fcontent-understanding%2Ftoc.json&bc=%2Fazure%2Fai-services%2Fcontent-understanding%2Fbreadcrumb%2Ftoc.json 5. All the data conversion will be for Content Understanding preview.2 version only. -6. Additional Transparency Note: https://learn.microsoft.com/en-us/legal/cognitive-services/content-understanding/transparency-note?toc=%2Fazure%2Fai-services%2Fcontent-understanding%2Ftoc.json&bc=%2Fazure%2Fai-services%2Fcontent-understanding%2Fbreadcrumb%2Ftoc.json From 0b38d3bbe7b67cae7ea1060b211f769be5a6d9fb Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 15:05:27 -0500 Subject: [PATCH 48/50] Update README.md From 99f80cab65f16ae4182addbf145842791bf3dcaf Mon Sep 17 00:00:00 2001 From: aainav269 Date: Mon, 2 Jun 2025 16:43:19 -0500 Subject: [PATCH 49/50] Update README.md --- python/di_to_cu_migration_tool/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/di_to_cu_migration_tool/README.md b/python/di_to_cu_migration_tool/README.md index a64b8f1..e2085c8 100644 --- a/python/di_to_cu_migration_tool/README.md +++ b/python/di_to_cu_migration_tool/README.md @@ -1,10 +1,10 @@ # Document Intelligence to Content Understanding Migration Tool (Python) Welcome! We've created this tool to help convert your Document Intelligence (DI) datasets to Content Understanding (CU) **Preview.2** 2025-05-01-preview format, as seen in AI Foundry. The following DI versions are supported: -- Custom Document DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural -- Custom Document 4.0 Preview (2024-07-31-preview) (seen in AI Foundry's Document Field Extraction) --> DI-version = generative +- Custom Extraction Model DI 3.1 GA (2023-07-31) to DI 4.0 GA (2024-11-30) (seen in Document Intelligence Studio) --> DI-version = neural +- Document Field Extraction Model 4.0 Preview (2024-07-31-preview) (seen in AI Foundry/AI Services/Vision + Document/Document Field Extraction) --> DI-version = generative -To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, Custom Document DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and Custom Document DI 4.0 Preview is only available on Azure AI Foundry as a preview service (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). +To help you identify which version of Document Intelligence your dataset is in, please consult the sample documents provided under this folder to determine which format matches that of yours. Additionally, you can also identify the version through your DI project's UX as well. For instance, Custom Extraction DI 3.1/4.0 GA is a part of Document Intelligence Studio (i.e., https://documentintelligence.ai.azure.com/studio) and Document Field Extraction DI 4.0 Preview is only available on Azure AI Foundry as a preview service (i.e., https://ai.azure.com/explore/aiservices/vision/document/extraction). For migration from these DI versions to Content Understanding Preview.2, this tool first needs to convert the DI dataset to a CU compatible format. Once converted, you have the option to create a Content Understanding Analyzer, which will be trained on the converted CU dataset. Additionally, you can further test this model to ensure its quality. @@ -35,7 +35,7 @@ To set up this tool, you will need to do the following steps: - **API_VERSION:** This version ensures that you are converting the dataset to CU Preview.2. No changes are needed here. ## How to Locate Your Document Field Extraction Dataset for Migration -To migrate your Document Field extraction dataset from AI Foundry, please follow the steps below: +To migrate your Document Field Extraction dataset from AI Foundry, please follow the steps below: 1. On the bottom left of your Document Field Extraction project page, please select "Management Center." ![Alt text](assets/management-center.png "Management Center") 2. Now on the Management Center page, please select "View All" from the Connected Resources section. @@ -44,7 +44,7 @@ To migrate your Document Field extraction dataset from AI Foundry, please follow ![Alt text](assets/manage-connections.png "Manage Connections") Using these values, navigate to your blob container. Then, select the "labelingProjects" folder. From there, select the folder with the same name as the blob container. Here, you'll locate all the contents of your project in the "data" folder. - For example, the sample Document Extraction project is stored at + For example, the sample Document Field Extraction project is stored at ![Alt text](assets/azure-portal.png "Azure Portal") ## How to Find Your Source and Target SAS URLs @@ -85,7 +85,7 @@ If you are migrating a _DI 3.1/4.0 GA Custom Extraction_ dataset, please run thi --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For migration of Custom Document DI 3.1/4.0 GA, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. +For migration of Custom Extraction DI 3.1/4.0 GA, specifying an analyzer prefix is crucial for creating a CU analyzer. Since there's no "doc_type" defined for any identification in the fields.json, the created analyzer will have an analyzer ID of the specified analyzer prefix. If you are migrating a _DI 4.0 Preview Document Field Extraction_ dataset, please run this command: @@ -93,7 +93,7 @@ If you are migrating a _DI 4.0 Preview Document Field Extraction_ dataset, pleas --source-container-sas-url "https://sourceStorageAccount.blob.core.windows.net/sourceContainer?sourceSASToken" --source-blob-folder diDatasetFolderName --target-container-sas-url "https://targetStorageAccount.blob.core.windows.net/targetContainer?targetSASToken" --target-blob-folder cuDatasetFolderName -For migration of Custom Document DI 4.0 Preview, specifying an analyzer prefix is optional. However, if you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. +For migration of Document Field Extraction DI 4.0 Preview, specifying an analyzer prefix is optional. However, if you wish to create multiple analyzers from the same analyzer.json, please add an analyzer prefix. If provided, the analyzer ID will become analyzer-prefix_doc-type. Otherwise, it will simply remain as the doc_type in the fields.json. _**NOTE:** You are only allowed to create one analyzer per analyzer ID._ @@ -119,7 +119,7 @@ Ex: To analyze a specific PDF or original file, please run this command: python ./call_analyze.py --analyzer-id mySampleAnalyzer - --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken + --pdf-sas-url "https://storageAccount.blob.core.windows.net/container/folder/sample.pdf?SASToken" --output-json "./desired-path-to-analyzer-results.json" For the --analyzer-id argument, please refer to the analyzer ID created in the previous step. From 920d13bd0a5c3a2e96b17a25bbdd72212fce5818 Mon Sep 17 00:00:00 2001 From: aainav269 Date: Tue, 3 Jun 2025 10:30:47 -0500 Subject: [PATCH 50/50] Update README.md