Repository navigation
Commit 55e246b
UN-4427 [FEAT] Image output mode: per-model image limits instead of the 90-page / 14 MB caps (#2341)
* UN-4427 [FEAT] sdk1: model-aware image-request limits table and lookup API
Image output mode sends every page image to a vision LLM in one request,
gated so far by a global 90-page cap and a 14 MiB byte budget that match
no provider (Bedrock 20 images, Azure 50, Anthropic 100/600, OpenAI 1,500;
20-100 MB request limits). This adds the data and the API the extraction
and answer paths need to check against the limits of the LLM actually used.
- utils/image_limits/limits.json: provider-keyed limits with per-field
provenance (source URL, quote, verified_on, verified/unverified), built
from the independently verified dataset; strict loader (_schema.py) that
rejects unknown keys, unresolved sources, bad regexes and inherit targets;
optional operator override file via VLM_IMAGE_LIMITS_FILE (per-provider
replacement, no deep merge).
- resolve.py: provider key = adapter get_provider() with the Bedrock Mantle
exception; first-match overrides on the bare model, then cost_model, then
extra ids; OpenRouter inherits the family's limits; resolution never reads
litellm.model_cost, so the remote and bundled cost maps agree. Default
count/byte values are advisory on pass-through providers.
- policy.py: page budget = min(image count, context tokens, LLMWhisperer
999, operator ceilings) with the binding term recorded; raw-byte budget
from the provider's wire limit; per-image byte/pixel checks including the
Anthropic >20-images rule; plain-language messages that name the model,
provider, limit and provenance and say whether pages were charged.
- LLM.get_image_request_limits / get_image_input_token_budget /
image_input_limits_for; the adapter's context_window is now kept.
- get_page_images(image_limits=) and load_page_images(limits=) run the
model-aware checks; ImageLimitExceededError carries a stable error code.
Without a policy both keep today's fixed limits exactly, so this change
is behaviour-neutral until callers pass one.
Chosen defaults (each one constant): PROMPT_TOKENS_RESERVE=4000, context
token term enforced, per-image limits enforced, TEXT_RESERVE_BYTES=64 KiB,
ASSUMED_PAGE_BYTES=250 KB for a pre-conversion size advisory (never a
rejection), PASS_THROUGH_DEFAULTS_ARE_ADVISORY=True, env vars read as
optional ceilings by the new accessors (legacy accessors unchanged).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FEAT] Check image-mode documents against the consuming LLM's limits before conversion
Image-mode extraction had no idea which LLM would read the pages, so the
only pre-conversion check was the fixed 90-page cap. Every extraction now
carries the LLM adapter ids that will consume it and is checked against
those models' limits before LLMWhisperer bills the page conversion.
- Executor: _handle_extract resolves llm_instance_ids into an
ImageModePolicy (strictest of each limit across LLMs) and passes it to
the x2text adapter, which runs the model-aware pre-submit page check and
the post-download byte / per-image checks. Ids that cannot be resolved
fail closed before conversion with IMAGE_LIMITS_UNRESOLVED (503, nothing
charged). Image-mode limit errors from extraction keep their code as a
"CODE: message" prefix, like the answer-time bridge.
- Callers: Prompt Studio index (default profile), dynamic_extractor (the
running profile) and the structure tool (tool LLM plus every prompt's
LLM) send llm_instance_ids.
- Upload: the Prompt Studio upload check uses the default profile's LLM
limits (offline resolution) and says which profile it used; an
unresolvable LLM falls back to the fixed cap.
- Bridge: PageImageTooLargeError maps to the new IMAGE_PAGE_TOO_LARGE; the
limit codes now come from sdk1 and are re-exported.
- Rollout bound: extraction_bound_kwargs() keeps every check within the
fixed 90 pages / 14 MiB that the cloud plugin still answers with
(LEGACY_ANSWER_BOUNDS_ACTIVE). Strict providers now fail before billing;
generous ones stay at 90 until the cloud plugin switches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FEAT] Fetch the image-limits table from GitHub so data fixes ship without a release
Installs now read limits.json from the main branch of Zipstack/unstract
(VLM_IMAGE_LIMITS_URL; empty disables it for air-gapped installs) and keep
the bundled copy as the always-available fallback. The operator override
file still wins over both.
The fetch is bounded: one attempt per process per refresh window
(VLM_IMAGE_LIMITS_REFRESH_SECONDS, default 3600, failures included), a
3-second budget and 1 MB cap per download, and other threads keep serving
the last good table while one fetches. The remote file passes the same
strict schema as the bundled one, must carry the schema_version this sdk1
reads, and may not contain override patterns over 300 characters. Any
failure logs a warning and keeps the last good copy.
The table records its origin (bundled/remote, location, verified_on,
sha256 prefix). The log names it, and format_limit_source appends the
version to user-facing errors and the run-log summary.
Test suites set VLM_IMAGE_LIMITS_URL="" so they never reach the network.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Reject inheritance loops and keep malformed overrides from escaping the fallback
- The loader enforces one-level inherit: the target must exist, must not
be the provider itself, and must not inherit in turn. The same check runs
on the merged table after an override, so a cycle across the shipped and
override layers is rejected too. The resolver also tracks visited
providers, so a lookup can never recurse forever.
- apply_override_file checks the shapes it merges (sources, providers)
before touching them, and invalid JSON is a schema error; the override
fallback also catches unexpected errors, so a malformed override is
logged and ignored instead of failing image extraction.
Addresses Greptile review on #2341.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* UN-4427 [MISC] Fix docstring format flagged by ruff (D205)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Print image-mode byte limits in one unit with one decimal
Size messages rounded limits to whole megabytes. Gemma 4's 3.5 MB limit
showed as "4 MB", and with the legacy 14 MiB ceiling binding the message
read "total 14.7 MB ... over the 15 MB limit". It mixed decimal MB with a
MiB ceiling and rounded up past the total.
- A message now prints its total and its limit in the limit's own unit,
with one decimal: decimal MB for provider limits, MiB for the operator
and legacy ceilings (VLM_IMAGE_ANSWER_MAX_TOTAL_MB has always been MiB).
- ImageModePolicy.describe() reports the ceiling when it is below the
model's limit, instead of the model's limit that does not bind. For
example, "14.0 MiB of page images per request" rather than
"512 MB per request" on OpenAI during the rollout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Warn on the default token estimate, add a no-fetch table read and the cost-model id
From the review of cloud PR C (unstract-cloud#1869):
- Token term: the table's only tokens-per-page figure is the unverified
top-level default (1,500). Enforcing it capped 128K-context models such
as gpt-4o at 82 pages, below the 90 they answered before and below what
real 150-DPI pages fit (~765-1,105 tokens). It is now reported as an
advisory (ENFORCE_DEFAULT_TOKEN_ESTIMATE = False); a model-specific
tokens_per_image in the table is still enforced.
- get_limits_table(refresh=False), and
LLM.image_input_limits_for(..., refresh_table=False), never fetch from
GitHub: they serve the last good copy the process holds, else the bundled
one. This is for request paths such as the cloud profile serializer. The
LLM limit accessors take an optional table.
- LLM.get_cost_model_name(): the real model id (cost_model, e.g.
azure/gpt-4o) instead of the routed azure/<deployment>, for vision checks
and pricing.
- Docs: the env vars replace the 90 / 14 MiB bound while
LEGACY_ANSWER_BOUNDS_ACTIVE is on, and only tighten once it is off. The
rollout comment no longer says the cloud plugin uses fixed limits. The
fetch timeout applies per phase, not as one total.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Refresh the limits table in the background and keep bundled providers (O1, O2, O17, O22)
O1: get_limits_table() never waits on GitHub. A due refresh starts on a
daemon thread behind the existing non-blocking lock; callers keep serving
the last good copy. Each attempt has a real overall deadline (the download
runs on its own thread, so DNS and connect are covered) and no longer
follows redirects. Docstrings that promised "no network" now describe
this. VLM_IMAGE_LIMITS_URL (empty disables, for air-gapped installs),
VLM_IMAGE_LIMITS_REFRESH_SECONDS, VLM_IMAGE_LIMITS_FILE and
VLM_IMAGE_LIMITS_ENFORCE are listed in the backend and workers sample.env.
O2: a remote table that drops a provider the bundled table has is
rejected (last good copy kept, reason logged), and resolution never turns
a bundled provider into pass-through because the effective table lacks it.
O17: a contended test drives the real background thread.
O22: local_max_input_tokens no longer claims to read a "local" registry.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Make the token term warn-only, stream advisories and name the right model (O3, O4, O10, O12, O13, O16, O18, O20, O24, O25)
O4 (user decision): the context-window term never rejects, whether its
tokens-per-page figure is the default or a model's own entry; it is
reported per LLM as an advisory. Count and byte limits stay enforced.
O12: ImageModePolicy.with_advisory_sink / emit_advisories send advisories
and the size hint to the user's run log as well as the worker log.
O10/O20: each per-image limit keeps the LLM it came from, messages and
describe() name that model, and the many-images rule stays paired per
model instead of minimising threshold and pixels separately.
O13: VLM_IMAGE_LIMITS_ENFORCE=false selects the fixed 90-page / 14 MiB
cap (fixed_cap_bound_kwargs) instead of model-aware limits.
O18: an invalid ceiling env value logs ERROR and keeps the legacy default
instead of removing the ceiling.
O3/O16/O24/O25: strictest-of-many tests run over both LLM orders plus a
two-LLM per-image test; a test pins the legacy clamp to the env
overrides; tests no longer read ambient env; the obsolete 100-image cap
test is gone. The image-mode summary gains a page-count parser (used by
the Prompt Studio cache-hit check).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Re-check cached image extractions, add the enforce switch and say when a retry helps (O3, O7, O12, O13, O19, O21)
O7: a Prompt Studio extraction cache hit in image mode is re-checked
against the current profile LLM's page budget, using the page count in
the stored image-mode summary (the cache key ignores the LLM).
O13: the upload and cache-hit checks and the executor honour
VLM_IMAGE_LIMITS_ENFORCE=false (fixed cap, no LLM lookup).
O12: the executor attaches a run-log sink, so advisories reach the user
at WARN.
O19: IMAGE_LIMITS_UNRESOLVED says whether retrying can help (lookup
outage vs a broken adapter config); only the message reaches the user.
O21: extraction limit errors use the answer bridge's "CODE: message"
shape; codes.py says consumers must find the code anywhere in the text.
O3: the executor strictest-LLM test runs over both orders.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Fix the Claude limit data, merge override defaults per field and state the lookup rule once (O5, O6, O8, O14, O15, O23)
O5: the 200k-context Claude regex accepts '-' or '.' between version
digits (OpenRouter's claude-sonnet-4.5) on anthropic, vertex_ai and
azure_ai, and bedrock_mantle uses the same 200k rule instead of a
Haiku-only override.
O6: Claude 4.7+ (Anthropic's high-resolution tier) carries
tokens_per_image 2,850 on anthropic, vertex_ai, azure_ai and
bedrock_mantle, derived from the documented 28 px patch formula
(unverified; feeds the warn-only advisory).
O8: an override file's default block is merged field by field over the
shipped default and may not null a defaultable field.
O14/O15: the README explains LEGACY_ANSWER_BOUNDS_ACTIVE, the warn-only
token term, the enforce switch and the background refresh, and states the
override-matching rule once; resolve.py and limits.json _meta point to it.
O23: _meta no longer cites a verification.md that does not exist.
Data-only limits.json change: schema_version and schema keys unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Test the redirect setting through the real client factory (O1)
The redirect test replaced the whole client factory with a mock client,
so it passed with follow_redirects=True too (mutation check). It now
keeps the real factory and swaps only the transport.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Lock remote kinds, cap remote raises at 2x and honour the enforce switch inside sdk1 (O2, O13, N4, O19)
- O2: a remote limits table is rejected (last good copy kept, reasons
logged) when a bundled provider changes kind, or an enforced
image-count / request-byte limit rises above 2x the bundled value, in a
provider's defaults, a same-pattern override, the default block, or for
any bundled example model as it resolves (catches shadowing overrides,
removed overrides and retargeted inherits). Lowering and additions are
accepted; the operator override file is not subject to the rule.
- O13: VLM_IMAGE_LIMITS_ENFORCE=false is honoured inside
ImageModePolicy.from_limits, compute_page_budget and
extraction_bound_kwargs (new ImageModePolicy.fixed_cap), so the cloud
answer plugin and every other consumer get the fixed 90-page / 14 MiB
cap. Call-site checks stay: they also skip the LLM lookup.
- N4: advisories report every LLM's advisory image count and request size,
not only the binding LLM's.
- O19: only a connection error, timeout or 5xx from the adapter lookup is
reported as retryable.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Clamp remote image limits at lookup time instead of rejecting the table (O2, P3, P4)
O2: a remote limits.json is no longer judged as a whole. Every lookup on a
remote table also resolves the same inputs against the bundled table: the
bundled kind wins (advisory flags follow it) and max_images_per_request /
max_request_bytes are min(remote, 2x bundled), compared as raw bytes.
This catches a new override shadowing any model, not just the bundled
examples, and an over-raised value no longer freezes an install out of
every other fix in the file. Fields and entries from the operator override
file are not clamped (per-field layers now say which entry supplied each
field). Each clamp logs one WARNING per provider/model/field and is named
in the limit's provenance. The table-level loosening and dropped-provider
rejections are removed; a missing provider resolves from the bundled entry.
P3: the Prompt Studio cache-hit check applies the fixed page cap when
VLM_IMAGE_LIMITS_ENFORCE=false, as the upload check does.
P4: from_limits logs the switched-off warning once per process.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Keep operator override files valid when the remote table drops a provider, and log the bundled fallback once (Q1, Q2)
Q1: an override file whose entry inherits from a provider (or cites a
source) that a remote copy dropped no longer fails validation and is no
longer ignored. apply_override_file validates inherit targets and source
keys against the base table plus the bundled one, and the lookup resolves
such an inherit parent from the bundled entry, as a missing provider
already does. Operator fields stay unclamped; inherited fields keep the
shipped layer and the remote clamp.
Q2: the "provider missing from the remote table" WARNING is logged once
per provider per process (reset by clear_limits_cache), as is a bad
VLM_IMAGE_LIMITS_REFRESH_SECONDS value, which is read on every refreshing
lookup.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Log an invalid VLM_IMAGE_LIMITS_ENFORCE value once per process (R1)
The switch is read on every lookup, so a bad value logged an ERROR per page
set and per profile render. Each distinct bad value is now reported once,
like the switched-off warning above it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [MISC] Simplify the image-limits changes without behaviour change
Drop the unused Confidence type alias, fold the private _bundled_table
into the public bundled_table it was wrapped by, and share one
once-per-process helper between first_clamp_report and
first_missing_provider_report.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Keep adapter credentials out of image-limit errors and logs (H1, M2)
The adapter-validation error quotes the stored metadata (pydantic
input_value=, api_key included). The extraction-time IMAGE_LIMITS_UNRESOLVED
message and the Prompt Studio upload log now report only the exception type
with a fixed sentence, and the cause chain is dropped so the executor's
traceback log cannot carry it either. A non-SdkError while resolving limits
is reported as an internal error (logged with its traceback) instead of
telling the user to fix their adapter.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Fetch the image-limits table only when a URL is configured (H2)
On-prem must never phone home. VLM_IMAGE_LIMITS_URL now defaults to unset:
the bundled table is used, nothing is fetched and no refresh warning is
logged. SaaS opts in by setting it to PUBLISHED_LIMITS_URL (the raw
limits.json on main), which replaces DEFAULT_LIMITS_URL. README, docstrings,
both sample.env files and the configuration tests follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Run the workers executor unit tests in CI (H3)
No rig lane collected workers/executor/tests, so the image-limit
resolution and vlm_image_answer bridge tests never ran in CI. unit-workers
now includes the path (junit: 1488 tests, 54 of them from executor.tests,
0 failures).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Re-read the override file on change, advise splitting under the many-images rule, check only prompt LLMs in deployments (M1, M3, M4)
M1: the VLM_IMAGE_LIMITS_FILE result was cached per base table for the
process life, failure included, so an air-gapped install never saw a fixed
file. It is now re-read when its (mtime, size) changes, and a failure is
retried on change or after OVERRIDE_RETRY_SECONDS.
M3: when the many-images pixel rule applied, the message said splitting
does not help; it now advises at most N pages per request. The code
restatements point at the one message instead of repeating it.
M4: confirmed no image-mode path sends page images to the tool-level LLM
(single-pass is rejected, challenge/evaluation skipped, summarize reads
text), so deployments resolve limits from the prompt LLMs only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Re-check cached extracts at Index, correct the clamp and limits-table docs (M5, M6, M7)
M5: Manage Documents -> Index reused a cached image-mode extract without
the cache-hit check prompt runs apply; build_index_payload now runs
_check_cached_image_extraction (outside the marker fallback, so the
rejection reaches the user).
M6: README says a model newly listed under a provider the bundled table
has is clamped against the bundled resolution (rule 7); the OpenRouter
anthropic/ note now says what it resolves to (32 MB). No data change.
M7: stale comments in page_image_loader (fixed cap vs operator ceilings),
the limits.json default rationale caveat, fetch_remote_bytes' deadline
and a policy test comment.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Treat empty page/size env vars as unset, share the fixed-cap message, drop the unused adapter resolver (Lows)
- VLM_IMAGE_ANSWER_PAGE_CAP / _MAX_TOTAL_MB: an empty value means unset
(no ERROR, no forced 90 cap); a bad value is logged once per value.
- fixed_cap_message in policy.py replaces four copies of the fixed-cap
text (page loader, LLMWhisperer pre-check, PS cache hit and upload);
the wording is unchanged.
- resolve_image_limits_for_adapter had no production caller: deleted;
its tests now go through LLM.image_input_limits_for.
- The PS cache-hit ENFORCE=false test now asserts the fixed cap rejects
91 pages, and is named for what it checks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [MISC] Require an owner's review for the image limits table
limits.json is runtime data for deployments that set VLM_IMAGE_LIMITS_URL
(SaaS): a merge to main changes which image-mode documents they accept
within the refresh window, without a release. Add a CODEOWNERS entry so such
changes request review from the maintainers and the data's author.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] PR review toolkit pass: clamp the per-image limits, skip the limits lookup for highlight, pin the cache-hit summary format
- A remote limits table may loosen max_image_bytes, max_image_px,
many_images_threshold and many_images_max_px only to 2x the bundled
value, like the image count and request bytes (byte limits compared as
raw bytes). A raised or removed many_images_threshold counts as
loosening. Tightening stays unbounded.
- The executor resolves the image policy only off the highlight path, so
highlight in image mode reports the adapter's own error instead of a
limits-lookup failure, with no platform call.
- The structure tool sends the LLM ids under IndexingConstants.LLM_INSTANCE_IDS.
- Tests pin today's image-mode summary text and its cache-hit rejection.
- Comment fixes: limits.json size, clamped_from meaning.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [FIX] Assert the source URL's host, not a prefix (CodeQL py/incomplete-url-substring-sanitization)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* UN-4427 [DOCS] README: the remote clamp also covers per-image limits
The maintainer checklist still said per-image limits are not clamped,
but GUARDED_FIELDS includes the per-image byte and pixel limits and the
many-images rule. Name the fields that really are unclamped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>1 parent 21c07bb commit 55e246b
43 files changed
Lines changed: 10737 additions & 121 deletions
File tree
- .github
- backend
- prompt_studio/prompt_studio_core_v2
- tests
- tests
- unstract/sdk1
- src/unstract/sdk1
- adapters
- x2text
- llm_whisperer_v2/src
- utils/image_limits
- tests
- workers
- executor
- executors
- tests
- file_processing
- tests
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| 17 | + | |
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
22 | 26 | | |
23 | 27 | | |
24 | 28 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
172 | 175 | | |
173 | 176 | | |
174 | 177 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
94 | 105 | | |
95 | 106 | | |
96 | 107 | | |
| |||
636 | 647 | | |
637 | 648 | | |
638 | 649 | | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
639 | 657 | | |
640 | 658 | | |
641 | 659 | | |
| |||
654 | 672 | | |
655 | 673 | | |
656 | 674 | | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
657 | 678 | | |
658 | 679 | | |
659 | 680 | | |
| |||
1480 | 1501 | | |
1481 | 1502 | | |
1482 | 1503 | | |
1483 | | - | |
| 1504 | + | |
| 1505 | + | |
| 1506 | + | |
| 1507 | + | |
| 1508 | + | |
| 1509 | + | |
| 1510 | + | |
| 1511 | + | |
| 1512 | + | |
| 1513 | + | |
| 1514 | + | |
| 1515 | + | |
| 1516 | + | |
| 1517 | + | |
| 1518 | + | |
| 1519 | + | |
| 1520 | + | |
| 1521 | + | |
| 1522 | + | |
| 1523 | + | |
| 1524 | + | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
| 1535 | + | |
| 1536 | + | |
| 1537 | + | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + | |
| 1545 | + | |
| 1546 | + | |
| 1547 | + | |
| 1548 | + | |
| 1549 | + | |
| 1550 | + | |
| 1551 | + | |
| 1552 | + | |
| 1553 | + | |
| 1554 | + | |
| 1555 | + | |
| 1556 | + | |
| 1557 | + | |
| 1558 | + | |
| 1559 | + | |
| 1560 | + | |
| 1561 | + | |
| 1562 | + | |
| 1563 | + | |
| 1564 | + | |
| 1565 | + | |
| 1566 | + | |
| 1567 | + | |
| 1568 | + | |
| 1569 | + | |
| 1570 | + | |
| 1571 | + | |
| 1572 | + | |
| 1573 | + | |
| 1574 | + | |
| 1575 | + | |
| 1576 | + | |
| 1577 | + | |
| 1578 | + | |
| 1579 | + | |
| 1580 | + | |
| 1581 | + | |
| 1582 | + | |
| 1583 | + | |
| 1584 | + | |
| 1585 | + | |
| 1586 | + | |
| 1587 | + | |
| 1588 | + | |
| 1589 | + | |
| 1590 | + | |
| 1591 | + | |
| 1592 | + | |
| 1593 | + | |
| 1594 | + | |
1484 | 1595 | | |
1485 | 1596 | | |
1486 | 1597 | | |
1487 | 1598 | | |
1488 | | - | |
1489 | | - | |
1490 | | - | |
1491 | | - | |
1492 | | - | |
1493 | | - | |
1494 | | - | |
1495 | | - | |
| 1599 | + | |
| 1600 | + | |
| 1601 | + | |
| 1602 | + | |
| 1603 | + | |
| 1604 | + | |
| 1605 | + | |
| 1606 | + | |
| 1607 | + | |
| 1608 | + | |
1496 | 1609 | | |
1497 | 1610 | | |
1498 | 1611 | | |
1499 | | - | |
1500 | 1612 | | |
1501 | 1613 | | |
1502 | | - | |
| 1614 | + | |
| 1615 | + | |
| 1616 | + | |
| 1617 | + | |
| 1618 | + | |
| 1619 | + | |
| 1620 | + | |
| 1621 | + | |
| 1622 | + | |
| 1623 | + | |
| 1624 | + | |
| 1625 | + | |
| 1626 | + | |
| 1627 | + | |
| 1628 | + | |
| 1629 | + | |
| 1630 | + | |
1503 | 1631 | | |
1504 | 1632 | | |
1505 | | - | |
1506 | | - | |
1507 | | - | |
1508 | | - | |
1509 | | - | |
1510 | | - | |
| 1633 | + | |
| 1634 | + | |
| 1635 | + | |
| 1636 | + | |
1511 | 1637 | | |
1512 | 1638 | | |
1513 | 1639 | | |
| |||
2703 | 2829 | | |
2704 | 2830 | | |
2705 | 2831 | | |
| 2832 | + | |
| 2833 | + | |
| 2834 | + | |
| 2835 | + | |
| 2836 | + | |
2706 | 2837 | | |
2707 | 2838 | | |
2708 | 2839 | | |
| |||
2712 | 2843 | | |
2713 | 2844 | | |
2714 | 2845 | | |
| 2846 | + | |
| 2847 | + | |
| 2848 | + | |
2715 | 2849 | | |
2716 | 2850 | | |
2717 | 2851 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| 27 | + | |
| 28 | + | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
| |||
194 | 196 | | |
195 | 197 | | |
196 | 198 | | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
197 | 253 | | |
198 | 254 | | |
199 | 255 | | |
| |||
0 commit comments